summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--HISTORY252
-rw-r--r--INSTALL8
-rw-r--r--Makefile2
-rw-r--r--RELEASE-NOTES1055
-rw-r--r--UPGRADE31
-rw-r--r--api.php68
-rw-r--r--config/index.php168
-rw-r--r--docs/database.txt13
-rw-r--r--docs/hooks.txt37
-rw-r--r--img_auth.php7
-rw-r--r--includes/AjaxDispatcher.php10
-rw-r--r--includes/AjaxFunctions.php39
-rw-r--r--includes/AjaxResponse.php4
-rw-r--r--includes/Article.php329
-rw-r--r--includes/AuthPlugin.php7
-rw-r--r--includes/AutoLoader.php53
-rw-r--r--includes/BagOStuff.php23
-rw-r--r--includes/Block.php168
-rw-r--r--includes/CacheDependency.php328
-rw-r--r--includes/CategoryPage.php11
-rw-r--r--includes/ChangesList.php81
-rw-r--r--includes/CoreParserFunctions.php63
-rw-r--r--includes/Database.php80
-rw-r--r--includes/DatabaseFunctions.php15
-rw-r--r--includes/DatabaseOracle.php24
-rw-r--r--includes/DatabasePostgres.php109
-rw-r--r--includes/DateFormatter.php4
-rw-r--r--includes/DefaultSettings.php223
-rw-r--r--includes/Defines.php1
-rw-r--r--includes/DifferenceEngine.php96
-rw-r--r--includes/DjVuImage.php2
-rw-r--r--includes/EditPage.php230
-rw-r--r--includes/Exception.php2
-rw-r--r--includes/Exif.php16
-rw-r--r--includes/Export.php5
-rw-r--r--includes/Feed.php4
-rw-r--r--includes/FileStore.php8
-rw-r--r--includes/GlobalFunctions.php252
-rw-r--r--includes/HTMLCacheUpdate.php3
-rw-r--r--includes/HTMLFileCache.php159
-rw-r--r--includes/HTMLForm.php2
-rw-r--r--includes/HistoryBlob.php2
-rw-r--r--includes/Hooks.php1
-rw-r--r--includes/IP.php59
-rw-r--r--includes/Image.php16
-rw-r--r--includes/ImageFunctions.php5
-rw-r--r--includes/ImageGallery.php23
-rw-r--r--includes/ImagePage.php34
-rw-r--r--includes/Licenses.php8
-rw-r--r--includes/LinkBatch.php5
-rw-r--r--includes/Linker.php262
-rw-r--r--includes/LoadBalancer.php16
-rw-r--r--includes/LogPage.php6
-rw-r--r--includes/MagicWord.php5
-rw-r--r--includes/Math.php19
-rw-r--r--includes/MessageCache.php432
-rw-r--r--includes/Metadata.php13
-rw-r--r--includes/MimeMagic.php2
-rw-r--r--includes/Namespace.php4
-rw-r--r--includes/OutputPage.php316
-rw-r--r--includes/PageHistory.php24
-rw-r--r--includes/Pager.php10
-rw-r--r--includes/Parser.php1053
-rw-r--r--includes/ParserCache.php2
-rw-r--r--includes/Profiler.php6
-rw-r--r--includes/ProfilerSimple.php19
-rw-r--r--includes/ProfilerSimpleUDP.php2
-rw-r--r--includes/ProtectionForm.php4
-rw-r--r--includes/ProxyTools.php103
-rw-r--r--includes/QueryPage.php36
-rw-r--r--includes/RecentChange.php92
-rw-r--r--includes/Revision.php6
-rw-r--r--includes/Sanitizer.php41
-rw-r--r--includes/SearchEngine.php3
-rw-r--r--includes/SearchMySQL4.php3
-rw-r--r--includes/SearchPostgres.php8
-rw-r--r--includes/SearchTsearch2.php5
-rw-r--r--includes/Setup.php30
-rw-r--r--includes/SiteStats.php168
-rw-r--r--includes/Skin.php288
-rw-r--r--includes/SkinTemplate.php125
-rw-r--r--includes/SpecialAllmessages.php120
-rw-r--r--includes/SpecialAllpages.php86
-rw-r--r--includes/SpecialBlockip.php30
-rw-r--r--includes/SpecialBooksources.php185
-rw-r--r--includes/SpecialBrokenRedirects.php2
-rw-r--r--includes/SpecialCategories.php3
-rw-r--r--includes/SpecialConfirmemail.php18
-rw-r--r--includes/SpecialContributions.php69
-rw-r--r--includes/SpecialDeadendpages.php2
-rw-r--r--includes/SpecialDisambiguations.php2
-rw-r--r--includes/SpecialDoubleRedirects.php2
-rw-r--r--includes/SpecialEmailuser.php27
-rw-r--r--includes/SpecialExport.php14
-rw-r--r--includes/SpecialImagelist.php11
-rw-r--r--includes/SpecialImport.php10
-rw-r--r--includes/SpecialIpblocklist.php24
-rw-r--r--includes/SpecialListusers.php2
-rw-r--r--includes/SpecialLockdb.php4
-rw-r--r--includes/SpecialLog.php8
-rw-r--r--includes/SpecialLonelypages.php2
-rw-r--r--includes/SpecialMIMEsearch.php7
-rw-r--r--includes/SpecialMostcategories.php21
-rw-r--r--includes/SpecialMostimages.php2
-rw-r--r--includes/SpecialMostlinked.php14
-rw-r--r--includes/SpecialMostlinkedcategories.php2
-rw-r--r--includes/SpecialMostrevisions.php2
-rw-r--r--includes/SpecialMovepage.php35
-rw-r--r--includes/SpecialNewimages.php11
-rw-r--r--includes/SpecialNewpages.php9
-rw-r--r--includes/SpecialPage.php518
-rw-r--r--includes/SpecialPreferences.php174
-rw-r--r--includes/SpecialPrefixindex.php3
-rw-r--r--includes/SpecialRandompage.php4
-rw-r--r--includes/SpecialRandomredirect.php2
-rw-r--r--includes/SpecialRecentchanges.php24
-rw-r--r--includes/SpecialRecentchangeslinked.php17
-rw-r--r--includes/SpecialResetpass.php158
-rw-r--r--includes/SpecialRevisiondelete.php9
-rw-r--r--includes/SpecialSearch.php26
-rw-r--r--includes/SpecialShortpages.php10
-rw-r--r--includes/SpecialSpecialpages.php2
-rw-r--r--includes/SpecialStatistics.php39
-rw-r--r--includes/SpecialUncategorizedimages.php2
-rw-r--r--includes/SpecialUncategorizedpages.php2
-rw-r--r--includes/SpecialUndelete.php81
-rw-r--r--includes/SpecialUnlockdb.php4
-rw-r--r--includes/SpecialUnusedcategories.php4
-rw-r--r--includes/SpecialUnusedimages.php4
-rw-r--r--includes/SpecialUnusedtemplates.php4
-rw-r--r--includes/SpecialUnwatchedpages.php2
-rw-r--r--includes/SpecialUpload.php92
-rw-r--r--includes/SpecialUserlogin.php152
-rw-r--r--includes/SpecialUserrights.php35
-rw-r--r--includes/SpecialVersion.php97
-rw-r--r--includes/SpecialWantedcategories.php2
-rw-r--r--includes/SpecialWantedpages.php2
-rw-r--r--includes/SpecialWatchlist.php176
-rw-r--r--includes/SpecialWhatlinkshere.php4
-rw-r--r--includes/SquidUpdate.php15
-rw-r--r--includes/StreamFile.php12
-rw-r--r--includes/StringUtils.php301
-rw-r--r--includes/StubObject.php16
-rw-r--r--includes/Title.php398
-rw-r--r--includes/User.php1263
-rw-r--r--includes/UserMailer.php28
-rw-r--r--includes/WebRequest.php13
-rw-r--r--includes/WebStart.php10
-rw-r--r--includes/Wiki.php43
-rw-r--r--includes/WikiError.php4
-rw-r--r--includes/Xml.php56
-rw-r--r--includes/ZhClient.php2
-rw-r--r--includes/api/ApiBase.php200
-rw-r--r--includes/api/ApiFeedWatchlist.php125
-rw-r--r--includes/api/ApiFormatBase.php109
-rw-r--r--includes/api/ApiFormatJson.php23
-rw-r--r--includes/api/ApiFormatPhp.php54
-rw-r--r--includes/api/ApiFormatWddx.php89
-rw-r--r--includes/api/ApiFormatXml.php36
-rw-r--r--includes/api/ApiFormatYaml.php5
-rw-r--r--includes/api/ApiFormatYaml_spyc.php9
-rw-r--r--includes/api/ApiLogin.php6
-rw-r--r--includes/api/ApiMain.php294
-rw-r--r--includes/api/ApiOpenSearch.php109
-rw-r--r--includes/api/ApiPageSet.php138
-rw-r--r--includes/api/ApiQuery.php58
-rw-r--r--includes/api/ApiQueryAllpages.php114
-rw-r--r--includes/api/ApiQueryBacklinks.php358
-rw-r--r--includes/api/ApiQueryBase.php273
-rw-r--r--includes/api/ApiQueryInfo.php13
-rw-r--r--includes/api/ApiQueryLogEvents.php173
-rw-r--r--includes/api/ApiQueryRecentChanges.php187
-rw-r--r--includes/api/ApiQueryRevisions.php194
-rw-r--r--includes/api/ApiQuerySiteinfo.php11
-rw-r--r--includes/api/ApiQueryUserContributions.php175
-rw-r--r--includes/api/ApiQueryWatchlist.php234
-rw-r--r--includes/api/ApiResult.php64
-rw-r--r--includes/cbt/CBTCompiler.php4
-rw-r--r--includes/memcached-client.php10
-rw-r--r--includes/normal/RandomTest.php1
-rw-r--r--includes/normal/Utf8Test.php2
-rw-r--r--includes/normal/UtfNormal.php54
-rw-r--r--includes/normal/UtfNormalGenerate.php1
-rw-r--r--includes/normal/UtfNormalTest.php2
-rw-r--r--includes/templates/Userlogin.php2
-rw-r--r--install-utils.inc11
-rw-r--r--languages/Language.php100
-rw-r--r--languages/LanguageConverter.php262
-rw-r--r--languages/Names.php33
-rw-r--r--languages/classes/LanguageBe.php2
-rw-r--r--languages/classes/LanguageBs.php2
-rw-r--r--languages/classes/LanguageCs.php2
-rw-r--r--languages/classes/LanguageCu.php50
-rw-r--r--languages/classes/LanguageFi.php53
-rw-r--r--languages/classes/LanguageFr.php2
-rw-r--r--languages/classes/LanguageHe.php6
-rw-r--r--languages/classes/LanguageHr.php2
-rw-r--r--languages/classes/LanguageHsb.php117
-rw-r--r--languages/classes/LanguageKk.deps.php12
-rw-r--r--languages/classes/LanguageKk.php210
-rw-r--r--languages/classes/LanguageKk_kz.php269
-rw-r--r--languages/classes/LanguageKsh.php5
-rw-r--r--languages/classes/LanguageLt.php10
-rw-r--r--languages/classes/LanguageLv.php2
-rw-r--r--languages/classes/LanguagePt_br.php2
-rw-r--r--languages/classes/LanguageRu.php2
-rw-r--r--languages/classes/LanguageSk.php4
-rw-r--r--languages/classes/LanguageSr.php71
-rw-r--r--languages/classes/LanguageSr_ec.php2
-rw-r--r--languages/classes/LanguageSr_el.php2
-rw-r--r--languages/classes/LanguageZh.php22
-rw-r--r--languages/messages/MessagesAf.php8
-rw-r--r--languages/messages/MessagesAr.php1
-rw-r--r--languages/messages/MessagesAz.php11
-rw-r--r--languages/messages/MessagesBe.php5
-rw-r--r--languages/messages/MessagesBg.php14
-rw-r--r--languages/messages/MessagesBpy.php296
-rw-r--r--languages/messages/MessagesBr.php5
-rw-r--r--languages/messages/MessagesBs.php11
-rw-r--r--languages/messages/MessagesCa.php13
-rw-r--r--languages/messages/MessagesCs.php23
-rw-r--r--languages/messages/MessagesCsb.php3
-rw-r--r--languages/messages/MessagesCu.php141
-rw-r--r--languages/messages/MessagesCv.php5
-rw-r--r--languages/messages/MessagesCy.php19
-rw-r--r--languages/messages/MessagesDa.php15
-rw-r--r--languages/messages/MessagesDe.php3494
-rw-r--r--languages/messages/MessagesEl.php15
-rw-r--r--languages/messages/MessagesEn.php326
-rw-r--r--languages/messages/MessagesEo.php15
-rw-r--r--languages/messages/MessagesEs.php27
-rw-r--r--languages/messages/MessagesEt.php1
-rw-r--r--languages/messages/MessagesEu.php2009
-rw-r--r--languages/messages/MessagesFa.php15
-rw-r--r--languages/messages/MessagesFi.php313
-rw-r--r--languages/messages/MessagesFr.php31
-rw-r--r--languages/messages/MessagesFur.php7
-rw-r--r--languages/messages/MessagesFy.php37
-rw-r--r--languages/messages/MessagesGa.php15
-rw-r--r--languages/messages/MessagesGsw.php11
-rw-r--r--languages/messages/MessagesHe.php3256
-rw-r--r--languages/messages/MessagesHi.php9
-rw-r--r--languages/messages/MessagesHr.php13
-rw-r--r--languages/messages/MessagesHsb.php1575
-rw-r--r--languages/messages/MessagesHu.php11
-rw-r--r--languages/messages/MessagesIa.php8
-rw-r--r--languages/messages/MessagesId.php212
-rw-r--r--languages/messages/MessagesIs.php7
-rw-r--r--languages/messages/MessagesIt.php264
-rw-r--r--languages/messages/MessagesJa.php335
-rw-r--r--languages/messages/MessagesJbo.php3
-rw-r--r--languages/messages/MessagesKa.php5
-rw-r--r--languages/messages/MessagesKaa.php11
-rw-r--r--languages/messages/MessagesKg.php99
-rw-r--r--languages/messages/MessagesKk.php7
-rw-r--r--languages/messages/MessagesKk_cn.php2175
-rw-r--r--languages/messages/MessagesKk_kz.php2150
-rw-r--r--languages/messages/MessagesKk_tr.php2151
-rw-r--r--languages/messages/MessagesKn.php1
-rw-r--r--languages/messages/MessagesKo.php13
-rw-r--r--languages/messages/MessagesKsh.php20
-rw-r--r--languages/messages/MessagesKu.php13
-rw-r--r--languages/messages/MessagesLa.php85
-rw-r--r--languages/messages/MessagesLi.php20
-rw-r--r--languages/messages/MessagesLn.php17
-rw-r--r--languages/messages/MessagesLt.php2843
-rw-r--r--languages/messages/MessagesLv.php13
-rw-r--r--languages/messages/MessagesMi.php111
-rw-r--r--languages/messages/MessagesMk.php21
-rw-r--r--languages/messages/MessagesMs.php15
-rw-r--r--languages/messages/MessagesMt.php99
-rw-r--r--languages/messages/MessagesNds.php15
-rw-r--r--languages/messages/MessagesNds_nl.php15
-rw-r--r--languages/messages/MessagesNl.php17
-rw-r--r--languages/messages/MessagesNn.php13
-rw-r--r--languages/messages/MessagesNo.php213
-rw-r--r--languages/messages/MessagesOc.php95
-rw-r--r--languages/messages/MessagesOs.php1
-rw-r--r--languages/messages/MessagesPa.php2
-rw-r--r--languages/messages/MessagesPl.php131
-rw-r--r--languages/messages/MessagesPms.php25
-rw-r--r--languages/messages/MessagesPt.php77
-rw-r--r--languages/messages/MessagesPt_br.php13
-rw-r--r--languages/messages/MessagesRmy.php4
-rw-r--r--languages/messages/MessagesRo.php21
-rw-r--r--languages/messages/MessagesRu.php329
-rw-r--r--languages/messages/MessagesSk.php463
-rw-r--r--languages/messages/MessagesSl.php13
-rw-r--r--languages/messages/MessagesSq.php14
-rw-r--r--languages/messages/MessagesSr_ec.php121
-rw-r--r--languages/messages/MessagesSr_el.php121
-rw-r--r--languages/messages/MessagesSu.php13
-rw-r--r--languages/messages/MessagesSv.php210
-rw-r--r--languages/messages/MessagesTa.php27
-rw-r--r--languages/messages/MessagesTe.php14
-rw-r--r--languages/messages/MessagesTh.php1
-rw-r--r--languages/messages/MessagesTr.php15
-rw-r--r--languages/messages/MessagesTt.php860
-rw-r--r--languages/messages/MessagesTyv.php3
-rw-r--r--languages/messages/MessagesUk.php18
-rw-r--r--languages/messages/MessagesVec.php13
-rw-r--r--languages/messages/MessagesVi.php75
-rw-r--r--languages/messages/MessagesVls.php30
-rw-r--r--languages/messages/MessagesWa.php14
-rw-r--r--languages/messages/MessagesYi.php125
-rw-r--r--languages/messages/MessagesZh_cn.php3
-rw-r--r--languages/messages/MessagesZh_tw.php31
-rw-r--r--languages/messages/MessagesZh_yue.php207
-rw-r--r--maintenance/FiveUpgrade.inc10
-rw-r--r--maintenance/archives/patch-backlinkindexes.sql19
-rw-r--r--maintenance/archives/patch-externallinks.sql4
-rw-r--r--maintenance/archives/patch-filearchive.sql2
-rw-r--r--maintenance/archives/patch-ipb_anon_only.sql8
-rw-r--r--maintenance/archives/patch-ipb_optional_autoblock.sql3
-rw-r--r--maintenance/archives/patch-job.sql2
-rw-r--r--maintenance/archives/patch-log_params.sql2
-rw-r--r--maintenance/archives/patch-logging.sql2
-rw-r--r--maintenance/archives/patch-querycachetwo.sql22
-rw-r--r--maintenance/archives/patch-rc_len.sql9
-rw-r--r--maintenance/archives/patch-rc_user_text-index.sql7
-rw-r--r--maintenance/archives/patch-redirect.sql28
-rw-r--r--maintenance/archives/patch-rename-user_groups-and_rights.sql2
-rw-r--r--maintenance/archives/patch-restructure.sql8
-rw-r--r--maintenance/archives/patch-searchindex.sql2
-rw-r--r--maintenance/archives/patch-user_editcount.sql5
-rw-r--r--maintenance/archives/patch-user_newpass_time.sql4
-rw-r--r--maintenance/archives/patch-user_rights.sql2
-rw-r--r--maintenance/backup.inc2
-rw-r--r--maintenance/checkUsernames.php3
-rw-r--r--maintenance/commandLine.inc13
-rw-r--r--maintenance/deleteBatch.php11
-rw-r--r--maintenance/deleteDefaultMessages.php45
-rw-r--r--maintenance/dumpHTML.inc103
-rw-r--r--maintenance/dumpHTML.php13
-rw-r--r--maintenance/edit.php68
-rw-r--r--maintenance/fuzz-tester.php138
-rw-r--r--maintenance/generateSitemap.php10
-rw-r--r--maintenance/getLagTimes.php23
-rw-r--r--maintenance/getSlaveServer.php7
-rw-r--r--maintenance/importDump.php2
-rw-r--r--maintenance/importImages.php6
-rw-r--r--maintenance/importTextFile.php117
-rw-r--r--maintenance/initEditCount.php85
-rw-r--r--maintenance/initStats.php1
-rw-r--r--maintenance/interwiki.sql5
-rw-r--r--maintenance/language/langmemusage.php2
-rw-r--r--maintenance/language/languages.inc350
-rw-r--r--maintenance/language/messageTypes.inc346
-rw-r--r--maintenance/language/messages.inc2081
-rw-r--r--maintenance/language/rebuildLanguage.php82
-rw-r--r--maintenance/language/splitLanguageFiles.inc4
-rw-r--r--maintenance/language/transstat.php8
-rw-r--r--maintenance/language/writeMessagesArray.inc145
-rw-r--r--maintenance/moveBatch.php28
-rw-r--r--maintenance/mysql5/tables-binary.sql1095
-rw-r--r--maintenance/mysql5/tables.sql258
-rw-r--r--maintenance/namespace2sql.php4
-rw-r--r--maintenance/oracle/tables.sql6
-rw-r--r--maintenance/ourusers.php22
-rw-r--r--maintenance/parserTests.inc464
-rw-r--r--maintenance/parserTests.php35
-rw-r--r--maintenance/parserTests.txt691
-rw-r--r--maintenance/postgres/compare_schemas.pl106
-rw-r--r--maintenance/postgres/tables.sql58
-rw-r--r--maintenance/postgres/wp_mysql2postgres.pl4
-rw-r--r--maintenance/purgeList.php34
-rw-r--r--maintenance/showStats.php46
-rw-r--r--maintenance/stats.php4
-rw-r--r--maintenance/tables.sql125
-rw-r--r--maintenance/testRunner.sql35
-rw-r--r--maintenance/update.php11
-rw-r--r--maintenance/updateArticleCount.inc.php19
-rw-r--r--maintenance/updateSpecialPages.php12
-rw-r--r--maintenance/updaters.inc165
-rw-r--r--maintenance/userDupes.inc2
-rw-r--r--math/html.ml35
-rw-r--r--math/lexer.mll14
-rw-r--r--math/parser.mly25
-rw-r--r--math/tex.mli4
-rw-r--r--math/texutil.ml295
-rw-r--r--math/texvc_test.ml1
-rw-r--r--opensearch_desc.php6
-rw-r--r--skins/CologneBlue.php47
-rw-r--r--skins/MonoBook.php54
-rw-r--r--skins/Nostalgia.php8
-rw-r--r--skins/Standard.php10
-rw-r--r--skins/chick/main.css20
-rw-r--r--skins/common/ajax.js11
-rw-r--r--skins/common/ajaxwatch.js127
-rw-r--r--skins/common/cologneblue.css8
-rw-r--r--skins/common/common.css99
-rw-r--r--skins/common/commonPrint.css22
-rw-r--r--skins/common/common_rtl.css13
-rw-r--r--skins/common/images/sort_down.gifbin0 -> 879 bytes
-rw-r--r--skins/common/images/sort_none.gifbin0 -> 877 bytes
-rw-r--r--skins/common/images/sort_up.gifbin0 -> 881 bytes
-rw-r--r--skins/common/nostalgia.css1
-rw-r--r--skins/common/sorttable.js359
-rw-r--r--skins/common/wikibits.js524
-rw-r--r--skins/common/wikistandard.css8
-rw-r--r--skins/disabled/MonoBookCBT.php2
-rw-r--r--skins/monobook/IE70Fixes.css3
-rw-r--r--skins/monobook/audio.pngbin0 -> 312 bytes
-rw-r--r--skins/monobook/document.pngbin0 -> 270 bytes
-rw-r--r--skins/monobook/handheld.css1337
-rw-r--r--skins/monobook/main.css622
-rw-r--r--skins/monobook/rtl.css4
-rw-r--r--skins/monobook/video.pngbin0 -> 215 bytes
-rw-r--r--skins/simple/main.css38
-rw-r--r--thumb.php5
410 files changed, 41055 insertions, 11656 deletions
diff --git a/HISTORY b/HISTORY
index 06f5716c..302f9b0f 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,10 +1,260 @@
-Change notes from older releases. For current info see RELEASE-NOTES.
+Change notes from older releases. For current info see RELEASE-NOTES.
= MediaWiki release notes =
Security reminder: MediaWiki does not require PHP's register_globals
setting since version 1.2.0. If you have it on, turn it *off* if you can.
+== Changes since 1.7 ==
+
+* Introduced AjaxResponse object, superceding AjaxCachePolicy
+* Changes to sajax_do_call: optionally accept an element to fill instead of a
+ callback function; take the target function or element as a third parameter;
+ pass the full XMLHttpRequest object to the handler function, instead of just
+ the resultText value; use HTTP response codes to report errors.
+* (bug 6562) Removed unmaintained ParserXml.php for now
+* History paging overlap bug fixed
+* (bug 6586) Regression in "unblocked" subtitle
+* Don't put empty-page message into view-source when page text is blank
+* (bug 6587) Remove redundant "allnonarticles" message
+* Block improvements: Allow blocks on anonymous users only. Optionally allow
+ or disallow account creation from blocked IP addresses. Prevent duplicate
+ blocks. Fixed the problem of expiry and unblocking erroneously affecting
+ multiple blocks. Fixed confusing lack of error message when a blocked user
+ attempts to create an account. Fixed inefficiency of Special:Ipblocklist in
+ the presence of large numbers of blocks; added indexes and implemented an
+ indexed pager.
+* (bug 6448) Allow filtering of Special:Newpages according to username
+* (bug 6618) Improve permissions/error detection in Special:Lockdb
+* Quick hack for extension testing: parser test doesn't create new message
+ cache object.
+* (bug 6299) Maintain parser's revision ID across recursive calls to fix
+ {{REVISIONID}} when Cite extension is used
+* (bug 6622) Removed deprecated function Image::newFromTitle
+* (bug 6627) Fix regression in Special:Ipblocklist with table prefix
+* Removed forced dereferencements (new() returns a reference in PHP5)
+* Note about $wgUploadSizeWarning using byte
+* (bug 6592) Add most viewed pages summary to Special:Statistics
+* Pre-strip characters ignored in IDNs from URLs so they can't be used
+ to break the blacklists for regular URLs
+* Fix regression in blocking of user accounts
+* (bug 6635) Fix regression searching for range blocks on Ipblocklist
+* Fix regression searching Ipblocklist with ugly URLs
+* (bug 6639) Use a consistent default for upload directories
+* Preserve entered reason when reporting unconfirmed lock on Special:Lockdb
+* (bug 6642) Don't offer to unlock the database when it isn't locked
+* cleanupTitles.php changed from --dry-run option to --fix, so default
+ behavior is now a non-invasive check as with namespaceDupes.php
+* (bug 6660) Fix behaviour of EditPage::blockedPage() when the article does
+ not exist; now doesn't show the source box if the user hasn't provided it
+ (blocked mid-edit) and the page doesn't exist
+* Improve default value of "blockedtext"
+* (bug 6680) Added localisation for Dutch bookstore list (nl)
+* Renamed maintainace script redundanttrans.php to unusedMessages.php - clearer usage
+* Fix regression which allowed some blocked users to create additional accounts
+* (bug 6657) Fix Hungarian linktrail
+* (bug 6751) Fix preview of blanked section with edit on first preview option
+* (bug 5456) Separate MediaWiki:Search into messages for both noun and verb,
+ introduced 'MediaWiki:Searchbutton'
+* Made lines from initialiseMessages() appear as list items during installation
+* Moved the bulk of the localisation data from the Language*.php files to the
+ Messages*.php files. Deleted most of the Languages*.php files.
+* Introduced "stub global" framework to provide deferred initialisation of core
+ modules.
+* Removed placeholder values for $wgTitle and $wgArticle, these variables will
+ now be null during the initialisation process, until they are set by index.php
+ or another entry point.
+* Added DBA cache type, for BDB-style caches.
+* Removed custom date format functions, replacing them with a format string in
+ the style of PHP's date(). Used string identifiers instead of integer
+ identifiers, in both the language files and user preferences. Migration should
+ be transparent in most cases.
+* Simplified the initialisation API for LoadBalancer objects.
+* Removed the broken altencoding feature.
+* Moved default user options and toggles from Language to User. Language objects
+ are still able to define default preference overrides and extra user toggles,
+ via a slightly different interface.
+* Don't include the date option in the parser cache rendering hash unless
+ $wgUseDynamicDates is enabled.
+* Merged LanguageUtf8 with Language. Removed LanguageUtf8.php.
+* Removed inclusion of language files from the bottom of Language.php. This is
+ now consistently done from Language::factory().
+* Add the name of the executing maintenance script to the debug log. Start the
+ profiler during maintenance scripts.
+* Added "serialized" directory, for storing precompiled data in serialized form.
+* Fix regression in auto-set NS_PROJECT_TALK namespace
+* Fix regression in ordering of namespaces
+* (bug 6806, 6030) Added several global JS variables for article path, user name,
+ page title, etc.
+* hooks registered with addOnloadHook are now called at the one of the html body
+ by all skins.
+* Split ajax aided search from core ajax framework. Use wgUseAjax to enable the
+ framework and wgAjaxSearch to enable the suggest feature for the search box.
+* Added experimental installer for extensions.
+ See maintenance/installExtension.php
+* Added Tajic (tg) language file.
+* (bug 6903) Added Cantonese localisation (zh-yue)
+* Fix regression in Korean and Japanese date formatting (day of week)
+* (bug 6919) Add English alias magic words for Tatar (tt) language file.
+* (bug 6753) Fixed broken Kazakh linktrail (kk)
+* (bug 6700) Added Kazakh language variants to Names.php
+* (bug 6827) some i18n specific maintenance scripts fails after merge of localisation-work branch
+* Throwed an exception for the deprecated functions OutputPage::sysopRequired and
+ OutputPage::developerRequired - use OutputPage::permissionRequired instead.
+* Removed the deprecated functions User::isSysop, User::isBureaucrat and User::isDeveloper -
+ use User::isAllowed instead.
+* (bug 769) OutputPage::permissionRequired() should suggest groups with the needed permission
+* (bug 6971) Fix regression in Special:Export history view
+* Revamped Special:Imagelist
+* (bug 7000) updated MessagesPl.php
+* (bug 6946) Fix unexpected behavior change with GET hits to Special:Export
+* (bug 1866) Improve navigation on Special:Listusers; user now a starting
+ point as with Special:Allpages, rather than a pure limit.
+* Clean up tab order on Special:Blockip
+* (bug 5969) Clean up tab order on Special:Userlogin forms
+* (bug 3512) namespaceDupes now handles spaces and initial caps properly
+* (bug 7037) Fix regression in login tab order
+* (bug 7031) Report missing email on 'email password' instead of false success
+* (bug 7010) Don't send email notifications for watched talk pages when user
+ has selected to receive only updates for their own talk page
+* Added {{CURRENTHOUR}}
+* Added [[:Image:Foo.png]] style links to the pagelinks table
+* Avoid duplicate revision imports with Special:Import
+* (bug 7054) Validate email address before sending email confirmation message
+* (bug 7061) Format title on "from (page)" links on Special:Allpages
+* (bug 7044) Introduce "padleft" and "padright" colon functions
+* Pass page title as parameters to "linkshere" and "nolinkshere" and update
+ default message text
+* Allows to upload from publicy accessible URL. Set $wgAllowCopyUploads = true ; in LocalSettings.php
+ Limited to $wgMaxUploadSize (default:100MB); URL upload is limited to sysops by default, and displayed as a second line if appropriate
+* (bug 832) Return to user page after emailing a user
+* (bug 366) Add local-system-timezone equivalents for date/time variables
+* (bug 7109) Fix Atom feed version number in header links
+* (bug 7075) List registered parser function hooks on Special:Version
+* (bug 7059) Introduce "anchorencode" colon function
+* Include SVN revision number in {{CURRENTVERSION}} output, where applicable
+* Fix bug in wfRunHooks which caused corruption of objects in the hook list
+* (bug 4979) Use simplified email addresses when running on Windows
+* (bug 4434) Show block log fragment on Special:Blockip
+* [[MediaWiki:Disambiguationspage]] may optionally contain wiki links to any number
+ of disambiguation templates.
+* [[Special:Disambiguations]] now shows pages in NS:0 that link to any pages that embed
+ any of the templates listed at [[MediaWiki:Disambiguationspage]].
+* Fix formatting of titles on Special:Undelete
+* (bug 7026) Fix action=raw&templates=expand
+* (bug 6976) Add namespace and direction classes to classic skins
+* (bug 7144) Don't "return to main" from OutputPage::loginToUse() if the the user can't
+ read the main page in the first place
+* (bug 7188) Fix minor borkage in HTMLForm
+* (bug 6675) Replaced message 'watchthis' with new message 'watchthisupload in Special:Upload
+* Add a quickie script dumpSisterSites.php for generating a page list in the
+ format for WSR-1 SisterSites support
+* (bug 7223) Monobook.js is used for site content, should not be localized
+* Set default disabled values for DjVu render options
+* Added Xml::option() for generating <option>s easily
+* Localized page numbers in drop-down for DjVu page selection
+* Fixed linktrail for vi
+* (bug 6893) "Call to a member function exists() on a non-object" on trackback.php with bad input
+* (bug 6886) PHP undefined offset on bad input to Special:Revisiondelete
+* (bug 6887) PHP error for call to getId() on bad input to Special:Revisiondelete
+* (bug 6888) PHP error for call to getTimestamp() on bad input to Special:Revisiondelete
+* (bug 7252) Use dvipng support in texvc math rastrization. dvipng is required if texvc is rebuilt.
+* (bug 7279) Use wfBaseName in place of basename() in more places
+* Clear newtalk marker on diff links with explicit current revision number
+* (bug 7064) Replace hard-coded empty message checks with wfEmptyMsg calls
+* (bug 6777) Remove some PHP 4 compat cruft
+* Add --user, --comment, and --license options to importImages.php
+* (bug 6216) The immobile namespace message does not mention the source page
+* (bug 7299) Normalize username filter on Special:Newpages
+* (bug 7306) RTL text in an LTR wiki breaks appearance of Special:Recentchanges
+* (bug 7312) Don't emit SET NAMES utf8 if connection failed
+* (bug 7305) Proper compare for bot check on RC notify, should fix overrides
+ that force edits by non-bot users to bot mode
+* Set Vary: Cookie on action=raw generated CSS and JS, to ensure that user
+ preferences don't get stuck in proxy caches for other people
+* (bug 7324) Fix error message for failure of Database::sourceFile()
+* (bug 7309) Plurals: use singular form for zero in French and Brazilian Portuguese
+* Add page_no_title_convert field to support language variant conversion
+ for page titles which shouldn't be converted on display/linking
+* Lazy extraction of text chunks in Revision objects, may reduce hits to
+ external storage when actual text content is not used
+* Added experimental $wgRevisionCacheExpiry to cache extracted revision text
+ in $wgMemc, to further reduce hits to external storage.
+ Set to 0 (disabled) by default.
+* Minor changes to the installer.
+* Remove ":" for 'youremail' and 'yourrealname' in includes/templates/Userlogin.php
+ so that ":" could be used in i18n for Special:Preferences (like 'username' and 'uid').
+* Fix layout for Special:Preferences->Date and Time (position for 'timezonetext').
+* Updates to language variant code for Serbian et al
+* (bug 6756) Enabling RTL direction for kk-cn
+* (bug 6701) Kazakh language variants in MessagesEn.php
+* (bug 7335) SVN revision check in Special:Version fails on SVN 1.4 working copy
+* (bug 6518) Replaced 'lastmodified' with 'lastmodifiedat' and 'lastmodifiedby' with 'lastmodifiedatby'
+ with seperated parameters for date and time to allow better localisation. Updated all message files
+ to display the old format for compatibility.
+* (bug 7357) Make supposedly static methods of Skin actually static
+* Added info text to Special:Deadendpages and Special:Lonelypages
+* Fix regression in cachability of generated CSS and JS for MonoBook skin,
+ while avoiding clobbering of different users' cached data
+* (bug 6849) Block @ from usernames; interferes with multi-database tools and
+ was meant to be banned years ago... For now existing accounts will not be
+ prevented fromm login.
+* (bug 6092) Introduce magic words {{REVISIONDAY}}, {{REVISIONDAY2}, {{REVISIONMONTH}},
+ {{REVISIONYEAR}} and {{REVISIONTIMESTAMP}}
+* (bug 7425) Preceeding whitespace in [[...]] breaks subpages
+* Try to reconnect after transitory database errors in dumpTextPass.php
+* (bug 6023) Fixed mismatch of 0/NULL for wl_notificationtimestamp; now notification
+ mails are working after 'Mark all pages visited' button on Special:Watchlist is clicked
+* Made {{INT:}} a core parser function instead of a special case. The syntax
+ and behaviour is largely unchanged.
+* (bug 7448) Fixing the native name for Ewe (ee)
+* (bug 6864) Replace message 'editing' with new message 'editinguser' in Special:Userrights
+ to allow better localisation
+* Add '*-summary' for special pages to MessagesEn.php to allow customizing/translation
+ directly through Special:Allmessages
+* (bug 6130, bug 5818) Replaced message 'go' with the new message 'searcharticle' in skins
+ to allow better localisation
+* Add + to $wgLegalTitleChars by default. Some sites may have occasional
+ problems with hard-to-reach pages, but it should be less trouble than
+ "I can't import dumps from Wikipedia" complaints
+* (bug 7460) Revert broken patch for bug 7226 which slows down
+ Special:Allmessages by a factor of 16
+* Committed a bunch of live hacks from Wikimedia servers
+* (bug 6889) PHP notices in thumb.php with missing params
+* Cleaner error behavior on thumb.php with invalid page selection
+* (bug 6617) Validate timestamps on Special:Undelete
+* Do fewer unnecessary full writes of user rows; only update user_touched
+ for watch/unwatch, group membership change, and login operations
+* Restructured the languages directory, to avoid problems when people
+ untar MW 1.8 over the top of a 1.7 installation.
+* (bug 6890) SQL query error on bad input to Pager lists
+ due to negative LIMIT clause, caused by integer wraparound.
+* Fixed various bugs related to table prefixes, especially the interaction
+ between table prefixes and memcached, which was formerly completely broken.
+* (bug 7004) PHP iconv() notice on bad password input to Special:Userlogin.
+* (bug 6826) Extend pre-save transform context link ("pipe trick")
+ syntax to pages with commas in title
+* Use ImageMagick -thumbnail option instead of -resize to avoid including
+ excessive metadata in thumbs (requires ImageMagick 6.0.0 or newer).
+* (bug 7499) Corrections to Swedish talk namespace names
+* (bug 7508) Added option to compress HTML pages by dumpHTML.php
+* (bug 7519) Add plural in SpecialWatchlist
+* (bug 7459) Magic word variables are always case sensitive
+* Replaced {{SERVER}}{{localurl:xxx}} with {{fullurl:xxx}} in localisation files
+* Fix regression in Special:Watchlist text header
+* (bug 7510) Update article counts etc on undelete
+* (bug 7520) Update article counts on XML import
+* (bug 7526) Make $wgDefaultUserOptions work again
+* (bug 7472) Localize Help namespace for Basque
+* (bug 7529) Including a non-existent category in an article places that article in the category
+* (bug 4528) Lack of important LaTeX functions stackrel, rightleftharpoon
+* (bug 6721) missing symbols ulcorner, urcorner, llcorner, lrcorner, twoheadrightarrow, twoheadleftarrow
+* (bug 7367) Hyphens sometimes erroneously appended to equations when not converted to PNG
+* Add "title" to the opensearch link to allow automatic adding of the search engine in Firefox 2
+* (bug 7537) Add php5 to $wgFileBlacklist
+* (bug 6929) Restore AutoAuthenticate hook
+
+
== Changes since 1.6 ==
* (bug 5458) Fix double-URL encoding in block log link in contribs and contribs
diff --git a/INSTALL b/INSTALL
index 22bf3670..4c69dcf9 100644
--- a/INSTALL
+++ b/INSTALL
@@ -4,7 +4,7 @@ Installing MediaWiki
Starting with MediaWiki 1.2.0, it's possible to install
and configure the wiki "in-place", as long as you have
-the necessary prerequesites available.
+the necessary prerequisites available.
Required software:
* Web server with PHP 5.x or higher.
@@ -98,9 +98,9 @@ provide enough information to work with, and preferably be aware
of what you're doing!) and keep track of major changes to the
software, including performance improvements and security patches.
-http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce (low traffic)
+http://lists.wikimedia.org/mailman/listinfo/mediawiki-announce (low traffic)
-http://mail.wikimedia.org/mailman/listinfo/mediawiki-l (site admin support)
+http://lists.wikimedia.org/mailman/listinfo/mediawiki-l (site admin support)
-http://mail.wikimedia.org/mailman/listinfo/wikitech-l (development)
+http://lists.wikimedia.org/mailman/listinfo/wikitech-l (development)
diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..0cfba45a
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,2 @@
+test: Test.php
+ prove -r t
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index 82eb053b..24d90c1f 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -3,18 +3,29 @@
Security reminder: MediaWiki does not require PHP's register_globals
setting since version 1.2.0. If you have it on, turn it *off* if you can.
-== MediaWiki 1.8.3 ==
+== MediaWiki 1.9 ==
-January 9, 2007
+January 10, 2007
+
+This is the quarterly release snapshot for Winter 2007. While the code
+has been running on Wikipedia for some time, installation and upgrade
+bits may be less well tested. Bug fix releases may follow in the coming
+days or weeks.
+
+
+MediaWiki is now using a "continuous integration" development model with
+quarterly snapshot releases. The latest development code is always kept
+"ready to run", and in fact runs our own sites on Wikipedia.
+
+Release branches will continue to receive security updates for about a year
+from first release, but nonessential bugfixes and feature development happen
+will be made on the development trunk and appear in the next quarterly release.
+
+Those wishing to use the latest code instead of a branch release can obtain
+it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
-MediaWiki 1.8.3 fixes several issues in the Fall 2006 snapshot release:
-* (bug 7831) Regression in AutoAuthenticate hook
-* Run PHP install version checks on update.php so command-line updaters see
- new version requirements
-* Do a check for the PHP 5.0.x 64-bit bug, since this is much more disruptive
- as of MW 1.8 than it used to be. Install or upgrade now aborts with a
- warning and a request to upgrade.
-* XSS fix in AJAX module
+
+== Security fixes ==
An XSS injection vulnerability was located in the AJAX support module,
affecting MediaWiki 1.6.x and up when the optional setting $wgUseAjax
@@ -22,7 +33,7 @@ is enabled.
There is no danger in the default configuration, with $wgUseAjax off.
-If you are using an extension based on the optional AJAX module,
+If you are using an extension based on the optional Ajax module,
either disable it or upgrade to a version containing the fix:
* 1.9: fixed in 1.9.0rc2
@@ -31,368 +42,736 @@ either disable it or upgrade to a version containing the fix:
* 1.6: fixed in 1.6.9
-== MediaWiki 1.8.2 ==
+== Compatibility changes ==
-October 13, 2006
+=== Zend Optimizer ===
-MediaWiki 1.8.2 fixes several issues in the Fall 2006 snapshot release:
+A bug in some versions of PHP 5 and Zend Optimizer which was triggered under
+MediaWiki 1.8.x has been worked around by disabling some internal debugging
+features when Zend Optimizer is loaded. This should solve some common
+"blank page" problems.
-* (bug 7565) Fixed typos in German localisation
-* (bug 7562) Fix non-ASCII namespaces on Windows/XAMPP servers
+=== PHP 5.0 64-bit ===
+MediaWiki now checks for a condition where PHP 5.0.x corrupts array data
+on 64-bit systems and warns you to upgrade PHP to solve the problem. This
+bug causes Special: pages to fail on affected systems under MediaWiki 1.8
+and higher, and subtler data corruption on earlier versions.
-== MediaWiki 1.8.1 ==
+The only known workaround is to upgrade PHP to 5.1 or later, which you
+probably should do anyway for security reasons!
-October 11, 2006
+=== MySQL 5 ===
-MediaWiki 1.8.1 fixes several issues in the Fall 2006 snapshot release:
+MediaWiki should now install and run correctly on MySQL 5.0 and higher when
+MySQL's "strict mode" is enabled. (This is now the default for many Windows
+installations, though it seems to remain off by default on Unix.)
-* Fix PHP notice and estimates for dumpBackup.php and friends
-* Improved register_globals paranoia checks
-* (bug 7545) Fix PHP version check on install
-* Experimental web API disabled by default
-* Disable PHP exception backtrace printing unless $wgShowExceptionDetails
- is set. Backtraces may contain sensitive information in function call
- parameters.
+This fixes errors about "cannot default default value for BLOB/TEXT fields".
+=== ImageMagick ===
-== MediaWiki 1.8.0 ==
+Note that ImageMagick older than 6.x may no longer work for image resizing
+due to use of the -thumbnail option.
-October 10, 2006
-This is the quarterly release snapshot for Fall 2006. While the code
-has been running on Wikipedia for some time, installation and upgrade
-bits may be less well tested. Bug fix releases may follow in the coming
-days or weeks.
+== Behavior changes ==
+=== Localized special pages ===
-MediaWiki is now using a "continuous integration" development model with
-quarterly snapshot releases. The latest development code is always kept
-"ready to run", and in fact runs our own sites on Wikipedia.
+The names of Special: pages can now be localized, so links and URLs to them
+are more legible in languages that aren't English.
-Release branches will continue to receive security updates for about a year
-from first release, but nonessential bugfixes and feature development happen
-will be made on the development trunk and appear in the next quarterly release.
+Not all languages have included localized names yet.
-Those wishing to use the latest code instead of a branch release can obtain
-it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
+=== E-mail password ===
+
+Users are now required to set a new password for themselves when they first
+log in with a newly generated e-mailed password.
+
+Requesting passwords frequently is prevented to reduce abusive mailbombing.
+
+=== Undo revision ===
+
+An "undo" link now appears in diff view for easier reverting of older edits.
+When GNU diff3 is available for edit conflict merging, this can make it much
+easier to "undo" the changes of an older edit when there are surrounding
+changes elsewhere in the page.
+
+The changes must be manually reviewed and approved, as with conventional
+full-revision reverts.
+
+=== Blocking ===
+
+User blocks can be set to disable the automatic blocking of IP addresses the
+account logs in with.
+
+
+== Database changes ==
+
+* new 'redirect' table stores data on page redirects
+* new 'querycachetwo' table used for some cached special pages
+* 'ipblocks' table adds 'ipb_enable_autoblock'
+* 'recentchanges' table adds 'rc_old_len', 'rc_new_len' for size tracking
+* 'user' table has added 'user_newpass_time' and 'user_editcount' fields
+* some indexes have been updated on 'recentchanges'
== Configuration changes ==
-* $wgUseETag, to enable/disable sending of HTTP ETag headers
- (default: disabled)
-* $wgLegalTitleChars now includes '+' by default for better compatibility
- with importing data dumps from Wikipedia
-* $wgDefaultUserOptions now includes all default option settings instead
- of only overrides.
-
-
-== Major new features ==
-
-* (bug 7098) Add an option to disable/enable sending of HTTP ETag headers,
- as it seems to result in broken behaviour in combination with Squid 2.6
- (disabled by default).
-* (bug 550) Allow blocks on anonymous users only.
-* (bug 6420) Render thumbnails for DJVU images, support multipage DJVU display
- on image pages. Added new 'page=' thumbnail option to select a page from a
- multipage djvu for thumbnail generation.
-* Full Postgres support is now enabled. It requires version 8.1 or better, and
- needs to have both plpgsql and tsearch2 already installed.
-* (bug 6386) fix grammatical errors in danish naming of talk namespaces.
-
-== Changes since 1.7 ==
-
-* Introduced AjaxResponse object, superceding AjaxCachePolicy
-* Changes to sajax_do_call: optionally accept an element to fill instead of a
- callback function; take the target function or element as a third parameter;
- pass the full XMLHttpRequest object to the handler function, instead of just
- the resultText value; use HTTP response codes to report errors.
-* (bug 6562) Removed unmaintained ParserXml.php for now
-* History paging overlap bug fixed
-* (bug 6586) Regression in "unblocked" subtitle
-* Don't put empty-page message into view-source when page text is blank
-* (bug 6587) Remove redundant "allnonarticles" message
-* Block improvements: Allow blocks on anonymous users only. Optionally allow
- or disallow account creation from blocked IP addresses. Prevent duplicate
- blocks. Fixed the problem of expiry and unblocking erroneously affecting
- multiple blocks. Fixed confusing lack of error message when a blocked user
- attempts to create an account. Fixed inefficiency of Special:Ipblocklist in
- the presence of large numbers of blocks; added indexes and implemented an
- indexed pager.
-* (bug 6448) Allow filtering of Special:Newpages according to username
-* (bug 6618) Improve permissions/error detection in Special:Lockdb
-* Quick hack for extension testing: parser test doesn't create new message
- cache object.
-* (bug 6299) Maintain parser's revision ID across recursive calls to fix
- {{REVISIONID}} when Cite extension is used
-* (bug 6622) Removed deprecated function Image::newFromTitle
-* (bug 6627) Fix regression in Special:Ipblocklist with table prefix
-* Removed forced dereferencements (new() returns a reference in PHP5)
-* Note about $wgUploadSizeWarning using byte
-* (bug 6592) Add most viewed pages summary to Special:Statistics
-* Pre-strip characters ignored in IDNs from URLs so they can't be used
- to break the blacklists for regular URLs
-* Fix regression in blocking of user accounts
-* (bug 6635) Fix regression searching for range blocks on Ipblocklist
-* Fix regression searching Ipblocklist with ugly URLs
-* (bug 6639) Use a consistent default for upload directories
-* Preserve entered reason when reporting unconfirmed lock on Special:Lockdb
-* (bug 6642) Don't offer to unlock the database when it isn't locked
-* cleanupTitles.php changed from --dry-run option to --fix, so default
- behavior is now a non-invasive check as with namespaceDupes.php
-* (bug 6660) Fix behaviour of EditPage::blockedPage() when the article does
- not exist; now doesn't show the source box if the user hasn't provided it
- (blocked mid-edit) and the page doesn't exist
-* Improve default value of "blockedtext"
-* (bug 6680) Added localisation for Dutch bookstore list (nl)
-* Renamed maintainace script redundanttrans.php to unusedMessages.php - clearer usage
-* Fix regression which allowed some blocked users to create additional accounts
-* (bug 6657) Fix Hungarian linktrail
-* (bug 6751) Fix preview of blanked section with edit on first preview option
-* (bug 5456) Separate MediaWiki:Search into messages for both noun and verb,
- introduced 'MediaWiki:Searchbutton'
-* Made lines from initialiseMessages() appear as list items during installation
-* Moved the bulk of the localisation data from the Language*.php files to the
- Messages*.php files. Deleted most of the Languages*.php files.
-* Introduced "stub global" framework to provide deferred initialisation of core
- modules.
-* Removed placeholder values for $wgTitle and $wgArticle, these variables will
- now be null during the initialisation process, until they are set by index.php
- or another entry point.
-* Added DBA cache type, for BDB-style caches.
-* Removed custom date format functions, replacing them with a format string in
- the style of PHP's date(). Used string identifiers instead of integer
- identifiers, in both the language files and user preferences. Migration should
- be transparent in most cases.
-* Simplified the initialisation API for LoadBalancer objects.
-* Removed the broken altencoding feature.
-* Moved default user options and toggles from Language to User. Language objects
- are still able to define default preference overrides and extra user toggles,
- via a slightly different interface.
-* Don't include the date option in the parser cache rendering hash unless
- $wgUseDynamicDates is enabled.
-* Merged LanguageUtf8 with Language. Removed LanguageUtf8.php.
-* Removed inclusion of language files from the bottom of Language.php. This is
- now consistently done from Language::factory().
-* Add the name of the executing maintenance script to the debug log. Start the
- profiler during maintenance scripts.
-* Added "serialized" directory, for storing precompiled data in serialized form.
-* Fix regression in auto-set NS_PROJECT_TALK namespace
-* Fix regression in ordering of namespaces
-* (bug 6806, 6030) Added several global JS variables for article path, user name,
- page title, etc.
-* hooks registered with addOnloadHook are now called at the one of the html body
- by all skins.
-* Split ajax aided search from core ajax framework. Use wgUseAjax to enable the
- framework and wgAjaxSearch to enable the suggest feature for the search box.
-* Added experimental installer for extensions.
- See maintenance/installExtension.php
-* Added Tajic (tg) language file.
-* (bug 6903) Added Cantonese localisation (zh-yue)
-* Fix regression in Korean and Japanese date formatting (day of week)
-* (bug 6919) Add English alias magic words for Tatar (tt) language file.
-* (bug 6753) Fixed broken Kazakh linktrail (kk)
-* (bug 6700) Added Kazakh language variants to Names.php
-* (bug 6827) some i18n specific maintenance scripts fails after merge of localisation-work branch
-* Throwed an exception for the deprecated functions OutputPage::sysopRequired and
- OutputPage::developerRequired - use OutputPage::permissionRequired instead.
-* Removed the deprecated functions User::isSysop, User::isBureaucrat and User::isDeveloper -
- use User::isAllowed instead.
-* (bug 769) OutputPage::permissionRequired() should suggest groups with the needed permission
-* (bug 6971) Fix regression in Special:Export history view
-* Revamped Special:Imagelist
-* (bug 7000) updated MessagesPl.php
-* (bug 6946) Fix unexpected behavior change with GET hits to Special:Export
-* (bug 1866) Improve navigation on Special:Listusers; user now a starting
- point as with Special:Allpages, rather than a pure limit.
-* Clean up tab order on Special:Blockip
-* (bug 5969) Clean up tab order on Special:Userlogin forms
-* (bug 3512) namespaceDupes now handles spaces and initial caps properly
-* (bug 7037) Fix regression in login tab order
-* (bug 7031) Report missing email on 'email password' instead of false success
-* (bug 7010) Don't send email notifications for watched talk pages when user
- has selected to receive only updates for their own talk page
-* Added {{CURRENTHOUR}}
-* Added [[:Image:Foo.png]] style links to the pagelinks table
-* Avoid duplicate revision imports with Special:Import
-* (bug 7054) Validate email address before sending email confirmation message
-* (bug 7061) Format title on "from (page)" links on Special:Allpages
-* (bug 7044) Introduce "padleft" and "padright" colon functions
-* Pass page title as parameters to "linkshere" and "nolinkshere" and update
- default message text
-* Allows to upload from publicy accessible URL. Set $wgAllowCopyUploads = true ; in LocalSettings.php
- Limited to $wgMaxUploadSize (default:100MB); URL upload is limited to sysops by default, and displayed as a second line if appropriate
-* (bug 832) Return to user page after emailing a user
-* (bug 366) Add local-system-timezone equivalents for date/time variables
-* (bug 7109) Fix Atom feed version number in header links
-* (bug 7075) List registered parser function hooks on Special:Version
-* (bug 7059) Introduce "anchorencode" colon function
-* Include SVN revision number in {{CURRENTVERSION}} output, where applicable
-* Fix bug in wfRunHooks which caused corruption of objects in the hook list
-* (bug 4979) Use simplified email addresses when running on Windows
-* (bug 4434) Show block log fragment on Special:Blockip
-* [[MediaWiki:Disambiguationspage]] may optionally contain wiki links to any number
- of disambiguation templates.
-* [[Special:Disambiguations]] now shows pages in NS:0 that link to any pages that embed
- any of the templates listed at [[MediaWiki:Disambiguationspage]].
-* Fix formatting of titles on Special:Undelete
-* (bug 7026) Fix action=raw&templates=expand
-* (bug 6976) Add namespace and direction classes to classic skins
-* (bug 7144) Don't "return to main" from OutputPage::loginToUse() if the the user can't
- read the main page in the first place
-* (bug 7188) Fix minor borkage in HTMLForm
-* (bug 6675) Replaced message 'watchthis' with new message 'watchthisupload in Special:Upload
-* Add a quickie script dumpSisterSites.php for generating a page list in the
- format for WSR-1 SisterSites support
-* (bug 7223) Monobook.js is used for site content, should not be localized
-* Set default disabled values for DjVu render options
-* Added Xml::option() for generating <option>s easily
-* Localized page numbers in drop-down for DjVu page selection
-* Fixed linktrail for vi
-* (bug 6893) "Call to a member function exists() on a non-object" on trackback.php with bad input
-* (bug 6886) PHP undefined offset on bad input to Special:Revisiondelete
-* (bug 6887) PHP error for call to getId() on bad input to Special:Revisiondelete
-* (bug 6888) PHP error for call to getTimestamp() on bad input to Special:Revisiondelete
-* (bug 7252) Use dvipng support in texvc math rastrization. dvipng is required if texvc is rebuilt.
-* (bug 7279) Use wfBaseName in place of basename() in more places
-* Clear newtalk marker on diff links with explicit current revision number
-* (bug 7064) Replace hard-coded empty message checks with wfEmptyMsg calls
-* (bug 6777) Remove some PHP 4 compat cruft
-* Add --user, --comment, and --license options to importImages.php
-* (bug 6216) The immobile namespace message does not mention the source page
-* (bug 7299) Normalize username filter on Special:Newpages
-* (bug 7306) RTL text in an LTR wiki breaks appearance of Special:Recentchanges
-* (bug 7312) Don't emit SET NAMES utf8 if connection failed
-* (bug 7305) Proper compare for bot check on RC notify, should fix overrides
- that force edits by non-bot users to bot mode
-* Set Vary: Cookie on action=raw generated CSS and JS, to ensure that user
- preferences don't get stuck in proxy caches for other people
-* (bug 7324) Fix error message for failure of Database::sourceFile()
-* (bug 7309) Plurals: use singular form for zero in French and Brazilian Portuguese
-* Add page_no_title_convert field to support language variant conversion
- for page titles which shouldn't be converted on display/linking
-* Lazy extraction of text chunks in Revision objects, may reduce hits to
- external storage when actual text content is not used
-* Added experimental $wgRevisionCacheExpiry to cache extracted revision text
- in $wgMemc, to further reduce hits to external storage.
- Set to 0 (disabled) by default.
-* Minor changes to the installer.
-* Remove ":" for 'youremail' and 'yourrealname' in includes/templates/Userlogin.php
- so that ":" could be used in i18n for Special:Preferences (like 'username' and 'uid').
-* Fix layout for Special:Preferences->Date and Time (position for 'timezonetext').
-* Updates to language variant code for Serbian et al
-* (bug 6756) Enabling RTL direction for kk-cn
-* (bug 6701) Kazakh language variants in MessagesEn.php
-* (bug 7335) SVN revision check in Special:Version fails on SVN 1.4 working copy
-* (bug 6518) Replaced 'lastmodified' with 'lastmodifiedat' and 'lastmodifiedby' with 'lastmodifiedatby'
- with seperated parameters for date and time to allow better localisation. Updated all message files
- to display the old format for compatibility.
-* (bug 7357) Make supposedly static methods of Skin actually static
-* Added info text to Special:Deadendpages and Special:Lonelypages
-* Fix regression in cachability of generated CSS and JS for MonoBook skin,
- while avoiding clobbering of different users' cached data
-* (bug 6849) Block @ from usernames; interferes with multi-database tools and
- was meant to be banned years ago... For now existing accounts will not be
- prevented fromm login.
-* (bug 6092) Introduce magic words {{REVISIONDAY}}, {{REVISIONDAY2}, {{REVISIONMONTH}},
- {{REVISIONYEAR}} and {{REVISIONTIMESTAMP}}
-* (bug 7425) Preceeding whitespace in [[...]] breaks subpages
-* Try to reconnect after transitory database errors in dumpTextPass.php
-* (bug 6023) Fixed mismatch of 0/NULL for wl_notificationtimestamp; now notification
- mails are working after 'Mark all pages visited' button on Special:Watchlist is clicked
-* Made {{INT:}} a core parser function instead of a special case. The syntax
- and behaviour is largely unchanged.
-* (bug 7448) Fixing the native name for Ewe (ee)
-* (bug 6864) Replace message 'editing' with new message 'editinguser' in Special:Userrights
- to allow better localisation
-* Add '*-summary' for special pages to MessagesEn.php to allow customizing/translation
- directly through Special:Allmessages
-* (bug 6130, bug 5818) Replaced message 'go' with the new message 'searcharticle' in skins
- to allow better localisation
-* Add + to $wgLegalTitleChars by default. Some sites may have occasional
- problems with hard-to-reach pages, but it should be less trouble than
- "I can't import dumps from Wikipedia" complaints
-* (bug 7460) Revert broken patch for bug 7226 which slows down
- Special:Allmessages by a factor of 16
-* Committed a bunch of live hacks from Wikimedia servers
-* (bug 6889) PHP notices in thumb.php with missing params
-* Cleaner error behavior on thumb.php with invalid page selection
-* (bug 6617) Validate timestamps on Special:Undelete
-* Do fewer unnecessary full writes of user rows; only update user_touched
- for watch/unwatch, group membership change, and login operations
-* Restructured the languages directory, to avoid problems when people
- untar MW 1.8 over the top of a 1.7 installation.
-* (bug 6890) SQL query error on bad input to Pager lists
- due to negative LIMIT clause, caused by integer wraparound.
-* Fixed various bugs related to table prefixes, especially the interaction
- between table prefixes and memcached, which was formerly completely broken.
-* (bug 7004) PHP iconv() notice on bad password input to Special:Userlogin.
-* (bug 6826) Extend pre-save transform context link ("pipe trick")
- syntax to pages with commas in title
-* Use ImageMagick -thumbnail option instead of -resize to avoid including
- excessive metadata in thumbs (requires ImageMagick 6.0.0 or newer).
-* (bug 7499) Corrections to Swedish talk namespace names
-* (bug 7508) Added option to compress HTML pages by dumpHTML.php
-* (bug 7519) Add plural in SpecialWatchlist
-* (bug 7459) Magic word variables are always case sensitive
-* Replaced {{SERVER}}{{localurl:xxx}} with {{fullurl:xxx}} in localisation files
-* Fix regression in Special:Watchlist text header
-* (bug 7510) Update article counts etc on undelete
-* (bug 7520) Update article counts on XML import
-* (bug 7526) Make $wgDefaultUserOptions work again
-* (bug 7472) Localize Help namespace for Basque
-* (bug 7529) Including a non-existent category in an article places that article in the category
-* (bug 4528) Lack of important LaTeX functions stackrel, rightleftharpoon
-* (bug 6721) missing symbols ulcorner, urcorner, llcorner, lrcorner, twoheadrightarrow, twoheadleftarrow
-* (bug 7367) Hyphens sometimes erroneously appended to equations when not converted to PNG
-* Add "title" to the opensearch link to allow automatic adding of the search engine in Firefox 2
-* (bug 7537) Add php5 to $wgFileBlacklist
-* (bug 6929) Restore AutoAuthenticate hook
+Several configuration options have changed since 1.8:
+
+=== $wgEnableAPI ===
+
+The experimental machine API interface is now enabled by default, read-only.
+You can disable it by setting $wgEnableAPI = false; in LocalSettings.php.
+
+=== $wgPathInfo ===
+
+The use of PATH_INFO (the text after the script name in 'index.php/Blah')
+is controlled by the $wgUsePathInfo setting. This is now explicitly disabled
+for CGI, apache2filter, and ISAPI configurations of PHP, for more consistency
+with the autodetection from the installer.
+
+In some rarer configurations you may have to switch $wgUsePathInfo from false
+to true or, perhaps, from true to false to make things work properly if bad
+PATH_INFO data comes through the server.
+
+The wiki now tries to detect this condition and should show you an error
+message describing what to change instead of sending the browser into an
+infinite redirect loop.
+
+=== $wgScript and other path settings ===
+
+The following configuration variables are now automatically set in Setup.php
+if they are not overridden in LocalSettings.php:
+
+from $wgScriptPath:
+ + $wgScript
+ | \- $wgArticlePath
+ + $wgRedirectScript
+ + $wgStylePath
+ + $wgUploadPath
+ \- $wgLogo
+ + $wgMathPath
+
+from $IP:
+ - $wgStyleDirectory
+ + $wgUploadDirectory
+ \- $wgMathDirectory
+ + $wgTmpDirectory
+ + $wgReadOnlyFile
+ + $wgFileCacheDirectory
+
+Newly generated configuration files will by default include only $wgScriptPath
+(hardcoded from the installer) and $IP (detected at runtime).
+
+Old configuration files which specify all these values explicitly should
+continue to work just fine, but if you use the defaults you can remove them
+to reduce clutter.
+
+=== $wgGroupPermissions ===
+
+The sysop group now holds the "autopatrol" and "ipblock-exempt" rights by
+default.
+
+"autopatrol" replaces the preference for marking ones own edits patrolled
+by default; users holding this permission will automatically have their
+edits patrolled, while others cannot mark their own edits as patrolled
+even if they have patrolling rights.
+
+"ipblock-exempt" excludes the user from IP blocks; accounts which are blocked
+explicitly by name will still be blocked, however. This is given to sysops
+to minimize annoyance from accidental "collateral damage"; remember that a
+sysop will be able to lift the block if they desire.
+
+The bot group now holds the "nominornewtalk" right. A user with this right
+will not trigger new message notifications when making minor edits to user
+talk pages. This is meant to minimize annoyance from maintenance bot
+processes.
+
+=== $wgUseWatchlistCache ===
+
+Watchlist caching has been removed. The feature was not maintained, and has
+been unnecessary since switching to the 'recentchanges' database table
+reduced server pressure for Wikipedia's watchlists.
+
+=== $wgBreakFrames ===
+
+MediaWiki in the past attempted to detect when it was embedded in a frameset
+and "break out" of it, assuming it to be hostile.
+
+This behavior is now disabled by default, but can be reenabled by setting
+$wgBreakFrames to true in LocalSettings.php.
+
+
+== New settings ==
+
+=== $wgVariantArticlePath ===
+
+For languages with script variant support (Chinese, Serbian, and others),
+it's possible to use alternate URL paths to select the variant for article
+display, setting $wgVariantArticlePath.
+
+Documentation for this setting would be useful.
+
+=== $wgMaxMsgCacheEntrySize ===
+
+The message cache can now skip items larger than a given size; this allows
+it to better handle the primary caching case when large CSS and JS blobs are
+present.
+
+=== $wgStyleVersion ===
+
+When making significant changes to skin stylesheets and JavaScript files,
+you can append a string to this variable to tweak the generated URLs,
+forcing newly rendered pages to bring in a fresh version despite server-
+or browser-side caching.
+
+Normally this will be set in the course of MediaWiki development, but
+if doing development on a custom skin you may wish to poke it as well.
+
+=== $wgRCShowChangedSize ===
+
+Special:Recentchanges and Special:Watchlist now show the number of bytes
+added or removed to an article to give an idea of the size of the edit.
+This information was previously available only in the IRC update feeds.
+
+To disable this site-wide, set $wgRCShowChangedSize to false.
+(Individual users can suppress the data in custom CSS.)
+
+Adjust $wgRCChangedSizeThreshold to trigger highlighting of particularly
+large changes.
+
+The formatting of the size figure can be adjusted through the
+[[MediaWiki:Rc-change-size]] message.
+
+=== $wgQueryCacheLimit ===
+
+The number of rows stored for "expensive" special pages in miser mode
+can now be adjusted up or down from the default 1000.
+
+=== $wgDisableQueryPageUpdate ===
+
+Individual "expensive" special pages can be skipped in processing by
+updateSpecialPages if added to this list.
+
+=== $wgSorbsUrl ===
+
+The base hostname for the DNS-based proxy blacklist can now be overridden
+when $wgEnableSorbs is set, to use a different blacklist instead of SORBS.
+The blacklist would need to respond the same was as SORBS; any positive
+response will be taken as a proxy.
+
+=== $wgAjaxWatch ===
+
+Experimental AJAX mode for the watch/unwatch tabs to execute inline.
+Does not include the UI messages describing how to reach the watchlist,
+so you may not want it on a general-audience site just yet.
+
+=== $wgParserTestFiles ===
+
+MediaWiki's parser test suite can now be expanded with additional test
+files. Custom extensions can add their test files to this array, and
+they will be run along with the main tests by maintenance/parserTests.php
+
+
+== Changes since 1.8 ==
+
+* (bug 8200) Make category lists sorted by name when using Postgres.
+* (bug 7841) Support 'IGNORE' inserts for Postgres, fixes watchlist
+ adding problem.
+* (bug 6835) Removing the includes/Parser.php::getTemplateArgs() function,
+ because it seems to be unused.
+* (bug 7139) Increasing the visual width of the edit summary field on larger
+ screen sizes, for the default monobook skin.
+* Fix PHP notice and estimates for dumpBackup.php and friends
+* Improved register_globals paranoia checks
+* (bug 7545) Fix PHP version check on install
+* Disable PHP exception backtrace printing unless $wgShowExceptionDetails
+ is set. Backtraces may contain sensitive information in function call
+ parameters.
+* (bug 6164) Avoid smashing Cite state if message transformation triggers
+ during bad image list check, by skipping message transformation.
+ This isn't a good permanent fix.
+* (bug 6918) Stopped borders and backgrounds from showing through floated
+ tables in Monobook
+* (bug 6868) Un-hardcode section edit link style
+* (bug 3205) Stop right floats from stacking horizontally in non-Monobook skins
+* Added global $wgStyleVersion to centralize bumping CSS and JS file versions
+ for cache-friendly style and script updating
+* (bug 7562) Fix non-ASCII namespaces on Windows/XAMPP servers
+* Friendlier check for PHP 5 in command-line scripts; it's common for parallel
+ PHP 4 and 5 installations to interfere on the command-line.
+* Fix regression in autoconfirm permission check
+* (bug 3015) Add CSS ids to subcategory and page sections on category pages
+* (bug 7587) Fix erroneous id for specialpage tab, enabling informative popup
+* (bug 7599) Fix thumbnail purging, PHP notices on HTCP image page purge
+* (bug 7581) Update language name for cbk-zam
+* (bug 7444) Update namespace translations for Telugu (te), kept old values as
+ alias for compatibility
+* (bug 4525) Move section links down visually to same level as headings
+ (editsection links are now inside the heading elements)
+* Workaround for http://bugs.php.net/bug.php?id=31892 , PATH_INFO and hence
+ URLs of the style /index.php/Main_Page were broken on some CGI installations.
+* (bug 7623) Validate custom HTML id's correctly in Monobook interface
+* (bug 2241) Fix collision of 'w' and 'd' accesskeys
+* (bug 5795) CSS class added to body based on page name for page-specific
+ styling
+* (bug 6276) Stopped search field from getting too large in Cologne Blue
+* (bug 7644) User creations that are aborted by hooks shouldn't be counted
+ against account creations per day limit
+* (bug 7636) Show Firefox 2 users correct accesskey prefix
+* (bug 6427) Block blocked IPs from using the mail password function
+ to allow blocking of flooders
+* Include common.css from classic-style skins in main HTML with the bump URL
+* (bug 7607) Add Karakalpak (kaa) to Names.php and stub message file for linktrail
+* (bug 7582) Add 'tog-nolangconversion' to MessagesEn.php.
+ This key is need for languages with variants (zh, sr, kk)
+* (bug 7606) MediaWiki messages for "rss" and "atom" missing
+* (bug 7609) Add some more '*-summary' messages to MessagesEn.php with empty
+ strings to allow better localisation via Special:Allmessages. Mark this new
+ messages as optional for localisation.
+* Fix user_newpass upgrade for prefixed tables (reported by Fyren)
+* (bug 7663) Include language variant switcher links on Nostalgia skin
+* (bug 6531) Fix PHP fatal error on installation page with bad username input.
+* (bug 6977) Remove 404 link for autogenerated database documentation.
+* (bug 7369) Allow "Show Changes" without requiring edit token.
+* (bug 7687) Fix movetalk box checks itself when confirming a delete and move.
+* (bug 7684) Obey watchcreated preference for Special:Upload watch checkbox
+* (bug 7686) Include id attribute on delete form confirmation button
+* Allow compound interwiki prefixes in $wgImportSources
+* (bug 7304) Added redirect table to store redirect targets.
+* Added querycachetwo table (similar to querycache but has two titles)
+* PageArchive can now return a Revision object for more convenient processing
+ of deleted revision data
+* Added 'UndeleteShowRevision' hook in Special:Undelete
+* Error message on attempt to view invalid or missing deleted revisions
+* Remove unsightly "_" from namespace in Special:Allpages, Special:Prefixindex
+* (bug 3224) Allow minor edits by bots to skip new message notification on
+ user talk pages. This can be disabled by adjusting the 'nominornewtalk'
+ permission. Patch by Werdna.
+* (bug 7741) MATH: fixed broken syntax of underbrace etc. Fixed arrays
+* Fix purging for updated SVG files
+* (bug 7745) Add id attribute to search button in Monobook
+* (bug 7749) MATH: added some more LaTeX symbols, e.g. parallel, diamond, ast, ...
+* (bug 7304) Added code in Article.php to keep redirect table up to date.
+* Made special page names case-insensitive and localisable. Care has been taken
+ to maintain backwards compatibility.
+* Used special page subpages in a few more places, instead of query parameters.
+* (bug 7758) Added wrapper span to "templates used" explanation to allow CSS
+ styling (class="mw-templatesUsedExplanation").
+* Added {{#special:}} parser function, to give the local default title for
+ special pages
+* (bug 7766) Remove redundant / from AJAX requests, can break some servers
+* Add tab links from extensions to classic-based skins (SkinTemplateTab hook)
+ Provides better cross-skin compatibility for extensions using the modern
+ skin hooks, such as Oversight
+* Moved variant language links on Cologne Blue and Nostalgia to before the
+ login/logout link
+* Fix for parser tests with MySQL 5 in strict mode
+* Added block option "enable autoblocks"
+* Amend Special:Ipblocklist to note when a block has autoblock DISABLED.
+* (bug 7780) Fix regression in editing redirects
+* Add whitespace above "templates included on this page" using CSS, not
+ hardcoded line break.
+* Remove entries from redirect table on article deletion
+* (bug 7788) Force section headers in new section links for users who have
+ 'prompt for blank edit summaries' on.
+* (bug 1133) Special:Emailuser: add an option to send yourself a copy of your mail.
+* (bug 461) Allow "Categories:" link at bottom of pages to be customized via
+ pagecategorieslink message.
+* Sort the list of skins in "My Preferences" -> Skins by alphabetical order.
+* (bug 7785) Postgres compatibility for timestamps in RC feeds
+* (bug 7550) Normalize user parameter normally on Special:Log
+* (bug 7294) Fix PATH search for diff3 on install
+* Various fixes related to the blocking change re: autoblocks. On inserting
+ an IP block, the ipb_enable_autoblock field is now automagically blanked,
+ because it doesn't make any sense for an IP. Additionally, IP blocks
+ without the ipb_enable_autoblock option no longer show up as "autoblock
+ disabled" on Special:Ipblocklist.
+* (bug 7774) MATH: aded more amstex functions
+* (bug 1182) MATH: fixed inconsistent rendering of upper case Greek letters in TeX
+* Fix regression in streaming page dump generation
+* (bug 7801) Add support for parser function hooks in parser tests
+* checkUsernames.php now uses wfDebugLog instead of hardcoded path to log
+* (bug 7810) Update talk namespaces for Occitan
+* Allow case-sensitive URLs to be used for uploading from URLs.
+* (bug 1109) Correct fix for compressed 304 responses when additional output
+ buffers have been installed within the compression handler
+* (bug 7819) Move automatic redirect edit summary after pre-save transform
+ to work properly with subst: fun
+* (bug 7826) Fix typos in two English messages.
+* (bug 5365) Stop users being prompted to enter an edit summary for null edits,
+ if they have selected that option in preferences.
+* (bug 5936) Show an 'm' to the left of the edit summary on diff pages for minor edits.
+* (bug 7820) Improve error reporting for uploads via URL.
+* (bug 5149) When autoblocks are enabled, retroactively apply an autoblock to the most
+ recently used IP of a user when they are blocked.
+* Add an index on (rc_user_text,rc_timestamp) on the recentchanges table. This will
+ make CheckUser.php and the new retroactive autoblock functionality faster.
+* Fix regression in Special:Undelete for revisions deleted under MediaWiki 1.4
+ with compression or legacy encoding
+* (bug 6737) Fixes for MySQL 5 schema in strict mode
+* Approximate height for client-side scaling fallback instead of passing -1
+ into the HTML output.
+* Make the DNSBL to check for proxy blocking configurable via $wgSorbsUrl
+* Add experimental recording/reporting mode to parser tests runner, to
+ compare changes against the previous run.
+ Additional tables 'testrun' and 'testitem' are in maintenance/testRunner.sql,
+ source this and pass --record option to parserTests.php
+* Make the set of default parser test input files extensible via
+ $wgParserTestFiles. This can now be appended to by extensions or local
+ configuration files so that extension or custom tests can be automatically
+ run along with the main batch.
+* Run PHP install version checks on update.php so command-line updaters see
+ new version requirements
+* Do a check for the PHP 5.0.x 64-bit bug, since this is much more disruptive
+ as of MW 1.8 than it used to be. Install or upgrade now aborts with a
+ warning and a request to upgrade.
+* (bug 6440) Updated indexes to improve backlinking queries (links, templates, images)
+* Switched 'anon-only' block mode to default for IP blocks
+* (bug 3687, 7892) Add distinct heading for media files in category display,
+ with count.
+* (bug 1578) Add different icons for external links to audio, video, or PDF in
+ Monobook.
+* Made autoblocks block account creation if the user block has that option enabled.
+* Add auto-summaries to blankings and large removals without summaries.
+* (bug 7811) Allow preview of edit summaries.
+* (bug 6839) Wikibits.js minor changes to make JS-lint happier.
+* (bug 7932) Make sure that edit toolbar clears floats so it appears correctly.
+* (bug 6873) When viewing old revisions, add link to diff to current version.
+* (bug 3315) Provide rollback link directly on history page.
+* Replace 'old-revision-navigation' message with 'revision-info' and
+ 'revision-nav' messages, wrapped in divs with appropriate id's.
+* (bug 4178) MediaWiki:Common.js will now be included for all users if
+ $wgUseSiteJs is enabled, in addition to (if applicable) MediaWiki:Monobook.js
+ and user JS subpages.
+* (bug 7918) "Templates used on this page" changes during preview to reflect
+ any added or removed templates, and works as expected for section edits.
+* (bug 7919) "Templates used on this page" is now shown for read-only pages.
+* (bug 7688) When viewing diff, section anchors in autosummary jump to section
+ on current page instead of loading the latest version.
+* (bug 7970) Use current connection explicitly on Database::getServerVersion
+* (bug 2001) Tables with class="sortable" can now be dynamically sorted via
+ JavaScript.
+* Added autosummary for new pages with 500 or less characters, and refactor
+ the autosummary code so it's all done in one function. doEdit is getting too
+ big!
+* (bug 7554) The correct MIME type for SVG images is now displayed on the
+ image page (image/svg+xml, not image/svg).
+* (bug 7883) Added autoblock whitelisting feature, using which specific ranges
+ can be protected from autoblocking. These ranges are specified, in list format,
+ in the autoblock_whitelist system message.
+* Added placeholders for text injection by hooks to EditPage.php
+* (bug 8009) Automatic edit summary for redirects is not filled for edits in existing pages
+* Installer support for experimental MySQL 4.1/5.0 binary-safe schema
+* Use INSERT IGNORE for db-based BagOStuff add/insert, for more memcache-like
+ behavior when keys already exist on add (instead of dying with an error...)
+* Add a hook 'UploadForm:initial' before the upload form is generated, and two
+ member variable for text injection into the form, which can be filled by the hooks.
+* (bug 6295) Add a "revision patching" functionality, where an edit can be undone
+ (with a functionality similar to diff rev1 rev2 | patch -R rev3 -o rev3).
+ This is triggered by including &undo=revid in an edit URL. A link to a URL
+ that will undo a given edit is shown on NEW revision headers on diff pages.
+ The link leads to a "Show Changes" page showing what will be done to undo the
+ edit.
+* Fix display of link in "already rolled back" message for image/category pages
+* (bug 6016) Left-aligned images should stack vertically, like right-aligned
+ images, not horizontally.
+* Patch from LeonWP: added UploadForm:BeforeProcessing hook in SpecialUpload.php
+* Add AuthPluginSetup hook to override $wgAuth after configuration
+* Fix regression in authentication hook auto-creation on login
+* (bug 8110) Allow spaces in ISBNs
+* (bug 8024) Introduce "send me copies of emails I send to others" preference
+* Added 'EditPage::attemptSave' hook before an article is saved.
+* (bug 8083) Applied patch for sk localisation
+* Add a backslash character to the edit token, to prevent edits via certain
+ broken proxies that mangle such characters in form submissions
+* (bug 7461) Allow overwriting pages using importTextFile.php
+* (bug 7946) importTextFile.php doesn't perform pre-save transform
+* (bug 8117) {{REVISIONTIMESTAMP}} showed weird default if $wgLocalTZoffset set;
+ now uses current time for previews and if timestamp can't be loaded from DB
+* {{REVISIONTIMESTAMP}} now uses site local timezone instead of user timezone
+ to ensure consistent behavior
+* {{REVISIONTIMESTAMP}} and friends should now work on non-MySQL backends
+* (bug 7671) Observe canonical media namespace prefix in Linker::formatComment
+* Added js variable wgCurRevisionId to the output
+* (bug 8141) Cleanup of Parser::doTableStuff, patch by AzaTht
+* (bug 8042) Make miser mode caching limits settable via $wgQueryCacheLimit
+ instead of hardcoding to 1000
+* Enable QueryPage classes to override list formatting
+* (bug 5485) Show number of intervening revisions in diff view
+* (bug 8100) Fix XHTML validity in Taiwanese localization
+* Added redirect to section feature. Use it wisely.
+* Added a configuration variable allowing the "break out of framesets" feature
+ to be switched on and off ($wgBreakFrames). Off by default.
+* Allow Xml::check() $attribs parameter to override 'value' attribute
+* DB schema change: added two columns (rc_old_len and rc_new_len) to the recentchanges table to store
+ the text lengths before and after the edit
+* (bug 1085) Made Special:Recentchanges show the character difference between the changed revisions
+* Removed a redundant <strong> tag from diff pages that was causing display issues for some users
+* (bug 8203) The keyboard shortcut for "log out" was removed, because users were pressing it
+ when they intended to press the shortcut for "preview".
+* (bug 8148) Handle non-removable output buffers gracefully when cleaning
+ buffers for HTTP 304 responses, StreamFile, and Special:Export.
+ Duplicated code merged into wfResetOutputBuffers() and wfClearOutputBuffers()
+* Special:AllPages : 'next page' link now point to the first title of the next
+ chunk instead of pointing to the last title of current chunk.
+* (bug 4673) Special:AllPages : add a 'previous' link (new message 'prevpage')
+* (bug 8121) wfRandom() was not between 0 and 1
+* Add static method Parser::createAssocArgs($args), so parser functions can
+ use the same code to parse arguments as the templates do.
+* Change behavior of logins using the temporary e-mailed password (as stored
+ in user_newpassword hash field). Instead of just logging in silently and
+ leaving the previous user_password field in place indefinitely, the user
+ is now prompted to set a new password.
+
+ The password-changing form is at Special:Resetpass; currently it's only
+ usable for changing from the temporary password during login, but it
+ could perhaps be generalized, replacing the subform in preferences.
+
+ Once the new password is set successfully, the temporary password is wiped
+ so it cannot be used to login a second time, and the login process
+ is completed.
+* Suppress 'mail new password' button on login form if $wgAuth forbids
+ changing user passwords; it wouldn't work very well...
+* Consolidate password length checks and $wgAuth manipulation into
+ User::setPassword() to avoid duplicate code in different places
+ that set passwords.
+* User::setPassword() now throws PasswordError exceptions if the password
+ is illegal or cannot be set via $wgAuth. These can be caught and a human-
+ readable error message displayed by UI code.
+* Added Title::isSubpage()
+* (bug 8241) Don't consider user pages of User:Foo.css to be CSS subpages
+* Set an explicit class on framed thumbnail inner divs and images, changed some
+ CSS to use these instead of using descendent selectors.
+* Accept null parameter to User::setPassword() as indicating the password
+ field should be cleared to an unusable state. Login will only be possible
+ after the password is reset, for instance by e-mail.
+* (bug 6394) Invalidate the password set for "by e-mail" account creations
+ to avoid accidental empty password creations.
+* Made the show change size function work on page moves, page creations, and
+ log entries. Also fixed it in the javascript recentchanges.
+* (bug 8239) correctly get 50 new contributions when clicking '(50 next)'
+* (bug 2259) Fix old regression where e-mail addresses were no longer
+ confirmed on login with mailed password.
+* Add a notification about the confirmation mail sent during account
+ creation, so people don't immediately go off to request a second one.
+* Add a warning on Special:Confirmemail if a code was already sent and has
+ not yet expired.
+* Add user_editcount field to provide data for heuristics on account use.
+ Incremented on edit, with lazy initialization from past revision data.
+ Can batch-initialize with maintenance/initEditCount.php (not yet friendly
+ to replication environments, this will do all accounts in one query).
+* Allow raw SQL subsections in Database::update() SET portion as well as
+ for WHERE portion. Handy for increments and such.
+* User::getOption now accept a default value to override default user values
+ this makes it consistent with WebRequest::get* methods. Corrected code in
+ various places accordingly.
+* (bug 8264) Fix JavaScript global vars for XHTML mode
+* Make $wgSiteNotice value wikitext again, for consistency with editable
+ MediaWiki:Sitenotice and MediaWiki:Anonnotice.
+* (bug 8044) When redirecting from the canonical name of the special page
+ to the localised one, parameters/subpages are omitted
+* (bug 8164) Special:Booksources should use GET for form submission
+* Rewrite Special:Booksources to clean up interface and remove redundant code
+* (bug 7925) Change Special:Allmessages message name filter javascript to be
+ a bit more responsive and easier on the CPU
+* (bug 4488) Support watching pages on deletion; introduces new user preference
+* Minor restructuring of Special:Preferences; "watch pages I edit" and "watch
+ pages I create" options now accessible under "Watchlist" options
+* (bug 8153) <nowiki> doesn't work in site notice
+* (bug 6690) wfMsgNoTrans() transforms messages
+* (bug 8274) Wrap edit tools in a <div> with a specified class
+* Detect PHP 5.0.x 64-bit bug and abort in WebStart.php; too many things break
+ mysteriously otherwise (detection code copied from install-utils.inc)
+* (bug 8295) Change handling of <center> tags in doBlockLevels() to match that
+ of <div>
+* (bug 8110) Make magic ISBN linking stricter: only match ten-digit sequences
+ (plus optional ISBN-13 prefix) with no immediately following alphanumeric
+ character, disallow multiple consecutive internal redirects
+* (bug 2785) Accept optional colon prefix in links when formatting comments
+* Don't show "you can view and copy the source of this page" message for
+ pages which don't exist
+* (bug 8310) Blank line added to top of 'post' when page is blank
+* (bug 8109) Template parameters ignored in "recentchangestext"
+* Gracefully skip redirect-to-fragment on WebKit versions less than 420;
+ it messes up on current versions of Safari but is ok in the latest
+ nightlies. Checking the version number will allow it to automatically
+ work when new releases of Safari appear.
+* Fix regression in thumb styles; size and padding didn't match with
+ new arrangement.
+* (bug 8333) Fix quick user data update on login password change on
+ replication database setups. User data is now pulled from master
+ instead of slave in User::loadFromDatabase, ensuring that it is
+ fresh and accurate when read and then saved back into cache.
+ This was breaking with the Special:Rename operation which
+ automatically logs the user in with the new password after changing
+ it; pulling from slave meant the record was often not the updated
+ one.
+* (bug 8335) Set image width to the first valid parameter found.
+* (bug 8350) Fix watchlist viewing bug when using Postgres.
+* (bug 6603) When warning about invalid file extensions, output the bit
+ of the extension we actually checked
+* (bug 7669) Drop defaults on BLOB/TEXT columns for better compatibility
+ with MySQL's strict mode, often enabled by the Windows installer.
+ The defaults are ignored anyway when strict mode is off...
+* (bug 7685) Use explicit values for ar_text and ar_flags when deleting,
+ for better compatibility with MySQL's strict mode
+* Update default interwiki values to reflect changed location of ursine:
+* (bug 5411) Remove autopatrol preference
+* Users who have the "autopatrol" permission will have their edits marked as
+ patrolled automatically
+* Users who do not have the "autopatrol" permission will no longer be able
+ to mark their own edits as patrolled
+* Introduce 'PingLimiter' hook; see docs/hooks.txt for more information
+* (bug 532) Tweaked alt text for some interface messages
+* (bug 8231) Gave useful alt text to the main <img> on image pages
+* (bug 371) Remove alt text for "Enlarge" icon on thumbnails
+* Initialize user_editcount to 0 instead of NULL for newly created accounts
+* (bug 3696) Strip LRM and RLM characters from titles to work around the
+ problem some people have where titles cut-and-pasted from lists include
+ the bidi override characters appended to the lists.
+ A more thorough blacklist for forbidden and translatable characters would
+ be wise, though, as might a cleaner method for the lists in the first place.
+* Fix regression in email password resets on read-restricted sites
+* Set tabindex on fields in deletion form so you don't have to tab through
+ the links in the sitenotice
+* (bug 8271) Show full time and date on viewer for individual deleted
+ revisions
+* (bug 8214) Output file size limit and actual file size in appropriate units
+ on Special:Upload
+* (bug 8016) Purge objectcache table during upgrade processes - use the --nopurge
+ option to prevent this when running maintenance/update.php
+* (bug 7612) Remove superfluous link to Special:Categories from result items
+ on Special:Mostcategories
+* {{PLURAL:}} now handles formatted numbers correctly
+* (bug 8331) Added the change size value to watchlists; therefore made
+ watchlists use RecentChange::newFromRow() instead of newFromCurRow()
+* (bug 8351) Fix undo for simple reverts
+* (bug 6856) User::clearNotification() does not respect read-only mode
+* (bug 6853) Use a checkbox on the installer form to indicate that a superuser
+ account should be used; this is clearer than the old check which relied on
+ the password never being an obscure value
+* Remove old unused watchlist cache, which was a leftover from the old schema
+ where watchlists were more expensive to generate
+* Minor cosmetic changes to Special:Userrights
+* Added wgCanonicalSpecialPageName to JavaScript variables
+* Fix image deleting when using Postgres.
+* Output both source and destination titles in maintenance/moveBatch.php
+* Added basic parser tests for language variants
+* Enable selflinks and categories to be written in some of the language variants
+* Prevent conversion of JavaScript code in language variants
+* Output software version number in maintenance/parserTests.php
+* (bug 7169) Use Ajax to watch/unwatch articles if enabled
+* Make variant table caching a little more robust, using main language code
+ in cache key. Probably this is still a bit wonky, though. Was breaking
+ parser tests when Chinese tables were getting loaded into Serbian code.
+* (bug 8380) Be nicer about blank lines in deleteBatch.php
+* (bug 8401) Fix regression in SORBS lookup for some DNS setups
+* Use raw file descriptor in posix_isatty() check to avoid warning on
+ Linux systems with at least some versions of PHP
+* (bug 5908) Allow overriding the default category sort key for all items on
+ a page using {{DEFAULTSORT}}
+* (bug 6449) Throw a more definitive error message when installation fails
+ due to an invalid database name
+* (bug 5827) Use full text for option link labels on Special:Watchlist
+* (bug 8018) Allow hiding minor edits from the watchlist
+* (bug 8427) MonoBook RTL IE 7.0 tweaks failed when sidebar's navigation
+ section is renamed; no longer relies on first section name
+* Stabilize client-side table sorting even if the underlying Javascript sort()
+ implementation is unstable
+* Add hook for extensions to add user information to the panel in preferences,
+ next to the user name and ID.
+* (bug 8392) Display protection status of transcluded pages in the edit page
+ template list. Patch by Fyren, with i18n naming tweak.
+* Fix for interwiki transclusion where target wiki uses query string for title
+* Resolve namespaces on interwiki Title objects using canonical namespace names
+ if possible (should not happen, though, outside interwiki transclusion... and
+ maybe not even then, but it does)
+* (bug 8447) Fix SQL typo breaking non-default $wgHitcounterUpdateFreq
+* Do not allow previews of deleted images to be cached
+* Add global variable $wgDefaultLanguageVariant used to set the default language
+ variant of a wiki to something different than the main language code
+* Add 'variant' option to parserTests - runs test with the given variant as
+ preferred, utilize it for more parser tests of language variants code
+* (bug 6503) Fix bug that stopped certain irrelevant links from being hidden
+ for printing
+* Avoid PHP warning in Creative Commons metadata when a creative commons
+ license is not actually set up
+* (bug 8463) Don't print external link icons for Monobook
+* (bug 8461) Support watching pages on move
+* (bug 8041) Work around bug with debug_backtrace when Zend Optimizer is
+ loaded by skipping the function. Use wfDebugBacktrace() wrapper function.
+* Reduce config file clutter by setting various script and upload paths
+ based on $IP or $wgScriptPath in Setup.php. They can still be explicitly
+ overridden in LocalSettings.php if desired...
+* Attempt to detect redirect loops for the canonical title redirect, and
+ give some hints to the poor confused administrator.
+* Introduce new flag 'R' - raw output for language variant escape tags
+* Advise users when updates for a query page have been disabled using
+ $wgDisableQueryPageUpdate
+* (bug 8413) Improve comments for $wgNamespaceRobotPolicies
+* (bug 8330) Show "bytes" suffix on recent changes diff counter
+ optionally... if set in rc-changes-size message (default empty for now)
+* (bug 8489) Support basic links in <gallery> caption attribute
+* (bug 8485) Correct Lingala number formatting
+* The MediaWiki namespace is no longer pre-filled with default messages on
+ install. All default messages will be removed from the MediaWiki namespace
+ on upgrade.
+* Recentchanges RSS/Atom feeds now use a separate message for the description
+ to avoid cluttering it with useless wiki formatting
+* (bug 8417) Handle EXIF unknown dates
+* (bug 8372) Return nothing on empty <math> tags.
+* New maintenance script to show the cached statistics : showStats.php.
+* Count deleted edits when regenerating total edits in maintenance/initStats.php
+* (bug 3706) Allow users to be exempted from IP blocks. The ipblock-exempt permission
+ key has been added to enable this behaviour, by default assigned to sysops.
+* (bug 7948) importDump.php now warn that Recentchanges need to be rebuild.
+* (bug 7667) allow XHTML namespaces customization
+* (bug 8531) Correct local name of Lingála (patch by Raymond)
+* Fix regression with default lock file and cache directories; threw visible
+ warning with open_basedir
== Languages updated ==
-* Albanian (sq)
-* Bashkir (ba)
-* Bavarian (bar) stub file
-* Belarusian (be)
-* Bishnupriya (bpy) stub file
-* Brazilian Portuguese (pt-br)
+* Basque (eu)
+* Bishnupriya Manipuri (bpy)
* Cantonese (zh-yue)
-* Catalan (ca)
-* Czech (cs)
-* Dutch (nl)
-* English (en)
* Finnish (fi)
-* French (fr)
-* Georgian (ka)
+* Frisian (fy)
* German (de)
* Hebrew (he)
-* Hungarian (hu)
* Indonesian (id)
+* Italian (it)
* Japanese (ja)
-* Korean (ko)
+* Kazakh (kk)
+* Kongo (kg)
* Latin (la)
-* Lojban (jbo)
-* Macedonian (mk)
-* Mazandarani (mzn)
+* Limburgish (li)
+* Lingala (ln)
+* Lithuanian (lt)
+* Maltese (mt)
+* Maori (mi)
+* Norwegian (no)
+* Occitan (oc)
+* Old Church Slavonic (cu)
* Polish (pl)
* Portuguese (pt)
-* Ripuarian (ksh)
-* Romani (rmy)
+* Ripurian (ksh)
* Russian (ru)
* Slovak (sk)
-* Spanish (es)
-* Tajic (tg)
-* Tatar (tt)
-* Telugu (te)
-* Uzbek (uz)
-* Yiddish (yi)
+* Swedish (sv)
+* Taiwanese/Holo: (bug 8217) changed language code to nan (from zh-min-nan)
+ due to http://www.sil.org/iso639-3/codes.asp?order=639_3&letter=n
+* Upper Sorbian (hsb)
+* Vietnamese (vi)
== Compatibility ==
-MediaWiki 1.8 requires PHP 5 (5.1 recommended). PHP 4 is no longer supported.
+MediaWiki 1.9 requires PHP 5 (5.1 recommended). PHP 4 is no longer supported.
PHP 5.0.x fails on 64-bit systems due to serious bugs with array processing:
http://bugs.php.net/bug.php?id=34879
@@ -429,7 +808,7 @@ cases, but this is not recommended on live sites. (This must be set for
MathML to display properly in Mozilla.)
-For notes on 1.5.x and older releases, see HISTORY.
+For notes on 1.8.x and older releases, see HISTORY.
=== Online documentation ===
@@ -446,11 +825,11 @@ License:
A MediaWiki-l mailing list has been set up distinct from the Wikipedia
wikitech-l list:
- http://mail.wikimedia.org/mailman/listinfo/mediawiki-l
+ http://lists.wikimedia.org/mailman/listinfo/mediawiki-l
A low-traffic announcements-only list is also available:
- http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce
+ http://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.
diff --git a/UPGRADE b/UPGRADE
index 9862dc80..40d5b202 100644
--- a/UPGRADE
+++ b/UPGRADE
@@ -1,18 +1,17 @@
This file provides an overview of the MediaWiki upgrade process. For help with
specific problems, check
-* the documentation at http://meta.wikimedia.org
* the documentation at http://www.mediawiki.org
* the mediawiki-l mailing list archive at
- http://mail.wikipedia.org/pipermail/mediawiki-l
+ http://lists.wikimedia.org/pipermail/mediawiki-l/
* the bug tracker at http://bugzilla.wikimedia.org
for information and workarounds to common issues.
== Overview ==
-Documentation on upgrading to 1.7 can also be found at
-http://www.mediawiki.org/wiki/Manual:Upgrading_to_1.7.
+Comprehensive documentation on upgrading to the latest version of the software
+is available at http://www.mediawiki.org/wiki/Manual:Upgrading_MediaWiki.
=== Consult the release notes ===
@@ -73,13 +72,30 @@ procedure, and especially after upgrading; check that page views and edits work
normally and that special pages continue to function, etc. and correct errors
and quirks which reveal themselves.
+== Upgrading from 1.8 wikis ==
+
+MediaWiki 1.9 and later no longer keep default localized message text
+in the database; 'MediaWiki:'-namespace pages that do not exist in the
+database are simply transparently filled-in on demand.
+
+The upgrade process will delete any 'MediaWiki:' pages which are left
+in the default state (last edited by 'MediaWiki default'). This may
+take a few moments, similar to the old initial setup.
+
+Note that the large number of deletions may cause older edits to expire
+from the list on Special:Recentchanges, although the deletions themselves
+will be hidden by default. (Click "show bot edits" to list them.)
+
+
+See RELEASE-NOTES for more details about new and changed options.
+
+
== Upgrading from 1.7 wikis ==
$wgDefaultUserOptions now contains all the defaults, not only overrides.
If you're setting this as a complete array(), you may need to change it
to set only specific items as recommended in DefaultSettings.php.
-
== Upgrading from 1.6 wikis ==
$wgLocalTZoffset was in hours, it is now using minutes.
@@ -110,7 +126,7 @@ but note that the old directory hashes will no longer be valid,
so you will also have to move them to new destinations.
Message changes:
-* A number of additional UI messages have been chagned from HTML to
+* A number of additional UI messages have been changed from HTML to
wikitext, and will need to be manually fixed if customized.
=== Configuration changes from 1.4.x: ===
@@ -189,8 +205,7 @@ http://dev.mysql.com/doc/mysql/en/mysqldump.html
WARNING: If using MySQL 4.1.x, mysqldump's charset conversion may in
some cases damage data in your wiki. If necessary, set the charset
-option to 'latin1' to avoid the conversion. Fore more info see:
-http://mail.wikipedia.org/pipermail/wikitech-l/2004-November/026359.html
+option to 'latin1' to avoid the conversion.
For general help on pg_dump:
http://www.postgresql.org/docs/current/static/app-pgdump.html
diff --git a/api.php b/api.php
index 63802c50..d3274dc4 100644
--- a/api.php
+++ b/api.php
@@ -25,70 +25,6 @@
// Initialise common code
require (dirname(__FILE__) . '/includes/WebStart.php');
-/**
- * When no format parameter is given, this format will be used
- */
-define('API_DEFAULT_FORMAT', 'xmlfm');
-
-/**
- * Location of all api-related files (must end with a slash '/')
- */
-define('API_DIR', 'includes/api/');
-
-/**
- * List of classes and containing files.
- */
-$wgApiAutoloadClasses = array (
-
- 'ApiMain' => API_DIR . 'ApiMain.php',
-
- // Utility classes
- 'ApiBase' => API_DIR . 'ApiBase.php',
- 'ApiQueryBase' => API_DIR . 'ApiQueryBase.php',
- 'ApiResult' => API_DIR . 'ApiResult.php',
- 'ApiPageSet' => API_DIR . 'ApiPageSet.php',
-
- // Formats
- 'ApiFormatBase' => API_DIR . 'ApiFormatBase.php',
- 'ApiFormatYaml' => API_DIR . 'ApiFormatYaml.php',
- 'ApiFormatXml' => API_DIR . 'ApiFormatXml.php',
- 'ApiFormatJson' => API_DIR . 'ApiFormatJson.php',
-
- // Modules (action=...) - should match the $apiModules list
- 'ApiHelp' => API_DIR . 'ApiHelp.php',
- 'ApiLogin' => API_DIR . 'ApiLogin.php',
- 'ApiQuery' => API_DIR . 'ApiQuery.php',
-
- // Query items (meta/prop/list=...)
- 'ApiQuerySiteinfo' => API_DIR . 'ApiQuerySiteinfo.php',
- 'ApiQueryInfo' => API_DIR . 'ApiQueryInfo.php',
- 'ApiQueryRevisions' => API_DIR . 'ApiQueryRevisions.php',
- 'ApiQueryAllpages' => API_DIR . 'ApiQueryAllpages.php'
-);
-
-/**
- * List of available modules: action name => module class
- * The class must also be listed in the $wgApiAutoloadClasses array.
- */
-$wgApiModules = array (
- 'help' => 'ApiHelp',
- 'login' => 'ApiLogin',
- 'query' => 'ApiQuery'
-);
-
-/**
- * List of available formats: format name => format class
- * The class must also be listed in the $wgApiAutoloadClasses array.
- */
-$wgApiFormats = array (
- 'json' => 'ApiFormatJson',
- 'jsonfm' => 'ApiFormatJson',
- 'xml' => 'ApiFormatXml',
- 'xmlfm' => 'ApiFormatXml',
- 'yaml' => 'ApiFormatYaml',
- 'yamlfm' => 'ApiFormatYaml'
-);
-
wfProfileIn('api.php');
// Verify that the API has not been disabled
@@ -98,9 +34,7 @@ if (!$wgEnableAPI) {
die(-1);
}
-$wgAutoloadClasses = array_merge($wgAutoloadClasses, $wgApiAutoloadClasses);
-
-$processor = new ApiMain($wgRequestTime, $wgApiModules, $wgApiFormats, $wgEnableWriteAPI);
+$processor = new ApiMain($wgRequest, $wgEnableWriteAPI);
$processor->execute();
wfProfileOut('api.php');
diff --git a/config/index.php b/config/index.php
index 5443614e..53e77d44 100644
--- a/config/index.php
+++ b/config/index.php
@@ -343,22 +343,11 @@ if( ini_get( "safe_mode" ) ) {
}
$sapi = php_sapi_name();
-$conf->prettyURLs = true;
print "<li>PHP server API is $sapi; ";
-switch( $sapi ) {
-case "apache":
-case "apache2handler":
+if( $wgUsePathInfo ) {
print "ok, using pretty URLs (<tt>index.php/Page_Title</tt>)";
- break;
-default:
- print "unknown; ";
-case "cgi":
-case "cgi-fcgi":
-case "apache2filter":
-case "isapi":
+} else {
print "using ugly URLs (<tt>index.php?title=Page_Title</tt>)";
- $conf->prettyURLs = false;
- break;
}
print "</li>\n";
@@ -431,7 +420,14 @@ if( !$conf->turck && !$conf->eaccel && !$conf->apc ) {
}
$conf->diff3 = false;
-$diff3locations = array( "/usr/bin", "/usr/local/bin", "/opt/csw/bin", "/usr/gnu/bin", "/usr/sfw/bin" ) + explode( $sep, getenv( "PATH" ) );
+$diff3locations = array_merge(
+ array(
+ "/usr/bin",
+ "/usr/local/bin",
+ "/opt/csw/bin",
+ "/usr/gnu/bin",
+ "/usr/sfw/bin" ),
+ explode( $sep, getenv( "PATH" ) ) );
$diff3names = array( "gdiff3", "diff3", "diff3.exe" );
$diff3versioninfo = array( '$1 --version 2>&1', 'diff3 (GNU diffutils)' );
@@ -477,7 +473,14 @@ $conf->UseImageResize = $conf->HaveGD || $conf->ImageMagick;
$conf->IP = dirname( dirname( __FILE__ ) );
print "<li>Installation directory: <tt>" . htmlspecialchars( $conf->IP ) . "</tt></li>\n";
-$conf->ScriptPath = preg_replace( '{^(.*)/config.*$}', '$1', $_SERVER["PHP_SELF"] ); # was SCRIPT_NAME
+
+// PHP_SELF isn't available sometimes, such as when PHP is CGI but
+// cgi.fix_pathinfo is disabled. In that case, fall back to SCRIPT_NAME
+// to get the path to the current script... hopefully it's reliable. SIGH
+$path = ($_SERVER["PHP_SELF"] === '')
+ ? $_SERVER["SCRIPT_NAME"]
+ : $_SERVER["PHP_SELF"];
+$conf->ScriptPath = preg_replace( '{^(.*)/config.*$}', '$1', $path );
print "<li>Script URI path: <tt>" . htmlspecialchars( $conf->ScriptPath ) . "</tt></li>\n";
print "<li style='font-weight:bold;color:green;font-size:110%'>Environment checked. You can install MediaWiki.</li>\n";
@@ -501,12 +504,16 @@ print "<li style='font-weight:bold;color:green;font-size:110%'>Environment check
$conf->SysopPass = importPost( "SysopPass" );
$conf->SysopPass2 = importPost( "SysopPass2" );
$conf->RootUser = importPost( "RootUser", "root" );
- $conf->RootPW = importPost( "RootPW", "-" );
+ $conf->RootPW = importPost( "RootPW", "" );
+ $useRoot = importCheck( 'useroot', false );
## MySQL specific:
- $conf->DBprefix = importPost( "DBprefix" );
- $conf->DBmysql5 = (importPost( "DBmysql5" ) == "true") ? "true" : "false";
- $conf->LanguageCode = importPost( "LanguageCode", "en" );
+ $conf->DBprefix = importPost( "DBprefix" );
+ $conf->DBschema = importPost( "DBschema", "mysql4" );
+ $conf->DBmysql5 = ($conf->DBschema == "mysql5" ||
+ $conf->DBschema == "mysql5-binary")
+ ? "true" : "false";
+ $conf->LanguageCode = importPost( "LanguageCode", "en" );
## Postgres specific:
$conf->DBport = importPost( "DBport", "5432" );
@@ -584,12 +591,22 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
/* Load up the settings and get installin' */
$local = writeLocalSettings( $conf );
+ echo "<li style=\"list-style: none\">\n";
echo "<p><b>Generating configuration file...</b></p>\n";
- // for debugging: // echo "<pre>" . htmlspecialchars( $local ) . "</pre>\n";
-
+ echo "</li>\n";
+
$wgCommandLineMode = false;
chdir( ".." );
- eval($local);
+ $ok = eval( $local );
+ if( $ok === false ) {
+ dieout( "Errors in generated configuration; " .
+ "most likely due to a bug in the installer... " .
+ "Config file was: " .
+ "<pre>" .
+ htmlspecialchars( $local ) .
+ "</pre>" .
+ "</ul>" );
+ }
$conf->DBtypename = '';
foreach (array_keys($ourdb) as $db) {
if ($conf->DBtype === $db)
@@ -623,8 +640,6 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
require_once( "includes/Setup.php" );
chdir( "config" );
- require_once( "maintenance/InitialiseMessages.inc" );
-
$wgTitle = Title::newFromText( "Installation script" );
error_reporting( E_ALL );
print "<li>Loading class: $dbclass";
@@ -641,16 +656,13 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
$ok = true; # Let's be optimistic
# Decide if we're going to use the superuser or the regular database user
- if( $conf->RootPW == '-' ) {
- # Regular user
- $conf->Root = false;
- $db_user = $wgDBuser;
- $db_pass = $wgDBpassword;
- } else {
- # Superuser
- $conf->Root = true;
+ $conf->Root = $useRoot;
+ if( $conf->Root ) {
$db_user = $conf->RootUser;
$db_pass = $conf->RootPW;
+ } else {
+ $db_user = $wgDBuser;
+ $db_pass = $wgDBpassword;
}
# Attempt to connect
@@ -701,7 +713,7 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
error_reporting( E_ALL );
$wgSuperUser = '';
## Possible connect as a superuser
- if( $conf->RootPW != '-' and strlen($conf->RootPW)) {
+ if( $conf->Root ) {
$wgDBsuperuser = $conf->RootUser;
echo( "<li>Attempting to connect to database \"postgres\" as superuser \"$wgDBsuperuser\"..." );
$wgDatabase = $dbc->newFromParams($wgDBserver, $wgDBsuperuser, $conf->RootPW, "postgres", 1);
@@ -754,11 +766,16 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
print "<li>Database <tt>" . htmlspecialchars( $wgDBname ) . "</tt> exists</li>\n";
} else {
$err = mysql_errno();
- if ( $err != 1049 ) {
- print "<ul><li>Error selecting database $wgDBname: $err " .
- htmlspecialchars( mysql_error() ) . "</li></ul>";
+ $databaseSafe = htmlspecialchars( $wgDBname );
+ if( $err == 1102 /* Invalid database name */ ) {
+ print "<ul><li><strong>{$databaseSafe}</strong> is not a valid database name.</li></ul>";
+ continue;
+ } elseif( $err != 1049 /* Database doesn't exist */ ) {
+ print "<ul><li>Error selecting database <strong>{$databaseSafe}</strong>: {$err} ";
+ print htmlspecialchars( mysql_error() ) . "</li></ul>";
continue;
}
+ print "<li>Attempting to create database...</li>";
$res = $wgDatabase->query( "CREATE DATABASE `$wgDBname`" );
if( !$res ) {
print "<li>Couldn't create database <tt>" .
@@ -806,12 +823,21 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
# FIXME: Check for errors
print "<li>Creating tables...";
if ($conf->DBtype == 'mysql') {
- if( $wgDBmysql5 ) {
- print " using MySQL 5 table defs...";
- dbsource( "../maintenance/mysql5/tables.sql", $wgDatabase );
- } else {
+ switch( $conf->DBschema ) {
+ case "mysql4":
print " using MySQL 4 table defs...";
dbsource( "../maintenance/tables.sql", $wgDatabase );
+ break;
+ case "mysql5":
+ print " using MySQL 5 UTF-8 table defs...";
+ dbsource( "../maintenance/mysql5/tables.sql", $wgDatabase );
+ break;
+ case "mysql5-binary":
+ print " using MySQL 5 binary table defs...";
+ dbsource( "../maintenance/mysql5/tables-binary.sql", $wgDatabase );
+ break;
+ default:
+ dieout( " <b>invalid schema selection!</b></li>" );
}
dbsource( "../maintenance/interwiki.sql", $wgDatabase );
} else if ($conf->DBtype == 'postgres') {
@@ -824,7 +850,7 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
print " done.</li>\n";
- print "<li>Initializing data...";
+ print "<li>Initializing data...</li>\n";
$wgDatabase->insert( 'site_stats',
array ( 'ss_row_id' => 1,
'ss_total_views' => 0,
@@ -838,18 +864,21 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
if( $wgDatabase2->isOpen() ) {
# Nope, just close the test connection and continue
$wgDatabase2->close();
- echo( "<li>User $wgDBuser exists. Skipping grants.</li>" );
+ echo( "<li>User $wgDBuser exists. Skipping grants.</li>\n" );
} else {
# Yes, so run the grants
echo( "<li>Granting user permissions to $wgDBuser on $wgDBname..." );
dbsource( "../maintenance/users.sql", $wgDatabase );
- echo( "success.</li>" );
+ echo( "success.</li>\n" );
}
}
if( $conf->SysopName ) {
$u = User::newFromName( $conf->getSysopName() );
- if ( 0 == $u->idForName() ) {
+ if ( !$u ) {
+ print "<li><strong class=\"error\">Warning:</strong> Skipped sysop account creation - invalid username!</li>\n";
+ }
+ else if ( 0 == $u->idForName() ) {
$u->addToDatabase();
$u->setPassword( $conf->getSysopPass() );
$u->saveSettings();
@@ -878,11 +907,10 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
) );
$revid = $revision->insertOn( $wgDatabase );
$article->updateRevisionOn( $wgDatabase, $revision );
-
- initialiseMessages( false, false, 'printListItem' );
}
/* Write out the config file now that all is well */
+ print "<li style=\"list-style: none\">\n";
print "<p>Creating LocalSettings.php...</p>\n\n";
$localSettings = "<" . "?php$endl$local$endl?" . ">\r\n";
// Fix up a common line-ending problem (due to CVS on Windows)
@@ -902,6 +930,7 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
die("<p class='error'>An error occured while writing the config/LocalSettings.php file. Check user rights and disk space then try again.</p>\n");
}
+ print "</li>\n";
} while( false );
}
@@ -958,7 +987,7 @@ if( count( $errs ) ) {
</select>
</div>
<p class="config-desc">
- Select the language for your wiki's interface. Some localizations aren't fully complete. Unicode (UTF-8) used for all localizations.
+ Select the language for your wiki's interface. Some localizations aren't fully complete. Unicode (UTF-8) is used for all localizations.
</p>
<div class="config-input">
@@ -977,7 +1006,7 @@ if( count( $errs ) ) {
?>
<?php if( $conf->License == "cc" ) { ?>
<ul>
- <li><?php aField( $conf, "RightsIcon", "<img src=\"" . htmlspecialchars( $conf->RightsIcon ) . "\" alt='icon' />", "hidden" ); ?></li>
+ <li><?php aField( $conf, "RightsIcon", "<img src=\"" . htmlspecialchars( $conf->RightsIcon ) . "\" alt='(Creative Commons icon)' />", "hidden" ); ?></li>
<li><?php aField( $conf, "RightsText", htmlspecialchars( $conf->RightsText ), "hidden" ); ?></li>
<li><?php aField( $conf, "RightsCode", "code: " . htmlspecialchars( $conf->RightsCode ), "hidden" ); ?></li>
<li><?php aField( $conf, "RightsUrl", "<a href=\"" . htmlspecialchars( $conf->RightsUrl ) . "\">" . htmlspecialchars( $conf->RightsUrl ) . "</a>", "hidden" ); ?></li>
@@ -1132,8 +1161,13 @@ if( count( $errs ) ) {
</p>
<div class="config-input">
+ <label class="column">Superuser account:</label>
+ <input type="checkbox" name="useroot" id="useroot" <?php if( $useRoot ) { ?>checked="checked" <?php } ?>/>
+ &nbsp;<label for="useroot">Use superuser account</label>
+ </div>
+ <div class="config-input">
<?php
- aField( $conf, "RootUser", "Superuser account:", "superuser" );
+ aField( $conf, "RootUser", "Superuser name:", "superuser" );
?>
</div>
<div class="config-input">
@@ -1144,8 +1178,8 @@ if( count( $errs ) ) {
<p class="config-desc">
If the database user specified above does not exist, or does not have access to create
- the database (if needed) or tables within it, please provide details of a superuser account,
- such as <strong>root</strong>, which does. Leave the password set to <strong>-</strong> if this is not needed.
+ the database (if needed) or tables within it, please check the box and provide details
+ of a superuser account, such as <strong>root</strong>, which does.
</p>
<?php database_switcher('mysql'); ?>
@@ -1163,8 +1197,9 @@ if( count( $errs ) ) {
<div class="config-input"><label class="column">Database charset</label>
<div>Select one:</div>
<ul class="plain">
- <li><?php aField( $conf, "DBmysql5", "Backwards-compatible UTF-8", "radio", "false" ); ?></li>
- <li><?php aField( $conf, "DBmysql5", "Experimental MySQL 4.1/5.0 UTF-8", "radio", "true" ); ?></li>
+ <li><?php aField( $conf, "DBschema", "Backwards-compatible UTF-8", "radio", "mysql4" ); ?></li>
+ <li><?php aField( $conf, "DBschema", "Experimental MySQL 4.1/5.0 UTF-8", "radio", "mysql5" ); ?></li>
+ <li><?php aField( $conf, "DBschema", "Experimental MySQL 4.1/5.0 binary", "radio", "mysql5-binary" ); ?></li>
</ul>
</div>
<p class="config-desc">
@@ -1253,8 +1288,6 @@ function writeLocalSettings( $conf ) {
$zlib = ($conf->zlib ? "" : "# ");
$magic = ($conf->ImageMagick ? "" : "# ");
$convert = ($conf->ImageMagick ? $conf->ImageMagick : "/usr/bin/convert" );
- $pretty = ($conf->prettyURLs ? "" : "# ");
- $ugly = ($conf->prettyURLs ? "# " : "");
$rights = ($conf->RightsUrl) ? "" : "# ";
$hashedUploads = $conf->safeMode ? '' : '# ';
@@ -1354,22 +1387,12 @@ if ( \$wgCommandLineMode ) {
\$wgSitename = \"{$slconf['Sitename']}\";
+## The URL base path to the directory containing the wiki;
+## defaults for all runtime URL paths are based off of this.
\$wgScriptPath = \"{$slconf['ScriptPath']}\";
-\$wgScript = \"\$wgScriptPath/index.php\";
-\$wgRedirectScript = \"\$wgScriptPath/redirect.php\";
## For more information on customizing the URLs please see:
-## http://meta.wikimedia.org/wiki/Eliminating_index.php_from_the_url
-## If using PHP as a CGI module, the ?title= style usually must be used.
-{$pretty}\$wgArticlePath = \"\$wgScript/\$1\";
-{$ugly}\$wgArticlePath = \"\$wgScript?title=\$1\";
-
-\$wgStylePath = \"\$wgScriptPath/skins\";
-\$wgStyleDirectory = \"\$IP/skins\";
-\$wgLogo = \"\$wgStylePath/common/images/wiki.png\";
-
-\$wgUploadPath = \"\$wgScriptPath/images\";
-\$wgUploadDirectory = \"\$IP/images\";
+## http://www.mediawiki.org/wiki/Manual:Short_URL
\$wgEnableEmail = $enableemail;
\$wgEnableUserEmail = $enableuseremail;
@@ -1421,9 +1444,6 @@ if ( \$wgCommandLineMode ) {
## If you have the appropriate support software installed
## you can enable inline LaTeX equations:
\$wgUseTeX = false;
-\$wgMathPath = \"{\$wgUploadPath}/math\";
-\$wgMathDirectory = \"{\$wgUploadDirectory}/math\";
-\$wgTmpDirectory = \"{\$wgUploadDirectory}/tmp\";
\$wgLocalInterwiki = \$wgSitename;
@@ -1478,6 +1498,10 @@ function importPost( $name, $default = "" ) {
return importVar( $_POST, $name, $default );
}
+function importCheck( $name ) {
+ return isset( $_POST[$name] );
+}
+
function importRequest( $name, $default = "" ) {
return importVar( $_REQUEST, $name, $default );
}
@@ -1690,7 +1714,7 @@ function printListItem( $item ) {
<li><a href="http://meta.wikipedia.org/wiki/MediaWiki_User's_Guide">User's Guide</a></li>
<li><a href="http://meta.wikimedia.org/wiki/MediaWiki_FAQ">FAQ</a></li>
</ul>
- <p style="font-size:90%;margin-top:1em">MediaWiki is Copyright &copy; 2001-2006 by Magnus Manske, Brion Vibber, Lee Daniel Crocker, Tim Starling, Erik M&ouml;ller, Gabriel Wicke and others.</p>
+ <p style="font-size:90%;margin-top:1em">MediaWiki is Copyright &copy; 2001-2007 by Magnus Manske, Brion Vibber, Lee Daniel Crocker, Tim Starling, Erik M&ouml;ller, Gabriel Wicke and others.</p>
</div></div>
</div>
diff --git a/docs/database.txt b/docs/database.txt
index 679492a1..25dce8b7 100644
--- a/docs/database.txt
+++ b/docs/database.txt
@@ -2,13 +2,18 @@ Some information about database access in MediaWiki.
By Tim Starling, January 2006.
------------------------------------------------------------------------
- API
+ Database layout
------------------------------------------------------------------------
-For a database API reference, please see the auto-generated
-documentation:
+For information about the MediaWiki database layout, such as a
+description of the tables and their contents, please see:
+ http://meta.wikimedia.org/wiki/Help:Database_layout
+ http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/maintenance/tables.sql?view=markup
+
-http://wikipedia.sourceforge.net/doc/MediaWiki/Database.html
+------------------------------------------------------------------------
+ API
+------------------------------------------------------------------------
To make a read query, something like this usually suffices:
diff --git a/docs/hooks.txt b/docs/hooks.txt
index 4dd68f5f..d5a17660 100644
--- a/docs/hooks.txt
+++ b/docs/hooks.txt
@@ -286,6 +286,10 @@ $isminor: minor flag
$iswatch: watch flag
$section: section #
+'AuthPluginSetup': update or replace authentication plugin object ($wgAuth)
+Gives a chance for an extension to set it programattically to a variable class.
+&$auth: the $wgAuth object, probably a stub
+
'AutoAuthenticate': called to authenticate users on external/environmental means
$user: writes user object to this parameter
@@ -309,6 +313,10 @@ $diff: DifferenceEngine object that's calling
$oldRev: Revision object of the "old" revision (may be null/invalid)
$newRev: Revision object of the "new" revision
+'EditPage::attemptSave': called before an article is
+saved, that is before insertNewArticle() is called
+&$editpage_Obj: the current EditPage object
+
'EditFormPreloadText': Allows population of the edit form when creating new pages
&$text: Text to preload with
&$title: Title object representing the page being created
@@ -408,6 +416,17 @@ my talk page, my contributions" etc).
&$personal_urls: Array of link specifiers (see SkinTemplate.php)
&$title: Title object representing the current page
+'PingLimiter': Allows extensions to override the results of User::pingLimiter()
+&$user : User performing the action
+$action : Action being performed
+&$result : Whether or not the action should be prevented
+Change $result and return false to give a definitive answer, otherwise
+the built-in rate limiting checks are used, if enabled.
+
+'PreferencesUserInformationPanel': Add HTML bits to user information list in preferences form
+$form : PreferencesForm object
+&$html : HTML to append to
+
'SiteNoticeBefore': Before the sitenotice/anonnotice is composed
&$siteNotice: HTML returned as the sitenotice
Return true to allow the normal method of notice selection/rendering to work,
@@ -437,6 +456,17 @@ $article: article object to be removed
$user: user that was watching
$article: article object removed
+'UploadForm:initial': before the upload form is generated
+$form: UploadForm object
+You might set the member-variables $uploadFormTextTop and
+$uploadFormTextAfterSummary to inject text (HTML) either before
+or after the editform.
+
+'UploadForm:BeforeProcessing': at the beginning of processUpload()
+$form: UploadForm object
+Lets you poke at member variables like $mUploadDescription before the
+file is saved.
+
'UploadVerification': additional chances to reject an uploaded file
string $saveName: destination file name
string $tempName: filesystem path to the temporary file for checks
@@ -488,9 +518,10 @@ $article: article object that was watched
$catpage: CategoryPage instance
'SkinTemplateContentActions': after building the $content_action array right
- before returning it, see content_action.php in
- the extension module for a demonstration of how
- to use this hook.
+ before returning it, see Content_action.php in
+ the extensions/examples/ directory
+ ( http://svn.wikimedia.org/viewvc/mediawiki/trunk/extensions/examples/ )
+ for a demonstration of how to use this hook.
$content_actions: The array of content actions
'BeforePageDisplay': Called just before outputting a page (all kinds of,
diff --git a/img_auth.php b/img_auth.php
index cfe005e9..8794bc78 100644
--- a/img_auth.php
+++ b/img_auth.php
@@ -12,31 +12,38 @@ wfProfileIn( 'img_auth.php' );
require_once( './includes/StreamFile.php' );
if( !isset( $_SERVER['PATH_INFO'] ) ) {
+ wfDebugLog( 'img_auth', "missing PATH_INFO" );
wfForbidden();
}
# Get filenames/directories
+wfDebugLog( 'img_auth', "PATH_INFO is: " . $_SERVER['PATH_INFO'] );
$filename = realpath( $wgUploadDirectory . $_SERVER['PATH_INFO'] );
$realUploadDirectory = realpath( $wgUploadDirectory );
$imageName = $wgContLang->getNsText( NS_IMAGE ) . ":" . wfBaseName( $_SERVER['PATH_INFO'] );
# Check if the filename is in the correct directory
if ( substr( $filename, 0, strlen( $realUploadDirectory ) ) != $realUploadDirectory ) {
+ wfDebugLog( 'img_auth', "requested path not in upload dir: $filename" );
wfForbidden();
}
if ( is_array( $wgWhitelistRead ) && !in_array( $imageName, $wgWhitelistRead ) && !$wgUser->getID() ) {
+ wfDebugLog( 'img_auth', "not logged in and requested file not in whitelist: $imageName" );
wfForbidden();
}
if( !file_exists( $filename ) ) {
+ wfDebugLog( 'img_auth', "requested file does not exist: $filename" );
wfForbidden();
}
if( is_dir( $filename ) ) {
+ wfDebugLog( 'img_auth', "requested file is a directory: $filename" );
wfForbidden();
}
# Write file
+wfDebugLog( 'img_auth', "streaming file: $filename" );
wfStreamFile( $filename );
wfLogProfilingData();
diff --git a/includes/AjaxDispatcher.php b/includes/AjaxDispatcher.php
index c2744980..89062f87 100644
--- a/includes/AjaxDispatcher.php
+++ b/includes/AjaxDispatcher.php
@@ -15,7 +15,7 @@ class AjaxDispatcher {
var $args;
function AjaxDispatcher() {
- wfProfileIn( 'AjaxDispatcher::AjaxDispatcher' );
+ wfProfileIn( __METHOD__ );
$this->mode = "";
@@ -42,7 +42,7 @@ class AjaxDispatcher {
$this->args = array();
}
}
- wfProfileOut( 'AjaxDispatcher::AjaxDispatcher' );
+ wfProfileOut( __METHOD__ );
}
function performAction() {
@@ -51,7 +51,7 @@ class AjaxDispatcher {
if ( empty( $this->mode ) ) {
return;
}
- wfProfileIn( 'AjaxDispatcher::performAction' );
+ wfProfileIn( __METHOD__ );
if (! in_array( $this->func_name, $wgAjaxExportList ) ) {
header( 'Status: 400 Bad Request', true, 400 );
@@ -72,7 +72,7 @@ class AjaxDispatcher {
$result->sendHeaders();
$result->printText();
}
-
+
} catch (Exception $e) {
if (!headers_sent()) {
header( 'Status: 500 Internal Error', true, 500 );
@@ -83,7 +83,7 @@ class AjaxDispatcher {
}
}
- wfProfileOut( 'AjaxDispatcher::performAction' );
+ wfProfileOut( __METHOD__ );
$wgOut = null;
}
}
diff --git a/includes/AjaxFunctions.php b/includes/AjaxFunctions.php
index 9f7a332f..eee2a1a4 100644
--- a/includes/AjaxFunctions.php
+++ b/includes/AjaxFunctions.php
@@ -129,4 +129,43 @@ function wfSajaxSearch( $term ) {
return $response;
}
+/**
+ * Called for AJAX watch/unwatch requests.
+ * @param $pageID Integer ID of the page to be watched/unwatched
+ * @param $watch String 'w' to watch, 'u' to unwatch
+ * @return String '<w#>' or '<u#>' on successful watch or unwatch, respectively, or '<err#>' on error (invalid XML in case we want to add HTML sometime)
+ */
+function wfAjaxWatch($pageID = "", $watch = "") {
+ if(wfReadOnly())
+ return '<err#>'; // redirect to action=(un)watch, which will display the database lock message
+
+ if(('w' !== $watch && 'u' !== $watch) || !is_numeric($pageID))
+ return '<err#>';
+ $watch = 'w' === $watch;
+ $pageID = intval($pageID);
+
+ $title = Title::newFromID($pageID);
+ if(!$title)
+ return '<err#>';
+ $article = new Article($title);
+ $watching = $title->userIsWatching();
+
+ if($watch) {
+ if(!$watching) {
+ $dbw =& wfGetDB(DB_MASTER);
+ $dbw->begin();
+ $article->doWatch();
+ $dbw->commit();
+ }
+ } else {
+ if($watching) {
+ $dbw =& wfGetDB(DB_MASTER);
+ $dbw->begin();
+ $article->doUnwatch();
+ $dbw->commit();
+ }
+ }
+
+ return $watch ? '<w#>' : '<u#>';
+}
?>
diff --git a/includes/AjaxResponse.php b/includes/AjaxResponse.php
index 40f50876..a59c73bb 100644
--- a/includes/AjaxResponse.php
+++ b/includes/AjaxResponse.php
@@ -61,7 +61,7 @@ class AjaxResponse {
}
function sendHeaders() {
- global $wgUseSquid, $wgUseESI, $wgSquidMaxage;
+ global $wgUseSquid, $wgUseESI;
if ( $this->mResponseCode ) {
$n = preg_replace( '/^ *(\d+)/', '\1', $this->mResponseCode );
@@ -122,7 +122,7 @@ class AjaxResponse {
* returns true iff the response code was set to 304 Not Modified.
*/
function checkLastModified ( $timestamp ) {
- global $wgCachePages, $wgCacheEpoch, $wgUser, $wgRequest;
+ global $wgCachePages, $wgCacheEpoch, $wgUser;
$fname = 'AjaxResponse::checkLastModified';
if ( !$timestamp || $timestamp == '19700101000000' ) {
diff --git a/includes/Article.php b/includes/Article.php
index 8c07b06c..6b4f5270 100644
--- a/includes/Article.php
+++ b/includes/Article.php
@@ -9,7 +9,7 @@
*
* See design.txt for an overview.
* Note: edit user interface and cache support functions have been
- * moved to separate EditPage and CacheManager classes.
+ * moved to separate EditPage and HTMLFileCache classes.
*
* @package MediaWiki
*/
@@ -48,7 +48,7 @@ class Article {
$this->mOldId = $oldId;
$this->clear();
}
-
+
/**
* Tell the page view functions that this view was redirected
* from another page on the wiki.
@@ -79,13 +79,13 @@ class Article {
}
} else {
if( $rt->getNamespace() == NS_SPECIAL ) {
- // Gotta hand redirects to special pages differently:
+ // Gotta handle redirects to special pages differently:
// Fill the HTTP response "Location" header and ignore
// the rest of the page we're on.
//
// This can be hard to reverse, so they may be disabled.
- if( $rt->getNamespace() == NS_SPECIAL && $rt->getText() == 'Userlogout' ) {
+ if( $rt->isSpecial( 'Userlogout' ) ) {
// rolleyes
} else {
return $rt->getFullURL();
@@ -139,7 +139,7 @@ class Article {
* @return Return the text of this revision
*/
function getContent() {
- global $wgRequest, $wgUser, $wgOut;
+ global $wgUser, $wgOut;
wfProfileIn( __METHOD__ );
@@ -236,9 +236,6 @@ class Article {
# Pre-fill content with error message so that if something
# fails we'll have something telling us what we intended.
-
- $t = $this->mTitle->getPrefixedText();
-
$this->mOldId = $oldid;
$this->fetchContent( $oldid );
}
@@ -575,13 +572,10 @@ class Article {
function getContributors($limit = 0, $offset = 0) {
# XXX: this is expensive; cache this info somewhere.
- $title = $this->mTitle;
$contribs = array();
$dbr =& wfGetDB( DB_SLAVE );
$revTable = $dbr->tableName( 'revision' );
$userTable = $dbr->tableName( 'user' );
- $encDBkey = $dbr->addQuotes( $title->getDBkey() );
- $ns = $title->getNamespace();
$user = $this->getUser();
$pageId = $this->getId();
@@ -638,6 +632,8 @@ class Article {
if ( isset( $wgNamespaceRobotPolicies[$ns] ) ) {
$policy = $wgNamespaceRobotPolicies[$ns];
} else {
+ # The default policy. Dev note: make sure you change the documentation
+ # in DefaultSettings.php before changing it.
$policy = 'index,follow';
}
$wgOut->setRobotpolicy( $policy );
@@ -697,6 +693,12 @@ class Article {
$redir = $sk->makeKnownLinkObj( $this->mRedirectedFrom, '', 'redirect=no' );
$s = wfMsg( 'redirectedfrom', $redir );
$wgOut->setSubtitle( $s );
+
+ // Set the fragment if one was specified in the redirect
+ if ( strval( $this->mTitle->getFragment() ) != '' ) {
+ $fragment = Xml::escapeJsString( $this->mTitle->getFragmentForURL() );
+ $wgOut->addInlineScript( "redirectToFragment(\"$fragment\");" );
+ }
$wasRedirected = true;
}
} elseif ( !empty( $rdfrom ) ) {
@@ -784,12 +786,9 @@ class Article {
if( !$wasRedirected && $this->isCurrent() ) {
$wgOut->setSubtitle( wfMsgHtml( 'redirectpagesub' ) );
}
- $targetUrl = $rt->escapeLocalURL();
- # fixme unused $titleText :
- $titleText = htmlspecialchars( $rt->getPrefixedText() );
- $link = $sk->makeLinkObj( $rt );
+ $link = $sk->makeLinkObj( $rt, $rt->getFullText() );
- $wgOut->addHTML( '<img src="'.$imageUrl.'" alt="#REDIRECT" />' .
+ $wgOut->addHTML( '<img src="'.$imageUrl.'" alt="#REDIRECT " />' .
'<span class="redirectText">'.$link.'</span>' );
$parseout = $wgParser->parse($text, $this->mTitle, ParserOptions::newFromUser($wgUser));
@@ -997,32 +996,87 @@ class Article {
* when different from the currently set value.
* Giving 0 indicates the new page flag should
* be set on.
+ * @param bool $lastRevIsRedirect If given, will optimize adding and
+ * removing rows in redirect table.
* @return bool true on success, false on failure
* @private
*/
- function updateRevisionOn( &$dbw, $revision, $lastRevision = null ) {
+ function updateRevisionOn( &$dbw, $revision, $lastRevision = null, $lastRevIsRedirect = null ) {
wfProfileIn( __METHOD__ );
+ $text = $revision->getText();
+ $rt = Title::newFromRedirect( $text );
+
$conditions = array( 'page_id' => $this->getId() );
if( !is_null( $lastRevision ) ) {
# An extra check against threads stepping on each other
$conditions['page_latest'] = $lastRevision;
}
- $text = $revision->getText();
$dbw->update( 'page',
array( /* SET */
'page_latest' => $revision->getId(),
'page_touched' => $dbw->timestamp(),
'page_is_new' => ($lastRevision === 0) ? 1 : 0,
- 'page_is_redirect' => Article::isRedirect( $text ) ? 1 : 0,
+ 'page_is_redirect' => $rt !== NULL ? 1 : 0,
'page_len' => strlen( $text ),
),
$conditions,
__METHOD__ );
+ $result = $dbw->affectedRows() != 0;
+
+ if ($result) {
+ // FIXME: Should the result from updateRedirectOn() be returned instead?
+ $this->updateRedirectOn( $dbw, $rt, $lastRevIsRedirect );
+ }
+
wfProfileOut( __METHOD__ );
- return ( $dbw->affectedRows() != 0 );
+ return $result;
+ }
+
+ /**
+ * Add row to the redirect table if this is a redirect, remove otherwise.
+ *
+ * @param Database $dbw
+ * @param $redirectTitle a title object pointing to the redirect target,
+ * or NULL if this is not a redirect
+ * @param bool $lastRevIsRedirect If given, will optimize adding and
+ * removing rows in redirect table.
+ * @return bool true on success, false on failure
+ * @private
+ */
+ function updateRedirectOn( &$dbw, $redirectTitle, $lastRevIsRedirect = null ) {
+
+ // Always update redirects (target link might have changed)
+ // Update/Insert if we don't know if the last revision was a redirect or not
+ // Delete if changing from redirect to non-redirect
+ $isRedirect = !is_null($redirectTitle);
+ if ($isRedirect || is_null($lastRevIsRedirect) || $lastRevIsRedirect !== $isRedirect) {
+
+ wfProfileIn( __METHOD__ );
+
+ if ($isRedirect) {
+
+ // This title is a redirect, Add/Update row in the redirect table
+ $set = array( /* SET */
+ 'rd_namespace' => $redirectTitle->getNamespace(),
+ 'rd_title' => $redirectTitle->getDBkey(),
+ 'rd_from' => $this->getId(),
+ );
+
+ $dbw->replace( 'redirect', array( 'rd_from' ), $set, __METHOD__ );
+ } else {
+ // This is not a redirect, remove row from redirect table
+ $where = array( 'rd_from' => $this->getId() );
+ $dbw->delete( 'redirect', $where, __METHOD__);
+ }
+
+ wfProfileOut( __METHOD__ );
+ return ( $dbw->affectedRows() != 0 );
+ }
+
+ return true;
}
/**
@@ -1037,7 +1091,7 @@ class Article {
$row = $dbw->selectRow(
array( 'revision', 'page' ),
- array( 'rev_id', 'rev_timestamp' ),
+ array( 'rev_id', 'rev_timestamp', 'page_is_redirect' ),
array(
'page_id' => $this->getId(),
'page_latest=rev_id' ),
@@ -1048,12 +1102,14 @@ class Article {
return false;
}
$prev = $row->rev_id;
+ $lastRevIsRedirect = (bool)$row->page_is_redirect;
} else {
# No or missing previous revision; mark the page as new
$prev = 0;
+ $lastRevIsRedirect = null;
}
- $ret = $this->updateRevisionOn( $dbw, $revision, $prev );
+ $ret = $this->updateRevisionOn( $dbw, $revision, $prev, $lastRevIsRedirect );
wfProfileOut( __METHOD__ );
return $ret;
}
@@ -1080,13 +1136,18 @@ class Article {
}
$oldtext = $rev->getText();
- if($section=='new') {
- if($summary) $subject="== {$summary} ==\n\n";
- $text=$oldtext."\n\n".$subject.$text;
+ if( $section == 'new' ) {
+ # Inserting a new section
+ $subject = $summary ? "== {$summary} ==\n\n" : '';
+ $text = strlen( trim( $oldtext ) ) > 0
+ ? "{$oldtext}\n\n{$subject}{$text}"
+ : "{$subject}{$text}";
} else {
+ # Replacing an existing section; roll out the big guns
global $wgParser;
$text = $wgParser->replaceSection( $oldtext, $section, $text );
}
+
}
wfProfileOut( __METHOD__ );
@@ -1097,7 +1158,7 @@ class Article {
* @deprecated use Article::doEdit()
*/
function insertNewArticle( $text, $summary, $isminor, $watchthis, $suppressRC=false, $comment=false ) {
- $flags = EDIT_NEW | EDIT_DEFER_UPDATES |
+ $flags = EDIT_NEW | EDIT_DEFER_UPDATES | EDIT_AUTOSUMMARY |
( $isminor ? EDIT_MINOR : 0 ) |
( $suppressRC ? EDIT_SUPPRESS_RC : 0 );
@@ -1129,7 +1190,7 @@ class Article {
* @deprecated use Article::doEdit()
*/
function updateArticle( $text, $summary, $minor, $watchthis, $forceBot = false, $sectionanchor = '' ) {
- $flags = EDIT_UPDATE | EDIT_DEFER_UPDATES |
+ $flags = EDIT_UPDATE | EDIT_DEFER_UPDATES | EDIT_AUTOSUMMARY |
( $minor ? EDIT_MINOR : 0 ) |
( $forceBot ? EDIT_FORCE_BOT : 0 );
@@ -1178,6 +1239,8 @@ class Article {
* Mark the edit a "bot" edit regardless of user rights
* EDIT_DEFER_UPDATES
* Defer some of the updates until the end of index.php
+ * EDIT_AUTOSUMMARY
+ * Fill in blank summaries with generated text where possible
*
* If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the article will be detected.
* If EDIT_UPDATE is specified and the article doesn't exist, the function will return false. If
@@ -1215,7 +1278,15 @@ class Article {
$isminor = ( $flags & EDIT_MINOR ) && $wgUser->isAllowed('minoredit');
$bot = $wgUser->isAllowed( 'bot' ) || ( $flags & EDIT_FORCE_BOT );
+ $oldtext = $this->getContent();
+ $oldsize = strlen( $oldtext );
+
+ # Provide autosummaries if one is not provided.
+ if ($flags & EDIT_AUTOSUMMARY && $summary == '')
+ $summary = $this->getAutosummary( $oldtext, $text, $flags );
+
$text = $this->preSaveTransform( $text );
+ $newsize = strlen( $text );
$dbw =& wfGetDB( DB_MASTER );
$now = wfTimestampNow();
@@ -1228,9 +1299,6 @@ class Article {
$userAbort = ignore_user_abort( true );
}
- $oldtext = $this->getContent();
- $oldsize = strlen( $oldtext );
- $newsize = strlen( $text );
$lastRevision = 0;
$revisionId = 0;
@@ -1273,11 +1341,12 @@ class Article {
$lastRevision, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
$revisionId );
- # Mark as patrolled if the user can do so and has it set in their options
- if( $wgUser->isAllowed( 'patrol' ) && $wgUser->getOption( 'autopatrol' ) ) {
+ # Mark as patrolled if the user can do so
+ if( $wgUser->isAllowed( 'autopatrol' ) ) {
RecentChange::markPatrolled( $rcid );
}
}
+ $wgUser->incEditCount();
$dbw->commit();
}
} else {
@@ -1333,11 +1402,12 @@ class Article {
if( !( $flags & EDIT_SUPPRESS_RC ) ) {
$rcid = RecentChange::notifyNew( $now, $this->mTitle, $isminor, $wgUser, $summary, $bot,
'', strlen( $text ), $revisionId );
- # Mark as patrolled if the user can and has the option set
- if( $wgUser->isAllowed( 'patrol' ) && $wgUser->getOption( 'autopatrol' ) ) {
+ # Mark as patrolled if the user can
+ if( $wgUser->isAllowed( 'autopatrol' ) ) {
RecentChange::markPatrolled( $rcid );
}
}
+ $wgUser->incEditCount();
$dbw->commit();
# Update links, etc.
@@ -1393,7 +1463,7 @@ class Article {
*/
function markpatrolled() {
global $wgOut, $wgRequest, $wgUseRCPatrol, $wgUser;
- $wgOut->setRobotpolicy( 'noindex,nofollow' );
+ $wgOut->setRobotPolicy( 'noindex,nofollow' );
# Check RC patrol config. option
if( !$wgUseRCPatrol ) {
@@ -1407,20 +1477,45 @@ class Article {
return;
}
+ # If we haven't been given an rc_id value, we can't do anything
$rcid = $wgRequest->getVal( 'rcid' );
- if ( !is_null ( $rcid ) ) {
- if( wfRunHooks( 'MarkPatrolled', array( &$rcid, &$wgUser, false ) ) ) {
- RecentChange::markPatrolled( $rcid );
- wfRunHooks( 'MarkPatrolledComplete', array( &$rcid, &$wgUser, false ) );
- $wgOut->setPagetitle( wfMsg( 'markedaspatrolled' ) );
- $wgOut->addWikiText( wfMsg( 'markedaspatrolledtext' ) );
- }
- $rcTitle = Title::makeTitle( NS_SPECIAL, 'Recentchanges' );
- $wgOut->returnToMain( false, $rcTitle->getPrefixedText() );
+ if( !$rcid ) {
+ $wgOut->errorPage( 'markedaspatrollederror', 'markedaspatrollederrortext' );
+ return;
}
- else {
- $wgOut->showErrorPage( 'markedaspatrollederror', 'markedaspatrollederrortext' );
+
+ # Handle the 'MarkPatrolled' hook
+ if( !wfRunHooks( 'MarkPatrolled', array( $rcid, &$wgUser, false ) ) ) {
+ return;
+ }
+
+ $return = SpecialPage::getTitleFor( 'Recentchanges' );
+ # If it's left up to us, check that the user is allowed to patrol this edit
+ # If the user has the "autopatrol" right, then we'll assume there are no
+ # other conditions stopping them doing so
+ if( !$wgUser->isAllowed( 'autopatrol' ) ) {
+ $rc = RecentChange::newFromId( $rcid );
+ # Graceful error handling, as we've done before here...
+ # (If the recent change doesn't exist, then it doesn't matter whether
+ # the user is allowed to patrol it or not; nothing is going to happen
+ if( is_object( $rc ) && $wgUser->getName() == $rc->getAttribute( 'rc_user_text' ) ) {
+ # The user made this edit, and can't patrol it
+ # Tell them so, and then back off
+ $wgOut->setPageTitle( wfMsg( 'markedaspatrollederror' ) );
+ $wgOut->addWikiText( wfMsgNoTrans( 'markedaspatrollederror-noautopatrol' ) );
+ $wgOut->returnToMain( false, $return );
+ return;
+ }
}
+
+ # Mark the edit as patrolled
+ RecentChange::markPatrolled( $rcid );
+ wfRunHooks( 'MarkPatrolledComplete', array( &$rcid, &$wgUser, false ) );
+
+ # Inform the user
+ $wgOut->setPageTitle( wfMsg( 'markedaspatrolled' ) );
+ $wgOut->addWikiText( wfMsgNoTrans( 'markedaspatrolledtext' ) );
+ $wgOut->returnToMain( false, $return );
}
/**
@@ -1662,6 +1757,11 @@ class Article {
if( $confirm ) {
$this->doDelete( $reason );
+ if( $wgRequest->getCheck( 'wpWatch' ) ) {
+ $this->doWatch();
+ } elseif( $this->mTitle->userIsWatching() ) {
+ $this->doUnwatch();
+ }
return;
}
@@ -1801,6 +1901,7 @@ class Article {
$confirm = htmlspecialchars( wfMsg( 'deletepage' ) );
$delcom = htmlspecialchars( wfMsg( 'deletecomment' ) );
$token = htmlspecialchars( $wgUser->editToken() );
+ $watch = Xml::checkLabel( wfMsg( 'watchthis' ), 'wpWatch', 'wpWatch', $wgUser->getBoolOption( 'watchdeletion' ) || $this->mTitle->userIsWatching(), array( 'tabindex' => '2' ) );
$wgOut->addHTML( "
<form id='deleteconfirm' method='post' action=\"{$formaction}\">
@@ -1810,13 +1911,17 @@ class Article {
<label for='wpReason'>{$delcom}:</label>
</td>
<td align='left'>
- <input type='text' size='60' name='wpReason' id='wpReason' value=\"" . htmlspecialchars( $reason ) . "\" />
+ <input type='text' size='60' name='wpReason' id='wpReason' value=\"" . htmlspecialchars( $reason ) . "\" tabindex=\"1\" />
</td>
</tr>
<tr>
<td>&nbsp;</td>
+ <td>$watch</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
<td>
- <input type='submit' name='wpConfirmB' value=\"{$confirm}\" />
+ <input type='submit' name='wpConfirmB' id='wpConfirmB' value=\"{$confirm}\" tabindex=\"3\" />
</td>
</tr>
</table>
@@ -1860,7 +1965,7 @@ class Article {
*/
function doDeleteArticle( $reason ) {
global $wgUseSquid, $wgDeferredUpdateList;
- global $wgPostCommitUpdateList, $wgUseTrackbacks;
+ global $wgUseTrackbacks;
wfDebug( __METHOD__."\n" );
@@ -1897,6 +2002,8 @@ class Article {
'ar_minor_edit' => 'rev_minor_edit',
'ar_rev_id' => 'rev_id',
'ar_text_id' => 'rev_text_id',
+ 'ar_text' => '\'\'', // Be explicit to appease
+ 'ar_flags' => '\'\'', // MySQL's "strict mode"...
), array(
'page_id' => $id,
'page_id = rev_page'
@@ -1921,6 +2028,7 @@ class Article {
$dbw->delete( 'templatelinks', array( 'tl_from' => $id ) );
$dbw->delete( 'externallinks', array( 'el_from' => $id ) );
$dbw->delete( 'langlinks', array( 'll_from' => $id ) );
+ $dbw->delete( 'redirect', array( 'rd_from' => $id ) );
}
# If using cleanup triggers, we can skip some manual deletes
@@ -1976,8 +2084,6 @@ class Article {
$bot = $wgRequest->getBool( 'bot' );
# Replace all this user's current edits with the next one down
- $tt = $this->mTitle->getDBKey();
- $n = $this->mTitle->getNamespace();
# Get the last editor
$current = Revision::newFromTitle( $this->mTitle );
@@ -2140,8 +2246,10 @@ class Article {
# If this is another user's talk page, update newtalk
# Don't do this if $changed = false otherwise some idiot can null-edit a
- # load of user talk pages and piss people off
- if( $this->mTitle->getNamespace() == NS_USER_TALK && $shortTitle != $wgUser->getTitleKey() && $changed ) {
+ # load of user talk pages and piss people off, nor if it's a minor edit
+ # by a properly-flagged bot.
+ if( $this->mTitle->getNamespace() == NS_USER_TALK && $shortTitle != $wgUser->getTitleKey() && $changed
+ && !($minoredit && $wgUser->isAllowed('nominornewtalk') ) ) {
if (wfRunHooks('ArticleEditUpdateNewTalk', array(&$this)) ) {
$other = User::newFromName( $shortTitle );
if( is_null( $other ) && User::isIP( $shortTitle ) ) {
@@ -2202,6 +2310,9 @@ class Article {
$lnk = $current
? wfMsg( 'currentrevisionlink' )
: $lnk = $sk->makeKnownLinkObj( $this->mTitle, wfMsg( 'currentrevisionlink' ) );
+ $curdiff = $current
+ ? wfMsg( 'diff' )
+ : $sk->makeKnownLinkObj( $this->mTitle, wfMsg( 'diff' ), 'diff=cur&oldid='.$oldid );
$prev = $this->mTitle->getPreviousRevisionID( $oldid ) ;
$prevlink = $prev
? $sk->makeKnownLinkObj( $this->mTitle, wfMsg( 'previousrevision' ), 'direction=prev&oldid='.$oldid )
@@ -2219,7 +2330,8 @@ class Article {
$userlinks = $sk->userLink( $revision->getUser(), $revision->getUserText() )
. $sk->userToolLinks( $revision->getUser(), $revision->getUserText() );
- $r = wfMsg( 'old-revision-navigation', $td, $lnk, $prevlink, $nextlink, $userlinks, $prevdiff, $nextdiff );
+ $r = "\n\t\t\t\t<div id=\"mw-revision-info\">" . wfMsg( 'revision-info', $td, $userlinks ) . "</div>\n" .
+ "\n\t\t\t\t<div id=\"mw-revision-nav\">" . wfMsg( 'revision-nav', $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff ) . "</div>\n\t\t\t";
$wgOut->setSubtitle( $r );
}
@@ -2250,7 +2362,7 @@ class Article {
$called = true;
if($this->isFileCacheable()) {
$touched = $this->mTouched;
- $cache = new CacheManager( $this->mTitle );
+ $cache = new HTMLFileCache( $this->mTitle );
if($cache->isFileCacheGood( $touched )) {
wfDebug( "Article::tryFileCache(): about to load file\n" );
$cache->loadFromFileCache();
@@ -2270,7 +2382,11 @@ class Article {
*/
function isFileCacheable() {
global $wgUser, $wgUseFileCache, $wgShowIPinHeader, $wgRequest;
- extract( $wgRequest->getValues( 'action', 'oldid', 'diff', 'redirect', 'printable' ) );
+ $action = $wgRequest->getVal( 'action' );
+ $oldid = $wgRequest->getVal( 'oldid' );
+ $diff = $wgRequest->getVal( 'diff' );
+ $redirect = $wgRequest->getVal( 'redirect' );
+ $printable = $wgRequest->getVal( 'printable' );
return $wgUseFileCache
and (!$wgShowIPinHeader)
@@ -2338,8 +2454,7 @@ class Article {
'comment' => $comment,
'minor_edit' => $minor ? 1 : 0,
) );
- # fixme : $revisionId never used
- $revisionId = $revision->insertOn( $dbw );
+ $revision->insertOn( $dbw );
$this->updateRevisionOn( $dbw, $revision );
$dbw->commit();
@@ -2361,7 +2476,7 @@ class Article {
$hitcounterTable = $dbw->tableName( 'hitcounter' );
$acchitsTable = $dbw->tableName( 'acchits' );
- if( $wgHitcounterUpdateFreq <= 1 ){ //
+ if( $wgHitcounterUpdateFreq <= 1 ) {
$dbw->query( "UPDATE $pageTable SET page_counter = page_counter + 1 WHERE page_id = $id" );
return;
}
@@ -2388,14 +2503,19 @@ class Article {
if ($wgDBtype == 'mysql')
$dbw->query("LOCK TABLES $hitcounterTable WRITE");
$tabletype = $wgDBtype == 'mysql' ? "ENGINE=HEAP " : '';
- $dbw->query("CREATE TEMPORARY TABLE $acchitsTable $tabletype".
+ $dbw->query("CREATE TEMPORARY TABLE $acchitsTable $tabletype AS ".
"SELECT hc_id,COUNT(*) AS hc_n FROM $hitcounterTable ".
'GROUP BY hc_id');
$dbw->query("DELETE FROM $hitcounterTable");
- if ($wgDBtype == 'mysql')
+ if ($wgDBtype == 'mysql') {
$dbw->query('UNLOCK TABLES');
- $dbw->query("UPDATE $pageTable,$acchitsTable SET page_counter=page_counter + hc_n ".
- 'WHERE page_id = hc_id');
+ $dbw->query("UPDATE $pageTable,$acchitsTable SET page_counter=page_counter + hc_n ".
+ 'WHERE page_id = hc_id');
+ }
+ else {
+ $dbw->query("UPDATE $pageTable SET page_counter=page_counter + hc_n ".
+ "FROM $acchitsTable WHERE page_id = hc_id");
+ }
$dbw->query("DROP TABLE $acchitsTable");
ignore_user_abort( $old_user_abort );
@@ -2438,7 +2558,7 @@ class Article {
# File cache
if ( $wgUseFileCache ) {
- $cm = new CacheManager( $title );
+ $cm = new HTMLFileCache( $title );
@unlink( $cm->fileCacheName() );
}
@@ -2453,8 +2573,6 @@ class Article {
static function onArticleEdit( $title ) {
global $wgDeferredUpdateList, $wgUseFileCache;
- $urls = array();
-
// Invalidate caches of articles which include this page
$update = new HTMLCacheUpdate( $title, 'templatelinks' );
$wgDeferredUpdateList[] = $update;
@@ -2464,7 +2582,7 @@ class Article {
# Clear file cache
if ( $wgUseFileCache ) {
- $cm = new CacheManager( $title );
+ $cm = new HTMLFileCache( $title );
@unlink( $cm->fileCacheName() );
}
}
@@ -2590,6 +2708,83 @@ class Article {
$dbr->freeResult( $res );
return $result;
}
+
+ /**
+ * Return an auto-generated summary if the text provided is a redirect.
+ *
+ * @param string $text The wikitext to check
+ * @return string '' or an appropriate summary
+ */
+ public static function getRedirectAutosummary( $text ) {
+ $rt = Title::newFromRedirect( $text );
+ if( is_object( $rt ) )
+ return wfMsgForContent( 'autoredircomment', $rt->getFullText() );
+ else
+ return '';
+ }
+
+ /**
+ * Return an auto-generated summary if the new text is much shorter than
+ * the old text.
+ *
+ * @param string $oldtext The previous text of the page
+ * @param string $text The submitted text of the page
+ * @return string An appropriate autosummary, or an empty string.
+ */
+ public static function getBlankingAutosummary( $oldtext, $text ) {
+ if ($oldtext!='' && $text=='') {
+ return wfMsgForContent('autosumm-blank');
+ } elseif (strlen($oldtext) > 10 * strlen($text) && strlen($text) < 500) {
+ #Removing more than 90% of the article
+ global $wgContLang;
+ $truncatedtext = $wgContLang->truncate($text, max(0, 200 - strlen(wfMsgForContent('autosumm-replace'))), '...');
+ return wfMsgForContent('autosumm-replace', $truncatedtext);
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Return an applicable autosummary if one exists for the given edit.
+ * @param string $oldtext The previous text of the page.
+ * @param string $newtext The submitted text of the page.
+ * @param bitmask $flags A bitmask of flags submitted for the edit.
+ * @return string An appropriate autosummary, or an empty string.
+ */
+ public static function getAutosummary( $oldtext, $newtext, $flags ) {
+
+ # This code is UGLY UGLY UGLY.
+ # Somebody PLEASE come up with a more elegant way to do it.
+
+ #Redirect autosummaries
+ $summary = self::getRedirectAutosummary( $newtext );
+
+ if ($summary)
+ return $summary;
+
+ #Blanking autosummaries
+ if (!($flags & EDIT_NEW))
+ $summary = self::getBlankingAutosummary( $oldtext, $newtext );
+
+ if ($summary)
+ return $summary;
+
+ #New page autosummaries
+ if ($flags & EDIT_NEW && strlen($newtext)) {
+ #If they're making a new article, give its text, truncated, in the summary.
+ global $wgContLang;
+ $truncatedtext = $wgContLang->truncate(
+ str_replace("\n", ' ', $newtext),
+ max( 0, 200 - strlen( wfMsgForContent( 'autosumm-new') ) ),
+ '...' );
+ $summary = wfMsgForContent( 'autosumm-new', $truncatedtext );
+ }
+
+ if ($summary)
+ return $summary;
+
+ return $summary;
+ }
}
?>
diff --git a/includes/AuthPlugin.php b/includes/AuthPlugin.php
index 1d955418..e33ef1bf 100644
--- a/includes/AuthPlugin.php
+++ b/includes/AuthPlugin.php
@@ -146,13 +146,18 @@ class AuthPlugin {
/**
* Set the given password in the authentication database.
+ * As a special case, the password may be set to null to request
+ * locking the password to an unusable value, with the expectation
+ * that it will be set later through a mail reset or other method.
+ *
* Return true if successful.
*
+ * @param $user User object.
* @param $password String: password.
* @return bool
* @public
*/
- function setPassword( $password ) {
+ function setPassword( $user, $password ) {
return true;
}
diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php
index 810a448e..8de5608f 100644
--- a/includes/AutoLoader.php
+++ b/includes/AutoLoader.php
@@ -22,7 +22,11 @@ function __autoload($className) {
'eAccelBagOStuff' => 'includes/BagOStuff.php',
'DBABagOStuff' => 'includes/BagOStuff.php',
'Block' => 'includes/Block.php',
- 'CacheManager' => 'includes/CacheManager.php',
+ 'HTMLFileCache' => 'includes/HTMLFileCache.php',
+ 'DependencyWrapper' => 'includes/CacheDependency.php',
+ 'FileDependency' => 'includes/CacheDependency.php',
+ 'TitleDependency' => 'includes/CacheDependency.php',
+ 'TitleListDependency' => 'includes/CacheDependency.php',
'CategoryPage' => 'includes/CategoryPage.php',
'CategoryViewer' => 'includes/CategoryPage.php',
'Categoryfinder' => 'includes/Categoryfinder.php',
@@ -82,7 +86,6 @@ function __autoload($className) {
'FileStore' => 'includes/FileStore.php',
'FSException' => 'includes/FileStore.php',
'FSTransaction' => 'includes/FileStore.php',
- 'ReplacerCallback' => 'includes/GlobalFunctions.php',
'HTMLForm' => 'includes/HTMLForm.php',
'HistoryBlob' => 'includes/HistoryBlob.php',
'ConcatenatedGzipHistoryBlob' => 'includes/HistoryBlob.php',
@@ -146,7 +149,8 @@ function __autoload($className) {
'SearchUpdate' => 'includes/SearchUpdate.php',
'SearchUpdateMyISAM' => 'includes/SearchUpdate.php',
'SiteConfiguration' => 'includes/SiteConfiguration.php',
- 'SiteStatsUpdate' => 'includes/SiteStatsUpdate.php',
+ 'SiteStats' => 'includes/SiteStats.php',
+ 'SiteStatsUpdate' => 'includes/SiteStats.php',
'Skin' => 'includes/Skin.php',
'MediaWiki_I18N' => 'includes/SkinTemplate.php',
'SkinTemplate' => 'includes/SkinTemplate.php',
@@ -154,11 +158,11 @@ function __autoload($className) {
'SpecialAllpages' => 'includes/SpecialAllpages.php',
'AncientPagesPage' => 'includes/SpecialAncientpages.php',
'IPBlockForm' => 'includes/SpecialBlockip.php',
- 'BookSourceList' => 'includes/SpecialBooksources.php',
+ 'SpecialBookSources' => 'includes/SpecialBooksources.php',
'BrokenRedirectsPage' => 'includes/SpecialBrokenRedirects.php',
'CategoriesPage' => 'includes/SpecialCategories.php',
'EmailConfirmation' => 'includes/SpecialConfirmemail.php',
- 'ContribsFinder' => 'includes/SpecialContributions.php',
+ 'ContributionsPage' => 'includes/SpecialContributions.php',
'DeadendPagesPage' => 'includes/SpecialDeadendpages.php',
'DisambiguationsPage' => 'includes/SpecialDisambiguations.php',
'DoubleRedirectsPage' => 'includes/SpecialDoubleRedirects.php',
@@ -182,6 +186,7 @@ function __autoload($className) {
'MostlinkedCategoriesPage' => 'includes/SpecialMostlinkedcategories.php',
'MostrevisionsPage' => 'includes/SpecialMostrevisions.php',
'MovePageForm' => 'includes/SpecialMovepage.php',
+ 'NewbieContributionsPage' => 'includes/SpecialNewbieContributions.php',
'NewPagesPage' => 'includes/SpecialNewpages.php',
'SpecialPage' => 'includes/SpecialPage.php',
'UnlistedSpecialPage' => 'includes/SpecialPage.php',
@@ -211,6 +216,12 @@ function __autoload($className) {
'WantedPagesPage' => 'includes/SpecialWantedpages.php',
'WhatLinksHerePage' => 'includes/SpecialWhatlinkshere.php',
'SquidUpdate' => 'includes/SquidUpdate.php',
+ 'ReplacementArray' => 'includes/StringUtils.php',
+ 'Replacer' => 'includes/StringUtils.php',
+ 'RegexlikeReplacer' => 'includes/StringUtils.php',
+ 'DoubleReplacer' => 'includes/StringUtils.php',
+ 'HashtableReplacer' => 'includes/StringUtils.php',
+ 'StringUtils' => 'includes/StringUtils.php',
'Title' => 'includes/Title.php',
'User' => 'includes/User.php',
'MailAddress' => 'includes/UserMailer.php',
@@ -230,7 +241,39 @@ function __autoload($className) {
'UsercreateTemplate' => 'includes/templates/Userlogin.php',
'UserloginTemplate' => 'includes/templates/Userlogin.php',
'Language' => 'languages/Language.php',
+ 'PasswordResetForm' => 'includes/SpecialResetpass.php',
+
+ // API classes
+ 'ApiBase' => 'includes/api/ApiBase.php',
+ 'ApiFormatFeedWrapper' => 'includes/api/ApiFormatBase.php',
+ 'ApiFeedWatchlist' => 'includes/api/ApiFeedWatchlist.php',
+ 'ApiFormatBase' => 'includes/api/ApiFormatBase.php',
+ 'Services_JSON' => 'includes/api/ApiFormatJson_json.php',
+ 'ApiFormatJson' => 'includes/api/ApiFormatJson.php',
+ 'ApiFormatPhp' => 'includes/api/ApiFormatPhp.php',
+ 'ApiFormatWddx' => 'includes/api/ApiFormatWddx.php',
+ 'ApiFormatXml' => 'includes/api/ApiFormatXml.php',
+ 'Spyc' => 'includes/api/ApiFormatYaml_spyc.php',
+ 'ApiFormatYaml' => 'includes/api/ApiFormatYaml.php',
+ 'ApiHelp' => 'includes/api/ApiHelp.php',
+ 'ApiLogin' => 'includes/api/ApiLogin.php',
+ 'ApiMain' => 'includes/api/ApiMain.php',
+ 'ApiOpenSearch' => 'includes/api/ApiOpenSearch.php',
+ 'ApiPageSet' => 'includes/api/ApiPageSet.php',
+ 'ApiQuery' => 'includes/api/ApiQuery.php',
+ 'ApiQueryAllpages' => 'includes/api/ApiQueryAllpages.php',
+ 'ApiQueryBase' => 'includes/api/ApiQueryBase.php',
+ 'ApiQueryBacklinks' => 'includes/api/ApiQueryBacklinks.php',
+ 'ApiQueryContributions' => 'includes/api/ApiQueryUserContributions.php',
+ 'ApiQueryInfo' => 'includes/api/ApiQueryInfo.php',
+ 'ApiQueryLogEvents' => 'includes/api/ApiQueryLogEvents.php',
+ 'ApiQueryRecentChanges'=> 'includes/api/ApiQueryRecentChanges.php',
+ 'ApiQueryRevisions' => 'includes/api/ApiQueryRevisions.php',
+ 'ApiQuerySiteinfo' => 'includes/api/ApiQuerySiteinfo.php',
+ 'ApiQueryWatchlist' => 'includes/api/ApiQueryWatchlist.php',
+ 'ApiResult' => 'includes/api/ApiResult.php',
);
+
if ( isset( $localClasses[$className] ) ) {
$filename = $localClasses[$className];
} elseif ( isset( $wgAutoloadClasses[$className] ) ) {
diff --git a/includes/BagOStuff.php b/includes/BagOStuff.php
index 1dc93a2f..c720807d 100644
--- a/includes/BagOStuff.php
+++ b/includes/BagOStuff.php
@@ -240,6 +240,13 @@ abstract class SqlBagOStuff extends BagOStuff {
}
if($row=$this->_fetchobject($res)) {
$this->_debug("get: retrieved data; exp time is " . $row->exptime);
+ if ( $row->exptime != $this->_maxdatetime() &&
+ wfTimestamp( TS_UNIX, $row->exptime ) < time() )
+ {
+ $this->_debug("get: key has expired, deleting");
+ $this->delete($key);
+ return false;
+ }
return $this->_unserialize($this->_blobdecode($row->value));
} else {
$this->_debug('get: no matching rows');
@@ -253,7 +260,7 @@ abstract class SqlBagOStuff extends BagOStuff {
if($exptime == 0) {
$exp = $this->_maxdatetime();
} else {
- if($exptime < 3600*24*30)
+ if($exptime < 3.16e8) # ~10 years
$exptime += time();
$exp = $this->_fromunixtime($exptime);
}
@@ -390,7 +397,8 @@ class MediaWikiBagOStuff extends SqlBagOStuff {
}
function _doinsert($t, $v) {
$dbw =& wfGetDB( DB_MASTER );
- return $dbw->insert($t, $v, 'MediaWikiBagOStuff::_doinsert');
+ return $dbw->insert($t, $v, 'MediaWikiBagOStuff::_doinsert',
+ array( 'IGNORE' ) );
}
function _fetchobject($result) {
$dbw =& wfGetDB( DB_MASTER );
@@ -406,7 +414,11 @@ class MediaWikiBagOStuff extends SqlBagOStuff {
}
function _maxdatetime() {
$dbw =& wfGetDB(DB_MASTER);
- return $dbw->timestamp('9999-12-31 12:59:59');
+ if ( time() > 0x7fffffff ) {
+ return $this->_fromunixtime( 1<<62 );
+ } else {
+ return $this->_fromunixtime( 0x7fffffff );
+ }
}
function _fromunixtime($ts) {
$dbw =& wfGetDB(DB_MASTER);
@@ -492,11 +504,14 @@ class TurckBagOStuff extends BagOStuff {
class APCBagOStuff extends BagOStuff {
function get($key) {
$val = apc_fetch($key);
+ if ( is_string( $val ) ) {
+ $val = unserialize( $val );
+ }
return $val;
}
function set($key, $value, $exptime=0) {
- apc_store($key, $value, $exptime);
+ apc_store($key, serialize($value), $exptime);
return true;
}
diff --git a/includes/Block.php b/includes/Block.php
index b11df22c..ff813ba3 100644
--- a/includes/Block.php
+++ b/includes/Block.php
@@ -17,7 +17,7 @@
class Block
{
/* public*/ var $mAddress, $mUser, $mBy, $mReason, $mTimestamp, $mAuto, $mId, $mExpiry,
- $mRangeStart, $mRangeEnd, $mAnonOnly;
+ $mRangeStart, $mRangeEnd, $mAnonOnly, $mEnableAutoblock;
/* private */ var $mNetworkBits, $mIntegerAddr, $mForUpdate, $mFromMaster, $mByName;
const EB_KEEP_EXPIRED = 1;
@@ -25,7 +25,7 @@ class Block
const EB_RANGE_ONLY = 4;
function Block( $address = '', $user = 0, $by = 0, $reason = '',
- $timestamp = '' , $auto = 0, $expiry = '', $anonOnly = 0, $createAccount = 0 )
+ $timestamp = '' , $auto = 0, $expiry = '', $anonOnly = 0, $createAccount = 0, $enableAutoblock = 0 )
{
$this->mId = 0;
$this->mAddress = $address;
@@ -37,6 +37,7 @@ class Block
$this->mAnonOnly = $anonOnly;
$this->mCreateAccount = $createAccount;
$this->mExpiry = self::decodeExpiry( $expiry );
+ $this->mEnableAutoblock = $enableAutoblock;
$this->mForUpdate = false;
$this->mFromMaster = false;
@@ -72,7 +73,8 @@ class Block
{
$this->mAddress = $this->mReason = $this->mTimestamp = '';
$this->mId = $this->mAnonOnly = $this->mCreateAccount =
- $this->mAuto = $this->mUser = $this->mBy = 0;
+ $this->mEnableAutoblock = $this->mAuto = $this->mUser =
+ $this->mBy = 0;
$this->mByName = false;
}
@@ -111,9 +113,6 @@ class Block
$options = array();
$db =& $this->getDBOptions( $options );
- $ret = false;
- $killed = false;
-
if ( 0 == $user && $address == '' ) {
# Invalid user specification, not blocked
$this->clear();
@@ -239,14 +238,10 @@ class Block
/**
* Determine if a given integer IPv4 address is in a given CIDR network
+ * @deprecated Use IP::isInRange
*/
function isAddressInRange( $addr, $range ) {
- list( $network, $bits ) = wfParseCIDR( $range );
- if ( $network !== false && $addr >> ( 32 - $bits ) == $network >> ( 32 - $bits ) ) {
- return true;
- } else {
- return false;
- }
+ return IP::isInRange( $addr, $range );
}
function initFromRow( $row )
@@ -259,6 +254,7 @@ class Block
$this->mAuto = $row->ipb_auto;
$this->mAnonOnly = $row->ipb_anon_only;
$this->mCreateAccount = $row->ipb_create_account;
+ $this->mEnableAutoblock = $row->ipb_enable_autoblock;
$this->mId = $row->ipb_id;
$this->mExpiry = self::decodeExpiry( $row->ipb_expiry );
if ( isset( $row->user_name ) ) {
@@ -274,12 +270,9 @@ class Block
{
$this->mRangeStart = '';
$this->mRangeEnd = '';
+
if ( $this->mUser == 0 ) {
- list( $network, $bits ) = wfParseCIDR( $this->mAddress );
- if ( $network !== false ) {
- $this->mRangeStart = sprintf( '%08X', $network );
- $this->mRangeEnd = sprintf( '%08X', $network + (1 << (32 - $bits)) - 1 );
- }
+ list( $this->mRangeStart, $this->mRangeEnd ) = IP::parseRange( $this->mAddress );
}
}
@@ -312,7 +305,7 @@ class Block
$now = wfTimestampNow();
- extract( $db->tableNames( 'ipblocks', 'user' ) );
+ list( $ipblocks, $user ) = $db->tableNamesN( 'ipblocks', 'user' );
$sql = "SELECT $ipblocks.*,user_name FROM $ipblocks,$user " .
"WHERE user_id=ipb_by $cond ORDER BY ipb_timestamp DESC $options";
@@ -335,7 +328,7 @@ class Block
call_user_func( $callback, $block, $tag );
}
}
- wfFreeResult( $res );
+ $db->freeResult( $res );
return $num_rows;
}
@@ -353,6 +346,10 @@ class Block
return $dbw->affectedRows() > 0;
}
+ /**
+ * Insert a block into the block table.
+ *@return Whether or not the insertion was successful.
+ */
function insert()
{
wfDebug( "Block::insert; timestamp {$this->mTimestamp}\n" );
@@ -364,9 +361,14 @@ class Block
$this->mAnonOnly = 0;
}
+ # Unset ipb_enable_autoblock for IP blocks, makes no sense
+ if ( !$this->mUser ) {
+ $this->mEnableAutoblock = 0;
+ }
+
# Don't collide with expired blocks
Block::purgeExpired();
-
+
$ipb_id = $dbw->nextSequenceValue('ipblocks_ipb_id_val');
$dbw->insert( 'ipblocks',
array(
@@ -379,6 +381,7 @@ class Block
'ipb_auto' => $this->mAuto,
'ipb_anon_only' => $this->mAnonOnly,
'ipb_create_account' => $this->mCreateAccount,
+ 'ipb_enable_autoblock' => $this->mEnableAutoblock,
'ipb_expiry' => self::encodeExpiry( $this->mExpiry, $dbw ),
'ipb_range_start' => $this->mRangeStart,
'ipb_range_end' => $this->mRangeEnd,
@@ -386,9 +389,124 @@ class Block
);
$affected = $dbw->affectedRows();
$dbw->commit();
+
+ if ($affected)
+ $this->doRetroactiveAutoblock();
+
return $affected;
}
+ /**
+ * Retroactively autoblocks the last IP used by the user (if it is a user)
+ * blocked by this Block.
+ *@return Whether or not a retroactive autoblock was made.
+ */
+ function doRetroactiveAutoblock() {
+ $dbr = wfGetDB( DB_SLAVE );
+ #If autoblock is enabled, autoblock the LAST IP used
+ # - stolen shamelessly from CheckUser_body.php
+
+ if ($this->mEnableAutoblock && $this->mUser) {
+ wfDebug("Doing retroactive autoblocks for " . $this->mAddress . "\n");
+
+ $row = $dbr->selectRow( 'recentchanges', array( 'rc_ip' ), array( 'rc_user_text' => $this->mAddress ),
+ __METHOD__ , array( 'ORDER BY' => 'rc_timestamp DESC' ) );
+
+ if ( !$row || !$row->rc_ip ) {
+ #No results, don't autoblock anything
+ wfDebug("No IP found to retroactively autoblock\n");
+ } else {
+ #Limit is 1, so no loop needed.
+ $retroblockip = $row->rc_ip;
+ return $this->doAutoblock($retroblockip);
+ }
+ }
+ }
+
+ /**
+ * Autoblocks the given IP, referring to this Block.
+ * @param $autoblockip The IP to autoblock.
+ * @return bool Whether or not an autoblock was inserted.
+ */
+ function doAutoblock( $autoblockip ) {
+ # Check if this IP address is already blocked
+ $dbw =& wfGetDB( DB_MASTER );
+ $dbw->begin();
+
+ # If autoblocks are disabled, go away.
+ if ( !$this->mEnableAutoblock ) {
+ return;
+ }
+
+ # Check for presence on the autoblock whitelist
+ # TODO cache this?
+ $lines = explode( "\n", wfMsgForContentNoTrans( 'autoblock_whitelist' ) );
+
+ $ip = $autoblockip;
+
+ wfDebug("Checking the autoblock whitelist..\n");
+
+ foreach( $lines as $line ) {
+ # List items only
+ if ( substr( $line, 0, 1 ) !== '*' ) {
+ continue;
+ }
+
+ $wlEntry = substr($line, 1);
+ $wlEntry = trim($wlEntry);
+
+ wfDebug("Checking $ip against $wlEntry...");
+
+ # Is the IP in this range?
+ if (IP::isInRange( $ip, $wlEntry )) {
+ wfDebug(" IP $ip matches $wlEntry, not autoblocking\n");
+ #$autoblockip = null; # Don't autoblock a whitelisted IP.
+ return; #This /SHOULD/ introduce a dummy block - but
+ # I don't know a safe way to do so. -werdna
+ } else {
+ wfDebug( " No match\n" );
+ }
+ }
+
+ # It's okay to autoblock. Go ahead and create/insert the block.
+
+ $ipblock = Block::newFromDB( $autoblockip );
+ if ( $ipblock ) {
+ # If the user is already blocked. Then check if the autoblock would
+ # exceed the user block. If it would exceed, then do nothing, else
+ # prolong block time
+ if ($this->mExpiry &&
+ ($this->mExpiry < Block::getAutoblockExpiry($ipblock->mTimestamp))) {
+ return;
+ }
+ # Just update the timestamp
+ $ipblock->updateTimestamp();
+ return;
+ } else {
+ $ipblock = new Block;
+ }
+
+ # Make a new block object with the desired properties
+ wfDebug( "Autoblocking {$this->mAddress}@" . $autoblockip . "\n" );
+ $ipblock->mAddress = $autoblockip;
+ $ipblock->mUser = 0;
+ $ipblock->mBy = $this->mBy;
+ $ipblock->mReason = wfMsgForContent( 'autoblocker', $this->mAddress, $this->mReason );
+ $ipblock->mTimestamp = wfTimestampNow();
+ $ipblock->mAuto = 1;
+ $ipblock->mCreateAccount = $this->mCreateAccount;
+
+ # If the user is already blocked with an expiry date, we don't
+ # want to pile on top of that!
+ if($this->mExpiry) {
+ $ipblock->mExpiry = min ( $this->mExpiry, Block::getAutoblockExpiry( $this->mTimestamp ));
+ } else {
+ $ipblock->mExpiry = Block::getAutoblockExpiry( $this->mTimestamp );
+ }
+ # Insert it
+ return $ipblock->insert();
+ }
+
function deleteIfExpired()
{
$fname = 'Block::deleteIfExpired';
@@ -449,6 +567,16 @@ class Block
return $this->mNetworkBits;
}*/
+ /**
+ * @return The blocker user ID.
+ */
+ public function getBy() {
+ return $this->mBy;
+ }
+
+ /**
+ * @return The blocker user name.
+ */
function getByName()
{
if ( $this->mByName === false ) {
diff --git a/includes/CacheDependency.php b/includes/CacheDependency.php
new file mode 100644
index 00000000..4bb3d328
--- /dev/null
+++ b/includes/CacheDependency.php
@@ -0,0 +1,328 @@
+<?php
+
+/**
+ * This class stores an arbitrary value along with its dependencies.
+ * Users should typically only use DependencyWrapper::getFromCache(), rather
+ * than instantiating one of these objects directly.
+ */
+class DependencyWrapper {
+ var $value;
+ var $deps;
+
+ /**
+ * Create an instance.
+ * @param mixed $value The user-supplied value
+ * @param mixed $deps A dependency or dependency array. All dependencies
+ * must be objects implementing CacheDependency.
+ */
+ function __construct( $value = false, $deps = array() ) {
+ $this->value = $value;
+ if ( !is_array( $deps ) ) {
+ $deps = array( $deps );
+ }
+ $this->deps = $deps;
+ }
+
+ /**
+ * Returns true if any of the dependencies have expired
+ */
+ function isExpired() {
+ foreach ( $this->deps as $dep ) {
+ if ( $dep->isExpired() ) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Initialise dependency values in preparation for storing. This must be
+ * called before serialization.
+ */
+ function initialiseDeps() {
+ foreach ( $this->deps as $dep ) {
+ $dep->loadDependencyValues();
+ }
+ }
+
+ /**
+ * Get the user-defined value
+ */
+ function getValue() {
+ return $this->value;
+ }
+
+ /**
+ * Store the wrapper to a cache
+ */
+ function storeToCache( $cache, $key, $expiry = 0 ) {
+ $this->initialiseDeps();
+ $cache->set( $key, $this, $expiry );
+ }
+
+ /**
+ * Attempt to get a value from the cache. If the value is expired or missing,
+ * it will be generated with the callback function (if present), and the newly
+ * calculated value will be stored to the cache in a wrapper.
+ *
+ * @param object $cache A cache object such as $wgMemc
+ * @param string $key The cache key
+ * @param integer $expiry The expiry timestamp or interval in seconds
+ * @param mixed $callback The callback for generating the value, or false
+ * @param array $callbackParams The function parameters for the callback
+ * @param array $deps The dependencies to store on a cache miss. Note: these
+ * are not the dependencies used on a cache hit! Cache hits use the stored
+ * dependency array.
+ *
+ * @return mixed The value, or null if it was not present in the cache and no
+ * callback was defined.
+ */
+ static function getValueFromCache( $cache, $key, $expiry = 0, $callback = false,
+ $callbackParams = array(), $deps = array() )
+ {
+ $obj = $cache->get( $key );
+ if ( is_object( $obj ) && $obj instanceof DependencyWrapper && !$obj->isExpired() ) {
+ $value = $obj->value;
+ } elseif ( $callback ) {
+ $value = call_user_func_array( $callback, $callbackParams );
+ # Cache the newly-generated value
+ $wrapper = new DependencyWrapper( $value, $deps );
+ $wrapper->storeToCache( $cache, $key, $expiry );
+ } else {
+ $value = null;
+ }
+ return $value;
+ }
+}
+
+abstract class CacheDependency {
+ /**
+ * Returns true if the dependency is expired, false otherwise
+ */
+ abstract function isExpired();
+
+ /**
+ * Hook to perform any expensive pre-serialize loading of dependency values.
+ */
+ function loadDependencyValues() {}
+}
+
+class FileDependency extends CacheDependency {
+ var $filename, $timestamp;
+
+ /**
+ * Create a file dependency
+ *
+ * @param string $filename The name of the file, preferably fully qualified
+ * @param mixed $timestamp The unix last modified timestamp, or false if the
+ * file does not exist. If omitted, the timestamp will be loaded from
+ * the file.
+ *
+ * A dependency on a nonexistent file will be triggered when the file is
+ * created. A dependency on an existing file will be triggered when the
+ * file is changed.
+ */
+ function __construct( $filename, $timestamp = null ) {
+ $this->filename = $filename;
+ $this->timestamp = $timestamp;
+ }
+
+ function loadDependencyValues() {
+ if ( is_null( $this->timestamp ) ) {
+ if ( !file_exists( $this->filename ) ) {
+ # Dependency on a non-existent file
+ # This is a valid concept!
+ $this->timestamp = false;
+ } else {
+ $this->timestamp = filemtime( $this->filename );
+ }
+ }
+ }
+
+ function isExpired() {
+ if ( !file_exists( $this->filename ) ) {
+ if ( $this->timestamp === false ) {
+ # Still nonexistent
+ return false;
+ } else {
+ # Deleted
+ wfDebug( "Dependency triggered: {$this->filename} deleted.\n" );
+ return true;
+ }
+ } else {
+ $lastmod = filemtime( $this->filename );
+ if ( $lastmod > $this->timestamp ) {
+ # Modified or created
+ wfDebug( "Dependency triggered: {$this->filename} changed.\n" );
+ return true;
+ } else {
+ # Not modified
+ return false;
+ }
+ }
+ }
+}
+
+class TitleDependency extends CacheDependency {
+ var $titleObj;
+ var $ns, $dbk;
+ var $touched;
+
+ /**
+ * Construct a title dependency
+ * @param Title $title
+ */
+ function __construct( Title $title ) {
+ $this->titleObj = $title;
+ $this->ns = $title->getNamespace();
+ $this->dbk = $title->getDBkey();
+ }
+
+ function loadDependencyValues() {
+ $this->touched = $this->getTitle()->getTouched();
+ }
+
+ /**
+ * Get rid of bulky Title object for sleep
+ */
+ function __sleep() {
+ return array( 'ns', 'dbk', 'touched' );
+ }
+
+ function getTitle() {
+ if ( !isset( $this->titleObj ) ) {
+ $this->titleObj = Title::makeTitle( $this->ns, $this->dbk );
+ }
+ return $this->titleObj;
+ }
+
+ function isExpired() {
+ $touched = $this->getTitle()->getTouched();
+ if ( $this->touched === false ) {
+ if ( $touched === false ) {
+ # Still missing
+ return false;
+ } else {
+ # Created
+ return true;
+ }
+ } elseif ( $touched === false ) {
+ # Deleted
+ return true;
+ } elseif ( $touched > $this->touched ) {
+ # Updated
+ return true;
+ } else {
+ # Unmodified
+ return false;
+ }
+ }
+}
+
+class TitleListDependency extends CacheDependency {
+ var $linkBatch;
+ var $timestamps;
+
+ /**
+ * Construct a dependency on a list of titles
+ */
+ function __construct( LinkBatch $linkBatch ) {
+ $this->linkBatch = $linkBatch;
+ }
+
+ function calculateTimestamps() {
+ # Initialise values to false
+ $timestamps = array();
+ foreach ( $this->getLinkBatch()->data as $ns => $dbks ) {
+ if ( count( $dbks ) > 0 ) {
+ $timestamps[$ns] = array();
+ foreach ( $dbks as $dbk => $value ) {
+ $timestamps[$ns][$dbk] = false;
+ }
+ }
+ }
+
+ # Do the query
+ if ( count( $timestamps ) ) {
+ $dbr =& wfGetDB( DB_SLAVE );
+ $where = $this->getLinkBatch()->constructSet( 'page', $dbr );
+ $res = $dbr->select( 'page',
+ array( 'page_namespace', 'page_title', 'page_touched' ),
+ $where, __METHOD__ );
+ while ( $row = $dbr->fetchObject( $res ) ) {
+ $timestamps[$row->page_namespace][$row->page_title] = $row->page_touched;
+ }
+ }
+ return $timestamps;
+ }
+
+ function loadDependencyValues() {
+ $this->timestamps = $this->calculateTimestamps();
+ }
+
+ function __sleep() {
+ return array( 'timestamps' );
+ }
+
+ function getLinkBatch() {
+ if ( !isset( $this->linkBatch ) ){
+ $this->linkBatch = new LinkBatch;
+ $this->linkBatch->setArray( $this->timestamps );
+ }
+ return $this->linkBatch;
+ }
+
+ function isExpired() {
+ $newTimestamps = $this->calculateTimestamps();
+ foreach ( $this->timestamps as $ns => $dbks ) {
+ foreach ( $dbks as $dbk => $oldTimestamp ) {
+ $newTimestamp = $newTimestamps[$ns][$dbk];
+ if ( $oldTimestamp === false ) {
+ if ( $newTimestamp === false ) {
+ # Still missing
+ } else {
+ # Created
+ return true;
+ }
+ } elseif ( $newTimestamp === false ) {
+ # Deleted
+ return true;
+ } elseif ( $newTimestamp > $oldTimestamp ) {
+ # Updated
+ return true;
+ } else {
+ # Unmodified
+ }
+ }
+ }
+ return false;
+ }
+}
+
+class GlobalDependency extends CacheDependency {
+ var $name, $value;
+
+ function __construct( $name ) {
+ $this->name = $name;
+ $this->value = $GLOBALS[$name];
+ }
+
+ function isExpired() {
+ return $GLOBALS[$this->name] != $this->value;
+ }
+}
+
+class ConstantDependency extends CacheDependency {
+ var $name, $value;
+
+ function __construct( $name ) {
+ $this->name = $name;
+ $this->value = constant( $name );
+ }
+
+ function isExpired() {
+ return constant( $this->name ) != $this->value;
+ }
+}
+
+?>
diff --git a/includes/CategoryPage.php b/includes/CategoryPage.php
index e55d2976..0086a2f9 100644
--- a/includes/CategoryPage.php
+++ b/includes/CategoryPage.php
@@ -236,24 +236,31 @@ class CategoryViewer {
$r = '';
if( count( $this->children ) > 0 ) {
# Showing subcategories
+ $r .= "<div id=\"mw-subcategories\">\n";
$r .= '<h2>' . wfMsg( 'subcategories' ) . "</h2>\n";
$r .= wfMsgExt( 'subcategorycount', array( 'parse' ), count( $this->children) );
$r .= $this->formatList( $this->children, $this->children_start_char );
+ $r .= "\n</div>";
}
return $r;
}
function getPagesSection() {
$ti = htmlspecialchars( $this->title->getText() );
- $r = '<h2>' . wfMsg( 'category_header', $ti ) . "</h2>\n";
+ $r = "<div id=\"mw-pages\">\n";
+ $r .= '<h2>' . wfMsg( 'category_header', $ti ) . "</h2>\n";
$r .= wfMsgExt( 'categoryarticlecount', array( 'parse' ), count( $this->articles) );
$r .= $this->formatList( $this->articles, $this->articles_start_char );
+ $r .= "\n</div>";
return $r;
}
function getImageSection() {
if( $this->showGallery && ! $this->gallery->isEmpty() ) {
- return $this->gallery->toHTML();
+ return "<div id=\"mw-category-media\">\n" .
+ '<h2>' . wfMsg( 'category-media-header', htmlspecialchars($this->title->getText()) ) . "</h2>\n" .
+ wfMsgExt( 'category-media-count', array( 'parse' ), $this->gallery->count() ) .
+ $this->gallery->toHTML() . "\n</div>";
} else {
return '';
}
diff --git a/includes/ChangesList.php b/includes/ChangesList.php
index 6797bb41..a2c1a265 100644
--- a/includes/ChangesList.php
+++ b/includes/ChangesList.php
@@ -46,10 +46,10 @@ class ChangesList {
* @param $user User to fetch the list class for
* @return ChangesList derivative
*/
- function newFromUser( &$user ) {
+ public static function newFromUser( &$user ) {
$sk =& $user->getSkin();
$list = NULL;
- if( wfRunHooks( 'FetchChangesList', array( &$user, &$skin, &$list ) ) ) {
+ if( wfRunHooks( 'FetchChangesList', array( &$user, &$sk, &$list ) ) ) {
return $user->getOption( 'usenewrc' ) ? new EnhancedChangesList( $sk ) : new OldChangesList( $sk );
} else {
return $list;
@@ -184,7 +184,7 @@ class ChangesList {
$s .= ' '.$articlelink;
}
- function insertTimestamp(&$s, &$rc) {
+ function insertTimestamp(&$s, $rc) {
global $wgLang;
# Timestamp
$s .= '; ' . $wgLang->time( $rc->mAttribs['rc_timestamp'], true, true ) . ' . . ';
@@ -212,8 +212,6 @@ class ChangesList {
global $wgUseRCPatrol, $wgUser;
return( $wgUseRCPatrol && $wgUser->isAllowed( 'patrol' ) );
}
-
-
}
@@ -225,15 +223,13 @@ class OldChangesList extends ChangesList {
* Format a line using the old system (aka without any javascript).
*/
function recentChangesLine( &$rc, $watched = false ) {
- global $wgContLang;
+ global $wgContLang, $wgRCShowChangedSize;
$fname = 'ChangesList::recentChangesLineOld';
wfProfileIn( $fname );
-
# Extract DB fields into local scope
extract( $rc->mAttribs );
- $curIdEq = 'curid=' . $rc_cur_id;
# Should patrol-related stuff be shown?
$unpatrolled = $this->usePatrol() && $rc_patrolled == 0;
@@ -246,8 +242,13 @@ class OldChangesList extends ChangesList {
if( $rc_type == RC_MOVE || $rc_type == RC_MOVE_OVER_REDIRECT ) {
$this->insertMove( $s, $rc );
// log entries
- } elseif( $rc_namespace == NS_SPECIAL && preg_match( '!^Log/(.*)$!', $rc_title, $matches ) ) {
- $this->insertLog($s, $rc->getTitle(), $matches[1]);
+ } elseif ( $rc_namespace == NS_SPECIAL ) {
+ list( $specialName, $specialSubpage ) = SpecialPage::resolveAliasWithSubpage( $rc_title );
+ if ( $specialName == 'Log' ) {
+ $this->insertLog( $s, $rc->getTitle(), $specialSubpage );
+ } else {
+ wfDebug( "Unexpected special page in recentchanges\n" );
+ }
// all other stuff
} else {
wfProfileIn($fname.'-page');
@@ -264,6 +265,11 @@ class OldChangesList extends ChangesList {
wfProfileIn( $fname.'-rest' );
$this->insertTimestamp($s,$rc);
+
+ if( $wgRCShowChangedSize ) {
+ $s .= ( $rc->getCharacterDifference() == '' ? '' : $rc->getCharacterDifference() . ' . . ' );
+ }
+
$this->insertUserRelatedLinks($s,$rc);
$this->insertComment($s, $rc);
@@ -321,11 +327,16 @@ class EnhancedChangesList extends ChangesList {
$msg = ( $rc_type == RC_MOVE ) ? "1movedto2" : "1movedto2_redir";
$clink = wfMsg( $msg, $this->skin->makeKnownLinkObj( $rc->getTitle(), '', 'redirect=no' ),
$this->skin->makeKnownLinkObj( $rc->getMovedToTitle(), '' ) );
- } elseif( $rc_namespace == NS_SPECIAL && preg_match( '!^Log/(.*)$!', $rc_title, $matches ) ) {
- # Log updates, etc
- $logtype = $matches[1];
- $logname = LogPage::logName( $logtype );
- $clink = '(' . $this->skin->makeKnownLinkObj( $rc->getTitle(), $logname ) . ')';
+ } elseif( $rc_namespace == NS_SPECIAL ) {
+ list( $specialName, $logtype ) = SpecialPage::resolveAliasWithSubpage( $rc_title );
+ if ( $specialName == 'Log' ) {
+ # Log updates, etc
+ $logname = LogPage::logName( $logtype );
+ $clink = '(' . $this->skin->makeKnownLinkObj( $rc->getTitle(), $logname ) . ')';
+ } else {
+ wfDebug( "Unexpected special page in recentchanges\n" );
+ $clink = '';
+ }
} elseif( $rc->unpatrolled && $rc_type == RC_NEW ) {
# Unpatrolled new page, give rc_id in query
$clink = $this->skin->makeKnownLinkObj( $rc->getTitle(), '', "rcid={$rc_id}" );
@@ -394,7 +405,7 @@ class EnhancedChangesList extends ChangesList {
* Enhanced RC group
*/
function recentChangesBlockGroup( $block ) {
- global $wgContLang;
+ global $wgContLang, $wgRCShowChangedSize;
$r = '';
# Collate list of users
@@ -403,7 +414,6 @@ class EnhancedChangesList extends ChangesList {
$userlinks = array();
foreach( $block as $rcObj ) {
$oldid = $rcObj->mAttribs['rc_last_oldid'];
- $newid = $rcObj->mAttribs['rc_this_oldid'];
if( $rcObj->mAttribs['rc_new'] ) {
$isnew = true;
}
@@ -447,8 +457,7 @@ class EnhancedChangesList extends ChangesList {
$r .= $this->recentChangesFlags( $isnew, false, $unpatrolled, '&nbsp;', $bot );
# Timestamp
- $r .= ' '.$block[0]->timestamp.' ';
- $r .= '</tt>';
+ $r .= ' '.$block[0]->timestamp.' </tt>';
# Article link
$r .= $this->maybeWatchedLink( $block[0]->link, $block[0]->watched );
@@ -459,13 +468,23 @@ class EnhancedChangesList extends ChangesList {
if( $block[0]->mAttribs['rc_type'] != RC_LOG ) {
# Changes
$r .= ' ('.count($block).' ';
+
if( $isnew ) {
$r .= $this->message['changes'];
} else {
$r .= $this->skin->makeKnownLinkObj( $block[0]->getTitle(),
$this->message['changes'], $curIdEq."&diff=$currentRevision&oldid=$oldid" );
}
- $r .= '; ';
+
+ # Character difference
+ $chardiff = $rcObj->getCharacterDifference( $block[ count( $block ) - 1 ]->mAttribs['rc_old_len'],
+ $block[0]->mAttribs['rc_new_len'] );
+ if( $chardiff == '' ) {
+ $r .= '; ';
+ } else {
+ $r .= '; ' . $chardiff . ' ';
+ }
+
# History
$r .= $this->skin->makeKnownLinkObj( $block[0]->getTitle(),
@@ -508,7 +527,14 @@ class EnhancedChangesList extends ChangesList {
$r .= $rcObj->curlink;
$r .= '; ';
$r .= $rcObj->lastlink;
- $r .= ') . . '.$rcObj->userlink;
+ $r .= ') . . ';
+
+ # Character diff
+ if( $wgRCShowChangedSize ) {
+ $r .= ( $rcObj->getCharacterDifference() == '' ? '' : $rcObj->getCharacterDifference() . ' . . ' ) ;
+ }
+
+ $r .= $rcObj->userlink;
$r .= $rcObj->usertalklink;
$r .= $this->skin->commentBlock( $rc_comment, $rcObj->getTitle() );
$r .= "<br />\n";
@@ -578,7 +604,7 @@ class EnhancedChangesList extends ChangesList {
* @return string a HTML formated line (generated using $r)
*/
function recentChangesBlockLine( $rcObj ) {
- global $wgContLang;
+ global $wgContLang, $wgRCShowChangedSize;
# Get rc_xxxx variables
extract( $rcObj->mAttribs );
@@ -606,10 +632,15 @@ class EnhancedChangesList extends ChangesList {
$r .= ' ('. $rcObj->difflink .'; ';
# Hist
- $r .= $this->skin->makeKnownLinkObj( $rcObj->getTitle(), wfMsg( 'hist' ), $curIdEq.'&action=history' );
+ $r .= $this->skin->makeKnownLinkObj( $rcObj->getTitle(), wfMsg( 'hist' ), $curIdEq.'&action=history' ) . ') . . ';
+
+ # Character diff
+ if( $wgRCShowChangedSize ) {
+ $r .= ( $rcObj->getCharacterDifference() == '' ? '' : '&nbsp;' . $rcObj->getCharacterDifference() . ' . . ' ) ;
+ }
# User/talk
- $r .= ') . . '.$rcObj->userlink . $rcObj->usertalklink;
+ $r .= $rcObj->userlink . $rcObj->usertalklink;
# Comment
if( $rc_type != RC_MOVE && $rc_type != RC_MOVE_OVER_REDIRECT ) {
@@ -633,7 +664,7 @@ class EnhancedChangesList extends ChangesList {
return '';
}
$blockOut = '';
- foreach( $this->rc_cache as $secureName => $block ) {
+ foreach( $this->rc_cache as $block ) {
if( count( $block ) < 2 ) {
$blockOut .= $this->recentChangesBlockLine( array_shift( $block ) );
} else {
diff --git a/includes/CoreParserFunctions.php b/includes/CoreParserFunctions.php
index 2081b3f2..402a3ba9 100644
--- a/includes/CoreParserFunctions.php
+++ b/includes/CoreParserFunctions.php
@@ -65,7 +65,6 @@ class CoreParserFunctions {
static function fullurle( $parser, $s = '', $arg = null ) { return self::urlFunction( 'escapeFullURL', $s, $arg ); }
static function urlFunction( $func, $s = '', $arg = null ) {
- $found = false;
$title = Title::newFromText( $s );
# Due to order of execution of a lot of bits, the values might be encoded
# before arriving here; if that's true, then the title can't be created
@@ -79,28 +78,26 @@ class CoreParserFunctions {
} else {
$text = $title->$func();
}
- $found = true;
- }
- if ( $found ) {
return $text;
} else {
return array( 'found' => false );
}
}
- function formatNum( $parser, $num = '' ) {
+ static function formatNum( $parser, $num = '' ) {
return $parser->getFunctionLang()->formatNum( $num );
}
- function grammar( $parser, $case = '', $word = '' ) {
+ static function grammar( $parser, $case = '', $word = '' ) {
return $parser->getFunctionLang()->convertGrammar( $word, $case );
}
- function plural( $parser, $text = '', $arg0 = null, $arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null ) {
+ static function plural( $parser, $text = '', $arg0 = null, $arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null ) {
+ $text = $parser->getFunctionLang()->parseFormattedNumber( $text );
return $parser->getFunctionLang()->convertPlural( $text, $arg0, $arg1, $arg2, $arg3, $arg4 );
}
- function displaytitle( $parser, $param = '' ) {
+ static function displaytitle( $parser, $param = '' ) {
$parserOptions = new ParserOptions;
$local_parser = clone $parser;
$t2 = $local_parser->parse ( $param, $parser->mTitle, $parserOptions, false );
@@ -112,7 +109,7 @@ class CoreParserFunctions {
return '';
}
- function isRaw( $param ) {
+ static function isRaw( $param ) {
static $mwRaw;
if ( !$mwRaw ) {
$mwRaw =& MagicWord::get( 'rawsuffix' );
@@ -124,23 +121,23 @@ class CoreParserFunctions {
}
}
- function statisticsFunction( $func, $raw = null ) {
+ static function statisticsFunction( $func, $raw = null ) {
if ( self::isRaw( $raw ) ) {
- return call_user_func( $func );
+ return call_user_func( array( 'SiteStats', $func ) );
} else {
global $wgContLang;
- return $wgContLang->formatNum( call_user_func( $func ) );
+ return $wgContLang->formatNum( call_user_func( array( 'SiteStats', $func ) ) );
}
}
- function numberofpages( $parser, $raw = null ) { return self::statisticsFunction( 'wfNumberOfPages', $raw ); }
- function numberofusers( $parser, $raw = null ) { return self::statisticsFunction( 'wfNumberOfUsers', $raw ); }
- function numberofarticles( $parser, $raw = null ) { return self::statisticsFunction( 'wfNumberOfArticles', $raw ); }
- function numberoffiles( $parser, $raw = null ) { return self::statisticsFunction( 'wfNumberOfFiles', $raw ); }
- function numberofadmins( $parser, $raw = null ) { return self::statisticsFunction( 'wfNumberOfAdmins', $raw ); }
+ static function numberofpages( $parser, $raw = null ) { return self::statisticsFunction( 'pages', $raw ); }
+ static function numberofusers( $parser, $raw = null ) { return self::statisticsFunction( 'users', $raw ); }
+ static function numberofarticles( $parser, $raw = null ) { return self::statisticsFunction( 'articles', $raw ); }
+ static function numberoffiles( $parser, $raw = null ) { return self::statisticsFunction( 'images', $raw ); }
+ static function numberofadmins( $parser, $raw = null ) { return self::statisticsFunction( 'admins', $raw ); }
- function pagesinnamespace( $parser, $namespace = 0, $raw = null ) {
- $count = wfPagesInNs( intval( $namespace ) );
+ static function pagesinnamespace( $parser, $namespace = 0, $raw = null ) {
+ $count = SiteStats::pagesInNs( intval( $namespace ) );
if ( self::isRaw( $raw ) ) {
global $wgContLang;
return $wgContLang->formatNum( $count );
@@ -149,13 +146,13 @@ class CoreParserFunctions {
}
}
- function language( $parser, $arg = '' ) {
+ static function language( $parser, $arg = '' ) {
global $wgContLang;
$lang = $wgContLang->getLanguageName( strtolower( $arg ) );
return $lang != '' ? $lang : $arg;
}
- function pad( $string = '', $length = 0, $char = 0, $direction = STR_PAD_RIGHT ) {
+ static function pad( $string = '', $length = 0, $char = 0, $direction = STR_PAD_RIGHT ) {
$length = min( max( $length, 0 ), 500 );
$char = substr( $char, 0, 1 );
return ( $string && (int)$length > 0 && strlen( trim( (string)$char ) ) > 0 )
@@ -163,16 +160,32 @@ class CoreParserFunctions {
: $string;
}
- function padleft( $parser, $string = '', $length = 0, $char = 0 ) {
+ static function padleft( $parser, $string = '', $length = 0, $char = 0 ) {
return self::pad( $string, $length, $char, STR_PAD_LEFT );
}
- function padright( $parser, $string = '', $length = 0, $char = 0 ) {
+ static function padright( $parser, $string = '', $length = 0, $char = 0 ) {
return self::pad( $string, $length, $char );
}
- function anchorencode( $parser, $text ) {
- return str_replace( '%', '.', str_replace('+', '_', urlencode( $text ) ) );
+ static function anchorencode( $parser, $text ) {
+ return strtr( urlencode( $text ) , array( '%' => '.' , '+' => '_' ) );
+ }
+
+ static function special( $parser, $text ) {
+ $title = SpecialPage::getTitleForAlias( $text );
+ if ( $title ) {
+ return $title->getPrefixedText();
+ } else {
+ return wfMsgForContent( 'nosuchspecialpage' );
+ }
+ }
+
+ public static function defaultsort( $parser, $text ) {
+ $text = trim( $text );
+ if( strlen( $text ) > 0 )
+ $parser->setDefaultSort( $text );
+ return '';
}
}
diff --git a/includes/Database.php b/includes/Database.php
index 53e59968..eb1ee135 100644
--- a/includes/Database.php
+++ b/includes/Database.php
@@ -90,8 +90,8 @@ class DBConnectionError extends DBError {
}
function getHTML() {
- global $wgTitle, $wgUseFileCache, $title, $wgInputEncoding, $wgOutputEncoding;
- global $wgSitename, $wgServer, $wgMessageCache, $wgLogo;
+ global $wgTitle, $wgUseFileCache, $title, $wgInputEncoding;
+ global $wgSitename, $wgServer, $wgMessageCache;
# I give up, Brion is right. Getting the message cache to work when there is no DB is tricky.
# Hard coding strings instead.
@@ -152,7 +152,7 @@ border=\"0\" ALT=\"Google\"></A>
}
}
- $cache = new CacheManager( $t );
+ $cache = new HTMLFileCache( $t );
if( $cache->isFileCached() ) {
$msg = '<p style="color: red"><b>'.$msg."<br />\n" .
$cachederror . "</b></p>\n";
@@ -295,7 +295,7 @@ class Database {
* Turns on (false) or off (true) the automatic generation and sending
* of a "we're sorry, but there has been a database error" page on
* database errors. Default is on (false). When turned off, the
- * code should use wfLastErrno() and wfLastError() to handle the
+ * code should use lastErrno() and lastError() to handle the
* situation as appropriate.
*/
function ignoreErrors( $ignoreErrors = NULL ) {
@@ -362,6 +362,20 @@ class Database {
return $this->mStrictIPs;
}
+ /**
+ * Returns true if this database uses timestamps rather than integers
+ */
+ function realTimestamps() {
+ return false;
+ }
+
+ /**
+ * Returns true if this database does an implicit sort when doing GROUP BY
+ */
+ function implicitGroupby() {
+ return true;
+ }
+
/**#@+
* Get function
*/
@@ -613,7 +627,7 @@ class Database {
# Add a comment for easy SHOW PROCESSLIST interpretation
if ( $fname ) {
- $commentedSql = preg_replace("/\s/", " /* $fname */ ", $sql, 1);
+ $commentedSql = preg_replace('/\s/', " /* $fname */ ", $sql, 1);
} else {
$commentedSql = $sql;
}
@@ -679,7 +693,7 @@ class Database {
* @param bool $tempIgnore
*/
function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
- global $wgCommandLineMode, $wgFullyInitialised, $wgColorErrors;
+ global $wgCommandLineMode;
# Ignore errors during error handling to avoid infinite recursion
$ignore = $this->ignoreErrors( true );
++$this->mErrorCount;
@@ -778,7 +792,7 @@ class Database {
case '\\!': return '!';
case '\\&': return '&';
}
- list( $n, $arg ) = each( $this->preparedArgs );
+ list( /* $n */ , $arg ) = each( $this->preparedArgs );
switch( $matches[1] ) {
case '?': return $this->addQuotes( $arg );
case '!': return $arg;
@@ -981,6 +995,7 @@ class Database {
if ( isset( $noKeyOptions['DISTINCT'] ) && isset( $noKeyOptions['DISTINCTROW'] ) ) $startOpts .= 'DISTINCT';
# Various MySQL extensions
+ if ( isset( $noKeyOptions['STRAIGHT_JOIN'] ) ) $startOpts .= ' /*! STRAIGHT_JOIN */';
if ( isset( $noKeyOptions['HIGH_PRIORITY'] ) ) $startOpts .= ' HIGH_PRIORITY';
if ( isset( $noKeyOptions['SQL_BIG_RESULT'] ) ) $startOpts .= ' SQL_BIG_RESULT';
if ( isset( $noKeyOptions['SQL_BUFFER_RESULT'] ) ) $startOpts .= ' SQL_BUFFER_RESULT';
@@ -1000,6 +1015,14 @@ class Database {
/**
* SELECT wrapper
+ *
+ * @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
+ * @return mixed Database result resource (feed to Database::fetchObject or whatever), or false on failure
*/
function select( $table, $vars, $conds='', $fname = 'Database::select', $options = array() )
{
@@ -1010,7 +1033,7 @@ class Database {
$options = array( $options );
}
if( is_array( $table ) ) {
- if ( @is_array( $options['USE INDEX'] ) )
+ if ( isset( $options['USE INDEX'] ) && is_array( $options['USE INDEX'] ) )
$from = ' FROM ' . $this->tableNamesWithUseIndex( $table, $options['USE INDEX'] );
else
$from = ' FROM ' . implode( ',', array_map( array( &$this, 'tableName' ), $table ) );
@@ -1082,7 +1105,7 @@ class Database {
$sql = preg_replace ('/".*"/s', "'X'", $sql);
# All newlines, tabs, etc replaced by single space
- $sql = preg_replace ( "/\s+/", ' ', $sql);
+ $sql = preg_replace ( '/\s+/', ' ', $sql);
# All numbers => N
$sql = preg_replace ('/-?[0-9]+/s', 'N', $sql);
@@ -1143,12 +1166,15 @@ class Database {
return NULL;
}
+ $result = array();
while ( $row = $this->fetchObject( $res ) ) {
if ( $row->Key_name == $index ) {
- return $row;
+ $result[] = $row;
}
}
- return false;
+ $this->freeResult($res);
+
+ return empty($result) ? false : $result;
}
/**
@@ -1202,7 +1228,7 @@ class Database {
if ( !$indexInfo ) {
return NULL;
}
- return !$indexInfo->Non_unique;
+ return !$indexInfo[0]->Non_unique;
}
/**
@@ -1292,7 +1318,7 @@ class Database {
}
/**
- * Makes a wfStrencoded list from an array
+ * Makes an encoded list of strings from an array
* $mode:
* LIST_COMMA - comma separated, no field names
* LIST_AND - ANDed WHERE clause (without the WHERE)
@@ -1321,6 +1347,8 @@ class Database {
}
if ( ($mode == LIST_AND || $mode == LIST_OR) && is_numeric( $field ) ) {
$list .= "($value)";
+ } elseif ( ($mode == LIST_SET) && is_numeric( $field ) ) {
+ $list .= "$value";
} elseif ( ($mode == LIST_AND || $mode == LIST_OR) && is_array ($value) ) {
$list .= $field." IN (".$this->makeList($value).") ";
} else {
@@ -1379,7 +1407,7 @@ class Database {
* $sql = "SELECT wl_namespace,wl_title FROM $watchlist,$user
* WHERE wl_user=user_id AND wl_user=$nameWithQuotes";
*/
- function tableNames() {
+ public function tableNames() {
$inArray = func_get_args();
$retVal = array();
foreach ( $inArray as $name ) {
@@ -1387,6 +1415,24 @@ class Database {
}
return $retVal;
}
+
+ /**
+ * @desc: Fetch a number of table names into an zero-indexed numerical array
+ * This is handy when you need to construct SQL for joins
+ *
+ * Example:
+ * list( $user, $watchlist ) = $dbr->tableNames('user','watchlist');
+ * $sql = "SELECT wl_namespace,wl_title FROM $watchlist,$user
+ * WHERE wl_user=user_id AND wl_user=$nameWithQuotes";
+ */
+ public function tableNamesN() {
+ $inArray = func_get_args();
+ $retVal = array();
+ foreach ( $inArray as $name ) {
+ $retVal[] = $this->tableName( $name );
+ }
+ return $retVal;
+ }
/**
* @private
@@ -1528,7 +1574,8 @@ class Database {
$row = $this->fetchObject( $res );
$this->freeResult( $res );
- if ( preg_match( "/\((.*)\)/", $row->Type, $m ) ) {
+ $m = array();
+ if ( preg_match( '/\((.*)\)/', $row->Type, $m ) ) {
$size = $m[1];
} else {
$size = -1;
@@ -1829,7 +1876,7 @@ class Database {
* @return string Version information from the database
*/
function getServerVersion() {
- return mysql_get_server_info();
+ return mysql_get_server_info( $this->mConn );
}
/**
@@ -1852,7 +1899,6 @@ class Database {
$res = $this->query( 'SHOW PROCESSLIST' );
# Find slave SQL thread. Assumed to be the second one running, which is a bit
# dubious, but unfortunately there's no easy rigorous way
- $slaveThreads = 0;
while ( $row = $this->fetchObject( $res ) ) {
/* This should work for most situations - when default db
* for thread is not specified, it had no events executed,
diff --git a/includes/DatabaseFunctions.php b/includes/DatabaseFunctions.php
index 74b35a31..ca83b9e5 100644
--- a/includes/DatabaseFunctions.php
+++ b/includes/DatabaseFunctions.php
@@ -1,8 +1,7 @@
<?php
/**
- * Backwards compatibility wrapper for Database.php
- *
- * Note: $wgDatabase has ceased to exist. Destroy all references.
+ * Legacy database functions, for compatibility with pre-1.3 code
+ * NOTE: this file is no longer loaded by default.
*
* @package MediaWiki
*/
@@ -15,7 +14,6 @@
* @param $fname String: name of the php function calling
*/
function wfQuery( $sql, $db, $fname = '' ) {
- global $wgOut;
if ( !is_numeric( $db ) ) {
# Someone has tried to call this the old way
throw new FatalError( wfMsgNoDB( 'wrong_wfQuery_params', $db, $sql ) );
@@ -44,15 +42,6 @@ function wfSingleQuery( $sql, $dbi, $fname = '' ) {
return $ret;
}
-/*
- * @todo document function
- */
-function &wfGetDB( $db = DB_LAST, $groups = array() ) {
- global $wgLoadBalancer;
- $ret =& $wgLoadBalancer->getConnection( $db, true, $groups );
- return $ret;
-}
-
/**
* Turns on (false) or off (true) the automatic generation and sending
* of a "we're sorry, but there has been a database error" page on
diff --git a/includes/DatabaseOracle.php b/includes/DatabaseOracle.php
index aa1e329e..1a6f62f2 100644
--- a/includes/DatabaseOracle.php
+++ b/includes/DatabaseOracle.php
@@ -55,9 +55,6 @@ class DatabaseOracle extends Database {
$this->mPassword = $password;
$this->mDBname = $dbName;
- $success = false;
-
- $hstring="";
$this->mConn = oci_new_connect($user, $password, $dbName, "AL32UTF8");
if ( $this->mConn === false ) {
wfDebug( "DB connection error\n" );
@@ -147,7 +144,6 @@ class DatabaseOracle extends Database {
for ($i = 1; $i <= $this->mNcols[$res]; $i++) {
$name = $this->mFieldNames[$res][$i];
- $type = $this->mFieldTypes[$res][$i];
if (isset($this->mFetchCache[$res][$this->mFetchID[$res]][$name]))
$value = $this->mFetchCache[$res][$this->mFetchID[$res]][$name];
else $value = NULL;
@@ -165,7 +161,7 @@ class DatabaseOracle extends Database {
return false;
$i = 0;
$ret = array();
- foreach ($r as $key => $value) {
+ foreach ($r as $value) {
wfdebug("ret[$i]=[$value]\n");
$ret[$i++] = $value;
}
@@ -201,14 +197,19 @@ class DatabaseOracle extends Database {
function lastError() {
if ($this->mErr === false) {
- if ($this->mLastResult !== false) $what = $this->mLastResult;
- else if ($this->mConn !== false) $what = $this->mConn;
- else $what = false;
+ if ($this->mLastResult !== false) {
+ $what = $this->mLastResult;
+ } else if ($this->mConn !== false) {
+ $what = $this->mConn;
+ } else {
+ $what = false;
+ }
$err = ($what !== false) ? oci_error($what) : oci_error();
- if ($err === false)
+ if ($err === false) {
$this->mErr = 'no error';
- else
+ } else {
$this->mErr = $err['message'];
+ }
}
return str_replace("\n", '<br />', $this->mErr);
}
@@ -239,6 +240,9 @@ class DatabaseOracle extends Database {
$this->freeResult($res);
$row->Non_unique = !$row->uniqueness;
return $row;
+
+ // BUG: !!!! This code needs to be synced up with database.php
+
}
function indexUnique ($table, $index, $fname = 'indexUnique') {
diff --git a/includes/DatabasePostgres.php b/includes/DatabasePostgres.php
index a5e02e77..803c0e26 100644
--- a/includes/DatabasePostgres.php
+++ b/includes/DatabasePostgres.php
@@ -1,7 +1,7 @@
<?php
/**
- * This is Postgres database abstraction layer.
+ * This is the Postgres database abstraction layer.
*
* As it includes more generic version for DB functions,
* than MySQL ones, some of them should be moved to parent
@@ -18,7 +18,7 @@ class DatabasePostgres extends Database {
$failFunction = false, $flags = 0 )
{
- global $wgOut, $wgDBprefix, $wgCommandLineMode;
+ global $wgOut;
# Can't get a reference if it hasn't been set yet
if ( !isset( $wgOut ) ) {
$wgOut = NULL;
@@ -33,6 +33,14 @@ class DatabasePostgres extends Database {
}
+ function realTimestamps() {
+ return true;
+ }
+
+ function implicitGroupby() {
+ return false;
+ }
+
static function newFromParams( $server = false, $user = false, $password = false, $dbName = false,
$failFunction = false, $flags = 0)
{
@@ -59,7 +67,6 @@ class DatabasePostgres extends Database {
$this->mPassword = $password;
$this->mDBname = $dbName;
- $success = false;
$hstring="";
if ($server!=false && $server!="") {
$hstring="host=$server ";
@@ -85,13 +92,14 @@ class DatabasePostgres extends Database {
$this->mOpened = true;
## If this is the initial connection, setup the schema stuff and possibly create the user
if (defined('MEDIAWIKI_INSTALL')) {
- global $wgDBname, $wgDBuser, $wgDBpass, $wgDBsuperuser, $wgDBmwschema,
- $wgDBts2schema, $wgDBts2locale;
+ global $wgDBname, $wgDBuser, $wgDBpassword, $wgDBsuperuser, $wgDBmwschema,
+ $wgDBts2schema;
print "OK</li>\n";
print "<li>Checking the version of Postgres...";
$version = pg_fetch_result($this->doQuery("SELECT version()"),0,0);
- if (!preg_match("/PostgreSQL (\d+\.\d+)(\S+)/", $version, $thisver)) {
+ $thisver = array();
+ if (!preg_match('/PostgreSQL (\d+\.\d+)(\S+)/', $version, $thisver)) {
print "<b>FAILED</b> (could not determine the version)</li>\n";
dieout("</ul>");
}
@@ -131,7 +139,7 @@ class DatabasePostgres extends Database {
dieout('</ul>');
}
print "<li>Creating user <b>$wgDBuser</b>...";
- $safepass = $this->addQuotes($wgDBpass);
+ $safepass = $this->addQuotes($wgDBpassword);
$SQL = "CREATE USER $safeuser NOCREATEDB PASSWORD $safepass";
$this->doQuery($SQL);
print "OK</li>\n";
@@ -460,6 +468,9 @@ class DatabasePostgres extends Database {
while ( $row = $this->fetchObject( $res ) ) {
if ( $row->indexname == $index ) {
return $row;
+
+ // BUG: !!!! This code needs to be synced up with database.php
+
}
}
return false;
@@ -651,9 +662,8 @@ class DatabasePostgres extends Database {
return " (CASE WHEN $cond THEN $trueVal ELSE $falseVal END) ";
}
- # FIXME: actually detecting deadlocks might be nice
function wasDeadlock() {
- return false;
+ return $this->lastErrno() == '40P01';
}
function timestamp( $ts=0 ) {
@@ -669,11 +679,21 @@ class DatabasePostgres extends Database {
function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
- $message = "A database error has occurred\n" .
- "Query: $sql\n" .
- "Function: $fname\n" .
- "Error: $errno $error\n";
- throw new DBUnexpectedError($this, $message);
+ # Ignore errors during error handling to avoid infinite recursion
+ $ignore = $this->ignoreErrors( true );
+ ++$this->mErrorCount;
+
+ if ($ignore || $tempIgnore) {
+ wfDebug("SQL ERROR (ignored): $error\n");
+ $this->ignoreErrors( $ignore );
+ }
+ else {
+ $message = "A database error has occurred\n" .
+ "Query: $sql\n" .
+ "Function: $fname\n" .
+ "Error: $errno $error\n";
+ throw new DBUnexpectedError($this, $message);
+ }
}
/**
@@ -800,10 +820,10 @@ class DatabasePostgres extends Database {
$SQL = "INSERT INTO interwiki(iw_prefix,iw_url,iw_local) VALUES ";
while ( ! feof( $f ) ) {
$line = fgets($f,1024);
- if (!preg_match("/^\s*(\(.+?),(\d)\)/", $line, $matches)) {
+ $matches = array();
+ if (!preg_match('/^\s*(\(.+?),(\d)\)/', $line, $matches)) {
continue;
}
- $yesno = $matches[2]; ## ? "'true'" : "'false'";
$this->query("$SQL $matches[1],$matches[2])");
}
print " (table interwiki successfully populated)...\n";
@@ -827,13 +847,66 @@ class DatabasePostgres extends Database {
return "E'$s[1]'";
}
return "'" . pg_escape_string($s) . "'";
- return "E'" . pg_escape_string($s) . "'";
+ // Unreachable: return "E'" . pg_escape_string($s) . "'";
}
function quote_ident( $s ) {
return '"' . preg_replace( '/"/', '""', $s) . '"';
}
-}
+ /* For now, does nothing */
+ function selectDB( $db ) {
+ return true;
+ }
+
+ /**
+ * 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.
+ * @return array
+ */
+ function makeSelectOptions( $options ) {
+ $tailOpts = '';
+ $startOpts = '';
+
+ $noKeyOptions = array();
+ foreach ( $options as $key => $option ) {
+ if ( is_numeric( $key ) ) {
+ $noKeyOptions[$option] = true;
+ }
+ }
+
+ if ( isset( $options['GROUP BY'] ) ) $tailOpts .= " GROUP BY {$options['GROUP BY']}";
+ if ( isset( $options['ORDER BY'] ) ) $tailOpts .= " ORDER BY {$options['ORDER BY']}";
+
+ if (isset($options['LIMIT'])) {
+ $tailOpts .= $this->limitResult('', $options['LIMIT'],
+ isset($options['OFFSET']) ? $options['OFFSET'] : false);
+ }
+
+ if ( isset( $noKeyOptions['FOR UPDATE'] ) ) $tailOpts .= ' FOR UPDATE';
+ if ( isset( $noKeyOptions['LOCK IN SHARE MODE'] ) ) $tailOpts .= ' LOCK IN SHARE MODE';
+ if ( isset( $noKeyOptions['DISTINCT'] ) && isset( $noKeyOptions['DISTINCTROW'] ) ) $startOpts .= 'DISTINCT';
+
+ if ( isset( $options['USE INDEX'] ) && ! is_array( $options['USE INDEX'] ) ) {
+ $useIndex = $this->useIndexClause( $options['USE INDEX'] );
+ } else {
+ $useIndex = '';
+ }
+
+ return array( $startOpts, $useIndex, $tailOpts );
+ }
+
+ function ping() {
+ wfDebug( "Function ping() not written for DatabasePostgres.php yet");
+ return true;
+ }
+
+
+} // end DatabasePostgres class
?>
diff --git a/includes/DateFormatter.php b/includes/DateFormatter.php
index dc077fdc..c795618a 100644
--- a/includes/DateFormatter.php
+++ b/includes/DateFormatter.php
@@ -129,10 +129,10 @@ class DateFormatter
}
for ( $i=1; $i<=self::LAST; $i++ ) {
$this->mSource = $i;
- if ( @$this->rules[$preference][$i] ) {
+ if ( isset ( $this->rules[$preference][$i] ) ) {
# Specific rules
$this->mTarget = $this->rules[$preference][$i];
- } elseif ( @$this->rules[self::ALL][$i] ) {
+ } elseif ( isset ( $this->rules[self::ALL][$i] ) ) {
# General rules
$this->mTarget = $this->rules[self::ALL][$i];
} elseif ( $preference ) {
diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php
index ee1ed3a0..03697b69 100644
--- a/includes/DefaultSettings.php
+++ b/includes/DefaultSettings.php
@@ -32,7 +32,7 @@ require_once( 'includes/SiteConfiguration.php' );
$wgConf = new SiteConfiguration;
/** MediaWiki version number */
-$wgVersion = '1.8.3';
+$wgVersion = '1.9.0';
/** Name of the site. It must be changed in LocalSettings.php */
$wgSitename = 'MediaWiki';
@@ -82,56 +82,84 @@ if( isset( $_SERVER['SERVER_PORT'] )
/**
* The path we should point to.
* It might be a virtual path in case with use apache mod_rewrite for example
+ *
+ * This *needs* to be set correctly.
+ *
+ * Other paths will be set to defaults based on it unless they are directly
+ * set in LocalSettings.php
*/
$wgScriptPath = '/wiki';
/**
* Whether to support URLs like index.php/Page_title
- * @global bool $wgUsePathInfo
+ * These often break when PHP is set up in CGI mode.
+ * PATH_INFO *may* be correct if cgi.fix_pathinfo is
+ * set, but then again it may not; lighttpd converts
+ * incoming path data to lowercase on systems with
+ * case-insensitive filesystems, and there have been
+ * reports of problems on Apache as well.
+ *
+ * To be safe we'll continue to keep it off by default.
+ *
+ * Override this to false if $_SERVER['PATH_INFO']
+ * contains unexpectedly incorrect garbage, or to
+ * true if it is really correct.
+ *
+ * The default $wgArticlePath will be set based on
+ * this value at runtime, but if you have customized
+ * it, having this incorrectly set to true can
+ * cause redirect loops when "pretty URLs" are used.
+ *
*/
-$wgUsePathInfo = ( strpos( php_sapi_name(), 'cgi' ) === false );
+$wgUsePathInfo =
+ ( strpos( php_sapi_name(), 'cgi' ) === false ) &&
+ ( strpos( php_sapi_name(), 'apache2filter' ) === false ) &&
+ ( strpos( php_sapi_name(), 'isapi' ) === false );
/**#@+
* Script users will request to get articles
* ATTN: Old installations used wiki.phtml and redirect.phtml -
* make sure that LocalSettings.php is correctly set!
- * @deprecated
- */
-/**
- * @global string $wgScript
- */
-$wgScript = "{$wgScriptPath}/index.php";
-/**
- * @global string $wgRedirectScript
+ *
+ * Will be set based on $wgScriptPath in Setup.php if not overridden
+ * in LocalSettings.php. Generally you should not need to change this
+ * unless you don't like seeing "index.php".
*/
-$wgRedirectScript = "{$wgScriptPath}/redirect.php";
+$wgScript = false; /// defaults to "{$wgScriptPath}/index.php"
+$wgRedirectScript = false; /// defaults to "{$wgScriptPath}/redirect.php"
/**#@-*/
/**#@+
+ * These various web and file path variables are set to their defaults
+ * in Setup.php if they are not explicitly set from LocalSettings.php.
+ * If you do override them, be sure to set them all!
+ *
+ * These will relatively rarely need to be set manually, unless you are
+ * splitting style sheets or images outside the main document root.
+ *
* @global string
*/
/**
* style path as seen by users
- * @global string $wgStylePath
*/
-$wgStylePath = "{$wgScriptPath}/skins";
+$wgStylePath = false; /// defaults to "{$wgScriptPath}/skins"
/**
* filesystem stylesheets directory
- * @global string $wgStyleDirectory
*/
-$wgStyleDirectory = "{$IP}/skins";
+$wgStyleDirectory = false; /// defaults to "{$IP}/skins"
$wgStyleSheetPath = &$wgStylePath;
-$wgArticlePath = "{$wgScript}?title=$1";
-$wgUploadPath = "{$wgScriptPath}/images";
-$wgUploadDirectory = "{$IP}/images";
+$wgArticlePath = false; /// default to "{$wgScript}/$1" or "{$wgScript}?title=$1", depending on $wgUsePathInfo
+$wgVariantArticlePath = false;
+$wgUploadPath = false; /// defaults to "{$wgScriptPath}/images"
+$wgUploadDirectory = false; /// defaults to "{$IP}/images"
$wgHashedUploadDirectory = true;
-$wgLogo = "{$wgUploadPath}/wiki.png";
+$wgLogo = false; /// defaults to "{$wgStylePath}/common/images/wiki.png"
$wgFavicon = '/favicon.ico';
-$wgMathPath = "{$wgUploadPath}/math";
-$wgMathDirectory = "{$wgUploadDirectory}/math";
-$wgTmpDirectory = "{$wgUploadDirectory}/tmp";
+$wgMathPath = false; /// defaults to "{$wgUploadPath}/math"
+$wgMathDirectory = false; /// defaults to "{$wgUploadDirectory}/math"
+$wgTmpDirectory = false; /// defaults to "{$wgUploadDirectory}/tmp"
$wgUploadBaseUrl = "";
/**#@-*/
@@ -290,20 +318,23 @@ $wgMimeInfoFile= "includes/mime.info";
#$wgMimeInfoFile= NULL; #use built-in defaults only.
/** Switch for loading the FileInfo extension by PECL at runtime.
-* This should be used only if fileinfo is installed as a shared object / dynamic libary
-* @global string $wgLoadFileinfoExtension
+ * This should be used only if fileinfo is installed as a shared object
+ * or a dynamic libary
+ * @global string $wgLoadFileinfoExtension
*/
$wgLoadFileinfoExtension= false;
-/** Sets an external mime detector program. The command must print only the mime type to standard output.
-* the name of the file to process will be appended to the command given here.
-* If not set or NULL, mime_content_type will be used if available.
+/** Sets an external mime detector program. The command must print only
+ * the mime type to standard output.
+ * The name of the file to process will be appended to the command given here.
+ * If not set or NULL, mime_content_type will be used if available.
*/
$wgMimeDetectorCommand= NULL; # use internal mime_content_type function, available since php 4.3.0
#$wgMimeDetectorCommand= "file -bi"; #use external mime detector (Linux)
-/** Switch for trivial mime detection. Used by thumb.php to disable all fance things,
-* because only a few types of images are needed and file extensions can be trusted.
+/** Switch for trivial mime detection. Used by thumb.php to disable all fance
+ * things, because only a few types of images are needed and file extensions
+ * can be trusted.
*/
$wgTrivialMimeDetection= false;
@@ -424,6 +455,12 @@ $wgEnableEmail = true;
$wgEnableUserEmail = true;
/**
+ * Minimum time, in hours, which must elapse between password reminder
+ * emails for a given account. This is to prevent abuse by mail flooding.
+ */
+$wgPasswordReminderResendTime = 24;
+
+/**
* SMTP Mode
* For using a direct (authenticated) SMTP server connection.
* Default to false or fill an array :
@@ -650,6 +687,15 @@ $wgMimeType = 'text/html';
$wgJsMimeType = 'text/javascript';
$wgDocType = '-//W3C//DTD XHTML 1.0 Transitional//EN';
$wgDTD = 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd';
+$wgXhtmlDefaultNamespace = 'http://www.w3.org/1999/xhtml';
+
+# Permit other namespaces in addition to the w3.org default.
+# Use the prefix for the key and the namespace for the value. For
+# example:
+# $wgXhtmlNamespaces['svg'] = 'http://www.w3.org/2000/svg';
+# Normally we wouldn't have to define this in the root <html>
+# element, but IE needs it there in some circumstances.
+$wgXhtmlNamespaces = array();
/** Enable to allow rewriting dates in page text.
* DOES NOT FORMAT CORRECTLY FOR MOST LANGUAGES */
@@ -664,16 +710,29 @@ $wgAmericanDates = false;
*/
$wgTranslateNumerals = true;
-
-# Translation using MediaWiki: namespace
-# This will increase load times by 25-60% unless memcached is installed
-# Interface messages will be loaded from the database.
+/**
+ * Translation using MediaWiki: namespace.
+ * This will increase load times by 25-60% unless memcached is installed.
+ * Interface messages will be loaded from the database.
+ */
$wgUseDatabaseMessages = true;
+
+/**
+ * Expiry time for the message cache key
+ */
$wgMsgCacheExpiry = 86400;
+/**
+ * Maximum entry size in the message cache, in bytes
+ */
+$wgMaxMsgCacheEntrySize = 10000;
+
# Whether to enable language variant conversion.
$wgDisableLangConversion = false;
+# Default variant code, if false, the default will be the language code
+$wgDefaultLanguageVariant = false;
+
/**
* Show a bar of language selection links in the user login and user
* registration forms; edit the "loginlanguagelinks" message to
@@ -745,7 +804,12 @@ $wgMaxArticleSize = 2048; # Maximum article size in kilobytes
$wgExtraSubtitle = '';
$wgSiteSupportPage = ''; # A page where you users can receive donations
-$wgReadOnlyFile = "{$wgUploadDirectory}/lock_yBgMBwiR";
+/***
+ * If this lock file exists, the wiki will be forced into read-only mode.
+ * Its contents will be shown to users as part of the read-only warning
+ * message.
+ */
+$wgReadOnlyFile = false; /// defaults to "{$wgUploadDirectory}/lock_yBgMBwiR";
/**
* The debug log file should be not be publicly accessible if it is used, as it
@@ -912,6 +976,7 @@ $wgGroupPermissions['emailconfirmed']['emailconfirmed'] = true;
// from various log pages by default
$wgGroupPermissions['bot' ]['bot'] = true;
$wgGroupPermissions['bot' ]['autoconfirmed'] = true;
+$wgGroupPermissions['bot' ]['nominornewtalk'] = true;
// Most extra permission abilities go to this group
$wgGroupPermissions['sysop']['block'] = true;
@@ -923,6 +988,7 @@ $wgGroupPermissions['sysop']['import'] = true;
$wgGroupPermissions['sysop']['importupload'] = true;
$wgGroupPermissions['sysop']['move'] = true;
$wgGroupPermissions['sysop']['patrol'] = true;
+$wgGroupPermissions['sysop']['autopatrol'] = true;
$wgGroupPermissions['sysop']['protect'] = true;
$wgGroupPermissions['sysop']['proxyunbannable'] = true;
$wgGroupPermissions['sysop']['rollback'] = true;
@@ -933,6 +999,7 @@ $wgGroupPermissions['sysop']['reupload-shared'] = true;
$wgGroupPermissions['sysop']['unwatchedpages'] = true;
$wgGroupPermissions['sysop']['autoconfirmed'] = true;
$wgGroupPermissions['sysop']['upload_by_url'] = true;
+$wgGroupPermissions['sysop']['ipblock-exempt'] = true;
// Permission to change users' group assignments
$wgGroupPermissions['bureaucrat']['userrights'] = true;
@@ -950,14 +1017,14 @@ $wgGroupPermissions['bureaucrat']['userrights'] = true;
# $wgGroupPermissions['developer']['siteadmin'] = true;
/**
- * Set of available actions that can be restricted via Special:Protect
+ * Set of available actions that can be restricted via action=protect
* You probably shouldn't change this.
* Translated trough restriction-* messages.
*/
$wgRestrictionTypes = array( 'edit', 'move' );
/**
- * Set of permission keys that can be selected via Special:Protect.
+ * Set of permission keys that can be selected via action=protect.
* 'autoconfirm' allows all registerd users if $wgAutoConfirmAge is 0.
*/
$wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' );
@@ -996,7 +1063,7 @@ $wgBlockOpenProxies = false;
/** Port we want to scan for a proxy */
$wgProxyPorts = array( 80, 81, 1080, 3128, 6588, 8000, 8080, 8888, 65506 );
/** Script used to scan */
-$wgProxyScriptPath = "$IP/proxy_check.php";
+$wgProxyScriptPath = "$IP/includes/proxy_check.php";
/** */
$wgProxyMemcExpiry = 86400;
/** This should always be customised in LocalSettings.php */
@@ -1023,6 +1090,14 @@ $wgCachePages = true;
*/
$wgCacheEpoch = '20030516000000';
+/**
+ * Bump this number when changing the global style sheets and JavaScript.
+ * It should be appended in the query string of static CSS and JS includes,
+ * to ensure that client-side caches don't keep obsolete copies of global
+ * styles.
+ */
+$wgStyleVersion = '42';
+
# Server-side caching:
@@ -1032,8 +1107,9 @@ $wgCacheEpoch = '20030516000000';
* Must set $wgShowIPinHeader = false
*/
$wgUseFileCache = false;
+
/** Directory where the cached page will be saved */
-$wgFileCacheDirectory = "{$wgUploadDirectory}/cache";
+$wgFileCacheDirectory = false; /// defaults to "{$wgUploadDirectory}/cache";
/**
* When using the file cache, we can store the cached HTML gzipped to save disk
@@ -1069,11 +1145,20 @@ $wgEnotifRevealEditorAddress = false; # UPO; reply-to address may be filled with
$wgEnotifMinorEdits = true; # UPO; false: "minor edits" on pages do not trigger notification mails.
# # Attention: _every_ change on a user_talk page trigger a notification mail (if the user is not yet notified)
-
/** Show watching users in recent changes, watchlist and page history views */
$wgRCShowWatchingUsers = false; # UPO
/** Show watching users in Page views */
$wgPageShowWatchingUsers = false;
+/** Show the amount of changed characters in recent changes */
+$wgRCShowChangedSize = true;
+
+/**
+ * If the difference between the character counts of the text
+ * before and after the edit is below that value, the value will be
+ * highlighted on the RC page.
+ */
+$wgRCChangedSizeThreshold = -500;
+
/**
* Show "Updated (since my last visit)" marker in RC view, watchlist and history
* view for watched pages with new changes */
@@ -1124,6 +1209,7 @@ $wgMaxSquidPurgeTitles = 400;
$wgHTCPPort = 4827;
$wgHTCPMulticastTTL = 1;
# $wgHTCPMulticastAddress = "224.0.0.85";
+$wgHTCPMulticastAddress = false;
# Cookie settings:
#
@@ -1155,10 +1241,8 @@ $wgAllowExternalImagesFrom = '';
$wgMiserMode = false;
/** Disable all query pages if miser mode is on, not just some */
$wgDisableQueryPages = false;
-/** Generate a watchlist once every hour or so */
-$wgUseWatchlistCache = false;
-/** The hour or so mentioned above */
-$wgWLCacheTimeout = 3600;
+/** Number of rows to cache in 'querycache' table when miser mode is on */
+$wgQueryCacheLimit = 1000;
/** Number of links to a page required before it is deemed "wanted" */
$wgWantedPagesThreshold = 1;
/** Enable slow parser functions */
@@ -1425,7 +1509,7 @@ if( !isset( $wgCommandLineMode ) ) {
# Recent changes settings
#
-/** Log IP addresses in the recentchanges table */
+/** Log IP addresses in the recentchanges table; can be accessed only by extensions (e.g. CheckUser) or a DB admin */
$wgPutIPinRC = true;
/**
@@ -1999,8 +2083,11 @@ $wgNoFollowLinks = true;
$wgNoFollowNsExceptions = array();
/**
- * Robot policies for namespaces
- * e.g. $wgNamespaceRobotPolicies = array( NS_TALK => 'noindex' );
+ * Robot policies per namespaces.
+ * The default policy is 'index,follow', the array is made of namespace
+ * constants as defined in includes/Defines.php
+ * Example:
+ * $wgNamespaceRobotPolicies = array( NS_TALK => 'noindex' );
*/
$wgNamespaceRobotPolicies = array();
@@ -2043,6 +2130,7 @@ $wgDisableHardRedirects = false;
* Use http.dnsbl.sorbs.net to check for open proxies
*/
$wgEnableSorbs = false;
+$wgSorbsUrl = 'http.dnsbl.sorbs.net.';
/**
* Proxy whitelist, list of addresses that are assumed to be non-proxy despite what the other
@@ -2224,6 +2312,13 @@ $wgAjaxSearch = false;
$wgAjaxExportList = array( );
/**
+ * Enable watching/unwatching pages using AJAX.
+ * Requires $wgUseAjax to be true too.
+ * Causes wfAjaxWatch to be added to $wgAjaxExportList
+ */
+$wgAjaxWatch = false;
+
+/**
* Allow DISPLAYTITLE to change title display
*/
$wgAllowDisplayTitle = false ;
@@ -2232,7 +2327,12 @@ $wgAllowDisplayTitle = false ;
* Array of usernames which may not be registered or logged in from
* Maintenance scripts can still use these
*/
-$wgReservedUsernames = array( 'MediaWiki default', 'Conversion script' );
+$wgReservedUsernames = array(
+ 'MediaWiki default', // Default 'Main Page' and MediaWiki: message pages
+ 'Conversion script', // Used for the old Wikipedia software upgrade
+ 'Maintenance script', // ... maintenance/edit.php uses this?
+ 'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
+);
/**
* MediaWiki will reject HTMLesque tags in uploaded files due to idiotic browsers which can't
@@ -2288,7 +2388,32 @@ $wgDjvuPostProcessor = 'ppmtojpeg';
* Enable direct access to the data API
* through api.php
*/
-$wgEnableAPI = false;
+$wgEnableAPI = true;
$wgEnableWriteAPI = false;
+/**
+ * Parser test suite files to be run by parserTests.php when no specific
+ * filename is passed to it.
+ *
+ * Extensions may add their own tests to this array, or site-local tests
+ * may be added via LocalSettings.php
+ *
+ * Use full paths.
+ */
+$wgParserTestFiles = array(
+ "$IP/maintenance/parserTests.txt",
+);
+
+/**
+ * Break out of framesets. This can be used to prevent external sites from
+ * framing your site with ads.
+ */
+$wgBreakFrames = false;
+
+/**
+ * Set this to an array of special page names to prevent
+ * maintenance/updateSpecialPages.php from updating those pages.
+ */
+$wgDisableQueryPageUpdate = false;
+
?>
diff --git a/includes/Defines.php b/includes/Defines.php
index 40727485..84bc4495 100644
--- a/includes/Defines.php
+++ b/includes/Defines.php
@@ -193,6 +193,7 @@ define( 'EDIT_MINOR', 4 );
define( 'EDIT_SUPPRESS_RC', 8 );
define( 'EDIT_FORCE_BOT', 16 );
define( 'EDIT_DEFER_UPDATES', 32 );
+define( 'EDIT_AUTOSUMMARY', 64 );
/**#@-*/
/**
diff --git a/includes/DifferenceEngine.php b/includes/DifferenceEngine.php
index 448bcb5d..a72f0153 100644
--- a/includes/DifferenceEngine.php
+++ b/includes/DifferenceEngine.php
@@ -97,12 +97,10 @@ CONTROL;
return;
}
- $t = $this->mTitle->getPrefixedText() . " (Diff: {$this->mOldid}, " .
- "{$this->mNewid})";
- $mtext = wfMsg( 'missingarticle', "<nowiki>$t</nowiki>" );
-
$wgOut->setArticleFlag( false );
if ( ! $this->loadRevisionData() ) {
+ $t = $this->mTitle->getPrefixedText() . " (Diff: {$this->mOldid}, {$this->mNewid})";
+ $mtext = wfMsg( 'missingarticle', "<nowiki>$t</nowiki>" );
$wgOut->setPagetitle( wfMsg( 'errorpagetitle' ) );
$wgOut->addWikitext( $mtext );
wfProfileOut( $fname );
@@ -144,15 +142,9 @@ CONTROL;
}
$sk = $wgUser->getSkin();
- $talk = $wgContLang->getNsText( NS_TALK );
- $contribs = wfMsg( 'contribslink' );
if ( $this->mNewRev->isCurrent() && $wgUser->isAllowed('rollback') ) {
- $username = $this->mNewRev->getUserText();
- $rollback = '&nbsp;&nbsp;&nbsp;<strong>[' . $sk->makeKnownLinkObj( $this->mTitle, wfMsg( 'rollbacklink' ),
- 'action=rollback&from=' . urlencode( $username ) .
- '&token=' . urlencode( $wgUser->editToken( array( $this->mTitle->getPrefixedText(), $username ) ) ) ) .
- ']</strong>';
+ $rollback = '&nbsp;&nbsp;&nbsp;' . $sk->generateRollback( $this->mNewRev );
} else {
$rollback = '';
}
@@ -171,13 +163,26 @@ CONTROL;
'diff=next&oldid='.$this->mNewid, '', '', 'id="differences-nextlink"' );
}
+ $oldminor = '';
+ $newminor = '';
+
+ if ($this->mOldRev->mMinorEdit == 1) {
+ $oldminor = wfElement( 'span', array( 'class' => 'minor' ),
+ wfMsg( 'minoreditletter') ) . ' ';
+ }
+
+ if ($this->mNewRev->mMinorEdit == 1) {
+ $newminor = wfElement( 'span', array( 'class' => 'minor' ),
+ wfMsg( 'minoreditletter') ) . ' ';
+ }
+
$oldHeader = "<strong>{$this->mOldtitle}</strong><br />" .
$sk->revUserTools( $this->mOldRev ) . "<br />" .
- $sk->revComment( $this->mOldRev ) . "<br />" .
+ $oldminor . $sk->revComment( $this->mOldRev, true ) . "<br />" .
$prevlink;
$newHeader = "<strong>{$this->mNewtitle}</strong><br />" .
$sk->revUserTools( $this->mNewRev ) . " $rollback<br />" .
- $sk->revComment( $this->mNewRev ) . "<br />" .
+ $newminor . $sk->revComment( $this->mNewRev, true ) . "<br />" .
$nextlink . $patrol;
$this->showDiff( $oldHeader, $newHeader );
@@ -287,7 +292,8 @@ CONTROL;
if ( $body === false ) {
return false;
} else {
- return $this->addHeader( $body, $otitle, $ntitle );
+ $multi = $this->getMultiNotice();
+ return $this->addHeader( $body, $otitle, $ntitle, $multi );
}
}
@@ -426,20 +432,49 @@ CONTROL;
return wfMsgExt( 'lineno', array('parseinline'), $wgLang->formatNum( $matches[1] ) );
}
+
+ /**
+ * If there are revisions between the ones being compared, return a note saying so.
+ */
+ function getMultiNotice() {
+ if ( !is_object($this->mOldRev) || !is_object($this->mNewRev) )
+ return '';
+
+ if( !$this->mOldPage->equals( $this->mNewPage ) ) {
+ // Comparing two different pages? Count would be meaningless.
+ return '';
+ }
+
+ $oldid = $this->mOldRev->getId();
+ $newid = $this->mNewRev->getId();
+ if ( $oldid > $newid ) {
+ $tmp = $oldid; $oldid = $newid; $newid = $tmp;
+ }
+
+ $n = $this->mTitle->countRevisionsBetween( $oldid, $newid );
+ if ( !$n )
+ return '';
+
+ return wfMsgExt( 'diff-multi', array( 'parseinline' ), $n );
+ }
+
+
/**
* Add the header to a diff body
*/
- function addHeader( $diff, $otitle, $ntitle ) {
- $out = "
+ function addHeader( $diff, $otitle, $ntitle, $multi = '' ) {
+ $header = "
<table border='0' width='98%' cellpadding='0' cellspacing='4' class='diff'>
<tr>
<td colspan='2' width='50%' align='center' class='diff-otitle'>{$otitle}</td>
<td colspan='2' width='50%' align='center' class='diff-ntitle'>{$ntitle}</td>
</tr>
- $diff
- </table>
";
- return $out;
+
+ if ( $multi != '' )
+ $header .= "<tr><td colspan='4' align='center' class='diff-multi'>{$multi}</td></tr>";
+
+ return $header . $diff . "</table>";
}
/**
@@ -488,17 +523,21 @@ CONTROL;
$newLink = $this->mNewPage->escapeLocalUrl();
$this->mPagetitle = htmlspecialchars( wfMsg( 'currentrev' ) );
$newEdit = $this->mNewPage->escapeLocalUrl( 'action=edit' );
-
- $this->mNewtitle = "<strong><a href='$newLink'>{$this->mPagetitle}</a> ($timestamp)</strong>"
- . " (<a href='$newEdit'>" . htmlspecialchars( wfMsg( 'editold' ) ) . "</a>)";
+ $newUndo = $this->mNewPage->escapeLocalUrl( 'action=edit&undo=' . $this->mNewid );
+
+ $this->mNewtitle = "<a href='$newLink'>{$this->mPagetitle}</a> ($timestamp)"
+ . " (<a href='$newEdit'>" . htmlspecialchars( wfMsg( 'editold' ) ) . "</a>)"
+ . " (<a href='$newUndo'>" . htmlspecialchars( wfMsg( 'editundo' ) ) . "</a>)";
} else {
$newLink = $this->mNewPage->escapeLocalUrl( 'oldid=' . $this->mNewid );
$newEdit = $this->mNewPage->escapeLocalUrl( 'action=edit&oldid=' . $this->mNewid );
+ $newUndo = $this->mNewPage->escapeLocalUrl( 'action=edit&undo=' . $this->mNewid );
$this->mPagetitle = htmlspecialchars( wfMsg( 'revisionasof', $timestamp ) );
-
- $this->mNewtitle = "<strong><a href='$newLink'>{$this->mPagetitle}</a></strong>"
- . " (<a href='$newEdit'>" . htmlspecialchars( wfMsg( 'editold' ) ) . "</a>)";
+
+ $this->mNewtitle = "<a href='$newLink'>{$this->mPagetitle}</a>"
+ . " (<a href='$newEdit'>" . htmlspecialchars( wfMsg( 'editold' ) ) . "</a>)"
+ . " (<a href='$newUndo'>" . htmlspecialchars( wfMsg( 'editundo' ) ) . "</a>)";
}
// Load the old revision object
@@ -527,8 +566,8 @@ CONTROL;
$t = $wgLang->timeanddate( $this->mOldRev->getTimestamp(), true );
$oldLink = $this->mOldPage->escapeLocalUrl( 'oldid=' . $this->mOldid );
$oldEdit = $this->mOldPage->escapeLocalUrl( 'action=edit&oldid=' . $this->mOldid );
- $this->mOldtitle = "<strong><a href='$oldLink'>" . htmlspecialchars( wfMsg( 'revisionasof', $t ) )
- . "</a></strong> (<a href='$oldEdit'>" . htmlspecialchars( wfMsg( 'editold' ) ) . "</a>)";
+ $this->mOldtitle = "<a href='$oldLink'>" . htmlspecialchars( wfMsg( 'revisionasof', $t ) )
+ . "</a> (<a href='$oldEdit'>" . htmlspecialchars( wfMsg( 'editold' ) ) . "</a>)";
}
return true;
@@ -890,7 +929,7 @@ class _DiffEngine
$ymids[$k] = $ymids[$k-1];
break;
}
- while (list ($junk, $y) = each($matches)) {
+ while (list ( /* $junk */, $y) = each($matches)) {
if ($y > $this->seq[$k-1]) {
USE_ASSERTS && assert($y < $this->seq[$k]);
// Optimization: this is a common case:
@@ -1608,6 +1647,7 @@ class WordLevelDiff extends MappedDiff
$words[] = $line;
$stripped[] = $line;
} else {
+ $m = array();
if (preg_match_all('/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs',
$line, $m))
{
diff --git a/includes/DjVuImage.php b/includes/DjVuImage.php
index 871c563b..f7297dc2 100644
--- a/includes/DjVuImage.php
+++ b/includes/DjVuImage.php
@@ -217,7 +217,7 @@ class DjVuImage {
global $wgDjvuToXML;
if ( isset( $wgDjvuToXML ) ) {
$cmd = $wgDjvuToXML . ' --without-anno --without-text ' . $this->mFilename;
- $xml = wfShellExec( $cmd, $retval );
+ $xml = wfShellExec( $cmd );
} else {
$xml = null;
}
diff --git a/includes/EditPage.php b/includes/EditPage.php
index a1207d10..c53389cc 100644
--- a/includes/EditPage.php
+++ b/includes/EditPage.php
@@ -32,6 +32,7 @@ class EditPage {
var $allowBlankSummary = false;
var $autoSumm = '';
var $hookError = '';
+ var $mPreviewTemplates;
# Form values
var $save = false, $preview = false, $diff = false;
@@ -40,6 +41,14 @@ class EditPage {
var $edittime = '', $section = '', $starttime = '';
var $oldid = 0, $editintro = '', $scrolltop = null;
+ # Placeholders for text injection by hooks (must be HTML)
+ # extensions should take care to _append_ to the present value
+ public $editFormPageTop; // Before even the preview
+ public $editFormTextTop;
+ public $editFormTextAfterWarn;
+ public $editFormTextAfterTools;
+ public $editFormTextBottom;
+
/**
* @todo document
* @param $article
@@ -48,17 +57,25 @@ class EditPage {
$this->mArticle =& $article;
global $wgTitle;
$this->mTitle =& $wgTitle;
+
+ # Placeholders for text injection by hooks (empty per default)
+ $this->editFormPageTop =
+ $this->editFormTextTop =
+ $this->editFormTextAfterWarn =
+ $this->editFormTextAfterTools =
+ $this->editFormTextBottom = "";
}
/**
* Fetch initial editing page content.
*/
private function getContent() {
- global $wgRequest, $wgParser;
+ global $wgOut, $wgRequest, $wgParser;
# Get variables from query string :P
$section = $wgRequest->getVal( 'section' );
$preload = $wgRequest->getVal( 'preload' );
+ $undo = $wgRequest->getVal( 'undo' );
wfProfileIn( __METHOD__ );
@@ -79,8 +96,41 @@ class EditPage {
// information.
$text = $this->mArticle->getContent();
-
- if( $section != '' ) {
+
+ if ( $undo > 0 ) {
+ #Undoing a specific edit overrides section editing; section-editing
+ # doesn't work with undoing.
+ $undorev = Revision::newFromId($undo);
+
+ #Sanity check, make sure it's the right page.
+ # Otherwise, $text will be left as-is.
+ if (!is_null($undorev) && $undorev->getPage() == $this->mArticle->getID()) {
+ $oldrev = $undorev->getPrevious();
+ $undorev_text = $undorev->getText();
+ $oldrev_text = $oldrev->getText();
+ $currev_text = $text;
+
+ #No use doing a merge if it's just a straight revert.
+ if ($currev_text != $undorev_text) {
+ $result = wfMerge($undorev_text, $oldrev_text, $currev_text, $text);
+ } else {
+ $text = $oldrev_text;
+ $result = true;
+ }
+
+ if( $result ) {
+ # Inform the user of our success and set an automatic edit summary
+ $this->editFormPageTop .= $wgOut->parse( wfMsgNoTrans( 'undo-success' ) );
+ $this->summary = wfMsgForContent( 'undo-summary', $undo, $undorev->getUserText() );
+ $this->formtype = 'diff';
+ } else {
+ # Warn the user that something went wrong
+ $this->editFormPageTop .= $wgOut->parse( wfMsgNoTrans( 'undo-failure' ) );
+ }
+
+ }
+ }
+ else if( $section != '' ) {
if( $section == 'new' ) {
$text = $this->getPreloadedText( $preload );
} else {
@@ -439,6 +489,9 @@ class EditPage {
# The unmarked state will be assumed to be a save,
# if the form seems otherwise complete.
wfDebug( "$fname: Passed token check.\n" );
+ } else if ( $this->diff ) {
+ # Failed token check, but only requested "Show Changes".
+ wfDebug( "$fname: Failed token check; Show Changes requested.\n" );
} else {
# Page might be a hack attempt posted from
# an external site. Preview instead of saving.
@@ -507,8 +560,8 @@ class EditPage {
global $wgUser;
if( $wgUser->isAnon() ) {
# Anonymous users may not have a session
- # open. Don't tokenize.
- $this->mTokenOk = true;
+ # open. Check for suffix anyway.
+ $this->mTokenOk = ( EDIT_TOKEN_SUFFIX == $request->getVal( 'wpEditToken' ) );
} else {
$this->mTokenOk = $wgUser->matchEditToken( $request->getVal( 'wpEditToken' ) );
}
@@ -549,11 +602,18 @@ class EditPage {
wfProfileIn( $fname );
wfProfileIn( "$fname-checks" );
+ if( !wfRunHooks( 'EditPage::attemptSave', array( &$this ) ) )
+ {
+ wfDebug( "Hook 'EditPage::attemptSave' aborted article saving" );
+ return false;
+ }
+
# Reintegrate metadata
if ( $this->mMetaData != '' ) $this->textbox1 .= "\n" . $this->mMetaData ;
$this->mMetaData = '' ;
# Check for spam
+ $matches = array();
if ( $wgSpamRegex && preg_match( $wgSpamRegex, $this->textbox1, $matches ) ) {
$this->spamPage ( $matches[0] );
wfProfileOut( "$fname-checks" );
@@ -634,6 +694,7 @@ class EditPage {
# If article is new, insert it.
$aid = $this->mTitle->getArticleID( GAID_FOR_UPDATE );
if ( 0 == $aid ) {
+
// Late check for create permission, just in case *PARANOIA*
if ( !$this->mTitle->userCanCreate() ) {
wfDebug( "$fname: no create permission\n" );
@@ -649,14 +710,6 @@ class EditPage {
return false;
}
- # If no edit comment was given when creating a new page, and what's being
- # created is a redirect, be smart and fill in a neat auto-comment
- if( $this->summary == '' ) {
- $rt = Title::newFromRedirect( $this->textbox1 );
- if( is_object( $rt ) )
- $this->summary = wfMsgForContent( 'autoredircomment', $rt->getPrefixedText() );
- }
-
$isComment=($this->section=='new');
$this->mArticle->insertNewArticle( $this->textbox1, $this->summary,
$this->minoredit, $this->watchthis, false, $isComment);
@@ -728,16 +781,11 @@ class EditPage {
return true;
}
- # If no edit comment was given when turning a page into a redirect, be smart
- # and fill in a neat auto-comment
- if( $this->summary == '' ) {
- $rt = Title::newFromRedirect( $this->textbox1 );
- if( is_object( $rt ) )
- $this->summary = wfMsgForContent( 'autoredircomment', $rt->getPrefixedText() );
- }
+ $oldtext = $this->mArticle->getContent();
- # Handle the user preference to force summaries here
- if( $this->section != 'new' && !$this->allowBlankSummary && $wgUser->getOption( 'forceeditsummary' ) ) {
+ # Handle the user preference to force summaries here, but not for null edits
+ if( $this->section != 'new' && !$this->allowBlankSummary && $wgUser->getOption( 'forceeditsummary')
+ && 0 != strcmp($oldtext, $text) && !Article::getRedirectAutosummary( $text )) {
if( md5( $this->summary ) == $this->autoSumm ) {
$this->missingSummary = true;
wfProfileOut( $fname );
@@ -745,6 +793,15 @@ class EditPage {
}
}
+ #And a similar thing for new sections
+ if( $this->section == 'new' && !$this->allowBlankSummary && $wgUser->getOption( 'forceeditsummary' ) ) {
+ if (trim($this->summary) == '') {
+ $this->missingSummary = true;
+ wfProfileOut( $fname );
+ return( true );
+ }
+ }
+
# All's well
wfProfileIn( "$fname-sectionanchor" );
$sectionanchor = '';
@@ -802,8 +859,8 @@ class EditPage {
*/
function initialiseForm() {
$this->edittime = $this->mArticle->getTimestamp();
- $this->textbox1 = $this->getContent();
$this->summary = '';
+ $this->textbox1 = $this->getContent();
if ( !$this->mArticle->exists() && $this->mArticle->mTitle->getNamespace() == NS_MEDIAWIKI )
$this->textbox1 = wfMsgWeirdKey( $this->mArticle->mTitle->getText() ) ;
wfProxyCheck();
@@ -845,6 +902,7 @@ class EditPage {
$s = wfMsg('editingcomment', $this->mTitle->getPrefixedText() );
} else {
$s = wfMsg('editingsection', $this->mTitle->getPrefixedText() );
+ $matches = array();
if( !$this->summary && !$this->preview && !$this->diff ) {
preg_match( "/^(=+)(.+)\\1/mi",
$this->textbox1,
@@ -863,9 +921,13 @@ class EditPage {
$wgOut->addWikiText( wfMsg( 'missingcommenttext' ) );
}
- if( $this->missingSummary ) {
+ if( $this->missingSummary && $this->section != 'new' ) {
$wgOut->addWikiText( wfMsg( 'missingsummary' ) );
}
+
+ if( $this->missingSummary && $this->section == 'new' ) {
+ $wgOut->addWikiText( wfMsg( 'missingcommentheader' ) );
+ }
if( !$this->hookError == '' ) {
$wgOut->addWikiText( $this->hookError );
@@ -924,6 +986,12 @@ class EditPage {
$wgOut->addWikiText( wfMsg( 'longpagewarning', $wgLang->formatNum( $this->kblength ) ) );
}
+ #need to parse the preview early so that we know which templates are used,
+ #otherwise users with "show preview after edit box" will get a blank list
+ if ( $this->formtype == 'preview' ) {
+ $previewOutput = $this->getPreviewText();
+ }
+
$rows = $wgUser->getIntOption( 'rows' );
$cols = $wgUser->getIntOption( 'cols' );
@@ -998,10 +1066,12 @@ class EditPage {
$checkboxhtml = $minoredithtml . $watchhtml;
+ $wgOut->addHTML( $this->editFormPageTop );
+
if ( $wgUser->getOption( 'previewontop' ) ) {
if ( 'preview' == $this->formtype ) {
- $this->showPreview();
+ $this->showPreview( $previewOutput );
} else {
$wgOut->addHTML( '<div id="wikiPreview"></div>' );
}
@@ -1012,22 +1082,29 @@ class EditPage {
}
+ $wgOut->addHTML( $this->editFormTextTop );
+
# if this is a comment, show a subject line at the top, which is also the edit summary.
# Otherwise, show a summary field at the bottom
$summarytext = htmlspecialchars( $wgContLang->recodeForEdit( $this->summary ) ); # FIXME
if( $this->section == 'new' ) {
$commentsubject="<span id='wpSummaryLabel'><label for='wpSummary'>{$subject}:</label></span>\n<div class='editOptions'>\n<input tabindex='1' type='text' value=\"$summarytext\" name='wpSummary' id='wpSummary' maxlength='200' size='60' /><br />";
$editsummary = '';
+ $subjectpreview = $summarytext && $this->preview ? "<div class=\"mw-summary-preview\">".wfMsg('subject-preview').':'.$sk->commentBlock( $this->summary, $this->mTitle )."</div>\n" : '';
+ $summarypreview = '';
} else {
$commentsubject = '';
$editsummary="<span id='wpSummaryLabel'><label for='wpSummary'>{$summary}:</label></span>\n<div class='editOptions'>\n<input tabindex='2' type='text' value=\"$summarytext\" name='wpSummary' id='wpSummary' maxlength='200' size='60' /><br />";
+ $summarypreview = $summarytext && $this->preview ? "<div class=\"mw-summary-preview\">".wfMsg('summary-preview').':'.$sk->commentBlock( $this->summary, $this->mTitle )."</div>\n" : '';
+ $subjectpreview = '';
}
# Set focus to the edit box on load, except on preview or diff, where it would interfere with the display
if( !$this->preview && !$this->diff ) {
$wgOut->setOnloadHandler( 'document.editform.wpTextbox1.focus()' );
}
- $templates = $this->formatTemplates();
+ $templates = ($this->preview || $this->section) ? $this->mPreviewTemplates : $this->mArticle->getUsedTemplates();
+ $formattedtemplates = $sk->formatTemplates( $templates, $this->preview, $this->section != '');
global $wgUseMetadataEdit ;
if ( $wgUseMetadataEdit ) {
@@ -1138,6 +1215,7 @@ END
$wgOut->addHTML( <<<END
$recreate
{$commentsubject}
+{$subjectpreview}
<textarea tabindex='1' accesskey="," name="wpTextbox1" id="wpTextbox1" rows='{$rows}'
cols='{$cols}'{$ew} $hidden>
END
@@ -1147,9 +1225,11 @@ END
" );
$wgOut->addWikiText( $copywarn );
+ $wgOut->addHTML( $this->editFormTextAfterWarn );
$wgOut->addHTML( "
{$metadata}
{$editsummary}
+{$summarypreview}
{$checkboxhtml}
{$safemodehtml}
");
@@ -1164,26 +1244,36 @@ END
</div><!-- editButtons -->
</div><!-- editOptions -->");
+ $wgOut->addHtml( '<div class="mw-editTools">' );
$wgOut->addWikiText( wfMsgForContent( 'edittools' ) );
+ $wgOut->addHtml( '</div>' );
+
+ $wgOut->addHTML( $this->editFormTextAfterTools );
$wgOut->addHTML( "
<div class='templatesUsed'>
-{$templates}
+{$formattedtemplates}
</div>
" );
- if ( $wgUser->isLoggedIn() ) {
- /**
- * To make it harder for someone to slip a user a page
- * which submits an edit form to the wiki without their
- * knowledge, a random token is associated with the login
- * session. If it's not passed back with the submission,
- * we won't save the page, or render user JavaScript and
- * CSS previews.
- */
+ /**
+ * To make it harder for someone to slip a user a page
+ * which submits an edit form to the wiki without their
+ * knowledge, a random token is associated with the login
+ * session. If it's not passed back with the submission,
+ * we won't save the page, or render user JavaScript and
+ * CSS previews.
+ *
+ * For anon editors, who may not have a session, we just
+ * include the constant suffix to prevent editing from
+ * broken text-mangling proxies.
+ */
+ if ( $wgUser->isLoggedIn() )
$token = htmlspecialchars( $wgUser->editToken() );
- $wgOut->addHTML( "\n<input type='hidden' value=\"$token\" name=\"wpEditToken\" />\n" );
- }
+ else
+ $token = EDIT_TOKEN_SUFFIX;
+ $wgOut->addHTML( "\n<input type='hidden' value=\"$token\" name=\"wpEditToken\" />\n" );
+
# If a blank edit summary was previously provided, and the appropriate
# user preference is active, pass a hidden tag here. This will stop the
@@ -1209,11 +1299,12 @@ END
$wgOut->addHTML( "<textarea tabindex=6 id='wpTextbox2' name=\"wpTextbox2\" rows='{$rows}' cols='{$cols}' wrap='virtual'>"
. htmlspecialchars( $this->safeUnicodeOutput( $this->textbox2 ) ) . "\n</textarea>" );
}
+ $wgOut->addHTML( $this->editFormTextBottom );
$wgOut->addHTML( "</form>\n" );
if ( !$wgUser->getOption( 'previewontop' ) ) {
if ( $this->formtype == 'preview') {
- $this->showPreview();
+ $this->showPreview( $previewOutput );
} else {
$wgOut->addHTML( '<div id="wikiPreview"></div>' );
}
@@ -1230,56 +1321,24 @@ END
/**
* Append preview output to $wgOut.
* Includes category rendering if this is a category page.
- * @private
+ *
+ * @param string $text The HTML to be output for the preview.
*/
- function showPreview() {
+ private function showPreview( $text ) {
global $wgOut;
+
$wgOut->addHTML( '<div id="wikiPreview">' );
if($this->mTitle->getNamespace() == NS_CATEGORY) {
$this->mArticle->openShowCategory();
}
- $previewOutput = $this->getPreviewText();
- $wgOut->addHTML( $previewOutput );
+ $wgOut->addHTML( $text );
if($this->mTitle->getNamespace() == NS_CATEGORY) {
$this->mArticle->closeShowCategory();
}
- $wgOut->addHTML( "<br style=\"clear:both;\" />\n" );
$wgOut->addHTML( '</div>' );
}
/**
- * Prepare a list of templates used by this page. Returns HTML.
- */
- function formatTemplates() {
- global $wgUser;
-
- $fname = 'EditPage::formatTemplates';
- wfProfileIn( $fname );
-
- $sk =& $wgUser->getSkin();
-
- $outText = '';
- $templates = $this->mArticle->getUsedTemplates();
- if ( count( $templates ) > 0 ) {
- # Do a batch existence check
- $batch = new LinkBatch;
- foreach( $templates as $title ) {
- $batch->addObj( $title );
- }
- $batch->execute();
-
- # Construct the HTML
- $outText = '<br />'. wfMsgExt( 'templatesused', array( 'parseinline' ) ) . '<ul>';
- foreach ( $templates as $titleObj ) {
- $outText .= '<li>' . $sk->makeLinkObj( $titleObj ) . '</li>';
- }
- $outText .= '</ul>';
- }
- wfProfileOut( $fname );
- return $outText;
- }
-
- /**
* Live Preview lets us fetch rendered preview page content and
* add it to the page without refreshing the whole page.
* If not supported by the browser it will fall through to the normal form
@@ -1290,9 +1349,9 @@ END
* of the preview button
*/
function doLivePreviewScript() {
- global $wgStylePath, $wgJsMimeType, $wgOut, $wgTitle;
+ global $wgStylePath, $wgJsMimeType, $wgStyleVersion, $wgOut, $wgTitle;
$wgOut->addHTML( '<script type="'.$wgJsMimeType.'" src="' .
- htmlspecialchars( $wgStylePath . '/common/preview.js' ) .
+ htmlspecialchars( "$wgStylePath/common/preview.js?$wgStyleVersion" ) .
'"></script>' . "\n" );
$liveAction = $wgTitle->getLocalUrl( 'action=submit&wpPreview=true&live=true' );
return "return !livePreview(" .
@@ -1395,6 +1454,10 @@ END
$previewHTML = $parserOutput->getText();
$wgOut->addParserOutputNoText( $parserOutput );
+ foreach ( $parserOutput->getTemplates() as $ns => $template)
+ foreach ( array_keys( $template ) as $dbk)
+ $this->mPreviewTemplates[] = Title::makeTitle($ns, $dbk);
+
wfProfileOut( $fname );
return $previewhead . $previewHTML;
}
@@ -1434,7 +1497,7 @@ END
global $wgUser, $wgOut;
$skin = $wgUser->getSkin();
- $loginTitle = Title::makeTitle( NS_SPECIAL, 'Userlogin' );
+ $loginTitle = SpecialPage::getTitleFor( 'Userlogin' );
$loginLink = $skin->makeKnownLinkObj( $loginTitle, wfMsgHtml( 'loginreqlink' ), 'returnto=' . $this->mTitle->getPrefixedUrl() );
$wgOut->setPageTitle( wfMsg( 'whitelistedittitle' ) );
@@ -1508,6 +1571,7 @@ END
}
$currentText = $currentRevision->getText();
+ $result = '';
if( wfMerge( $baseText, $editText, $currentText, $result ) ){
$editText = $result;
wfProfileOut( $fname );
@@ -1583,15 +1647,15 @@ END
*/
$toolarray=array(
array( 'image'=>'button_bold.png',
- 'open' => "\'\'\'",
- 'close' => "\'\'\'",
+ 'open' => '\\\'\\\'\\\'',
+ 'close' => '\\\'\\\'\\\'',
'sample'=> wfMsg('bold_sample'),
'tip' => wfMsg('bold_tip'),
'key' => 'B'
),
array( 'image'=>'button_italic.png',
- 'open' => "\'\'",
- 'close' => "\'\'",
+ 'open' => '\\\'\\\'',
+ 'close' => '\\\'\\\'',
'sample'=> wfMsg('italic_sample'),
'tip' => wfMsg('italic_tip'),
'key' => 'I'
diff --git a/includes/Exception.php b/includes/Exception.php
index 56f18d5a..ac9c8a21 100644
--- a/includes/Exception.php
+++ b/includes/Exception.php
@@ -165,7 +165,7 @@ function wfInstallExceptionHandler() {
* Report an exception to the user
*/
function wfReportException( Exception $e ) {
- if ( is_a( $e, 'MWException' ) ) {
+ if ( $e instanceof MWException ) {
try {
$e->report();
} catch ( Exception $e2 ) {
diff --git a/includes/Exif.php b/includes/Exif.php
index 2ab0feb1..0860d5f7 100644
--- a/includes/Exif.php
+++ b/includes/Exif.php
@@ -439,7 +439,7 @@ class Exif {
return false;
}
- if ( preg_match( "/^\s*$/", $in ) ) {
+ if ( preg_match( '/^\s*$/', $in ) ) {
$this->debug( $in, __FUNCTION__, 'input consisted solely of whitespace' );
return false;
}
@@ -468,7 +468,8 @@ class Exif {
}
function isRational( $in ) {
- if ( !is_array( $in ) && @preg_match( "/^(\d+)\/(\d+[1-9]|[1-9]\d*)$/", $in, $m ) ) { # Avoid division by zero
+ $m = array();
+ if ( !is_array( $in ) && @preg_match( '/^(\d+)\/(\d+[1-9]|[1-9]\d*)$/', $in, $m ) ) { # Avoid division by zero
return $this->isLong( $m[1] ) && $this->isLong( $m[2] );
} else {
$this->debug( $in, __FUNCTION__, 'fed a non-fraction value' );
@@ -477,7 +478,7 @@ class Exif {
}
function isUndefined( $in ) {
- if ( !is_array( $in ) && preg_match( "/^\d{4}$/", $in ) ) { // Allow ExifVersion and FlashpixVersion
+ if ( !is_array( $in ) && preg_match( '/^\d{4}$/', $in ) ) { // Allow ExifVersion and FlashpixVersion
$this->debug( $in, __FUNCTION__, true );
return true;
} else {
@@ -497,7 +498,8 @@ class Exif {
}
function isSrational( $in ) {
- if ( !is_array( $in ) && preg_match( "/^(\d+)\/(\d+[1-9]|[1-9]\d*)$/", $in, $m ) ) { # Avoid division by zero
+ $m = array();
+ if ( !is_array( $in ) && preg_match( '/^(\d+)\/(\d+[1-9]|[1-9]\d*)$/', $in, $m ) ) { # Avoid division by zero
return $this->isSlong( $m[0] ) && $this->isSlong( $m[1] );
} else {
$this->debug( $in, __FUNCTION__, 'fed a non-fraction value' );
@@ -729,7 +731,9 @@ class FormatExif {
case 'DateTime':
case 'DateTimeOriginal':
case 'DateTimeDigitized':
- if( preg_match( "/^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/", $val ) ) {
+ if( $val == '0000:00:00 00:00:00' ) {
+ $tags[$tag] = wfMsg('exif-unknowndate');
+ } elseif( preg_match( '/^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/', $val ) ) {
$tags[$tag] = $wgLang->timeanddate( wfTimestamp(TS_MW, $val) );
}
break;
@@ -1054,6 +1058,7 @@ class FormatExif {
* @return mixed A floating point number or whatever we were fed
*/
function formatNum( $num ) {
+ $m = array();
if ( preg_match( '/^(\d+)\/(\d+)$/', $num, $m ) )
return $m[2] != 0 ? $m[1] / $m[2] : $num;
else
@@ -1069,6 +1074,7 @@ class FormatExif {
* @return mixed A floating point number or whatever we were fed
*/
function formatFraction( $num ) {
+ $m = array();
if ( preg_match( '/^(\d+)\/(\d+)$/', $num, $m ) ) {
$numerator = intval( $m[1] );
$denominator = intval( $m[2] );
diff --git a/includes/Export.php b/includes/Export.php
index aa70e27b..b7e0f9a1 100644
--- a/includes/Export.php
+++ b/includes/Export.php
@@ -337,8 +337,7 @@ class XmlDumpWriter {
}
function homelink() {
- $page = Title::newFromText( wfMsgForContent( 'mainpage' ) );
- return wfElement( 'base', array(), $page->getFullUrl() );
+ return wfElement( 'base', array(), Title::newMainPage()->getFullUrl() );
}
function caseSetting() {
@@ -597,7 +596,7 @@ class DumpFilter {
* Override for page-based filter types.
* @return bool
*/
- function pass( $page, $string ) {
+ function pass( $page ) {
return true;
}
}
diff --git a/includes/Feed.php b/includes/Feed.php
index 7663e820..5c14865d 100644
--- a/includes/Feed.php
+++ b/includes/Feed.php
@@ -149,12 +149,12 @@ class ChannelFeed extends FeedItem {
* @private
*/
function outXmlHeader() {
- global $wgServer, $wgStylePath;
+ global $wgServer, $wgStylePath, $wgStyleVersion;
$this->httpHeaders();
echo '<?xml version="1.0" encoding="utf-8"?>' . "\n";
echo '<?xml-stylesheet type="text/css" href="' .
- htmlspecialchars( "$wgServer$wgStylePath/common/feed.css" ) . '"?' . ">\n";
+ htmlspecialchars( "$wgServer$wgStylePath/common/feed.css?$wgStyleVersion" ) . '"?' . ">\n";
}
}
diff --git a/includes/FileStore.php b/includes/FileStore.php
index 35ebd554..1fd35b01 100644
--- a/includes/FileStore.php
+++ b/includes/FileStore.php
@@ -36,6 +36,9 @@ class FileStore {
* @fixme Probably only works on MySQL. Abstract to the Database class?
*/
static function lock() {
+ global $wgDBtype;
+ if ($wgDBtype != 'mysql')
+ return true;
$dbw = wfGetDB( DB_MASTER );
$lockname = $dbw->addQuotes( FileStore::lockName() );
$result = $dbw->query( "SELECT GET_LOCK($lockname, 5) AS lockstatus", __METHOD__ );
@@ -54,10 +57,13 @@ class FileStore {
* Release the global file store lock.
*/
static function unlock() {
+ global $wgDBtype;
+ if ($wgDBtype != 'mysql')
+ return true;
$dbw = wfGetDB( DB_MASTER );
$lockname = $dbw->addQuotes( FileStore::lockName() );
$result = $dbw->query( "SELECT RELEASE_LOCK($lockname)", __METHOD__ );
- $row = $dbw->fetchObject( $result );
+ $dbw->fetchObject( $result );
$dbw->freeResult( $result );
}
diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php
index 623f9d3b..08094ca1 100644
--- a/includes/GlobalFunctions.php
+++ b/includes/GlobalFunctions.php
@@ -9,24 +9,16 @@
* Some globals and requires needed
*/
-/**
- * Total number of articles
- * @global integer $wgNumberOfArticles
- */
+/** Total number of articles */
$wgNumberOfArticles = -1; # Unset
-/**
- * Total number of views
- * @global integer $wgTotalViews
- */
+
+/** Total number of views */
$wgTotalViews = -1;
-/**
- * Total number of edits
- * @global integer $wgTotalEdits
- */
+
+/** Total number of edits */
$wgTotalEdits = -1;
-require_once( 'DatabaseFunctions.php' );
require_once( 'LogPage.php' );
require_once( 'normal/UtfNormalUtil.php' );
require_once( 'XmlFunctions.php' );
@@ -53,6 +45,7 @@ if( !function_exists('iconv') ) {
# UTF-8 substr function based on a PHP manual comment
if ( !function_exists( 'mb_substr' ) ) {
function mb_substr( $str, $start ) {
+ $ar = array();
preg_match_all( '/./us', $str, $ar );
if( func_num_args() >= 3 ) {
@@ -72,7 +65,7 @@ if ( !function_exists( 'array_diff_key' ) ) {
*/
function array_diff_key( $left, $right ) {
$result = $left;
- foreach ( $left as $key => $value ) {
+ foreach ( $left as $key => $unused ) {
if ( isset( $right[$key] ) ) {
unset( $result[$key] );
}
@@ -114,7 +107,7 @@ function wfSeedRandom() {
function wfRandom() {
# The maximum random value is "only" 2^31-1, so get two random
# values to reduce the chance of dupes
- $max = mt_getrandmax();
+ $max = mt_getrandmax() + 1;
$rand = number_format( (mt_rand() * $max + mt_rand())
/ $max / $max, 12, '.', '' );
return $rand;
@@ -282,6 +275,10 @@ function wfReadOnly() {
*
* @param $key String: lookup key for the message, usually
* defined in languages/Language.php
+ *
+ * This function also takes extra optional parameters (not
+ * shown in the function definition), which can by used to
+ * insert variable text into the predefined message.
*/
function wfMsg( $key ) {
$args = func_get_args();
@@ -295,7 +292,7 @@ function wfMsg( $key ) {
function wfMsgNoTrans( $key ) {
$args = func_get_args();
array_shift( $args );
- return wfMsgReal( $key, $args, true, false );
+ return wfMsgReal( $key, $args, true, false, false );
}
/**
@@ -371,14 +368,14 @@ function wfMsgNoDBForContent( $key ) {
/**
* Really get a message
- * @return $key String: key to get.
- * @return $args
- * @return $useDB Boolean
+ * @param $key String: key to get.
+ * @param $args
+ * @param $useDB Boolean
+ * @param $transform Boolean: Whether or not to transform the message.
+ * @param $forContent Boolean
* @return String: the requested message.
*/
function wfMsgReal( $key, $args, $useDB = true, $forContent=false, $transform = true ) {
- $fname = 'wfMsgReal';
-
$message = wfMsgGetKey( $key, $useDB, $forContent, $transform );
$message = wfMsgReplaceArgs( $message, $args );
return $message;
@@ -522,9 +519,10 @@ function wfMsgWikiHtml( $key ) {
* <i>parseinline<i>: parses wikitext to html and removes the surrounding p's added by parser or tidy
* <i>escape<i>: filters message trough htmlspecialchars
* <i>replaceafter<i>: parameters are substituted after parsing or escaping
+ * <i>parsemag<i>: ??
*/
function wfMsgExt( $key, $options ) {
- global $wgOut, $wgMsgParserOptions, $wgParser;
+ global $wgOut, $wgParser;
$args = func_get_args();
array_shift( $args );
@@ -549,12 +547,10 @@ function wfMsgExt( $key, $options ) {
$string = $m[1];
}
} elseif ( in_array('parsemag', $options) ) {
- global $wgTitle;
- $parser = new Parser();
- $parserOptions = new ParserOptions();
- $parserOptions->setInterfaceMessage( true );
- $parser->startExternalParse( $wgTitle, $parserOptions, OT_MSG );
- $string = $parser->transformMsg( $string, $parserOptions );
+ global $wgMessageCache;
+ if ( isset( $wgMessageCache ) ) {
+ $string = $wgMessageCache->transform( $string );
+ }
}
if ( in_array('escape', $options) ) {
@@ -583,8 +579,8 @@ function wfAbruptExit( $error = false ){
}
$called = true;
- if( function_exists( 'debug_backtrace' ) ){ // PHP >= 4.3
- $bt = debug_backtrace();
+ $bt = wfDebugBacktrace();
+ if( $bt ) {
for($i = 0; $i < count($bt) ; $i++){
$file = isset($bt[$i]['file']) ? $bt[$i]['file'] : "unknown";
$line = isset($bt[$i]['line']) ? $bt[$i]['line'] : "unknown";
@@ -666,18 +662,36 @@ function wfHostname() {
return $com;
}
+/**
+ * Safety wrapper for debug_backtrace().
+ *
+ * With Zend Optimizer 3.2.0 loaded, this causes segfaults under somewhat
+ * murky circumstances, which may be triggered in part by stub objects
+ * or other fancy talkin'.
+ *
+ * Will return an empty array if Zend Optimizer is detected, otherwise
+ * the output from debug_backtrace() (trimmed).
+ *
+ * @return array of backtrace information
+ */
+function wfDebugBacktrace() {
+ if( extension_loaded( 'Zend Optimizer' ) ) {
+ wfDebug( "Zend Optimizer detected; skipping debug_backtrace for safety.\n" );
+ return array();
+ } else {
+ return array_slice( debug_backtrace(), 1 );
+ }
+}
+
function wfBacktrace() {
global $wgCommandLineMode;
- if ( !function_exists( 'debug_backtrace' ) ) {
- return false;
- }
if ( $wgCommandLineMode ) {
$msg = '';
} else {
$msg = "<ul>\n";
}
- $backtrace = debug_backtrace();
+ $backtrace = wfDebugBacktrace();
foreach( $backtrace as $call ) {
if( isset( $call['file'] ) ) {
$f = explode( DIRECTORY_SEPARATOR, $call['file'] );
@@ -801,6 +815,7 @@ function wfClientAcceptsGzip() {
global $wgUseGzip;
if( $wgUseGzip ) {
# FIXME: we may want to blacklist some broken browsers
+ $m = array();
if( preg_match(
'/\bgzip(?:;(q)=([0-9]+(?:\.[0-9]+)))?\b/',
$_SERVER['HTTP_ACCEPT_ENCODING'],
@@ -966,6 +981,7 @@ function wfEscapeShellArg( ) {
}
// Double the backslashes before the end of the string, because
// we will soon add a quote
+ $m = array();
if ( preg_match( '/^(.*?)(\\\\+)$/', $arg, $m ) ) {
$arg = $m[1] . str_replace( '\\', '\\\\', $m[2] );
}
@@ -1063,16 +1079,75 @@ function wfHttpError( $code, $label, $desc ) {
$wgOut->sendCacheControl();
header( 'Content-type: text/html' );
- print "<html><head><title>" .
+ print "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">".
+ "<html><head><title>" .
htmlspecialchars( $label ) .
"</title></head><body><h1>" .
htmlspecialchars( $label ) .
"</h1><p>" .
- htmlspecialchars( $desc ) .
+ nl2br( htmlspecialchars( $desc ) ) .
"</p></body></html>\n";
}
/**
+ * Clear away any user-level output buffers, discarding contents.
+ *
+ * Suitable for 'starting afresh', for instance when streaming
+ * relatively large amounts of data without buffering, or wanting to
+ * output image files without ob_gzhandler's compression.
+ *
+ * The optional $resetGzipEncoding parameter controls suppression of
+ * the Content-Encoding header sent by ob_gzhandler; by default it
+ * is left. See comments for wfClearOutputBuffers() for why it would
+ * be used.
+ *
+ * Note that some PHP configuration options may add output buffer
+ * layers which cannot be removed; these are left in place.
+ *
+ * @parameter bool $resetGzipEncoding
+ */
+function wfResetOutputBuffers( $resetGzipEncoding=true ) {
+ while( $status = ob_get_status() ) {
+ if( $status['type'] == 0 /* PHP_OUTPUT_HANDLER_INTERNAL */ ) {
+ // Probably from zlib.output_compression or other
+ // PHP-internal setting which can't be removed.
+ //
+ // Give up, and hope the result doesn't break
+ // output behavior.
+ break;
+ }
+ if( !ob_end_clean() ) {
+ // Could not remove output buffer handler; abort now
+ // to avoid getting in some kind of infinite loop.
+ break;
+ }
+ if( $resetGzipEncoding ) {
+ if( $status['name'] == 'ob_gzhandler' ) {
+ // Reset the 'Content-Encoding' field set by this handler
+ // so we can start fresh.
+ header( 'Content-Encoding:' );
+ }
+ }
+ }
+}
+
+/**
+ * More legible than passing a 'false' parameter to wfResetOutputBuffers():
+ *
+ * Clear away output buffers, but keep the Content-Encoding header
+ * produced by ob_gzhandler, if any.
+ *
+ * This should be used for HTTP 304 responses, where you need to
+ * preserve the Content-Encoding header of the real result, but
+ * also need to suppress the output of ob_gzhandler to keep to spec
+ * and avoid breaking Firefox in rare cases where the headers and
+ * body are broken over two packets.
+ */
+function wfClearOutputBuffers() {
+ wfResetOutputBuffers( false );
+}
+
+/**
* Converts an Accept-* header into an array mapping string values to quality
* factors
*/
@@ -1089,6 +1164,7 @@ function wfAcceptToPrefs( $accept, $def = '*/*' ) {
foreach( $parts as $part ) {
# FIXME: doesn't deal with params like 'text/html; level=1'
@list( $value, $qpart ) = explode( ';', $part );
+ $match = array();
if( !isset( $qpart ) ) {
$prefs[$value] = 1;
} elseif( preg_match( '/q\s*=\s*(\d*\.\d+)/', $qpart, $match ) ) {
@@ -1283,19 +1359,19 @@ function wfTimestamp($outputtype=TS_UNIX,$ts=0) {
$da = array();
if ($ts==0) {
$uts=time();
- } elseif (preg_match("/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D",$ts,$da)) {
+ } elseif (preg_match('/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D',$ts,$da)) {
# TS_DB
$uts=gmmktime((int)$da[4],(int)$da[5],(int)$da[6],
(int)$da[2],(int)$da[3],(int)$da[1]);
- } elseif (preg_match("/^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/D",$ts,$da)) {
+ } elseif (preg_match('/^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/D',$ts,$da)) {
# TS_EXIF
$uts=gmmktime((int)$da[4],(int)$da[5],(int)$da[6],
(int)$da[2],(int)$da[3],(int)$da[1]);
- } elseif (preg_match("/^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/D",$ts,$da)) {
+ } elseif (preg_match('/^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/D',$ts,$da)) {
# TS_MW
$uts=gmmktime((int)$da[4],(int)$da[5],(int)$da[6],
(int)$da[2],(int)$da[3],(int)$da[1]);
- } elseif (preg_match("/^(\d{1,13})$/D",$ts,$datearray)) {
+ } elseif (preg_match('/^(\d{1,13})$/D',$ts,$da)) {
# TS_UNIX
$uts = $ts;
} elseif (preg_match('/^(\d{1,2})-(...)-(\d\d(\d\d)?) (\d\d)\.(\d\d)\.(\d\d)/', $ts, $da)) {
@@ -1306,7 +1382,11 @@ function wfTimestamp($outputtype=TS_UNIX,$ts=0) {
# TS_ISO_8601
$uts=gmmktime((int)$da[4],(int)$da[5],(int)$da[6],
(int)$da[2],(int)$da[3],(int)$da[1]);
- } elseif (preg_match("/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)[\+\- ](\d\d)$/",$ts,$da)) {
+ } elseif (preg_match('/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)[\+\- ](\d\d)$/',$ts,$da)) {
+ # TS_POSTGRES
+ $uts=gmmktime((int)$da[4],(int)$da[5],(int)$da[6],
+ (int)$da[2],(int)$da[3],(int)$da[1]);
+ } elseif (preg_match('/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/',$ts,$da)) {
# TS_POSTGRES
$uts=gmmktime((int)$da[4],(int)$da[5],(int)$da[6],
(int)$da[2],(int)$da[3],(int)$da[1]);
@@ -1383,10 +1463,21 @@ function wfGetCachedNotice( $name ) {
wfProfileIn( $fname );
$needParse = false;
- $notice = wfMsgForContent( $name );
- if( wfEmptyMsg( $name, $notice ) || $notice == '-' ) {
- wfProfileOut( $fname );
- return( false );
+
+ if( $name === 'default' ) {
+ // special case
+ global $wgSiteNotice;
+ $notice = $wgSiteNotice;
+ if( empty( $notice ) ) {
+ wfProfileOut( $fname );
+ return false;
+ }
+ } else {
+ $notice = wfMsgForContentNoTrans( $name );
+ if( wfEmptyMsg( $name, $notice ) || $notice == '-' ) {
+ wfProfileOut( $fname );
+ return( false );
+ }
}
$cachedNotice = $parserMemc->get( wfMemcKey( $name ) );
@@ -1446,16 +1537,17 @@ function wfGetSiteNotice() {
if( wfRunHooks( 'SiteNoticeBefore', array( &$siteNotice ) ) ) {
if( is_object( $wgUser ) && $wgUser->isLoggedIn() ) {
$siteNotice = wfGetCachedNotice( 'sitenotice' );
- $siteNotice = !$siteNotice ? $wgSiteNotice : $siteNotice;
} else {
$anonNotice = wfGetCachedNotice( 'anonnotice' );
if( !$anonNotice ) {
$siteNotice = wfGetCachedNotice( 'sitenotice' );
- $siteNotice = !$siteNotice ? $wgSiteNotice : $siteNotice;
} else {
$siteNotice = $anonNotice;
}
}
+ if( !$siteNotice ) {
+ $siteNotice = wfGetCachedNotice( 'default' );
+ }
}
wfRunHooks( 'SiteNoticeAfter', array( &$siteNotice ) );
@@ -1677,7 +1769,7 @@ function wfShellExec( $cmd, &$retval=null ) {
$output = array();
$retval = 1; // error by default?
- $lastline = exec( $cmd, $output, $retval );
+ exec( $cmd, $output, $retval ); // returns the last line of output.
return implode( "\n", $output );
}
@@ -1725,16 +1817,10 @@ function wfUseMW( $req_ver ) {
}
/**
- * Escape a string to make it suitable for inclusion in a preg_replace()
- * replacement parameter.
- *
- * @param string $string
- * @return string
+ * @deprecated use StringUtils::escapeRegexReplacement
*/
function wfRegexReplacement( $string ) {
- $string = str_replace( '\\', '\\\\', $string );
- $string = str_replace( '$', '\\$', $string );
- return $string;
+ return StringUtils::escapeRegexReplacement( $string );
}
/**
@@ -1749,6 +1835,7 @@ function wfRegexReplacement( $string ) {
* @return string
*/
function wfBaseName( $path ) {
+ $matches = array();
if( preg_match( '#([^/\\\\]*)[/\\\\]*$#', $path, $matches ) ) {
return $matches[1];
} else {
@@ -1804,42 +1891,12 @@ function wfDoUpdates()
}
/**
- * More or less "markup-safe" explode()
- * Ignores any instances of the separator inside <...>
- * @param string $separator
- * @param string $text
- * @return array
+ * @deprecated use StringUtils::explodeMarkup
*/
function wfExplodeMarkup( $separator, $text ) {
- $placeholder = "\x00";
-
- // Just in case...
- $text = str_replace( $placeholder, '', $text );
-
- // Trim stuff
- $replacer = new ReplacerCallback( $separator, $placeholder );
- $cleaned = preg_replace_callback( '/(<.*?>)/', array( $replacer, 'go' ), $text );
-
- $items = explode( $separator, $cleaned );
- foreach( $items as $i => $str ) {
- $items[$i] = str_replace( $placeholder, $separator, $str );
- }
-
- return $items;
+ return StringUtils::explodeMarkup( $separator, $text );
}
-class ReplacerCallback {
- function ReplacerCallback( $from, $to ) {
- $this->from = $from;
- $this->to = $to;
- }
-
- function go( $matches ) {
- return str_replace( $this->from, $this->to, $matches[1] );
- }
-}
-
-
/**
* Convert an arbitrarily-long digit string from one numeric base
* to another, optionally zero-padding to a minimum column width.
@@ -1999,7 +2056,7 @@ function wfGetPrecompiledData( $name ) {
}
function wfGetCaller( $level = 2 ) {
- $backtrace = debug_backtrace();
+ $backtrace = wfDebugBacktrace();
if ( isset( $backtrace[$level] ) ) {
if ( isset( $backtrace[$level]['class'] ) ) {
$caller = $backtrace[$level]['class'] . '::' . $backtrace[$level]['function'];
@@ -2020,7 +2077,7 @@ function wfGetAllCallers() {
$frame["class"]."::".$frame["function"]:
$frame["function"];
'),
- array_reverse(debug_backtrace())));
+ array_reverse(wfDebugBacktrace())));
}
/**
@@ -2063,4 +2120,19 @@ function wfWikiID() {
}
}
+/*
+ * Get a Database object
+ * @param integer $db Index of the connection to get. May be DB_MASTER for the
+ * master (for write queries), DB_SLAVE for potentially lagged
+ * read queries, or an integer >= 0 for a particular server.
+ *
+ * @param mixed $groups Query groups. An array of group names that this query
+ * belongs to. May contain a single string if the query is only
+ * in one group.
+ */
+function &wfGetDB( $db = DB_LAST, $groups = array() ) {
+ global $wgLoadBalancer;
+ $ret = $wgLoadBalancer->getConnection( $db, true, $groups );
+ return $ret;
+}
?>
diff --git a/includes/HTMLCacheUpdate.php b/includes/HTMLCacheUpdate.php
index 47703b20..bda4720d 100644
--- a/includes/HTMLCacheUpdate.php
+++ b/includes/HTMLCacheUpdate.php
@@ -55,7 +55,6 @@ class HTMLCacheUpdate
$numRows = $res->numRows();
$numBatches = ceil( $numRows / $this->mRowsPerJob );
$realBatchSize = $numRows / $numBatches;
- $boundaries = array();
$start = false;
$jobs = array();
do {
@@ -176,7 +175,7 @@ class HTMLCacheUpdate
# Update file cache
if ( $wgUseFileCache ) {
foreach ( $titles as $title ) {
- $cm = new CacheManager($title);
+ $cm = new HTMLFileCache($title);
@unlink($cm->fileCacheName());
}
}
diff --git a/includes/HTMLFileCache.php b/includes/HTMLFileCache.php
new file mode 100644
index 00000000..d85a4411
--- /dev/null
+++ b/includes/HTMLFileCache.php
@@ -0,0 +1,159 @@
+<?php
+/**
+ * Contain the HTMLFileCache class
+ * @package MediaWiki
+ * @subpackage Cache
+ */
+
+/**
+ * Handles talking to the file cache, putting stuff in and taking it back out.
+ * Mostly called from Article.php, also from DatabaseFunctions.php for the
+ * emergency abort/fallback to cache.
+ *
+ * Global options that affect this module:
+ * $wgCachePages
+ * $wgCacheEpoch
+ * $wgUseFileCache
+ * $wgFileCacheDirectory
+ * $wgUseGzip
+ * @package MediaWiki
+ */
+class HTMLFileCache {
+ var $mTitle, $mFileCache;
+
+ function HTMLFileCache( &$title ) {
+ $this->mTitle =& $title;
+ $this->mFileCache = '';
+ }
+
+ function fileCacheName() {
+ global $wgFileCacheDirectory;
+ if( !$this->mFileCache ) {
+ $key = $this->mTitle->getPrefixedDbkey();
+ $hash = md5( $key );
+ $key = str_replace( '.', '%2E', urlencode( $key ) );
+
+ $hash1 = substr( $hash, 0, 1 );
+ $hash2 = substr( $hash, 0, 2 );
+ $this->mFileCache = "{$wgFileCacheDirectory}/{$hash1}/{$hash2}/{$key}.html";
+
+ if($this->useGzip())
+ $this->mFileCache .= '.gz';
+
+ wfDebug( " fileCacheName() - {$this->mFileCache}\n" );
+ }
+ return $this->mFileCache;
+ }
+
+ function isFileCached() {
+ return file_exists( $this->fileCacheName() );
+ }
+
+ function fileCacheTime() {
+ return wfTimestamp( TS_MW, filemtime( $this->fileCacheName() ) );
+ }
+
+ function isFileCacheGood( $timestamp ) {
+ global $wgCacheEpoch;
+
+ if( !$this->isFileCached() ) return false;
+
+ $cachetime = $this->fileCacheTime();
+ $good = (( $timestamp <= $cachetime ) &&
+ ( $wgCacheEpoch <= $cachetime ));
+
+ wfDebug(" isFileCacheGood() - cachetime $cachetime, touched {$timestamp} epoch {$wgCacheEpoch}, good $good\n");
+ return $good;
+ }
+
+ function useGzip() {
+ global $wgUseGzip;
+ return $wgUseGzip;
+ }
+
+ /* In handy string packages */
+ function fetchRawText() {
+ return file_get_contents( $this->fileCacheName() );
+ }
+
+ function fetchPageText() {
+ if( $this->useGzip() ) {
+ /* Why is there no gzfile_get_contents() or gzdecode()? */
+ return implode( '', gzfile( $this->fileCacheName() ) );
+ } else {
+ return $this->fetchRawText();
+ }
+ }
+
+ /* Working directory to/from output */
+ function loadFromFileCache() {
+ global $wgOut, $wgMimeType, $wgOutputEncoding, $wgContLanguageCode;
+ wfDebug(" loadFromFileCache()\n");
+
+ $filename=$this->fileCacheName();
+ $wgOut->sendCacheControl();
+
+ header( "Content-type: $wgMimeType; charset={$wgOutputEncoding}" );
+ header( "Content-language: $wgContLanguageCode" );
+
+ if( $this->useGzip() ) {
+ if( wfClientAcceptsGzip() ) {
+ header( 'Content-Encoding: gzip' );
+ } else {
+ /* Send uncompressed */
+ readgzfile( $filename );
+ return;
+ }
+ }
+ readfile( $filename );
+ }
+
+ function checkCacheDirs() {
+ $filename = $this->fileCacheName();
+ $mydir2=substr($filename,0,strrpos($filename,'/')); # subdirectory level 2
+ $mydir1=substr($mydir2,0,strrpos($mydir2,'/')); # subdirectory level 1
+
+ if(!file_exists($mydir1)) { mkdir($mydir1,0775); } # create if necessary
+ if(!file_exists($mydir2)) { mkdir($mydir2,0775); }
+ }
+
+ function saveToFileCache( $origtext ) {
+ $text = $origtext;
+ if(strcmp($text,'') == 0) return '';
+
+ wfDebug(" saveToFileCache()\n", false);
+
+ $this->checkCacheDirs();
+
+ $f = fopen( $this->fileCacheName(), 'w' );
+ if($f) {
+ $now = wfTimestampNow();
+ if( $this->useGzip() ) {
+ $rawtext = str_replace( '</html>',
+ '<!-- Cached/compressed '.$now." -->\n</html>",
+ $text );
+ $text = gzencode( $rawtext );
+ } else {
+ $text = str_replace( '</html>',
+ '<!-- Cached '.$now." -->\n</html>",
+ $text );
+ }
+ fwrite( $f, $text );
+ fclose( $f );
+ if( $this->useGzip() ) {
+ if( wfClientAcceptsGzip() ) {
+ header( 'Content-Encoding: gzip' );
+ return $text;
+ } else {
+ return $rawtext;
+ }
+ } else {
+ return $text;
+ }
+ }
+ return $text;
+ }
+
+}
+
+?>
diff --git a/includes/HTMLForm.php b/includes/HTMLForm.php
index 3ee85859..189e5c79 100644
--- a/includes/HTMLForm.php
+++ b/includes/HTMLForm.php
@@ -99,7 +99,7 @@ class HTMLForm {
if ( $this->mRequest->wasPosted() ) {
$arr = $this->mRequest->getArray( $varname );
if ( is_array( $arr ) ) {
- foreach ( $_POST[$varname] as $index => $element ) {
+ foreach ( $_POST[$varname] as $element ) {
$s .= htmlspecialchars( $element )."\n";
}
}
diff --git a/includes/HistoryBlob.php b/includes/HistoryBlob.php
index 357c1d48..a06b620d 100644
--- a/includes/HistoryBlob.php
+++ b/includes/HistoryBlob.php
@@ -226,7 +226,7 @@ class HistoryBlobStub {
$flags = explode( ',', $row->old_flags );
if( in_array( 'external', $flags ) ) {
$url=$row->old_text;
- @list($proto,$path)=explode('://',$url,2);
+ @list( /* $proto */ ,$path)=explode('://',$url,2);
if ($path=="") {
wfProfileOut( $fname );
return false;
diff --git a/includes/Hooks.php b/includes/Hooks.php
index 575a28c5..2eecfd72 100644
--- a/includes/Hooks.php
+++ b/includes/Hooks.php
@@ -31,7 +31,6 @@
function wfRunHooks($event, $args = null) {
global $wgHooks;
- $fname = 'wfRunHooks';
if (!is_array($wgHooks)) {
throw new MWException("Global hooks array is not an array!\n");
diff --git a/includes/IP.php b/includes/IP.php
index f3ff3427..edf4af7a 100644
--- a/includes/IP.php
+++ b/includes/IP.php
@@ -10,11 +10,15 @@
// Some regex definition to "play" with IP address and IP address blocks
// An IP is made of 4 bytes from x00 to xFF which is d0 to d255
-define( 'RE_IP_BYTE', '(25[0-5]|2[0-4]\d|1?\d{1,2})');
+define( 'RE_IP_BYTE', '(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])');
define( 'RE_IP_ADD' , RE_IP_BYTE . '\.' . RE_IP_BYTE . '\.' . RE_IP_BYTE . '\.' . RE_IP_BYTE );
// An IP block is an IP address and a prefix (d1 to d32)
-define( 'RE_IP_PREFIX' , '(3[0-2]|[12]?\d)');
+define( 'RE_IP_PREFIX', '(3[0-2]|[12]?\d)');
define( 'RE_IP_BLOCK', RE_IP_ADD . '\/' . RE_IP_PREFIX);
+// For IPv6 canonicalization (NOT for strict validation; these are quite lax!)
+define( 'RE_IPV6_WORD', '([0-9A-Fa-f]{1,4})' );
+define( 'RE_IPV6_GAP', ':(?:0+:)*(?::(?:0+:)*)?' );
+define( 'RE_IPV6_V4_PREFIX', '0*' . RE_IPV6_GAP . '(?:ffff:)?' );
class IP {
@@ -23,7 +27,7 @@ class IP {
* @return boolean True if it is valid.
*/
public static function isValid( $ip ) {
- return preg_match( '/^' . RE_IP_ADD . '$/', $ip, $matches) ;
+ return preg_match( '/^' . RE_IP_ADD . '$/', $ip) ;
}
/**
@@ -74,12 +78,13 @@ class IP {
/**
* Split out an IP block as an array of 4 bytes and a mask,
- * return false if it cant be determined
+ * return false if it can't be determined
*
* @parameter $ip string A quad dotted IP address
* @return array
*/
public static function toArray( $ipblock ) {
+ $matches = array();
if(! preg_match( '/^' . RE_IP_ADD . '(?:\/(?:'.RE_IP_PREFIX.'))?' . '$/', $ipblock, $matches ) ) {
return false;
} else {
@@ -206,6 +211,50 @@ class IP {
} else {
return array( $start, $end );
}
- }
+ }
+
+ /**
+ * Determine if a given integer IPv4 address is in a given CIDR network
+ * @param $addr The address to check against the given range.
+ * @param $range The range to check the given address against.
+ * @return bool Whether or not the given address is in the given range.
+ */
+ public static function isInRange( $addr, $range ) {
+ $unsignedIP = IP::toUnsigned($addr);
+ list( $start, $end ) = IP::parseRange($range);
+
+ $start = hexdec($start);
+ $end = hexdec($end);
+
+ return (($unsignedIP >= $start) && ($unsignedIP <= $end));
+ }
+
+ /**
+ * Convert some unusual representations of IPv4 addresses to their
+ * canonical dotted quad representation.
+ *
+ * This currently only checks a few IPV4-to-IPv6 related cases. More
+ * unusual representations may be added later.
+ *
+ * @param $addr something that might be an IP address
+ * @return valid dotted quad IPv4 address or null
+ */
+ public static function canonicalize( $addr ) {
+ if ( IP::isValid( $addr ) )
+ return $addr;
+
+ // IPv6 loopback address
+ if ( preg_match( '/^0*' . RE_IPV6_GAP . '1$/', $addr, $m ) )
+ return '127.0.0.1';
+
+ // IPv4-mapped and IPv4-compatible IPv6 addresses
+ if ( preg_match( '/^' . RE_IPV6_V4_PREFIX . '(' . RE_IP_ADD . ')$/i', $addr, $m ) )
+ return $m[1];
+ if ( preg_match( '/^' . RE_IPV6_V4_PREFIX . RE_IPV6_WORD . ':' . RE_IPV6_WORD . '$/i', $addr, $m ) )
+ return long2ip( ( hexdec( $m[1] ) << 16 ) + hexdec( $m[2] ) );
+
+ return null; // give up
+ }
}
+
?>
diff --git a/includes/Image.php b/includes/Image.php
index 55e53e26..1f3895c6 100644
--- a/includes/Image.php
+++ b/includes/Image.php
@@ -58,7 +58,7 @@ class Image
* @param string $name name of the image, used to create a title object using Title::makeTitleSafe
* @public
*/
- function newFromName( $name ) {
+ public static function newFromName( $name ) {
$title = Title::makeTitleSafe( NS_IMAGE, $name );
if ( is_object( $title ) ) {
return new Image( $title );
@@ -235,7 +235,7 @@ class Image
* Load metadata from the file itself
*/
function loadFromFile() {
- global $wgUseSharedUploads, $wgSharedUploadDirectory, $wgContLang, $wgShowEXIF;
+ global $wgUseSharedUploads, $wgSharedUploadDirectory, $wgContLang;
wfProfileIn( __METHOD__ );
$this->imagePath = $this->getFullPath();
$this->fileExists = file_exists( $this->imagePath );
@@ -925,7 +925,7 @@ class Image
if ( !$this->mustRender() && $width == $this->width && $height == $this->height ) {
$url = $this->getURL();
} else {
- list( $isScriptUrl, $url ) = $this->thumbUrl( $width );
+ list( /* $isScriptUrl */, $url ) = $this->thumbUrl( $width );
}
$thumb = new ThumbnailImage( $url, $width, $height );
} else {
@@ -1360,15 +1360,17 @@ class Image
$dir = wfImageThumbDir( $this->name, $shared );
$urls = array();
foreach ( $files as $file ) {
+ $m = array();
if ( preg_match( '/^(\d+)px/', $file, $m ) ) {
- $urls[] = $this->thumbUrl( $m[1], $this->fromSharedDirectory );
+ list( /* $isScriptUrl */, $url ) = $this->thumbUrl( $m[1] );
+ $urls[] = $url;
@unlink( "$dir/$file" );
}
}
// Purge the squid
if ( $wgUseSquid ) {
- $urls[] = $this->getViewURL();
+ $urls[] = $this->getURL();
foreach ( $archiveFiles as $file ) {
$urls[] = wfImageArchiveUrl( $file );
}
@@ -1461,7 +1463,7 @@ class Image
array( 'img_name' => $this->title->getDBkey() ),
__METHOD__
);
- if ( 0 == wfNumRows( $this->historyRes ) ) {
+ if ( 0 == $dbr->numRows( $this->historyRes ) ) {
return FALSE;
}
} else if ( $this->historyLine == 1 ) {
@@ -1701,7 +1703,7 @@ class Image
}
$linkCache =& LinkCache::singleton();
- extract( $db->tableNames( 'page', 'imagelinks' ) );
+ list( $page, $imagelinks ) = $db->tableNamesN( 'page', 'imagelinks' );
$encName = $db->addQuotes( $this->name );
$sql = "SELECT page_namespace,page_title,page_id FROM $page,$imagelinks WHERE page_id=il_from AND il_to=$encName $options";
$res = $db->query( $sql, __METHOD__ );
diff --git a/includes/ImageFunctions.php b/includes/ImageFunctions.php
index d182d527..931fdff1 100644
--- a/includes/ImageFunctions.php
+++ b/includes/ImageFunctions.php
@@ -126,6 +126,7 @@ function wfScaleSVGUnit( $length ) {
'' => 1.0, // "User units" pixels by default
'%' => 2.0, // Fake it!
);
+ $matches = array();
if( preg_match( '/^(\d+(?:\.\d+)?)(em|ex|px|pt|pc|cm|mm|in|%|)$/', $length, $matches ) ) {
$length = floatval( $matches[1] );
$unit = $matches[2];
@@ -156,6 +157,7 @@ function wfGetSVGsize( $filename ) {
fclose( $f );
// Uber-crappy hack! Run through a real XML parser.
+ $matches = array();
if( !preg_match( '/<svg\s*([^>]*)\s*>/s', $chunk, $matches ) ) {
return false;
}
@@ -198,7 +200,7 @@ function wfIsBadImage( $name, $contextTitle = false ) {
if( !$badImages ) {
# Build the list now
$badImages = array();
- $lines = explode( "\n", wfMsgForContent( 'bad_image_list' ) );
+ $lines = explode( "\n", wfMsgForContentNoTrans( 'bad_image_list' ) );
foreach( $lines as $line ) {
# List items only
if ( substr( $line, 0, 1 ) !== '*' ) {
@@ -206,6 +208,7 @@ function wfIsBadImage( $name, $contextTitle = false ) {
}
# Find all links
+ $m = array();
if ( !preg_match_all( '/\[\[:?(.*?)\]\]/', $line, $m ) ) {
continue;
}
diff --git a/includes/ImageGallery.php b/includes/ImageGallery.php
index 7ff456b6..9d58b7f6 100644
--- a/includes/ImageGallery.php
+++ b/includes/ImageGallery.php
@@ -42,11 +42,20 @@ class ImageGallery
}
/**
- * Set the caption
+ * Set the caption (as plain text)
*
* @param $caption Caption
*/
function setCaption( $caption ) {
+ $this->mCaption = htmlspecialchars( $caption );
+ }
+
+ /**
+ * Set the caption (as HTML)
+ *
+ * @param $caption Caption
+ */
+ function setCaptionHtml( $caption ) {
$this->mCaption = $caption;
}
@@ -134,20 +143,19 @@ class ImageGallery
*
*/
function toHTML() {
- global $wgLang, $wgIgnoreImageErrors, $wgGenerateThumbnailOnParse;
+ global $wgLang, $wgGenerateThumbnailOnParse;
$sk = $this->getSkin();
$s = '<table class="gallery" cellspacing="0" cellpadding="0">';
if( $this->mCaption )
- $s .= '<td class="galleryheader" colspan="4"><big>' . htmlspecialchars( $this->mCaption ) . '</big></td>';
+ $s .= '<td class="galleryheader" colspan="4"><big>' . $this->mCaption . '</big></td>';
$i = 0;
foreach ( $this->mImages as $pair ) {
$img =& $pair[0];
$text = $pair[1];
- $name = $img->getName();
$nt = $img->getTitle();
if( $nt->getNamespace() != NS_IMAGE ) {
@@ -206,6 +214,13 @@ class ImageGallery
return $s;
}
+
+ /**
+ * @return int Number of images in the gallery
+ */
+ public function count() {
+ return count( $this->mImages );
+ }
} //class
?>
diff --git a/includes/ImagePage.php b/includes/ImagePage.php
index 908dd5cc..43b99130 100644
--- a/includes/ImagePage.php
+++ b/includes/ImagePage.php
@@ -71,13 +71,13 @@ class ImagePage extends Article {
$this->imageHistory();
$this->imageLinks();
if( $exif ) {
- global $wgStylePath;
+ global $wgStylePath, $wgStyleVersion;
$expand = htmlspecialchars( wfEscapeJsString( wfMsg( 'metadata-expand' ) ) );
$collapse = htmlspecialchars( wfEscapeJsString( wfMsg( 'metadata-collapse' ) ) );
$wgOut->addHTML( "<h2 id=\"metadata\">" . wfMsgHtml( 'metadata' ) . "</h2>\n" );
$wgOut->addWikiText( $this->makeMetadataTable( $exif ) );
$wgOut->addHTML(
- "<script type=\"text/javascript\" src=\"$wgStylePath/common/metadata.js\"></script>\n" .
+ "<script type=\"text/javascript\" src=\"$wgStylePath/common/metadata.js?$wgStyleVersion\"></script>\n" .
"<script type=\"text/javascript\">attachMetadataToggle('mw_metadata', '$expand', '$collapse');</script>\n" );
}
} else {
@@ -142,6 +142,7 @@ class ImagePage extends Article {
$fields = array();
$lines = explode( "\n", wfMsgForContent( 'metadata-fields' ) );
foreach( $lines as $line ) {
+ $matches = array();
if( preg_match( '/^\\*\s*(.*?)\s*$/', $line, $matches ) ) {
$fields[] = $matches[1];
}
@@ -169,12 +170,8 @@ class ImagePage extends Article {
$full_url = $this->img->getURL();
$anchoropen = '';
$anchorclose = '';
+ $sizeSel = intval( $wgUser->getOption( 'imagesize') );
- if( $wgUser->getOption( 'imagesize' ) == '' ) {
- $sizeSel = User::getDefaultOption( 'imagesize' );
- } else {
- $sizeSel = intval( $wgUser->getOption( 'imagesize' ) );
- }
if( !isset( $wgImageLimits[$sizeSel] ) ) {
$sizeSel = User::getDefaultOption( 'imagesize' );
}
@@ -247,7 +244,7 @@ class ImagePage extends Article {
$wgOut->addHTML( '<div class="fullImageLink" id="file">' . $anchoropen .
"<img border=\"0\" src=\"{$url}\" width=\"{$width}\" height=\"{$height}\" alt=\"" .
- htmlspecialchars( $wgRequest->getVal( 'image' ) ).'" />' . $anchorclose . '</div>' );
+ htmlspecialchars( $this->img->getTitle()->getPrefixedText() ).'" />' . $anchorclose . '</div>' );
if ( $this->img->isMultipage() ) {
$count = $this->img->pageCount();
@@ -300,9 +297,15 @@ class ImagePage extends Article {
if ($showLink) {
$filename = wfEscapeWikiText( $this->img->getName() );
+ // Hacky workaround: for some reason we use the incorrect MIME type
+ // image/svg for SVG. This should be fixed internally, but at least
+ // make the displayed type right.
+ $mime = $this->img->getMimeType();
+ if ($mime == 'image/svg') $mime = 'image/svg+xml';
+
$info = wfMsg( 'fileinfo',
ceil($this->img->getSize()/1024.0),
- $this->img->getMimeType() );
+ $mime );
global $wgContLang;
$dirmark = $wgContLang->getDirMark();
@@ -333,7 +336,7 @@ END
} else {
# Image does not exist
- $title = Title::makeTitle( NS_SPECIAL, 'Upload' );
+ $title = SpecialPage::getTitleFor( 'Upload' );
$link = $sk->makeKnownLinkObj($title, wfMsgHtml('noimage-linktext'),
'wpDestFile=' . urlencode( $this->img->getName() ) );
$wgOut->addHTML( wfMsgWikiHtml( 'noimage', $link ) );
@@ -348,7 +351,7 @@ END
if ($wgRepositoryBaseUrl && !$wgFetchCommonsDescriptions) {
$sk = $wgUser->getSkin();
- $title = Title::makeTitle( NS_SPECIAL, 'Upload' );
+ $title = SpecialPage::getTitleFor( 'Upload' );
$link = $sk->makeKnownLinkObj($title, wfMsgHtml('shareduploadwiki-linktext'),
array( 'wpDestFile' => urlencode( $this->img->getName() )));
$sharedtext .= " " . wfMsgWikiHtml('shareduploadwiki', $link);
@@ -365,7 +368,7 @@ END
function getUploadUrl() {
global $wgServer;
- $uploadTitle = Title::makeTitle( NS_SPECIAL, 'Upload' );
+ $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
return $wgServer . $uploadTitle->getLocalUrl( 'wpDestFile=' . urlencode( $this->img->getName() ) );
}
@@ -530,15 +533,10 @@ END
* @param $reason User provided reason for deletion.
*/
function doDelete( $reason ) {
- global $wgOut, $wgRequest, $wgUseSquid;
- global $wgPostCommitUpdateList;
-
- $fname = 'ImagePage::doDelete';
+ global $wgOut, $wgRequest;
$oldimage = $wgRequest->getVal( 'oldimage' );
- $dbw =& wfGetDB( DB_MASTER );
-
if ( !is_null( $oldimage ) ) {
if ( strlen( $oldimage ) < 16 ) {
$wgOut->showUnexpectedValueError( 'oldimage', htmlspecialchars($oldimage) );
diff --git a/includes/Licenses.php b/includes/Licenses.php
index aaa44052..dd1308b4 100644
--- a/includes/Licenses.php
+++ b/includes/Licenses.php
@@ -63,12 +63,14 @@ class Licenses {
$obj = new License( $line );
$this->stackItem( $this->licenses, $levels, $obj );
} else {
- if ( $level < count( $levels ) )
+ if ( $level < count( $levels ) ) {
$levels = array_slice( $levels, 0, $level );
- if ( $level == count( $levels ) )
+ }
+ if ( $level == count( $levels ) ) {
$levels[$level - 1] = $line;
- else if ( $level > count( $levels ) )
+ } else if ( $level > count( $levels ) ) {
$levels[] = $line;
+ }
}
}
}
diff --git a/includes/LinkBatch.php b/includes/LinkBatch.php
index 061f1b19..61e1c040 100644
--- a/includes/LinkBatch.php
+++ b/includes/LinkBatch.php
@@ -97,7 +97,7 @@ class LinkBatch {
// The remaining links in $data are bad links, register them as such
foreach ( $remaining as $ns => $dbkeys ) {
- foreach ( $dbkeys as $dbkey => $nothing ) {
+ foreach ( $dbkeys as $dbkey => $unused ) {
$title = Title::makeTitle( $ns, $dbkey );
$cache->addBadLinkObj( $title );
$ids[$title->getPrefixedDBkey()] = 0;
@@ -112,7 +112,6 @@ class LinkBatch {
*/
function doQuery() {
$fname = 'LinkBatch::doQuery';
- $namespaces = array();
if ( $this->isEmpty() ) {
return false;
@@ -161,7 +160,7 @@ class LinkBatch {
$sql .= "({$prefix}_namespace=$ns AND {$prefix}_title IN (";
$firstTitle = true;
- foreach( $dbkeys as $dbkey => $nothing ) {
+ foreach( $dbkeys as $dbkey => $unused ) {
if ( $firstTitle ) {
$firstTitle = false;
} else {
diff --git a/includes/Linker.php b/includes/Linker.php
index d34971ff..0eabab2f 100644
--- a/includes/Linker.php
+++ b/includes/Linker.php
@@ -16,7 +16,6 @@
* @package MediaWiki
*/
class Linker {
-
function Linker() {}
/**
@@ -39,7 +38,6 @@ class Linker {
function getInterwikiLinkAttributes( $link, $text, $class='' ) {
global $wgContLang;
- $same = ($link == $text);
$link = urldecode( $link );
$link = $wgContLang->checkTitleEncoding( $link );
$link = preg_replace( '/[\\x00-\\x1f]/', ' ', $link );
@@ -180,12 +178,14 @@ class Linker {
* call this lots of times, pre-fill the link cache with a LinkBatch, otherwise each
* call to this will result in a DB query.
*
- * @param $title String: the text of the title
+ * @param $nt Title: the title object to make the link from, e.g. from
+ * Title::newFromText.
* @param $text String: link text
* @param $query String: optional query part
* @param $trail String: optional trail. Alphabetic characters at the start of this string will
* be included in the link text. Other characters will be appended after
* the end of the link.
+ * @param $prefix String: optional prefix. As trail, only before instead of after.
*/
function makeLinkObj( $nt, $text= '', $query = '', $trail = '', $prefix = '' ) {
global $wgUser;
@@ -199,8 +199,6 @@ class Linker {
return "<!-- ERROR -->{$prefix}{$text}{$trail}";
}
- $ns = $nt->getNamespace();
- $dbkey = $nt->getDBkey();
if ( $nt->isExternal() ) {
$u = $nt->getFullURL();
$link = $nt->getPrefixedURL();
@@ -209,27 +207,12 @@ class Linker {
$inside = '';
if ( '' != $trail ) {
+ $m = array();
if ( preg_match( '/^([a-z]+)(.*)$$/sD', $trail, $m ) ) {
$inside = $m[1];
$trail = $m[2];
}
}
-
- # Check for anchors, normalize the anchor
-
- $parts = explode( '#', $u, 2 );
- if ( count( $parts ) == 2 ) {
- $anchor = urlencode( Sanitizer::decodeCharReferences( str_replace(' ', '_', $parts[1] ) ) );
- $replacearray = array(
- '%3A' => ':',
- '%' => '.'
- );
- $u = $parts[0] . '#' .
- str_replace( array_keys( $replacearray ),
- array_values( $replacearray ),
- $anchor );
- }
-
$t = "<a href=\"{$u}\"{$style}>{$text}{$inside}</a>";
wfProfileOut( $fname );
@@ -308,12 +291,7 @@ class Linker {
$text = htmlspecialchars( $nt->getFragment() );
}
}
- $anchor = urlencode( Sanitizer::decodeCharReferences( str_replace( ' ', '_', $nt->getFragment() ) ) );
- $replacearray = array(
- '%3A' => ':',
- '%' => '.'
- );
- $u .= '#' . str_replace(array_keys($replacearray),array_values($replacearray),$anchor);
+ $u .= $nt->getFragmentForURL();
}
if ( $text == '' ) {
$text = htmlspecialchars( $nt->getPrefixedText() );
@@ -380,8 +358,6 @@ class Linker {
* the end of the link.
*/
function makeStubLinkObj( $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
- $link = $nt->getPrefixedURL();
-
$u = $nt->escapeLocalURL( $query );
if ( '' == $text ) {
@@ -535,6 +511,8 @@ class Linker {
$url = $thumb->getUrl();
} else {
$error = htmlspecialchars( $img->getLastError() );
+ // Do client-side scaling...
+ $height = intval( $img->getHeight() * $width / $img->getWidth() );
}
}
} else {
@@ -627,10 +605,14 @@ class Linker {
$magnifyalign = $wgContLang->isRTL() ? 'left' : 'right';
$textalign = $wgContLang->isRTL() ? ' style="text-align:right"' : '';
- $s = "<div class=\"thumb t{$align}\"><div style=\"width:{$oboxwidth}px;\">";
+ $s = "<div class=\"thumb t{$align}\"><div class=\"thumbinner\" style=\"width:{$oboxwidth}px;\">";
if( $thumbUrl == '' ) {
// Couldn't generate thumbnail? Scale the image client-side.
$thumbUrl = $img->getViewURL();
+ if( $boxheight == -1 ) {
+ // Approximate...
+ $boxheight = intval( $height * $boxwidth / $width );
+ }
}
if ( $error ) {
$s .= htmlspecialchars( $error );
@@ -642,14 +624,14 @@ class Linker {
$s .= '<a href="'.$u.'" class="internal" title="'.$alt.'">'.
'<img src="'.$thumbUrl.'" alt="'.$alt.'" ' .
'width="'.$boxwidth.'" height="'.$boxheight.'" ' .
- 'longdesc="'.$u.'" /></a>';
+ 'longdesc="'.$u.'" class="thumbimage" /></a>';
if ( $framed ) {
$zoomicon="";
} else {
$zoomicon = '<div class="magnify" style="float:'.$magnifyalign.'">'.
'<a href="'.$u.'" class="internal" title="'.$more.'">'.
'<img src="'.$wgStylePath.'/common/images/magnify-clip.png" ' .
- 'width="15" height="11" alt="'.$more.'" /></a></div>';
+ 'width="15" height="11" alt="" /></a></div>';
}
}
$s .= ' <div class="thumbcaption"'.$textalign.'>'.$zoomicon.$label."</div></div></div>";
@@ -673,7 +655,7 @@ class Linker {
if ( '' != $query ) {
$q .= "&$query";
}
- $uploadTitle = Title::makeTitle( NS_SPECIAL, 'Upload' );
+ $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
$url = $uploadTitle->escapeLocalURL( $q );
if ( '' == $text ) {
@@ -710,13 +692,12 @@ class Linker {
### HOTFIX. Instead of breaking, return empty string.
return $text;
} else {
- $name = $title->getDBKey();
$img = new Image( $title );
if( $img->exists() ) {
$url = $img->getURL();
$class = 'internal';
} else {
- $upload = Title::makeTitle( NS_SPECIAL, 'Upload' );
+ $upload = SpecialPage::getTitleFor( 'Upload' );
$url = $upload->getLocalUrl( 'wpDestFile=' . urlencode( $img->getName() ) );
$class = 'new';
}
@@ -763,9 +744,9 @@ class Linker {
function userLink( $userId, $userText ) {
$encName = htmlspecialchars( $userText );
if( $userId == 0 ) {
- $contribsPage = Title::makeTitle( NS_SPECIAL, 'Contributions' );
+ $contribsPage = SpecialPage::getTitleFor( 'Contributions', $userText );
return $this->makeKnownLinkObj( $contribsPage,
- $encName, 'target=' . urlencode( $userText ) );
+ $encName);
} else {
$userPage = Title::makeTitle( NS_USER, $userText );
return $this->makeLinkObj( $userPage, $encName );
@@ -788,9 +769,9 @@ class Linker {
$items[] = $this->userTalkLink( $userId, $userText );
}
if( $userId ) {
- $contribsPage = Title::makeTitle( NS_SPECIAL, 'Contributions' );
- $items[] = $this->makeKnownLinkObj( $contribsPage,
- wfMsgHtml( 'contribslink' ), 'target=' . urlencode( $userText ) );
+ $contribsPage = SpecialPage::getTitleFor( 'Contributions', $userText );
+ $items[] = $this->makeKnownLinkObj( $contribsPage ,
+ wfMsgHtml( 'contribslink' ) );
}
if( $blockable && $wgUser->isAllowed( 'block' ) ) {
$items[] = $this->blockLink( $userId, $userText );
@@ -825,9 +806,9 @@ class Linker {
* @private
*/
function blockLink( $userId, $userText ) {
- $blockPage = Title::makeTitle( NS_SPECIAL, 'Blockip' );
+ $blockPage = SpecialPage::getTitleFor( 'Blockip', $userText );
$blockLink = $this->makeKnownLinkObj( $blockPage,
- wfMsgHtml( 'blocklink' ), 'ip=' . urlencode( $userText ) );
+ wfMsgHtml( 'blocklink' ) );
return $blockLink;
}
@@ -873,17 +854,18 @@ class Linker {
* comments. It escapes any HTML in the comment, but adds some CSS to format
* auto-generated comments (from section editing) and formats [[wikilinks]].
*
- * The $title parameter must be a title OBJECT. It is used to generate a
- * direct link to the section in the autocomment.
* @author Erik Moeller <moeller@scireview.de>
*
* Note: there's not always a title to pass to this function.
* Since you can't set a default parameter for a reference, I've turned it
* temporarily to a value pass. Should be adjusted further. --brion
+ *
+ * $param string $comment
+ * @param mixed $title Title object (to generate link to the section in autocomment) or null
+ * @param bool $local Whether section links should refer to local page
*/
- function formatComment($comment, $title = NULL) {
- $fname = 'Linker::formatComment';
- wfProfileIn( $fname );
+ function formatComment($comment, $title = NULL, $local = false) {
+ wfProfileIn( __METHOD__ );
global $wgContLang;
$comment = str_replace( "\n", " ", $comment );
@@ -893,6 +875,7 @@ class Linker {
# some nasty regex.
# We look for all comments, match any text before and after the comment,
# add a separator where needed and format the comment itself with CSS
+ $match = array();
while (preg_match('/(.*)\/\*\s*(.*?)\s*\*\/(.*)/', $comment,$match)) {
$pre=$match[1];
$auto=$match[2];
@@ -909,8 +892,12 @@ class Linker {
$section = str_replace( '[[:', '', $section );
$section = str_replace( '[[', '', $section );
$section = str_replace( ']]', '', $section );
- $sectionTitle = wfClone( $title );
- $sectionTitle->mFragment = $section;
+ if ( $local ) {
+ $sectionTitle = Title::newFromText( '#' . $section);
+ } else {
+ $sectionTitle = wfClone( $title );
+ $sectionTitle->mFragment = $section;
+ }
$link = $this->makeKnownLinkObj( $sectionTitle, wfMsg( 'sectionlink' ) );
}
$sep='-';
@@ -923,14 +910,16 @@ class Linker {
# format regular and media links - all other wiki formatting
# is ignored
- $medians = $wgContLang->getNsText( NS_MEDIA ) . ':';
- while(preg_match('/\[\[(.*?)(\|(.*?))*\]\](.*)$/',$comment,$match)) {
+ $medians = '(?:' . preg_quote( Namespace::getCanonicalName( NS_MEDIA ), '/' ) . '|';
+ $medians .= preg_quote( $wgContLang->getNsText( NS_MEDIA ), '/' ) . '):';
+ while(preg_match('/\[\[:?(.*?)(\|(.*?))*\]\](.*)$/',$comment,$match)) {
# Handle link renaming [[foo|text]] will show link as "text"
if( "" != $match[3] ) {
$text = $match[3];
} else {
$text = $match[1];
}
+ $submatch = array();
if( preg_match( '/^' . $medians . '(.*)$/i', $match[1], $submatch ) ) {
# Media link; trail not supported.
$linkRegexp = '/\[\[(.*?)\]\]/';
@@ -943,13 +932,13 @@ class Linker {
$trail = "";
}
$linkRegexp = '/\[\[(.*?)\]\]' . preg_quote( $trail, '/' ) . '/';
- if ($match[1][0] == ':')
+ if (isset($match[1][0]) && $match[1][0] == ':')
$match[1] = substr($match[1], 1);
$thelink = $this->makeLink( $match[1], $text, "", $trail );
}
- $comment = preg_replace( $linkRegexp, wfRegexReplacement( $thelink ), $comment, 1 );
+ $comment = preg_replace( $linkRegexp, StringUtils::escapeRegexReplacement( $thelink ), $comment, 1 );
}
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
return $comment;
}
@@ -957,19 +946,20 @@ class Linker {
* Wrap a comment in standard punctuation and formatting if
* it's non-empty, otherwise return empty string.
*
- * @param $comment String: the comment.
- * @param $title Title object.
+ * @param string $comment
+ * @param mixed $title Title object (to generate link to section in autocomment) or null
+ * @param bool $local Whether section links should refer to local page
*
* @return string
*/
- function commentBlock( $comment, $title = NULL ) {
+ function commentBlock( $comment, $title = NULL, $local = false ) {
// '*' used to be the comment inserted by the software way back
// in antiquity in case none was provided, here for backwards
// compatability, acc. to brion -ævar
if( $comment == '' || $comment == '*' ) {
return '';
} else {
- $formatted = $this->formatComment( $comment, $title );
+ $formatted = $this->formatComment( $comment, $title, $local );
return " <span class=\"comment\">($formatted)</span>";
}
}
@@ -977,12 +967,14 @@ class Linker {
/**
* Wrap and format the given revision's comment block, if the current
* user is allowed to view it.
- * @param $rev Revision object.
+ *
+ * @param Revision $rev
+ * @param bool $local Whether section links should refer to local page
* @return string HTML
*/
- function revComment( $rev ) {
+ function revComment( Revision $rev, $local = false ) {
if( $rev->userCan( Revision::DELETED_COMMENT ) ) {
- $block = $this->commentBlock( $rev->getRawComment(), $rev->getTitle() );
+ $block = $this->commentBlock( $rev->getRawComment(), $rev->getTitle(), $local );
} else {
$block = " <span class=\"comment\">" .
wfMsgHtml( 'rev-deleted-comment' ) . "</span>";
@@ -1039,44 +1031,46 @@ class Linker {
}
/** @todo document */
- function editSectionLinkForOther( $title, $section ) {
+ public function editSectionLinkForOther( $title, $section ) {
global $wgContLang;
$title = Title::newFromText( $title );
$editurl = '&section='.$section;
$url = $this->makeKnownLinkObj( $title, wfMsg('editsection'), 'action=edit'.$editurl );
- if( $wgContLang->isRTL() ) {
- $farside = 'left';
- $nearside = 'right';
- } else {
- $farside = 'right';
- $nearside = 'left';
- }
- return "<div class=\"editsection\" style=\"float:$farside;margin-$nearside:5px;\">[".$url."]</div>";
+ return "<span class=\"editsection\">[".$url."]</span>";
}
- /**
+ /**
* @param $title Title object.
* @param $section Integer: section number.
* @param $hint Link String: title, or default if omitted or empty
*/
- function editSectionLink( $nt, $section, $hint='' ) {
+ public function editSectionLink( $nt, $section, $hint='' ) {
global $wgContLang;
$editurl = '&section='.$section;
$hint = ( $hint=='' ) ? '' : ' title="' . wfMsgHtml( 'editsectionhint', htmlspecialchars( $hint ) ) . '"';
$url = $this->makeKnownLinkObj( $nt, wfMsg('editsection'), 'action=edit'.$editurl, '', '', '', $hint );
- if( $wgContLang->isRTL() ) {
- $farside = 'left';
- $nearside = 'right';
- } else {
- $farside = 'right';
- $nearside = 'left';
- }
- return "<div class=\"editsection\" style=\"float:$farside;margin-$nearside:5px;\">[".$url."]</div>";
+ return "<span class=\"editsection\">[".$url."]</span>";
+ }
+
+ /**
+ * Create a headline for content
+ *
+ * @param int $level The level of the headline (1-6)
+ * @param string $attribs Any attributes for the headline, starting with a space and ending with '>'
+ * This *must* be at least '>' for no attribs
+ * @param string $anchor The anchor to give the headline (the bit after the #)
+ * @param string $text The text of the header
+ * @param string $link HTML to add for the section edit link
+ *
+ * @return string HTML headline
+ */
+ public function makeHeadline( $level, $attribs, $anchor, $text, $link ) {
+ return "<a name=\"$anchor\"></a><h$level$attribs$link <span class=\"mw-headline\">$text</span></h$level>";
}
/**
@@ -1093,6 +1087,7 @@ class Linker {
}
$inside = '';
if ( '' != $trail ) {
+ $m = array();
if ( preg_match( $regex, $trail, $m ) ) {
$inside = $m[1];
$trail = $m[2];
@@ -1101,5 +1096,112 @@ class Linker {
return array( $inside, $trail );
}
+ /**
+ * Generate a rollback link for a given revision. Currently it's the
+ * caller's responsibility to ensure that the revision is the top one. If
+ * it's not, of course, the user will get an error message.
+ *
+ * If the calling page is called with the parameter &bot=1, all rollback
+ * links also get that parameter. It causes the edit itself and the rollback
+ * to be marked as "bot" edits. Bot edits are hidden by default from recent
+ * changes, so this allows sysops to combat a busy vandal without bothering
+ * other users.
+ *
+ * @param Revision $rev
+ */
+ function generateRollback( $rev ) {
+ global $wgUser, $wgRequest;
+ $title = $rev->getTitle();
+
+ $extraRollback = $wgRequest->getBool( 'bot' ) ? '&bot=1' : '';
+ $extraRollback .= '&token=' . urlencode(
+ $wgUser->editToken( array( $title->getPrefixedText(), $rev->getUserText() ) ) );
+ return '<span class="mw-rollback-link">['. $this->makeKnownLinkObj( $title,
+ wfMsg('rollbacklink'),
+ 'action=rollback&from=' . urlencode( $rev->getUserText() ) . $extraRollback ) .']</span>';
+ }
+
+ /**
+ * Returns HTML for the "templates used on this page" list.
+ *
+ * @param array $templates Array of templates from Article::getUsedTemplate
+ * or similar
+ * @param bool $preview Whether this is for a preview
+ * @param bool $section Whether this is for a section edit
+ * @return string HTML output
+ */
+ public function formatTemplates( $templates, $preview = false, $section = false) {
+ global $wgUser;
+ wfProfileIn( __METHOD__ );
+
+ $sk =& $wgUser->getSkin();
+
+ $outText = '';
+ if ( count( $templates ) > 0 ) {
+ # Do a batch existence check
+ $batch = new LinkBatch;
+ foreach( $templates as $title ) {
+ $batch->addObj( $title );
+ }
+ $batch->execute();
+
+ # Construct the HTML
+ $outText = '<div class="mw-templatesUsedExplanation">';
+ if ( $preview ) {
+ $outText .= wfMsgExt( 'templatesusedpreview', array( 'parse' ) );
+ } elseif ( $section ) {
+ $outText .= wfMsgExt( 'templatesusedsection', array( 'parse' ) );
+ } else {
+ $outText .= wfMsgExt( 'templatesused', array( 'parse' ) );
+ }
+ $outText .= '</div><ul>';
+
+ foreach ( $templates as $titleObj ) {
+ $r = $titleObj->getRestrictions( 'edit' );
+ if ( in_array( 'sysop', $r ) ) {
+ $protected = wfMsgExt( 'template-protected', array( 'parseinline' ) );
+ } elseif ( in_array( 'autoconfirmed', $r ) ) {
+ $protected = wfMsgExt( 'template-semiprotected', array( 'parseinline' ) );
+ } else {
+ $protected = '';
+ }
+ $outText .= '<li>' . $sk->makeLinkObj( $titleObj ) . ' ' . $protected . '</li>';
+ }
+ $outText .= '</ul>';
+ }
+ wfProfileOut( __METHOD__ );
+ return $outText;
+ }
+
+ /**
+ * Format a size in bytes for output, using an appropriate
+ * unit (B, KB, MB or GB) according to the magnitude in question
+ *
+ * @param $size Size to format
+ * @return string
+ */
+ public function formatSize( $size ) {
+ global $wgLang;
+ if( $size > 1024 ) {
+ $size = $size / 1024;
+ if( $size > 1024 ) {
+ $size = $size / 1024;
+ if( $size > 1024 ) {
+ $size = $size / 1024;
+ $msg = 'size-gigabytes';
+ } else {
+ $msg = 'size-megabytes';
+ }
+ } else {
+ $msg = 'size-kilobytes';
+ }
+ } else {
+ $msg = 'size-bytes';
+ }
+ $size = round( $size, 0 );
+ return wfMsgHtml( $msg, $wgLang->formatNum( $size ) );
+ }
+
}
+
?>
diff --git a/includes/LoadBalancer.php b/includes/LoadBalancer.php
index 3e81aea9..396ef865 100644
--- a/includes/LoadBalancer.php
+++ b/includes/LoadBalancer.php
@@ -141,6 +141,9 @@ class LoadBalancer {
$i = false;
if ( $this->mForce >= 0 ) {
$i = $this->mForce;
+ } elseif ( count( $this->mServers ) == 1 ) {
+ # Skip the load balancing if there's only one server
+ $i = 0;
} else {
if ( $this->mReadIndex >= 0 ) {
$i = $this->mReadIndex;
@@ -171,10 +174,9 @@ class LoadBalancer {
unset( $loads[$i] );
$sleepTime = 0;
} else {
- $status = $this->mConnections[$i]->getStatus("Thread%");
- if ( isset( $this->mServers[$i]['max threads'] ) &&
- $status['Threads_running'] > $this->mServers[$i]['max threads'] )
- {
+ if ( isset( $this->mServers[$i]['max threads'] ) ) {
+ $status = $this->mConnections[$i]->getStatus("Thread%");
+ if ( $status['Threads_running'] > $this->mServers[$i]['max threads'] ) {
# Too much load, back off and wait for a while.
# The sleep time is scaled by the number of threads connected,
# to produce a roughly constant global poll rate.
@@ -182,9 +184,13 @@ class LoadBalancer {
# If we reach the timeout and exit the loop, don't use it
$i = false;
- } else {
+ } else {
$done = true;
$sleepTime = 0;
+ }
+ } else {
+ $done = true;
+ $sleepTime = 0;
}
}
} else {
diff --git a/includes/LogPage.php b/includes/LogPage.php
index 954b178f..dd395126 100644
--- a/includes/LogPage.php
+++ b/includes/LogPage.php
@@ -74,7 +74,7 @@ class LogPage {
# And update recentchanges
if ( $this->updateRecentChanges ) {
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Log/' . $this->type );
+ $titleObj = SpecialPage::getTitleFor( 'Log', $this->type );
$rcComment = $this->actionText;
if( '' != $this->comment ) {
if ($rcComment == '')
@@ -107,7 +107,7 @@ class LogPage {
/**
* @static
*/
- function logName( $type ) {
+ public static function logName( $type ) {
global $wgLogNames;
if( isset( $wgLogNames[$type] ) ) {
@@ -150,7 +150,7 @@ class LogPage {
$titleLink = $title->getText();
} else {
$titleLink = $skin->makeLinkObj( $title, $title->getText() );
- $titleLink .= ' (' . $skin->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Contributions/' . $title->getDBkey() ), wfMsg( 'contribslink' ) ) . ')';
+ $titleLink .= ' (' . $skin->makeKnownLinkObj( SpecialPage::getTitleFor( 'Contributions', $title->getDBkey() ), wfMsg( 'contribslink' ) ) . ')';
}
break;
case 'rights':
diff --git a/includes/MagicWord.php b/includes/MagicWord.php
index 68cbe345..60bfd0f4 100644
--- a/includes/MagicWord.php
+++ b/includes/MagicWord.php
@@ -101,6 +101,7 @@ class MagicWord {
'contentlanguage',
'pagesinnamespace',
'numberofadmins',
+ 'defaultsort',
);
static public $mObjects = array();
@@ -289,7 +290,7 @@ class MagicWord {
* Used in matchAndRemove()
* @private
**/
- function pregRemoveAndRecord( $match ) {
+ function pregRemoveAndRecord( ) {
$this->mFound = true;
return '';
}
@@ -298,7 +299,7 @@ class MagicWord {
* Replaces the word with something else
*/
function replace( $replacement, $subject, $limit=-1 ) {
- $res = preg_replace( $this->getRegex(), wfRegexReplacement( $replacement ), $subject, $limit );
+ $res = preg_replace( $this->getRegex(), StringUtils::escapeRegexReplacement( $replacement ), $subject, $limit );
$this->mModified = !($res === $subject);
return $res;
}
diff --git a/includes/Math.php b/includes/Math.php
index a8b33984..9fa631f7 100644
--- a/includes/Math.php
+++ b/includes/Math.php
@@ -39,6 +39,9 @@ class MathRenderer {
# No need to render or parse anything more!
return ('$ '.htmlspecialchars( $this->tex ).' $');
}
+ if( $this->tex == '' ) {
+ return; # bug 8372
+ }
if( !$this->_recall() ) {
# Ensure that the temp and output directories are available before continuing...
@@ -75,12 +78,13 @@ class MathRenderer {
$retval = substr ($contents, 0, 1);
$errmsg = '';
if (($retval == 'C') || ($retval == 'M') || ($retval == 'L')) {
- if ($retval == 'C')
+ if ($retval == 'C') {
$this->conservativeness = 2;
- else if ($retval == 'M')
+ } else if ($retval == 'M') {
$this->conservativeness = 1;
- else
+ } else {
$this->conservativeness = 0;
+ }
$outdata = substr ($contents, 33);
$i = strpos($outdata, "\000");
@@ -89,12 +93,13 @@ class MathRenderer {
$this->mathml = substr($outdata, $i+1);
} else if (($retval == 'c') || ($retval == 'm') || ($retval == 'l')) {
$this->html = substr ($contents, 33);
- if ($retval == 'c')
+ if ($retval == 'c') {
$this->conservativeness = 2;
- else if ($retval == 'm')
+ } else if ($retval == 'm') {
$this->conservativeness = 1;
- else
+ } else {
$this->conservativeness = 0;
+ }
$this->mathml = NULL;
} else if ($retval == 'X') {
$this->html = NULL;
@@ -118,7 +123,7 @@ class MathRenderer {
$this->hash = substr ($contents, 1, 32);
}
- $res = wfRunHooks( 'MathAfterTexvc', array( &$this, &$errmsg ) );
+ wfRunHooks( 'MathAfterTexvc', array( &$this, &$errmsg ) );
if ( $errmsg ) {
return $errmsg;
diff --git a/includes/MessageCache.php b/includes/MessageCache.php
index 9cab222b..a269c620 100644
--- a/includes/MessageCache.php
+++ b/includes/MessageCache.php
@@ -11,10 +11,11 @@
define( 'MSG_LOAD_TIMEOUT', 60);
define( 'MSG_LOCK_TIMEOUT', 10);
define( 'MSG_WAIT_TIMEOUT', 10);
+define( 'MSG_CACHE_VERSION', 1 );
/**
* Message cache
- * Performs various useful MediaWiki namespace-related functions
+ * Performs various MediaWiki namespace-related functions
*
* @package MediaWiki
*/
@@ -79,7 +80,7 @@ class MessageCache {
if ( $hash == $localHash ) {
// All good, get the rest of it
$serialized = fread( $file, 10000000 );
- $this->mCache = unserialize( $serialized );
+ $this->setCache( unserialize( $serialized ) );
}
fclose( $file );
}
@@ -130,6 +131,7 @@ class MessageCache {
return;
}
require("$wgLocalMessageCache/messages-" . wfWikiID());
+ $this->setCache( $this->mCache);
}
function saveToScript($array, $hash) {
@@ -162,6 +164,17 @@ class MessageCache {
}
/**
+ * Set the cache to $cache, if it is valid. Otherwise set the cache to false.
+ */
+ function setCache( $cache ) {
+ if ( isset( $cache['VERSION'] ) && $cache['VERSION'] == MSG_CACHE_VERSION ) {
+ $this->mCache = $cache;
+ } else {
+ $this->mCache = false;
+ }
+ }
+
+ /**
* Loads messages either from memcached or the database, if not disabled
* On error, quietly switches to a fallback mode
* Returns false for a reportable error, true otherwise
@@ -177,110 +190,104 @@ class MessageCache {
}
return true;
}
+ if ( !$this->mUseCache ) {
+ $this->mDeferred = false;
+ return true;
+ }
+
$fname = 'MessageCache::load';
wfProfileIn( $fname );
$success = true;
- if ( $this->mUseCache ) {
- $this->mCache = false;
+ $this->mCache = false;
- # Try local cache
- wfProfileIn( $fname.'-fromlocal' );
- $hash = $this->mMemc->get( "{$this->mMemcKey}-hash" );
- if ( $hash ) {
- if ($wgLocalMessageCacheSerialized) {
- $this->loadFromLocal( $hash );
- } else {
- $this->loadFromScript( $hash );
- }
- if ( $this->mCache ) {
- wfDebug( "MessageCache::load(): got from local cache\n" );
- }
+ # Try local cache
+ wfProfileIn( $fname.'-fromlocal' );
+ $hash = $this->mMemc->get( "{$this->mMemcKey}-hash" );
+ if ( $hash ) {
+ if ($wgLocalMessageCacheSerialized) {
+ $this->loadFromLocal( $hash );
+ } else {
+ $this->loadFromScript( $hash );
}
- wfProfileOut( $fname.'-fromlocal' );
-
- # Try memcached
- if ( !$this->mCache ) {
- wfProfileIn( $fname.'-fromcache' );
- $this->mCache = $this->mMemc->get( $this->mMemcKey );
- if ( $this->mCache ) {
- wfDebug( "MessageCache::load(): got from global cache\n" );
- # Save to local cache
- if ( $wgLocalMessageCache !== false ) {
- $serialized = serialize( $this->mCache );
- if ( !$hash ) {
- $hash = md5( $serialized );
- $this->mMemc->set( "{$this->mMemcKey}-hash", $hash, $this->mExpiry );
- }
- if ($wgLocalMessageCacheSerialized) {
- $this->saveToLocal( $serialized,$hash );
- } else {
- $this->saveToScript( $this->mCache, $hash );
- }
- }
- }
- wfProfileOut( $fname.'-fromcache' );
+ if ( $this->mCache ) {
+ wfDebug( "MessageCache::load(): got from local cache\n" );
}
-
-
- # If there's nothing in memcached, load all the messages from the database
- if ( !$this->mCache ) {
- wfDebug( "MessageCache::load(): loading all messages\n" );
- $this->lock();
- # Other threads don't need to load the messages if another thread is doing it.
- $success = $this->mMemc->add( $this->mMemcKey.'-status', "loading", MSG_LOAD_TIMEOUT );
- if ( $success ) {
- wfProfileIn( $fname.'-load' );
- $this->loadFromDB();
- wfProfileOut( $fname.'-load' );
-
- # Save in memcached
- # Keep trying if it fails, this is kind of important
- wfProfileIn( $fname.'-save' );
- for ($i=0; $i<20 &&
- !$this->mMemc->set( $this->mMemcKey, $this->mCache, $this->mExpiry );
- $i++ ) {
- usleep(mt_rand(500000,1500000));
- }
-
- # Save to local cache
- if ( $wgLocalMessageCache !== false ) {
- $serialized = serialize( $this->mCache );
+ }
+ wfProfileOut( $fname.'-fromlocal' );
+
+ # Try memcached
+ if ( !$this->mCache ) {
+ wfProfileIn( $fname.'-fromcache' );
+ $this->setCache( $this->mMemc->get( $this->mMemcKey ) );
+ if ( $this->mCache ) {
+ wfDebug( "MessageCache::load(): got from global cache\n" );
+ # Save to local cache
+ if ( $wgLocalMessageCache !== false ) {
+ $serialized = serialize( $this->mCache );
+ if ( !$hash ) {
$hash = md5( $serialized );
$this->mMemc->set( "{$this->mMemcKey}-hash", $hash, $this->mExpiry );
- if ($wgLocalMessageCacheSerialized) {
- $this->saveToLocal( $serialized,$hash );
- } else {
- $this->saveToScript( $this->mCache, $hash );
- }
}
-
- wfProfileOut( $fname.'-save' );
- if ( $i == 20 ) {
- $this->mMemc->set( $this->mMemcKey.'-status', 'error', 60*5 );
- wfDebug( "MemCached set error in MessageCache: restart memcached server!\n" );
+ if ($wgLocalMessageCacheSerialized) {
+ $this->saveToLocal( $serialized,$hash );
+ } else {
+ $this->saveToScript( $this->mCache, $hash );
}
}
- $this->unlock();
}
+ wfProfileOut( $fname.'-fromcache' );
+ }
+
+
+ # If there's nothing in memcached, load all the messages from the database
+ if ( !$this->mCache ) {
+ wfDebug( "MessageCache::load(): cache is empty\n" );
+ $this->lock();
+ # Other threads don't need to load the messages if another thread is doing it.
+ $success = $this->mMemc->add( $this->mMemcKey.'-status', "loading", MSG_LOAD_TIMEOUT );
+ if ( $success ) {
+ wfProfileIn( $fname.'-load' );
+ wfDebug( "MessageCache::load(): loading all messages from DB\n" );
+ $this->loadFromDB();
+ wfProfileOut( $fname.'-load' );
+
+ # Save in memcached
+ # Keep trying if it fails, this is kind of important
+ wfProfileIn( $fname.'-save' );
+ for ($i=0; $i<20 &&
+ !$this->mMemc->set( $this->mMemcKey, $this->mCache, $this->mExpiry );
+ $i++ ) {
+ usleep(mt_rand(500000,1500000));
+ }
- if ( !is_array( $this->mCache ) ) {
- wfDebug( "MessageCache::load(): individual message mode\n" );
- # If it is 'loading' or 'error', switch to individual message mode, otherwise disable
- # Causing too much DB load, disabling -- TS
- $this->mDisable = true;
- /*
- if ( $this->mCache == "loading" ) {
- $this->mUseCache = false;
- } elseif ( $this->mCache == "error" ) {
- $this->mUseCache = false;
- $success = false;
+ # Save to local cache
+ if ( $wgLocalMessageCache !== false ) {
+ $serialized = serialize( $this->mCache );
+ $hash = md5( $serialized );
+ $this->mMemc->set( "{$this->mMemcKey}-hash", $hash, $this->mExpiry );
+ if ($wgLocalMessageCacheSerialized) {
+ $this->saveToLocal( $serialized,$hash );
+ } else {
+ $this->saveToScript( $this->mCache, $hash );
+ }
+ }
+
+ wfProfileOut( $fname.'-save' );
+ if ( $i == 20 ) {
+ $this->mMemc->set( $this->mMemcKey.'-status', 'error', 60*5 );
+ wfDebug( "MemCached set error in MessageCache: restart memcached server!\n" );
} else {
- $this->mDisable = true;
- $success = false;
- }*/
- $this->mCache = false;
+ $this->mMemc->delete( $this->mMemcKey.'-status' );
+ }
}
+ $this->unlock();
+ }
+
+ if ( !is_array( $this->mCache ) ) {
+ wfDebug( "MessageCache::load(): unable to load cache, disabled\n" );
+ $this->mDisable = true;
+ $this->mCache = false;
}
wfProfileOut( $fname );
$this->mDeferred = false;
@@ -291,50 +298,42 @@ class MessageCache {
* Loads all or main part of cacheable messages from the database
*/
function loadFromDB() {
- global $wgLang;
+ global $wgLang, $wgMaxMsgCacheEntrySize;
- $fname = 'MessageCache::loadFromDB';
+ wfProfileIn( __METHOD__ );
$dbr =& wfGetDB( DB_SLAVE );
- if ( !$dbr ) {
- throw new MWException( 'Invalid database object' );
- }
- $conditions = array( 'page_is_redirect' => 0,
- 'page_namespace' => NS_MEDIAWIKI);
- $res = $dbr->select( array( 'page', 'revision', 'text' ),
- array( 'page_title', 'old_text', 'old_flags' ),
- 'page_is_redirect=0 AND page_namespace='.NS_MEDIAWIKI.' AND page_latest=rev_id AND rev_text_id=old_id',
- $fname
- );
-
$this->mCache = array();
- for ( $row = $dbr->fetchObject( $res ); $row; $row = $dbr->fetchObject( $res ) ) {
- $this->mCache[$row->page_title] = Revision::getRevisionText( $row );
- }
- # Negative caching
- # Go through the language array and the extension array and make a note of
- # any keys missing from the cache
- $allMessages = Language::getMessagesFor( 'en' );
- foreach ( $allMessages as $key => $value ) {
- $uckey = $wgLang->ucfirst( $key );
- if ( !array_key_exists( $uckey, $this->mCache ) ) {
- $this->mCache[$uckey] = false;
- }
+ # Load titles for all oversized pages in the MediaWiki namespace
+ $res = $dbr->select( 'page', 'page_title',
+ array(
+ 'page_len > ' . intval( $wgMaxMsgCacheEntrySize ),
+ 'page_is_redirect' => 0,
+ 'page_namespace' => NS_MEDIAWIKI,
+ ),
+ __METHOD__ );
+ while ( $row = $dbr->fetchObject( $res ) ) {
+ $this->mCache[$row->page_title] = '!TOO BIG';
}
+ $dbr->freeResult( $res );
- # Make sure all extension messages are available
- MessageCache::loadAllMessages();
+ # Load text for the remaining pages
+ $res = $dbr->select( array( 'page', 'revision', 'text' ),
+ array( 'page_title', 'old_text', 'old_flags' ),
+ array(
+ 'page_is_redirect' => 0,
+ 'page_namespace' => NS_MEDIAWIKI,
+ 'page_latest=rev_id',
+ 'rev_text_id=old_id',
+ 'page_len <= ' . intval( $wgMaxMsgCacheEntrySize ) ),
+ __METHOD__ );
- # Add them to the cache
- foreach ( $this->mExtensionMessages as $key => $value ) {
- $uckey = $wgLang->ucfirst( $key );
- if ( !array_key_exists( $uckey, $this->mCache ) &&
- ( isset( $this->mExtensionMessages[$key][$wgLang->getCode()] ) || isset( $this->mExtensionMessages[$key]['en'] ) ) ) {
- $this->mCache[$uckey] = false;
- }
+ for ( $row = $dbr->fetchObject( $res ); $row; $row = $dbr->fetchObject( $res ) ) {
+ $this->mCache[$row->page_title] = ' ' . Revision::getRevisionText( $row );
}
-
+ $this->mCache['VERSION'] = MSG_CACHE_VERSION;
$dbr->freeResult( $res );
+ wfProfileOut( __METHOD__ );
}
/**
@@ -345,7 +344,7 @@ class MessageCache {
if ( !$this->mKeys ) {
$this->mKeys = array();
$allMessages = Language::getMessagesFor( 'en' );
- foreach ( $allMessages as $key => $value ) {
+ foreach ( $allMessages as $key => $unused ) {
$title = $wgContLang->ucfirst( $key );
array_push( $this->mKeys, $title );
}
@@ -353,21 +352,26 @@ class MessageCache {
return $this->mKeys;
}
- /**
- * @deprecated
- */
- function isCacheable( $key ) {
- return true;
- }
-
function replace( $title, $text ) {
global $wgLocalMessageCache, $wgLocalMessageCacheSerialized, $parserMemc;
+ global $wgMaxMsgCacheEntrySize;
+ wfProfileIn( __METHOD__ );
$this->lock();
$this->load();
$parserMemc->delete(wfMemcKey('sidebar'));
if ( is_array( $this->mCache ) ) {
- $this->mCache[$title] = $text;
+ if ( $text === false ) {
+ # Article was deleted
+ unset( $this->mCache[$title] );
+ $this->mMemc->delete( "$this->mMemcKey:{$title}" );
+ } elseif ( strlen( $text ) > $wgMaxMsgCacheEntrySize ) {
+ $this->mCache[$title] = '!TOO BIG';
+ $this->mMemc->set( "$this->mMemcKey:{$title}", ' '.$text, $this->mExpiry );
+ } else {
+ $this->mCache[$title] = ' ' . $text;
+ $this->mMemc->delete( "$this->mMemcKey:{$title}" );
+ }
$this->mMemc->set( $this->mMemcKey, $this->mCache, $this->mExpiry );
# Save to local cache
@@ -381,10 +385,9 @@ class MessageCache {
$this->saveToScript( $this->mCache, $hash );
}
}
-
-
}
$this->unlock();
+ wfProfileOut( __METHOD__ );
}
/**
@@ -413,9 +416,18 @@ class MessageCache {
$this->mMemc->delete( $lockKey );
}
- function get( $key, $useDB = true, $forcontent = true, $isfullkey = false ) {
+ /**
+ * Get a message from either the content language or the user language.
+ *
+ * @param string $key The message cache key
+ * @param bool $useDB Get the message from the DB, false to use only the localisation
+ * @param bool $forContent Get the message from the content language rather than the
+ * user language
+ * @param bool $isFullKey Specifies whether $key is a two part key "lang/msg".
+ */
+ function get( $key, $useDB = true, $forContent = true, $isFullKey = false ) {
global $wgContLanguageCode, $wgContLang, $wgLang;
- if( $forcontent ) {
+ if( $forContent ) {
$lang =& $wgContLang;
} else {
$lang =& $wgLang;
@@ -431,37 +443,32 @@ class MessageCache {
}
$message = false;
+
+ # Normalise title-case input
+ $lckey = $wgContLang->lcfirst( $key );
+ $lckey = str_replace( ' ', '_', $lckey );
+
+ # Try the MediaWiki namespace
if( !$this->mDisable && $useDB ) {
- $title = $wgContLang->ucfirst( $key );
- if(!$isfullkey && ($langcode != $wgContLanguageCode) ) {
+ $title = $wgContLang->ucfirst( $lckey );
+ if(!$isFullKey && ($langcode != $wgContLanguageCode) ) {
$title .= '/' . $langcode;
}
- $message = $this->getFromCache( $title );
+ $message = $this->getMsgFromNamespace( $title );
}
# Try the extension array
- if( $message === false && array_key_exists( $key, $this->mExtensionMessages ) ) {
- if ( isset( $this->mExtensionMessages[$key][$langcode] ) ) {
- $message = $this->mExtensionMessages[$key][$langcode];
- } elseif ( isset( $this->mExtensionMessages[$key]['en'] ) ) {
- $message = $this->mExtensionMessages[$key]['en'];
- }
+ if( $message === false && isset( $this->mExtensionMessages[$langcode][$lckey] ) ) {
+ $message = $this->mExtensionMessages[$langcode][$lckey];
+ }
+ if ( $message === false && isset( $this->mExtensionMessages['en'][$lckey] ) ) {
+ $message = $this->mExtensionMessages['en'][$lckey];
}
# Try the array in the language object
if( $message === false ) {
#wfDebug( "Trying language object for message $key\n" );
wfSuppressWarnings();
- $message = $lang->getMessage( $key );
- wfRestoreWarnings();
- if ( is_null( $message ) ) {
- $message = false;
- }
- }
-
- # Try the English array
- if( $message === false && $langcode != 'en' ) {
- wfSuppressWarnings();
- $message = Language::getMessage( $key );
+ $message = $lang->getMessage( $lckey );
wfRestoreWarnings();
if ( is_null( $message ) ) {
$message = false;
@@ -469,8 +476,8 @@ class MessageCache {
}
# Try the array of another language
- if( $message === false && strpos( $key, '/' ) ) {
- $message = explode( '/', $key );
+ if( $message === false && strpos( $lckey, '/' ) ) {
+ $message = explode( '/', $lckey );
if ( $message[1] ) {
wfSuppressWarnings();
$message = Language::getMessageFor( $message[0], $message[1] );
@@ -486,8 +493,8 @@ class MessageCache {
# Is this a custom message? Try the default language in the db...
if( ($message === false || $message === '-' ) &&
!$this->mDisable && $useDB &&
- !$isfullkey && ($langcode != $wgContLanguageCode) ) {
- $message = $this->getFromCache( $wgContLang->ucfirst( $key ) );
+ !$isFullKey && ($langcode != $wgContLanguageCode) ) {
+ $message = $this->getMsgFromNamespace( $wgContLang->ucfirst( $lckey ) );
}
# Final fallback
@@ -500,46 +507,70 @@ class MessageCache {
return $message;
}
- function getFromCache( $title ) {
+ /**
+ * Get a message from the MediaWiki namespace, with caching. The key must
+ * first be converted to two-part lang/msg form if necessary.
+ *
+ * @param string $title Message cache key with initial uppercase letter
+ */
+ function getMsgFromNamespace( $title ) {
$message = false;
+ $type = false;
# Try the cache
- if( $this->mUseCache && is_array( $this->mCache ) && array_key_exists( $title, $this->mCache ) ) {
- return $this->mCache[$title];
+ if( $this->mUseCache && isset( $this->mCache[$title] ) ) {
+ $entry = $this->mCache[$title];
+ $type = substr( $entry, 0, 1 );
+ if ( $type == ' ' ) {
+ return substr( $entry, 1 );
+ }
+ }
+
+ # Call message hooks, in case they are defined
+ wfRunHooks('MessagesPreLoad', array( $title, &$message ) );
+ if ( $message !== false ) {
+ return $message;
+ }
+
+ # If there is no cache entry and no placeholder, it doesn't exist
+ if ( $type != '!' && $message === false ) {
+ return false;
}
- # Try individual message cache
+ $memcKey = $this->mMemcKey . ':' . $title;
+
+ # Try the individual message cache
if ( $this->mUseCache ) {
- $message = $this->mMemc->get( $this->mMemcKey . ':' . $title );
- if ( $message == '###NONEXISTENT###' ) {
- $this->mCache[$title] = false;
- return false;
- } elseif( !is_null( $message ) ) {
- $this->mCache[$title] = $message;
- return $message;
- } else {
- $message = false;
+ $entry = $this->mMemc->get( $memcKey );
+ if ( $entry ) {
+ $type = substr( $entry, 0, 1 );
+
+ if ( $type == ' ' ) {
+ $message = substr( $entry, 1 );
+ $this->mCache[$title] = $message;
+ return $message;
+ } elseif ( $entry == '!NONEXISTENT' ) {
+ return false;
+ } else {
+ # Corrupt/obsolete entry, delete it
+ $this->mMemc->delete( $memcKey );
+ }
+
}
}
- # Call message Hooks, in case they are defined
- wfRunHooks('MessagesPreLoad',array($title,&$message));
-
- # If it wasn't in the cache, load each message from the DB individually
+ # Try loading it from the DB
$revision = Revision::newFromTitle( Title::makeTitle( NS_MEDIAWIKI, $title ) );
if( $revision ) {
$message = $revision->getText();
if ($this->mUseCache) {
- $this->mCache[$title]=$message;
- /* individual messages may be often
- recached until proper purge code exists
- */
- $this->mMemc->set( $this->mMemcKey . ':' . $title, $message, 300 );
+ $this->mCache[$title] = ' ' . $message;
+ $this->mMemc->set( $memcKey, $message, $this->mExpiry );
}
} else {
# Negative caching
# Use some special text instead of false, because false gets converted to '' somewhere
- $this->mMemc->set( $this->mMemcKey . ':' . $title, '###NONEXISTENT###', $this->mExpiry );
+ $this->mMemc->set( $memcKey, '!NONEXISTENT', $this->mExpiry );
$this->mCache[$title] = false;
}
@@ -577,7 +608,7 @@ class MessageCache {
* @param string $lang The messages language, English by default
*/
function addMessage( $key, $value, $lang = 'en' ) {
- $this->mExtensionMessages[$key][$lang] = $value;
+ $this->mExtensionMessages[$lang][$key] = $value;
}
/**
@@ -588,8 +619,24 @@ class MessageCache {
*/
function addMessages( $messages, $lang = 'en' ) {
wfProfileIn( __METHOD__ );
+ if ( isset( $this->mExtensionMessages[$lang] ) ) {
+ $this->mExtensionMessages[$lang] = $messages + $this->mExtensionMessages[$lang];
+ } else {
+ $this->mExtensionMessages[$lang] = $messages;
+ }
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Add a 2-D array of messages by lang. Useful for extensions.
+ * Introduced in 1.9. Please do not use it for now, for backwards compatibility.
+ *
+ * @param array $messages The array to be added
+ */
+ function addMessagesByLang( $messages ) {
+ wfProfileIn( __METHOD__ );
foreach ( $messages as $key => $value ) {
- $this->addMessage( $key, $value, $lang );
+ $this->addMessages( $value, $key );
}
wfProfileOut( __METHOD__ );
}
@@ -602,12 +649,11 @@ class MessageCache {
function getExtensionMessagesFor( $lang = 'en' ) {
wfProfileIn( __METHOD__ );
$messages = array();
- foreach( $this->mExtensionMessages as $key => $message ) {
- if ( isset( $message[$lang] ) ) {
- $messages[$key] = $message[$lang];
- } elseif ( isset( $message['en'] ) ) {
- $messages[$key] = $message['en'];
- }
+ if ( isset( $this->mExtensionMessages[$lang] ) ) {
+ $messages = $this->mExtensionMessages[$lang];
+ }
+ if ( $lang != 'en' ) {
+ $messages = $messages + $this->mExtensionMessages['en'];
}
wfProfileOut( __METHOD__ );
return $messages;
diff --git a/includes/Metadata.php b/includes/Metadata.php
index af40ab21..b48ced0d 100644
--- a/includes/Metadata.php
+++ b/includes/Metadata.php
@@ -22,7 +22,8 @@
*/
/**
- *
+ * TODO: Perhaps make this file into a Metadata class, with static methods (declared
+ * as private where indicated), to move these functions out of the global namespace?
*/
define('RDF_TYPE_PREFS', "application/rdf+xml,text/xml;q=0.7,application/xml;q=0.5,text/rdf;q=0.1");
@@ -142,7 +143,7 @@ function dcBasics($article) {
dcPerson('contributor', $user_parts[0], $user_parts[1], $user_parts[2]);
}
- dcRights($article);
+ dcRights();
}
/**
@@ -291,7 +292,7 @@ function dcPerson($name, $id, $user_name='', $user_real_name='') {
* different pages.
* @private
*/
-function dcRights($article) {
+function dcRights() {
global $wgRightsPage, $wgRightsUrl, $wgRightsText;
@@ -316,7 +317,11 @@ function ccGetTerms($url) {
return $wgLicenseTerms;
} else {
$known = getKnownLicenses();
- return $known[$url];
+ if( isset( $known[$url] ) ) {
+ return $known[$url];
+ } else {
+ return array();
+ }
}
}
diff --git a/includes/MimeMagic.php b/includes/MimeMagic.php
index dd197c31..ca05dbb3 100644
--- a/includes/MimeMagic.php
+++ b/includes/MimeMagic.php
@@ -403,8 +403,6 @@ class MimeMagic {
elseif ($tag==="svg") $mime= "image/svg";
elseif (strpos($doctype,"-//W3C//DTD XHTML")===0) $mime= "text/html";
elseif ($tag==="html") $mime= "text/html";
-
- $test_more= false;
}
}
diff --git a/includes/Namespace.php b/includes/Namespace.php
index 73dc2969..78493902 100644
--- a/includes/Namespace.php
+++ b/includes/Namespace.php
@@ -11,7 +11,7 @@
$wgCanonicalNamespaceNames = array(
NS_MEDIA => 'Media',
NS_SPECIAL => 'Special',
- NS_TALK => 'Talk',
+ NS_TALK => 'Talk',
NS_USER => 'User',
NS_USER_TALK => 'User_talk',
NS_PROJECT => 'Project',
@@ -24,7 +24,7 @@ $wgCanonicalNamespaceNames = array(
NS_TEMPLATE_TALK => 'Template_talk',
NS_HELP => 'Help',
NS_HELP_TALK => 'Help_talk',
- NS_CATEGORY => 'Category',
+ NS_CATEGORY => 'Category',
NS_CATEGORY_TALK => 'Category_talk',
);
diff --git a/includes/OutputPage.php b/includes/OutputPage.php
index 0d55c2e0..4ca9e88a 100644
--- a/includes/OutputPage.php
+++ b/includes/OutputPage.php
@@ -54,18 +54,34 @@ class OutputPage {
$this->mNewSectionLink = false;
}
- function redirect( $url, $responsecode = '302' ) {
+ public function redirect( $url, $responsecode = '302' ) {
# Strip newlines as a paranoia check for header injection in PHP<5.1.2
$this->mRedirect = str_replace( "\n", '', $url );
$this->mRedirectCode = $responsecode;
}
+ /**
+ * Set the HTTP status code to send with the output.
+ *
+ * @param int $statusCode
+ * @return nothing
+ */
function setStatusCode( $statusCode ) { $this->mStatusCode = $statusCode; }
# To add an http-equiv meta tag, precede the name with "http:"
function addMeta( $name, $val ) { array_push( $this->mMetatags, array( $name, $val ) ); }
function addKeyword( $text ) { array_push( $this->mKeywords, $text ); }
function addScript( $script ) { $this->mScripts .= $script; }
+
+ /**
+ * Add a self-contained script tag with the given contents
+ * @param string $script JavaScript text, no <script> tags
+ */
+ function addInlineScript( $script ) {
+ global $wgJsMimeType;
+ $this->mScripts .= "<script type=\"$wgJsMimeType\"><!--\n$script\n--></script>";
+ }
+
function getScript() { return $this->mScripts; }
function setETag($tag) { $this->mETag = $tag; }
@@ -88,8 +104,9 @@ class OutputPage {
/**
* checkLastModified tells the client to use the client-cached page if
* possible. If sucessful, the OutputPage is disabled so that
- * any future call to OutputPage->output() have no effect. The method
- * returns true iff cache-ok headers was sent.
+ * any future call to OutputPage->output() have no effect.
+ *
+ * @return bool True iff cache-ok headers was sent.
*/
function checkLastModified ( $timestamp ) {
global $wgCachePages, $wgCacheEpoch, $wgUser, $wgRequest;
@@ -127,7 +144,12 @@ class OutputPage {
$this->sendCacheControl();
wfDebug( "$fname: CACHED client: $ismodsince ; user: $wgUser->mTouched ; page: $timestamp ; site $wgCacheEpoch\n", false );
$this->disable();
- @ob_end_clean(); // Don't output compressed blob
+
+ // Don't output a compressed blob when using ob_gzhandler;
+ // it's technically against HTTP spec and seems to confuse
+ // Firefox when the response gets split over two packets.
+ wfClearOutputBuffers();
+
return true;
} else {
wfDebug( "$fname: READY client: $ismodsince ; user: $wgUser->mTouched ; page: $timestamp ; site $wgCacheEpoch\n", false );
@@ -162,9 +184,9 @@ class OutputPage {
}
}
- function setRobotpolicy( $str ) { $this->mRobotpolicy = $str; }
- function setHTMLTitle( $name ) {$this->mHTMLtitle = $name; }
- function setPageTitle( $name ) {
+ public function setRobotpolicy( $str ) { $this->mRobotpolicy = $str; }
+ public function setHTMLTitle( $name ) {$this->mHTMLtitle = $name; }
+ public function setPageTitle( $name ) {
global $action, $wgContLang;
$name = $wgContLang->convert($name, true);
$this->mPagetitle = $name;
@@ -177,50 +199,50 @@ class OutputPage {
$this->setHTMLTitle( wfMsg( 'pagetitle', $name ) );
}
- function getHTMLTitle() { return $this->mHTMLtitle; }
- function getPageTitle() { return $this->mPagetitle; }
- function setSubtitle( $str ) { $this->mSubtitle = /*$this->parse(*/$str/*)*/; } // @bug 2514
- function getSubtitle() { return $this->mSubtitle; }
- function isArticle() { return $this->mIsarticle; }
- function setPrintable() { $this->mPrintable = true; }
- function isPrintable() { return $this->mPrintable; }
- function setSyndicated( $show = true ) { $this->mShowFeedLinks = $show; }
- function isSyndicated() { return $this->mShowFeedLinks; }
- function setOnloadHandler( $js ) { $this->mOnloadHandler = $js; }
- function getOnloadHandler() { return $this->mOnloadHandler; }
- function disable() { $this->mDoNothing = true; }
-
- function setArticleRelated( $v ) {
+ public function getHTMLTitle() { return $this->mHTMLtitle; }
+ public function getPageTitle() { return $this->mPagetitle; }
+ public function setSubtitle( $str ) { $this->mSubtitle = /*$this->parse(*/$str/*)*/; } // @bug 2514
+ public function getSubtitle() { return $this->mSubtitle; }
+ public function isArticle() { return $this->mIsarticle; }
+ public function setPrintable() { $this->mPrintable = true; }
+ public function isPrintable() { return $this->mPrintable; }
+ public function setSyndicated( $show = true ) { $this->mShowFeedLinks = $show; }
+ public function isSyndicated() { return $this->mShowFeedLinks; }
+ public function setOnloadHandler( $js ) { $this->mOnloadHandler = $js; }
+ public function getOnloadHandler() { return $this->mOnloadHandler; }
+ public function disable() { $this->mDoNothing = true; }
+
+ public function setArticleRelated( $v ) {
$this->mIsArticleRelated = $v;
if ( !$v ) {
$this->mIsarticle = false;
}
}
- function setArticleFlag( $v ) {
+ public function setArticleFlag( $v ) {
$this->mIsarticle = $v;
if ( $v ) {
$this->mIsArticleRelated = $v;
}
}
- function isArticleRelated() { return $this->mIsArticleRelated; }
+ public function isArticleRelated() { return $this->mIsArticleRelated; }
- function getLanguageLinks() { return $this->mLanguageLinks; }
- function addLanguageLinks($newLinkArray) {
+ public function getLanguageLinks() { return $this->mLanguageLinks; }
+ public function addLanguageLinks($newLinkArray) {
$this->mLanguageLinks += $newLinkArray;
}
- function setLanguageLinks($newLinkArray) {
+ public function setLanguageLinks($newLinkArray) {
$this->mLanguageLinks = $newLinkArray;
}
- function getCategoryLinks() {
+ public function getCategoryLinks() {
return $this->mCategoryLinks;
}
/**
* Add an array of categories, with names in the keys
*/
- function addCategoryLinks($categories) {
+ public function addCategoryLinks($categories) {
global $wgUser, $wgContLang;
if ( !is_array( $categories ) ) {
@@ -233,32 +255,32 @@ class OutputPage {
$lb->execute();
$sk =& $wgUser->getSkin();
- foreach ( $categories as $category => $arbitrary ) {
+ foreach ( $categories as $category => $unused ) {
$title = Title::makeTitleSafe( NS_CATEGORY, $category );
$text = $wgContLang->convertHtml( $title->getText() );
$this->mCategoryLinks[] = $sk->makeLinkObj( $title, $text );
}
}
- function setCategoryLinks($categories) {
+ public function setCategoryLinks($categories) {
$this->mCategoryLinks = array();
$this->addCategoryLinks($categories);
}
- function suppressQuickbar() { $this->mSuppressQuickbar = true; }
- function isQuickbarSuppressed() { return $this->mSuppressQuickbar; }
+ public function suppressQuickbar() { $this->mSuppressQuickbar = true; }
+ public function isQuickbarSuppressed() { return $this->mSuppressQuickbar; }
- function addHTML( $text ) { $this->mBodytext .= $text; }
- function clearHTML() { $this->mBodytext = ''; }
- function getHTML() { return $this->mBodytext; }
- function debug( $text ) { $this->mDebugtext .= $text; }
+ public function addHTML( $text ) { $this->mBodytext .= $text; }
+ public function clearHTML() { $this->mBodytext = ''; }
+ public function getHTML() { return $this->mBodytext; }
+ public function debug( $text ) { $this->mDebugtext .= $text; }
/* @deprecated */
- function setParserOptions( $options ) {
+ public function setParserOptions( $options ) {
return $this->parserOptions( $options );
}
- function parserOptions( $options = null ) {
+ public function parserOptions( $options = null ) {
if ( !$this->mParserOptions ) {
$this->mParserOptions = new ParserOptions;
}
@@ -271,7 +293,7 @@ class OutputPage {
* @param mixed $revid an integer, or NULL
* @return mixed previous value
*/
- function setRevisionId( $revid ) {
+ public function setRevisionId( $revid ) {
$val = is_null( $revid ) ? null : intval( $revid );
return wfSetVar( $this->mRevisionId, $val );
}
@@ -280,17 +302,20 @@ class OutputPage {
* Convert wikitext to HTML and add it to the buffer
* Default assumes that the current page title will
* be used.
+ *
+ * @param string $text
+ * @param bool $linestart
*/
- function addWikiText( $text, $linestart = true ) {
+ public function addWikiText( $text, $linestart = true ) {
global $wgTitle;
$this->addWikiTextTitle($text, $wgTitle, $linestart);
}
- function addWikiTextWithTitle($text, &$title, $linestart = true) {
+ public function addWikiTextWithTitle($text, &$title, $linestart = true) {
$this->addWikiTextTitle($text, $title, $linestart);
}
- function addWikiTextTitle($text, &$title, $linestart) {
+ private function addWikiTextTitle($text, &$title, $linestart) {
global $wgParser;
$fname = 'OutputPage:addWikiTextTitle';
wfProfileIn($fname);
@@ -301,7 +326,11 @@ class OutputPage {
wfProfileOut($fname);
}
- function addParserOutputNoText( &$parserOutput ) {
+ /**
+ * @todo document
+ * @param ParserOutput object &$parserOutput
+ */
+ public function addParserOutputNoText( &$parserOutput ) {
$this->mLanguageLinks += $parserOutput->getLanguageLinks();
$this->addCategoryLinks( $parserOutput->getCategories() );
$this->mNewSectionLink = $parserOutput->getNewSection();
@@ -319,6 +348,10 @@ class OutputPage {
wfRunHooks( 'OutputPageParserOutput', array( &$this, $parserOutput ) );
}
+ /**
+ * @todo document
+ * @param ParserOutput &$parserOutput
+ */
function addParserOutput( &$parserOutput ) {
$this->addParserOutputNoText( $parserOutput );
$text = $parserOutput->getText();
@@ -328,9 +361,13 @@ class OutputPage {
/**
* Add wikitext to the buffer, assuming that this is the primary text for a page view
- * Saves the text into the parser cache if possible
+ * Saves the text into the parser cache if possible.
+ *
+ * @param string $text
+ * @param Article $article
+ * @param bool $cache
*/
- function addPrimaryWikiText( $text, $article, $cache = true ) {
+ public function addPrimaryWikiText( $text, $article, $cache = true ) {
global $wgParser, $wgUser;
$popts = $this->parserOptions();
@@ -348,8 +385,11 @@ class OutputPage {
/**
* For anything that isn't primary text or interface message
+ *
+ * @param string $text
+ * @param bool $linestart Is this the start of a line?
*/
- function addSecondaryWikiText( $text, $linestart = true ) {
+ public function addSecondaryWikiText( $text, $linestart = true ) {
global $wgTitle;
$popts = $this->parserOptions();
$popts->setTidy(true);
@@ -360,9 +400,10 @@ class OutputPage {
/**
* Add the output of a QuickTemplate to the output buffer
+ *
* @param QuickTemplate $template
*/
- function addTemplate( &$template ) {
+ public function addTemplate( &$template ) {
ob_start();
$template->execute();
$this->addHTML( ob_get_contents() );
@@ -371,8 +412,12 @@ class OutputPage {
/**
* Parse wikitext and return the HTML.
+ *
+ * @param string $text
+ * @param bool $linestart Is this the start of a line?
+ * @param bool $interface ??
*/
- function parse( $text, $linestart = true, $interface = false ) {
+ public function parse( $text, $linestart = true, $interface = false ) {
global $wgParser, $wgTitle;
$popts = $this->parserOptions();
if ( $interface) { $popts->setInterfaceMessage(true); }
@@ -383,12 +428,12 @@ class OutputPage {
}
/**
- * @param $article
- * @param $user
+ * @param Article $article
+ * @param User $user
*
- * @return bool
+ * @return bool True if successful, else false.
*/
- function tryParserCache( &$article, $user ) {
+ public function tryParserCache( &$article, $user ) {
$parserCache =& ParserCache::singleton();
$parserOutput = $parserCache->get( $article, $user );
if ( $parserOutput !== false ) {
@@ -400,18 +445,17 @@ class OutputPage {
}
/**
- * Set the maximum cache time on the Squid in seconds
- * @param $maxage
+ * @param int $maxage Maximum cache time on the Squid, in seconds.
*/
- function setSquidMaxage( $maxage ) {
+ public function setSquidMaxage( $maxage ) {
$this->mSquidMaxage = $maxage;
}
/**
* Use enableClientCache(false) to force it to send nocache headers
- * @param $state
+ * @param $state ??
*/
- function enableClientCache( $state ) {
+ public function enableClientCache( $state ) {
return wfSetVar( $this->mEnableClientCache, $state );
}
@@ -421,7 +465,7 @@ class OutputPage {
&& $wgRequest->getText('uselang', false) === false;
}
- function sendCacheControl() {
+ public function sendCacheControl() {
global $wgUseSquid, $wgUseESI, $wgUseETag, $wgSquidMaxage, $wgRequest;
$fname = 'OutputPage::sendCacheControl';
@@ -477,10 +521,11 @@ class OutputPage {
* Finally, all the text has been munged and accumulated into
* the object, let's actually output it:
*/
- function output() {
+ public function output() {
global $wgUser, $wgOutputEncoding, $wgRequest;
global $wgContLanguageCode, $wgDebugRedirects, $wgMimeType;
- global $wgJsMimeType, $wgStylePath, $wgUseAjax, $wgAjaxSearch, $wgScriptPath, $wgServer;
+ global $wgJsMimeType, $wgStylePath, $wgUseAjax, $wgAjaxSearch, $wgAjaxWatch;
+ global $wgServer, $wgStyleVersion;
if( $this->mDoNothing ){
return;
@@ -490,12 +535,15 @@ class OutputPage {
$sk = $wgUser->getSkin();
if ( $wgUseAjax ) {
- $this->addScript( "<script type=\"{$wgJsMimeType}\" src=\"{$wgStylePath}/common/ajax.js\"></script>\n" );
- }
+ $this->addScript( "<script type=\"{$wgJsMimeType}\" src=\"{$wgStylePath}/common/ajax.js?$wgStyleVersion\"></script>\n" );
+ if( $wgAjaxSearch ) {
+ $this->addScript( "<script type=\"{$wgJsMimeType}\" src=\"{$wgStylePath}/common/ajaxsearch.js\"></script>\n" );
+ $this->addScript( "<script type=\"{$wgJsMimeType}\">hookEvent(\"load\", sajax_onload);</script>\n" );
+ }
- if ( $wgUseAjax && $wgAjaxSearch ) {
- $this->addScript( "<script type=\"{$wgJsMimeType}\" src=\"{$wgStylePath}/common/ajaxsearch.js\"></script>\n" );
- $this->addScript( "<script type=\"{$wgJsMimeType}\">hookEvent(\"load\", sajax_onload);</script>\n" );
+ if( $wgAjaxWatch && $wgUser->isLoggedIn() ) {
+ $this->addScript( "<script type=\"{$wgJsMimeType}\" src=\"{$wgStylePath}/common/ajaxwatch.js\"></script>\n" );
+ }
}
if ( '' != $this->mRedirect ) {
@@ -601,7 +649,11 @@ class OutputPage {
wfProfileOut( $fname );
}
- function out( $ins ) {
+ /**
+ * @todo document
+ * @param string $ins
+ */
+ public function out( $ins ) {
global $wgInputEncoding, $wgOutputEncoding, $wgContLang;
if ( 0 == strcmp( $wgInputEncoding, $wgOutputEncoding ) ) {
$outs = $ins;
@@ -612,7 +664,10 @@ class OutputPage {
print $outs;
}
- function setEncodings() {
+ /**
+ * @todo document
+ */
+ public static function setEncodings() {
global $wgInputEncoding, $wgOutputEncoding;
global $wgUser, $wgContLang;
@@ -626,19 +681,20 @@ class OutputPage {
}
/**
- * Returns a HTML comment with the elapsed time since request.
- * This method has no side effects.
- * Use wfReportTime() instead.
+ * Deprecated, use wfReportTime() instead.
* @return string
* @deprecated
*/
- function reportTime() {
+ public function reportTime() {
$time = wfReportTime();
return $time;
}
/**
- * Produce a "user is blocked" page
+ * Produce a "user is blocked" page.
+ *
+ * @param bool $return Whether to have a "return to $wgTitle" message or not.
+ * @return nothing
*/
function blockedPage( $return = true ) {
global $wgUser, $wgContLang, $wgTitle;
@@ -658,7 +714,9 @@ class OutputPage {
}
$link = '[[' . $wgContLang->getNsText( NS_USER ) . ":{$name}|{$name}]]";
- $this->addWikiText( wfMsg( 'blockedtext', $link, $reason, $ip, $name ) );
+ $blockid = $wgUser->mBlock->mId;
+
+ $this->addWikiText( wfMsg( 'blockedtext', $link, $reason, $ip, $name, $blockid ) );
# Don't auto-return to special pages
if( $return ) {
@@ -668,9 +726,13 @@ class OutputPage {
}
/**
- * Note: these arguments are keys into wfMsg(), not text!
+ * Outputs a pretty page to explain why the request exploded.
+ *
+ * @param string $title Message key for page title.
+ * @param string $msg Message key for page text.
+ * @return nothing
*/
- function showErrorPage( $title, $msg ) {
+ public function showErrorPage( $title, $msg ) {
global $wgTitle;
$this->mDebugtext .= 'Original title: ' .
@@ -688,7 +750,7 @@ class OutputPage {
}
/** @obsolete */
- function errorpage( $title, $msg ) {
+ public function errorpage( $title, $msg ) {
throw new ErrorPageError( $title, $msg );
}
@@ -698,7 +760,7 @@ class OutputPage {
*
* @param mixed $version The version of MediaWiki needed to use the page
*/
- function versionRequired( $version ) {
+ public function versionRequired( $version ) {
$this->setPageTitle( wfMsg( 'versionrequired', $version ) );
$this->setHTMLTitle( wfMsg( 'versionrequired', $version ) );
$this->setRobotpolicy( 'noindex,nofollow' );
@@ -711,9 +773,10 @@ class OutputPage {
/**
* Display an error page noting that a given permission bit is required.
+ *
* @param string $permission key required
*/
- function permissionRequired( $permission ) {
+ public function permissionRequired( $permission ) {
global $wgGroupPermissions, $wgUser;
$this->setPageTitle( wfMsg( 'badaccess' ) );
@@ -751,23 +814,25 @@ class OutputPage {
}
/**
+ * Use permissionRequired.
* @deprecated
*/
- function sysopRequired() {
+ public function sysopRequired() {
throw new MWException( "Call to deprecated OutputPage::sysopRequired() method\n" );
}
/**
+ * Use permissionRequired.
* @deprecated
*/
- function developerRequired() {
+ public function developerRequired() {
throw new MWException( "Call to deprecated OutputPage::developerRequired() method\n" );
}
/**
* Produce the stock "please login to use the wiki" page
*/
- function loginToUse() {
+ public function loginToUse() {
global $wgUser, $wgTitle, $wgContLang;
if( $wgUser->isLoggedIn() ) {
@@ -782,40 +847,45 @@ class OutputPage {
$this->setRobotPolicy( 'noindex,nofollow' );
$this->setArticleFlag( false );
- $loginTitle = Title::makeTitle( NS_SPECIAL, 'Userlogin' );
+ $loginTitle = SpecialPage::getTitleFor( 'Userlogin' );
$loginLink = $skin->makeKnownLinkObj( $loginTitle, wfMsgHtml( 'loginreqlink' ), 'returnto=' . $wgTitle->getPrefixedUrl() );
$this->addHtml( wfMsgWikiHtml( 'loginreqpagetext', $loginLink ) );
$this->addHtml( "\n<!--" . $wgTitle->getPrefixedUrl() . "-->" );
# Don't return to the main page if the user can't read it
# otherwise we'll end up in a pointless loop
- $mainPage = Title::newFromText( wfMsgForContent( 'mainpage' ) );
+ $mainPage = Title::newMainPage();
if( $mainPage->userCanRead() )
$this->returnToMain( true, $mainPage );
}
/** @obsolete */
- function databaseError( $fname, $sql, $error, $errno ) {
+ public function databaseError( $fname, $sql, $error, $errno ) {
throw new MWException( "OutputPage::databaseError is obsolete\n" );
}
- function readOnlyPage( $source = null, $protected = false ) {
+ /**
+ * @todo document
+ * @param bool $protected Is the reason the page can't be reached because it's protected?
+ * @param mixed $source
+ */
+ public function readOnlyPage( $source = null, $protected = false ) {
global $wgUser, $wgReadOnlyFile, $wgReadOnly, $wgTitle;
+ $skin = $wgUser->getSkin();
$this->setRobotpolicy( 'noindex,nofollow' );
$this->setArticleRelated( false );
if( $protected ) {
- $skin = $wgUser->getSkin();
$this->setPageTitle( wfMsg( 'viewsource' ) );
$this->setSubtitle( wfMsg( 'viewsourcefor', $skin->makeKnownLinkObj( $wgTitle ) ) );
-
+
# Determine if protection is due to the page being a system message
# and show an appropriate explanation
if( $wgTitle->getNamespace() == NS_MEDIAWIKI && !$wgUser->isAllowed( 'editinterface' ) ) {
$this->addWikiText( wfMsg( 'protectedinterface' ) );
} else {
- $this->addWikiText( wfMsg( 'protectedtext' ) );
+ $this->addWikiText( wfMsg( 'protectedpagetext' ) );
}
} else {
$this->setPageTitle( wfMsg( 'readonly' ) );
@@ -828,7 +898,8 @@ class OutputPage {
}
if( is_string( $source ) ) {
- if( strcmp( $source, '' ) == 0 ) {
+ $this->addWikiText( wfMsg( 'viewsourcetext' ) );
+ if( $source === '' ) {
global $wgTitle;
if ( $wgTitle->getNamespace() == NS_MEDIAWIKI ) {
$source = wfMsgWeirdKey ( $wgTitle->getText() );
@@ -838,46 +909,48 @@ class OutputPage {
}
$rows = $wgUser->getIntOption( 'rows' );
$cols = $wgUser->getIntOption( 'cols' );
-
+
$text = "\n<textarea name='wpTextbox1' id='wpTextbox1' cols='$cols' rows='$rows' readonly='readonly'>" .
htmlspecialchars( $source ) . "\n</textarea>";
$this->addHTML( $text );
}
+ $article = new Article($wgTitle);
+ $this->addHTML( $skin->formatTemplates($article->getUsedTemplates()) );
$this->returnToMain( false );
}
/** @obsolete */
- function fatalError( $message ) {
+ public function fatalError( $message ) {
throw new FatalError( $message );
}
/** @obsolete */
- function unexpectedValueError( $name, $val ) {
+ public function unexpectedValueError( $name, $val ) {
throw new FatalError( wfMsg( 'unexpected', $name, $val ) );
}
/** @obsolete */
- function fileCopyError( $old, $new ) {
+ public function fileCopyError( $old, $new ) {
throw new FatalError( wfMsg( 'filecopyerror', $old, $new ) );
}
/** @obsolete */
- function fileRenameError( $old, $new ) {
+ public function fileRenameError( $old, $new ) {
throw new FatalError( wfMsg( 'filerenameerror', $old, $new ) );
}
/** @obsolete */
- function fileDeleteError( $name ) {
+ public function fileDeleteError( $name ) {
throw new FatalError( wfMsg( 'filedeleteerror', $name ) );
}
/** @obsolete */
- function fileNotFoundError( $name ) {
+ public function fileNotFoundError( $name ) {
throw new FatalError( wfMsg( 'filenotfound', $name ) );
}
- function showFatalError( $message ) {
+ public function showFatalError( $message ) {
$this->setPageTitle( wfMsg( "internalerror" ) );
$this->setRobotpolicy( "noindex,nofollow" );
$this->setArticleRelated( false );
@@ -886,23 +959,23 @@ class OutputPage {
$this->mBodytext = $message;
}
- function showUnexpectedValueError( $name, $val ) {
+ public function showUnexpectedValueError( $name, $val ) {
$this->showFatalError( wfMsg( 'unexpected', $name, $val ) );
}
- function showFileCopyError( $old, $new ) {
+ public function showFileCopyError( $old, $new ) {
$this->showFatalError( wfMsg( 'filecopyerror', $old, $new ) );
}
- function showFileRenameError( $old, $new ) {
+ public function showFileRenameError( $old, $new ) {
$this->showFatalError( wfMsg( 'filerenameerror', $old, $new ) );
}
- function showFileDeleteError( $name ) {
+ public function showFileDeleteError( $name ) {
$this->showFatalError( wfMsg( 'filedeleteerror', $name ) );
}
- function showFileNotFoundError( $name ) {
+ public function showFileNotFoundError( $name ) {
$this->showFatalError( wfMsg( 'filenotfound', $name ) );
}
@@ -911,7 +984,7 @@ class OutputPage {
* @param $auto automatically redirect the user after 10 seconds
* @param $returnto page title to return to. Default is Main Page.
*/
- function returnToMain( $auto = true, $returnto = NULL ) {
+ public function returnToMain( $auto = true, $returnto = NULL ) {
global $wgUser, $wgOut, $wgRequest;
if ( $returnto == NULL ) {
@@ -919,7 +992,7 @@ class OutputPage {
}
if ( '' === $returnto ) {
- $returnto = wfMsgForContent( 'mainpage' );
+ $returnto = Title::newMainPage();
}
if ( is_object( $returnto ) ) {
@@ -944,8 +1017,10 @@ class OutputPage {
/**
* This function takes the title (first item of mGoodLinks), categories, existing and broken links for the page
* and uses the first 10 of them for META keywords
+ *
+ * @param ParserOutput &$parserOutput
*/
- function addKeywords( &$parserOutput ) {
+ private function addKeywords( &$parserOutput ) {
global $wgTitle;
$this->addKeyword( $wgTitle->getPrefixedText() );
$count = 1;
@@ -953,8 +1028,8 @@ class OutputPage {
if ( !is_array( $links2d ) ) {
return;
}
- foreach ( $links2d as $ns => $dbkeys ) {
- foreach( $dbkeys as $dbkey => $id ) {
+ foreach ( $links2d as $dbkeys ) {
+ foreach( $dbkeys as $dbkey => $unused ) {
$this->addKeyword( $dbkey );
if ( ++$count > 10 ) {
break 2;
@@ -964,12 +1039,12 @@ class OutputPage {
}
/**
- * @access private
- * @return string
+ * @return string The doctype, opening <html>, and head element.
*/
- function headElement() {
+ public function headElement() {
global $wgDocType, $wgDTD, $wgContLanguageCode, $wgOutputEncoding, $wgMimeType;
- global $wgUser, $wgContLang, $wgUseTrackbacks, $wgTitle;
+ global $wgXhtmlDefaultNamespace, $wgXhtmlNamespaces;
+ global $wgUser, $wgContLang, $wgUseTrackbacks, $wgTitle, $wgStyleVersion;
if( $wgMimeType == 'text/xml' || $wgMimeType == 'application/xhtml+xml' || $wgMimeType == 'application/xml' ) {
$ret = "<?xml version=\"1.0\" encoding=\"$wgOutputEncoding\" ?>\n";
@@ -984,7 +1059,11 @@ class OutputPage {
}
$rtl = $wgContLang->isRTL() ? " dir='RTL'" : '';
- $ret .= "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"$wgContLanguageCode\" lang=\"$wgContLanguageCode\" $rtl>\n";
+ $ret .= "<html xmlns=\"{$wgXhtmlDefaultNamespace}\" ";
+ foreach($wgXhtmlNamespaces as $tag => $ns) {
+ $ret .= "xmlns:{$tag}=\"{$ns}\" ";
+ }
+ $ret .= "xml:lang=\"$wgContLanguageCode\" lang=\"$wgContLanguageCode\" $rtl>\n";
$ret .= "<head>\n<title>" . htmlspecialchars( $this->getHTMLTitle() ) . "</title>\n";
array_push( $this->mMetatags, array( "http:Content-type", "$wgMimeType; charset={$wgOutputEncoding}" ) );
@@ -995,7 +1074,7 @@ class OutputPage {
} else {
$media = "media='print'";
}
- $printsheet = htmlspecialchars( "$wgStylePath/common/wikiprintable.css" );
+ $printsheet = htmlspecialchars( "$wgStylePath/common/wikiprintable.css?$wgStyleVersion" );
$ret .= "<link rel='stylesheet' type='text/css' $media href='$printsheet' />\n";
$sk = $wgUser->getSkin();
@@ -1010,7 +1089,10 @@ class OutputPage {
return $ret;
}
- function getHeadLinks() {
+ /**
+ * @return string HTML tag links to be put in the header.
+ */
+ public function getHeadLinks() {
global $wgRequest;
$ret = '';
foreach ( $this->mMetatags as $tag ) {
@@ -1060,9 +1142,8 @@ class OutputPage {
* Turn off regular page output and return an error reponse
* for when rate limiting has triggered.
* @todo i18n
- * @access public
*/
- function rateLimited() {
+ public function rateLimited() {
global $wgOut;
$wgOut->disable();
wfHttpError( 500, 'Internal Server Error',
@@ -1075,9 +1156,8 @@ class OutputPage {
*
* @return bool True if the parser output instructs us to add one
*/
- function showNewSectionLink() {
+ public function showNewSectionLink() {
return $this->mNewSectionLink;
}
-
}
?>
diff --git a/includes/PageHistory.php b/includes/PageHistory.php
index d7f426fc..aea0f0ed 100644
--- a/includes/PageHistory.php
+++ b/includes/PageHistory.php
@@ -70,7 +70,7 @@ class PageHistory {
$wgOut->setRobotpolicy( 'noindex,nofollow' );
$wgOut->setSyndicated( true );
- $logPage = Title::makeTitle( NS_SPECIAL, 'Log' );
+ $logPage = SpecialPage::getTitleFor( 'Log' );
$logLink = $this->mSkin->makeKnownLinkObj( $logPage, wfMsgHtml( 'viewpagelogs' ), 'page=' . $this->mTitle->getPrefixedUrl() );
$subtitle = wfMsgHtml( 'revhistory' ) . '<br />' . $logLink;
@@ -106,12 +106,11 @@ class PageHistory {
* Do the list
*/
$pager = new PageHistoryPager( $this );
- $navbar = $pager->getNavigationBar();
$this->linesonpage = $pager->getNumRows();
$wgOut->addHTML(
$pager->getNavigationBar() .
$this->beginHistoryList() .
- $pager->getBody() .
+ $pager->getBody() .
$this->endHistoryList() .
$pager->getNavigationBar()
);
@@ -166,7 +165,19 @@ class PageHistory {
: '';
}
- /** @todo document */
+ /**
+ * Returns a row from the history printout.
+ *
+ * @todo document some more, and maybe clean up the code (some params redundant?)
+ *
+ * @param object $row The database row corresponding to the line (or is it the previous line?).
+ * @param object $next The database row corresponding to the next line (or is it this one?).
+ * @param int $counter Apparently a counter of what row number we're at, counted from the top row = 1.
+ * @param $notificationtimestamp
+ * @param bool $latest Whether this row corresponds to the page's latest revision.
+ * @param bool $firstInList Whether this row corresponds to the first displayed on this history page.
+ * @return string HTML output for the row
+ */
function historyLine( $row, $next, $counter = '', $notificationtimestamp = false, $latest = false, $firstInList = false ) {
global $wgUser;
$rev = new Revision( $row );
@@ -184,7 +195,7 @@ class PageHistory {
$s .= "($curlink) ($lastlink) $arbitrary";
if( $wgUser->isAllowed( 'deleterevision' ) ) {
- $revdel = Title::makeTitle( NS_SPECIAL, 'Revisiondelete' );
+ $revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
if( $firstInList ) {
// We don't currently handle well changing the top revision's settings
$del = wfMsgHtml( 'rev-delundel' );
@@ -210,6 +221,9 @@ class PageHistory {
if( $row->rev_deleted & Revision::DELETED_TEXT ) {
$s .= ' ' . wfMsgHtml( 'deletedrev' );
}
+ if( $wgUser->isAllowed( 'rollback' ) && $latest ) {
+ $s .= ' '.$this->mSkin->generateRollback( $rev );
+ }
$s .= "</li>\n";
return $s;
diff --git a/includes/Pager.php b/includes/Pager.php
index b14aa8ca..0987cc06 100644
--- a/includes/Pager.php
+++ b/includes/Pager.php
@@ -323,7 +323,7 @@ abstract class IndexPager implements Pager {
$next = array( 'offset' => $this->mLastShown, 'limit' => $urlLimit );
$last = array( 'dir' => 'prev', 'limit' => $urlLimit );
}
- return compact( 'prev', 'next', 'first', 'last' );
+ return array( 'prev' => $prev, 'next' => $next, 'first' => $first, 'last' => $last );
}
/**
@@ -487,7 +487,7 @@ abstract class TablePager extends IndexPager {
}
function getEndBody() {
- return '</tbody></table>';
+ return "</tbody></table>\n";
}
function getEmptyBody() {
@@ -553,7 +553,7 @@ abstract class TablePager extends IndexPager {
'next' => $wgContLang->isRTL() ? 'arrow_disabled_left_25.png' : 'arrow_disabled_right_25.png',
'last' => $wgContLang->isRTL() ? 'arrow_disabled_first_25.png' : 'arrow_disabled_last_25.png',
);
-
+
$linkTexts = array();
$disabledTexts = array();
foreach ( $labels as $type => $label ) {
@@ -564,12 +564,12 @@ abstract class TablePager extends IndexPager {
$links = $this->getPagingLinks( $linkTexts, $disabledTexts );
$navClass = htmlspecialchars( $this->getNavClass() );
- $s = "<table class=\"$navClass\" align=\"center\" cellpadding=\"3\"><tr>";
+ $s = "<table class=\"$navClass\" align=\"center\" cellpadding=\"3\"><tr>\n";
$cellAttrs = 'valign="top" align="center" width="' . 100 / count( $links ) . '%"';
foreach ( $labels as $type => $label ) {
$s .= "<td $cellAttrs>{$links[$type]}</td>\n";
}
- $s .= '</tr></table>';
+ $s .= "</tr></table>\n";
return $s;
}
diff --git a/includes/Parser.php b/includes/Parser.php
index 76783448..8d67279d 100644
--- a/includes/Parser.php
+++ b/includes/Parser.php
@@ -62,13 +62,15 @@ define( 'MW_COLON_STATE_COMMENTDASHDASH', 7 );
* Processes wiki markup
*
* <pre>
- * There are three main entry points into the Parser class:
+ * There are four main entry points into the Parser class:
* parse()
* produces HTML output
* preSaveTransform().
* produces altered wiki markup.
* transformMsg()
* performs brace substitution on MediaWiki messages
+ * preprocess()
+ * removes HTML comments and expands templates
*
* Globals used:
* objects: $wgLang, $wgContLang
@@ -78,7 +80,7 @@ define( 'MW_COLON_STATE_COMMENTDASHDASH', 7 );
* settings:
* $wgUseTex*, $wgUseDynamicDates*, $wgInterwikiMagic*,
* $wgNamespacesWithSubpages, $wgAllowExternalImages*,
- * $wgLocaltimezone, $wgAllowSpecialInclusion*,
+ * $wgLocaltimezone, $wgAllowSpecialInclusion*,
* $wgMaxArticleSize*
*
* * only within ParserOptions
@@ -95,10 +97,10 @@ class Parser
var $mTagHooks, $mFunctionHooks, $mFunctionSynonyms, $mVariables;
# Cleared with clearState():
- var $mOutput, $mAutonumber, $mDTopen, $mStripState = array();
+ var $mOutput, $mAutonumber, $mDTopen, $mStripState;
var $mIncludeCount, $mArgStack, $mLastSection, $mInPre;
var $mInterwikiLinkHolders, $mLinkHolders, $mUniqPrefix;
- var $mIncludeSizes;
+ var $mIncludeSizes, $mDefaultSort;
var $mTemplates, // cache of already loaded templates, avoids
// multiple SQL queries for the same string
$mTemplatePath; // stores an unsorted hash of all the templates already loaded
@@ -110,7 +112,9 @@ class Parser
$mTitle, // Title context, used for self-link rendering and similar things
$mOutputType, // Output type, one of the OT_xxx constants
$ot, // Shortcut alias, see setOutputType()
- $mRevisionId; // ID to display in {{REVISIONID}} tags
+ $mRevisionId, // ID to display in {{REVISIONID}} tags
+ $mRevisionTimestamp, // The timestamp of the specified revision ID
+ $mRevIdForTs; // The revision ID which was used to fetch the timestamp
/**#@-*/
@@ -162,6 +166,8 @@ class Parser
$this->setFunctionHook( 'padleft', array( 'CoreParserFunctions', 'padleft' ), SFH_NO_HASH );
$this->setFunctionHook( 'padright', array( 'CoreParserFunctions', 'padright' ), SFH_NO_HASH );
$this->setFunctionHook( 'anchorencode', array( 'CoreParserFunctions', 'anchorencode' ), SFH_NO_HASH );
+ $this->setFunctionHook( 'special', array( 'CoreParserFunctions', 'special' ) );
+ $this->setFunctionHook( 'defaultsort', array( 'CoreParserFunctions', 'defaultsort' ), SFH_NO_HASH );
if ( $wgAllowDisplayTitle ) {
$this->setFunctionHook( 'displaytitle', array( 'CoreParserFunctions', 'displaytitle' ), SFH_NO_HASH );
@@ -169,12 +175,11 @@ class Parser
if ( $wgAllowSlowParserFunctions ) {
$this->setFunctionHook( 'pagesinnamespace', array( 'CoreParserFunctions', 'pagesinnamespace' ), SFH_NO_HASH );
}
-
- $this->initialiseVariables();
+ $this->initialiseVariables();
$this->mFirstCall = false;
wfProfileOut( __METHOD__ );
- }
+ }
/**
* Clear Parser state
@@ -191,7 +196,7 @@ class Parser
$this->mLastSection = '';
$this->mDTopen = false;
$this->mIncludeCount = array();
- $this->mStripState = array();
+ $this->mStripState = new StripState;
$this->mArgStack = array();
$this->mInPre = false;
$this->mInterwikiLinkHolders = array(
@@ -205,7 +210,7 @@ class Parser
'texts' => array(),
'titles' => array()
);
- $this->mRevisionId = null;
+ $this->mRevisionTimestamp = $this->mRevisionId = null;
/**
* Prefix for temporary replacement strings for the multipass parser.
@@ -227,6 +232,7 @@ class Parser
'post-expand' => 0,
'arg' => 0
);
+ $this->mDefaultSort = false;
wfRunHooks( 'ParserClearState', array( &$this ) );
wfProfileOut( __METHOD__ );
@@ -273,6 +279,7 @@ class Parser
global $wgUseTidy, $wgAlwaysUseTidy, $wgContLang;
$fname = 'Parser::parse-' . wfGetCaller();
+ wfProfileIn( __METHOD__ );
wfProfileIn( $fname );
if ( $clearState ) {
@@ -282,22 +289,17 @@ class Parser
$this->mOptions = $options;
$this->mTitle =& $title;
$oldRevisionId = $this->mRevisionId;
+ $oldRevisionTimestamp = $this->mRevisionTimestamp;
if( $revid !== null ) {
$this->mRevisionId = $revid;
+ $this->mRevisionTimestamp = null;
}
$this->setOutputType( OT_HTML );
-
- //$text = $this->strip( $text, $this->mStripState );
- // VOODOO MAGIC FIX! Sometimes the above segfaults in PHP5.
- $x =& $this->mStripState;
-
- wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$x ) );
- $text = $this->strip( $text, $x );
- wfRunHooks( 'ParserAfterStrip', array( &$this, &$text, &$x ) );
-
+ wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState ) );
+ $text = $this->strip( $text, $this->mStripState );
+ wfRunHooks( 'ParserAfterStrip', array( &$this, &$text, &$this->mStripState ) );
$text = $this->internalParse( $text );
-
- $text = $this->unstrip( $text, $this->mStripState );
+ $text = $this->mStripState->unstripGeneral( $text );
# Clean up special characters, only run once, next-to-last before doBlockLevels
$fixtags = array(
@@ -320,7 +322,7 @@ class Parser
# Side-effects: this calls $this->mOutput->setTitleText()
$text = $wgContLang->parserConvert( $text, $this );
- $text = $this->unstripNoWiki( $text, $this->mStripState );
+ $text = $this->mStripState->unstripNoWiki( $text );
wfRunHooks( 'ParserBeforeTidy', array( &$this, &$text ) );
@@ -370,7 +372,9 @@ class Parser
}
$this->mOutput->setText( $text );
$this->mRevisionId = $oldRevisionId;
+ $this->mRevisionTimestamp = $oldRevisionTimestamp;
wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
return $this->mOutput;
}
@@ -381,10 +385,9 @@ class Parser
*/
function recursiveTagParse( $text ) {
wfProfileIn( __METHOD__ );
- $x =& $this->mStripState;
- wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$x ) );
- $text = $this->strip( $text, $x );
- wfRunHooks( 'ParserAfterStrip', array( &$this, &$text, &$x ) );
+ wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState ) );
+ $text = $this->strip( $text, $this->mStripState );
+ wfRunHooks( 'ParserAfterStrip', array( &$this, &$text, &$this->mStripState ) );
$text = $this->internalParse( $text );
wfProfileOut( __METHOD__ );
return $text;
@@ -400,16 +403,14 @@ class Parser
$this->setOutputType( OT_PREPROCESS );
$this->mOptions = $options;
$this->mTitle = $title;
- $x =& $this->mStripState;
- wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$x ) );
- $text = $this->strip( $text, $x );
- wfRunHooks( 'ParserAfterStrip', array( &$this, &$text, &$x ) );
+ wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$this->mStripState ) );
+ $text = $this->strip( $text, $this->mStripState );
+ wfRunHooks( 'ParserAfterStrip', array( &$this, &$text, &$this->mStripState ) );
if ( $this->mOptions->getRemoveComments() ) {
$text = Sanitizer::removeHTMLcomments( $text );
}
$text = $this->replaceVariables( $text );
- $text = $this->unstrip( $text, $x );
- $text = $this->unstripNowiki( $text, $x );
+ $text = $this->mStripState->unstripBoth( $text );
wfProfileOut( __METHOD__ );
return $text;
}
@@ -503,7 +504,7 @@ class Parser
$text = $q[2];
}
}
-
+
$matches[$marker] = array( $element,
$content,
Sanitizer::decodeTagAttributes( $attributes ),
@@ -516,25 +517,29 @@ class Parser
* Strips and renders nowiki, pre, math, hiero
* If $render is set, performs necessary rendering operations on plugins
* Returns the text, and fills an array with data needed in unstrip()
- * If the $state is already a valid strip state, it adds to the state
+ *
+ * @param StripState $state
*
* @param bool $stripcomments when set, HTML comments <!-- like this -->
* will be stripped in addition to other tags. This is important
* for section editing, where these comments cause confusion when
* counting the sections in the wikisource
- *
+ *
* @param array dontstrip contains tags which should not be stripped;
* used to prevent stipping of <gallery> when saving (fixes bug 2700)
*
* @private
*/
- function strip( $text, &$state, $stripcomments = false , $dontstrip = array () ) {
+ function strip( $text, $state, $stripcomments = false , $dontstrip = array () ) {
+ global $wgContLang;
wfProfileIn( __METHOD__ );
$render = ($this->mOutputType == OT_HTML);
$uniq_prefix = $this->mUniqPrefix;
- $commentState = array();
-
+ $commentState = new ReplacementArray;
+ $nowikiItems = array();
+ $generalItems = array();
+
$elements = array_merge(
array( 'nowiki', 'gallery' ),
array_keys( $this->mTagHooks ) );
@@ -545,13 +550,13 @@ class Parser
if( $this->mOptions->getUseTeX() ) {
$elements[] = 'math';
}
-
+
# Removing $dontstrip tags from $elements list (currently only 'gallery', fixing bug 2700)
foreach ( $elements AS $k => $v ) {
if ( !in_array ( $v , $dontstrip ) ) continue;
unset ( $elements[$k] );
}
-
+
$matches = array();
$text = Parser::extractTagsAndParams( $elements, $text, $matches, $uniq_prefix );
@@ -578,10 +583,10 @@ class Parser
}
// Shouldn't happen otherwise. :)
case 'nowiki':
- $output = wfEscapeHTMLTagsOnly( $content );
+ $output = Xml::escapeTagsOnly( $content );
break;
case 'math':
- $output = MathRenderer::renderMath( $content );
+ $output = $wgContLang->armourMath( MathRenderer::renderMath( $content ) );
break;
case 'gallery':
$output = $this->renderImageGallery( $content, $params );
@@ -600,18 +605,22 @@ class Parser
$output = $tag;
}
- // Unstrip the output, because unstrip() is no longer recursive so
- // it won't do it itself
- $output = $this->unstrip( $output, $state );
+ // Unstrip the output, to support recursive strip() calls
+ $output = $state->unstripBoth( $output );
if( !$stripcomments && $element == '!--' ) {
- $commentState[$marker] = $output;
+ $commentState->setPair( $marker, $output );
} elseif ( $element == 'html' || $element == 'nowiki' ) {
- $state['nowiki'][$marker] = $output;
+ $nowikiItems[$marker] = $output;
} else {
- $state['general'][$marker] = $output;
+ $generalItems[$marker] = $output;
}
}
+ # Add the new items to the state
+ # We do this after the loop instead of during it to avoid slowing
+ # down the recursive unstrip
+ $state->nowiki->mergeArray( $nowikiItems );
+ $state->general->mergeArray( $generalItems );
# Unstrip comments unless explicitly told otherwise.
# (The comments are always stripped prior to this point, so as to
@@ -619,7 +628,7 @@ class Parser
# a comment.)
if ( !$stripcomments ) {
// Put them all back and forget them
- $text = strtr( $text, $commentState );
+ $text = $commentState->replace( $text );
}
wfProfileOut( __METHOD__ );
@@ -631,35 +640,27 @@ class Parser
*
* always call unstripNoWiki() after this one
* @private
+ * @deprecated use $this->mStripState->unstrip()
*/
- function unstrip( $text, &$state ) {
- if ( !isset( $state['general'] ) ) {
- return $text;
- }
-
- wfProfileIn( __METHOD__ );
- # TODO: good candidate for FSS
- $text = strtr( $text, $state['general'] );
- wfProfileOut( __METHOD__ );
- return $text;
+ function unstrip( $text, $state ) {
+ return $state->unstripGeneral( $text );
}
/**
* Always call this after unstrip() to preserve the order
*
* @private
+ * @deprecated use $this->mStripState->unstrip()
*/
- function unstripNoWiki( $text, &$state ) {
- if ( !isset( $state['nowiki'] ) ) {
- return $text;
- }
+ function unstripNoWiki( $text, $state ) {
+ return $state->unstripNoWiki( $text );
+ }
- wfProfileIn( __METHOD__ );
- # TODO: good candidate for FSS
- $text = strtr( $text, $state['nowiki'] );
- wfProfileOut( __METHOD__ );
-
- return $text;
+ /**
+ * @deprecated use $this->mStripState->unstripBoth()
+ */
+ function unstripForHTML( $text ) {
+ return $this->mStripState->unstripBoth( $text );
}
/**
@@ -671,10 +672,7 @@ class Parser
*/
function insertStripItem( $text, &$state ) {
$rnd = $this->mUniqPrefix . '-item' . Parser::getRandomString();
- if ( !$state ) {
- $state = array();
- }
- $state['general'][$rnd] = $text;
+ $state->general->setPair( $rnd, $text );
return $rnd;
}
@@ -791,135 +789,191 @@ class Parser
*
* @private
*/
- function doTableStuff ( $t ) {
+ function doTableStuff ( $text ) {
$fname = 'Parser::doTableStuff';
wfProfileIn( $fname );
- $t = explode ( "\n" , $t ) ;
- $td = array () ; # Is currently a td tag open?
- $ltd = array () ; # Was it TD or TH?
- $tr = array () ; # Is currently a tr tag open?
- $ltr = array () ; # tr attributes
- $has_opened_tr = array(); # Did this table open a <tr> element?
- $indent_level = 0; # indent level of the table
- foreach ( $t AS $k => $x )
+ $lines = explode ( "\n" , $text );
+ $td_history = array (); // Is currently a td tag open?
+ $last_tag_history = array (); // Save history of last lag activated (td, th or caption)
+ $tr_history = array (); // Is currently a tr tag open?
+ $tr_attributes = array (); // history of tr attributes
+ $has_opened_tr = array(); // Did this table open a <tr> element?
+ $indent_level = 0; // indent level of the table
+ foreach ( $lines as $key => $line )
{
- $x = trim ( $x ) ;
- $fc = substr ( $x , 0 , 1 ) ;
- if ( preg_match( '/^(:*)\{\|(.*)$/', $x, $matches ) ) {
+ $line = trim ( $line );
+
+ if( $line == '' ) { // empty line, go to next line
+ continue;
+ }
+ $first_character = $line{0};
+ $matches = array();
+
+ if ( preg_match( '/^(:*)\{\|(.*)$/' , $line , $matches ) ) {
+ // First check if we are starting a new table
$indent_level = strlen( $matches[1] );
- $attributes = $this->unstripForHTML( $matches[2] );
+ $attributes = $this->mStripState->unstripBoth( $matches[2] );
+ $attributes = Sanitizer::fixTagAttributes ( $attributes , 'table' );
+
+ $lines[$key] = str_repeat( '<dl><dd>' , $indent_level ) . "<table{$attributes}>";
+ array_push ( $td_history , false );
+ array_push ( $last_tag_history , '' );
+ array_push ( $tr_history , false );
+ array_push ( $tr_attributes , '' );
+ array_push ( $has_opened_tr , false );
+ } else if ( count ( $td_history ) == 0 ) {
+ // Don't do any of the following
+ continue;
+ } else if ( substr ( $line , 0 , 2 ) == '|}' ) {
+ // We are ending a table
+ $line = '</table>' . substr ( $line , 2 );
+ $last_tag = array_pop ( $last_tag_history );
- $t[$k] = str_repeat( '<dl><dd>', $indent_level ) .
- '<table' . Sanitizer::fixTagAttributes ( $attributes, 'table' ) . '>' ;
- array_push ( $td , false ) ;
- array_push ( $ltd , '' ) ;
- array_push ( $tr , false ) ;
- array_push ( $ltr , '' ) ;
- array_push ( $has_opened_tr, false );
- }
- else if ( count ( $td ) == 0 ) { } # Don't do any of the following
- else if ( '|}' == substr ( $x , 0 , 2 ) ) {
- $z = "</table>" . substr ( $x , 2);
- $l = array_pop ( $ltd ) ;
- if ( !array_pop ( $has_opened_tr ) ) $z = "<tr><td></td></tr>" . $z ;
- if ( array_pop ( $tr ) ) $z = '</tr>' . $z ;
- if ( array_pop ( $td ) ) $z = '</'.$l.'>' . $z ;
- array_pop ( $ltr ) ;
- $t[$k] = $z . str_repeat( '</dd></dl>', $indent_level );
- }
- else if ( '|-' == substr ( $x , 0 , 2 ) ) { # Allows for |---------------
- $x = substr ( $x , 1 ) ;
- while ( $x != '' && substr ( $x , 0 , 1 ) == '-' ) $x = substr ( $x , 1 ) ;
- $z = '' ;
- $l = array_pop ( $ltd ) ;
+ if ( !array_pop ( $has_opened_tr ) ) {
+ $line = "<tr><td></td></tr>{$line}";
+ }
+
+ if ( array_pop ( $tr_history ) ) {
+ $line = "</tr>{$line}";
+ }
+
+ if ( array_pop ( $td_history ) ) {
+ $line = "</{$last_tag}>{$line}";
+ }
+ array_pop ( $tr_attributes );
+ $lines[$key] = $line . str_repeat( '</dd></dl>' , $indent_level );
+ } else if ( substr ( $line , 0 , 2 ) == '|-' ) {
+ // Now we have a table row
+ $line = preg_replace( '#^\|-+#', '', $line );
+
+ // Whats after the tag is now only attributes
+ $attributes = $this->mStripState->unstripBoth( $line );
+ $attributes = Sanitizer::fixTagAttributes ( $attributes , 'tr' );
+ array_pop ( $tr_attributes );
+ array_push ( $tr_attributes , $attributes );
+
+ $line = '';
+ $last_tag = array_pop ( $last_tag_history );
array_pop ( $has_opened_tr );
- array_push ( $has_opened_tr , true ) ;
- if ( array_pop ( $tr ) ) $z = '</tr>' . $z ;
- if ( array_pop ( $td ) ) $z = '</'.$l.'>' . $z ;
- array_pop ( $ltr ) ;
- $t[$k] = $z ;
- array_push ( $tr , false ) ;
- array_push ( $td , false ) ;
- array_push ( $ltd , '' ) ;
- $attributes = $this->unstripForHTML( $x );
- array_push ( $ltr , Sanitizer::fixTagAttributes ( $attributes, 'tr' ) ) ;
+ array_push ( $has_opened_tr , true );
+
+ if ( array_pop ( $tr_history ) ) {
+ $line = '</tr>';
+ }
+
+ if ( array_pop ( $td_history ) ) {
+ $line = "</{$last_tag}>{$line}";
+ }
+
+ $lines[$key] = $line;
+ array_push ( $tr_history , false );
+ array_push ( $td_history , false );
+ array_push ( $last_tag_history , '' );
}
- else if ( '|' == $fc || '!' == $fc || '|+' == substr ( $x , 0 , 2 ) ) { # Caption
- # $x is a table row
- if ( '|+' == substr ( $x , 0 , 2 ) ) {
- $fc = '+' ;
- $x = substr ( $x , 1 ) ;
+ else if ( $first_character == '|' || $first_character == '!' || substr ( $line , 0 , 2 ) == '|+' ) {
+ // This might be cell elements, td, th or captions
+ if ( substr ( $line , 0 , 2 ) == '|+' ) {
+ $first_character = '+';
+ $line = substr ( $line , 1 );
+ }
+
+ $line = substr ( $line , 1 );
+
+ if ( $first_character == '!' ) {
+ $line = str_replace ( '!!' , '||' , $line );
}
- $after = substr ( $x , 1 ) ;
- if ( $fc == '!' ) $after = str_replace ( '!!' , '||' , $after ) ;
// Split up multiple cells on the same line.
- // FIXME: This can result in improper nesting of tags processed
+ // FIXME : This can result in improper nesting of tags processed
// by earlier parser steps, but should avoid splitting up eg
// attribute values containing literal "||".
- $after = wfExplodeMarkup( '||', $after );
+ $cells = StringUtils::explodeMarkup( '||' , $line );
- $t[$k] = '' ;
+ $lines[$key] = '';
- # Loop through each table cell
- foreach ( $after AS $theline )
+ // Loop through each table cell
+ foreach ( $cells as $cell )
{
- $z = '' ;
- if ( $fc != '+' )
+ $previous = '';
+ if ( $first_character != '+' )
{
- $tra = array_pop ( $ltr ) ;
- if ( !array_pop ( $tr ) ) $z = '<tr'.$tra.">\n" ;
- array_push ( $tr , true ) ;
- array_push ( $ltr , '' ) ;
+ $tr_after = array_pop ( $tr_attributes );
+ if ( !array_pop ( $tr_history ) ) {
+ $previous = "<tr{$tr_after}>\n";
+ }
+ array_push ( $tr_history , true );
+ array_push ( $tr_attributes , '' );
array_pop ( $has_opened_tr );
- array_push ( $has_opened_tr , true ) ;
+ array_push ( $has_opened_tr , true );
+ }
+
+ $last_tag = array_pop ( $last_tag_history );
+
+ if ( array_pop ( $td_history ) ) {
+ $previous = "</{$last_tag}>{$previous}";
}
- $l = array_pop ( $ltd ) ;
- if ( array_pop ( $td ) ) $z = '</'.$l.'>' . $z ;
- if ( $fc == '|' ) $l = 'td' ;
- else if ( $fc == '!' ) $l = 'th' ;
- else if ( $fc == '+' ) $l = 'caption' ;
- else $l = '' ;
- array_push ( $ltd , $l ) ;
-
- # Cell parameters
- $y = explode ( '|' , $theline , 2 ) ;
- # Note that a '|' inside an invalid link should not
- # be mistaken as delimiting cell parameters
- if ( strpos( $y[0], '[[' ) !== false ) {
- $y = array ($theline);
+ if ( $first_character == '|' ) {
+ $last_tag = 'td';
+ } else if ( $first_character == '!' ) {
+ $last_tag = 'th';
+ } else if ( $first_character == '+' ) {
+ $last_tag = 'caption';
+ } else {
+ $last_tag = '';
}
- if ( count ( $y ) == 1 )
- $y = "{$z}<{$l}>{$y[0]}" ;
+
+ array_push ( $last_tag_history , $last_tag );
+
+ // A cell could contain both parameters and data
+ $cell_data = explode ( '|' , $cell , 2 );
+
+ // Bug 553: Note that a '|' inside an invalid link should not
+ // be mistaken as delimiting cell parameters
+ if ( strpos( $cell_data[0], '[[' ) !== false ) {
+ $cell = "{$previous}<{$last_tag}>{$cell}";
+ } else if ( count ( $cell_data ) == 1 )
+ $cell = "{$previous}<{$last_tag}>{$cell_data[0]}";
else {
- $attributes = $this->unstripForHTML( $y[0] );
- $y = "{$z}<{$l}".Sanitizer::fixTagAttributes($attributes, $l).">{$y[1]}" ;
+ $attributes = $this->mStripState->unstripBoth( $cell_data[0] );
+ $attributes = Sanitizer::fixTagAttributes( $attributes , $last_tag );
+ $cell = "{$previous}<{$last_tag}{$attributes}>{$cell_data[1]}";
}
- $t[$k] .= $y ;
- array_push ( $td , true ) ;
+
+ $lines[$key] .= $cell;
+ array_push ( $td_history , true );
}
}
}
- # Closing open td, tr && table
- while ( count ( $td ) > 0 )
+ // Closing open td, tr && table
+ while ( count ( $td_history ) > 0 )
{
- $l = array_pop ( $ltd ) ;
- if ( array_pop ( $td ) ) $t[] = '</td>' ;
- if ( array_pop ( $tr ) ) $t[] = '</tr>' ;
- if ( !array_pop ( $has_opened_tr ) ) $t[] = "<tr><td></td></tr>" ;
- $t[] = '</table>' ;
+ if ( array_pop ( $td_history ) ) {
+ $lines[] = '</td>' ;
+ }
+ if ( array_pop ( $tr_history ) ) {
+ $lines[] = '</tr>' ;
+ }
+ if ( !array_pop ( $has_opened_tr ) ) {
+ $lines[] = "<tr><td></td></tr>" ;
+ }
+
+ $lines[] = '</table>' ;
+ }
+
+ $output = implode ( "\n" , $lines ) ;
+
+ // special case: don't return empty table
+ if( $output == "<table>\n<tr><td></td></tr>\n</table>" ) {
+ $output = '';
}
- $t = implode ( "\n" , $t ) ;
- # special case: don't return empty table
- if($t == "<table>\n<tr><td></td></tr>\n</table>")
- $t = '';
wfProfileOut( $fname );
- return $t ;
+
+ return $output;
}
/**
@@ -935,7 +989,7 @@ class Parser
wfProfileIn( $fname );
# Hook to suspend the parser in this state
- if ( !wfRunHooks( 'ParserBeforeInternalParse', array( &$this, &$text, &$x ) ) ) {
+ if ( !wfRunHooks( 'ParserBeforeInternalParse', array( &$this, &$text, &$this->mStripState ) ) ) {
wfProfileOut( $fname );
return $text ;
}
@@ -943,7 +997,7 @@ class Parser
# Remove <noinclude> tags and <includeonly> sections
$text = strtr( $text, array( '<onlyinclude>' => '' , '</onlyinclude>' => '' ) );
$text = strtr( $text, array( '<noinclude>' => '', '</noinclude>' => '') );
- $text = preg_replace( '/<includeonly>.*?<\/includeonly>/s', '', $text );
+ $text = StringUtils::delimiterReplace( '<includeonly>', '</includeonly>', '', $text );
$text = Sanitizer::removeHTMLtags( $text, array( &$this, 'attributeStripCallback' ) );
@@ -987,15 +1041,19 @@ class Parser
*/
function &doMagicLinks( &$text ) {
wfProfileIn( __METHOD__ );
- $text = preg_replace_callback(
+ $text = preg_replace_callback(
'!(?: # Start cases
<a.*?</a> | # Skip link text
<.*?> | # Skip stuff inside HTML elements
(?:RFC|PMID)\s+([0-9]+) | # RFC or PMID, capture number as m[1]
- ISBN\s+([0-9Xx-]+) # ISBN, capture number as m[2]
+ ISBN\s+(\b # ISBN, capture number as m[2]
+ (?: 97[89] [\ \-]? )? # optional 13-digit ISBN prefix
+ (?: [0-9] [\ \-]? ){9} # 9 digits with opt. delimiters
+ [0-9Xx] # check digit
+ \b)
)!x', array( &$this, 'magicLinkCallback' ), $text );
wfProfileOut( __METHOD__ );
- return $text;
+ return $text;
}
function magicLinkCallback( $m ) {
@@ -1004,12 +1062,12 @@ class Parser
return $m[0];
} elseif ( substr( $m[0], 0, 4 ) == 'ISBN' ) {
$isbn = $m[2];
- $num = strtr( $isbn, array(
+ $num = strtr( $isbn, array(
'-' => '',
' ' => '',
'x' => 'X',
));
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Booksources' );
+ $titleObj = SpecialPage::getTitleFor( 'Booksources' );
$text = '<a href="' .
$titleObj->escapeLocalUrl( "isbn=$num" ) .
"\" class=\"internal\">ISBN $isbn</a>";
@@ -1023,10 +1081,10 @@ class Parser
$urlmsg = 'pubmedurl';
$id = $m[1];
} else {
- throw new MWException( __METHOD__.': unrecognised match type "' .
+ throw new MWException( __METHOD__.': unrecognised match type "' .
substr($m[0], 0, 20 ) . '"' );
}
-
+
$url = wfMsg( $urlmsg, $id);
$sk =& $this->mOptions->getSkin();
$la = $sk->getExternalLinkAttributes( $url, $keyword.$id );
@@ -1106,9 +1164,9 @@ class Parser
}
# Count the number of occurrences of bold and italics mark-ups.
# We are not counting sequences of five apostrophes.
- if ( strlen( $arr[$i] ) == 2 ) $numitalics++; else
- if ( strlen( $arr[$i] ) == 3 ) $numbold++; else
- if ( strlen( $arr[$i] ) == 5 ) { $numitalics++; $numbold++; }
+ if ( strlen( $arr[$i] ) == 2 ) { $numitalics++; }
+ else if ( strlen( $arr[$i] ) == 3 ) { $numbold++; }
+ else if ( strlen( $arr[$i] ) == 5 ) { $numitalics++; $numbold++; }
}
$i++;
}
@@ -1264,6 +1322,7 @@ class Parser
# The characters '<' and '>' (which were escaped by
# removeHTMLtags()) should not be included in
# URLs, per RFC 2396.
+ $m2 = array();
if (preg_match('/&(lt|gt);/', $url, $m2, PREG_OFFSET_CAPTURE)) {
$text = substr($url, $m2[0][1]) . ' ' . $text;
$url = substr($url, 0, $m2[0][1]);
@@ -1299,7 +1358,7 @@ class Parser
}
$text = $wgContLang->markNoConversion($text);
-
+
$url = Sanitizer::cleanUrl( $url );
# Process the trail (i.e. everything after this link up until start of the next link),
@@ -1342,6 +1401,7 @@ class Parser
$protocol = $bits[$i++];
$remainder = $bits[$i++];
+ $m = array();
if ( preg_match( '/^('.EXT_LINK_URL_CLASS.'+)(.*)$/s', $remainder, $m ) ) {
# Found some characters after the protocol that look promising
$url = $protocol . $m[1];
@@ -1349,10 +1409,10 @@ class Parser
# special case: handle urls as url args:
# http://www.example.com/foo?=http://www.example.com/bar
- if(strlen($trail) == 0 &&
+ if(strlen($trail) == 0 &&
isset($bits[$i]) &&
preg_match('/^'. wfUrlProtocols() . '$/S', $bits[$i]) &&
- preg_match( '/^('.EXT_LINK_URL_CLASS.'+)(.*)$/s', $bits[$i + 1], $m ))
+ preg_match( '/^('.EXT_LINK_URL_CLASS.'+)(.*)$/s', $bits[$i + 1], $m ))
{
# add protocol, arg
$url .= $bits[$i] . $m[1]; # protocol, url as arg to previous link
@@ -1363,6 +1423,7 @@ class Parser
# The characters '<' and '>' (which were escaped by
# removeHTMLtags()) should not be included in
# URLs, per RFC 2396.
+ $m2 = array();
if (preg_match('/&(lt|gt);/', $url, $m2, PREG_OFFSET_CAPTURE)) {
$trail = substr($url, $m2[0][1]) . $trail;
$url = substr($url, 0, $m2[0][1]);
@@ -1498,6 +1559,7 @@ class Parser
$nottalk = !$this->mTitle->isTalkPage();
if ( $useLinkPrefixExtension ) {
+ $m = array();
if ( preg_match( $e2, $s, $m ) ) {
$first_prefix = $m[2];
} else {
@@ -1507,7 +1569,10 @@ class Parser
$prefix = '';
}
- $selflink = $this->mTitle->getPrefixedText();
+ if($wgContLang->hasVariants())
+ $selflink = $wgContLang->convertLinkToAllVariants($this->mTitle->getPrefixedText());
+ else
+ $selflink = array($this->mTitle->getPrefixedText());
$useSubpages = $this->areSubpagesAllowed();
wfProfileOut( $fname.'-setup' );
@@ -1543,10 +1608,10 @@ class Parser
# Still some problems for cases where the ] is meant to be outside punctuation,
# and no image is in sight. See bug 2095.
#
- if( $text !== '' &&
- substr( $m[3], 0, 1 ) === ']' &&
- strpos($text, '[') !== false
- )
+ if( $text !== '' &&
+ substr( $m[3], 0, 1 ) === ']' &&
+ strpos($text, '[') !== false
+ )
{
$text .= ']'; # so that replaceExternalLinks($text) works later
$m[3] = substr( $m[3], 1 );
@@ -1595,7 +1660,7 @@ class Parser
wfProfileOut( "$fname-misc" );
wfProfileIn( "$fname-title" );
- $nt = Title::newFromText( $this->unstripNoWiki($link, $this->mStripState) );
+ $nt = Title::newFromText( $this->mStripState->unstripNoWiki($link) );
if( !$nt ) {
$s .= $prefix . '[[' . $line;
wfProfileOut( "$fname-title" );
@@ -1605,7 +1670,7 @@ class Parser
$ns = $nt->getNamespace();
$iw = $nt->getInterWiki();
wfProfileOut( "$fname-title" );
-
+
if ($might_be_img) { # if this is actually an invalid link
wfProfileIn( "$fname-might_be_img" );
if ($ns == NS_IMAGE && $noforce) { #but might be an image
@@ -1693,11 +1758,7 @@ class Parser
$s = rtrim($s . "\n"); # bug 87
if ( $wasblank ) {
- if ( $this->mTitle->getNamespace() == NS_CATEGORY ) {
- $sortkey = $this->mTitle->getText();
- } else {
- $sortkey = $this->mTitle->getPrefixedText();
- }
+ $sortkey = $this->getDefaultSort();
} else {
$sortkey = $text;
}
@@ -1717,7 +1778,7 @@ class Parser
}
}
- if( ( $nt->getPrefixedText() === $selflink ) &&
+ if( ( in_array( $nt->getPrefixedText(), $selflink ) ) &&
( $nt->getFragment() === '' ) ) {
# Self-links are handled specially; generally de-link and change to bold.
$s .= $prefix . $sk->makeSelfLinkObj( $nt, $text, '', $trail );
@@ -1819,7 +1880,7 @@ class Parser
* @return string less-or-more HTML with NOPARSE bits
*/
function armorLinks( $text ) {
- return preg_replace( "/\b(" . wfUrlProtocols() . ')/',
+ return preg_replace( '/\b(' . wfUrlProtocols() . ')/',
"{$this->mUniqPrefix}NOPARSE$1", $text );
}
@@ -2073,10 +2134,10 @@ class Parser
wfProfileIn( "$fname-paragraph" );
# No prefix (not in list)--go to paragraph mode
// XXX: use a stack for nestable elements like span, table and div
- $openmatch = preg_match('/(<table|<blockquote|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<li|<\\/center|<\\/tr|<\\/td|<\\/th)/iS', $t );
+ $openmatch = preg_match('/(<table|<blockquote|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
$closematch = preg_match(
'/(<\\/table|<\\/blockquote|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'.
- '<td|<th|<div|<\\/div|<hr|<\\/pre|<\\/p|'.$this->mUniqPrefix.'-pre|<\\/li|<\\/ul|<\\/ol|<center)/iS', $t );
+ '<td|<th|<\\/?div|<hr|<\\/pre|<\\/p|'.$this->mUniqPrefix.'-pre|<\\/li|<\\/ul|<\\/ol|<\\/?center)/iS', $t );
if ( $openmatch or $closematch ) {
$paragraphStack = false;
# TODO bug 5718: paragraph closed
@@ -2326,9 +2387,11 @@ class Parser
* expensive to check many times.
*/
static $varCache = array();
- if ( wfRunHooks( 'ParserGetVariableValueVarCache', array( &$this, &$varCache ) ) )
- if ( isset( $varCache[$index] ) )
+ if ( wfRunHooks( 'ParserGetVariableValueVarCache', array( &$this, &$varCache ) ) ) {
+ if ( isset( $varCache[$index] ) ) {
return $varCache[$index];
+ }
+ }
$ts = time();
wfRunHooks( 'ParserGetVariableValueTs', array( &$this, &$ts ) );
@@ -2416,15 +2479,15 @@ class Parser
case 'revisionid':
return $this->mRevisionId;
case 'revisionday':
- return intval( substr( wfRevisionTimestamp( $this->mRevisionId ), 6, 2 ) );
+ return intval( substr( $this->getRevisionTimestamp(), 6, 2 ) );
case 'revisionday2':
- return substr( wfRevisionTimestamp( $this->mRevisionId ), 6, 2 );
+ return substr( $this->getRevisionTimestamp(), 6, 2 );
case 'revisionmonth':
- return intval( substr( wfRevisionTimestamp( $this->mRevisionId ), 4, 2 ) );
+ return intval( substr( $this->getRevisionTimestamp(), 4, 2 ) );
case 'revisionyear':
- return substr( wfRevisionTimestamp( $this->mRevisionId ), 0, 4 );
+ return substr( $this->getRevisionTimestamp(), 0, 4 );
case 'revisiontimestamp':
- return wfRevisionTimestamp( $this->mRevisionId );
+ return $this->getRevisionTimestamp();
case 'namespace':
return str_replace('_',' ',$wgContLang->getNsText( $this->mTitle->getNamespace() ) );
case 'namespacee':
@@ -2466,15 +2529,15 @@ class Parser
case 'localdow':
return $varCache[$index] = $wgContLang->formatNum( $localDayOfWeek );
case 'numberofarticles':
- return $varCache[$index] = $wgContLang->formatNum( wfNumberOfArticles() );
+ return $varCache[$index] = $wgContLang->formatNum( SiteStats::articles() );
case 'numberoffiles':
- return $varCache[$index] = $wgContLang->formatNum( wfNumberOfFiles() );
+ return $varCache[$index] = $wgContLang->formatNum( SiteStats::images() );
case 'numberofusers':
- return $varCache[$index] = $wgContLang->formatNum( wfNumberOfUsers() );
+ return $varCache[$index] = $wgContLang->formatNum( SiteStats::users() );
case 'numberofpages':
- return $varCache[$index] = $wgContLang->formatNum( wfNumberOfPages() );
+ return $varCache[$index] = $wgContLang->formatNum( SiteStats::pages() );
case 'numberofadmins':
- return $varCache[$index] = $wgContLang->formatNum( wfNumberOfAdmins() );
+ return $varCache[$index] = $wgContLang->formatNum( SiteStats::admins() );
case 'currenttimestamp':
return $varCache[$index] = wfTimestampNow();
case 'localtimestamp':
@@ -2543,7 +2606,7 @@ class Parser
$lastOpeningBrace = -1; # last not closed parentheses
$validOpeningBraces = implode( '', array_keys( $callbacks ) );
-
+
$i = 0;
while ( $i < strlen( $text ) ) {
# Find next opening brace, closing brace or pipe
@@ -2597,13 +2660,13 @@ class Parser
$maxCount = $openingBraceStack[$lastOpeningBrace]['count'];
$count = strspn( $text, $text[$i], $i, $maxCount );
- # check for maximum matching characters (if there are 5 closing
+ # check for maximum matching characters (if there are 5 closing
# characters, we will probably need only 3 - depending on the rules)
$matchingCount = 0;
$matchingCallback = null;
$cbType = $callbacks[$openingBraceStack[$lastOpeningBrace]['brace']];
if ( $count > $cbType['max'] ) {
- # The specified maximum exists in the callback array, unless the caller
+ # The specified maximum exists in the callback array, unless the caller
# has made an error
$matchingCount = $cbType['max'];
} else {
@@ -2624,12 +2687,12 @@ class Parser
# let's set a title or last part (if '|' was found)
if (null === $openingBraceStack[$lastOpeningBrace]['parts']) {
- $openingBraceStack[$lastOpeningBrace]['title'] =
- substr($text, $openingBraceStack[$lastOpeningBrace]['partStart'],
+ $openingBraceStack[$lastOpeningBrace]['title'] =
+ substr($text, $openingBraceStack[$lastOpeningBrace]['partStart'],
$i - $openingBraceStack[$lastOpeningBrace]['partStart']);
} else {
- $openingBraceStack[$lastOpeningBrace]['parts'][] =
- substr($text, $openingBraceStack[$lastOpeningBrace]['partStart'],
+ $openingBraceStack[$lastOpeningBrace]['parts'][] =
+ substr($text, $openingBraceStack[$lastOpeningBrace]['partStart'],
$i - $openingBraceStack[$lastOpeningBrace]['partStart']);
}
@@ -2679,13 +2742,13 @@ class Parser
} elseif ( $found == 'pipe' ) {
# lets set a title if it is a first separator, or next part otherwise
if (null === $openingBraceStack[$lastOpeningBrace]['parts']) {
- $openingBraceStack[$lastOpeningBrace]['title'] =
- substr($text, $openingBraceStack[$lastOpeningBrace]['partStart'],
+ $openingBraceStack[$lastOpeningBrace]['title'] =
+ substr($text, $openingBraceStack[$lastOpeningBrace]['partStart'],
$i - $openingBraceStack[$lastOpeningBrace]['partStart']);
$openingBraceStack[$lastOpeningBrace]['parts'] = array();
} else {
- $openingBraceStack[$lastOpeningBrace]['parts'][] =
- substr($text, $openingBraceStack[$lastOpeningBrace]['partStart'],
+ $openingBraceStack[$lastOpeningBrace]['parts'][] =
+ substr($text, $openingBraceStack[$lastOpeningBrace]['partStart'],
$i - $openingBraceStack[$lastOpeningBrace]['partStart']);
}
$openingBraceStack[$lastOpeningBrace]['partStart'] = ++$i;
@@ -2731,15 +2794,15 @@ class Parser
$braceCallbacks[3] = array( &$this, 'argSubstitution' );
}
if ( $braceCallbacks ) {
- $callbacks = array(
+ $callbacks = array(
'{' => array(
'end' => '}',
'cb' => $braceCallbacks,
'min' => $argsOnly ? 3 : 2,
'max' => isset( $braceCallbacks[3] ) ? 3 : 2,
),
- '[' => array(
- 'end' => ']',
+ '[' => array(
+ 'end' => ']',
'cb' => array(2=>null),
'min' => 2,
'max' => 2,
@@ -2789,31 +2852,30 @@ class Parser
return $text;
}
- # Split template arguments
- function getTemplateArgs( $argsString ) {
- if ( $argsString === '' ) {
- return array();
- }
-
- $args = explode( '|', substr( $argsString, 1 ) );
-
- # If any of the arguments contains a '[[' but no ']]', it needs to be
- # merged with the next arg because the '|' character between belongs
- # to the link syntax and not the template parameter syntax.
- $argc = count($args);
-
- for ( $i = 0; $i < $argc-1; $i++ ) {
- if ( substr_count ( $args[$i], '[[' ) != substr_count ( $args[$i], ']]' ) ) {
- $args[$i] .= '|'.$args[$i+1];
- array_splice($args, $i+1, 1);
- $i--;
- $argc--;
+
+ /// Clean up argument array - refactored in 1.9 so parserfunctions can use it, too.
+ static function createAssocArgs( $args ) {
+ $assocArgs = array();
+ $index = 1;
+ foreach( $args as $arg ) {
+ $eqpos = strpos( $arg, '=' );
+ if ( $eqpos === false ) {
+ $assocArgs[$index++] = $arg;
+ } else {
+ $name = trim( substr( $arg, 0, $eqpos ) );
+ $value = trim( substr( $arg, $eqpos+1 ) );
+ if ( $value === false ) {
+ $value = '';
+ }
+ if ( $name !== false ) {
+ $assocArgs[$name] = $value;
+ }
}
}
-
- return $args;
+
+ return $assocArgs;
}
-
+
/**
* Return the text of a template, after recursively
* replacing any variables or templates within the template.
@@ -2826,7 +2888,7 @@ class Parser
* @private
*/
function braceSubstitution( $piece ) {
- global $wgContLang, $wgLang, $wgAllowDisplayTitle, $action;
+ global $wgContLang, $wgLang, $wgAllowDisplayTitle;
$fname = __METHOD__ /*. '-L' . count( $this->mArgStack )*/;
wfProfileIn( $fname );
wfProfileIn( __METHOD__.'-setup' );
@@ -2837,6 +2899,7 @@ class Parser
$noparse = false; # Unsafe HTML tags should not be stripped, etc.
$noargs = false; # Don't replace triple-brace arguments in $text
$replaceHeadings = false; # Make the edit section links go to the template not the article
+ $headingOffset = 0; # Skip headings when number, to account for those that weren't transcluded.
$isHTML = false; # $text is HTML, armour it against wikitext transformation
$forceRawInterwiki = false; # Force interwiki transclusion to be done in raw mode not rendered
@@ -2845,7 +2908,7 @@ class Parser
$linestart = '';
-
+
# $part1 is the bit before the first |, and must contain only title characters
# $args is a list of arguments, starting from index 0, not including $part1
@@ -2863,7 +2926,6 @@ class Parser
}
$args = (null == $piece['parts']) ? array() : $piece['parts'];
- $argc = count( $args );
wfProfileOut( __METHOD__.'-setup' );
# SUBST
@@ -2893,7 +2955,7 @@ class Parser
$mwMsg =& MagicWord::get( 'msg' );
$mwMsg->matchStartAndRemove( $part1 );
}
-
+
# Check for RAW:
$mwRaw =& MagicWord::get( 'raw' );
if ( $mwRaw->matchStartAndRemove( $part1 ) ) {
@@ -2902,10 +2964,13 @@ class Parser
}
wfProfileOut( __METHOD__.'-modifiers' );
+ //save path level before recursing into functions & templates.
+ $lastPathLevel = $this->mTemplatePath;
+
# Parser functions
if ( !$found ) {
wfProfileIn( __METHOD__ . '-pfunc' );
-
+
$colonPos = strpos( $part1, ':' );
if ( $colonPos !== false ) {
# Case sensitive functions
@@ -2970,7 +3035,6 @@ class Parser
}
# Load from database
- $lastPathLevel = $this->mTemplatePath;
if ( !$found ) {
wfProfileIn( __METHOD__ . '-loadtpl' );
$ns = NS_TEMPLATE;
@@ -2987,9 +3051,8 @@ class Parser
if ( !is_null( $title ) ) {
$titleText = $title->getPrefixedText();
- $checkVariantLink = sizeof($wgContLang->getVariants())>1;
# Check for language variants if the template is not found
- if($checkVariantLink && $title->getArticleID() == 0){
+ if($wgContLang->hasVariants() && $title->getArticleID() == 0){
$wgContLang->findVariantLink($part1, $title);
}
@@ -3062,24 +3125,7 @@ class Parser
$assocArgs = array();
} else {
# Clean up argument array
- $assocArgs = array();
- $index = 1;
- foreach( $args as $arg ) {
- $eqpos = strpos( $arg, '=' );
- if ( $eqpos === false ) {
- $assocArgs[$index++] = $arg;
- } else {
- $name = trim( substr( $arg, 0, $eqpos ) );
- $value = trim( substr( $arg, $eqpos+1 ) );
- if ( $value === false ) {
- $value = '';
- }
- if ( $name !== false ) {
- $assocArgs[$name] = $value;
- }
- }
- }
-
+ $assocArgs = self::createAssocArgs($args);
# Add a new element to the templace recursion path
$this->mTemplatePath[$part1] = 1;
}
@@ -3087,13 +3133,13 @@ class Parser
if ( !$noparse ) {
# If there are any <onlyinclude> tags, only include them
if ( in_string( '<onlyinclude>', $text ) && in_string( '</onlyinclude>', $text ) ) {
- preg_match_all( '/<onlyinclude>(.*?)\n?<\/onlyinclude>/s', $text, $m );
- $text = '';
- foreach ($m[1] as $piece)
- $text .= $piece;
+ $replacer = new OnlyIncludeReplacer;
+ StringUtils::delimiterReplaceCallback( '<onlyinclude>', '</onlyinclude>',
+ array( &$replacer, 'replace' ), $text );
+ $text = $replacer->output;
}
# Remove <noinclude> sections and <includeonly> tags
- $text = preg_replace( '/<noinclude>.*?<\/noinclude>/s', '', $text );
+ $text = StringUtils::delimiterReplace( '<noinclude>', '</noinclude>', '', $text );
$text = strtr( $text, array( '<includeonly>' => '' , '</includeonly>' => '' ) );
if( $this->ot['html'] || $this->ot['pre'] ) {
@@ -3109,7 +3155,7 @@ class Parser
# If the template begins with a table or block-level
# element, it should be treated as beginning a new line.
- if (!$piece['lineStart'] && preg_match('/^({\\||:|;|#|\*)/', $text)) /*}*/{
+ if (!$piece['lineStart'] && preg_match('/^({\\||:|;|#|\*)/', $text)) /*}*/{
$text = "\n" . $text;
}
} elseif ( !$noargs ) {
@@ -3151,7 +3197,7 @@ class Parser
$m = preg_split('/(^={1,6}.*?={1,6}\s*?$)/m', $text, -1,
PREG_SPLIT_DELIM_CAPTURE);
$text = '';
- $nsec = 0;
+ $nsec = $headingOffset;
for( $i = 0; $i < count($m); $i += 2 ) {
$text .= $m[$i];
if (!isset($m[$i + 1]) || $m[$i + 1] == "") continue;
@@ -3160,6 +3206,7 @@ class Parser
$text .= $hl;
continue;
}
+ $m2 = array();
preg_match('/^(={1,6})(.*?)(={1,6})\s*?$/m', $hl, $m2);
$text .= $m2[1] . $m2[2] . "<!--MWTEMPLATESECTION="
. $encodedname . "&" . base64_encode("$nsec") . "-->" . $m2[3];
@@ -3192,10 +3239,19 @@ class Parser
for ( $i = 0; $i < 2 && is_object( $title ); $i++ ) {
$rev = Revision::newFromTitle( $title );
$this->mOutput->addTemplate( $title, $title->getArticleID() );
- if ( !$rev ) {
+ if ( $rev ) {
+ $text = $rev->getText();
+ } elseif( $title->getNamespace() == NS_MEDIAWIKI ) {
+ global $wgLang;
+ $message = $wgLang->lcfirst( $title->getText() );
+ $text = wfMsgForContentNoTrans( $message );
+ if( wfEmptyMsg( $message, $text ) ) {
+ $text = false;
+ break;
+ }
+ } else {
break;
}
- $text = $rev->getText();
if ( $text === false ) {
break;
}
@@ -3209,22 +3265,13 @@ class Parser
* Transclude an interwiki link.
*/
function interwikiTransclude( $title, $action ) {
- global $wgEnableScaryTranscluding, $wgCanonicalNamespaceNames;
+ global $wgEnableScaryTranscluding;
if (!$wgEnableScaryTranscluding)
return wfMsg('scarytranscludedisabled');
- // The namespace will actually only be 0 or 10, depending on whether there was a leading :
- // But we'll handle it generally anyway
- if ( $title->getNamespace() ) {
- // Use the canonical namespace, which should work anywhere
- $articleName = $wgCanonicalNamespaceNames[$title->getNamespace()] . ':' . $title->getDBkey();
- } else {
- $articleName = $title->getDBkey();
- }
-
- $url = str_replace('$1', urlencode($articleName), Title::getInterwikiLink($title->getInterwiki()));
- $url .= "?action=$action";
+ $url = $title->getFullUrl( "action=$action" );
+
if (strlen($url) > 255)
return wfMsg('scarytranscludetoolong');
return $this->fetchScaryTemplateMaybeFromCache($url);
@@ -3267,7 +3314,7 @@ class Parser
if ( array_key_exists( $arg, $inputArgs ) ) {
$text = $inputArgs[$arg];
- } else if (($this->mOutputType == OT_HTML || $this->mOutputType == OT_PREPROCESS ) &&
+ } else if (($this->mOutputType == OT_HTML || $this->mOutputType == OT_PREPROCESS ) &&
null != $matches['parts'] && count($matches['parts']) > 0) {
$text = $matches['parts'][0];
}
@@ -3362,7 +3409,8 @@ class Parser
# Get all headlines for numbering them and adding funky stuff like [edit]
# links - this is for later, but we need the number of headlines right now
- $numMatches = preg_match_all( '/<H([1-6])(.*?'.'>)(.*?)<\/H[1-6] *>/i', $text, $matches );
+ $matches = array();
+ $numMatches = preg_match_all( '/<H(?P<level>[1-6])(?P<attrib>.*?'.'>)(?P<header>.*?)<\/H[1-6] *>/i', $text, $matches );
# if there are fewer than 4 headlines in the article, do not show TOC
# unless it's been explicitly enabled.
@@ -3413,7 +3461,7 @@ class Parser
$templatetitle = '';
$templatesection = 0;
$numbering = '';
-
+ $mat = array();
if (preg_match("/<!--MWTEMPLATESECTION=([^&]+)&([^_]+)-->/", $headline, $mat)) {
$istemplate = 1;
$templatetitle = base64_decode($mat[1]);
@@ -3486,8 +3534,7 @@ class Parser
# The canonized header is a version of the header text safe to use for links
# Avoid insertion of weird stuff like <math> by expanding the relevant sections
- $canonized_headline = $this->unstrip( $headline, $this->mStripState );
- $canonized_headline = $this->unstripNoWiki( $canonized_headline, $this->mStripState );
+ $canonized_headline = $this->mStripState->unstripBoth( $headline );
# Remove link placeholders by the link text.
# <!--LINK number-->
@@ -3509,7 +3556,7 @@ class Parser
$refers[$headlineCount] = $canonized_headline;
# count how many in assoc. array so we can track dupes in anchors
- @$refers[$canonized_headline]++;
+ isset( $refers[$canonized_headline] ) ? $refers[$canonized_headline]++ : $refers[$canonized_headline] = 1;
$refcount[$headlineCount]=$refers[$canonized_headline];
# Don't number the heading if it is the only one (looks silly)
@@ -3526,18 +3573,16 @@ class Parser
if( $enoughToc && ( !isset($wgMaxTocLevel) || $toclevel<$wgMaxTocLevel ) ) {
$toc .= $sk->tocLine($anchor, $tocline, $numbering, $toclevel);
}
+ # give headline the correct <h#> tag
if( $showEditLink && ( !$istemplate || $templatetitle !== "" ) ) {
- if ( empty( $head[$headlineCount] ) ) {
- $head[$headlineCount] = '';
- }
if( $istemplate )
- $head[$headlineCount] .= $sk->editSectionLinkForOther($templatetitle, $templatesection);
+ $editlink = $sk->editSectionLinkForOther($templatetitle, $templatesection);
else
- $head[$headlineCount] .= $sk->editSectionLink($this->mTitle, $sectionCount+1, $headline_hint);
+ $editlink = $sk->editSectionLink($this->mTitle, $sectionCount+1, $headline_hint);
+ } else {
+ $editlink = '';
}
-
- # give headline the correct <h#> tag
- @$head[$headlineCount] .= "<a name=\"$anchor\"></a><h".$level.$matches[2][$headlineCount] .$headline.'</h'.$level.'>';
+ $head[$headlineCount] = $sk->makeHeadline( $level, $matches['attrib'][$headlineCount], $anchor, $headline, $editlink );
$headlineCount++;
if( !$istemplate )
@@ -3595,7 +3640,7 @@ class Parser
* @return string the altered wiki markup
* @public
*/
- function preSaveTransform( $text, &$title, &$user, $options, $clearState = true ) {
+ function preSaveTransform( $text, &$title, $user, $options, $clearState = true ) {
$this->mOptions = $options;
$this->mTitle =& $title;
$this->setOutputType( OT_WIKI );
@@ -3604,15 +3649,14 @@ class Parser
$this->clearState();
}
- $stripState = false;
+ $stripState = new StripState;
$pairs = array(
"\r\n" => "\n",
);
$text = str_replace( array_keys( $pairs ), array_values( $pairs ), $text );
$text = $this->strip( $text, $stripState, true, array( 'gallery' ) );
$text = $this->pstPass2( $text, $stripState, $user );
- $text = $this->unstrip( $text, $stripState );
- $text = $this->unstripNoWiki( $text, $stripState );
+ $text = $stripState->unstripBoth( $text );
return $text;
}
@@ -3620,7 +3664,7 @@ class Parser
* Pre-save transform helper function
* @private
*/
- function pstPass2( $text, &$stripState, &$user ) {
+ function pstPass2( $text, &$stripState, $user ) {
global $wgContLang, $wgLocaltimezone;
/* Note: This is the timestamp saved as hardcoded wikitext to
@@ -3668,6 +3712,7 @@ class Parser
$text = preg_replace( $p3, '[[\\1\\2\\3\\4|\\2]]', $text );
$t = $this->mTitle->getText();
+ $m = array();
if ( preg_match( "/^($nc+:|)$tc+?( \\($tc+\\))$/", $t, $m ) ) {
$text = preg_replace( $p2, "[[$m[1]\\1$m[2]|\\1]]", $text );
} elseif ( preg_match( "/^($nc+:|)$tc+?(, $tc+|)$/", $t, $m ) && '' != "$m[1]$m[2]" ) {
@@ -3834,7 +3879,7 @@ class Parser
*/
function setHook( $tag, $callback ) {
$tag = strtolower( $tag );
- $oldVal = @$this->mTagHooks[$tag];
+ $oldVal = isset( $this->mTagHooks[$tag] ) ? $this->mTagHooks[$tag] : null;
$this->mTagHooks[$tag] = $callback;
return $oldVal;
@@ -3845,10 +3890,10 @@ class Parser
* The callback function should have the form:
* function myParserFunction( &$parser, $arg1, $arg2, $arg3 ) { ... }
*
- * The callback may either return the text result of the function, or an array with the text
- * in element 0, and a number of flags in the other elements. The names of the flags are
+ * The callback may either return the text result of the function, or an array with the text
+ * in element 0, and a number of flags in the other elements. The names of the flags are
* specified in the keys. Valid flags are:
- * found The text returned is valid, stop processing the template. This
+ * found The text returned is valid, stop processing the template. This
* is on by default.
* nowiki Wiki markup in the return value should be escaped
* noparse Unsafe HTML tags should not be stripped, etc.
@@ -3859,13 +3904,13 @@ class Parser
*
* @param string $id The magic word ID
* @param mixed $callback The callback function (and object) to use
- * @param integer $flags a combination of the following flags:
+ * @param integer $flags a combination of the following flags:
* SFH_NO_HASH No leading hash, i.e. {{plural:...}} instead of {{#if:...}}
*
* @return The old callback function for this name, if any
*/
function setFunctionHook( $id, $callback, $flags = 0 ) {
- $oldVal = @$this->mFunctionHooks[$id];
+ $oldVal = isset( $this->mFunctionHooks[$id] ) ? $this->mFunctionHooks[$id] : null;
$this->mFunctionHooks[$id] = $callback;
# Add to function cache
@@ -3914,8 +3959,7 @@ class Parser
*/
function replaceLinkHolders( &$text, $options = 0 ) {
global $wgUser;
- global $wgOutputReplace;
- global $wgContLang, $wgLanguageCode;
+ global $wgContLang;
$fname = 'Parser::replaceLinkHolders';
wfProfileIn( $fname );
@@ -3936,6 +3980,7 @@ class Parser
# Generate query
$query = false;
+ $current = null;
foreach ( $this->mLinkHolders['namespaces'] as $key => $ns ) {
# Make title object
$title = $this->mLinkHolders['titles'][$key];
@@ -4006,10 +4051,14 @@ class Parser
}
wfProfileOut( $fname.'-check' );
- # Do a second query for different language variants of links (if needed)
+ # Do a second query for different language variants of links and categories
if($wgContLang->hasVariants()){
- $linkBatch = new LinkBatch();
- $variantMap = array(); // maps $pdbkey_Variant => $pdbkey_original
+ $linkBatch = new LinkBatch();
+ $variantMap = array(); // maps $pdbkey_Variant => $keys (of link holders)
+ $categoryMap = array(); // maps $category_variant => $category (dbkeys)
+ $varCategories = array(); // category replacements oldDBkey => newDBkey
+
+ $categories = $this->mOutput->getCategoryLinks();
// Add variants of links to link batch
foreach ( $this->mLinkHolders['namespaces'] as $key => $ns ) {
@@ -4018,21 +4067,37 @@ class Parser
continue;
$pdbk = $title->getPrefixedDBkey();
+ $titleText = $title->getText();
// generate all variants of the link title text
- $allTextVariants = $wgContLang->convertLinkToAllVariants($title->getText());
+ $allTextVariants = $wgContLang->convertLinkToAllVariants($titleText);
// if link was not found (in first query), add all variants to query
if ( !isset($colours[$pdbk]) ){
foreach($allTextVariants as $textVariant){
- $variantTitle = Title::makeTitle( $ns, $textVariant );
+ if($textVariant != $titleText){
+ $variantTitle = Title::makeTitle( $ns, $textVariant );
+ if(is_null($variantTitle)) continue;
+ $linkBatch->addObj( $variantTitle );
+ $variantMap[$variantTitle->getPrefixedDBkey()][] = $key;
+ }
+ }
+ }
+ }
+
+ // process categories, check if a category exists in some variant
+ foreach( $categories as $category){
+ $variants = $wgContLang->convertLinkToAllVariants($category);
+ foreach($variants as $variant){
+ if($variant != $category){
+ $variantTitle = Title::newFromDBkey( Title::makeName(NS_CATEGORY,$variant) );
if(is_null($variantTitle)) continue;
$linkBatch->addObj( $variantTitle );
- $variantMap[$variantTitle->getPrefixedDBkey()][] = $key;
+ $categoryMap[$variant] = $category;
}
}
}
-
+
if(!$linkBatch->isEmpty()){
// construct query
@@ -4055,13 +4120,17 @@ class Parser
$variantTitle = Title::makeTitle( $s->page_namespace, $s->page_title );
$varPdbk = $variantTitle->getPrefixedDBkey();
- $linkCache->addGoodLinkObj( $s->page_id, $variantTitle );
- $this->mOutput->addLink( $variantTitle, $s->page_id );
+ $vardbk = $variantTitle->getDBkey();
- $holderKeys = $variantMap[$varPdbk];
+ $holderKeys = array();
+ if(isset($variantMap[$varPdbk])){
+ $holderKeys = $variantMap[$varPdbk];
+ $linkCache->addGoodLinkObj( $s->page_id, $variantTitle );
+ $this->mOutput->addLink( $variantTitle, $s->page_id );
+ }
// loop over link holders
- foreach($holderKeys as $key){
+ foreach($holderKeys as $key){
$title = $this->mLinkHolders['titles'][$key];
if ( is_null( $title ) ) continue;
@@ -4071,7 +4140,7 @@ class Parser
// found link in some of the variants, replace the link holder data
$this->mLinkHolders['titles'][$key] = $variantTitle;
$this->mLinkHolders['dbkeys'][$key] = $variantTitle->getDBkey();
-
+
// set pdbk and colour
$pdbks[$key] = $varPdbk;
if ( $threshold > 0 ) {
@@ -4081,19 +4150,39 @@ class Parser
} else {
$colours[$varPdbk] = 2;
}
- }
+ }
else {
$colours[$varPdbk] = 1;
- }
+ }
}
}
+
+ // check if the object is a variant of a category
+ if(isset($categoryMap[$vardbk])){
+ $oldkey = $categoryMap[$vardbk];
+ if($oldkey != $vardbk)
+ $varCategories[$oldkey]=$vardbk;
+ }
+ }
+
+ // rebuild the categories in original order (if there are replacements)
+ if(count($varCategories)>0){
+ $newCats = array();
+ $originalCats = $this->mOutput->getCategories();
+ foreach($originalCats as $cat => $sortkey){
+ // make the replacement
+ if( array_key_exists($cat,$varCategories) )
+ $newCats[$varCategories[$cat]] = $sortkey;
+ else $newCats[$cat] = $sortkey;
+ }
+ $this->mOutput->setCategoryLinks($newCats);
}
}
}
# Construct search and replace arrays
wfProfileIn( $fname.'-construct' );
- $wgOutputReplace = array();
+ $replacePairs = array();
foreach ( $this->mLinkHolders['namespaces'] as $key => $ns ) {
$pdbk = $pdbks[$key];
$searchkey = "<!--LINK $key-->";
@@ -4102,27 +4191,27 @@ class Parser
$linkCache->addBadLinkObj( $title );
$colours[$pdbk] = 0;
$this->mOutput->addLink( $title, 0 );
- $wgOutputReplace[$searchkey] = $sk->makeBrokenLinkObj( $title,
+ $replacePairs[$searchkey] = $sk->makeBrokenLinkObj( $title,
$this->mLinkHolders['texts'][$key],
$this->mLinkHolders['queries'][$key] );
} elseif ( $colours[$pdbk] == 1 ) {
- $wgOutputReplace[$searchkey] = $sk->makeKnownLinkObj( $title,
+ $replacePairs[$searchkey] = $sk->makeKnownLinkObj( $title,
$this->mLinkHolders['texts'][$key],
$this->mLinkHolders['queries'][$key] );
} elseif ( $colours[$pdbk] == 2 ) {
- $wgOutputReplace[$searchkey] = $sk->makeStubLinkObj( $title,
+ $replacePairs[$searchkey] = $sk->makeStubLinkObj( $title,
$this->mLinkHolders['texts'][$key],
$this->mLinkHolders['queries'][$key] );
}
}
+ $replacer = new HashtableReplacer( $replacePairs, 1 );
wfProfileOut( $fname.'-construct' );
# Do the thing
wfProfileIn( $fname.'-replace' );
-
$text = preg_replace_callback(
'/(<!--LINK .*?-->)/',
- "wfOutputReplaceMatches",
+ $replacer->cb(),
$text);
wfProfileOut( $fname.'-replace' );
@@ -4133,15 +4222,16 @@ class Parser
if ( !empty( $this->mInterwikiLinkHolders['texts'] ) ) {
wfProfileIn( $fname.'-interwiki' );
# Make interwiki link HTML
- $wgOutputReplace = array();
+ $replacePairs = array();
foreach( $this->mInterwikiLinkHolders['texts'] as $key => $link ) {
$title = $this->mInterwikiLinkHolders['titles'][$key];
- $wgOutputReplace[$key] = $sk->makeLinkObj( $title, $link );
+ $replacePairs[$key] = $sk->makeLinkObj( $title, $link );
}
+ $replacer = new HashtableReplacer( $replacePairs, 1 );
$text = preg_replace_callback(
'/<!--IWLINK (.*?)-->/',
- "wfOutputReplaceMatches",
+ $replacer->cb(),
$text );
wfProfileOut( $fname.'-interwiki' );
}
@@ -4192,13 +4282,13 @@ class Parser
/**
* Tag hook handler for 'pre'.
*/
- function renderPreTag( $text, $attribs, $parser ) {
+ function renderPreTag( $text, $attribs ) {
// Backwards-compatibility hack
- $content = preg_replace( '!<nowiki>(.*?)</nowiki>!is', '\\1', $text );
+ $content = StringUtils::delimiterReplace( '<nowiki>', '</nowiki>', '$1', $text, 'i' );
$attribs = Sanitizer::validateTagAttributes( $attribs, 'pre' );
return wfOpenElement( 'pre', $attribs ) .
- wfEscapeHTMLTagsOnly( $content ) .
+ Xml::escapeTagsOnly( $content ) .
'</pre>';
}
@@ -4218,13 +4308,18 @@ class Parser
$ig->setParsing();
$ig->useSkin( $this->mOptions->getSkin() );
- if( isset( $params['caption'] ) )
- $ig->setCaption( $params['caption'] );
+ if( isset( $params['caption'] ) ) {
+ $caption = $params['caption'];
+ $caption = htmlspecialchars( $caption );
+ $caption = $this->replaceInternalLinks( $caption );
+ $ig->setCaptionHtml( $caption );
+ }
$lines = explode( "\n", $text );
foreach ( $lines as $line ) {
# match lines like these:
# Image:someimage.jpg|This is some image
+ $matches = array();
preg_match( "/^([^|]+)(\\|(.*))?$/", $line, $matches );
# Skip empty lines
if ( count( $matches ) == 0 ) {
@@ -4263,7 +4358,7 @@ class Parser
/**
* Parse image options text and use it to make an image
*/
- function makeImage( &$nt, $options ) {
+ function makeImage( $nt, $options ) {
global $wgUseImageResize, $wgDjvuRenderer;
$align = '';
@@ -4295,7 +4390,7 @@ class Parser
$page = null;
$manual_thumb = '' ;
- foreach( $part as $key => $val ) {
+ foreach( $part as $val ) {
if ( $wgUseImageResize && ! is_null( $mwThumb->matchVariableStartToEnd($val) ) ) {
$thumb=true;
} elseif ( ! is_null( $match = $mwManualThumb->matchVariableStartToEnd($val) ) ) {
@@ -4318,9 +4413,10 @@ class Parser
&& ! is_null( $match = $mwPage->matchVariableStartToEnd($val) ) ) {
# Select a page in a multipage document
$page = $match;
- } elseif ( $wgUseImageResize && ! is_null( $match = $mwWidth->matchVariableStartToEnd($val) ) ) {
+ } elseif ( $wgUseImageResize && !$width && ! is_null( $match = $mwWidth->matchVariableStartToEnd($val) ) ) {
wfDebug( "img_width match: $match\n" );
# $match is the image width in pixels
+ $m = array();
if ( preg_match( '/^([0-9]*)x([0-9]*)$/', $match, $m ) ) {
$width = intval( $m[1] );
$height = intval( $m[2] );
@@ -4339,7 +4435,7 @@ class Parser
# make sure there are no placeholders in thumbnail attributes
# that are later expanded to html- so expand them now and
# remove the tags
- $alt = $this->unstrip($alt, $this->mStripState);
+ $alt = $this->mStripState->unstripBoth( $alt );
$alt = Sanitizer::stripAllTags( $alt );
# Linker does the rest
@@ -4366,15 +4462,10 @@ class Parser
*/
function attributeStripCallback( &$text, $args ) {
$text = $this->replaceVariables( $text, $args );
- $text = $this->unstripForHTML( $text );
+ $text = $this->mStripState->unstripBoth( $text );
return $text;
}
- function unstripForHTML( $text ) {
- $text = $this->unstrip( $text, $this->mStripState );
- $text = $this->unstripNoWiki( $text, $this->mStripState );
- return $text;
- }
/**#@-*/
/**#@+
@@ -4410,14 +4501,14 @@ class Parser
private function extractSections( $text, $section, $mode, $newtext='' ) {
# strip NOWIKI etc. to avoid confusion (true-parameter causes HTML
# comments to be stripped as well)
- $striparray = array();
+ $stripState = new StripState;
$oldOutputType = $this->mOutputType;
$oldOptions = $this->mOptions;
$this->mOptions = new ParserOptions();
$this->setOutputType( OT_WIKI );
- $striptext = $this->strip( $text, $striparray, true );
+ $striptext = $this->strip( $text, $stripState, true );
$this->setOutputType( $oldOutputType );
$this->mOptions = $oldOptions;
@@ -4524,9 +4615,7 @@ class Parser
}
}
# reinsert stripped tags
- $rv = $this->unstrip( $rv, $striparray );
- $rv = $this->unstripNoWiki( $rv, $striparray );
- $rv = trim( $rv );
+ $rv = trim( $stripState->unstripBoth( $rv ) );
return $rv;
}
@@ -4549,6 +4638,62 @@ class Parser
return $this->extractSections( $oldtext, $section, "replace", $text );
}
+ /**
+ * Get the timestamp associated with the current revision, adjusted for
+ * the default server-local timestamp
+ */
+ function getRevisionTimestamp() {
+ if ( is_null( $this->mRevisionTimestamp ) ) {
+ wfProfileIn( __METHOD__ );
+ global $wgContLang;
+ $dbr =& wfGetDB( DB_SLAVE );
+ $timestamp = $dbr->selectField( 'revision', 'rev_timestamp',
+ array( 'rev_id' => $this->mRevisionId ), __METHOD__ );
+
+ // Normalize timestamp to internal MW format for timezone processing.
+ // This has the added side-effect of replacing a null value with
+ // the current time, which gives us more sensible behavior for
+ // previews.
+ $timestamp = wfTimestamp( TS_MW, $timestamp );
+
+ // The cryptic '' timezone parameter tells to use the site-default
+ // timezone offset instead of the user settings.
+ //
+ // Since this value will be saved into the parser cache, served
+ // to other users, and potentially even used inside links and such,
+ // it needs to be consistent for all visitors.
+ $this->mRevisionTimestamp = $wgContLang->userAdjust( $timestamp, '' );
+
+ wfProfileOut( __METHOD__ );
+ }
+ return $this->mRevisionTimestamp;
+ }
+
+ /**
+ * Mutator for $mDefaultSort
+ *
+ * @param $sort New value
+ */
+ public function setDefaultSort( $sort ) {
+ $this->mDefaultSort = $sort;
+ }
+
+ /**
+ * Accessor for $mDefaultSort
+ * Will use the title/prefixed title if none is set
+ *
+ * @return string
+ */
+ public function getDefaultSort() {
+ if( $this->mDefaultSort !== false ) {
+ return $this->mDefaultSort;
+ } else {
+ return $this->mTitle->getNamespace() == NS_CATEGORY
+ ? $this->mTitle->getText()
+ : $this->mTitle->getPrefixedText();
+ }
+ }
+
}
/**
@@ -4619,7 +4764,7 @@ class ParserOutput
function addImage( $name ) { $this->mImages[$name] = 1; }
function addLanguageLink( $t ) { $this->mLanguageLinks[] = $t; }
function addExternalLink( $url ) { $this->mExternalLinks[$url] = 1; }
-
+
function setNewSection( $value ) {
$this->mNewSection = (bool)$value;
}
@@ -4674,7 +4819,7 @@ class ParserOutput
*/
class ParserOptions
{
- # All variables are private
+ # All variables are supposed to be private in theory, although in practise this is not the case.
var $mUseTeX; # Use texvc to expand <math> tags
var $mUseDynamicDates; # Use DateFormatter to format dates
var $mInterwikiMagic; # Interlanguage links are removed and returned in an array
@@ -4712,7 +4857,7 @@ class ParserOptions
return $this->mSkin;
}
- function getDateFormat() {
+ function getDateFormat() {
if ( !isset( $this->mDateFormat ) ) {
$this->mDateFormat = $this->mUser->getDatePreference();
}
@@ -4729,7 +4874,7 @@ class ParserOptions
function setNumberHeadings( $x ) { return wfSetVar( $this->mNumberHeadings, $x ); }
function setAllowSpecialInclusion( $x ) { return wfSetVar( $this->mAllowSpecialInclusion, $x ); }
function setTidy( $x ) { return wfSetVar( $this->mTidy, $x); }
- function setSkin( &$x ) { $this->mSkin =& $x; }
+ function setSkin( $x ) { $this->mSkin = $x; }
function setInterfaceMessage( $x ) { return wfSetVar( $this->mInterfaceMessage, $x); }
function setMaxIncludeSize( $x ) { return wfSetVar( $this->mMaxIncludeSize, $x ); }
function setRemoveComments( $x ) { return wfSetVar( $this->mRemoveComments, $x ); }
@@ -4758,7 +4903,6 @@ class ParserOptions
$user = $wgUser;
} else {
$user = new User;
- $user->setLoaded( true );
}
} else {
$user =& $userInput;
@@ -4784,152 +4928,47 @@ class ParserOptions
}
}
-/**
- * Callback function used by Parser::replaceLinkHolders()
- * to substitute link placeholders.
- */
-function &wfOutputReplaceMatches( $matches ) {
- global $wgOutputReplace;
- return $wgOutputReplace[$matches[1]];
-}
-
-/**
- * Return the total number of articles
- */
-function wfNumberOfArticles() {
- global $wgNumberOfArticles;
+class OnlyIncludeReplacer {
+ var $output = '';
- wfLoadSiteStats();
- return $wgNumberOfArticles;
-}
-
-/**
- * Return the number of files
- */
-function wfNumberOfFiles() {
- $fname = 'wfNumberOfFiles';
-
- wfProfileIn( $fname );
- $dbr =& wfGetDB( DB_SLAVE );
- $numImages = $dbr->selectField('site_stats', 'ss_images', array(), $fname );
- wfProfileOut( $fname );
-
- return $numImages;
-}
-
-/**
- * Return the number of user accounts
- * @return integer
- */
-function wfNumberOfUsers() {
- wfProfileIn( 'wfNumberOfUsers' );
- $dbr =& wfGetDB( DB_SLAVE );
- $count = $dbr->selectField( 'site_stats', 'ss_users', array(), 'wfNumberOfUsers' );
- wfProfileOut( 'wfNumberOfUsers' );
- return (int)$count;
+ function replace( $matches ) {
+ if ( substr( $matches[1], -1 ) == "\n" ) {
+ $this->output .= substr( $matches[1], 0, -1 );
+ } else {
+ $this->output .= $matches[1];
+ }
+ }
}
-/**
- * Return the total number of pages
- * @return integer
- */
-function wfNumberOfPages() {
- wfProfileIn( 'wfNumberOfPages' );
- $dbr =& wfGetDB( DB_SLAVE );
- $count = $dbr->selectField( 'site_stats', 'ss_total_pages', array(), 'wfNumberOfPages' );
- wfProfileOut( 'wfNumberOfPages' );
- return (int)$count;
-}
+class StripState {
+ var $general, $nowiki;
-/**
- * Return the total number of admins
- *
- * @return integer
- */
-function wfNumberOfAdmins() {
- static $admins = -1;
- wfProfileIn( 'wfNumberOfAdmins' );
- if( $admins == -1 ) {
- $dbr =& wfGetDB( DB_SLAVE );
- $admins = $dbr->selectField( 'user_groups', 'COUNT(*)', array( 'ug_group' => 'sysop' ), 'wfNumberOfAdmins' );
+ function __construct() {
+ $this->general = new ReplacementArray;
+ $this->nowiki = new ReplacementArray;
}
- wfProfileOut( 'wfNumberOfAdmins' );
- return (int)$admins;
-}
-/**
- * Count the number of pages in a particular namespace
- *
- * @param $ns Namespace
- * @return integer
- */
-function wfPagesInNs( $ns ) {
- static $pageCount = array();
- wfProfileIn( 'wfPagesInNs' );
- if( !isset( $pageCount[$ns] ) ) {
- $dbr =& wfGetDB( DB_SLAVE );
- $pageCount[$ns] = $dbr->selectField( 'page', 'COUNT(*)', array( 'page_namespace' => $ns ), 'wfPagesInNs' );
+ function unstripGeneral( $text ) {
+ wfProfileIn( __METHOD__ );
+ $text = $this->general->replace( $text );
+ wfProfileOut( __METHOD__ );
+ return $text;
}
- wfProfileOut( 'wfPagesInNs' );
- return (int)$pageCount[$ns];
-}
-/**
- * Get various statistics from the database
- * @private
- */
-function wfLoadSiteStats() {
- global $wgNumberOfArticles, $wgTotalViews, $wgTotalEdits;
- $fname = 'wfLoadSiteStats';
-
- if ( -1 != $wgNumberOfArticles ) return;
- $dbr =& wfGetDB( DB_SLAVE );
- $s = $dbr->selectRow( 'site_stats',
- array( 'ss_total_views', 'ss_total_edits', 'ss_good_articles' ),
- array( 'ss_row_id' => 1 ), $fname
- );
-
- if ( $s === false ) {
- return;
- } else {
- $wgTotalViews = $s->ss_total_views;
- $wgTotalEdits = $s->ss_total_edits;
- $wgNumberOfArticles = $s->ss_good_articles;
+ function unstripNoWiki( $text ) {
+ wfProfileIn( __METHOD__ );
+ $text = $this->nowiki->replace( $text );
+ wfProfileOut( __METHOD__ );
+ return $text;
}
-}
-
-/**
- * Get revision timestamp from the database considering timecorrection
- *
- * @param $id Int: page revision id
- * @return integer
- */
-function wfRevisionTimestamp( $id ) {
- global $wgContLang;
- $fname = 'wfRevisionTimestamp';
-
- wfProfileIn( $fname );
- $dbr =& wfGetDB( DB_SLAVE );
- $timestamp = $dbr->selectField( 'revision', 'rev_timestamp',
- array( 'rev_id' => $id ), __METHOD__ );
- $timestamp = $wgContLang->userAdjust( $timestamp );
- wfProfileOut( $fname );
-
- return $timestamp;
-}
-/**
- * Escape html tags
- * Basically replacing " > and < with HTML entities ( &quot;, &gt;, &lt;)
- *
- * @param $in String: text that might contain HTML tags.
- * @return string Escaped string
- */
-function wfEscapeHTMLTagsOnly( $in ) {
- return str_replace(
- array( '"', '>', '<' ),
- array( '&quot;', '&gt;', '&lt;' ),
- $in );
+ function unstripBoth( $text ) {
+ wfProfileIn( __METHOD__ );
+ $text = $this->general->replace( $text );
+ $text = $this->nowiki->replace( $text );
+ wfProfileOut( __METHOD__ );
+ return $text;
+ }
}
?>
diff --git a/includes/ParserCache.php b/includes/ParserCache.php
index 1f2e2aaf..37a42b7f 100644
--- a/includes/ParserCache.php
+++ b/includes/ParserCache.php
@@ -56,8 +56,6 @@ class ParserCache {
$fname = 'ParserCache::get';
wfProfileIn( $fname );
- $hash = $user->getPageRenderingHash();
- $pageid = intval( $article->getID() );
$key = $this->getKey( $article, $user );
wfDebug( "Trying parser cache $key\n" );
diff --git a/includes/Profiler.php b/includes/Profiler.php
index 78003e02..30cda63f 100644
--- a/includes/Profiler.php
+++ b/includes/Profiler.php
@@ -164,7 +164,7 @@ class Profiler {
}
function getCallTreeLine($entry) {
- list ($fname, $level, $start, $x, $end) = $entry;
+ list ($fname, $level, $start, /* $x */, $end) = $entry;
$delta = $end - $start;
$space = str_repeat(' ', $level);
@@ -208,7 +208,6 @@ class Profiler {
# First, subtract the overhead!
foreach ($this->mStack as $entry) {
$fname = $entry[0];
- $thislevel = $entry[1];
$start = $entry[2];
$end = $entry[4];
$elapsed = $end - $start;
@@ -229,7 +228,6 @@ class Profiler {
# Collate
foreach ($this->mStack as $index => $entry) {
$fname = $entry[0];
- $thislevel = $entry[1];
$start = $entry[2];
$end = $entry[4];
$elapsed = $end - $start;
@@ -351,7 +349,7 @@ class Profiler {
}
static function getCaller( $level ) {
- $backtrace = debug_backtrace();
+ $backtrace = wfDebugBacktrace();
if ( isset( $backtrace[$level] ) ) {
if ( isset( $backtrace[$level]['class'] ) ) {
$caller = $backtrace[$level]['class'] . '::' . $backtrace[$level]['function'];
diff --git a/includes/ProfilerSimple.php b/includes/ProfilerSimple.php
index d5bdaf94..e69bfc47 100644
--- a/includes/ProfilerSimple.php
+++ b/includes/ProfilerSimple.php
@@ -12,6 +12,7 @@ require_once(dirname(__FILE__).'/Profiler.php');
class ProfilerSimple extends Profiler {
var $mMinimumTime = 0;
+ var $mProfileID = false;
function ProfilerSimple() {
global $wgRequestTime,$wgRUstart;
@@ -24,7 +25,7 @@ class ProfilerSimple extends Profiler {
$entry =& $this->mCollated["-setup"];
if (!is_array($entry)) {
$entry = array('cpu'=> 0.0, 'cpu_sq' => 0.0, 'real' => 0.0, 'real_sq' => 0.0, 'count' => 0);
- $this->mCollated[$functionname] =& $entry;
+ $this->mCollated["-setup"] =& $entry;
}
$entry['cpu'] += $elapsedcpu;
@@ -39,6 +40,18 @@ class ProfilerSimple extends Profiler {
$this->mMinimumTime = $min;
}
+ function setProfileID( $id ) {
+ $this->mProfileID = $id;
+ }
+
+ function getProfileID() {
+ if ( $this->mProfileID === false ) {
+ return wfWikiID();
+ } else {
+ return $this->mProfileID;
+ }
+ }
+
function profileIn($functionname) {
global $wgDebugFunctionEntry;
if ($wgDebugFunctionEntry) {
@@ -48,15 +61,13 @@ class ProfilerSimple extends Profiler {
}
function profileOut($functionname) {
- $memory = memory_get_usage();
-
global $wgDebugFunctionEntry;
if ($wgDebugFunctionEntry) {
$this->debug(str_repeat(' ', count($this->mWorkStack) - 1).'Exiting '.$functionname."\n");
}
- list($ofname,$ocount,$ortime,$octime) = array_pop($this->mWorkStack);
+ list($ofname, /* $ocount */ ,$ortime,$octime) = array_pop($this->mWorkStack);
if (!$ofname) {
$this->debug("Profiling error: $functionname\n");
diff --git a/includes/ProfilerSimpleUDP.php b/includes/ProfilerSimpleUDP.php
index e0490512..a8527c38 100644
--- a/includes/ProfilerSimpleUDP.php
+++ b/includes/ProfilerSimpleUDP.php
@@ -21,7 +21,7 @@ class ProfilerSimpleUDP extends ProfilerSimple {
$plength=0;
$packet="";
foreach ($this->mCollated as $entry=>$pfdata) {
- $pfline=sprintf ("%s %s %d %f %f %f %f %s\n", wfWikiID(),"-",$pfdata['count'],
+ $pfline=sprintf ("%s %s %d %f %f %f %f %s\n", $this->getProfileID(),"-",$pfdata['count'],
$pfdata['cpu'],$pfdata['cpu_sq'],$pfdata['real'],$pfdata['real_sq'],$entry);
$length=strlen($pfline);
/* printf("<!-- $pfline -->"); */
diff --git a/includes/ProtectionForm.php b/includes/ProtectionForm.php
index fd1bc81e..f96262fe 100644
--- a/includes/ProtectionForm.php
+++ b/includes/ProtectionForm.php
@@ -212,9 +212,9 @@ class ProtectionForm {
}
function buildScript() {
- global $wgStylePath;
+ global $wgStylePath, $wgStyleVersion;
return '<script type="text/javascript" src="' .
- htmlspecialchars( $wgStylePath . "/common/protect.js" ) .
+ htmlspecialchars( $wgStylePath . "/common/protect.js?$wgStyleVersion" ) .
'"></script>';
}
diff --git a/includes/ProxyTools.php b/includes/ProxyTools.php
index 7974c882..22ea4947 100644
--- a/includes/ProxyTools.php
+++ b/includes/ProxyTools.php
@@ -23,7 +23,7 @@ function wfGetForwardedFor() {
/** Work out the IP address based on various globals */
function wfGetIP() {
- global $wgSquidServers, $wgSquidServersNoPurge, $wgIP;
+ global $wgIP;
# Return cached result
if ( !empty( $wgIP ) ) {
@@ -33,34 +33,31 @@ function wfGetIP() {
/* collect the originating ips */
# Client connecting to this webserver
if ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
- $ipchain = array( $_SERVER['REMOTE_ADDR'] );
+ $ipchain = array( IP::canonicalize( $_SERVER['REMOTE_ADDR'] ) );
} else {
# Running on CLI?
$ipchain = array( '127.0.0.1' );
}
$ip = $ipchain[0];
- # Get list of trusted proxies
- # Flipped for quicker access
- $trustedProxies = array_flip( array_merge( $wgSquidServers, $wgSquidServersNoPurge ) );
- if ( count( $trustedProxies ) ) {
- # Append XFF on to $ipchain
- $forwardedFor = wfGetForwardedFor();
- if ( isset( $forwardedFor ) ) {
- $xff = array_map( 'trim', explode( ',', $forwardedFor ) );
- $xff = array_reverse( $xff );
- $ipchain = array_merge( $ipchain, $xff );
- }
- # Step through XFF list and find the last address in the list which is a trusted server
- # Set $ip to the IP address given by that trusted server, unless the address is not sensible (e.g. private)
- foreach ( $ipchain as $i => $curIP ) {
- if ( array_key_exists( $curIP, $trustedProxies ) ) {
- if ( isset( $ipchain[$i + 1] ) && IP::isPublic( $ipchain[$i + 1] ) ) {
- $ip = $ipchain[$i + 1];
- }
- } else {
- break;
+ # Append XFF on to $ipchain
+ $forwardedFor = wfGetForwardedFor();
+ if ( isset( $forwardedFor ) ) {
+ $xff = array_map( 'trim', explode( ',', $forwardedFor ) );
+ $xff = array_reverse( $xff );
+ $ipchain = array_merge( $ipchain, $xff );
+ }
+
+ # Step through XFF list and find the last address in the list which is a trusted server
+ # Set $ip to the IP address given by that trusted server, unless the address is not sensible (e.g. private)
+ foreach ( $ipchain as $i => $curIP ) {
+ $curIP = IP::canonicalize( $curIP );
+ if ( wfIsTrustedProxy( $curIP ) ) {
+ if ( isset( $ipchain[$i + 1] ) && IP::isPublic( $ipchain[$i + 1] ) ) {
+ $ip = $ipchain[$i + 1];
}
+ } else {
+ break;
}
}
@@ -69,6 +66,21 @@ function wfGetIP() {
return $ip;
}
+function wfIsTrustedProxy( $ip ) {
+ global $wgSquidServers, $wgSquidServersNoPurge;
+
+ if ( in_array( $ip, $wgSquidServers ) ||
+ in_array( $ip, $wgSquidServersNoPurge ) ||
+ wfIsAOLProxy( $ip )
+ ) {
+ $trusted = true;
+ } else {
+ $trusted = false;
+ }
+ wfRunHooks( 'IsTrustedProxy', array( &$ip, &$trusted ) );
+ return $trusted;
+}
+
/**
* Forks processes to scan the originating IP for an open proxy server
* MemCached can be used to skip IPs that have already been scanned
@@ -96,7 +108,7 @@ function wfProxyCheck() {
# Fork the processes
if ( !$skip ) {
- $title = Title::makeTitle( NS_SPECIAL, 'Blockme' );
+ $title = SpecialPage::getTitleFor( 'Blockme' );
$iphash = md5( $ip . $wgProxyKey );
$url = $title->getFullURL( 'ip='.$iphash );
@@ -154,6 +166,51 @@ function wfIsLocallyBlockedProxy( $ip ) {
return $ret;
}
+/**
+ * TODO: move this list to the database in a global IP info table incorporating
+ * trusted ISP proxies, blocked IP addresses and open proxies.
+ */
+function wfIsAOLProxy( $ip ) {
+ $ranges = array(
+ '64.12.96.0/19',
+ '149.174.160.0/20',
+ '152.163.240.0/21',
+ '152.163.248.0/22',
+ '152.163.252.0/23',
+ '152.163.96.0/22',
+ '152.163.100.0/23',
+ '195.93.32.0/22',
+ '195.93.48.0/22',
+ '195.93.64.0/19',
+ '195.93.96.0/19',
+ '195.93.16.0/20',
+ '198.81.0.0/22',
+ '198.81.16.0/20',
+ '198.81.8.0/23',
+ '202.67.64.128/25',
+ '205.188.192.0/20',
+ '205.188.208.0/23',
+ '205.188.112.0/20',
+ '205.188.146.144/30',
+ '207.200.112.0/21',
+ );
+
+ static $parsedRanges;
+ if ( is_null( $parsedRanges ) ) {
+ $parsedRanges = array();
+ foreach ( $ranges as $range ) {
+ $parsedRanges[] = IP::parseRange( $range );
+ }
+ }
+
+ $hex = IP::toHex( $ip );
+ foreach ( $parsedRanges as $range ) {
+ if ( $hex >= $range[0] && $hex <= $range[1] ) {
+ return true;
+ }
+ }
+ return false;
+}
diff --git a/includes/QueryPage.php b/includes/QueryPage.php
index 7d6dc900..ff6355e7 100644
--- a/includes/QueryPage.php
+++ b/includes/QueryPage.php
@@ -92,7 +92,7 @@ class QueryPage {
* @return Title
*/
function getTitle() {
- return Title::makeTitle( NS_SPECIAL, $this->getName() );
+ return SpecialPage::getTitleFor( $this->getName() );
}
/**
@@ -282,13 +282,15 @@ class QueryPage {
$sname = $this->getName();
$fname = get_class($this) . '::doQuery';
- $sql = $this->getSQL();
$dbr =& wfGetDB( DB_SLAVE );
- $querycache = $dbr->tableName( 'querycache' );
$wgOut->setSyndicated( $this->isSyndicated() );
- if ( $this->isCached() ) {
+ if ( !$this->isCached() ) {
+ $sql = $this->getSQL();
+ } else {
+ # Get the cached result
+ $querycache = $dbr->tableName( 'querycache' );
$type = $dbr->strencode( $sname );
$sql =
"SELECT qc_type as type, qc_namespace as namespace,qc_title as title, qc_value as value
@@ -310,6 +312,14 @@ class QueryPage {
}
$wgOut->addWikiText( $cacheNotice );
+
+ # If updates on this page have been disabled, let the user know
+ # that the data set won't be refreshed for now
+ global $wgDisableQueryPageUpdate;
+ if( is_array( $wgDisableQueryPageUpdate ) && in_array( $this->getName(), $wgDisableQueryPageUpdate ) ) {
+ $wgOut->addWikiText( wfMsg( 'querypage-no-updates' ) );
+ }
+
}
}
@@ -339,7 +349,7 @@ class QueryPage {
if ( $num > 0 ) {
$s = array();
if ( ! $this->listoutput )
- $s[] = "<ol start='" . ( $offset + 1 ) . "' class='special'>";
+ $s[] = $this->openList( $offset );
# Only read at most $num rows, because $res may contain the whole 1000
for ( $i = 0; $i < $num && $obj = $dbr->fetchObject( $res ); $i++ ) {
@@ -364,7 +374,7 @@ class QueryPage {
$dbr->freeResult( $res );
if ( ! $this->listoutput )
- $s[] = '</ol>';
+ $s[] = $this->closeList();
$str = $this->listoutput ? $wgContLang->listToText( $s ) : implode( '', $s );
$wgOut->addHTML( $str );
}
@@ -373,12 +383,20 @@ class QueryPage {
}
return $num;
}
+
+ function openList( $offset ) {
+ return "<ol start='" . ( $offset + 1 ) . "' class='special'>";
+ }
+
+ function closeList() {
+ return '</ol>';
+ }
/**
* Do any necessary preprocessing of the result object.
- * You should pass this by reference: &$db , &$res
+ * You should pass this by reference: &$db , &$res [although probably no longer necessary in PHP5]
*/
- function preprocessResults( $db, $res ) {}
+ function preprocessResults( &$db, &$res ) {}
/**
* Similar to above, but packaging in a syndicated feed instead of a web page
@@ -459,7 +477,7 @@ class QueryPage {
}
function feedUrl() {
- $title = Title::MakeTitle( NS_SPECIAL, $this->getName() );
+ $title = SpecialPage::getTitleFor( $this->getName() );
return $title->getFullURL();
}
}
diff --git a/includes/RecentChange.php b/includes/RecentChange.php
index ebd4b335..1c7791c2 100644
--- a/includes/RecentChange.php
+++ b/includes/RecentChange.php
@@ -24,6 +24,8 @@
* rc_ip IP address of the user in dotted quad notation
* rc_new obsolete, use rc_type==RC_NEW
* rc_patrolled boolean whether or not someone has marked this edit as patrolled
+ * rc_old_len integer byte length of the text before the edit
+ * rc_new_len the same after the edit
*
* mExtra:
* prefixedDBkey prefixed db key, used by external app via msg queue
@@ -54,7 +56,7 @@ class RecentChange
return $rc;
}
- /* static */ function newFromCurRow( $row, $rc_this_oldid = 0 )
+ public static function newFromCurRow( $row, $rc_this_oldid = 0 )
{
$rc = new RecentChange;
$rc->loadFromCurRow( $row, $rc_this_oldid );
@@ -62,6 +64,24 @@ class RecentChange
$rc->numberofWatchingusers = false;
return $rc;
}
+
+ /**
+ * Obtain the recent change with a given rc_id value
+ *
+ * @param $rcid rc_id value to retrieve
+ * @return RecentChange
+ */
+ public static function newFromId( $rcid ) {
+ $dbr =& wfGetDB( DB_SLAVE );
+ $res = $dbr->select( 'recentchanges', '*', array( 'rc_id' => $rcid ), __METHOD__ );
+ if( $res && $dbr->numRows( $res ) > 0 ) {
+ $row = $dbr->fetchObject( $res );
+ $dbr->freeResult( $res );
+ return self::newFromRow( $row );
+ } else {
+ return NULL;
+ }
+ }
# Accessors
@@ -95,7 +115,7 @@ class RecentChange
# Writes the data in this object to the database
function save()
{
- global $wgLocalInterwiki, $wgPutIPinRC, $wgRC2UDPAddress, $wgRC2UDPPort, $wgRC2UDPPrefix, $wgUseRCPatrol;
+ global $wgLocalInterwiki, $wgPutIPinRC, $wgRC2UDPAddress, $wgRC2UDPPort, $wgRC2UDPPrefix;
$fname = 'RecentChange::save';
$dbw =& wfGetDB( DB_MASTER );
@@ -212,6 +232,7 @@ class RecentChange
$oldId, $lastTimestamp, $bot = "default", $ip = '', $oldSize = 0, $newSize = 0,
$newId = 0)
{
+
if ( $bot === 'default' ) {
$bot = $user->isAllowed( 'bot' );
}
@@ -240,9 +261,11 @@ class RecentChange
'rc_bot' => $bot ? 1 : 0,
'rc_moved_to_ns' => 0,
'rc_moved_to_title' => '',
- 'rc_ip' => $ip,
- 'rc_patrolled' => 0,
- 'rc_new' => 0 # obsolete
+ 'rc_ip' => $ip,
+ 'rc_patrolled' => 0,
+ 'rc_new' => 0, # obsolete
+ 'rc_old_len' => $oldSize,
+ 'rc_new_len' => $newSize
);
$rc->mExtra = array(
@@ -294,7 +317,9 @@ class RecentChange
'rc_moved_to_title' => '',
'rc_ip' => $ip,
'rc_patrolled' => 0,
- 'rc_new' => 1 # obsolete
+ 'rc_new' => 1, # obsolete
+ 'rc_old_len' => 0,
+ 'rc_new_len' => $size
);
$rc->mExtra = array(
@@ -336,7 +361,9 @@ class RecentChange
'rc_moved_to_title' => $newTitle->getDBkey(),
'rc_ip' => $ip,
'rc_new' => 0, # obsolete
- 'rc_patrolled' => 1
+ 'rc_patrolled' => 1,
+ 'rc_old_len' => NULL,
+ 'rc_new_len' => NULL,
);
$rc->mExtra = array(
@@ -386,7 +413,9 @@ class RecentChange
'rc_moved_to_title' => '',
'rc_ip' => $ip,
'rc_patrolled' => 1,
- 'rc_new' => 0 # obsolete
+ 'rc_new' => 0, # obsolete
+ 'rc_old_len' => NULL,
+ 'rc_new_len' => NULL,
);
$rc->mExtra = array(
'prefixedDBkey' => $title->getPrefixedDBkey(),
@@ -408,7 +437,7 @@ class RecentChange
$this->mExtra = array();
}
- # Makes a pseudo-RC entry from a cur row, for watchlists and things
+ # Makes a pseudo-RC entry from a cur row
function loadFromCurRow( $row )
{
$this->mAttribs = array(
@@ -430,12 +459,23 @@ class RecentChange
'rc_ip' => '',
'rc_id' => $row->rc_id,
'rc_patrolled' => $row->rc_patrolled,
- 'rc_new' => $row->page_is_new # obsolete
+ 'rc_new' => $row->page_is_new, # obsolete
+ 'rc_old_len' => $row->rc_old_len,
+ 'rc_new_len' => $row->rc_new_len,
);
$this->mExtra = array();
}
+ /**
+ * Get an attribute value
+ *
+ * @param $name Attribute name
+ * @return mixed
+ */
+ public function getAttribute( $name ) {
+ return isset( $this->mAttribs[$name] ) ? $this->mAttribs[$name] : NULL;
+ }
/**
* Gets the end part of the diff URL associated with this object
@@ -522,5 +562,37 @@ class RecentChange
return $fullString;
}
+ /**
+ * Returns the change size (HTML).
+ * The lengths can be given optionally.
+ */
+ function getCharacterDifference( $old = 0, $new = 0 ) {
+ global $wgRCChangedSizeThreshold, $wgLang;
+
+ if( $old === 0 ) {
+ $old = $this->mAttribs['rc_old_len'];
+ }
+ if( $new === 0 ) {
+ $new = $this->mAttribs['rc_new_len'];
+ }
+
+ if( $old === NULL || $new === NULL ) {
+ return '';
+ }
+
+ $szdiff = $new - $old;
+ $formatedSize = wfMsgExt( 'rc-change-size', array( 'parsemag', 'escape'),
+ $wgLang->formatNum($szdiff) );
+
+ if( $szdiff < $wgRCChangedSizeThreshold ) {
+ return '<strong class=\'mw-plusminus-neg\'>(' . $formatedSize . ')</strong>';
+ } elseif( $szdiff === 0 ) {
+ return '<span class=\'mw-plusminus-null\'>(' . $formatedSize . ')</span>';
+ } elseif( $szdiff > 0 ) {
+ return '<span class=\'mw-plusminus-pos\'>(+' . $formatedSize . ')</span>';
+ } else {
+ return '<span class=\'mw-plusminus-neg\'>(' . $formatedSize . ')</span>';
+ }
+ }
}
?>
diff --git a/includes/Revision.php b/includes/Revision.php
index bd68e05a..c5235e22 100644
--- a/includes/Revision.php
+++ b/includes/Revision.php
@@ -297,6 +297,7 @@ class Revision {
// Enforce spacing trimming on supplied text
$this->mComment = isset( $row['comment'] ) ? trim( strval( $row['comment'] ) ) : null;
$this->mText = isset( $row['text'] ) ? rtrim( strval( $row['text'] ) ) : null;
+ $this->mTextRow = null;
$this->mTitle = null; # Load on demand if needed
$this->mCurrent = false;
@@ -507,7 +508,7 @@ class Revision {
* @param string $prefix table prefix (default 'old_')
* @return string $text|false the text requested
*/
- function getRevisionText( $row, $prefix = 'old_' ) {
+ public static function getRevisionText( $row, $prefix = 'old_' ) {
$fname = 'Revision::getRevisionText';
wfProfileIn( $fname );
@@ -531,7 +532,7 @@ class Revision {
# Use external methods for external objects, text in table is URL-only then
if ( in_array( 'external', $flags ) ) {
$url=$text;
- @list($proto,$path)=explode('://',$url,2);
+ @list(/* $proto */,$path)=explode('://',$url,2);
if ($path=="") {
wfProfileOut( $fname );
return false;
@@ -801,6 +802,7 @@ class Revision {
* @param integer $id
*/
static function getTimestampFromID( $id ) {
+ $dbr =& wfGetDB( DB_SLAVE );
$timestamp = $dbr->selectField( 'revision', 'rev_timestamp',
array( 'rev_id' => $id ), __METHOD__ );
if ( $timestamp === false ) {
diff --git a/includes/Sanitizer.php b/includes/Sanitizer.php
index 185679f6..0c0f7244 100644
--- a/includes/Sanitizer.php
+++ b/includes/Sanitizer.php
@@ -390,11 +390,13 @@ class Sanitizer {
if(!$wgUseTidy) {
$tagstack = $tablestack = array();
foreach ( $bits as $x ) {
- $prev = error_reporting( E_ALL & ~( E_NOTICE | E_WARNING ) );
- preg_match( '!^(/?)(\\w+)([^>]*?)(/{0,1}>)([^<]*)$!', $x, $regs );
- list( $qbar, $slash, $t, $params, $brace, $rest ) = $regs;
- error_reporting( $prev );
-
+ $regs = array();
+ if( preg_match( '!^(/?)(\\w+)([^>]*?)(/{0,1}>)([^<]*)$!', $x, $regs ) ) {
+ list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
+ } else {
+ $slash = $t = $params = $brace = $rest = null;
+ }
+
$badtag = 0 ;
if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
# Check our stack
@@ -487,7 +489,7 @@ class Sanitizer {
foreach ( $bits as $x ) {
preg_match( '/^(\\/?)(\\w+)([^>]*?)(\\/{0,1}>)([^<]*)$/',
$x, $regs );
- @list( $qbar, $slash, $t, $params, $brace, $rest ) = $regs;
+ @list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
if( is_callable( $processCallback ) ) {
call_user_func_array( $processCallback, array( &$params, $args ) );
@@ -603,7 +605,8 @@ class Sanitizer {
$stripped = Sanitizer::decodeCharReferences( $value );
// Remove any comments; IE gets token splitting wrong
- $stripped = preg_replace( '!/\\*.*?\\*/!S', ' ', $stripped );
+ $stripped = StringUtils::delimiterReplace( '/*', '*/', ' ', $stripped );
+
$value = $stripped;
// ... and continue checks
@@ -737,6 +740,25 @@ class Sanitizer {
}
/**
+ * Given a value, escape it so that it can be used as a CSS class and
+ * return it.
+ *
+ * TODO: For extra validity, input should be validated UTF-8.
+ *
+ * @link http://www.w3.org/TR/CSS21/syndata.html Valid characters/format
+ *
+ * @param string $class
+ * @return string
+ */
+ static function escapeClass( $class ) {
+ // Convert ugly stuff to underscores and kill underscores in ugly places
+ return rtrim(preg_replace(
+ array('/(^[0-9\\-])|[\\x00-\\x20!"#$%&\'()*+,.\\/:;<=>?@[\\]^`{|}~]|\\xC2\\xA0/','/_+/'),
+ '_',
+ $class ), '_');
+ }
+
+ /**
* Regex replace callback for armoring links against further processing.
* @param array $matches
* @return string
@@ -1159,7 +1181,7 @@ class Sanitizer {
*/
static function stripAllTags( $text ) {
# Actual <tags>
- $text = preg_replace( '/ < .*? > /x', '', $text );
+ $text = StringUtils::delimiterReplace( '<', '>', '', $text );
# Normalize &entities and whitespace
$text = Sanitizer::normalizeAttributeValue( $text );
@@ -1203,8 +1225,9 @@ class Sanitizer {
$url = preg_replace( '/[\][<>"\\x00-\\x20\\x7F]/e', "urlencode('\\0')", $url );
# Validate hostname portion
+ $matches = array();
if( preg_match( '!^([^:]+:)(//[^/]+)?(.*)$!iD', $url, $matches ) ) {
- list( $whole, $protocol, $host, $rest ) = $matches;
+ list( /* $whole */, $protocol, $host, $rest ) = $matches;
// Characters that will be ignored in IDNs.
// http://tools.ietf.org/html/3454#section-3.1
diff --git a/includes/SearchEngine.php b/includes/SearchEngine.php
index 5e598883..cec40c91 100644
--- a/includes/SearchEngine.php
+++ b/includes/SearchEngine.php
@@ -116,7 +116,7 @@ class SearchEngine {
# Entering an IP address goes to the contributions page
if ( ( $title->getNamespace() == NS_USER && User::isIP($title->getText() ) )
|| User::isIP( trim( $searchterm ) ) ) {
- return Title::makeTitle( NS_SPECIAL, "Contributions/" . $title->getDbkey() );
+ return SpecialPage::getTitleFor( 'Contributions', $title->getDbkey() );
}
@@ -126,6 +126,7 @@ class SearchEngine {
}
# Quoted term? Try without the quotes...
+ $matches = array();
if( preg_match( '/^"([^"]+)"$/', $searchterm, $matches ) ) {
return SearchEngine::getNearMatch( $matches[1] );
}
diff --git a/includes/SearchMySQL4.php b/includes/SearchMySQL4.php
index dcc1f685..c20e3f8e 100644
--- a/includes/SearchMySQL4.php
+++ b/includes/SearchMySQL4.php
@@ -43,6 +43,7 @@ class SearchMySQL4 extends SearchMySQL {
$this->searchTerms = array();
# FIXME: This doesn't handle parenthetical expressions.
+ $m = array();
if( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
$filteredText, $m, PREG_SET_ORDER ) ) {
foreach( $m as $terms ) {
@@ -60,7 +61,7 @@ class SearchMySQL4 extends SearchMySQL {
$this->searchTerms[] = $regexp;
}
wfDebug( "Would search with '$searchon'\n" );
- wfDebug( "Match with /\b" . implode( '\b|\b', $this->searchTerms ) . "\b/\n" );
+ wfDebug( 'Match with /\b' . implode( '\b|\b', $this->searchTerms ) . "\b/\n" );
} else {
wfDebug( "Can't understand search query '{$filteredText}'\n" );
}
diff --git a/includes/SearchPostgres.php b/includes/SearchPostgres.php
index faf53f02..457636b4 100644
--- a/includes/SearchPostgres.php
+++ b/includes/SearchPostgres.php
@@ -60,6 +60,7 @@ class SearchPostgres extends SearchEngine {
$this->searchTerms = array();
# FIXME: This doesn't handle parenthetical expressions.
+ $m = array();
if( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
$filteredText, $m, PREG_SET_ORDER ) ) {
foreach( $m as $terms ) {
@@ -77,7 +78,7 @@ class SearchPostgres extends SearchEngine {
$this->searchTerms[] = $regexp;
}
wfDebug( "Would search with '$searchon'\n" );
- wfDebug( "Match with /\b" . implode( '\b|\b', $this->searchTerms ) . "\b/\n" );
+ wfDebug( 'Match with /\b' . implode( '\b|\b', $this->searchTerms ) . "\b/\n" );
} else {
wfDebug( "Can't understand search query '{$this->filteredText}'\n" );
}
@@ -97,7 +98,8 @@ class SearchPostgres extends SearchEngine {
$match = $this->parseQuery( $filteredTerm, $fulltext );
- $query = "SELECT page_id, page_namespace, page_title, old_text AS page_text ".
+ $query = "SELECT page_id, page_namespace, page_title, old_text AS page_text, ".
+ "rank(titlevector, to_tsquery('default','$match')) AS rnk ".
"FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
"AND r.rev_text_id = c.old_id AND $fulltext @@ to_tsquery('default','$match')";
@@ -113,7 +115,7 @@ class SearchPostgres extends SearchEngine {
$query .= " AND page_namespace IN ($namespaces)";
}
- $query .= " ORDER BY rank($fulltext, to_tsquery('default','$fulltext')) DESC";
+ $query .= " ORDER BY rnk DESC, page_id DESC";
$query .= $this->db->limitResult( '', $this->limit, $this->offset );
diff --git a/includes/SearchTsearch2.php b/includes/SearchTsearch2.php
index a8f354b3..1fca9899 100644
--- a/includes/SearchTsearch2.php
+++ b/includes/SearchTsearch2.php
@@ -47,6 +47,7 @@ class SearchTsearch2 extends SearchEngine {
$this->searchTerms = array();
# FIXME: This doesn't handle parenthetical expressions.
+ $m = array();
if( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
$filteredText, $m, PREG_SET_ORDER ) ) {
foreach( $m as $terms ) {
@@ -64,7 +65,7 @@ class SearchTsearch2 extends SearchEngine {
$this->searchTerms[] = $regexp;
}
wfDebug( "Would search with '$searchon'\n" );
- wfDebug( "Match with /\b" . implode( '\b|\b', $this->searchTerms ) . "\b/\n" );
+ wfDebug( 'Match with /\b' . implode( '\b|\b', $this->searchTerms ) . "\b/\n" );
} else {
wfDebug( "Can't understand search query '{$this->filteredText}'\n" );
}
@@ -112,7 +113,7 @@ class SearchTsearch2 extends SearchEngine {
$dbw=& wfGetDB(DB_MASTER);
$searchindex = $dbw->tableName( 'searchindex' );
$sql = "UPDATE $searchindex SET si_title=to_tsvector('" .
- $db->strencode( $title ) .
+ $dbw->strencode( $title ) .
"') WHERE si_page={$id}";
$dbw->query( $sql, "SearchMySQL4::updateTitle" );
diff --git a/includes/Setup.php b/includes/Setup.php
index 8fe9ef71..80a5b48a 100644
--- a/includes/Setup.php
+++ b/includes/Setup.php
@@ -28,6 +28,33 @@ if ( !isset( $wgVersion ) ) {
die( 1 );
}
+// Set various default paths sensibly...
+if( $wgScript === false ) $wgScript = "$wgScriptPath/index.php";
+if( $wgRedirectScript === false ) $wgRedirectScript = "$wgScriptPath/redirect.php";
+
+if( $wgArticlePath === false ) {
+ if( $wgUsePathInfo ) {
+ $wgArticlePath = "$wgScript/$1";
+ } else {
+ $wgArticlePath = "$wgScript?title=$1";
+ }
+}
+
+if( $wgStylePath === false ) $wgStylePath = "$wgScriptPath/skins";
+if( $wgStyleDirectory === false) $wgStyleDirectory = "$IP/skins";
+
+if( $wgLogo === false ) $wgLogo = "$wgStylePath/common/images/wiki.png";
+
+if( $wgUploadPath === false ) $wgUploadPath = "$wgScriptPath/images";
+if( $wgUploadDirectory === false ) $wgUploadDirectory = "$IP/images";
+
+if( $wgMathPath === false ) $wgMathPath = "{$wgUploadPath}/math";
+if( $wgMathDirectory === false ) $wgMathDirectory = "{$wgUploadDirectory}/math";
+if( $wgTmpDirectory === false ) $wgTmpDirectory = "{$wgUploadDirectory}/tmp";
+
+if( $wgReadOnlyFile === false ) $wgReadOnlyFile = "{$wgUploadDirectory}/lock_yBgMBwiR";
+if( $wgFileCacheDirectory === false ) $wgFileCacheDirectory = "{$wgUploadDirectory}/cache";
+
require_once( "$IP/includes/AutoLoader.php" );
wfProfileIn( $fname.'-exception' );
@@ -160,7 +187,9 @@ foreach ( $wgSkinExtensionFunctions as $func ) {
if( !is_object( $wgAuth ) ) {
$wgAuth = new StubObject( 'wgAuth', 'AuthPlugin' );
+ wfRunHooks( 'AuthPluginSetup', array( &$wgAuth ) );
}
+
wfProfileOut( $fname.'-User' );
wfProfileIn( $fname.'-misc2' );
@@ -169,6 +198,7 @@ $wgDeferredUpdateList = array();
$wgPostCommitUpdateList = array();
if ( $wgAjaxSearch ) $wgAjaxExportList[] = 'wfSajaxSearch';
+if ( $wgAjaxWatch ) $wgAjaxExportList[] = 'wfAjaxWatch';
wfSeedRandom();
diff --git a/includes/SiteStats.php b/includes/SiteStats.php
new file mode 100644
index 00000000..e2774a14
--- /dev/null
+++ b/includes/SiteStats.php
@@ -0,0 +1,168 @@
+<?php
+
+/**
+ * Static accessor class for site_stats and related things
+ * @package MediaWiki
+ */
+class SiteStats {
+ static $row, $loaded = false;
+ static $admins;
+ static $pageCount = array();
+
+ static function recache() {
+ self::load( true );
+ }
+
+ static function load( $recache = false ) {
+ if ( self::$loaded && !$recache ) {
+ return;
+ }
+
+ $dbr =& wfGetDB( DB_SLAVE );
+ self::$row = $dbr->selectRow( 'site_stats', '*', false, __METHOD__ );
+
+ # This code is somewhat schema-agnostic, because I'm changing it in a minor release -- TS
+ if ( !isset( self::$row->ss_total_pages ) && self::$row->ss_total_pages == -1 ) {
+ # Update schema
+ $u = new SiteStatsUpdate( 0, 0, 0 );
+ $u->doUpdate();
+ self::$row = $dbr->selectRow( 'site_stats', '*', false, __METHOD__ );
+ }
+ }
+
+ static function views() {
+ self::load();
+ return self::$row->ss_total_views;
+ }
+
+ static function edits() {
+ self::load();
+ return self::$row->ss_total_edits;
+ }
+
+ static function articles() {
+ self::load();
+ return self::$row->ss_good_articles;
+ }
+
+ static function pages() {
+ self::load();
+ return self::$row->ss_total_pages;
+ }
+
+ static function users() {
+ self::load();
+ return self::$row->ss_users;
+ }
+
+ static function images() {
+ self::load();
+ return self::$row->ss_images;
+ }
+
+ static function admins() {
+ if ( !isset( self::$admins ) ) {
+ $dbr =& wfGetDB( DB_SLAVE );
+ self::$admins = $dbr->selectField( 'user_groups', 'COUNT(*)', array( 'ug_group' => 'sysop' ), __METHOD__ );
+ }
+ return self::$admins;
+ }
+
+ static function pagesInNs( $ns ) {
+ wfProfileIn( __METHOD__ );
+ if( !isset( self::$pageCount[$ns] ) ) {
+ $dbr =& wfGetDB( DB_SLAVE );
+ $pageCount[$ns] = (int)$dbr->selectField( 'page', 'COUNT(*)', array( 'page_namespace' => $ns ), __METHOD__ );
+ }
+ wfProfileOut( __METHOD__ );
+ return $pageCount[$ns];
+ }
+
+}
+
+
+/**
+ *
+ * @package MediaWiki
+ */
+class SiteStatsUpdate {
+
+ var $mViews, $mEdits, $mGood, $mPages, $mUsers;
+
+ function SiteStatsUpdate( $views, $edits, $good, $pages = 0, $users = 0 ) {
+ $this->mViews = $views;
+ $this->mEdits = $edits;
+ $this->mGood = $good;
+ $this->mPages = $pages;
+ $this->mUsers = $users;
+ }
+
+ function appendUpdate( &$sql, $field, $delta ) {
+ if ( $delta ) {
+ if ( $sql ) {
+ $sql .= ',';
+ }
+ if ( $delta < 0 ) {
+ $sql .= "$field=$field-1";
+ } else {
+ $sql .= "$field=$field+1";
+ }
+ }
+ }
+
+ function doUpdate() {
+ $fname = 'SiteStatsUpdate::doUpdate';
+ $dbw =& wfGetDB( DB_MASTER );
+
+ # First retrieve the row just to find out which schema we're in
+ $row = $dbw->selectRow( 'site_stats', '*', false, $fname );
+
+ $updates = '';
+
+ $this->appendUpdate( $updates, 'ss_total_views', $this->mViews );
+ $this->appendUpdate( $updates, 'ss_total_edits', $this->mEdits );
+ $this->appendUpdate( $updates, 'ss_good_articles', $this->mGood );
+
+ if ( isset( $row->ss_total_pages ) ) {
+ # Update schema if required
+ if ( $row->ss_total_pages == -1 && !$this->mViews ) {
+ $dbr =& wfGetDB( DB_SLAVE, array( 'SpecialStatistics', 'vslow') );
+ list( $page, $user ) = $dbr->tableNamesN( 'page', 'user' );
+
+ $sql = "SELECT COUNT(page_namespace) AS total FROM $page";
+ $res = $dbr->query( $sql, $fname );
+ $pageRow = $dbr->fetchObject( $res );
+ $pages = $pageRow->total + $this->mPages;
+
+ $sql = "SELECT COUNT(user_id) AS total FROM $user";
+ $res = $dbr->query( $sql, $fname );
+ $userRow = $dbr->fetchObject( $res );
+ $users = $userRow->total + $this->mUsers;
+
+ if ( $updates ) {
+ $updates .= ',';
+ }
+ $updates .= "ss_total_pages=$pages, ss_users=$users";
+ } else {
+ $this->appendUpdate( $updates, 'ss_total_pages', $this->mPages );
+ $this->appendUpdate( $updates, 'ss_users', $this->mUsers );
+ }
+ }
+ if ( $updates ) {
+ $site_stats = $dbw->tableName( 'site_stats' );
+ $sql = $dbw->limitResultForUpdate("UPDATE $site_stats SET $updates", 1);
+ $dbw->begin();
+ $dbw->query( $sql, $fname );
+ $dbw->commit();
+ }
+
+ /*
+ global $wgDBname, $wgTitle;
+ if ( $this->mGood && $wgDBname == 'enwiki' ) {
+ $good = $dbw->selectField( 'site_stats', 'ss_good_articles', '', $fname );
+ error_log( $good . ' ' . $wgTitle->getPrefixedDBkey() . "\n", 3, '/home/wikipedia/logs/million.log' );
+ }
+ */
+ }
+}
+?>
diff --git a/includes/Skin.php b/includes/Skin.php
index ffbe27c7..3e4f5d3c 100644
--- a/includes/Skin.php
+++ b/includes/Skin.php
@@ -23,6 +23,7 @@ class Skin extends Linker {
var $rc_cache ; # Cache for Enhanced Recent Changes
var $rcCacheIndex ; # Recent Changes Cache Counter for visibility toggle
var $rcMoveIndex;
+ var $mWatchLinkNum = 0; // Appended to end of watch link id's
/**#@-*/
/** Constructor, call parent constructor */
@@ -48,6 +49,7 @@ class Skin extends Linker {
# while code from www.php.net
while (false !== ($file = $skinDir->read())) {
// Skip non-PHP files, hidden files, and '.dep' includes
+ $matches = array();
if(preg_match('/^([^.]*)\.php$/',$file, $matches)) {
$aSkin = $matches[1];
$wgValidSkinNames[strtolower($aSkin)] = $aSkin;
@@ -116,10 +118,9 @@ class Skin extends Linker {
$skinName = $skinNames[$key];
# Grab the skin class and initialise it.
- wfSuppressWarnings();
// Preload base classes to work around APC/PHP5 bug
- include_once( "{$wgStyleDirectory}/{$skinName}.deps.php" );
- wfRestoreWarnings();
+ $deps = "{$wgStyleDirectory}/{$skinName}.deps.php";
+ if( file_exists( $deps ) ) include_once( $deps );
require_once( "{$wgStyleDirectory}/{$skinName}.php" );
# Check if we got if not failback to default skin
@@ -139,7 +140,7 @@ class Skin extends Linker {
/** @return string path to the skin stylesheet */
function getStylesheet() {
- return 'common/wikistandard.css?1';
+ return 'common/wikistandard.css';
}
/** @return string skin name */
@@ -151,8 +152,7 @@ class Skin extends Linker {
global $wgOut, $wgUser;
if ( $wgOut->isQuickbarSuppressed() ) { return 0; }
- $q = $wgUser->getOption( 'quickbar' );
- if ( '' == $q ) { $q = 0; }
+ $q = $wgUser->getOption( 'quickbar', 0 );
return $q;
}
@@ -270,60 +270,71 @@ class Skin extends Linker {
$out->out( "\n</body></html>" );
}
- static function makeGlobalVariablesScript( $data ) {
- $r = '<script type= "' . $data['jsmimetype'] . '">
- var skin = "' . Xml::escapeJsString( $data['skinname'] ) . '";
- var stylepath = "' . Xml::escapeJsString( $data['stylepath'] ) . '";
-
- var wgArticlePath = "' . Xml::escapeJsString( $data['articlepath'] ) . '";
- var wgScriptPath = "' . Xml::escapeJsString( $data['scriptpath'] ) . '";
- var wgServer = "' . Xml::escapeJsString( $data['serverurl'] ) . '";
-
- var wgCanonicalNamespace = "' . Xml::escapeJsString( $data['nscanonical'] ) . '";
- var wgNamespaceNumber = ' . (int)$data['nsnumber'] . ';
- var wgPageName = "' . Xml::escapeJsString( $data['titleprefixeddbkey'] ) . '";
- var wgTitle = "' . Xml::escapeJsString( $data['titletext'] ) . '";
- var wgArticleId = ' . (int)$data['articleid'] . ';
- var wgIsArticle = ' . ( $data['isarticle'] ? 'true' : 'false' ) . ';
-
- var wgUserName = ' . ( $data['username'] == NULL ? 'null' : ( '"' . Xml::escapeJsString( $data['username'] ) . '"' ) ) . ';
- var wgUserLanguage = "' . Xml::escapeJsString( $data['userlang'] ) . '";
- var wgContentLanguage = "' . Xml::escapeJsString( $data['lang'] ) . '";
- </script>
- ';
-
+ static function makeVariablesScript( $data ) {
+ global $wgJsMimeType;
+
+ $r = "<script type= \"$wgJsMimeType\">/*<![CDATA[*/\n";
+ foreach ( $data as $name => $value ) {
+ $encValue = Xml::encodeJsVar( $value );
+ $r .= "var $name = $encValue;\n";
+ }
+ $r .= "/*]]>*/</script>\n";
+
return $r;
}
- function getHeadScripts() {
- global $wgStylePath, $wgUser, $wgAllowUserJs, $wgJsMimeType;
+ /**
+ * Make a <script> tag containing global variables
+ * @param array $data Associative array containing one element:
+ * skinname => the skin name
+ * The odd calling convention is for backwards compatibility
+ */
+ static function makeGlobalVariablesScript( $data ) {
+ global $wgStylePath, $wgUser;
global $wgArticlePath, $wgScriptPath, $wgServer, $wgContLang, $wgLang;
- global $wgTitle, $wgCanonicalNamespaceNames, $wgOut;
-
- $nsname = @$wgCanonicalNamespaceNames[ $wgTitle->getNamespace() ];
- if ( $nsname === NULL ) $nsname = $wgTitle->getNsText();
+ global $wgTitle, $wgCanonicalNamespaceNames, $wgOut, $wgArticle;
+ global $wgBreakFrames;
+ $ns = $wgTitle->getNamespace();
+ $nsname = isset( $wgCanonicalNamespaceNames[ $ns ] ) ? $wgCanonicalNamespaceNames[ $ns ] : $wgTitle->getNsText();
+
$vars = array(
- 'jsmimetype' => $wgJsMimeType,
- 'skinname' => $this->getSkinName(),
+ 'skin' => $data['skinname'],
'stylepath' => $wgStylePath,
- 'articlepath' => $wgArticlePath,
- 'scriptpath' => $wgScriptPath,
- 'serverurl' => $wgServer,
- 'nscanonical' => $nsname,
- 'nsnumber' => $wgTitle->getNamespace(),
- 'titleprefixeddbkey' => $wgTitle->getPrefixedDBKey(),
- 'titletext' => $wgTitle->getText(),
- 'articleid' => $wgTitle->getArticleId(),
- 'isarticle' => $wgOut->isArticle(),
- 'username' => $wgUser->isAnon() ? NULL : $wgUser->getName(),
- 'userlang' => $wgLang->getCode(),
- 'lang' => $wgContLang->getCode(),
+ 'wgArticlePath' => $wgArticlePath,
+ 'wgScriptPath' => $wgScriptPath,
+ 'wgServer' => $wgServer,
+ 'wgCanonicalNamespace' => $nsname,
+ 'wgCanonicalSpecialPageName' => SpecialPage::resolveAlias( $wgTitle->getDBKey() ),
+ 'wgNamespaceNumber' => $wgTitle->getNamespace(),
+ 'wgPageName' => $wgTitle->getPrefixedDBKey(),
+ 'wgTitle' => $wgTitle->getText(),
+ 'wgArticleId' => $wgTitle->getArticleId(),
+ 'wgIsArticle' => $wgOut->isArticle(),
+ 'wgUserName' => $wgUser->isAnon() ? NULL : $wgUser->getName(),
+ 'wgUserLanguage' => $wgLang->getCode(),
+ 'wgContentLanguage' => $wgContLang->getCode(),
+ 'wgBreakFrames' => $wgBreakFrames,
+ 'wgCurRevisionId' => isset( $wgArticle ) ? $wgArticle->getLatest() : 0,
);
- $r = self::makeGlobalVariablesScript( $vars );
+ return self::makeVariablesScript( $vars );
+ }
+
+ function getHeadScripts() {
+ global $wgStylePath, $wgUser, $wgAllowUserJs, $wgJsMimeType, $wgStyleVersion;
+
+ $r = self::makeGlobalVariablesScript( array( 'skinname' => $this->getSkinName() ) );
- $r .= "<script type=\"{$wgJsMimeType}\" src=\"{$wgStylePath}/common/wikibits.js\"></script>\n";
+ $r .= "<script type=\"{$wgJsMimeType}\" src=\"{$wgStylePath}/common/wikibits.js?$wgStyleVersion\"></script>\n";
+ global $wgUseSiteJs;
+ if ($wgUseSiteJs) {
+ if ($wgUser->isLoggedIn()) {
+ $r .= "<script type=\"$wgJsMimeType\" src=\"".htmlspecialchars(self::makeUrl('-','action=raw&smaxage=0&gen=js'))."\"><!-- site js --></script>\n";
+ } else {
+ $r .= "<script type=\"$wgJsMimeType\" src=\"".htmlspecialchars(self::makeUrl('-','action=raw&gen=js'))."\"><!-- site js --></script>\n";
+ }
+ }
if( $wgAllowUserJs && $wgUser->isLoggedIn() ) {
$userpage = $wgUser->getUserPage();
$userjs = htmlspecialchars( self::makeUrl(
@@ -360,11 +371,11 @@ class Skin extends Linker {
# get the user/site-specific stylesheet, SkinTemplate loads via RawPage.php (settings are cached that way)
function getUserStylesheet() {
- global $wgStylePath, $wgRequest, $wgContLang, $wgSquidMaxage;
+ global $wgStylePath, $wgRequest, $wgContLang, $wgSquidMaxage, $wgStyleVersion;
$sheet = $this->getStylesheet();
- $action = $wgRequest->getText('action');
- $s = "@import \"$wgStylePath/$sheet\";\n";
- if($wgContLang->isRTL()) $s .= "@import \"$wgStylePath/common/common_rtl.css\";\n";
+ $s = "@import \"$wgStylePath/common/common.css?$wgStyleVersion\";\n";
+ $s .= "@import \"$wgStylePath/$sheet?$wgStyleVersion\";\n";
+ if($wgContLang->isRTL()) $s .= "@import \"$wgStylePath/common/common_rtl.css?$wgStyleVersion\";\n";
$query = "usemsgcache=yes&action=raw&ctype=text/css&smaxage=$wgSquidMaxage";
$s .= '@import "' . self::makeNSUrl( 'Common.css', $query, NS_MEDIAWIKI ) . "\";\n" .
@@ -375,9 +386,40 @@ class Skin extends Linker {
}
/**
- * placeholder, returns generated js in monobook
+ * This returns MediaWiki:Common.js. For some bizarre reason, it does
+ * *not* return any custom user JS from user subpages. Huh?
+ *
+ * @return string
*/
- function getUserJs() { return; }
+ function getUserJs() {
+ $fname = 'Skin::getUserJs';
+ wfProfileIn( __METHOD__ );
+
+ global $wgStylePath;
+ $s = "/* generated javascript */\n";
+ $s .= "var skin = '{$this->skinname}';\nvar stylepath = '{$wgStylePath}';";
+ $s .= "\n\n/* MediaWiki:Common.js */\n";
+ $commonJs = wfMsgForContent('common.js');
+ if ( !wfEmptyMsg ( 'common.js', $commonJs ) ) {
+ $s .= $commonJs;
+ }
+
+ global $wgUseAjax, $wgAjaxWatch;
+ if($wgUseAjax && $wgAjaxWatch) {
+ $s .= "
+
+/* AJAX (un)watch (see /skins/common/ajaxwatch.js) */
+var wgAjaxWatch = {
+ watchMsg: '". str_replace( array("'", "\n"), array("\\'", ' '), wfMsgExt( 'watch', array() ) )."',
+ unwatchMsg: '". str_replace( array("'", "\n"), array("\\'", ' '), wfMsgExt( 'unwatch', array() ) )."',
+ watchingMsg: '". str_replace( array("'", "\n"), array("\\'", ' '), wfMsgExt( 'watching', array() ) )."',
+ unwatchingMsg: '". str_replace( array("'", "\n"), array("\\'", ' '), wfMsgExt( 'unwatching', array() ) )."'
+};";
+ }
+
+ wfProfileOut( __METHOD__ );
+ return $s;
+ }
/**
* Return html code that include User stylesheets
@@ -464,7 +506,6 @@ END;
else $a = array( 'bgcolor' => '#FFFFFF' );
if($wgOut->isArticle() && $wgUser->getOption('editondblclick') &&
$wgTitle->userCanEdit() ) {
- $t = wfMsg( 'editthispage' );
$s = $wgTitle->getFullURL( $this->editUrlOptions() );
$s = 'document.location = "' .wfEscapeJSString( $s ) .'";';
$a += array ('ondblclick' => $s);
@@ -477,7 +518,8 @@ END;
}
$a['onload'] .= 'setupRightClickEdit()';
}
- $a['class'] = 'ns-'.$wgTitle->getNamespace().' '.($wgContLang->isRTL() ? "rtl" : "ltr");
+ $a['class'] = 'ns-'.$wgTitle->getNamespace().' '.($wgContLang->isRTL() ? "rtl" : "ltr").
+ ' '.Sanitizer::escapeId( 'page-'.$wgTitle->getPrefixedText() );
return $a;
}
@@ -576,9 +618,8 @@ END;
$pop = '</span>';
$t = $embed . implode ( "{$pop} {$sep} {$embed}" , $wgOut->mCategoryLinks ) . $pop;
- $msg = wfMsgExt('categories', array('parsemag', 'escape'), count( $wgOut->mCategoryLinks ));
- $s = $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Categories' ),
- $msg, 'article=' . urlencode( $wgTitle->getPrefixedDBkey() ) )
+ $msg = wfMsgExt( 'pagecategories', array( 'parsemag', 'escape' ), count( $wgOut->mCategoryLinks ) );
+ $s = $this->makeLinkObj( Title::newFromText( wfMsgForContent('pagecategorieslink') ), $msg )
. ': ' . $t;
# optional 'dmoz-like' category browser. Will be shown under the list
@@ -670,7 +711,8 @@ END;
function pageTitleLinks() {
global $wgOut, $wgTitle, $wgUser, $wgRequest;
- extract( $wgRequest->getValues( 'oldid', 'diff' ) );
+ $oldid = $wgRequest->getVal( 'oldid' );
+ $diff = $wgRequest->getVal( 'diff' );
$action = $wgRequest->getText( 'action' );
$s = $this->printableLink();
@@ -731,8 +773,8 @@ END;
$msg = 'viewdeleted';
}
return wfMsg( $msg,
- $this->makeKnownLink(
- $wgContLang->SpecialPage( 'Undelete/' . $wgTitle->getPrefixedDBkey() ),
+ $this->makeKnownLinkObj(
+ SpecialPage::getTitleFor( 'Undelete', $wgTitle->getPrefixedDBkey() ),
wfMsgExt( 'restorelink', array( 'parsemag', 'escape' ), $n ) ) );
}
return '';
@@ -812,7 +854,6 @@ END;
function nameAndLogin() {
global $wgUser, $wgTitle, $wgLang, $wgContLang, $wgShowIPinHeader;
- $li = $wgContLang->specialPage( 'Userlogin' );
$lo = $wgContLang->specialPage( 'Userlogout' );
$s = '';
@@ -834,7 +875,7 @@ END;
} else { $q = "returnto={$rt}"; }
$s .= "\n<br />" . $this->makeKnownLinkObj(
- Title::makeTitle( NS_SPECIAL, 'Userlogin' ),
+ SpecialPage::getTitleFor( 'Userlogin' ),
wfMsg( 'login' ), $q );
} else {
$n = $wgUser->getName();
@@ -846,7 +887,7 @@ END;
$s .= $this->makeKnownLinkObj( $wgUser->getUserPage(),
$n ) . "{$tl}<br />" .
- $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Userlogout' ), wfMsg( 'logout' ),
+ $this->makeKnownLinkObj( SpecialPage::getTitleFor( 'Userlogout' ), wfMsg( 'logout' ),
"returnto={$rt}" ) . ' | ' .
$this->specialLink( 'preferences' );
}
@@ -857,7 +898,7 @@ END;
}
function getSearchLink() {
- $searchPage =& Title::makeTitle( NS_SPECIAL, 'Search' );
+ $searchPage = SpecialPage::getTitleFor( 'Search' );
return $searchPage->getLocalURL();
}
@@ -892,7 +933,38 @@ END;
}
# Many people don't like this dropdown box
#$s .= $sep . $this->specialPagesList();
+
+ $s .= $this->variantLinks();
+
+ $s .= $this->extensionTabLinks();
+ return $s;
+ }
+
+ /**
+ * Compatibility for extensions adding functionality through tabs.
+ * Eventually these old skins should be replaced with SkinTemplate-based
+ * versions, sigh...
+ * @return string
+ */
+ function extensionTabLinks() {
+ $tabs = array();
+ $s = '';
+ wfRunHooks( 'SkinTemplateTabs', array( $this, &$tabs ) );
+ foreach( $tabs as $tab ) {
+ $s .= ' | ' . Xml::element( 'a',
+ array( 'href' => $tab['href'] ),
+ $tab['text'] );
+ }
+ return $s;
+ }
+
+ /**
+ * Language/charset variant links for classic-style skins
+ * @return string
+ */
+ function variantLinks() {
+ $s = '';
/* show links to different language variants */
global $wgDisableLangConversion, $wgContLang, $wgTitle;
$variants = $wgContLang->getVariants();
@@ -901,10 +973,9 @@ END;
$varname = $wgContLang->getVariantname( $code );
if( $varname == 'disable' )
continue;
- $s .= ' | <a href="' . $wgTitle->getLocalUrl( 'variant=' . $code ) . '">' . $varname . '</a>';
+ $s .= ' | <a href="' . $wgTitle->escapeLocalUrl( 'variant=' . $code ) . '">' . htmlspecialchars( $varname ) . '</a>';
}
}
-
return $s;
}
@@ -955,7 +1026,8 @@ END;
global $wgOut, $wgLang, $wgArticle, $wgRequest, $wgUser;
global $wgDisableCounters, $wgMaxCredits, $wgShowCreditsIfMax, $wgTitle, $wgPageShowWatchingUsers;
- extract( $wgRequest->getValues( 'oldid', 'diff' ) );
+ $oldid = $wgRequest->getVal( 'oldid' );
+ $diff = $wgRequest->getVal( 'diff' );
if ( ! $wgOut->isArticle() ) { return ''; }
if ( isset( $oldid ) || isset( $diff ) ) { return ''; }
if ( 0 == $wgArticle->getID() ) { return ''; }
@@ -977,7 +1049,7 @@ END;
if ($wgPageShowWatchingUsers && $wgUser->getOption( 'shownumberswatching' )) {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'watchlist' ) );
+ $watchlist = $dbr->tableName( 'watchlist' );
$sql = "SELECT COUNT(*) AS n FROM $watchlist
WHERE wl_title='" . $dbr->strencode($wgTitle->getDBKey()) .
"' AND wl_namespace=" . $wgTitle->getNamespace() ;
@@ -1045,7 +1117,7 @@ END;
function getPoweredBy() {
global $wgStylePath;
$url = htmlspecialchars( "$wgStylePath/common/images/poweredby_mediawiki_88x31.png" );
- $img = '<a href="http://www.mediawiki.org/"><img src="'.$url.'" alt="MediaWiki" /></a>';
+ $img = '<a href="http://www.mediawiki.org/"><img src="'.$url.'" alt="Powered by MediaWiki" /></a>';
return $img;
}
@@ -1071,12 +1143,8 @@ END;
else { $a = ''; }
$mp = wfMsg( 'mainpage' );
- $titleObj = Title::newFromText( $mp );
- if ( is_object( $titleObj ) ) {
- $url = $titleObj->escapeLocalURL();
- } else {
- $url = '';
- }
+ $mptitle = Title::newMainPage();
+ $url = ( is_object($mptitle) ? $mptitle->escapeLocalURL() : '' );
$logourl = $this->getLogo();
$s = "<a href='{$url}'><img{$a} src='{$logourl}' alt='[{$mp}]' /></a>";
@@ -1088,7 +1156,6 @@ END;
*/
function specialPagesList() {
global $wgUser, $wgContLang, $wgServer, $wgRedirectScript;
- $a = array();
$pages = array_merge( SpecialPage::getRegularPages(), SpecialPage::getRestrictedPages() );
foreach ( $pages as $name => $page ) {
$pages[$name] = $page->getDescription();
@@ -1115,9 +1182,7 @@ END;
}
function mainPageLink() {
- $mp = wfMsgForContent( 'mainpage' );
- $mptxt = wfMsg( 'mainpage');
- $s = $this->makeKnownLink( $mp, $mptxt );
+ $s = $this->makeKnownLinkObj( Title::newMainPage(), wfMsg( 'mainpage' ) );
return $s;
}
@@ -1221,16 +1286,19 @@ END;
function watchThisPage() {
global $wgOut, $wgTitle;
+ ++$this->mWatchLinkNum;
if ( $wgOut->isArticleRelated() ) {
if ( $wgTitle->userIsWatching() ) {
$t = wfMsg( 'unwatchthispage' );
$q = 'action=unwatch';
+ $id = "mw-unwatch-link".$this->mWatchLinkNum;
} else {
$t = wfMsg( 'watchthispage' );
$q = 'action=watch';
+ $id = 'mw-watch-link'.$this->mWatchLinkNum;
}
- $s = $this->makeKnownLinkObj( $wgTitle, $t, $q );
+ $s = $this->makeKnownLinkObj( $wgTitle, $t, $q, '', '', " id=\"$id\"" );
} else {
$s = wfMsg( 'notanarticle' );
}
@@ -1241,7 +1309,7 @@ END;
global $wgTitle;
if ( $wgTitle->userCanMove() ) {
- return $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Movepage' ),
+ return $this->makeKnownLinkObj( SpecialPage::getTitleFor( 'Movepage' ),
wfMsg( 'movethispage' ), 'target=' . $wgTitle->getPrefixedURL() );
} else {
// no message if page is protected - would be redundant
@@ -1259,15 +1327,17 @@ END;
function whatLinksHere() {
global $wgTitle;
- return $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Whatlinkshere' ),
- wfMsg( 'whatlinkshere' ), 'target=' . $wgTitle->getPrefixedURL() );
+ return $this->makeKnownLinkObj(
+ SpecialPage::getTitleFor( 'Whatlinkshere', $wgTitle->getPrefixedDBkey() ),
+ wfMsg( 'whatlinkshere' ) );
}
function userContribsLink() {
global $wgTitle;
- return $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Contributions' ),
- wfMsg( 'contributions' ), 'target=' . $wgTitle->getPartialURL() );
+ return $this->makeKnownLinkObj(
+ SpecialPage::getTitleFor( 'Contributions', $wgTitle->getDBkey() ),
+ wfMsg( 'contributions' ) );
}
function showEmailUser( $id ) {
@@ -1284,8 +1354,9 @@ END;
function emailUserLink() {
global $wgTitle;
- return $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Emailuser' ),
- wfMsg( 'emailuser' ), 'target=' . $wgTitle->getPartialURL() );
+ return $this->makeKnownLinkObj(
+ SpecialPage::getTitleFor( 'Emailuser', $wgTitle->getDBkey() ),
+ wfMsg( 'emailuser' ) );
}
function watchPageLinksLink() {
@@ -1294,9 +1365,9 @@ END;
if ( ! $wgOut->isArticleRelated() ) {
return '(' . wfMsg( 'notanarticle' ) . ')';
} else {
- return $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL,
- 'Recentchangeslinked' ), wfMsg( 'recentchangeslinked' ),
- 'target=' . $wgTitle->getPrefixedURL() );
+ return $this->makeKnownLinkObj(
+ SpecialPage::getTitleFor( 'Recentchangeslinked', $wgTitle->getPrefixedDBkey() ),
+ wfMsg( 'recentchangeslinked' ) );
}
}
@@ -1437,8 +1508,19 @@ END;
}
/* these are used extensively in SkinTemplate, but also some other places */
+ static function makeMainPageUrl( $urlaction = '' ) {
+ $title = Title::newMainPage();
+ self::checkTitle( $title, $name );
+ return $title->getLocalURL( $urlaction );
+ }
+
static function makeSpecialUrl( $name, $urlaction = '' ) {
- $title = Title::makeTitle( NS_SPECIAL, $name );
+ $title = SpecialPage::getTitleFor( $name );
+ return $title->getLocalURL( $urlaction );
+ }
+
+ static function makeSpecialUrlSubpage( $name, $subpage, $urlaction = '' ) {
+ $title = SpecialPage::getSafeTitleFor( $name, $subpage );
return $title->getLocalURL( $urlaction );
}
@@ -1547,7 +1629,19 @@ END;
$text = $line[1];
if (wfEmptyMsg($line[0], $link))
$link = $line[0];
- $href = self::makeInternalOrExternalUrl( $link );
+
+ if ( preg_match( '/^(?:' . wfUrlProtocols() . ')/', $link ) ) {
+ $href = $link;
+ } else {
+ $title = Title::newFromText( $link );
+ if ( $title ) {
+ $title = $title->fixSpecialName();
+ $href = $title->getLocalURL();
+ } else {
+ $href = 'INVALID-TITLE';
+ }
+ }
+
$bar[$heading][] = array(
'text' => $text,
'href' => $href,
@@ -1558,7 +1652,7 @@ END;
}
}
if ($cacheSidebar)
- $cachednotice = $parserMemc->set( $key, $bar, 86400 );
+ $parserMemc->set( $key, $bar, 86400 );
wfProfileOut( $fname );
return $bar;
}
diff --git a/includes/SkinTemplate.php b/includes/SkinTemplate.php
index 482680e6..ff095477 100644
--- a/includes/SkinTemplate.php
+++ b/includes/SkinTemplate.php
@@ -54,6 +54,7 @@ class MediaWiki_I18N {
$value = wfMsg( $value );
// interpolate variables
+ $m = array();
while (preg_match('/\$([0-9]*?)/sm', $value, $m)) {
list($src, $var) = $m;
wfSuppressWarnings();
@@ -134,6 +135,7 @@ class SkinTemplate extends Skin {
global $wgTitle, $wgArticle, $wgUser, $wgLang, $wgContLang, $wgOut;
global $wgScript, $wgStylePath, $wgContLanguageCode;
global $wgMimeType, $wgJsMimeType, $wgOutputEncoding, $wgRequest;
+ global $wgXhtmlDefaultNamespace, $wgXhtmlNamespaces;
global $wgDisableCounters, $wgLogo, $action, $wgFeedClasses, $wgHideInterlanguageLinks;
global $wgMaxCredits, $wgShowCreditsIfMax;
global $wgPageShowWatchingUsers;
@@ -147,7 +149,8 @@ class SkinTemplate extends Skin {
// adding of CSS or Javascript by extensions.
wfRunHooks( 'BeforePageDisplay', array( &$out ) );
- extract( $wgRequest->getValues( 'oldid', 'diff' ) );
+ $oldid = $wgRequest->getVal( 'oldid' );
+ $diff = $wgRequest->getVal( 'diff' );
wfProfileIn( "$fname-init" );
$this->initPage( $out );
@@ -190,17 +193,21 @@ class SkinTemplate extends Skin {
$tpl->set( 'title', $wgOut->getPageTitle() );
$tpl->set( 'pagetitle', $wgOut->getHTMLTitle() );
$tpl->set( 'displaytitle', $wgOut->mPageLinkTitle );
+ $tpl->set( 'pageclass', Sanitizer::escapeClass( 'page-'.$wgTitle->getPrefixedText() ) );
+
+ $nsname = isset( $wgCanonicalNamespaceNames[ $this->mTitle->getNamespace() ] ) ?
+ $wgCanonicalNamespaceNames[ $this->mTitle->getNamespace() ] :
+ $this->mTitle->getNsText();
- $nsname = @$wgCanonicalNamespaceNames[ $this->mTitle->getNamespace() ];
- if ( $nsname === NULL ) $nsname = $this->mTitle->getNsText();
-
$tpl->set( 'nscanonical', $nsname );
$tpl->set( 'nsnumber', $this->mTitle->getNamespace() );
$tpl->set( 'titleprefixeddbkey', $this->mTitle->getPrefixedDBKey() );
$tpl->set( 'titletext', $this->mTitle->getText() );
$tpl->set( 'articleid', $this->mTitle->getArticleId() );
+ $tpl->set( 'currevisionid', isset( $wgArticle ) ? $wgArticle->getLatest() : 0 );
+
$tpl->set( 'isarticle', $wgOut->isArticle() );
-
+
$tpl->setRef( "thispage", $this->thispage );
$subpagestr = $this->subPageSubtitle();
$tpl->set(
@@ -219,8 +226,14 @@ class SkinTemplate extends Skin {
if( $wgOut->isSyndicated() ) {
$feeds = array();
foreach( $wgFeedClasses as $format => $class ) {
+ $linktext = $format;
+ if ( $format == "atom" ) {
+ $linktext = wfMsg( 'feed-atom' );
+ } else if ( $format == "rss" ) {
+ $linktext = wfMsg( 'feed-rss' );
+ }
$feeds[$format] = array(
- 'text' => $format,
+ 'text' => $linktext,
'href' => $wgRequest->appendQuery( "feed=$format" )
);
}
@@ -228,9 +241,14 @@ class SkinTemplate extends Skin {
} else {
$tpl->set( 'feeds', false );
}
- if ($wgUseTrackbacks && $out->isArticleRelated())
- $tpl->set( 'trackbackhtml', $wgTitle->trackbackRDF());
+ if ($wgUseTrackbacks && $out->isArticleRelated()) {
+ $tpl->set( 'trackbackhtml', $wgTitle->trackbackRDF() );
+ } else {
+ $tpl->set( 'trackbackhtml', null );
+ }
+ $tpl->setRef( 'xhtmldefaultnamespace', $wgXhtmlDefaultNamespace );
+ $tpl->set( 'xhtmlnamespaces', $wgXhtmlNamespaces );
$tpl->setRef( 'mimetype', $wgMimeType );
$tpl->setRef( 'jsmimetype', $wgJsMimeType );
$tpl->setRef( 'charset', $wgOutputEncoding );
@@ -337,7 +355,7 @@ class SkinTemplate extends Skin {
if ($wgPageShowWatchingUsers) {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'watchlist' ) );
+ $watchlist = $dbr->tableName( 'watchlist' );
$sql = "SELECT COUNT(*) AS n FROM $watchlist
WHERE wl_title='" . $dbr->strencode($this->mTitle->getDBKey()) .
"' AND wl_namespace=" . $this->mTitle->getNamespace() ;
@@ -502,17 +520,20 @@ class SkinTemplate extends Skin {
'href' => $href,
'active' => ( $href == $pageurl )
);
- $href = self::makeSpecialUrl( "Contributions/$this->username" );
+ $href = self::makeSpecialUrlSubpage( 'Contributions', $this->username );
$personal_urls['mycontris'] = array(
'text' => wfMsg( 'mycontris' ),
- 'href' => $href
- # FIXME # 'active' => ( $href == $pageurl . '/' . $this->username )
+ 'href' => $href,
+ // FIXME # 'active' was disabed in r11346 with message: "disable bold link to my contributions; link was bold on all
+ // Special:Contributions, not just current user's (fix me please!)". Until resolved, explicitly setting active to false.
+ 'active' => false # ( ( $href == $pageurl . '/' . $this->username )
);
$personal_urls['logout'] = array(
'text' => wfMsg( 'userlogout' ),
'href' => self::makeSpecialUrl( 'Userlogout',
- $wgTitle->getNamespace() === NS_SPECIAL && $wgTitle->getText() === 'Preferences' ? '' : "returnto={$this->thisurl}"
- )
+ $wgTitle->isSpecial( 'Preferences' ) ? '' : "returnto={$this->thisurl}"
+ ),
+ 'active' => false
);
} else {
if( $wgShowIPinHeader && isset( $_COOKIE[ini_get("session.name")] ) ) {
@@ -534,14 +555,14 @@ class SkinTemplate extends Skin {
$personal_urls['anonlogin'] = array(
'text' => wfMsg('userlogin'),
'href' => self::makeSpecialUrl( 'Userlogin', 'returnto=' . $this->thisurl ),
- 'active' => ( NS_SPECIAL == $wgTitle->getNamespace() && 'Userlogin' == $wgTitle->getDBkey() )
+ 'active' => $wgTitle->isSpecial( 'Userlogin' )
);
} else {
$personal_urls['login'] = array(
'text' => wfMsg('userlogin'),
'href' => self::makeSpecialUrl( 'Userlogin', 'returnto=' . $this->thisurl ),
- 'active' => ( NS_SPECIAL == $wgTitle->getNamespace() && 'Userlogin' == $wgTitle->getDBkey() )
+ 'active' => $wgTitle->isSpecial( 'Userlogin' )
);
}
}
@@ -696,18 +717,18 @@ class SkinTemplate extends Skin {
);
}
if ( $this->mTitle->userCanMove()) {
- $moveTitle = Title::makeTitle( NS_SPECIAL, 'Movepage' );
+ $moveTitle = SpecialPage::getTitleFor( 'Movepage', $this->thispage );
$content_actions['move'] = array(
- 'class' => ($this->mTitle->getDbKey() == 'Movepage' and $this->mTitle->getNamespace == NS_SPECIAL) ? 'selected' : false,
+ 'class' => $this->mTitle->isSpecial( 'Movepage' ) ? 'selected' : false,
'text' => wfMsg('move'),
- 'href' => $moveTitle->getLocalUrl( 'target=' . urlencode( $this->thispage ) )
+ 'href' => $moveTitle->getLocalUrl()
);
}
} else {
//article doesn't exist or is deleted
if( $wgUser->isAllowed( 'delete' ) ) {
if( $n = $this->mTitle->isDeleted() ) {
- $undelTitle = Title::makeTitle( NS_SPECIAL, 'Undelete' );
+ $undelTitle = SpecialPage::getTitleFor( 'Undelete' );
$content_actions['undelete'] = array(
'class' => false,
'text' => wfMsgExt( 'undelete_short', array( 'parsemag' ), $n ),
@@ -739,7 +760,7 @@ class SkinTemplate extends Skin {
} else {
/* show special page tab */
- $content_actions['article'] = array(
+ $content_actions[$this->mTitle->getNamespaceKey()] = array(
'class' => 'selected',
'text' => wfMsg('specialpage'),
'href' => $wgRequest->getRequestURL(), // @bug 2457, 2510
@@ -753,9 +774,6 @@ class SkinTemplate extends Skin {
$variants = $wgContLang->getVariants();
if( !$wgDisableLangConversion && sizeof( $variants ) > 1 ) {
$preferred = $wgContLang->getPreferredVariant();
- $actstr = '';
- if( $action )
- $actstr = 'action=' . $action . '&';
$vcount=0;
foreach( $variants as $code ) {
$varname = $wgContLang->getVariantname( $code );
@@ -765,7 +783,7 @@ class SkinTemplate extends Skin {
$content_actions['varlang-' . $vcount] = array(
'class' => $selected,
'text' => $varname,
- 'href' => $this->mTitle->getLocalUrl( $actstr . 'variant=' . urlencode( $code ) )
+ 'href' => $this->mTitle->getLocalURL('',$code)
);
$vcount ++;
}
@@ -795,10 +813,9 @@ class SkinTemplate extends Skin {
$action = $wgRequest->getText( 'action' );
$oldid = $wgRequest->getVal( 'oldid' );
- $diff = $wgRequest->getVal( 'diff' );
$nav_urls = array();
- $nav_urls['mainpage'] = array( 'href' => self::makeI18nUrl( 'mainpage') );
+ $nav_urls['mainpage'] = array( 'href' => self::makeMainPageUrl() );
if( $wgEnableUploads ) {
if ($wgUploadNavigationUrl) {
$nav_urls['upload'] = array( 'href' => $wgUploadNavigationUrl );
@@ -813,7 +830,9 @@ class SkinTemplate extends Skin {
}
$nav_urls['specialpages'] = array( 'href' => self::makeSpecialUrl( 'Specialpages' ) );
-
+ // default permalink to being off, will override it as required below.
+ $nav_urls['permalink'] = false;
+
// A print stylesheet is attached to all pages, but nobody ever
// figures that out. :) Add a link...
if( $this->iscontent && ($action == '' || $action == 'view' || $action == 'purge' ) ) {
@@ -842,15 +861,17 @@ class SkinTemplate extends Skin {
}
if( $this->mTitle->getNamespace() != NS_SPECIAL ) {
- $wlhTitle = Title::makeTitle( NS_SPECIAL, 'Whatlinkshere' );
+ $wlhTitle = SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage );
$nav_urls['whatlinkshere'] = array(
- 'href' => $wlhTitle->getLocalUrl( 'target=' . urlencode( $this->thispage ) )
+ 'href' => $wlhTitle->getLocalUrl()
);
if( $this->mTitle->getArticleId() ) {
- $rclTitle = Title::makeTitle( NS_SPECIAL, 'Recentchangeslinked' );
+ $rclTitle = SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage );
$nav_urls['recentchangeslinked'] = array(
- 'href' => $rclTitle->getLocalUrl( 'target=' . urlencode( $this->thispage ) )
+ 'href' => $rclTitle->getLocalUrl()
);
+ } else {
+ $nav_urls['recentchangeslinked'] = false;
}
if ($wgUseTrackbacks)
$nav_urls['trackbacklink'] = array(
@@ -868,19 +889,23 @@ class SkinTemplate extends Skin {
if($id || $ip) { # both anons and non-anons have contri list
$nav_urls['contributions'] = array(
- 'href' => self::makeSpecialUrl( 'Contributions/' . $this->mTitle->getText() )
+ 'href' => self::makeSpecialUrlSubpage( 'Contributions', $this->mTitle->getText() )
);
- if ( $wgUser->isAllowed( 'block' ) )
+ if ( $wgUser->isAllowed( 'block' ) ) {
$nav_urls['blockip'] = array(
- 'href' => self::makeSpecialUrl( 'Blockip/' . $this->mTitle->getText() )
- );
+ 'href' => self::makeSpecialUrlSubpage( 'Blockip', $this->mTitle->getText() )
+ );
+ } else {
+ $nav_urls['blockip'] = false;
+ }
} else {
$nav_urls['contributions'] = false;
+ $nav_urls['blockip'] = false;
}
$nav_urls['emailuser'] = false;
if( $this->showEmailUser( $id ) ) {
$nav_urls['emailuser'] = array(
- 'href' => self::makeSpecialUrl( 'Emailuser/' . $this->mTitle->getText() )
+ 'href' => self::makeSpecialUrlSubpage( 'Emailuser', $this->mTitle->getText() )
);
}
wfProfileOut( $fname );
@@ -932,7 +957,10 @@ class SkinTemplate extends Skin {
$siteargs .= '&ts=' . $wgUser->mTouched;
}
- if ($wgContLang->isRTL()) $sitecss .= '@import "' . $wgStylePath . '/' . $this->stylename . '/rtl.css";' . "\n";
+ if( $wgContLang->isRTL() ) {
+ global $wgStyleVersion;
+ $sitecss .= "@import \"$wgStylePath/$this->stylename/rtl.css?$wgStyleVersion\";\n";
+ }
# If we use the site's dynamic CSS, throw that in, too
if ( $wgUseSiteCss ) {
@@ -1003,16 +1031,23 @@ class SkinTemplate extends Skin {
}
/**
- * @public
+ * This returns MediaWiki:Common.js and MediaWiki:[Skinname].js concate-
+ * nated together. For some bizarre reason, it does *not* return any
+ * custom user JS from subpages. Huh?
+ *
+ * There's absolutely no reason to have separate Monobook/Common JSes.
+ * Any JS that cares can just check the skin variable generated at the
+ * top. For now Monobook.js will be maintained, but it should be consi-
+ * dered deprecated.
+ *
+ * @return string
*/
- function getUserJs() {
+ public function getUserJs() {
$fname = 'SkinTemplate::getUserJs';
wfProfileIn( $fname );
- global $wgStylePath;
- $s = '/* generated javascript */';
- $s .= "var skin = '{$this->skinname}';\nvar stylepath = '{$wgStylePath}';";
- $s .= '/* MediaWiki:'.ucfirst($this->skinname)." */\n";
+ $s = parent::getUserJs();
+ $s .= "\n\n/* MediaWiki:".ucfirst($this->skinname).".js (deprecated; migrate to Common.js!) */\n";
// avoid inclusion of non defined user JavaScript (with custom skins only)
// by checking for default message content
@@ -1123,7 +1158,7 @@ class QuickTemplate {
* @private
*/
function haveData( $str ) {
- return $this->data[$str];
+ return isset( $this->data[$str] );
}
/**
diff --git a/includes/SpecialAllmessages.php b/includes/SpecialAllmessages.php
index 6e3f6588..a28ab3c2 100644
--- a/includes/SpecialAllmessages.php
+++ b/includes/SpecialAllmessages.php
@@ -1,12 +1,12 @@
<?php
/**
- * Provide functions to generate a special page
+ * Use this special page to get a list of the MediaWiki system messages.
* @package MediaWiki
* @subpackage SpecialPage
*/
/**
- *
+ * Constructor.
*/
function wfSpecialAllmessages() {
global $wgOut, $wgRequest, $wgMessageCache, $wgTitle;
@@ -18,10 +18,9 @@ function wfSpecialAllmessages() {
return;
}
- $fname = "wfSpecialAllMessages";
- wfProfileIn( $fname );
+ wfProfileIn( __METHOD__ );
- wfProfileIn( "$fname-setup");
+ wfProfileIn( __METHOD__ . '-setup' );
$ot = $wgRequest->getText( 'ot' );
$navText = wfMsg( 'allmessagestext' );
@@ -29,7 +28,6 @@ function wfSpecialAllmessages() {
# Make sure all extension messages are available
MessageCache::loadAllMessages();
- $first = true;
$sortedArray = array_merge( Language::getMessagesFor( 'en' ), $wgMessageCache->getExtensionMessagesFor( 'en' ) );
ksort( $sortedArray );
$messages = array();
@@ -42,89 +40,84 @@ function wfSpecialAllmessages() {
}
$wgMessageCache->enableTransform();
- wfProfileOut( "$fname-setup" );
+ wfProfileOut( __METHOD__ . '-setup' );
- wfProfileIn( "$fname-output" );
- if ($ot == 'php') {
- $navText .= makePhp($messages);
- $wgOut->addHTML('PHP | <a href="'.$wgTitle->escapeLocalUrl('ot=html').'">HTML</a><pre>'.htmlspecialchars($navText).'</pre>');
+ wfProfileIn( __METHOD__ . '-output' );
+ if ( $ot == 'php' ) {
+ $navText .= makePhp( $messages );
+ $wgOut->addHTML( 'PHP | <a href="' . $wgTitle->escapeLocalUrl( 'ot=html' ) . '">HTML</a><pre>' . htmlspecialchars( $navText ) . '</pre>' );
} else {
- $wgOut->addHTML( '<a href="'.$wgTitle->escapeLocalUrl('ot=php').'">PHP</a> | HTML' );
+ $wgOut->addHTML( '<a href="' . $wgTitle->escapeLocalUrl( 'ot=php' ) . '">PHP</a> | HTML' );
$wgOut->addWikiText( $navText );
$wgOut->addHTML( makeHTMLText( $messages ) );
}
- wfProfileOut( "$fname-output" );
+ wfProfileOut( __METHOD__ . '-output' );
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
}
/**
- *
+ * Create the messages array, formatted in PHP to copy to language files.
+ * @param $messages Messages array.
+ * @return The PHP messages array.
+ * @todo Make suitable for language files.
*/
-function makePhp($messages) {
+function makePhp( $messages ) {
global $wgLang;
$txt = "\n\n\$messages = array(\n";
foreach( $messages as $key => $m ) {
- if($wgLang->getCode() != 'en' and $m['msg'] == $m['enmsg'] ) {
- //if (strstr($m['msg'],"\n")) {
- // $txt.='/* ';
- // $comment=' */';
- //} else {
- // $txt .= '#';
- // $comment = '';
- //}
+ if( $wgLang->getCode() != 'en' && $m['msg'] == $m['enmsg'] ) {
continue;
- } elseif ( wfEmptyMsg( $key, $m['msg'] ) ) {
+ } else if ( wfEmptyMsg( $key, $m['msg'] ) ) {
$m['msg'] = '';
$comment = ' #empty';
} else {
$comment = '';
}
- $txt .= "'$key' => '" . preg_replace( "/(?<!\\\\)'/", "\'", $m['msg']) . "',$comment\n";
+ $txt .= "'$key' => '" . preg_replace( '/(?<!\\\\)\'/', "\'", $m['msg']) . "',$comment\n";
}
$txt .= ');';
return $txt;
}
/**
- *
+ * Create a list of messages, formatted in HTML as a list of messages and values and showing differences between the default language file message and the message in MediaWiki: namespace.
+ * @param $messages Messages array.
+ * @return The HTML list of messages.
*/
function makeHTMLText( $messages ) {
global $wgLang, $wgContLang, $wgUser;
- $fname = "makeHTMLText";
- wfProfileIn( $fname );
+ wfProfileIn( __METHOD__ );
$sk =& $wgUser->getSkin();
$talk = $wgLang->getNsText( NS_TALK );
- $mwnspace = $wgLang->getNsText( NS_MEDIAWIKI );
- $mwtalk = $wgLang->getNsText( NS_MEDIAWIKI_TALK );
$input = wfElement( 'input', array(
'type' => 'text',
'id' => 'allmessagesinput',
- 'onkeyup' => 'allmessagesfilter()',),
- '');
+ 'onkeyup' => 'allmessagesfilter()'
+ ), '' );
$checkbox = wfElement( 'input', array(
'type' => 'button',
'value' => wfMsgHtml( 'allmessagesmodified' ),
'id' => 'allmessagescheckbox',
- 'onclick' => 'allmessagesmodified()',),
- '');
+ 'onclick' => 'allmessagesmodified()'
+ ), '' );
- $txt = '<span id="allmessagesfilter" style="display:none;">' .
- wfMsgHtml('allmessagesfilter') . " {$input}{$checkbox} " . '</span>';
+ $txt = '<span id="allmessagesfilter" style="display: none;">' . wfMsgHtml( 'allmessagesfilter' ) . " {$input}{$checkbox} " . '</span>';
- $txt .= "
-<table border='1' cellspacing='0' width='100%' id='allmessagestable'>
+ $txt .= '
+<table border="1" cellspacing="0" width="100%" id="allmessagestable">
<tr>
- <th rowspan='2'>" . wfMsgHtml('allmessagesname') . "</th>
- <th>" . wfMsgHtml('allmessagesdefault') . "</th>
+ <th rowspan="2">' . wfMsgHtml( 'allmessagesname' ) . '</th>
+ <th>' . wfMsgHtml( 'allmessagesdefault' ) . '</th>
</tr>
<tr>
- <th>" . wfMsgHtml('allmessagescurrent') . "</th>
- </tr>";
+ <th>' . wfMsgHtml( 'allmessagescurrent' ) . '</th>
+ </tr>';
+
+ wfProfileIn( __METHOD__ . "-check" );
- wfProfileIn( "$fname-check" );
# This is a nasty hack to avoid doing independent existence checks
# without sending the links and table through the slow wiki parser.
$pageExists = array(
@@ -139,31 +132,29 @@ function makeHTMLText( $messages ) {
$pageExists[$s->page_namespace][$s->page_title] = true;
}
$dbr->freeResult( $res );
- wfProfileOut( "$fname-check" );
+ wfProfileOut( __METHOD__ . "-check" );
- wfProfileIn( "$fname-output" );
+ wfProfileIn( __METHOD__ . "-output" );
$i = 0;
foreach( $messages as $key => $m ) {
-
$title = $wgLang->ucfirst( $key );
- if($wgLang->getCode() != $wgContLang->getCode())
- $title.= '/' . $wgLang->getCode();
+ if( $wgLang->getCode() != $wgContLang->getCode() ) {
+ $title .= '/' . $wgLang->getCode();
+ }
$titleObj =& Title::makeTitle( NS_MEDIAWIKI, $title );
$talkPage =& Title::makeTitle( NS_MEDIAWIKI_TALK, $title );
- $changed = ($m['statmsg'] != $m['msg']);
+ $changed = ( $m['statmsg'] != $m['msg'] );
$message = htmlspecialchars( $m['statmsg'] );
$mw = htmlspecialchars( $m['msg'] );
- #$pageLink = $sk->makeLinkObj( $titleObj, htmlspecialchars( $key ) );
- #$talkLink = $sk->makeLinkObj( $talkPage, htmlspecialchars( $talk ) );
if( isset( $pageExists[NS_MEDIAWIKI][$title] ) ) {
- $pageLink = $sk->makeKnownLinkObj( $titleObj, "<span id='sp-allmessages-i-$i'>" . htmlspecialchars( $key ) . "</span>" );
+ $pageLink = $sk->makeKnownLinkObj( $titleObj, "<span id=\"sp-allmessages-i-$i\">" . htmlspecialchars( $key ) . '</span>' );
} else {
- $pageLink = $sk->makeBrokenLinkObj( $titleObj, "<span id='sp-allmessages-i-$i'>" . htmlspecialchars( $key ) . "</span>" );
+ $pageLink = $sk->makeBrokenLinkObj( $titleObj, "<span id=\"sp-allmessages-i-$i\">" . htmlspecialchars( $key ) . '</span>' );
}
if( isset( $pageExists[NS_MEDIAWIKI_TALK][$title] ) ) {
$talkLink = $sk->makeKnownLinkObj( $talkPage, htmlspecialchars( $talk ) );
@@ -174,38 +165,35 @@ function makeHTMLText( $messages ) {
$anchor = 'msg_' . htmlspecialchars( strtolower( $title ) );
$anchor = "<a id=\"$anchor\" name=\"$anchor\"></a>";
- if($changed) {
-
+ if( $changed ) {
$txt .= "
- <tr class='orig' id='sp-allmessages-r1-$i'>
- <td rowspan='2'>
+ <tr class=\"orig\" id=\"sp-allmessages-r1-$i\">
+ <td rowspan=\"2\">
$anchor$pageLink<br />$talkLink
</td><td>
$message
</td>
- </tr><tr class='new' id='sp-allmessages-r2-$i'>
+ </tr><tr class=\"new\" id=\"sp-allmessages-r2-$i\">
<td>
$mw
</td>
</tr>";
} else {
-
$txt .= "
- <tr class='def' id='sp-allmessages-r1-$i'>
+ <tr class=\"def\" id=\"sp-allmessages-r1-$i\">
<td>
$anchor$pageLink<br />$talkLink
</td><td>
$mw
</td>
</tr>";
-
}
- $i++;
+ $i++;
}
- $txt .= "</table>";
- wfProfileOut( "$fname-output" );
+ $txt .= '</table>';
+ wfProfileOut( __METHOD__ . '-output' );
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
return $txt;
}
diff --git a/includes/SpecialAllpages.php b/includes/SpecialAllpages.php
index 345c48e6..737e6834 100644
--- a/includes/SpecialAllpages.php
+++ b/includes/SpecialAllpages.php
@@ -24,7 +24,7 @@ function wfSpecialAllpages( $par=NULL, $specialPage ) {
$namespace = 0;
$wgOut->setPagetitle( $namespace > 0 ?
- wfMsg( 'allinnamespace', $namespaces[$namespace] ) :
+ wfMsg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
wfMsg( 'allarticles' )
);
@@ -51,7 +51,7 @@ class SpecialAllpages {
*/
function namespaceForm ( $namespace = NS_MAIN, $from = '' ) {
global $wgScript;
- $t = Title::makeTitle( NS_SPECIAL, $this->name );
+ $t = SpecialPage::getTitleFor( $this->name );
$namespaceselect = HTMLnamespaceselector($namespace, null);
@@ -83,8 +83,7 @@ function namespaceForm ( $namespace = NS_MAIN, $from = '' ) {
* @param integer $namespace (default NS_MAIN)
*/
function showToplevel ( $namespace = NS_MAIN, $including = false ) {
- global $wgOut, $wgUser;
- $sk = $wgUser->getSkin();
+ global $wgOut;
$fname = "indexShowToplevel";
# TODO: Either make this *much* faster or cache the title index points
@@ -185,14 +184,10 @@ function showToplevel ( $namespace = NS_MAIN, $including = false ) {
* @param integer $namespace (Default NS_MAIN)
*/
function showline( $inpoint, $outpoint, $namespace = NS_MAIN ) {
- global $wgUser;
- $sk = $wgUser->getSkin();
- $dbr =& wfGetDB( DB_SLAVE );
-
$inpointf = htmlspecialchars( str_replace( '_', ' ', $inpoint ) );
$outpointf = htmlspecialchars( str_replace( '_', ' ', $outpoint ) );
$queryparams = ($namespace ? "namespace=$namespace" : '');
- $special = Title::makeTitle( NS_SPECIAL, $this->name . '/' . $inpoint );
+ $special = SpecialPage::getTitleFor( $this->name, $inpoint );
$link = $special->escapeLocalUrl( $queryparams );
$out = wfMsgHtml(
@@ -215,7 +210,8 @@ function showChunk( $namespace = NS_MAIN, $from, $including = false ) {
$sk = $wgUser->getSkin();
$fromList = $this->getNamespaceKeyAndText($namespace, $from);
-
+ $n = 0;
+
if ( !$fromList ) {
$out = wfMsgWikiHtml( 'allpagesbadtitle' );
} else {
@@ -236,12 +232,8 @@ function showChunk( $namespace = NS_MAIN, $from, $including = false ) {
)
);
- ### FIXME: side link to previous
-
- $n = 0;
$out = '<table style="background: inherit;" border="0" width="100%">';
- $namespaces = $wgContLang->getFormattedNamespaces();
while( ($n < $this->maxPerPage) && ($s = $dbr->fetchObject( $res )) ) {
$t = Title::makeTitle( $s->page_namespace, $s->page_title );
if( $t ) {
@@ -269,21 +261,71 @@ function showChunk( $namespace = NS_MAIN, $from, $including = false ) {
if ( $including ) {
$out2 = '';
} else {
+
+ # Get the last title from previous chunk
+ $dbr =& wfGetDB( DB_SLAVE );
+ $res_prev = $dbr->select(
+ 'page',
+ 'page_title',
+ array( 'page_namespace' => $namespace, 'page_title < '.$dbr->addQuotes($from) ),
+ $fname,
+ array( 'ORDER BY' => 'page_title DESC', 'LIMIT' => $this->maxPerPage, 'OFFSET' => ($this->maxPerPage - 1 ) )
+ );
+
+ # Get first title of previous complete chunk
+ if( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
+ $pt = $dbr->fetchObject( $res_prev );
+ $prevTitle = Title::makeTitle( $namespace, $pt->page_title );
+ } else {
+ # The previous chunk is not complete, need to link to the very first title
+ # available in the database
+ $reallyFirstPage_title = $dbr->selectField( 'page', 'page_title', array( 'page_namespace' => $namespace ), $fname, array( 'LIMIT' => 1) );
+
+ # Show the previous link if it s not the current requested chunk
+ if( $from != $reallyFirstPage_title ) {
+ $prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
+ } else {
+ $prevTitle = null;
+ }
+ }
+
$nsForm = $this->namespaceForm ( $namespace, $from );
$out2 = '<table style="background: inherit;" width="100%" cellpadding="0" cellspacing="0" border="0">';
$out2 .= '<tr valign="top"><td align="left">' . $nsForm;
$out2 .= '</td><td align="right" style="font-size: smaller; margin-bottom: 1em;">' .
$sk->makeKnownLink( $wgContLang->specialPage( "Allpages" ),
wfMsgHtml ( 'allpages' ) );
- if ( isset($dbr) && $dbr && ($n == $this->maxPerPage) && ($s = $dbr->fetchObject( $res )) ) {
- $self = Title::makeTitle( NS_SPECIAL, 'Allpages' );
+
+ $self = SpecialPage::getTitleFor( 'Allpages' );
+
+ # Do we put a previous link ?
+ if( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
+ $q = 'from=' . $prevTitle->getPartialUrl() . ( $namespace ? '&namespace=' . $namespace : '' );
+ $prevLink = $sk->makeKnownLinkObj( $self, wfMsgHTML( 'prevpage', $pt ), $q );
+ $out2 .= ' | ' . $prevLink;
+ }
+
+ if( $n == $this->maxPerPage && $s = $dbr->fetchObject($res) ) {
+ # $s is the first link of the next chunk
+ $t = Title::MakeTitle($namespace, $s->page_title);
$q = 'from=' . $t->getPartialUrl() . ( $namespace ? '&namespace=' . $namespace : '' );
- $out2 .= ' | ' . $sk->makeKnownLinkObj( $self, wfMsgHtml( 'nextpage', $t->getText() ), $q );
+ $nextLink = $sk->makeKnownLinkObj( $self, wfMsgHtml( 'nextpage', $t->getText() ), $q );
+ $out2 .= ' | ' . $nextLink;
}
$out2 .= "</td></tr></table><hr />";
}
$wgOut->addHtml( $out2 . $out );
+ if( isset($prevLink) or isset($nextLink) ) {
+ $wgOut->addHtml( '<hr/><p style="font-size: smaller; float: right;">' );
+ if( isset( $prevLink ) )
+ $wgOut->addHTML( $prevLink . ' | ');
+ if( isset( $nextLink ) )
+ $wgOut->addHTML( $nextLink );
+ $wgOut->addHTML( '</p>' );
+
+ }
+
}
/**
@@ -298,18 +340,20 @@ function getNamespaceKeyAndText ($ns, $text) {
return array( $ns, '', '' ); # shortcut for common case
$t = Title::makeTitleSafe($ns, $text);
- if ( $t && $t->isLocal() )
+ if ( $t && $t->isLocal() ) {
return array( $t->getNamespace(), $t->getDBkey(), $t->getText() );
- else if ( $t )
+ } else if ( $t ) {
return NULL;
+ }
# try again, in case the problem was an empty pagename
$text = preg_replace('/(#|$)/', 'X$1', $text);
$t = Title::makeTitleSafe($ns, $text);
- if ( $t && $t->isLocal() )
+ if ( $t && $t->isLocal() ) {
return array( $t->getNamespace(), '', '' );
- else
+ } else {
return NULL;
+ }
}
}
diff --git a/includes/SpecialBlockip.php b/includes/SpecialBlockip.php
index 4eb4957a..626922bb 100644
--- a/includes/SpecialBlockip.php
+++ b/includes/SpecialBlockip.php
@@ -46,15 +46,13 @@ class IPBlockForm {
$this->BlockReason = $wgRequest->getText( 'wpBlockReason' );
$this->BlockExpiry = $wgRequest->getVal( 'wpBlockExpiry', wfMsg('ipbotheroption') );
$this->BlockOther = $wgRequest->getVal( 'wpBlockOther', '' );
- $this->BlockAnonOnly = $wgRequest->getBool( 'wpAnonOnly' );
# Unchecked checkboxes are not included in the form data at all, so having one
# that is true by default is a bit tricky
- if ( $wgRequest->wasPosted() ) {
- $this->BlockCreateAccount = $wgRequest->getBool( 'wpCreateAccount', false );
- } else {
- $this->BlockCreateAccount = $wgRequest->getBool( 'wpCreateAccount', true );
- }
+ $byDefault = !$wgRequest->wasPosted();
+ $this->BlockAnonOnly = $wgRequest->getBool( 'wpAnonOnly', $byDefault );
+ $this->BlockCreateAccount = $wgRequest->getBool( 'wpCreateAccount', $byDefault );
+ $this->BlockEnableAutoblock = $wgRequest->getBool( 'wpEnableAutoblock', $byDefault );
}
function showForm( $err ) {
@@ -73,7 +71,7 @@ class IPBlockForm {
$mIpbothertime = wfMsgHtml( 'ipbotheroption' );
$mIpbreason = wfMsgHtml( 'ipbreason' );
$mIpbsubmit = wfMsgHtml( 'ipbsubmit' );
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Blockip' );
+ $titleObj = SpecialPage::getTitleFor( 'Blockip' );
$action = $titleObj->escapeLocalURL( "action=submit" );
if ( "" != $err ) {
@@ -82,7 +80,6 @@ class IPBlockForm {
}
$scBlockAddress = htmlspecialchars( $this->BlockAddress );
- $scBlockExpiry = htmlspecialchars( $this->BlockExpiry );
$scBlockReason = htmlspecialchars( $this->BlockReason );
$scBlockOtherTime = htmlspecialchars( $this->BlockOther );
$scBlockExpiryOptions = htmlspecialchars( wfMsgForContent( 'ipboptions' ) );
@@ -155,10 +152,18 @@ class IPBlockForm {
array( 'tabindex' => 5 ) ) . "
</td>
</tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td align=\"left\">
+ " . wfCheckLabel( wfMsg( 'ipbenableautoblock' ),
+ 'wpEnableAutoblock', 'wpEnableAutoblock', $this->BlockEnableAutoblock,
+ array( 'tabindex' => 6 ) ) . "
+ </td>
+ </tr>
<tr>
<td style='padding-top: 1em'>&nbsp;</td>
<td style='padding-top: 1em' align=\"left\">
- <input tabindex='5' type='submit' name=\"wpBlock\" value=\"{$mIpbsubmit}\" />
+ <input tabindex='7' type='submit' name=\"wpBlock\" value=\"{$mIpbsubmit}\" />
</td>
</tr>
</table>
@@ -183,6 +188,7 @@ class IPBlockForm {
# Check for invalid specifications
if ( ! preg_match( "/^$rxIP$/", $this->BlockAddress ) ) {
+ $matches = array();
if ( preg_match( "/^($rxIP)\\/(\\d{1,2})$/", $this->BlockAddress, $matches ) ) {
if ( $wgSysopRangeBans ) {
if ( $matches[2] > 31 || $matches[2] < 16 ) {
@@ -242,7 +248,7 @@ class IPBlockForm {
$block = new Block( $this->BlockAddress, $userId, $wgUser->getID(),
$this->BlockReason, wfTimestampNow(), 0, $expiry, $this->BlockAnonOnly,
- $this->BlockCreateAccount );
+ $this->BlockCreateAccount, $this->BlockEnableAutoblock );
if (wfRunHooks('BlockIp', array(&$block, &$wgUser))) {
@@ -260,7 +266,7 @@ class IPBlockForm {
$this->BlockReason, $expirestr );
# Report to the user
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Blockip' );
+ $titleObj = SpecialPage::getTitleFor( 'Blockip' );
$wgOut->redirect( $titleObj->getFullURL( 'action=success&ip=' .
urlencode( $this->BlockAddress ) ) );
}
@@ -275,7 +281,7 @@ class IPBlockForm {
$wgOut->addWikiText( $text );
}
- function showLogFragment( &$out, &$title ) {
+ function showLogFragment( $out, $title ) {
$out->addHtml( wfElement( 'h2', NULL, LogPage::logName( 'block' ) ) );
$request = new FauxRequest( array( 'page' => $title->getPrefixedText(), 'type' => 'block' ) );
$viewer = new LogViewer( new LogReader( $request ) );
diff --git a/includes/SpecialBooksources.php b/includes/SpecialBooksources.php
index 960f6224..5c047fbe 100644
--- a/includes/SpecialBooksources.php
+++ b/includes/SpecialBooksources.php
@@ -1,109 +1,110 @@
<?php
-/**
- * ISBNs in wiki pages will create links to this page, with the ISBN passed
- * in via the query string.
- *
- * @package MediaWiki
- * @subpackage SpecialPage
- */
-
-/**
- * Constructor
- */
-function wfSpecialBooksources( $par ) {
- global $wgRequest;
-
- $isbn = $par;
- if( empty( $par ) ) {
- $isbn = $wgRequest->getVal( 'isbn' );
- }
- $isbn = preg_replace( '/[^0-9X]/', '', $isbn );
-
- $bsl = new BookSourceList( $isbn );
- $bsl->show();
-}
/**
+ * Special page outputs information on sourcing a book with a particular ISBN
+ * The parser creates links to this page when dealing with ISBNs in wikitext
*
* @package MediaWiki
- * @subpackage SpecialPage
+ * @subpackage Special pages
+ * @author Rob Church <robchur@gmail.com>
+ * @todo Validate ISBNs using the standard check-digit method
*/
-class BookSourceList {
- var $mIsbn;
+class SpecialBookSources extends SpecialPage {
- function BookSourceList( $isbn ) {
- $this->mIsbn = $isbn;
+ /**
+ * ISBN passed to the page, if any
+ */
+ private $isbn = '';
+
+ /**
+ * Constructor
+ */
+ public function __construct() {
+ parent::__construct( 'Booksources' );
}
-
- function show() {
- global $wgOut;
-
- $wgOut->setPagetitle( wfMsg( "booksources" ) );
- if( $this->mIsbn == '' ) {
- $this->askForm();
- } else {
+
+ /**
+ * Show the special page
+ *
+ * @param $isbn ISBN passed as a subpage parameter
+ */
+ public function execute( $isbn = false ) {
+ global $wgOut, $wgRequest;
+ $this->setHeaders();
+ $this->isbn = $this->cleanIsbn( $isbn ? $isbn : $wgRequest->getText( 'isbn' ) );
+ $wgOut->addWikiText( wfMsgNoTrans( 'booksources-summary' ) );
+ $wgOut->addHtml( $this->makeForm() );
+ if( strlen( $this->isbn) > 0 )
$this->showList();
- }
}
-
- function showList() {
+
+ /**
+ * Trim ISBN and remove characters which aren't required
+ *
+ * @param $isbn Unclean ISBN
+ * @return string
+ */
+ private function cleanIsbn( $isbn ) {
+ return trim( preg_replace( '![^0-9X]!', '', $isbn ) );
+ }
+
+ /**
+ * Generate a form to allow users to enter an ISBN
+ *
+ * @return string
+ */
+ private function makeForm() {
+ global $wgScript;
+ $title = self::getTitleFor( 'Booksources' );
+ $form = '<fieldset><legend>' . wfMsgHtml( 'booksources-search-legend' ) . '</legend>';
+ $form .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
+ $form .= Xml::hidden( 'title', $title->getPrefixedText() );
+ $form .= '<p>' . Xml::inputLabel( wfMsg( 'booksources-isbn' ), 'isbn', 'isbn', 20, $this->isbn );
+ $form .= '&nbsp;' . Xml::submitButton( wfMsg( 'booksources-go' ) ) . '</p>';
+ $form .= Xml::closeElement( 'form' );
+ $form .= '</fieldset>';
+ return $form;
+ }
+
+ /**
+ * Determine where to get the list of book sources from,
+ * format and output them
+ *
+ * @return string
+ */
+ private function showList() {
global $wgOut, $wgContLang;
- $fname = "BookSourceList::showList()";
-
- # First, see if we have a custom list setup in
- # [[Wikipedia:Book sources]] or equivalent.
- $bstitle = Title::makeTitleSafe( NS_PROJECT, wfMsg( "booksources" ) );
- if( $bstitle ) {
- $revision = Revision::newFromTitle( $bstitle );
- if( $revision ) {
- $bstext = $revision->getText();
- if( $bstext ) {
- $bstext = str_replace( "MAGICNUMBER", $this->mIsbn, $bstext );
- $wgOut->addWikiText( $bstext );
- return;
- }
- }
+
+ # Check for a local page such as Project:Book_sources and use that if available
+ $title = Title::makeTitleSafe( NS_PROJECT, wfMsg( 'booksources' ) ); # Should this be wfMsgForContent()? -- RC
+ if( is_object( $title ) && $title->exists() ) {
+ $rev = Revision::newFromTitle( $title );
+ $wgOut->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $rev->getText() ) );
+ return true;
}
-
- # Otherwise, use the list of links in the default Language.php file.
- $s = wfMsgWikiHtml( 'booksourcetext' ) . "<ul>\n";
- $bs = $wgContLang->getBookstoreList() ;
- $bsn = array_keys ( $bs ) ;
- foreach ( $bsn as $name ) {
- $adr = $bs[$name] ;
- if ( ! $this->mIsbn ) {
- $adr = explode( ":" , $adr , 2 );
- $adr = explode( "/" , $adr[1] );
- $a = "";
- while ( $a == "" ) {
- $a = array_shift( $adr );
- }
- $adr = "http://".$a ;
- } else {
- $adr = str_replace ( "$1" , $this->mIsbn , $adr ) ;
- }
- $name = htmlspecialchars( $name );
- $adr = htmlspecialchars( $adr );
- $s .= "<li><a href=\"{$adr}\" class=\"external\">{$name}</a></li>\n" ;
- }
- $s .= "</ul>\n";
-
- $wgOut->addHTML( $s );
+
+ # Fall back to the defaults given in the language file
+ $wgOut->addWikiText( wfMsgNoTrans( 'booksources-text' ) );
+ $wgOut->addHtml( '<ul>' );
+ $items = $wgContLang->getBookstoreList();
+ foreach( $items as $label => $url )
+ $wgOut->addHtml( $this->makeListItem( $label, $url ) );
+ $wgOut->addHtml( '</ul>' );
+ return true;
}
-
- function askForm() {
- global $wgOut, $wgTitle;
- $fname = "BookSourceList::askForm()";
-
- $action = $wgTitle->escapeLocalUrl();
- $isbn = htmlspecialchars( wfMsg( "isbn" ) );
- $go = htmlspecialchars( wfMsg( "go" ) );
- $out = "<form action=\"$action\" method='post'>
- $isbn: <input name='isbn' id='isbn' />
- <input type='submit' value=\"$go\" />
- </form>";
- $wgOut->addHTML( $out );
+
+ /**
+ * Format a book source list item
+ *
+ * @param $label Book source label
+ * @param $url Book source URL
+ * @return string
+ */
+ private function makeListItem( $label, $url ) {
+ $url = str_replace( '$1', $this->isbn, $url );
+ return '<li><a href="' . htmlspecialchars( $url ) . '">' . htmlspecialchars( $label ) . '</a></li>';
}
+
}
?>
diff --git a/includes/SpecialBrokenRedirects.php b/includes/SpecialBrokenRedirects.php
index 653e13e2..50935654 100644
--- a/includes/SpecialBrokenRedirects.php
+++ b/includes/SpecialBrokenRedirects.php
@@ -27,7 +27,7 @@ class BrokenRedirectsPage extends PageQueryPage {
function getSQL() {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'page', 'pagelinks' ) );
+ list( $page, $pagelinks ) = $dbr->tableNamesN( 'page', 'pagelinks' );
$sql = "SELECT 'BrokenRedirects' AS type,
p1.page_namespace AS namespace,
diff --git a/includes/SpecialCategories.php b/includes/SpecialCategories.php
index 89cff20a..346eac63 100644
--- a/includes/SpecialCategories.php
+++ b/includes/SpecialCategories.php
@@ -30,10 +30,11 @@ class CategoriesPage extends QueryPage {
$NScat = NS_CATEGORY;
$dbr =& wfGetDB( DB_SLAVE );
$categorylinks = $dbr->tableName( 'categorylinks' );
+ $implicit_groupby = $dbr->implicitGroupby() ? '1' : 'cl_to';
$s= "SELECT 'Categories' as type,
{$NScat} as namespace,
cl_to as title,
- 1 as value,
+ $implicit_groupby as value,
COUNT(*) as count
FROM $categorylinks
GROUP BY 1,2,3,4";
diff --git a/includes/SpecialConfirmemail.php b/includes/SpecialConfirmemail.php
index 72567609..e64232aa 100644
--- a/includes/SpecialConfirmemail.php
+++ b/includes/SpecialConfirmemail.php
@@ -36,8 +36,8 @@ class EmailConfirmation extends SpecialPage {
$wgOut->addWikiText( wfMsg( 'confirmemail_noemail' ) );
}
} else {
- $title = Title::makeTitle( NS_SPECIAL, 'Userlogin' );
- $self = Title::makeTitle( NS_SPECIAL, 'Confirmemail' );
+ $title = SpecialPage::getTitleFor( 'Userlogin' );
+ $self = SpecialPage::getTitleFor( 'Confirmemail' );
$skin = $wgUser->getSkin();
$llink = $skin->makeKnownLinkObj( $title, wfMsgHtml( 'loginreqlink' ), 'returnto=' . $self->getPrefixedUrl() );
$wgOut->addHtml( wfMsgWikiHtml( 'confirmemail_needlogin', $llink ) );
@@ -54,15 +54,21 @@ class EmailConfirmation extends SpecialPage {
global $wgOut, $wgUser, $wgLang, $wgRequest;
if( $wgRequest->wasPosted() && $wgUser->matchEditToken( $wgRequest->getText( 'token' ) ) ) {
$ok = $wgUser->sendConfirmationMail();
- $message = WikiError::isError( $ok ) ? 'confirmemail_sendfailed' : 'confirmemail_sent';
- $wgOut->addWikiText( wfMsg( $message ) );
+ if ( WikiError::isError( $ok ) ) {
+ $wgOut->addWikiText( wfMsg( 'confirmemail_sendfailed', $ok->toString() ) );
+ } else {
+ $wgOut->addWikiText( wfMsg( 'confirmemail_sent' ) );
+ }
} else {
if( $wgUser->isEmailConfirmed() ) {
$time = $wgLang->timeAndDate( $wgUser->mEmailAuthenticated, true );
$wgOut->addWikiText( wfMsg( 'emailauthenticated', $time ) );
}
+ if( $wgUser->isEmailConfirmationPending() ) {
+ $wgOut->addWikiText( wfMsg( 'confirmemail_pending' ) );
+ }
$wgOut->addWikiText( wfMsg( 'confirmemail_text' ) );
- $self = Title::makeTitle( NS_SPECIAL, 'Confirmemail' );
+ $self = SpecialPage::getTitleFor( 'Confirmemail' );
$form = wfOpenElement( 'form', array( 'method' => 'post', 'action' => $self->getLocalUrl() ) );
$form .= wfHidden( 'token', $wgUser->editToken() );
$form .= wfSubmitButton( wfMsgHtml( 'confirmemail_send' ) );
@@ -85,7 +91,7 @@ class EmailConfirmation extends SpecialPage {
$message = $wgUser->isLoggedIn() ? 'confirmemail_loggedin' : 'confirmemail_success';
$wgOut->addWikiText( wfMsg( $message ) );
if( !$wgUser->isLoggedIn() ) {
- $title = Title::makeTitle( NS_SPECIAL, 'Userlogin' );
+ $title = SpecialPage::getTitleFor( 'Userlogin' );
$wgOut->returnToMain( true, $title->getPrefixedText() );
}
} else {
diff --git a/includes/SpecialContributions.php b/includes/SpecialContributions.php
index 8477b6bc..0a1ef6ee 100644
--- a/includes/SpecialContributions.php
+++ b/includes/SpecialContributions.php
@@ -9,6 +9,10 @@ class ContribsFinder {
var $username, $offset, $limit, $namespace;
var $dbr;
+ /**
+ * Constructor
+ * @param $username Username as a string
+ */
function ContribsFinder( $username ) {
$this->username = $username;
$this->namespace = false;
@@ -27,11 +31,17 @@ class ContribsFinder {
$this->offset = $offset;
}
+ /**
+ * Get timestamp of either first or last contribution made by the user.
+ * @todo Maybe it should be private ?
+ * @param $dir string 'ASC' or 'DESC'.
+ * @return Revision timestamp (rev_timestamp).
+ */
function getEditLimit( $dir ) {
list( $index, $usercond ) = $this->getUserCond();
$nscond = $this->getNamespaceCond();
$use_index = $this->dbr->useIndexClause( $index );
- extract( $this->dbr->tableNames( 'revision', 'page' ) );
+ list( $revision, $page) = $this->dbr->tableNamesN( 'revision', 'page' );
$sql = "SELECT rev_timestamp " .
" FROM $page,$revision $use_index " .
" WHERE rev_page=page_id AND $usercond $nscond" .
@@ -46,6 +56,10 @@ class ContribsFinder {
}
}
+ /**
+ * Get timestamps of first and last contributions made by the user.
+ * @return Array containing first rev_timestamp and last rev_timestamp.
+ */
function getEditLimits() {
return array(
$this->getEditLimit( "ASC" ),
@@ -77,12 +91,15 @@ class ContribsFinder {
return '';
}
+ /**
+ * @return Timestamp of first entry in previous page.
+ */
function getPreviousOffsetForPaging() {
list( $index, $usercond ) = $this->getUserCond();
$nscond = $this->getNamespaceCond();
$use_index = $this->dbr->useIndexClause( $index );
- extract( $this->dbr->tableNames( 'page', 'revision' ) );
+ list( $page, $revision ) = $this->dbr->tableNamesN( 'page', 'revision' );
$sql = "SELECT rev_timestamp FROM $page, $revision $use_index " .
"WHERE page_id = rev_page AND rev_timestamp > '" . $this->offset . "' AND " .
@@ -90,7 +107,7 @@ class ContribsFinder {
$sql .= " ORDER BY rev_timestamp ASC";
$sql = $this->dbr->limitResult( $sql, $this->limit, 0 );
$res = $this->dbr->query( $sql );
-
+
$numRows = $this->dbr->numRows( $res );
if ( $numRows ) {
$this->dbr->dataSeek( $res, $numRows - 1 );
@@ -103,10 +120,13 @@ class ContribsFinder {
return $offset;
}
+ /**
+ * @return Timestamp of first entry in next page.
+ */
function getFirstOffsetForPaging() {
list( $index, $usercond ) = $this->getUserCond();
$use_index = $this->dbr->useIndexClause( $index );
- extract( $this->dbr->tableNames( 'page', 'revision' ) );
+ list( $page, $revision ) = $this->dbr->tableNamesN( 'page', 'revision' );
$nscond = $this->getNamespaceCond();
$sql = "SELECT rev_timestamp FROM $page, $revision $use_index " .
"WHERE page_id = rev_page AND " .
@@ -114,7 +134,7 @@ class ContribsFinder {
$sql .= " ORDER BY rev_timestamp ASC";
$sql = $this->dbr->limitResult( $sql, $this->limit, 0 );
$res = $this->dbr->query( $sql );
-
+
$numRows = $this->dbr->numRows( $res );
if ( $numRows ) {
$this->dbr->dataSeek( $res, $numRows - 1 );
@@ -128,13 +148,13 @@ class ContribsFinder {
}
/* private */ function makeSql() {
- $userCond = $condition = $index = $offsetQuery = '';
+ $offsetQuery = '';
- extract( $this->dbr->tableNames( 'page', 'revision' ) );
+ list( $page, $revision ) = $this->dbr->tableNamesN( 'page', 'revision' );
list( $index, $userCond ) = $this->getUserCond();
if ( $this->offset )
- $offsetQuery = "AND rev_timestamp <= '{$this->offset}'";
+ $offsetQuery = "AND rev_timestamp < '{$this->offset}'";
$nscond = $this->getNamespaceCond();
$use_index = $this->dbr->useIndexClause( $index );
@@ -149,6 +169,11 @@ class ContribsFinder {
return $sql;
}
+ /**
+ * This do the search for the user given when creating the object.
+ * It should probably be the only public function in this class.
+ * @return Array of contributions.
+ */
function find() {
$contribs = array();
$res = $this->dbr->query( $this->makeSql(), __METHOD__ );
@@ -168,7 +193,6 @@ class ContribsFinder {
*/
function wfSpecialContributions( $par = null ) {
global $wgUser, $wgOut, $wgLang, $wgRequest;
- $fname = 'wfSpecialContributions';
$target = isset( $par ) ? $par : $wgRequest->getVal( 'target' );
if ( !strlen( $target ) ) {
@@ -190,7 +214,7 @@ function wfSpecialContributions( $par = null ) {
if ( !strlen( $options['offset'] ) || !preg_match( '/^[0-9]+$/', $options['offset'] ) )
$options['offset'] = '';
- $title = Title::makeTitle( NS_SPECIAL, 'Contributions' );
+ $title = SpecialPage::getTitleFor( 'Contributions' );
$options['target'] = $target;
$nt =& Title::makeTitle( NS_USER, $nt->getDBkey() );
@@ -316,17 +340,17 @@ function contributionsSub( $nt ) {
}
$talk = $nt->getTalkPage();
if( $talk ) {
- # Talk page link
+ # Talk page link
$tools[] = $sk->makeLinkObj( $talk, $wgLang->getNsText( NS_TALK ) );
if( ( $id != 0 && $wgSysopUserBans ) || ( $id == 0 && User::isIP( $nt->getText() ) ) ) {
# Block link
if( $wgUser->isAllowed( 'block' ) )
- $tools[] = $sk->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Blockip/' . $nt->getDBkey() ), wfMsgHtml( 'blocklink' ) );
+ $tools[] = $sk->makeKnownLinkObj( SpecialPage::getTitleFor( 'Blockip', $nt->getDBkey() ), wfMsgHtml( 'blocklink' ) );
# Block log link
- $tools[] = $sk->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Log' ), htmlspecialchars( LogPage::logName( 'block' ) ), 'type=block&page=' . $nt->getPrefixedUrl() );
+ $tools[] = $sk->makeKnownLinkObj( SpecialPage::getTitleFor( 'Log' ), wfMsgHtml( 'sp-contributions-blocklog' ), 'type=block&page=' . $nt->getPrefixedUrl() );
}
# Other logs link
- $tools[] = $sk->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Log' ), wfMsgHtml( 'log' ), 'user=' . $nt->getPartialUrl() );
+ $tools[] = $sk->makeKnownLinkObj( SpecialPage::getTitleFor( 'Log' ), wfMsgHtml( 'log' ), 'user=' . $nt->getPartialUrl() );
$ul .= ' (' . implode( ' | ', $tools ) . ')';
}
return $ul;
@@ -369,12 +393,6 @@ function contributionsForm( $options ) {
* privileges. The rollback link restores the most recent version that was not
* written by the target user.
*
- * If the contributions page is called with the parameter &bot=1, all rollback
- * links also get that parameter. It causes the edit itself and the rollback
- * to be marked as "bot" edits. Bot edits are hidden by default from recent
- * changes, so this allows sysops to combat a busy vandal without bothering
- * other users.
- *
* @todo This would probably look a lot nicer in a table.
*/
function ucListEdit( $sk, $row ) {
@@ -390,7 +408,7 @@ function ucListEdit( $sk, $row ) {
}
$rev = new Revision( $row );
-
+
$page = Title::makeTitle( $row->page_namespace, $row->page_title );
$link = $sk->makeKnownLinkObj( $page );
$difftext = $topmarktext = '';
@@ -403,12 +421,7 @@ function ucListEdit( $sk, $row ) {
}
if( $wgUser->isAllowed( 'rollback' ) ) {
- $extraRollback = $wgRequest->getBool( 'bot' ) ? '&bot=1' : '';
- $extraRollback .= '&token=' . urlencode(
- $wgUser->editToken( array( $page->getPrefixedText(), $row->rev_user_text ) ) );
- $topmarktext .= ' ['. $sk->makeKnownLinkObj( $page,
- $messages['rollbacklink'],
- 'action=rollback&from=' . urlencode( $row->rev_user_text ) . $extraRollback ) .']';
+ $topmarktext .= ' '.$sk->generateRollback( $rev );
}
}
@@ -421,7 +434,7 @@ function ucListEdit( $sk, $row ) {
$comment = $sk->revComment( $rev );
$d = $wgLang->timeanddate( wfTimestamp( TS_MW, $row->rev_timestamp ), true );
-
+
if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {
$d = '<span class="history-deleted">' . $d . '</span>';
}
diff --git a/includes/SpecialDeadendpages.php b/includes/SpecialDeadendpages.php
index b319a170..4ffe5e03 100644
--- a/includes/SpecialDeadendpages.php
+++ b/includes/SpecialDeadendpages.php
@@ -43,7 +43,7 @@ class DeadendPagesPage extends PageQueryPage {
*/
function getSQL() {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'page', 'pagelinks' ) );
+ list( $page, $pagelinks ) = $dbr->tableNamesN( 'page', 'pagelinks' );
return "SELECT 'Deadendpages' as type, page_namespace AS namespace, page_title as title, page_title AS value " .
"FROM $page LEFT JOIN $pagelinks ON page_id = pl_from " .
"WHERE pl_from IS NULL " .
diff --git a/includes/SpecialDisambiguations.php b/includes/SpecialDisambiguations.php
index 0355c85b..626b967c 100644
--- a/includes/SpecialDisambiguations.php
+++ b/includes/SpecialDisambiguations.php
@@ -32,7 +32,7 @@ class DisambiguationsPage extends PageQueryPage {
function getSQL() {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'page', 'pagelinks', 'templatelinks' ) );
+ list( $page, $pagelinks, $templatelinks) = $dbr->tableNamesN( 'page', 'pagelinks', 'templatelinks' );
$dMsgText = wfMsgForContent('disambiguationspage');
diff --git a/includes/SpecialDoubleRedirects.php b/includes/SpecialDoubleRedirects.php
index fe42b00a..cf1153ea 100644
--- a/includes/SpecialDoubleRedirects.php
+++ b/includes/SpecialDoubleRedirects.php
@@ -26,7 +26,7 @@ class DoubleRedirectsPage extends PageQueryPage {
function getSQLText( &$dbr, $namespace = null, $title = null ) {
- extract( $dbr->tableNames( 'page', 'pagelinks' ) );
+ list( $page, $pagelinks ) = $dbr->tableNamesN( 'page', 'pagelinks' );
$limitToTitle = !( $namespace === null && $title === null );
$sql = $limitToTitle ? "SELECT" : "SELECT 'DoubleRedirects' as type," ;
diff --git a/includes/SpecialEmailuser.php b/includes/SpecialEmailuser.php
index d711947f..38745a37 100644
--- a/includes/SpecialEmailuser.php
+++ b/includes/SpecialEmailuser.php
@@ -67,6 +67,7 @@ class EmailUserForm {
var $target;
var $text, $subject;
+ var $cc_me; // Whether user requested to be sent a separate copy of their email.
/**
* @param User $target
@@ -76,6 +77,7 @@ class EmailUserForm {
$this->target = $target;
$this->text = $wgRequest->getText( 'wpText' );
$this->subject = $wgRequest->getText( 'wpSubject' );
+ $this->cc_me = $wgRequest->getBool( 'wpCCMe' );
}
function showForm() {
@@ -95,9 +97,10 @@ class EmailUserForm {
$emr = wfMsg( "emailsubject" );
$emm = wfMsg( "emailmessage" );
$ems = wfMsg( "emailsend" );
+ $emc = wfMsg( "emailccme" );
$encSubject = htmlspecialchars( $this->subject );
- $titleObj = Title::makeTitle( NS_SPECIAL, "Emailuser" );
+ $titleObj = SpecialPage::getTitleFor( "Emailuser" );
$action = $titleObj->escapeLocalURL( "target=" .
urlencode( $this->target->getName() ) . "&action=submit" );
$token = $wgUser->editToken();
@@ -120,6 +123,7 @@ class EmailUserForm {
<span id='wpTextLabel'><label for=\"wpText\">{$emm}:</label><br /></span>
<textarea name=\"wpText\" rows='20' cols='80' wrap='virtual' style=\"width: 100%;\">" . htmlspecialchars( $this->text ) .
"</textarea>
+" . wfCheckLabel( $emc, 'wpCCMe', 'wpCCMe', $wgUser->getBoolOption( 'ccmeonemails' ) ) . "<br />
<input type='submit' name=\"wpSend\" value=\"{$ems}\" />
<input type='hidden' name='wpEditToken' value=\"$token\" />
</form>\n" );
@@ -140,7 +144,26 @@ class EmailUserForm {
if( WikiError::isError( $mailResult ) ) {
$wgOut->addHTML( wfMsg( "usermailererror" ) . $mailResult);
} else {
- $titleObj = Title::makeTitle( NS_SPECIAL, "Emailuser" );
+
+ // if the user requested a copy of this mail, do this now,
+ // unless they are emailing themselves, in which case one copy of the message is sufficient.
+ if ($this->cc_me && $to != $from) {
+ $cc_subject = wfMsg('emailccsubject', $this->target->getName(), $subject);
+ if( wfRunHooks( 'EmailUser', array( &$from, &$from, &$cc_subject, &$this->text ) ) ) {
+ $ccResult = userMailer( $from, $from, $cc_subject, $this->text );
+ if( WikiError::isError( $ccResult ) ) {
+ // At this stage, the user's CC mail has failed, but their
+ // original mail has succeeded. It's unlikely, but still, what to do?
+ // We can either show them an error, or we can say everything was fine,
+ // or we can say we sort of failed AND sort of succeeded. Of these options,
+ // simply saying there was an error is probably best.
+ $wgOut->addHTML( wfMsg( "usermailererror" ) . $ccResult);
+ return;
+ }
+ }
+ }
+
+ $titleObj = SpecialPage::getTitleFor( "Emailuser" );
$encTarget = wfUrlencode( $this->target->getName() );
$wgOut->redirect( $titleObj->getFullURL( "target={$encTarget}&action=success" ) );
wfRunHooks( 'EmailUserComplete', array( $to, $from, $subject, $this->text ) );
diff --git a/includes/SpecialExport.php b/includes/SpecialExport.php
index dc52e00b..5e6d6d8d 100644
--- a/includes/SpecialExport.php
+++ b/includes/SpecialExport.php
@@ -30,11 +30,6 @@ function wfSpecialExport( $page = '' ) {
global $wgExportAllowHistory, $wgExportMaxHistory;
$curonly = true;
- $fullHistory = array(
- 'dir' => 'asc',
- 'offset' => false,
- 'limit' => $wgExportMaxHistory,
- );
if( $wgRequest->wasPosted() ) {
$page = $wgRequest->getText( 'pages' );
$curonly = $wgRequest->getCheck( 'curonly' );
@@ -88,12 +83,7 @@ function wfSpecialExport( $page = '' ) {
// Cancel output buffering and gzipping if set
// This should provide safer streaming for pages with history
- while( $status = ob_get_status() ) {
- ob_end_clean();
- if( $status['name'] == 'ob_gzhandler' ) {
- header( 'Content-Encoding:' );
- }
- }
+ wfResetOutputBuffers();
header( "Content-type: application/xml; charset=utf-8" );
$pages = explode( "\n", $page );
@@ -123,7 +113,7 @@ function wfSpecialExport( $page = '' ) {
}
$wgOut->addWikiText( wfMsg( "exporttext" ) );
- $titleObj = Title::makeTitle( NS_SPECIAL, "Export" );
+ $titleObj = SpecialPage::getTitleFor( "Export" );
$form = wfOpenElement( 'form', array( 'method' => 'post', 'action' => $titleObj->getLocalUrl() ) );
$form .= wfOpenElement( 'textarea', array( 'name' => 'pages', 'cols' => 40, 'rows' => 10 ) ) . '</textarea><br />';
diff --git a/includes/SpecialImagelist.php b/includes/SpecialImagelist.php
index 54ee83e5..5ecbe8a6 100644
--- a/includes/SpecialImagelist.php
+++ b/includes/SpecialImagelist.php
@@ -9,18 +9,19 @@
*
*/
function wfSpecialImagelist() {
- global $wgUser, $wgOut, $wgLang, $wgContLang, $wgRequest, $wgMiserMode;
+ global $wgOut;
$pager = new ImageListPager;
$limit = $pager->getForm();
$body = $pager->getBody();
$nav = $pager->getNavigationBar();
- $wgOut->addHTML( "
+ $wgOut->addHTML(
$limit
- <br/>
- $body
- $nav" );
+ . '<br/>'
+ . $body
+ . '<br/>'
+ . $nav );
}
class ImageListPager extends TablePager {
diff --git a/includes/SpecialImport.php b/includes/SpecialImport.php
index aaadb662..1c8ee2e0 100644
--- a/includes/SpecialImport.php
+++ b/includes/SpecialImport.php
@@ -208,7 +208,7 @@ class ImportReporter {
$dbw = wfGetDB( DB_MASTER );
$nullRevision = Revision::newNullRevision(
$dbw, $title->getArticleId(), $comment, true );
- $nullRevId = $nullRevision->insertOn( $dbw );
+ $nullRevision->insertOn( $dbw );
}
}
@@ -304,7 +304,6 @@ class WikiRevision {
}
function importOldRevision() {
- $fname = "WikiImporter::importOldRevision";
$dbw =& wfGetDB( DB_MASTER );
# Sneak a single revision into place
@@ -818,7 +817,7 @@ class ImportStreamSource {
return new ImportStreamSource( $file );
}
- function newFromUpload( $fieldname = "xmlimport" ) {
+ static function newFromUpload( $fieldname = "xmlimport" ) {
$upload =& $_FILES[$fieldname];
if( !isset( $upload ) || !$upload['name'] ) {
@@ -844,10 +843,9 @@ class ImportStreamSource {
return $ret;
}
- function newFromInterwiki( $interwiki, $page, $history=false ) {
- $base = Title::getInterwikiLink( $interwiki );
+ public static function newFromInterwiki( $interwiki, $page, $history=false ) {
$link = Title::newFromText( "$interwiki:Special:Export/$page" );
- if( empty( $base ) || empty( $link ) ) {
+ if( is_null( $link ) || $link->getInterwiki() == '' ) {
return new WikiErrorMsg( 'importbadinterwiki' );
} else {
$params = $history ? 'history=1' : '';
diff --git a/includes/SpecialIpblocklist.php b/includes/SpecialIpblocklist.php
index 437fac7f..293059f2 100644
--- a/includes/SpecialIpblocklist.php
+++ b/includes/SpecialIpblocklist.php
@@ -58,7 +58,7 @@ class IPUnblockForm {
$ipa = wfMsgHtml( $wgSysopUserBans ? 'ipadressorusername' : 'ipaddress' );
$ipr = wfMsgHtml( 'ipbreason' );
$ipus = wfMsgHtml( 'ipusubmit' );
- $titleObj = Title::makeTitle( NS_SPECIAL, "Ipblocklist" );
+ $titleObj = SpecialPage::getTitleFor( "Ipblocklist" );
$action = $titleObj->escapeLocalURL( "action=submit" );
if ( "" != $err ) {
@@ -142,7 +142,7 @@ class IPUnblockForm {
if ( $success ) {
# Report to the user
- $titleObj = Title::makeTitle( NS_SPECIAL, "Ipblocklist" );
+ $titleObj = SpecialPage::getTitleFor( "Ipblocklist" );
$success = $titleObj->getFullURL( "action=success&successip=" . urlencode( $this->ip ) );
$wgOut->redirect( $success );
} else {
@@ -167,6 +167,7 @@ class IPUnblockForm {
}
$conds = array();
+ $matches = array();
if ( $this->ip == '' ) {
// No extra conditions
} elseif ( substr( $this->ip, 0, 1 ) == '#' ) {
@@ -174,7 +175,7 @@ class IPUnblockForm {
} elseif ( IP::toUnsigned( $this->ip ) !== false ) {
$conds['ipb_address'] = $this->ip;
$conds['ipb_auto'] = 0;
- } elseif( preg_match( "/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\\/(\\d{1,2})$/", $this->ip, $matches ) ) {
+ } elseif( preg_match( '/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\\/(\\d{1,2})$/', $this->ip, $matches ) ) {
$conds['ipb_address'] = Block::normaliseRange( $this->ip );
$conds['ipb_auto'] = 0;
} else {
@@ -222,7 +223,7 @@ class IPUnblockForm {
'value' => $this->ip ) ) .
wfElement( 'input', array(
'type' => 'submit',
- 'value' => wfMsg( 'search' ) ) ) .
+ 'value' => wfMsg( 'searchbutton' ) ) ) .
'</form>';
}
@@ -241,7 +242,7 @@ class IPUnblockForm {
if( is_null( $msg ) ) {
$msg = array();
$keys = array( 'infiniteblock', 'expiringblock', 'contribslink', 'unblocklink',
- 'anononlyblock', 'createaccountblock' );
+ 'anononlyblock', 'createaccountblock', 'noautoblockblock' );
foreach( $keys as $key ) {
$msg[$key] = wfMsgHtml( $key );
}
@@ -250,16 +251,17 @@ class IPUnblockForm {
}
# Prepare links to the blocker's user and talk pages
+ $blocker_id = $block->getBy();
$blocker_name = $block->getByName();
- $blocker = $sk->MakeLinkObj( Title::makeTitle( NS_USER, $blocker_name ), $blocker_name );
- $blocker .= ' (' . $sk->makeLinkObj( Title::makeTitle( NS_USER_TALK, $blocker_name ), $wgLang->getNsText( NS_TALK ) ) . ')';
+ $blocker = $sk->userLink( $blocker_id, $blocker_name );
+ $blocker .= $sk->userToolLinks( $blocker_id, $blocker_name );
# Prepare links to the block target's user and contribs. pages (as applicable, don't do it for autoblocks)
if( $block->mAuto ) {
$target = $block->getRedactedName(); # Hide the IP addresses of auto-blocks; privacy
} else {
$target = $sk->makeLinkObj( Title::makeTitle( NS_USER, $block->mAddress ), $block->mAddress );
- $target .= ' (' . $sk->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Contributions' ), $msg['contribslink'], 'target=' . urlencode( $block->mAddress ) ) . ')';
+ $target .= ' (' . $sk->makeKnownLinkObj( SpecialPage::getSafeTitleFor( 'Contributions', $block->mAddress ), $msg['contribslink'] ) . ')';
}
$formattedTime = $wgLang->timeanddate( $block->mTimestamp, true );
@@ -277,6 +279,10 @@ class IPUnblockForm {
if ( $block->mCreateAccount ) {
$properties[] = $msg['createaccountblock'];
}
+ if (!$block->mEnableAutoblock && $block->mUser ) {
+ $properties[] = $msg['noautoblockblock'];
+ }
+
$properties = implode( ', ', $properties );
$line = wfMsgReplaceArgs( $msg['blocklistline'], array( $formattedTime, $blocker, $target, $properties ) );
@@ -284,7 +290,7 @@ class IPUnblockForm {
$s = "<li>{$line}";
if ( $wgUser->isAllowed('block') ) {
- $titleObj = Title::makeTitle( NS_SPECIAL, "Ipblocklist" );
+ $titleObj = SpecialPage::getTitleFor( "Ipblocklist" );
$s .= ' (' . $sk->makeKnownLinkObj($titleObj, $msg['unblocklink'], 'action=unblock&id=' . urlencode( $block->mId ) ) . ')';
}
$s .= $sk->commentBlock( $block->mReason );
diff --git a/includes/SpecialListusers.php b/includes/SpecialListusers.php
index 4668d0c7..b0794344 100644
--- a/includes/SpecialListusers.php
+++ b/includes/SpecialListusers.php
@@ -210,7 +210,7 @@ class ListUsersPage extends QueryPage {
* $par string (optional) A group to list users from
*/
function wfSpecialListusers( $par = null ) {
- global $wgRequest, $wgContLang;
+ global $wgRequest;
list( $limit, $offset ) = wfCheckLimits();
diff --git a/includes/SpecialLockdb.php b/includes/SpecialLockdb.php
index 72172e2c..f0142e5c 100644
--- a/includes/SpecialLockdb.php
+++ b/includes/SpecialLockdb.php
@@ -62,7 +62,7 @@ class DBLockForm {
$lc = htmlspecialchars( wfMsg( 'lockconfirm' ) );
$lb = htmlspecialchars( wfMsg( 'lockbtn' ) );
$elr = htmlspecialchars( wfMsg( 'enterlockreason' ) );
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Lockdb' );
+ $titleObj = SpecialPage::getTitleFor( 'Lockdb' );
$action = $titleObj->escapeLocalURL( 'action=submit' );
$reason = htmlspecialchars( $this->reason );
$token = htmlspecialchars( $wgUser->editToken() );
@@ -114,7 +114,7 @@ END
$wgLang->timeanddate( wfTimestampNow() ) . ")\n" );
fclose( $fp );
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Lockdb' );
+ $titleObj = SpecialPage::getTitleFor( 'Lockdb' );
$wgOut->redirect( $titleObj->getFullURL( 'action=success' ) );
}
diff --git a/includes/SpecialLog.php b/includes/SpecialLog.php
index e32d2240..7076d819 100644
--- a/includes/SpecialLog.php
+++ b/includes/SpecialLog.php
@@ -97,7 +97,7 @@ class LogReader {
function limitUser( $name ) {
if ( $name == '' )
return false;
- $usertitle = Title::makeTitle( NS_USER, $name );
+ $usertitle = Title::makeTitleSafe( NS_USER, $name );
if ( is_null( $usertitle ) )
return false;
$this->user = $usertitle->getText();
@@ -151,7 +151,6 @@ class LogReader {
*/
function getQuery() {
$logging = $this->db->tableName( "logging" );
- $user = $this->db->tableName( 'user' );
$sql = "SELECT /*! STRAIGHT_JOIN */ log_type, log_action, log_timestamp,
log_user, user_name,
log_namespace, log_title, page_id,
@@ -304,7 +303,6 @@ class LogViewer {
function logLine( $s ) {
global $wgLang;
$title = Title::makeTitle( $s->log_namespace, $s->log_title );
- $user = Title::makeTitleSafe( NS_USER, $s->user_name );
$time = $wgLang->timeanddate( wfTimestamp(TS_MW, $s->log_timestamp), true );
// Enter the existence or non-existence of this page into the link cache,
@@ -321,7 +319,7 @@ class LogViewer {
$paramArray = LogPage::extractParams( $s->log_params );
$revert = '';
if ( $s->log_type == 'move' && isset( $paramArray[0] ) ) {
- $specialTitle = Title::makeTitle( NS_SPECIAL, 'Movepage' );
+ $specialTitle = SpecialPage::getTitleFor( 'Movepage' );
$destTitle = Title::newFromText( $paramArray[0] );
if ( $destTitle ) {
$revert = '(' . $this->skin->makeKnownLinkObj( $specialTitle, wfMsg( 'revertmove' ),
@@ -356,7 +354,7 @@ class LogViewer {
function showOptions( &$out ) {
global $wgScript;
$action = htmlspecialchars( $wgScript );
- $title = Title::makeTitle( NS_SPECIAL, 'Log' );
+ $title = SpecialPage::getTitleFor( 'Log' );
$special = htmlspecialchars( $title->getPrefixedDBkey() );
$out->addHTML( "<form action=\"$action\" method=\"get\">\n" .
"<input type='hidden' name='title' value=\"$special\" />\n" .
diff --git a/includes/SpecialLonelypages.php b/includes/SpecialLonelypages.php
index 15022924..8770a9e7 100644
--- a/includes/SpecialLonelypages.php
+++ b/includes/SpecialLonelypages.php
@@ -30,7 +30,7 @@ class LonelyPagesPage extends PageQueryPage {
function getSQL() {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'page', 'pagelinks' ) );
+ list( $page, $pagelinks ) = $dbr->tableNamesN( 'page', 'pagelinks' );
return
"SELECT 'Lonelypages' AS type,
diff --git a/includes/SpecialMIMEsearch.php b/includes/SpecialMIMEsearch.php
index cbbe6f93..8678118f 100644
--- a/includes/SpecialMIMEsearch.php
+++ b/includes/SpecialMIMEsearch.php
@@ -126,9 +126,12 @@ function wfSpecialMIMEsearch( $par = null ) {
}
function wfSpecialMIMEsearchParse( $str ) {
- wfSuppressWarnings();
+ // searched for an invalid MIME type.
+ if( strpos( $str, '/' ) === false) {
+ return array ('', '');
+ }
+
list( $major, $minor ) = explode( '/', $str, 2 );
- wfRestoreWarnings();
return array(
ltrim( $major, ' ' ),
diff --git a/includes/SpecialMostcategories.php b/includes/SpecialMostcategories.php
index c0d662cc..41bfb0cd 100644
--- a/includes/SpecialMostcategories.php
+++ b/includes/SpecialMostcategories.php
@@ -20,7 +20,7 @@ class MostcategoriesPage extends QueryPage {
function getSQL() {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'categorylinks', 'page' ) );
+ list( $categorylinks, $page) = $dbr->tableNamesN( 'categorylinks', 'page' );
return
"
SELECT
@@ -37,20 +37,11 @@ class MostcategoriesPage extends QueryPage {
}
function formatResult( $skin, $result ) {
- global $wgContLang, $wgLang;
-
- $nt = Title::makeTitle( $result->namespace, $result->title );
- $text = $wgContLang->convert( $nt->getPrefixedText() );
-
- $plink = $skin->makeKnownLink( $nt->getPrefixedText(), $text );
-
- $nl = wfMsgExt( 'ncategories', array( 'parsemag', 'escape' ),
- $wgLang->formatNum( $result->value ) );
-
- $nlink = $skin->makeKnownLink( $wgContLang->specialPage( 'Categories' ),
- $nl, 'article=' . $nt->getPrefixedURL() );
-
- return wfSpecialList($plink, $nlink);
+ global $wgLang;
+ $title = Title::makeTitleSafe( $result->namespace, $result->title );
+ $count = wfMsgExt( 'ncategories', array( 'parsemag', 'escape' ), $wgLang->formatNum( $result->value ) );
+ $link = $skin->makeKnownLinkObj( $title, $title->getText() );
+ return wfSpecialList( $link, $count );
}
}
diff --git a/includes/SpecialMostimages.php b/includes/SpecialMostimages.php
index 09f71088..17c07c70 100644
--- a/includes/SpecialMostimages.php
+++ b/includes/SpecialMostimages.php
@@ -20,7 +20,7 @@ class MostimagesPage extends QueryPage {
function getSQL() {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'imagelinks' ) );
+ $imagelinks = $dbr->tableName( 'imagelinks' );
return
"
SELECT
diff --git a/includes/SpecialMostlinked.php b/includes/SpecialMostlinked.php
index 1791228d..2794ecbb 100644
--- a/includes/SpecialMostlinked.php
+++ b/includes/SpecialMostlinked.php
@@ -28,7 +28,7 @@ class MostlinkedPage extends QueryPage {
*/
function getSQL() {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'pagelinks', 'page' ) );
+ list( $pagelinks, $page ) = $dbr->tableNamesN( 'pagelinks', 'page' );
return
"SELECT 'Mostlinked' AS type,
pl_namespace AS namespace,
@@ -44,12 +44,12 @@ class MostlinkedPage extends QueryPage {
/**
* Pre-fill the link cache
*/
- function preprocessResults( &$dbr, $res ) {
- if( $dbr->numRows( $res ) > 0 ) {
+ function preprocessResults( &$db, &$res ) {
+ if( $db->numRows( $res ) > 0 ) {
$linkBatch = new LinkBatch();
- while( $row = $dbr->fetchObject( $res ) )
+ while( $row = $db->fetchObject( $res ) )
$linkBatch->addObj( Title::makeTitleSafe( $row->namespace, $row->title ) );
- $dbr->dataSeek( $res, 0 );
+ $db->dataSeek( $res, 0 );
$linkBatch->execute();
}
}
@@ -62,8 +62,8 @@ class MostlinkedPage extends QueryPage {
* @return string
*/
function makeWlhLink( &$title, $caption, &$skin ) {
- $wlh = Title::makeTitle( NS_SPECIAL, 'Whatlinkshere' );
- return $skin->makeKnownLinkObj( $wlh, $caption, 'target=' . $title->getPrefixedUrl() );
+ $wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedDBkey() );
+ return $skin->makeKnownLinkObj( $wlh, $caption );
}
/**
diff --git a/includes/SpecialMostlinkedcategories.php b/includes/SpecialMostlinkedcategories.php
index 5942b3f4..e1f84847 100644
--- a/includes/SpecialMostlinkedcategories.php
+++ b/includes/SpecialMostlinkedcategories.php
@@ -22,7 +22,7 @@ class MostlinkedCategoriesPage extends QueryPage {
function getSQL() {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'categorylinks', 'page' ) );
+ $categorylinks = $dbr->tableName( 'categorylinks' );
$name = $dbr->addQuotes( $this->getName() );
return
"
diff --git a/includes/SpecialMostrevisions.php b/includes/SpecialMostrevisions.php
index 676923ae..1e3334e9 100644
--- a/includes/SpecialMostrevisions.php
+++ b/includes/SpecialMostrevisions.php
@@ -22,7 +22,7 @@ class MostrevisionsPage extends QueryPage {
function getSQL() {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'revision', 'page' ) );
+ list( $revision, $page ) = $dbr->tableNamesN( 'revision', 'page' );
return
"
SELECT
diff --git a/includes/SpecialMovepage.php b/includes/SpecialMovepage.php
index e33c1530..e3112c4c 100644
--- a/includes/SpecialMovepage.php
+++ b/includes/SpecialMovepage.php
@@ -9,7 +9,7 @@
* Constructor
*/
function wfSpecialMovepage( $par = null ) {
- global $wgUser, $wgOut, $wgRequest, $action, $wgOnlySysopMayMove;
+ global $wgUser, $wgOut, $wgRequest, $action;
# Check rights
if ( !$wgUser->isAllowed( 'move' ) ) {
@@ -49,6 +49,8 @@ function wfSpecialMovepage( $par = null ) {
class MovePageForm {
var $oldTitle, $newTitle, $reason; # Text input
var $moveTalk, $deleteAndMove;
+
+ private $watch = false;
function MovePageForm( $par ) {
global $wgRequest;
@@ -56,8 +58,13 @@ class MovePageForm {
$this->oldTitle = $wgRequest->getText( 'wpOldTitle', $target );
$this->newTitle = $wgRequest->getText( 'wpNewTitle' );
$this->reason = $wgRequest->getText( 'wpReason' );
- $this->moveTalk = $wgRequest->getBool( 'wpMovetalk', true );
+ if ( $wgRequest->wasPosted() ) {
+ $this->moveTalk = $wgRequest->getBool( 'wpMovetalk', false );
+ } else {
+ $this->moveTalk = $wgRequest->getBool( 'wpMovetalk', true );
+ }
$this->deleteAndMove = $wgRequest->getBool( 'wpDeleteAndMove' ) && $wgRequest->getBool( 'wpConfirm' );
+ $this->watch = $wgRequest->getCheck( 'wpWatch' );
}
function showForm( $err ) {
@@ -126,7 +133,7 @@ class MovePageForm {
$movetalk = wfMsgHtml( 'movetalk' );
$movereason = wfMsgHtml( 'movereason' );
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Movepage' );
+ $titleObj = SpecialPage::getTitleFor( 'Movepage' );
$action = $titleObj->escapeLocalURL( 'action=submit' );
$token = htmlspecialchars( $wgUser->editToken() );
@@ -167,6 +174,14 @@ class MovePageForm {
<td><label for=\"wpMovetalk\">{$movetalk}</label></td>
</tr>" );
}
+
+ $watchChecked = $this->watch || $wgUser->getBoolOption( 'watchmoves' ) || $ot->userIsWatching();
+ $watch = '<tr>';
+ $watch .= '<td align="right">' . Xml::check( 'wpWatch', $watchChecked, array( 'id' => 'watch' ) ) . '</td>';
+ $watch .= '<td>' . Xml::label( wfMsg( 'move-watch' ), 'watch' ) . '</td>';
+ $watch .= '</tr>';
+ $wgOut->addHtml( $watch );
+
$wgOut->addHTML( "
{$confirm}
<tr>
@@ -185,7 +200,6 @@ class MovePageForm {
function doSubmit() {
global $wgOut, $wgUser, $wgRequest;
- $fname = "MovePageForm::doSubmit";
if ( $wgUser->pingLimiter( 'move' ) ) {
$wgOut->rateLimited();
@@ -221,7 +235,7 @@ class MovePageForm {
# Move the talk page if relevant, if it exists, and if we've been told to
$ott = $ot->getTalkPage();
if( $ott->exists() ) {
- if( $wgRequest->getVal( 'wpMovetalk' ) == 1 && !$ot->isTalkPage() && !$nt->isTalkPage() ) {
+ if( $this->moveTalk && !$ot->isTalkPage() && !$nt->isTalkPage() ) {
$ntt = $nt->getTalkPage();
# Attempt the move
@@ -239,9 +253,18 @@ class MovePageForm {
} else {
$talkmoved = 'notalkpage';
}
+
+ # Deal with watches
+ if( $this->watch ) {
+ $wgUser->addWatch( $ot );
+ $wgUser->addWatch( $nt );
+ } else {
+ $wgUser->removeWatch( $ot );
+ $wgUser->removeWatch( $nt );
+ }
# Give back result to user.
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Movepage' );
+ $titleObj = SpecialPage::getTitleFor( 'Movepage' );
$success = $titleObj->getFullURL(
'action=success&oldtitle=' . wfUrlencode( $ot->getPrefixedText() ) .
'&newtitle=' . wfUrlencode( $nt->getPrefixedText() ) .
diff --git a/includes/SpecialNewimages.php b/includes/SpecialNewimages.php
index 95c90e42..062e7e12 100644
--- a/includes/SpecialNewimages.php
+++ b/includes/SpecialNewimages.php
@@ -9,7 +9,7 @@
*
*/
function wfSpecialNewimages( $par, $specialPage ) {
- global $wgUser, $wgOut, $wgLang, $wgContLang, $wgRequest, $wgGroupPermissions;
+ global $wgUser, $wgOut, $wgLang, $wgRequest, $wgGroupPermissions;
$wpIlMatch = $wgRequest->getText( 'wpIlMatch' );
$dbr =& wfGetDB( DB_SLAVE );
@@ -67,9 +67,11 @@ function wfSpecialNewimages( $par, $specialPage ) {
/** Hardcode this for now. */
$limit = 48;
- if ( $parval = intval( $par ) )
- if ( $parval <= $limit && $parval > 0 )
+ if ( $parval = intval( $par ) ) {
+ if ( $parval <= $limit && $parval > 0 ) {
$limit = $parval;
+ }
+ }
$where = array();
$searchpar = '';
@@ -154,7 +156,7 @@ function wfSpecialNewimages( $par, $specialPage ) {
}
$sub = wfMsg( 'ilsubmit' );
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Newimages' );
+ $titleObj = SpecialPage::getTitleFor( 'Newimages' );
$action = $titleObj->escapeLocalURL( $hidebots ? '' : 'hidebots=0' );
if ($shownav) {
$wgOut->addHTML( "<form id=\"imagesearch\" method=\"post\" action=\"" .
@@ -163,7 +165,6 @@ function wfSpecialNewimages( $par, $specialPage ) {
htmlspecialchars( $wpIlMatch ) . "\" /> " .
"<input type='submit' name=\"wpIlSubmit\" value=\"{$sub}\" /></form>" );
}
- $here = $wgContLang->specialPage( 'Newimages' );
/**
* Paging controls...
diff --git a/includes/SpecialNewpages.php b/includes/SpecialNewpages.php
index 3fd0eba2..62007383 100644
--- a/includes/SpecialNewpages.php
+++ b/includes/SpecialNewpages.php
@@ -42,7 +42,7 @@ class NewPagesPage extends QueryPage {
global $wgUser, $wgUseRCPatrol;
$usepatrol = ( $wgUseRCPatrol && $wgUser->isAllowed( 'patrol' ) ) ? 1 : 0;
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'recentchanges', 'page', 'text' ) );
+ list( $recentchanges, $page ) = $dbr->tableNamesN( 'recentchanges', 'page' );
$uwhere = $this->makeUserWhere( $dbr );
@@ -96,8 +96,8 @@ class NewPagesPage extends QueryPage {
$time = $wgLang->timeAndDate( $result->timestamp, true );
$plink = $skin->makeKnownLinkObj( $title, '', $this->patrollable( $result ) ? 'rcid=' . $result->rcid : '' );
$hist = $skin->makeKnownLinkObj( $title, wfMsgHtml( 'hist' ), 'action=history' );
- $length = wfMsgHtml( 'nbytes', $wgLang->formatNum( htmlspecialchars( $result->length ) ) );
- $ulink = $skin->userLink( $result->user, $result->user_text ) . $skin->userToolLinks( $result->user, $result->user_text );
+ $length = wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ), $wgLang->formatNum( htmlspecialchars( $result->length ) ) );
+ $ulink = $skin->userLink( $result->user, $result->user_text ) . ' ' . $skin->userToolLinks( $result->user, $result->user_text );
$comment = $skin->commentBlock( $result->comment );
return "{$time} {$dm}{$plink} ({$hist}) {$dm}[{$length}] {$dm}{$ulink} {$comment}";
@@ -132,7 +132,7 @@ class NewPagesPage extends QueryPage {
* @return string
*/
function getPageHeader() {
- $self = Title::makeTitle( NS_SPECIAL, $this->getName() );
+ $self = SpecialPage::getTitleFor( $this->getName() );
$form = wfOpenElement( 'form', array( 'method' => 'post', 'action' => $self->getLocalUrl() ) );
$form .= '<table><tr><td align="right">' . wfMsgHtml( 'namespace' ) . '</td>';
$form .= '<td>' . HtmlNamespaceSelector( $this->namespace ) . '</td><tr>';
@@ -172,6 +172,7 @@ function wfSpecialNewpages($par, $specialPage) {
if ( is_numeric( $bit ) )
$limit = $bit;
+ $m = array();
if ( preg_match( '/^limit=(\d+)$/', $bit, $m ) )
$limit = intval($m[1]);
if ( preg_match( '/^offset=(\d+)$/', $bit, $m ) )
diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php
index 294c05ef..86438756 100644
--- a/includes/SpecialPage.php
+++ b/includes/SpecialPage.php
@@ -36,11 +36,15 @@ class SpecialPage
* @access private
*/
/**
- * The name of the class, used in the URL.
+ * The canonical name of this special page
* Also used for the default <h1> heading, @see getDescription()
*/
var $mName;
/**
+ * The local name of this special page
+ */
+ var $mLocalName;
+ /**
* Minimum user level required to access this page, or "" for anyone.
* Also used to categorise the pages in Special:Specialpages
*/
@@ -65,72 +69,83 @@ class SpecialPage
* Whether the special page can be included in an article
*/
var $mIncludable;
+ /**
+ * Query parameters that can be passed through redirects
+ */
+ var $mAllowedRedirectParams = array();
static public $mList = array(
- 'DoubleRedirects' => array( 'SpecialPage', 'DoubleRedirects' ),
- 'BrokenRedirects' => array( 'SpecialPage', 'BrokenRedirects' ),
- 'Disambiguations' => array( 'SpecialPage', 'Disambiguations' ),
-
- 'Userlogin' => array( 'SpecialPage', 'Userlogin' ),
- 'Userlogout' => array( 'UnlistedSpecialPage', 'Userlogout' ),
- 'Preferences' => array( 'SpecialPage', 'Preferences' ),
- 'Watchlist' => array( 'SpecialPage', 'Watchlist' ),
-
- 'Recentchanges' => array( 'IncludableSpecialPage', 'Recentchanges' ),
- 'Upload' => array( 'SpecialPage', 'Upload' ),
- 'Imagelist' => array( 'SpecialPage', 'Imagelist' ),
- 'Newimages' => array( 'IncludableSpecialPage', 'Newimages' ),
- 'Listusers' => array( 'SpecialPage', 'Listusers' ),
- 'Statistics' => array( 'SpecialPage', 'Statistics' ),
- 'Random' => array( 'SpecialPage', 'Randompage' ),
- 'Lonelypages' => array( 'SpecialPage', 'Lonelypages' ),
- 'Uncategorizedpages'=> array( 'SpecialPage', 'Uncategorizedpages' ),
- 'Uncategorizedcategories'=> array( 'SpecialPage', 'Uncategorizedcategories' ),
- 'Uncategorizedimages' => array( 'SpecialPage', 'Uncategorizedimages' ),
- 'Unusedcategories' => array( 'SpecialPage', 'Unusedcategories' ),
- 'Unusedimages' => array( 'SpecialPage', 'Unusedimages' ),
- 'Wantedpages' => array( 'IncludableSpecialPage', 'Wantedpages' ),
- 'Wantedcategories' => array( 'SpecialPage', 'Wantedcategories' ),
- 'Mostlinked' => array( 'SpecialPage', 'Mostlinked' ),
- 'Mostlinkedcategories' => array( 'SpecialPage', 'Mostlinkedcategories' ),
- 'Mostcategories' => array( 'SpecialPage', 'Mostcategories' ),
- 'Mostimages' => array( 'SpecialPage', 'Mostimages' ),
- 'Mostrevisions' => array( 'SpecialPage', 'Mostrevisions' ),
- 'Shortpages' => array( 'SpecialPage', 'Shortpages' ),
- 'Longpages' => array( 'SpecialPage', 'Longpages' ),
- 'Newpages' => array( 'IncludableSpecialPage', 'Newpages' ),
- 'Ancientpages' => array( 'SpecialPage', 'Ancientpages' ),
- 'Deadendpages' => array( 'SpecialPage', 'Deadendpages' ),
- 'Allpages' => array( 'IncludableSpecialPage', 'Allpages' ),
- 'Prefixindex' => array( 'IncludableSpecialPage', 'Prefixindex' ) ,
- 'Ipblocklist' => array( 'SpecialPage', 'Ipblocklist' ),
- 'Specialpages' => array( 'UnlistedSpecialPage', 'Specialpages' ),
- 'Contributions' => array( 'UnlistedSpecialPage', 'Contributions' ),
- 'Emailuser' => array( 'UnlistedSpecialPage', 'Emailuser' ),
- 'Whatlinkshere' => array( 'UnlistedSpecialPage', 'Whatlinkshere' ),
- 'Recentchangeslinked' => array( 'UnlistedSpecialPage', 'Recentchangeslinked' ),
- 'Movepage' => array( 'UnlistedSpecialPage', 'Movepage' ),
- 'Blockme' => array( 'UnlistedSpecialPage', 'Blockme' ),
- 'Booksources' => array( 'SpecialPage', 'Booksources' ),
- 'Categories' => array( 'SpecialPage', 'Categories' ),
- 'Export' => array( 'SpecialPage', 'Export' ),
- 'Version' => array( 'SpecialPage', 'Version' ),
- 'Allmessages' => array( 'SpecialPage', 'Allmessages' ),
- 'Log' => array( 'SpecialPage', 'Log' ),
- 'Blockip' => array( 'SpecialPage', 'Blockip', 'block' ),
- 'Undelete' => array( 'SpecialPage', 'Undelete', 'deletedhistory' ),
- "Import" => array( 'SpecialPage', "Import", 'import' ),
- 'Lockdb' => array( 'SpecialPage', 'Lockdb', 'siteadmin' ),
- 'Unlockdb' => array( 'SpecialPage', 'Unlockdb', 'siteadmin' ),
- 'Userrights' => array( 'SpecialPage', 'Userrights', 'userrights' ),
- 'MIMEsearch' => array( 'SpecialPage', 'MIMEsearch' ),
- 'Unwatchedpages' => array( 'SpecialPage', 'Unwatchedpages', 'unwatchedpages' ),
- 'Listredirects' => array( 'SpecialPage', 'Listredirects' ),
- 'Revisiondelete' => array( 'SpecialPage', 'Revisiondelete', 'deleterevision' ),
- 'Unusedtemplates' => array( 'SpecialPage', 'Unusedtemplates' ),
- 'Randomredirect' => array( 'SpecialPage', 'Randomredirect' ),
+ 'DoubleRedirects' => array( 'SpecialPage', 'DoubleRedirects' ),
+ 'BrokenRedirects' => array( 'SpecialPage', 'BrokenRedirects' ),
+ 'Disambiguations' => array( 'SpecialPage', 'Disambiguations' ),
+
+ 'Userlogin' => array( 'SpecialPage', 'Userlogin' ),
+ 'Userlogout' => array( 'UnlistedSpecialPage', 'Userlogout' ),
+ 'Preferences' => array( 'SpecialPage', 'Preferences' ),
+ 'Watchlist' => array( 'SpecialPage', 'Watchlist' ),
+
+ 'Recentchanges' => array( 'IncludableSpecialPage', 'Recentchanges' ),
+ 'Upload' => array( 'SpecialPage', 'Upload' ),
+ 'Imagelist' => array( 'SpecialPage', 'Imagelist' ),
+ 'Newimages' => array( 'IncludableSpecialPage', 'Newimages' ),
+ 'Listusers' => array( 'SpecialPage', 'Listusers' ),
+ 'Statistics' => array( 'SpecialPage', 'Statistics' ),
+ 'Randompage' => array( 'SpecialPage', 'Randompage' ),
+ 'Lonelypages' => array( 'SpecialPage', 'Lonelypages' ),
+ 'Uncategorizedpages' => array( 'SpecialPage', 'Uncategorizedpages' ),
+ 'Uncategorizedcategories' => array( 'SpecialPage', 'Uncategorizedcategories' ),
+ 'Uncategorizedimages' => array( 'SpecialPage', 'Uncategorizedimages' ),
+ 'Unusedcategories' => array( 'SpecialPage', 'Unusedcategories' ),
+ 'Unusedimages' => array( 'SpecialPage', 'Unusedimages' ),
+ 'Wantedpages' => array( 'IncludableSpecialPage', 'Wantedpages' ),
+ 'Wantedcategories' => array( 'SpecialPage', 'Wantedcategories' ),
+ 'Mostlinked' => array( 'SpecialPage', 'Mostlinked' ),
+ 'Mostlinkedcategories' => array( 'SpecialPage', 'Mostlinkedcategories' ),
+ 'Mostcategories' => array( 'SpecialPage', 'Mostcategories' ),
+ 'Mostimages' => array( 'SpecialPage', 'Mostimages' ),
+ 'Mostrevisions' => array( 'SpecialPage', 'Mostrevisions' ),
+ 'Shortpages' => array( 'SpecialPage', 'Shortpages' ),
+ 'Longpages' => array( 'SpecialPage', 'Longpages' ),
+ 'Newpages' => array( 'IncludableSpecialPage', 'Newpages' ),
+ 'Ancientpages' => array( 'SpecialPage', 'Ancientpages' ),
+ 'Deadendpages' => array( 'SpecialPage', 'Deadendpages' ),
+ 'Allpages' => array( 'IncludableSpecialPage', 'Allpages' ),
+ 'Prefixindex' => array( 'IncludableSpecialPage', 'Prefixindex' ) ,
+ 'Ipblocklist' => array( 'SpecialPage', 'Ipblocklist' ),
+ 'Specialpages' => array( 'UnlistedSpecialPage', 'Specialpages' ),
+ 'Contributions' => array( 'UnlistedSpecialPage', 'Contributions' ),
+ 'Emailuser' => array( 'UnlistedSpecialPage', 'Emailuser' ),
+ 'Whatlinkshere' => array( 'UnlistedSpecialPage', 'Whatlinkshere' ),
+ 'Recentchangeslinked' => array( 'UnlistedSpecialPage', 'Recentchangeslinked' ),
+ 'Movepage' => array( 'UnlistedSpecialPage', 'Movepage' ),
+ 'Blockme' => array( 'UnlistedSpecialPage', 'Blockme' ),
+ 'Resetpass' => array( 'UnlistedSpecialPage', 'Resetpass' ),
+ 'Booksources' => 'SpecialBookSources',
+ 'Categories' => array( 'SpecialPage', 'Categories' ),
+ 'Export' => array( 'SpecialPage', 'Export' ),
+ 'Version' => array( 'SpecialPage', 'Version' ),
+ 'Allmessages' => array( 'SpecialPage', 'Allmessages' ),
+ 'Log' => array( 'SpecialPage', 'Log' ),
+ 'Blockip' => array( 'SpecialPage', 'Blockip', 'block' ),
+ 'Undelete' => array( 'SpecialPage', 'Undelete', 'deletedhistory' ),
+ 'Import' => array( 'SpecialPage', "Import", 'import' ),
+ 'Lockdb' => array( 'SpecialPage', 'Lockdb', 'siteadmin' ),
+ 'Unlockdb' => array( 'SpecialPage', 'Unlockdb', 'siteadmin' ),
+ 'Userrights' => array( 'SpecialPage', 'Userrights', 'userrights' ),
+ 'MIMEsearch' => array( 'SpecialPage', 'MIMEsearch' ),
+ 'Unwatchedpages' => array( 'SpecialPage', 'Unwatchedpages', 'unwatchedpages' ),
+ 'Listredirects' => array( 'SpecialPage', 'Listredirects' ),
+ 'Revisiondelete' => array( 'SpecialPage', 'Revisiondelete', 'deleterevision' ),
+ 'Unusedtemplates' => array( 'SpecialPage', 'Unusedtemplates' ),
+ 'Randomredirect' => array( 'SpecialPage', 'Randomredirect' ),
+
+ 'Mypage' => array( 'SpecialMypage' ),
+ 'Mytalk' => array( 'SpecialMytalk' ),
+ 'Mycontributions' => array( 'SpecialMycontributions' ),
+ 'Listadmins' => array( 'SpecialRedirectToSpecial', 'Listadmins', 'Listusers', 'sysop' ),
);
+ static public $mAliases;
static public $mListInitialised = false;
/**#@-*/
@@ -148,6 +163,9 @@ class SpecialPage
}
wfProfileIn( __METHOD__ );
+ # Better to set this now, to avoid infinite recursion in carelessly written hooks
+ self::$mListInitialised = true;
+
if( !$wgDisableCounters ) {
self::$mList['Popularpages'] = array( 'SpecialPage', 'Popularpages' );
}
@@ -163,15 +181,65 @@ class SpecialPage
# Add extension special pages
self::$mList = array_merge( self::$mList, $wgSpecialPages );
- # Better to set this now, to avoid infinite recursion in carelessly written hooks
- self::$mListInitialised = true;
-
# Run hooks
# This hook can be used to remove undesired built-in special pages
wfRunHooks( 'SpecialPage_initList', array( &self::$mList ) );
wfProfileOut( __METHOD__ );
}
+ static function initAliasList() {
+ if ( !is_null( self::$mAliases ) ) {
+ return;
+ }
+
+ global $wgContLang;
+ $aliases = $wgContLang->getSpecialPageAliases();
+ $missingPages = self::$mList;
+ self::$mAliases = array();
+ foreach ( $aliases as $realName => $aliasList ) {
+ foreach ( $aliasList as $alias ) {
+ self::$mAliases[$wgContLang->caseFold( $alias )] = $realName;
+ }
+ unset( $missingPages[$realName] );
+ }
+ foreach ( $missingPages as $name => $stuff ) {
+ self::$mAliases[$wgContLang->caseFold( $name )] = $name;
+ }
+ }
+
+ /**
+ * Given a special page alias, return the special page name.
+ * Returns false if there is no such alias.
+ */
+ static function resolveAlias( $alias ) {
+ global $wgContLang;
+
+ if ( !self::$mListInitialised ) self::initList();
+ if ( is_null( self::$mAliases ) ) self::initAliasList();
+ $caseFoldedAlias = $wgContLang->caseFold( $alias );
+ if ( isset( self::$mAliases[$caseFoldedAlias] ) ) {
+ return self::$mAliases[$caseFoldedAlias];
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Given a special page name with a possible subpage, return an array
+ * where the first element is the special page name and the second is the
+ * subpage.
+ */
+ static function resolveAliasWithSubpage( $alias ) {
+ $bits = explode( '/', $alias, 2 );
+ $name = self::resolveAlias( $bits[0] );
+ if( !isset( $bits[1] ) ) { // bug 2087
+ $par = NULL;
+ } else {
+ $par = $bits[1];
+ }
+ return array( $name, $par );
+ }
+
/**
* Add a page to the list of valid special pages. This used to be the preferred
* method for adding special pages in extensions. It's now suggested that you add
@@ -228,55 +296,18 @@ class SpecialPage
}
}
-
- /**
- * @static
- * @param string $name
- * @return mixed Title object if the redirect exists, otherwise NULL
- */
- static function getRedirect( $name ) {
- global $wgUser;
-
- $redirects = array(
- 'Mypage' => Title::makeTitle( NS_USER, $wgUser->getName() ),
- 'Mytalk' => Title::makeTitle( NS_USER_TALK, $wgUser->getName() ),
- 'Mycontributions' => Title::makeTitle( NS_SPECIAL, 'Contributions/' . $wgUser->getName() ),
- 'Listadmins' => Title::makeTitle( NS_SPECIAL, 'Listusers/sysop' ), # @bug 2832
- 'Logs' => Title::makeTitle( NS_SPECIAL, 'Log' ),
- 'Randompage' => Title::makeTitle( NS_SPECIAL, 'Random' ),
- 'Userlist' => Title::makeTitle( NS_SPECIAL, 'Listusers' )
- );
- wfRunHooks( 'SpecialPageGetRedirect', array( &$redirects ) );
-
- return isset( $redirects[$name] ) ? $redirects[$name] : null;
- }
-
/**
- * Return part of the request string for a special redirect page
- * This allows passing, e.g. action=history to Special:Mypage, etc.
- *
- * @param $name Name of the redirect page
- * @return string
+ * Get a special page with a given localised name, or NULL if there
+ * is no such special page.
*/
- function getRedirectParams( $name ) {
- global $wgRequest;
-
- $args = array();
- switch( $name ) {
- case 'Mypage':
- case 'Mytalk':
- case 'Randompage':
- $args = array( 'action' );
- }
-
- $params = array();
- foreach( $args as $arg ) {
- if( $val = $wgRequest->getVal( $arg, false ) )
- $params[] = $arg . '=' . $val;
+ static function getPageByAlias( $alias ) {
+ $realName = self::resolveAlias( $alias );
+ if ( $realName ) {
+ return self::getPage( $realName );
+ } else {
+ return NULL;
}
-
- return count( $params ) ? implode( '&', $params ) : false;
- }
+ }
/**
* Return categorised listable special pages for all users
@@ -333,67 +364,74 @@ class SpecialPage
* @param $including output is being captured for use in {{special:whatever}}
*/
static function executePath( &$title, $including = false ) {
- global $wgOut, $wgTitle;
- $fname = 'SpecialPage::executePath';
- wfProfileIn( $fname );
+ global $wgOut, $wgTitle, $wgRequest;
+ wfProfileIn( __METHOD__ );
- $bits = split( "/", $title->getDBkey(), 2 );
+ # FIXME: redirects broken due to this call
+ $bits = explode( '/', $title->getDBkey(), 2 );
$name = $bits[0];
if( !isset( $bits[1] ) ) { // bug 2087
$par = NULL;
} else {
$par = $bits[1];
}
-
- $page = SpecialPage::getPage( $name );
- if ( is_null( $page ) ) {
- if ( $including ) {
- wfProfileOut( $fname );
- return false;
- } else {
- $redir = SpecialPage::getRedirect( $name );
- if ( isset( $redir ) ) {
- if( $par )
- $redir = Title::makeTitle( $redir->getNamespace(), $redir->getText() . '/' . $par );
- $params = SpecialPage::getRedirectParams( $name );
- if( $params ) {
- $url = $redir->getFullUrl( $params );
- } else {
- $url = $redir->getFullUrl();
- }
- $wgOut->redirect( $url );
- $retVal = $redir;
- $wgOut->redirect( $url );
- $retVal = $redir;
- } else {
- $wgOut->setArticleRelated( false );
- $wgOut->setRobotpolicy( 'noindex,nofollow' );
- $wgOut->setStatusCode( 404 );
- $wgOut->showErrorPage( 'nosuchspecialpage', 'nospecialpagetext' );
- $retVal = false;
- }
+ $page = SpecialPage::getPageByAlias( $name );
+
+ # Nonexistent?
+ if ( !$page ) {
+ if ( !$including ) {
+ $wgOut->setArticleRelated( false );
+ $wgOut->setRobotpolicy( 'noindex,nofollow' );
+ $wgOut->setStatusCode( 404 );
+ $wgOut->showErrorPage( 'nosuchspecialpage', 'nospecialpagetext' );
}
- } else {
- if ( $including && !$page->includable() ) {
- wfProfileOut( $fname );
- return false;
- } elseif ( !$including ) {
- if($par !== NULL) {
- $wgTitle = Title::makeTitle( NS_SPECIAL, $name );
- } else {
- $wgTitle = $title;
- }
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
+
+ # Check for redirect
+ if ( !$including ) {
+ $redirect = $page->getRedirect( $par );
+ if ( $redirect ) {
+ $query = $page->getRedirectQuery();
+ $url = $redirect->getFullUrl( $query );
+ $wgOut->redirect( $url );
+ wfProfileOut( __METHOD__ );
+ return $redirect;
}
- $page->including( $including );
+ }
+
+ # Redirect to canonical alias for GET commands
+ # Not for POST, we'd lose the post data, so it's best to just distribute
+ # the request. Such POST requests are possible for old extensions that
+ # generate self-links without being aware that their default name has
+ # changed.
+ if ( !$including && $name != $page->getLocalName() && !$wgRequest->wasPosted() ) {
+ $query = $_GET;
+ unset( $query['title'] );
+ $query = wfArrayToCGI( $query );
+ $title = $page->getTitle( $par );
+ $url = $title->getFullUrl( $query );
+ $wgOut->redirect( $url );
+ wfProfileOut( __METHOD__ );
+ return $redirect;
+ }
- $profName = 'Special:' . $page->getName();
- wfProfileIn( $profName );
- $page->execute( $par );
- wfProfileOut( $profName );
- $retVal = true;
+ if ( $including && !$page->includable() ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ } elseif ( !$including ) {
+ $wgTitle = $page->getTitle();
}
- wfProfileOut( $fname );
- return $retVal;
+ $page->including( $including );
+
+ // Execute special page
+ $profName = 'Special:' . $page->getName();
+ wfProfileIn( $profName );
+ $page->execute( $par );
+ wfProfileOut( $profName );
+ wfProfileOut( __METHOD__ );
+ return true;
}
/**
@@ -419,6 +457,58 @@ class SpecialPage
}
/**
+ * Get the local name for a specified canonical name
+ */
+ static function getLocalNameFor( $name, $subpage = false ) {
+ global $wgContLang;
+ $aliases = $wgContLang->getSpecialPageAliases();
+ if ( isset( $aliases[$name][0] ) ) {
+ $name = $aliases[$name][0];
+ }
+ if ( $subpage !== false && !is_null( $subpage ) ) {
+ $name = "$name/$subpage";
+ }
+ return $name;
+ }
+
+ /**
+ * Get a localised Title object for a specified special page name
+ */
+ static function getTitleFor( $name, $subpage = false ) {
+ $name = self::getLocalNameFor( $name, $subpage );
+ if ( $name ) {
+ return Title::makeTitle( NS_SPECIAL, $name );
+ } else {
+ throw new MWException( "Invalid special page name \"$name\"" );
+ }
+ }
+
+ /**
+ * Get a localised Title object for a page name with a possibly unvalidated subpage
+ */
+ static function getSafeTitleFor( $name, $subpage = false ) {
+ $name = self::getLocalNameFor( $name, $subpage );
+ if ( $name ) {
+ return Title::makeTitleSafe( NS_SPECIAL, $name );
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Get a title for a given alias
+ * @return Title or null if there is no such alias
+ */
+ static function getTitleForAlias( $alias ) {
+ $name = self::resolveAlias( $alias );
+ if ( $name ) {
+ return self::getTitleFor( $name );
+ } else {
+ return null;
+ }
+ }
+
+ /**
* Default constructor for special pages
* Derivative classes should call this from their constructor
* Note that if the user does not have the required level, an error message will
@@ -475,6 +565,16 @@ class SpecialPage
/**#@-*/
/**
+ * Get the localised name of the special page
+ */
+ function getLocalName() {
+ if ( !isset( $this->mLocalName ) ) {
+ $this->mLocalName = self::getLocalNameFor( $this->mName );
+ }
+ return $this->mLocalName;
+ }
+
+ /**
* Checks if the given user (identified by an object) can execute this
* special page (as defined by $mRestriction)
*/
@@ -503,6 +603,8 @@ class SpecialPage
/**
* Default execute method
* Checks user permissions, calls the function given in mFunction
+ *
+ * This may be overridden by subclasses.
*/
function execute( $par ) {
global $wgUser;
@@ -515,6 +617,7 @@ class SpecialPage
if(!function_exists($func) and $this->mFile) {
require_once( $this->mFile );
}
+ # FIXME: these hooks are broken for extensions and anything else that subclasses SpecialPage.
if ( wfRunHooks( 'SpecialPageExecuteBeforeHeader', array( &$this, &$par, &$func ) ) )
$this->outputHeader();
if ( ! wfRunHooks( 'SpecialPageExecuteBeforePage', array( &$this, &$par, &$func ) ) )
@@ -549,8 +652,8 @@ class SpecialPage
/**
* Get a self-referential title object
*/
- function getTitle() {
- return Title::makeTitle( NS_SPECIAL, $this->mName );
+ function getTitle( $subpage = false) {
+ return self::getTitleFor( $this->mName, $subpage );
}
/**
@@ -560,6 +663,30 @@ class SpecialPage
return wfSetVar( $this->mListed, $listed );
}
+ /**
+ * If the special page is a redirect, then get the Title object it redirects to.
+ * False otherwise.
+ */
+ function getRedirect( $subpage ) {
+ return false;
+ }
+
+ /**
+ * Return part of the request string for a special redirect page
+ * This allows passing, e.g. action=history to Special:Mypage, etc.
+ *
+ * @return string
+ */
+ function getRedirectQuery() {
+ global $wgRequest;
+ $params = array();
+ foreach( $this->mAllowedRedirectParams as $arg ) {
+ if( $val = $wgRequest->getVal( $arg, false ) )
+ $params[] = $arg . '=' . $val;
+ }
+
+ return count( $params ) ? implode( '&', $params ) : false;
+ }
}
/**
@@ -583,4 +710,67 @@ class IncludableSpecialPage extends SpecialPage
SpecialPage::SpecialPage( $name, $restriction, $listed, $function, $file, true );
}
}
+
+class SpecialRedirectToSpecial extends UnlistedSpecialPage {
+ var $redirName, $redirSubpage;
+
+ function __construct( $name, $redirName, $redirSubpage = false, $redirectParams = array() ) {
+ parent::__construct( $name );
+ $this->redirName = $redirName;
+ $this->redirSubpage = $redirSubpage;
+ $this->mAllowedRedirectParams = $redirectParams;
+ }
+
+ function getRedirect( $subpage ) {
+ if ( $this->redirSubpage === false ) {
+ return SpecialPage::getTitleFor( $this->redirName, $subpage );
+ } else {
+ return SpecialPage::getTitleFor( $this->redirName, $this->redirSubpage );
+ }
+ }
+}
+
+class SpecialMypage extends UnlistedSpecialPage {
+ function __construct() {
+ parent::__construct( 'Mypage' );
+ $this->mAllowedRedirectParams = array( 'action' );
+ }
+
+ function getRedirect( $subpage ) {
+ global $wgUser;
+ if ( strval( $subpage ) !== '' ) {
+ return Title::makeTitle( NS_USER, $wgUser->getName() . '/' . $subpage );
+ } else {
+ return Title::makeTitle( NS_USER, $wgUser->getName() );
+ }
+ }
+}
+
+class SpecialMytalk extends UnlistedSpecialPage {
+ function __construct() {
+ parent::__construct( 'Mytalk' );
+ $this->mAllowedRedirectParams = array( 'action' );
+ }
+
+ function getRedirect( $subpage ) {
+ global $wgUser;
+ if ( strval( $subpage ) !== '' ) {
+ return Title::makeTitle( NS_USER_TALK, $wgUser->getName() . '/' . $subpage );
+ } else {
+ return Title::makeTitle( NS_USER_TALK, $wgUser->getName() );
+ }
+ }
+}
+
+class SpecialMycontributions extends UnlistedSpecialPage {
+ function __construct() {
+ parent::__construct( 'Mycontributions' );
+ }
+
+ function getRedirect( $subpage ) {
+ global $wgUser;
+ return SpecialPage::getTitleFor( 'Contributions', $wgUser->getName() );
+ }
+}
+
?>
diff --git a/includes/SpecialPreferences.php b/includes/SpecialPreferences.php
index 5eadf3d6..643932c4 100644
--- a/includes/SpecialPreferences.php
+++ b/includes/SpecialPreferences.php
@@ -34,7 +34,7 @@ class PreferencesForm {
* Load some values
*/
function PreferencesForm( &$request ) {
- global $wgLang, $wgContLang, $wgUser, $wgAllowRealName;
+ global $wgContLang, $wgUser, $wgAllowRealName;
$this->mQuickbar = $request->getVal( 'wpQuickbar' );
$this->mOldpass = $request->getVal( 'wpOldpass' );
@@ -206,7 +206,7 @@ class PreferencesForm {
function savePreferences() {
global $wgUser, $wgOut, $wgParser;
global $wgEnableUserEmail, $wgEnableEmail;
- global $wgEmailAuthentication, $wgMinimalPasswordLength;
+ global $wgEmailAuthentication;
global $wgAuth;
@@ -216,22 +216,18 @@ class PreferencesForm {
return;
}
- if ( strlen( $this->mNewpass ) < $wgMinimalPasswordLength ) {
- $this->mainPrefsForm( 'error', wfMsg( 'passwordtooshort', $wgMinimalPasswordLength ) );
- return;
- }
-
if (!$wgUser->checkPassword( $this->mOldpass )) {
$this->mainPrefsForm( 'error', wfMsg( 'wrongpassword' ) );
return;
}
- if (!$wgAuth->setPassword( $wgUser, $this->mNewpass )) {
- $this->mainPrefsForm( 'error', wfMsg( 'externaldberror' ) );
+
+ try {
+ $wgUser->setPassword( $this->mNewpass );
+ $this->mNewpass = $this->mOldpass = $this->mRetypePass = '';
+ } catch( PasswordError $e ) {
+ $this->mainPrefsForm( 'error', $e->getMessage() );
return;
}
- $wgUser->setPassword( $this->mNewpass );
- $this->mNewpass = $this->mOldpass = $this->mRetypePass = '';
-
}
$wgUser->setRealName( $this->mRealName );
@@ -328,13 +324,12 @@ class PreferencesForm {
}
if( $needRedirect && $error === false ) {
- $title =& Title::makeTitle( NS_SPECIAL, "Preferences" );
+ $title =& SpecialPage::getTitleFor( "Preferences" );
$wgOut->redirect($title->getFullURL('success'));
return;
}
$wgOut->setParserOptions( ParserOptions::newFromUser( $wgUser ) );
- $po = ParserOptions::newFromUser( $wgUser );
$this->mainPrefsForm( $error === false ? 'success' : 'error', $error);
}
@@ -342,18 +337,16 @@ class PreferencesForm {
* @access private
*/
function resetPrefs() {
- global $wgUser, $wgLang, $wgContLang, $wgAllowRealName;
+ global $wgUser, $wgLang, $wgContLang, $wgContLanguageCode, $wgAllowRealName;
$this->mOldpass = $this->mNewpass = $this->mRetypePass = '';
$this->mUserEmail = $wgUser->getEmail();
$this->mUserEmailAuthenticationtimestamp = $wgUser->getEmailAuthenticationtimestamp();
$this->mRealName = ($wgAllowRealName) ? $wgUser->getRealName() : '';
- $this->mUserLanguage = $wgUser->getOption( 'language' );
- if( empty( $this->mUserLanguage ) ) {
- # Quick hack for conversions, where this value is blank
- global $wgContLanguageCode;
- $this->mUserLanguage = $wgContLanguageCode;
- }
+
+ # language value might be blank, default to content language
+ $this->mUserLanguage = $wgUser->getOption( 'language', $wgContLanguageCode );
+
$this->mUserVariant = $wgUser->getOption( 'variant');
$this->mEmailFlag = $wgUser->getOption( 'disablemail' ) == 1 ? 1 : 0;
$this->mNick = $wgUser->getOption( 'nickname' );
@@ -378,7 +371,6 @@ class PreferencesForm {
$togs = User::getToggles();
foreach ( $togs as $tname ) {
- $ttext = wfMsg('tog-'.$tname);
$this->mToggles[$tname] = $wgUser->getOption( $tname );
}
@@ -478,7 +470,7 @@ class PreferencesForm {
$dateopts = $wgLang->getDatePreferences();
$togs = User::getToggles();
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Preferences' );
+ $titleObj = SpecialPage::getTitleFor( 'Preferences' );
$action = $titleObj->escapeLocalURL();
# Pre-expire some toggles so they won't show if disabled
@@ -488,6 +480,7 @@ class PreferencesForm {
$this->mUsedToggles[ 'enotifusertalkpages' ] = true;
$this->mUsedToggles[ 'enotifminoredits' ] = true;
$this->mUsedToggles[ 'enotifrevealaddr' ] = true;
+ $this->mUsedToggles[ 'ccmeonemails' ] = true;
$this->mUsedToggles[ 'uselivepreview' ] = true;
# Enotif
@@ -508,7 +501,7 @@ class PreferencesForm {
$disableEmailPrefs = true;
$skin = $wgUser->getSkin();
$emailauthenticated = wfMsg('emailnotauthenticated').'<br />' .
- $skin->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Confirmemail' ),
+ $skin->makeKnownLinkObj( SpecialPage::getTitleFor( 'Confirmemail' ),
wfMsg( 'emailconfirmlink' ) );
}
} else {
@@ -526,8 +519,6 @@ class PreferencesForm {
$enotifusertalkpages = ($wgEnotifUserTalk) ? $this->getToggle( 'enotifusertalkpages', false, $disableEmailPrefs ) : '';
$enotifminoredits = ($wgEnotifWatchlist && $wgEnotifMinorEdits) ? $this->getToggle( 'enotifminoredits', false, $disableEmailPrefs ) : '';
$enotifrevealaddr = (($wgEnotifWatchlist || $wgEnotifUserTalk) && $wgEnotifRevealEditorAddress) ? $this->getToggle( 'enotifrevealaddr', false, $disableEmailPrefs ) : '';
- $prefs_help_email_enotif = ( $wgEnotifWatchlist || $wgEnotifUserTalk) ? ' ' . wfMsg('prefs-help-email-enotif') : '';
- $prefs_help_realname = '';
# </FIXME>
@@ -539,19 +530,19 @@ class PreferencesForm {
$wgOut->addHTML( "<fieldset>\n<legend>" . wfMsg('prefs-personal') . "</legend>\n<table>\n");
- $wgOut->addHTML(
+ $userInformationHtml =
$this->addRow(
wfMsg( 'username'),
$wgUser->getName()
- )
- );
-
- $wgOut->addHTML(
+ ) .
$this->addRow(
wfMsg( 'uid' ),
$wgUser->getID()
- )
- );
+ );
+
+ if( wfRunHooks( 'PreferencesUserInformationPanel', array( $this, &$userInformationHtml ) ) ) {
+ $wgOut->addHtml( $userInformationHtml );
+ }
if ($wgAllowRealName) {
@@ -600,7 +591,7 @@ class PreferencesForm {
* Make sure the site language is in the list; a custom language code
* might not have a defined name...
*/
- $languages = $wgLang->getLanguageNames( true );
+ $languages = Language::getLanguageNames( true );
if( !array_key_exists( $wgContLanguageCode, $languages ) ) {
$languages[$wgContLanguageCode] = $wgContLanguageCode;
}
@@ -612,16 +603,15 @@ class PreferencesForm {
* with an Afrikaans interface since it's first in the list.
*/
$selectedLang = isset( $languages[$this->mUserLanguage] ) ? $this->mUserLanguage : $wgContLanguageCode;
- $selbox = null;
- foreach($languages as $code => $name) {
- global $IP;
- $sel = ($code == $selectedLang)? ' selected="selected"' : '';
- $selbox .= "<option value=\"$code\"$sel>$code - $name</option>\n";
+ $options = "\n";
+ foreach( $languages as $code => $name ) {
+ $selected = ($code == $selectedLang);
+ $options .= Xml::option( "$code - $name", $code, $selected ) . "\n";
}
$wgOut->addHTML(
$this->addRow(
'<label for="wpUserLanguage">' . wfMsg('yourlanguage') . '</label>',
- "<select name='wpUserLanguage' id='wpUserLanguage'>$selbox</select>"
+ "<select name='wpUserLanguage' id='wpUserLanguage'>$options</select>"
)
);
@@ -638,15 +628,16 @@ class PreferencesForm {
}
}
- $selbox = null;
- foreach($variantArray as $code => $name) {
- $sel = $code == $this->mUserVariant ? 'selected="selected"' : '';
- $selbox .= "<option value=\"$code\" $sel>$code - $name</option>";
+ $options = "\n";
+ foreach( $variantArray as $code => $name ) {
+ $selected = ($code == $this->mUserVariant);
+ $options .= Xml::option( "$code - $name", $code, $selected ) . "\n";
}
if(count($variantArray) > 1) {
$wgOut->addHtml(
- $this->addRow( wfMsg( 'yourvariant' ), "<select name='wpUserVariant'>$selbox</select>" )
+ $this->addRow( wfMsg( 'yourvariant' ),
+ "<select name='wpUserVariant'>$options</select>" )
);
}
}
@@ -692,6 +683,7 @@ class PreferencesForm {
$wgOut->addHTML(
"<div><input type='checkbox' $emfc $disabled value='1' name='wpEmailFlag' id='wpEmailFlag' /> <label for='wpEmailFlag'>$emf</label></div>" );
}
+ $wgOut->addHtml( $this->getToggle( 'ccmeonemails' ) );
$wgOut->addHTML( '</fieldset>' );
}
@@ -732,12 +724,19 @@ class PreferencesForm {
# Only show members of Skin::getSkinNames() rather than
# $skinNames (skins is all skin names from Language.php)
$validSkinNames = Skin::getSkinNames();
- foreach ($validSkinNames as $skinkey => $skinname ) {
+ # Sort by UI skin name. First though need to update validSkinNames as sometimes
+ # the skinkey & UI skinname differ (e.g. "standard" skinkey is "Classic" in the UI).
+ foreach ($validSkinNames as $skinkey => & $skinname ) {
+ if ( isset( $skinNames[$skinkey] ) ) {
+ $skinname = $skinNames[$skinkey];
+ }
+ }
+ asort($validSkinNames);
+ foreach ($validSkinNames as $skinkey => $sn ) {
if ( in_array( $skinkey, $wgSkipSkins ) ) {
continue;
}
$checked = $skinkey == $this->mSkin ? ' checked="checked"' : '';
- $sn = isset( $skinNames[$skinkey] ) ? $skinNames[$skinkey] : $skinname;
$mplink = htmlspecialchars($mptitle->getLocalURL("useskin=$skinkey"));
$previewlink = "<a target='_blank' href=\"$mplink\">$previewtext</a>";
@@ -761,24 +760,41 @@ class PreferencesForm {
# Files
#
- $wgOut->addHTML("<fieldset>
- <legend>" . wfMsg( 'files' ) . "</legend>
- <div><label for='wpImageSize'>" . wfMsg('imagemaxsize') . "</label> <select id='wpImageSize' name='wpImageSize'>");
+ $wgOut->addHTML(
+ "<fieldset>\n" . Xml::element( 'legend', null, wfMsg( 'files' ) ) . "\n"
+ );
$imageLimitOptions = null;
foreach ( $wgImageLimits as $index => $limits ) {
- $selected = ($index == $this->mImageSize) ? 'selected="selected"' : '';
- $imageLimitOptions .= "<option value=\"{$index}\" {$selected}>{$limits[0]}×{$limits[1]}". wfMsgHtml('unit-pixel') ."</option>\n";
+ $selected = ($index == $this->mImageSize);
+ $imageLimitOptions .= Xml::option( "{$limits[0]}×{$limits[1]}" .
+ wfMsg('unit-pixel'), $index, $selected );
}
+ $imageSizeId = 'wpImageSize';
+ $wgOut->addHTML(
+ "<div>" . Xml::label( wfMsg('imagemaxsize'), $imageSizeId ) . " " .
+ Xml::openElement( 'select', array( 'name' => $imageSizeId, 'id' => $imageSizeId ) ) .
+ $imageLimitOptions .
+ Xml::closeElement( 'select' ) . "</div>\n"
+ );
+
$imageThumbOptions = null;
- $wgOut->addHTML( "{$imageLimitOptions}</select></div>
- <div><label for='wpThumbSize'>" . wfMsg('thumbsize') . "</label> <select name='wpThumbSize' id='wpThumbSize'>");
foreach ( $wgThumbLimits as $index => $size ) {
- $selected = ($index == $this->mThumbSize) ? 'selected="selected"' : '';
- $imageThumbOptions .= "<option value=\"{$index}\" {$selected}>{$size}". wfMsgHtml('unit-pixel') ."</option>\n";
+ $selected = ($index == $this->mThumbSize);
+ $imageThumbOptions .= Xml::option($size . wfMsg('unit-pixel'), $index,
+ $selected);
}
- $wgOut->addHTML( "{$imageThumbOptions}</select></div></fieldset>\n\n");
+
+ $thumbSizeId = 'wpThumbSize';
+ $wgOut->addHTML(
+ "<div>" . Xml::label( wfMsg('thumbsize'), $thumbSizeId ) . " " .
+ Xml::openElement( 'select', array( 'name' => $thumbSizeId, 'id' => $thumbSizeId ) ) .
+ $imageThumbOptions .
+ Xml::closeElement( 'select' ) . "</div>\n"
+ );
+
+ $wgOut->addHTML( "</fieldset>\n\n" );
# Date format
#
@@ -837,17 +853,13 @@ class PreferencesForm {
'showtoolbar',
'previewonfirst',
'previewontop',
- 'watchcreations',
- 'watchdefault',
'minordefault',
'externaleditor',
'externaldiff',
$wgLivePreview ? 'uselivepreview' : false,
- $wgUser->isAllowed( 'patrol' ) && $wgUseRCPatrol ? 'autopatrol' : false,
'forceeditsummary',
) ) . '</fieldset>'
);
- $this->mUsedToggles['autopatrol'] = true; # Don't show this up for users who can't; the handler below is dumb and doesn't know it
$wgOut->addHTML( '<fieldset><legend>' . htmlspecialchars(wfMsg('prefs-rc')) . '</legend>' .
wfInputLabel( wfMsg( 'recentchangescount' ),
@@ -860,16 +872,29 @@ class PreferencesForm {
);
# Watchlist
- $wgOut->addHTML( '<fieldset><legend>' . wfMsgHtml( 'prefs-watchlist' ) . '</legend>' );
-
- $wgOut->addHTML( wfInputLabel( wfMsg( 'prefs-watchlist-days' ),
- 'wpWatchlistDays', 'wpWatchlistDays', 3, $this->mWatchlistDays ) );
- $wgOut->addHTML( '<br /><br />' ); # Spacing
- $wgOut->addHTML( $this->getToggles( array( 'watchlisthideown', 'watchlisthidebots', 'extendwatchlist' ) ) );
- $wgOut->addHTML( wfInputLabel( wfMsg( 'prefs-watchlist-edits' ),
- 'wpWatchlistEdits', 'wpWatchlistEdits', 3, $this->mWatchlistEdits ) );
-
- $wgOut->addHTML( '</fieldset>' );
+ $wgOut->addHtml( '<fieldset><legend>' . wfMsgHtml( 'prefs-watchlist' ) . '</legend>' );
+
+ $wgOut->addHtml( wfInputLabel( wfMsg( 'prefs-watchlist-days' ), 'wpWatchlistDays', 'wpWatchlistDays', 3, $this->mWatchlistDays ) );
+ $wgOut->addHtml( '<br /><br />' );
+
+ $wgOut->addHtml( $this->getToggle( 'extendwatchlist' ) );
+ $wgOut->addHtml( wfInputLabel( wfMsg( 'prefs-watchlist-edits' ), 'wpWatchlistEdits', 'wpWatchlistEdits', 3, $this->mWatchlistEdits ) );
+ $wgOut->addHtml( '<br /><br />' );
+
+ $wgOut->addHtml( $this->getToggles( array( 'watchlisthideown', 'watchlisthidebots', 'watchlisthideminor' ) ) );
+
+ if( $wgUser->isAllowed( 'createpage' ) || $wgUser->isAllowed( 'createtalk' ) )
+ $wgOut->addHtml( $this->getToggle( 'watchcreations' ) );
+ foreach( array( 'edit' => 'watchdefault', 'move' => 'watchmoves', 'delete' => 'watchdeletion' ) as $action => $toggle ) {
+ if( $wgUser->isAllowed( $action ) )
+ $wgOut->addHtml( $this->getToggle( $toggle ) );
+ }
+ $this->mUsedToggles['watchcreations'] = true;
+ $this->mUsedToggles['watchdefault'] = true;
+ $this->mUsedToggles['watchmoves'] = true;
+ $this->mUsedToggles['watchdeletion'] = true;
+
+ $wgOut->addHtml( '</fieldset>' );
# Search
$wgOut->addHTML( '<fieldset><legend>' . wfMsg( 'searchresultshead' ) . '</legend><table>' .
@@ -901,14 +926,13 @@ class PreferencesForm {
$s1 = $uopt == 1 ? ' selected="selected"' : '';
$s2 = $uopt == 2 ? ' selected="selected"' : '';
$wgOut->addHTML("
-<div class='toggle'><label for='wpOpunderline'>$msgUnderline</label>
+<div class='toggle'><p><label for='wpOpunderline'>$msgUnderline</label>
<select name='wpOpunderline' id='wpOpunderline'>
<option value=\"0\"$s0>$msgUnderlinenever</option>
<option value=\"1\"$s1>$msgUnderlinealways</option>
<option value=\"2\"$s2>$msgUnderlinedefault</option>
-</select>
-</div>
-");
+</select></p></div>");
+
foreach ( $togs as $tname ) {
if( !array_key_exists( $tname, $this->mUsedToggles ) ) {
$wgOut->addHTML( $this->getToggle( $tname ) );
diff --git a/includes/SpecialPrefixindex.php b/includes/SpecialPrefixindex.php
index bbfc2782..ce296b4b 100644
--- a/includes/SpecialPrefixindex.php
+++ b/includes/SpecialPrefixindex.php
@@ -27,7 +27,7 @@ function wfSpecialPrefixIndex( $par=NULL, $specialPage ) {
$namespace = 0;
$wgOut->setPagetitle( $namespace > 0 ?
- wfMsg( 'allinnamespace', $namespaces[$namespace] ) :
+ wfMsg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
wfMsg( 'allarticles' )
);
@@ -97,7 +97,6 @@ function showChunk( $namespace = NS_MAIN, $prefix, $including = false, $from = n
$n = 0;
$out = '<table style="background: inherit;" border="0" width="100%">';
- $namespaces = $wgContLang->getFormattedNamespaces();
while( ($n < $this->maxPerPage) && ($s = $dbr->fetchObject( $res )) ) {
$t = Title::makeTitle( $s->page_namespace, $s->page_title );
if( $t ) {
diff --git a/includes/SpecialRandompage.php b/includes/SpecialRandompage.php
index 9d38abcb..2cd31eb5 100644
--- a/includes/SpecialRandompage.php
+++ b/includes/SpecialRandompage.php
@@ -11,7 +11,7 @@
* used as e.g. Special:Randompage/Category
*/
function wfSpecialRandompage( $par = NS_MAIN ) {
- global $wgOut, $wgExtraRandompageSQL, $wgContLang, $wgLang;
+ global $wgOut, $wgExtraRandompageSQL;
$fname = 'wfSpecialRandompage';
# Determine namespace
@@ -49,7 +49,7 @@ function wfSpecialRandompage( $par = NS_MAIN ) {
}
if( is_null( $title ) ) {
# That's not supposed to happen :)
- $title = Title::newFromText( wfMsg( 'mainpage' ) );
+ $title = Title::newMainPage();
}
$wgOut->reportTime(); # for logfile
$wgOut->redirect( $title->getFullUrl() );
diff --git a/includes/SpecialRandomredirect.php b/includes/SpecialRandomredirect.php
index 512553c0..2cb2498b 100644
--- a/includes/SpecialRandomredirect.php
+++ b/includes/SpecialRandomredirect.php
@@ -45,7 +45,7 @@ function wfSpecialRandomredirect( $par = NULL ) {
# Catch dud titles and return to the main page
if( is_null( $title ) )
- $title = Title::newFromText( wfMsg( 'mainpage' ) );
+ $title = Title::newMainPage();
$wgOut->reportTime();
$wgOut->redirect( $title->getFullUrl( 'redirect=no' ) );
diff --git a/includes/SpecialRecentchanges.php b/includes/SpecialRecentchanges.php
index 8dfb68a5..3b8d69f2 100644
--- a/includes/SpecialRecentchanges.php
+++ b/includes/SpecialRecentchanges.php
@@ -14,7 +14,7 @@ require_once( 'ChangesList.php' );
* Constructor
*/
function wfSpecialRecentchanges( $par, $specialPage ) {
- global $wgUser, $wgOut, $wgRequest, $wgUseRCPatrol, $wgDBtype;
+ global $wgUser, $wgOut, $wgRequest, $wgUseRCPatrol;
global $wgRCShowWatchingUsers, $wgShowUpdatedMarker;
global $wgAllowCategorizedRecentChanges ;
$fname = 'wfSpecialRecentchanges';
@@ -43,12 +43,10 @@ function wfSpecialRecentchanges( $par, $specialPage ) {
extract($defaults);
- $days = $wgUser->getOption( 'rcdays' );
- if ( !$days ) { $days = $defaults['days']; }
+ $days = $wgUser->getOption( 'rcdays', $defaults['days']);
$days = $wgRequest->getInt( 'days', $days );
- $limit = $wgUser->getOption( 'rclimit' );
- if ( !$limit ) { $limit = $defaults['limit']; }
+ $limit = $wgUser->getOption( 'rclimit', $defaults['limit'] );
# list( $limit, $offset ) = wfCheckLimits( 100, 'rclimit' );
$limit = $wgRequest->getInt( 'limit', $limit );
@@ -90,7 +88,8 @@ function wfSpecialRecentchanges( $par, $specialPage ) {
if ( is_numeric( $bit ) ) {
$limit = $bit;
}
-
+
+ $m = array();
if ( preg_match( '/^limit=(\d+)$/', $bit, $m ) ) {
$limit = $m[1];
}
@@ -107,7 +106,7 @@ function wfSpecialRecentchanges( $par, $specialPage ) {
# Database connection and caching
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'recentchanges', 'watchlist' ) );
+ list( $recentchanges, $watchlist ) = $dbr->tableNamesN( 'recentchanges', 'watchlist' );
$cutoff_unixtime = time() - ( $days * 86400 );
@@ -198,7 +197,7 @@ function wfSpecialRecentchanges( $par, $specialPage ) {
// Output header
if ( !$specialPage->including() ) {
- $wgOut->addWikiText( wfMsgForContent( "recentchangestext" ) );
+ $wgOut->addWikiText( wfMsgForContentNoTrans( "recentchangestext" ) );
// Dump everything here
$nondefaults = array();
@@ -222,7 +221,6 @@ function wfSpecialRecentchanges( $par, $specialPage ) {
}
// And now for the content
- $sk = $wgUser->getSkin();
$wgOut->setSyndicated( true );
$list = ChangesList::newFromUser( $wgUser );
@@ -334,7 +332,7 @@ function rcOutputFeed( $rows, $feedFormat, $limit, $hideminor, $lastmod ) {
' [' . $wgContLanguageCode . ']';
$feed = new $wgFeedClasses[$feedFormat](
$feedTitle,
- htmlspecialchars( wfMsgForContent( 'recentchangestext' ) ),
+ htmlspecialchars( wfMsgForContent( 'recentchanges-feed-description' ) ),
$wgTitle->getFullUrl() );
/**
@@ -397,7 +395,6 @@ function rcDoOutputFeed( $rows, &$feed ) {
$sorted[$n] = $obj;
$n++;
}
- $first = false;
}
foreach( $sorted as $obj ) {
@@ -571,7 +568,7 @@ function rcOptionsPanel( $defaults, $nondefaults ) {
*/
function rcNamespaceForm( $namespace, $invert, $nondefaults, $categories_any ) {
global $wgScript, $wgAllowCategorizedRecentChanges, $wgRequest;
- $t = Title::makeTitle( NS_SPECIAL, 'Recentchanges' );
+ $t = SpecialPage::getTitleFor( 'Recentchanges' );
$namespaceselect = HTMLnamespaceselector($namespace, '');
$submitbutton = '<input type="submit" value="' . wfMsgHtml( 'allpagessubmit' ) . "\" />\n";
@@ -613,9 +610,10 @@ function rcNamespaceForm( $namespace, $invert, $nondefaults, $categories_any ) {
*/
function rcFormatDiff( $row ) {
$titleObj = Title::makeTitle( $row->rc_namespace, $row->rc_title );
+ $timestamp = wfTimestamp( TS_MW, $row->rc_timestamp );
return rcFormatDiffRow( $titleObj,
$row->rc_last_oldid, $row->rc_this_oldid,
- $row->rc_timestamp,
+ $timestamp,
$row->rc_comment );
}
diff --git a/includes/SpecialRecentchangeslinked.php b/includes/SpecialRecentchangeslinked.php
index 59a3beb5..2214576c 100644
--- a/includes/SpecialRecentchangeslinked.php
+++ b/includes/SpecialRecentchangeslinked.php
@@ -44,11 +44,9 @@ function wfSpecialRecentchangeslinked( $par = NULL ) {
$wgOut->setSubtitle( htmlspecialchars( wfMsg( 'rclsub', $nt->getPrefixedText() ) ) );
if ( ! $days ) {
- $days = $wgUser->getOption( 'rcdays' );
- if ( ! $days ) { $days = 7; }
+ $days = (int)$wgUser->getOption( 'rcdays', 7 );
}
- $days = (int)$days;
- list( $limit, $offset ) = wfCheckLimits( 100, 'rclimit' );
+ list( $limit, /* offset */ ) = wfCheckLimits( 100, 'rclimit' );
$dbr =& wfGetDB( DB_SLAVE );
$cutoff = $dbr->timestamp( time() - ( $days * 86400 ) );
@@ -67,7 +65,8 @@ function wfSpecialRecentchangeslinked( $par = NULL ) {
$cmq = 'AND rc_minor=0';
} else { $cmq = ''; }
- extract( $dbr->tableNames( 'recentchanges', 'categorylinks', 'pagelinks', 'revision', 'page' , "watchlist" ) );
+ list($recentchanges, $categorylinks, $pagelinks, $watchlist) =
+ $dbr->tableNamesN( 'recentchanges', 'categorylinks', 'pagelinks', "watchlist" );
$uid = $wgUser->getID();
@@ -97,7 +96,9 @@ function wfSpecialRecentchangeslinked( $par = NULL ) {
rc_bot,
rc_new,
rc_patrolled,
- rc_type
+ rc_type,
+ rc_old_len,
+ rc_new_len
" . ($uid ? ",wl_user" : "") . "
FROM $categorylinks, $recentchanges
" . ($uid ? "LEFT OUTER JOIN $watchlist ON wl_user={$uid} AND wl_title=rc_title AND wl_namespace=rc_namespace " : "") . "
@@ -124,7 +125,9 @@ $GROUPBY
rc_bot,
rc_new,
rc_patrolled,
- rc_type
+ rc_type,
+ rc_old_len,
+ rc_new_len
" . ($uid ? ",wl_user" : "") . "
FROM $pagelinks, $recentchanges
" . ($uid ? " LEFT OUTER JOIN $watchlist ON wl_user={$uid} AND wl_title=rc_title AND wl_namespace=rc_namespace " : "") . "
diff --git a/includes/SpecialResetpass.php b/includes/SpecialResetpass.php
new file mode 100644
index 00000000..cde582b1
--- /dev/null
+++ b/includes/SpecialResetpass.php
@@ -0,0 +1,158 @@
+<?php
+
+function wfSpecialResetpass( $par ) {
+ $form = new PasswordResetForm();
+ $form->execute( $par );
+}
+
+class PasswordResetForm extends SpecialPage {
+ function __construct( $name=null, $reset=null ) {
+ if( $name !== null ) {
+ $this->mName = $name;
+ $this->mTemporaryPassword = $reset;
+ } else {
+ global $wgRequest;
+ $this->mName = $wgRequest->getVal( 'wpName' );
+ $this->mTemporaryPassword = $wgRequest->getVal( 'wpPassword' );
+ }
+ }
+
+ /**
+ * Main execution point
+ */
+ function execute( $par='' ) {
+ global $wgUser, $wgAuth, $wgOut, $wgRequest;
+
+ if( !$wgAuth->allowPasswordChange() ) {
+ $this->error( wfMsg( 'resetpass_forbidden' ) );
+ return;
+ }
+
+ if( $this->mName === null && !$wgRequest->wasPosted() ) {
+ $this->error( wfMsg( 'resetpass_missing' ) );
+ return;
+ }
+
+ if( $wgRequest->wasPosted() && $wgUser->matchEditToken( $wgRequest->getVal( 'token' ) ) ) {
+ $newpass = $wgRequest->getVal( 'wpNewPassword' );
+ $retype = $wgRequest->getVal( 'wpRetype' );
+ try {
+ $this->attemptReset( $newpass, $retype );
+ $wgOut->addWikiText( wfMsg( 'resetpass_success' ) );
+
+ $data = array(
+ 'action' => 'submitlogin',
+ 'wpName' => $this->mName,
+ 'wpPassword' => $newpass,
+ 'returnto' => $wgRequest->getVal( 'returnto' ),
+ );
+ if( $wgRequest->getCheck( 'wpRemember' ) ) {
+ $data['wpRemember'] = 1;
+ }
+ $login = new LoginForm( new FauxRequest( $data, true ) );
+ $login->execute();
+
+ return;
+ } catch( PasswordError $e ) {
+ $this->error( $e->getMessage() );
+ }
+ }
+ $this->showForm();
+ }
+
+ function error( $msg ) {
+ global $wgOut;
+ $wgOut->addHtml( '<div class="errorbox">' .
+ htmlspecialchars( $msg ) .
+ '</div>' );
+ }
+
+ function showForm() {
+ global $wgOut, $wgUser, $wgLang, $wgRequest;
+
+ $self = SpecialPage::getTitleFor( 'Resetpass' );
+ $form =
+ '<div id="userloginForm">' .
+ wfOpenElement( 'form',
+ array(
+ 'method' => 'post',
+ 'action' => $self->getLocalUrl() ) ) .
+ '<h2>' . wfMsgHtml( 'resetpass_header' ) . '</h2>' .
+ '<div id="userloginprompt">' .
+ wfMsgExt( 'resetpass_text', array( 'parse' ) ) .
+ '</div>' .
+ '<table>' .
+ wfHidden( 'token', $wgUser->editToken() ) .
+ wfHidden( 'wpName', $this->mName ) .
+ wfHidden( 'wpPassword', $this->mTemporaryPassword ) .
+ wfHidden( 'returnto', $wgRequest->getVal( 'returnto' ) ) .
+ $this->pretty( array(
+ array( 'wpName', 'username', 'text', $this->mName ),
+ array( 'wpNewPassword', 'newpassword', 'password', '' ),
+ array( 'wpRetype', 'yourpasswordagain', 'password', '' ),
+ ) ) .
+ '<tr>' .
+ '<td></td>' .
+ '<td>' .
+ Xml::checkLabel( wfMsg( 'remembermypassword' ),
+ 'wpRemember', 'wpRemember',
+ $wgRequest->getCheck( 'wpRemember' ) ) .
+ '</td>' .
+ '</tr>' .
+ '<tr>' .
+ '<td></td>' .
+ '<td>' .
+ wfSubmitButton( wfMsgHtml( 'resetpass_submit' ) ) .
+ '</td>' .
+ '</tr>' .
+ '</table>' .
+ wfCloseElement( 'form' ) .
+ '</div>';
+ $wgOut->addHtml( $form );
+ }
+
+ function pretty( $fields ) {
+ $out = '';
+ foreach( $fields as $list ) {
+ list( $name, $label, $type, $value ) = $list;
+ if( $type == 'text' ) {
+ $field = '<tt>' . htmlspecialchars( $value ) . '</tt>';
+ } else {
+ $field = Xml::input( $name, 20, $value,
+ array( 'id' => $name, 'type' => $type ) );
+ }
+ $out .= '<tr>';
+ $out .= '<td align="right">';
+ $out .= Xml::label( wfMsg( $label ), $name );
+ $out .= '</td>';
+ $out .= '<td>';
+ $out .= $field;
+ $out .= '</td>';
+ $out .= '</tr>';
+ }
+ return $out;
+ }
+
+ /**
+ * @throws PasswordError
+ */
+ function attemptReset( $newpass, $retype ) {
+ $user = User::newFromName( $this->mName );
+ if( $user->isAnon() ) {
+ throw new PasswordError( 'no such user' );
+ }
+
+ if( !$user->checkTemporaryPassword( $this->mTemporaryPassword ) ) {
+ throw new PasswordError( wfMsg( 'resetpass_bad_temporary' ) );
+ }
+
+ if( $newpass !== $retype ) {
+ throw new PasswordError( wfMsg( 'badretype' ) );
+ }
+
+ $user->setPassword( $newpass );
+ $user->saveSettings();
+ }
+}
+
+?>
diff --git a/includes/SpecialRevisiondelete.php b/includes/SpecialRevisiondelete.php
index afbb589c..fb5e9ec8 100644
--- a/includes/SpecialRevisiondelete.php
+++ b/includes/SpecialRevisiondelete.php
@@ -10,12 +10,11 @@
*/
function wfSpecialRevisiondelete( $par = null ) {
- global $wgOut, $wgRequest, $wgUser;
+ global $wgOut, $wgRequest;
$target = $wgRequest->getVal( 'target' );
$oldid = $wgRequest->getIntArray( 'oldid' );
- $sk = $wgUser->getSkin();
$page = Title::newFromUrl( $target );
if( is_null( $page ) ) {
@@ -89,7 +88,7 @@ class RevisionDeleteForm {
$hidden[] = wfHidden( 'oldid[]', $revid );
}
- $special = Title::makeTitle( NS_SPECIAL, 'Revisiondelete' );
+ $special = SpecialPage::getTitleFor( 'Revisiondelete' );
$wgOut->addHtml( wfElement( 'form', array(
'method' => 'post',
'action' => $special->getLocalUrl( 'action=submit' ) ),
@@ -156,7 +155,7 @@ class RevisionDeleteForm {
function extractBitfield( $request ) {
$bitfield = 0;
foreach( $this->checks as $item ) {
- list( $message, $name, $field ) = $item;
+ list( /* message */ , $name, $field ) = $item;
if( $request->getCheck( $name ) ) {
$bitfield |= $field;
}
@@ -167,7 +166,7 @@ class RevisionDeleteForm {
function save( $bitfield, $reason ) {
$dbw = wfGetDB( DB_MASTER );
$deleter = new RevisionDeleter( $dbw );
- $ok = $deleter->setVisibility( $this->revisions, $bitfield, $reason );
+ $deleter->setVisibility( $this->revisions, $bitfield, $reason );
}
}
diff --git a/includes/SpecialSearch.php b/includes/SpecialSearch.php
index 057b487c..9ecd39ef 100644
--- a/includes/SpecialSearch.php
+++ b/includes/SpecialSearch.php
@@ -70,19 +70,17 @@ class SpecialSearch {
}
/**
- * If an exact title match can be found, jump straight ahead to
+ * If an exact title match can be found, jump straight ahead to it.
* @param string $term
* @public
*/
function goResult( $term ) {
global $wgOut;
global $wgGoToEdit;
- global $wgContLang;
$this->setupPage( $term );
# Try to go to page as entered.
- #
$t = Title::newFromText( $term );
# If the string cannot be used to create a title
@@ -99,17 +97,13 @@ class SpecialSearch {
# No match, generate an edit URL
$t = Title::newFromText( $term );
- if( is_null( $t ) ) {
- $editurl = ''; # hrm...
- } else {
+ if( ! is_null( $t ) ) {
wfRunHooks( 'SpecialSearchNogomatch', array( &$t ) );
# If the feature is enabled, go straight to the edit page
if ( $wgGoToEdit ) {
$wgOut->redirect( $t->getFullURL( 'action=edit' ) );
return;
- } else {
- $editurl = $t->escapeLocalURL( 'action=edit' );
- }
+ }
}
$wgOut->addWikiText( wfMsg( 'noexactmatch', wfEscapeWikiText( $term ) ) );
@@ -126,8 +120,7 @@ class SpecialSearch {
$this->setupPage( $term );
- global $wgUser, $wgOut;
- $sk = $wgUser->getSkin();
+ global $wgOut;
$wgOut->addWikiText( wfMsg( 'searchresulttext' ) );
#if ( !$this->parseQuery() ) {
@@ -177,7 +170,7 @@ class SpecialSearch {
if( $num || $this->offset ) {
$prevnext = wfViewPrevNext( $this->offset, $this->limit,
- 'Special:Search',
+ SpecialPage::getTitleFor( 'Search' ),
wfArrayToCGI(
$this->powerSearchOptions(),
array( 'search' => $term ) ) );
@@ -323,10 +316,8 @@ class SpecialSearch {
}
$sk =& $wgUser->getSkin();
- $contextlines = $wgUser->getOption( 'contextlines' );
- if ( '' == $contextlines ) { $contextlines = 5; }
- $contextchars = $wgUser->getOption( 'contextchars' );
- if ( '' == $contextchars ) { $contextchars = 50; }
+ $contextlines = $wgUser->getOption( 'contextlines', 5 );
+ $contextchars = $wgUser->getOption( 'contextchars', 50 );
$link = $sk->makeKnownLinkObj( $t );
$revision = Revision::newFromTitle( $t );
@@ -348,6 +339,7 @@ class SpecialSearch {
break;
}
++$lineno;
+ $m = array();
if ( ! preg_match( $pat1, $line, $m ) ) {
continue;
}
@@ -404,7 +396,7 @@ class SpecialSearch {
'', '', '', '', '', # Dummy placeholders
$searchButton );
- $title = Title::makeTitle( NS_SPECIAL, 'Search' );
+ $title = SpecialPage::getTitleFor( 'Search' );
$action = $title->escapeLocalURL();
return "<br /><br />\n<form id=\"powersearch\" method=\"get\" " .
"action=\"$action\">\n{$ret}\n</form>\n";
diff --git a/includes/SpecialShortpages.php b/includes/SpecialShortpages.php
index 34b3505b..03164deb 100644
--- a/includes/SpecialShortpages.php
+++ b/includes/SpecialShortpages.php
@@ -43,16 +43,16 @@ class ShortPagesPage extends QueryPage {
WHERE page_namespace=".NS_MAIN." AND page_is_redirect=0";
}
- function preprocessResults( &$dbo, $res ) {
+ function preprocessResults( &$db, &$res ) {
# There's no point doing a batch check if we aren't caching results;
# the page must exist for it to have been pulled out of the table
if( $this->isCached() ) {
$batch = new LinkBatch();
- while( $row = $dbo->fetchObject( $res ) )
+ while( $row = $db->fetchObject( $res ) )
$batch->addObj( Title::makeTitleSafe( $row->namespace, $row->title ) );
$batch->execute();
- if( $dbo->numRows( $res ) > 0 )
- $dbo->dataSeek( $res, 0 );
+ if( $db->numRows( $res ) > 0 )
+ $db->dataSeek( $res, 0 );
}
}
@@ -72,7 +72,7 @@ class ShortPagesPage extends QueryPage {
$plink = $this->isCached()
? $skin->makeLinkObj( $title )
: $skin->makeKnownLinkObj( $title );
- $size = wfMsgHtml( 'nbytes', $wgLang->formatNum( htmlspecialchars( $result->value ) ) );
+ $size = wfMsgExt( 'nbytes', array( 'parsemag', 'escape' ), $wgLang->formatNum( htmlspecialchars( $result->value ) ) );
return $title->exists()
? "({$hlink}) {$dm}{$plink} {$dm}[{$size}]"
diff --git a/includes/SpecialSpecialpages.php b/includes/SpecialSpecialpages.php
index 6a01cd08..78f9dee5 100644
--- a/includes/SpecialSpecialpages.php
+++ b/includes/SpecialSpecialpages.php
@@ -37,7 +37,7 @@ function wfSpecialSpecialpages_gen($pages,$heading,$sk) {
/** Put them into a sortable array */
$sortedPages = array();
- foreach ( $pages as $name => $page ) {
+ foreach ( $pages as $page ) {
if ( $page->isListed() ) {
$sortedPages[$page->getDescription()] = $page->getTitle();
}
diff --git a/includes/SpecialStatistics.php b/includes/SpecialStatistics.php
index 4a51efd9..a5a0fc3a 100644
--- a/includes/SpecialStatistics.php
+++ b/includes/SpecialStatistics.php
@@ -15,39 +15,13 @@ function wfSpecialStatistics() {
$action = $wgRequest->getVal( 'action' );
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'page', 'site_stats', 'user', 'user_groups' ) );
- $row = $dbr->selectRow( 'site_stats', '*', false, $fname );
- $views = $row->ss_total_views;
- $edits = $row->ss_total_edits;
- $good = $row->ss_good_articles;
- $images = $row->ss_images;
-
- # This code is somewhat schema-agnostic, because I'm changing it in a minor release -- TS
- if ( isset( $row->ss_total_pages ) && $row->ss_total_pages == -1 ) {
- # Update schema
- $u = new SiteStatsUpdate( 0, 0, 0 );
- $u->doUpdate();
- $row = $dbr->selectRow( 'site_stats', '*', false, $fname );
- }
-
- if ( isset( $row->ss_total_pages ) ) {
- $total = $row->ss_total_pages;
- } else {
- $sql = "SELECT COUNT(page_namespace) AS total FROM $page";
- $res = $dbr->query( $sql, $fname );
- $pageRow = $dbr->fetchObject( $res );
- $total = $pageRow->total;
- }
-
- if ( isset( $row->ss_users ) ) {
- $users = $row->ss_users;
- } else {
- $sql = "SELECT MAX(user_id) AS total FROM $user";
- $res = $dbr->query( $sql, $fname );
- $userRow = $dbr->fetchObject( $res );
- $users = $userRow->total;
- }
+ $views = SiteStats::views();
+ $edits = SiteStats::edits();
+ $good = SiteStats::articles();
+ $images = SiteStats::images();
+ $total = SiteStats::pages();
+ $users = SiteStats::users();
$admins = $dbr->selectField( 'user_groups', 'COUNT(*)', array( 'ug_group' => 'sysop' ), $fname );
$numJobs = $dbr->selectField( 'job', 'COUNT(*)', '', $fname );
@@ -84,6 +58,7 @@ function wfSpecialStatistics() {
global $wgDisableCounters, $wgMiserMode, $wgUser, $wgLang, $wgContLang;
if( !$wgDisableCounters && !$wgMiserMode ) {
+ $page = $dbr->tableName( 'page' );
$sql = "SELECT page_namespace, page_title, page_counter FROM {$page} WHERE page_is_redirect = 0 AND page_counter > 0 ORDER BY page_counter DESC";
$sql = $dbr->limitResult($sql, 10, 0);
$res = $dbr->query( $sql, $fname );
diff --git a/includes/SpecialUncategorizedimages.php b/includes/SpecialUncategorizedimages.php
index 38156976..1daba8ed 100644
--- a/includes/SpecialUncategorizedimages.php
+++ b/includes/SpecialUncategorizedimages.php
@@ -28,7 +28,7 @@ class UncategorizedImagesPage extends QueryPage {
function getSQL() {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'page', 'categorylinks' ) );
+ list( $page, $categorylinks ) = $dbr->tableNamesN( 'page', 'categorylinks' );
$ns = NS_IMAGE;
return "SELECT 'Uncategorizedimages' AS type, page_namespace AS namespace,
diff --git a/includes/SpecialUncategorizedpages.php b/includes/SpecialUncategorizedpages.php
index 0ecc5d07..dbf23a60 100644
--- a/includes/SpecialUncategorizedpages.php
+++ b/includes/SpecialUncategorizedpages.php
@@ -28,7 +28,7 @@ class UncategorizedPagesPage extends PageQueryPage {
function getSQL() {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'page', 'categorylinks' ) );
+ list( $page, $categorylinks ) = $dbr->tableNamesN( 'page', 'categorylinks' );
$name = $dbr->addQuotes( $this->getName() );
return
diff --git a/includes/SpecialUndelete.php b/includes/SpecialUndelete.php
index 8e0291ec..7c9b1191 100644
--- a/includes/SpecialUndelete.php
+++ b/includes/SpecialUndelete.php
@@ -105,17 +105,49 @@ class PageArchive {
* revision of the page with the given timestamp.
*
* @return string
+ * @deprecated Use getRevision() for more flexible information
*/
function getRevisionText( $timestamp ) {
+ $rev = $this->getRevision( $timestamp );
+ return $rev ? $rev->getText() : null;
+ }
+
+ /**
+ * Return a Revision object containing data for the deleted revision.
+ * Note that the result *may* or *may not* have a null page ID.
+ * @param string $timestamp
+ * @return Revision
+ */
+ function getRevision( $timestamp ) {
$dbr =& wfGetDB( DB_SLAVE );
$row = $dbr->selectRow( 'archive',
- array( 'ar_text', 'ar_flags', 'ar_text_id' ),
+ array(
+ 'ar_rev_id',
+ 'ar_text',
+ 'ar_comment',
+ 'ar_user',
+ 'ar_user_text',
+ 'ar_timestamp',
+ 'ar_minor_edit',
+ 'ar_flags',
+ 'ar_text_id' ),
array( 'ar_namespace' => $this->title->getNamespace(),
'ar_title' => $this->title->getDbkey(),
'ar_timestamp' => $dbr->timestamp( $timestamp ) ),
__METHOD__ );
if( $row ) {
- return $this->getTextFromRow( $row );
+ return new Revision( array(
+ 'page' => $this->title->getArticleId(),
+ 'id' => $row->ar_rev_id,
+ 'text' => ($row->ar_text_id
+ ? null
+ : Revision::getRevisionText( $row, 'ar_' ) ),
+ 'comment' => $row->ar_comment,
+ 'user' => $row->ar_user,
+ 'user_text' => $row->ar_user_text,
+ 'timestamp' => $row->ar_timestamp,
+ 'minor_edit' => $row->ar_minor_edit,
+ 'text_id' => $row->ar_text_id ) );
} else {
return null;
}
@@ -246,12 +278,12 @@ class PageArchive {
* @return int number of revisions restored
*/
private function undeleteRevisions( $timestamps ) {
- global $wgParser, $wgDBtype;
+ global $wgDBtype;
$restoreAll = empty( $timestamps );
$dbw =& wfGetDB( DB_MASTER );
- extract( $dbw->tableNames( 'page', 'archive' ) );
+ $page = $dbw->tableName( 'archive' );
# Does this page already exist? We'll have to update it...
$article = new Article( $this->title );
@@ -316,7 +348,6 @@ class PageArchive {
}
$revision = null;
- $newRevId = $previousRevId;
$restored = 0;
while( $row = $dbw->fetchObject( $result ) ) {
@@ -343,7 +374,7 @@ class PageArchive {
'minor_edit' => $row->ar_minor_edit,
'text_id' => $row->ar_text_id,
) );
- $newRevId = $revision->insertOn( $dbw );
+ $revision->insertOn( $dbw );
$restored++;
}
@@ -421,6 +452,7 @@ class UndeleteForm {
$timestamps = array();
$this->mFileVersions = array();
foreach( $_REQUEST as $key => $val ) {
+ $matches = array();
if( preg_match( '/^ts(\d{14})$/', $key, $matches ) ) {
array_push( $timestamps, $matches[1] );
}
@@ -465,7 +497,7 @@ class UndeleteForm {
$wgOut->addWikiText( wfMsg( "undeletepagetext" ) );
$sk = $wgUser->getSkin();
- $undelete =& Title::makeTitle( NS_SPECIAL, 'Undelete' );
+ $undelete = SpecialPage::getTitleFor( 'Undelete' );
$wgOut->addHTML( "<ul>\n" );
while( $row = $result->fetchObject() ) {
$title = Title::makeTitleSafe( $row->ar_namespace, $row->ar_title );
@@ -485,25 +517,33 @@ class UndeleteForm {
if(!preg_match("/[0-9]{14}/",$timestamp)) return 0;
$archive = new PageArchive( $this->mTargetObj );
- $text = $archive->getRevisionText( $timestamp );
-
+ $rev = $archive->getRevision( $timestamp );
+
$wgOut->setPagetitle( wfMsg( "undeletepage" ) );
$wgOut->addWikiText( "(" . wfMsg( "undeleterevision",
- $wgLang->date( $timestamp ) ) . ")\n" );
+ $wgLang->timeAndDate( $timestamp ) ) . ")\n" );
+
+ if( !$rev ) {
+ $wgOut->addWikiText( wfMsg( 'undeleterevision-missing' ) );
+ return;
+ }
+
+ wfRunHooks( 'UndeleteShowRevision', array( $this->mTargetObj, $rev ) );
if( $this->mPreview ) {
$wgOut->addHtml( "<hr />\n" );
- $wgOut->addWikiText( $text );
+ $article = new Article ( $archive->title ); # OutputPage wants an Article obj
+ $wgOut->addPrimaryWikiText( $rev->getText(), $article, false );
}
- $self = Title::makeTitle( NS_SPECIAL, "Undelete" );
+ $self = SpecialPage::getTitleFor( "Undelete" );
$wgOut->addHtml(
wfElement( 'textarea', array(
'readonly' => true,
'cols' => intval( $wgUser->getOption( 'cols' ) ),
'rows' => intval( $wgUser->getOption( 'rows' ) ) ),
- $text . "\n" ) .
+ $rev->getText() . "\n" ) .
wfOpenElement( 'div' ) .
wfOpenElement( 'form', array(
'method' => 'post',
@@ -535,9 +575,17 @@ class UndeleteForm {
* Show a deleted file version requested by the visitor.
*/
function showFile( $key ) {
- global $wgOut;
+ global $wgOut, $wgRequest;
$wgOut->disable();
+ # We mustn't allow the output to be Squid cached, otherwise
+ # if an admin previews a deleted image, and it's cached, then
+ # a user without appropriate permissions can toddle off and
+ # nab the image, and Squid will serve it
+ $wgRequest->response()->header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', 0 ) . ' GMT' );
+ $wgRequest->response()->header( 'Cache-Control: no-cache, no-store, max-age=0, must-revalidate' );
+ $wgRequest->response()->header( 'Pragma: no-cache' );
+
$store = FileStore::get( 'deleted' );
$store->stream( $key );
}
@@ -553,8 +601,8 @@ class UndeleteForm {
}
$archive = new PageArchive( $this->mTargetObj );
- $text = $archive->getLastRevisionText();
/*
+ $text = $archive->getLastRevisionText();
if( is_null( $text ) ) {
$wgOut->addWikiText( wfMsg( "nohistory" ) );
return;
@@ -594,7 +642,7 @@ class UndeleteForm {
}
if ( $this->mAllowed ) {
- $titleObj = Title::makeTitle( NS_SPECIAL, "Undelete" );
+ $titleObj = SpecialPage::getTitleFor( "Undelete" );
$action = $titleObj->getLocalURL( "action=submit" );
# Start the form here
$top = wfOpenElement( 'form', array( 'method' => 'post', 'action' => $action, 'id' => 'undelete' ) );
@@ -698,7 +746,6 @@ class UndeleteForm {
global $wgOut, $wgUser;
if( !is_null( $this->mTargetObj ) ) {
$archive = new PageArchive( $this->mTargetObj );
- $ok = true;
$ok = $archive->undelete(
$this->mTargetTimestamp,
diff --git a/includes/SpecialUnlockdb.php b/includes/SpecialUnlockdb.php
index 6627f75f..1f24d131 100644
--- a/includes/SpecialUnlockdb.php
+++ b/includes/SpecialUnlockdb.php
@@ -54,7 +54,7 @@ class DBUnlockForm {
}
$lc = htmlspecialchars( wfMsg( "unlockconfirm" ) );
$lb = htmlspecialchars( wfMsg( "unlockbtn" ) );
- $titleObj = Title::makeTitle( NS_SPECIAL, "Unlockdb" );
+ $titleObj = SpecialPage::getTitleFor( "Unlockdb" );
$action = $titleObj->escapeLocalURL( "action=submit" );
$token = htmlspecialchars( $wgUser->editToken() );
@@ -94,7 +94,7 @@ END
$wgOut->showFileDeleteError( $wgReadOnlyFile );
return;
}
- $titleObj = Title::makeTitle( NS_SPECIAL, "Unlockdb" );
+ $titleObj = SpecialPage::getTitleFor( "Unlockdb" );
$success = $titleObj->getFullURL( "action=success" );
$wgOut->redirect( $success );
}
diff --git a/includes/SpecialUnusedcategories.php b/includes/SpecialUnusedcategories.php
index 270180ef..80f46a87 100644
--- a/includes/SpecialUnusedcategories.php
+++ b/includes/SpecialUnusedcategories.php
@@ -23,9 +23,9 @@ class UnusedCategoriesPage extends QueryPage {
function getSQL() {
$NScat = NS_CATEGORY;
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'categorylinks','page' ));
+ list( $categorylinks, $page ) = $dbr->tableNamesN( 'categorylinks', 'page' );
return "SELECT 'Unusedcategories' as type,
- {$NScat} as namespace, page_title as title, 1 as value
+ {$NScat} as namespace, page_title as title, page_title as value
FROM $page
LEFT JOIN $categorylinks ON page_title=cl_to
WHERE cl_from IS NULL
diff --git a/includes/SpecialUnusedimages.php b/includes/SpecialUnusedimages.php
index 32a6f95a..75d702c8 100644
--- a/includes/SpecialUnusedimages.php
+++ b/includes/SpecialUnusedimages.php
@@ -25,7 +25,7 @@ class UnusedimagesPage extends QueryPage {
$dbr =& wfGetDB( DB_SLAVE );
if ( $wgCountCategorizedImagesAsUsed ) {
- extract( $dbr->tableNames( 'page', 'image', 'imagelinks', 'categorylinks' ) );
+ list( $page, $image, $imagelinks, $categorylinks ) = $dbr->tableNamesN( 'page', 'image', 'imagelinks', 'categorylinks' );
return 'SELECT img_name as title, img_user, img_user_text, img_timestamp as value, img_description
FROM ((('.$page.' AS I LEFT JOIN '.$categorylinks.' AS L ON I.page_id = L.cl_from)
@@ -33,7 +33,7 @@ class UnusedimagesPage extends QueryPage {
INNER JOIN '.$image.' AS G ON I.page_title = G.img_name)
WHERE I.page_namespace = '.NS_IMAGE.' AND L.cl_from IS NULL AND P.il_to IS NULL';
} else {
- extract( $dbr->tableNames( 'image','imagelinks' ) );
+ list( $image, $imagelinks ) = $dbr->tableNamesN( 'image','imagelinks' );
return 'SELECT img_name as title, img_user, img_user_text, img_timestamp as value, img_description' .
' FROM '.$image.' LEFT JOIN '.$imagelinks.' ON img_name=il_to WHERE il_to IS NULL ';
diff --git a/includes/SpecialUnusedtemplates.php b/includes/SpecialUnusedtemplates.php
index b33a24da..2af9abc6 100644
--- a/includes/SpecialUnusedtemplates.php
+++ b/includes/SpecialUnusedtemplates.php
@@ -23,7 +23,7 @@ class UnusedtemplatesPage extends QueryPage {
function getSQL() {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'page', 'templatelinks' ) );
+ list( $page, $templatelinks) = $dbr->tableNamesN( 'page', 'templatelinks' );
$sql = "SELECT 'Unusedtemplates' AS type, page_title AS title,
page_namespace AS namespace, 0 AS value
FROM $page
@@ -37,7 +37,7 @@ class UnusedtemplatesPage extends QueryPage {
$title = Title::makeTitle( NS_TEMPLATE, $result->title );
$pageLink = $skin->makeKnownLinkObj( $title, '', 'redirect=no' );
$wlhLink = $skin->makeKnownLinkObj(
- Title::makeTitle( NS_SPECIAL, 'Whatlinkshere' ),
+ SpecialPage::getTitleFor( 'Whatlinkshere' ),
wfMsgHtml( 'unusedtemplateswlh' ),
'target=' . $title->getPrefixedUrl() );
return wfSpecialList( $pageLink, $wlhLink );
diff --git a/includes/SpecialUnwatchedpages.php b/includes/SpecialUnwatchedpages.php
index 66e5c091..f9dff724 100644
--- a/includes/SpecialUnwatchedpages.php
+++ b/includes/SpecialUnwatchedpages.php
@@ -22,7 +22,7 @@ class UnwatchedpagesPage extends QueryPage {
function getSQL() {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'page', 'watchlist' ) );
+ list( $page, $watchlist ) = $dbr->tableNamesN( 'page', 'watchlist' );
$mwns = NS_MEDIAWIKI;
return
"
diff --git a/includes/SpecialUpload.php b/includes/SpecialUpload.php
index ade58056..d2fd839c 100644
--- a/includes/SpecialUpload.php
+++ b/includes/SpecialUpload.php
@@ -28,6 +28,13 @@ class UploadForm {
var $mUploadSaveName, $mUploadTempName, $mUploadSize, $mUploadOldVersion;
var $mUploadCopyStatus, $mUploadSource, $mReUpload, $mAction, $mUpload;
var $mOname, $mSessionKey, $mStashed, $mDestFile, $mRemoveTempFile, $mSourceType;
+ var $mUploadTempFileSize = 0;
+
+ # Placeholders for text injection by hooks (must be HTML)
+ # extensions should take care to _append_ to the present value
+ var $uploadFormTextTop;
+ var $uploadFormTextAfterSummary;
+
/**#@-*/
/**
@@ -44,6 +51,10 @@ class UploadForm {
return;
}
+ # Placeholders for text injection by hooks (empty per default)
+ $this->uploadFormTextTop = "";
+ $this->uploadFormTextAfterSummary = "";
+
$this->mIgnoreWarning = $request->getCheck( 'wpIgnoreWarning' );
$this->mReUpload = $request->getCheck( 'wpReUpload' );
$this->mUpload = $request->getCheck( 'wpUpload' );
@@ -105,7 +116,7 @@ class UploadForm {
* @access private
*/
function initializeFromUrl( $request ) {
- global $wgTmpDirectory, $wgMaxUploadSize;
+ global $wgTmpDirectory;
$url = $request->getText( 'wpUploadFileURL' );
$local_file = tempnam( $wgTmpDirectory, 'WEBUPLOAD' );
@@ -125,7 +136,7 @@ class UploadForm {
* Returns true if there was an error, false otherwise
*/
private function curlCopy( $url, $dest ) {
- global $wgMaxUploadSize, $wgUser;
+ global $wgUser, $wgOut;
if( !$wgUser->isAllowed( 'upload_by_url' ) ) {
$wgOut->permissionRequired( 'upload_by_url' );
@@ -133,17 +144,18 @@ class UploadForm {
}
# Maybe remove some pasting blanks :-)
- $url = strtolower( trim( $url ) );
- if( substr( $url, 0, 7 ) != 'http://' && substr( $url, 0, 6 ) != 'ftp://' ) {
+ $url = trim( $url );
+ if( stripos($url, 'http://') !== 0 && stripos($url, 'ftp://') !== 0 ) {
# Only HTTP or FTP URLs
+ $wgOut->errorPage( 'upload-proto-error', 'upload-proto-error-text' );
return true;
}
# Open temporary file
- $this->mUploadTempFileSize = 0;
$this->mUploadTempFile = @fopen( $this->mUploadTempName, "wb" );
if( $this->mUploadTempFile === false ) {
# Could not open temporary file to write in
+ $wgOut->errorPage( 'upload-file-error', 'upload-file-error-text');
return true;
}
@@ -155,13 +167,18 @@ class UploadForm {
curl_setopt( $ch, CURLOPT_WRITEFUNCTION, array( $this, 'uploadCurlCallback' ) );
curl_exec( $ch );
$error = curl_errno( $ch ) ? true : false;
-# if ( $error ) print curl_error ( $ch ) ; # Debugging output
+ $errornum = curl_errno( $ch );
+ // if ( $error ) print curl_error ( $ch ) ; # Debugging output
curl_close( $ch );
fclose( $this->mUploadTempFile );
unset( $this->mUploadTempFile );
if( $error ) {
unlink( $dest );
+ if( wfEmptyMsg( "upload-curl-error$errornum", wfMsg("upload-curl-error$errornum") ) )
+ $wgOut->errorPage( 'upload-misc-error', 'upload-misc-error-text' );
+ else
+ $wgOut->errorPage( "upload-curl-error$errornum", "upload-curl-error$errornum-text" );
}
return $error;
@@ -249,6 +266,12 @@ class UploadForm {
function processUpload() {
global $wgUser, $wgOut;
+ if( !wfRunHooks( 'UploadForm:BeforeProcessing', array( &$this ) ) )
+ {
+ wfDebug( "Hook 'UploadForm:BeforeProcessing' broke processing the file." );
+ return false;
+ }
+
/* Check for PHP error if any, requires php 4.2 or newer */
if( $this->mUploadError == 1/*UPLOAD_ERR_INI_SIZE*/ ) {
$this->mainUploadForm( wfMsgHtml( 'largefileserver' ) );
@@ -330,7 +353,7 @@ class UploadForm {
if( $this->checkFileExtensionList( $ext, $wgFileBlacklist ) ||
($wgStrictFileExtensions &&
!$this->checkFileExtension( $finalExt, $wgFileExtensions ) ) ) {
- return $this->uploadError( wfMsgHtml( 'badfiletype', htmlspecialchars( $fullExt ) ) );
+ return $this->uploadError( wfMsgHtml( 'badfiletype', htmlspecialchars( $finalExt ) ) );
}
/**
@@ -373,15 +396,16 @@ class UploadForm {
global $wgCheckFileExtensions;
if ( $wgCheckFileExtensions ) {
if ( ! $this->checkFileExtension( $finalExt, $wgFileExtensions ) ) {
- $warning .= '<li>'.wfMsgHtml( 'badfiletype', htmlspecialchars( $fullExt ) ).'</li>';
+ $warning .= '<li>'.wfMsgHtml( 'badfiletype', htmlspecialchars( $finalExt ) ).'</li>';
}
}
global $wgUploadSizeWarning;
if ( $wgUploadSizeWarning && ( $this->mUploadSize > $wgUploadSizeWarning ) ) {
- # TODO: Format $wgUploadSizeWarning to something that looks better than the raw byte
- # value, perhaps add GB,MB and KB suffixes?
- $warning .= '<li>'.wfMsgHtml( 'largefile', $wgUploadSizeWarning, $this->mUploadSize ).'</li>';
+ $skin =& $wgUser->getSkin();
+ $wsize = $skin->formatSize( $wgUploadSizeWarning );
+ $asize = $skin->formatSize( $this->mUploadSize );
+ $warning .= '<li>' . wfMsgHtml( 'large-file', $wsize, $asize ) . '</li>';
}
if ( $this->mUploadSize == 0 ) {
$warning .= '<li>'.wfMsgHtml( 'emptyfile' ).'</li>';
@@ -398,7 +422,7 @@ class UploadForm {
$image = new Image( $nt );
if( $image->wasDeleted() ) {
$skin = $wgUser->getSkin();
- $ltitle = Title::makeTitle( NS_SPECIAL, 'Log' );
+ $ltitle = SpecialPage::getTitleFor( 'Log' );
$llink = $skin->makeKnownLinkObj( $ltitle, wfMsgHtml( 'deletionlog' ), 'type=delete&page=' . $nt->getPrefixedUrl() );
$warning .= wfOpenElement( 'li' ) . wfMsgWikiHtml( 'filewasdeleted', $llink ) . wfCloseElement( 'li' );
}
@@ -632,7 +656,7 @@ class UploadForm {
$reupload = wfMsgHtml( 'reupload' );
$iw = wfMsgWikiHtml( 'ignorewarning' );
$reup = wfMsgWikiHtml( 'reuploaddesc' );
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Upload' );
+ $titleObj = SpecialPage::getTitleFor( 'Upload' );
$action = $titleObj->escapeLocalURL( 'action=submit' );
if ( $wgUseCopyrightUpload )
@@ -684,6 +708,12 @@ class UploadForm {
global $wgUseCopyrightUpload;
global $wgRequest, $wgAllowCopyUploads;
+ if( !wfRunHooks( 'UploadForm:initial', array( &$this ) ) )
+ {
+ wfDebug( "Hook 'UploadForm:initial' broke output of the upload form" );
+ return false;
+ }
+
$cols = intval($wgUser->getOption( 'cols' ));
$ew = $wgUser->getOption( 'editwidth' );
if ( $ew ) $ew = " style=\"width:100%\"";
@@ -697,8 +727,6 @@ class UploadForm {
$wgOut->addHTML( '<div id="uploadtext">' );
$wgOut->addWikiText( wfMsg( 'uploadtext' ) );
$wgOut->addHTML( '</div>' );
- $sk = $wgUser->getSkin();
-
$sourcefilename = wfMsgHtml( 'sourcefilename' );
$destfilename = wfMsgHtml( 'destfilename' );
@@ -712,18 +740,19 @@ class UploadForm {
$ulb = wfMsgHtml( 'uploadbtn' );
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Upload' );
+ $titleObj = SpecialPage::getTitleFor( 'Upload' );
$action = $titleObj->escapeLocalURL();
$encDestFile = htmlspecialchars( $this->mDestFile );
- $watchChecked = $wgUser->getOption( 'watchdefault' )
+ $watchChecked =
+ ( $wgUser->getOption( 'watchdefault' ) ||
+ ( $wgUser->getOption( 'watchcreations' ) && $this->mDestFile == '' ) )
? 'checked="checked"'
: '';
// Prepare form for upload or upload/copy
if( $wgAllowCopyUploads && $wgUser->isAllowed( 'upload_by_url' ) ) {
- $source_comment = wfMsgHtml( 'upload_source_url' );
$filename_form =
"<input type='radio' id='wpSourceTypeFile' name='wpSourceType' value='file' onchange='toggle_element_activation(\"wpUploadFileURL\",\"wpUploadFile\")' checked />" .
"<input tabindex='1' type='file' name='wpUploadFile' id='wpUploadFile' onfocus='toggle_element_activation(\"wpUploadFileURL\",\"wpUploadFile\");toggle_element_check(\"wpSourceTypeFile\",\"wpSourceTypeURL\")'" .
@@ -745,6 +774,7 @@ class UploadForm {
<form id='upload' method='post' enctype='multipart/form-data' action=\"$action\">
<table border='0'>
<tr>
+ {$this->uploadFormTextTop}
<td align='right' valign='top'><label for='wpUploadFile'>{$sourcefilename}:</label></td>
<td align='left'>
{$filename_form}
@@ -760,6 +790,7 @@ class UploadForm {
<td align='right'><label for='wpUploadDescription'>{$summary}</label></td>
<td align='left'>
<textarea tabindex='3' name='wpUploadDescription' id='wpUploadDescription' rows='6' cols='{$cols}'{$ew}>" . htmlspecialchars( $this->mUploadDescription ) . "</textarea>
+ {$this->uploadFormTextAfterSummary}
</td>
</tr>
<tr>" );
@@ -810,9 +841,6 @@ class UploadForm {
</td>
</tr>
<tr>
-
- </tr>
- <tr>
<td></td>
<td align='left'><input tabindex='9' type='submit' name='wpUpload' value=\"{$ulb}\" /></td>
</tr>
@@ -1046,13 +1074,13 @@ class UploadForm {
$chunk = Sanitizer::decodeCharReferences( $chunk );
#look for script-types
- if (preg_match("!type\s*=\s*['\"]?\s*(\w*/)?(ecma|java)!sim",$chunk)) return true;
+ if (preg_match('!type\s*=\s*[\'"]?\s*(\w*/)?(ecma|java)!sim',$chunk)) return true;
#look for html-style script-urls
- if (preg_match("!(href|src|data)\s*=\s*['\"]?\s*(ecma|java)script:!sim",$chunk)) return true;
+ if (preg_match('!(href|src|data)\s*=\s*[\'"]?\s*(ecma|java)script:!sim',$chunk)) return true;
#look for css-style script-urls
- if (preg_match("!url\s*\(\s*['\"]?\s*(ecma|java)script:!sim",$chunk)) return true;
+ if (preg_match('!url\s*\(\s*[\'"]?\s*(ecma|java)script:!sim',$chunk)) return true;
wfDebug("SpecialUpload::detectScript: no scripts found\n");
return false;
@@ -1104,21 +1132,25 @@ class UploadForm {
#NOTE: there's a 50 line workaround to make stderr redirection work on windows, too.
# that does not seem to be worth the pain.
# Ask me (Duesentrieb) about it if it's ever needed.
+ $output = array();
if (wfIsWindows()) exec("$scanner",$output,$code);
else exec("$scanner 2>&1",$output,$code);
- $exit_code= $code; #remeber for user feedback
+ $exit_code= $code; #remember for user feedback
if ($virus_scanner_codes) { #map exit code to AV_xxx constants.
- if (isset($virus_scanner_codes[$code])) $code= $virus_scanner_codes[$code]; #explicite mapping
- else if (isset($virus_scanner_codes["*"])) $code= $virus_scanner_codes["*"]; #fallback mapping
+ if (isset($virus_scanner_codes[$code])) {
+ $code= $virus_scanner_codes[$code]; # explicit mapping
+ } else if (isset($virus_scanner_codes["*"])) {
+ $code= $virus_scanner_codes["*"]; # fallback mapping
+ }
}
if ($code===AV_SCAN_FAILED) { #scan failed (code was mapped to false by $virus_scanner_codes)
wfDebug("$fname: failed to scan $file (code $exit_code).\n");
- if ($wgAntivirusRequired) return "scan failed (code $exit_code)";
- else return NULL;
+ if ($wgAntivirusRequired) { return "scan failed (code $exit_code)"; }
+ else { return NULL; }
}
else if ($code===AV_SCAN_ABORTED) { #scan failed because filetype is unknown (probably imune)
wfDebug("$fname: unsupported file type $file (code $exit_code).\n");
@@ -1132,7 +1164,7 @@ class UploadForm {
$output= join("\n",$output);
$output= trim($output);
- if (!$output) $output= true; #if ther's no output, return true
+ if (!$output) $output= true; #if there's no output, return true
else if ($msg_pattern) {
$groups= array();
if (preg_match($msg_pattern,$output,$groups)) {
diff --git a/includes/SpecialUserlogin.php b/includes/SpecialUserlogin.php
index 574579cc..e60e3d54 100644
--- a/includes/SpecialUserlogin.php
+++ b/includes/SpecialUserlogin.php
@@ -12,7 +12,7 @@ function wfSpecialUserlogin() {
global $wgCommandLineMode;
global $wgRequest;
if( !$wgCommandLineMode && !isset( $_COOKIE[session_name()] ) ) {
- User::SetupSession();
+ wfSetupSession();
}
$form = new LoginForm( $wgRequest );
@@ -34,6 +34,7 @@ class LoginForm {
const NOT_EXISTS = 4;
const WRONG_PASS = 5;
const EMPTY_PASS = 6;
+ const RESET_PASS = 7;
var $mName, $mPassword, $mRetype, $mReturnTo, $mCookieCheck, $mPosted;
var $mAction, $mCreateaccount, $mCreateaccountMail, $mMailmypassword;
@@ -122,8 +123,10 @@ class LoginForm {
return;
}
+ // Wipe the initial password and mail a temporary one
+ $u->setPassword( null );
$u->saveSettings();
- $result = $this->mailPasswordInternal($u);
+ $result = $this->mailPasswordInternal( $u, false );
wfRunHooks( 'AddNewAccount', array( $u ) );
@@ -157,12 +160,19 @@ class LoginForm {
global $wgLoginLanguageSelector;
if( $wgLoginLanguageSelector && $this->mLanguage )
$u->setOption( 'language', $this->mLanguage );
-
+
# Save user settings and send out an email authentication message if needed
$u->saveSettings();
- if( $wgEmailAuthentication && User::isValidEmailAddr( $u->getEmail() ) )
- $u->sendConfirmationMail();
-
+ if( $wgEmailAuthentication && User::isValidEmailAddr( $u->getEmail() ) ) {
+ global $wgOut;
+ $error = $u->sendConfirmationMail();
+ if( WikiError::isError( $error ) ) {
+ $wgOut->addWikiText( wfMsg( 'confirmemail_sendfailed', $error->getMessage() ) );
+ } else {
+ $wgOut->addWikiText( wfMsg( 'confirmemail_oncreate' ) );
+ }
+ }
+
# If not logged in, assume the new account as the current one and set session cookies
# then show a "welcome" message or a "need cookies" message as needed
if( $wgUser->isAnon() ) {
@@ -177,8 +187,7 @@ class LoginForm {
} else {
# Confirm that the account was created
global $wgOut;
- $skin = $wgUser->getSkin();
- $self = Title::makeTitle( NS_SPECIAL, 'Userlogin' );
+ $self = SpecialPage::getTitleFor( 'Userlogin' );
$wgOut->setPageTitle( wfMsgHtml( 'accountcreated' ) );
$wgOut->setArticleRelated( false );
$wgOut->setRobotPolicy( 'noindex,nofollow' );
@@ -236,8 +245,8 @@ class LoginForm {
}
$name = trim( $this->mName );
- $u = User::newFromName( $name );
- if ( is_null( $u ) || !User::isCreatableName( $u->getName() ) ) {
+ $u = User::newFromName( $name, 'creatable' );
+ if ( is_null( $u ) ) {
$this->mainLoginForm( wfMsg( 'noname' ) );
return false;
}
@@ -257,6 +266,14 @@ class LoginForm {
return false;
}
+ $abortError = '';
+ if( !wfRunHooks( 'AbortNewAccount', array( $u, &$abortError ) ) ) {
+ // Hook point to add extra creation throttles and blocks
+ wfDebug( "LoginForm::addNewAccountInternal: a hook blocked creation\n" );
+ $this->mainLoginForm( $abortError );
+ return false;
+ }
+
if ( $wgAccountCreationThrottle ) {
$key = wfMemcKey( 'acctcreate', 'ip', $ip );
$value = $wgMemc->incr( $key );
@@ -269,14 +286,6 @@ class LoginForm {
}
}
- $abortError = '';
- if( !wfRunHooks( 'AbortNewAccount', array( $u, &$abortError ) ) ) {
- // Hook point to add extra creation throttles and blocks
- wfDebug( "LoginForm::addNewAccountInternal: a hook blocked creation\n" );
- $this->mainLoginForm( $abortError );
- return false;
- }
-
if( !$wgAuth->addUser( $u, $this->mPassword ) ) {
$this->mainLoginForm( wfMsg( 'externaldberror' ) );
return false;
@@ -297,7 +306,7 @@ class LoginForm {
* @return User object.
* @private
*/
- function &initUser( &$u ) {
+ function initUser( $u ) {
$u->addToDatabase();
$u->setPassword( $this->mPassword );
$u->setEmail( $this->mEmail );
@@ -308,16 +317,21 @@ class LoginForm {
$wgAuth->initUser( $u );
$u->setOption( 'rememberpassword', $this->mRemember ? 1 : 0 );
+ $u->saveSettings();
return $u;
}
/**
- * @private
+ * Internally authenticate the login request.
+ *
+ * This may create a local account as a side effect if the
+ * authentication plugin allows transparent local account
+ * creation.
+ *
+ * @public
*/
-
- function authenticateUserData()
- {
+ function authenticateUserData() {
global $wgUser, $wgAuth;
if ( '' == $this->mName ) {
return self::NO_NAME;
@@ -335,7 +349,7 @@ class LoginForm {
*/
if ( $wgAuth->autoCreate() && $wgAuth->userExists( $u->getName() ) ) {
if ( $wgAuth->authenticate( $u->getName(), $this->mPassword ) ) {
- $u =& $this->initUser( $u );
+ $u = $this->initUser( $u );
} else {
return self::WRONG_PLUGIN_PASS;
}
@@ -343,14 +357,43 @@ class LoginForm {
return self::NOT_EXISTS;
}
} else {
- $u->loadFromDatabase();
+ $u->load();
}
if (!$u->checkPassword( $this->mPassword )) {
- return '' == $this->mPassword ? self::EMPTY_PASS : self::WRONG_PASS;
- }
- else
- {
+ if( $u->checkTemporaryPassword( $this->mPassword ) ) {
+ // The e-mailed temporary password should not be used
+ // for actual logins; that's a very sloppy habit,
+ // and insecure if an attacker has a few seconds to
+ // click "search" on someone's open mail reader.
+ //
+ // Allow it to be used only to reset the password
+ // a single time to a new value, which won't be in
+ // the user's e-mail archives.
+ //
+ // For backwards compatibility, we'll still recognize
+ // it at the login form to minimize surprises for
+ // people who have been logging in with a temporary
+ // password for some time.
+ //
+ // As a side-effect, we can authenticate the user's
+ // e-mail address if it's not already done, since
+ // the temporary password was sent via e-mail.
+ //
+ if( !$u->isEmailConfirmed() ) {
+ $u->confirmEmail();
+ }
+
+ // At this point we just return an appropriate code
+ // indicating that the UI should show a password
+ // reset form; bot interfaces etc will probably just
+ // fail cleanly here.
+ //
+ return self::RESET_PASS;
+ } else {
+ return '' == $this->mPassword ? self::EMPTY_PASS : self::WRONG_PASS;
+ }
+ } else {
$wgAuth->updateUser( $u );
$wgUser = $u;
@@ -396,23 +439,45 @@ class LoginForm {
case self::EMPTY_PASS:
$this->mainLoginForm( wfMsg( 'wrongpasswordempty' ) );
break;
+ case self::RESET_PASS:
+ $this->resetLoginForm( wfMsg( 'resetpass_announce' ) );
+ break;
default:
wfDebugDieBacktrace( "Unhandled case value" );
}
}
+
+ function resetLoginForm( $error ) {
+ global $wgOut;
+ $wgOut->addWikiText( "<div class=\"errorbox\">$error</div>" );
+ $reset = new PasswordResetForm( $this->mName, $this->mPassword );
+ $reset->execute();
+ }
/**
* @private
*/
function mailPassword() {
- global $wgUser, $wgOut;
+ global $wgUser, $wgOut, $wgAuth;
+
+ if( !$wgAuth->allowPasswordChange() ) {
+ $this->mainLoginForm( wfMsg( 'resetpass_forbidden' ) );
+ return;
+ }
+
+ # Check against blocked IPs
+ # fixme -- should we not?
+ if( $wgUser->isBlocked() ) {
+ $this->mainLoginForm( wfMsg( 'blocked-mailpassword' ) );
+ return;
+ }
# Check against the rate limiter
if( $wgUser->pingLimiter( 'mailpassword' ) ) {
$wgOut->rateLimited();
return;
}
-
+
if ( '' == $this->mName ) {
$this->mainLoginForm( wfMsg( 'noname' ) );
return;
@@ -427,9 +492,16 @@ class LoginForm {
return;
}
- $u->loadFromDatabase();
+ # Check against password throttle
+ if ( $u->isPasswordReminderThrottled() ) {
+ global $wgPasswordReminderResendTime;
+ # Round the time in hours to 3 d.p., in case someone is specifying minutes or seconds.
+ $this->mainLoginForm( wfMsg( 'throttled-mailpassword',
+ round( $wgPasswordReminderResendTime, 3 ) ) );
+ return;
+ }
- $result = $this->mailPasswordInternal( $u );
+ $result = $this->mailPasswordInternal( $u, true );
if( WikiError::isError( $result ) ) {
$this->mainLoginForm( wfMsg( 'mailerror', $result->getMessage() ) );
} else {
@@ -442,7 +514,7 @@ class LoginForm {
* @return mixed true on success, WikiError on failure
* @private
*/
- function mailPasswordInternal( $u ) {
+ function mailPasswordInternal( $u, $throttle = true ) {
global $wgCookiePath, $wgCookieDomain, $wgCookiePrefix, $wgCookieSecure;
global $wgServer, $wgScript;
@@ -451,7 +523,7 @@ class LoginForm {
}
$np = $u->randomPassword();
- $u->setNewpassword( $np );
+ $u->setNewpassword( $np, $throttle );
setcookie( "{$wgCookiePrefix}Token", '', time() - 3600, $wgCookiePath, $wgCookieDomain, $wgCookieSecure );
@@ -531,6 +603,7 @@ class LoginForm {
function mainLoginForm( $msg, $msgtype = 'error' ) {
global $wgUser, $wgOut, $wgAllowRealName, $wgEnableEmail;
global $wgCookiePrefix, $wgAuth, $wgLoginLanguageSelector;
+ global $wgAuth;
if ( $this->mType == 'signup' ) {
if ( !$wgUser->isAllowed( 'createaccount' ) ) {
@@ -546,11 +619,11 @@ class LoginForm {
if ( $wgUser->isLoggedIn() ) {
$this->mName = $wgUser->getName();
} else {
- $this->mName = @$_COOKIE[$wgCookiePrefix.'UserName'];
+ $this->mName = isset( $_COOKIE[$wgCookiePrefix.'UserName'] ) ? $_COOKIE[$wgCookiePrefix.'UserName'] : null;
}
}
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Userlogin' );
+ $titleObj = SpecialPage::getTitleFor( 'Userlogin' );
if ( $this->mType == 'signup' ) {
$template = new UsercreateTemplate();
@@ -598,6 +671,7 @@ class LoginForm {
$template->set( 'createemail', $wgEnableEmail && $wgUser->isLoggedIn() );
$template->set( 'userealname', $wgAllowRealName );
$template->set( 'useemail', $wgEnableEmail );
+ $template->set( 'canreset', $wgAuth->allowPasswordChange() );
$template->set( 'remember', $wgUser->getOption( 'rememberpassword' ) or $this->mRemember );
# Prepare language selection links as needed
@@ -648,7 +722,7 @@ class LoginForm {
function cookieRedirectCheck( $type ) {
global $wgOut;
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Userlogin' );
+ $titleObj = SpecialPage::getTitleFor( 'Userlogin' );
$check = $titleObj->getFullURL( 'wpCookieCheck='.$type );
return $wgOut->redirect( $check );
@@ -714,7 +788,7 @@ class LoginForm {
*/
function makeLanguageSelectorLink( $text, $lang ) {
global $wgUser;
- $self = Title::makeTitle( NS_SPECIAL, 'Userlogin' );
+ $self = SpecialPage::getTitleFor( 'Userlogin' );
$attr[] = 'uselang=' . $lang;
if( $this->mType == 'signup' )
$attr[] = 'type=signup';
diff --git a/includes/SpecialUserrights.php b/includes/SpecialUserrights.php
index b17cc4aa..99abd7a7 100644
--- a/includes/SpecialUserrights.php
+++ b/includes/SpecialUserrights.php
@@ -1,11 +1,11 @@
<?php
+
/**
- * Provide an administration interface
- * DO NOT USE: INSECURE.
+ * Special page to allow managing user group membership
*
- * TODO : remove everything related to group editing (SpecialGrouplevels.php)
* @package MediaWiki
- * @subpackage SpecialPage
+ * @subpackage Special pages
+ * @todo This code is disgusting and needs a total rewrite
*/
/** */
@@ -34,7 +34,7 @@ class UserrightsForm extends HTMLForm {
$this->mRequest =& $request;
$this->mName = 'userrights';
- $titleObj = Title::makeTitle( NS_SPECIAL, 'Userrights' );
+ $titleObj = SpecialPage::getTitleFor( 'Userrights' );
$this->action = $titleObj->escapeLocalURL();
}
@@ -89,7 +89,6 @@ class UserrightsForm extends HTMLForm {
$oldGroups = $u->getGroups();
$newGroups = $oldGroups;
- $logcomment = ' ';
// remove then add groups
if(isset($removegroup)) {
$newGroups = array_diff($newGroups, $removegroup);
@@ -119,22 +118,18 @@ class UserrightsForm extends HTMLForm {
}
/**
- * The entry form
- * It allows a user to look for a username and edit its groups membership
+ * Output a form to allow searching for a user
*/
function switchForm() {
- global $wgOut;
-
- // user selection
- $wgOut->addHTML( "<form name=\"uluser\" action=\"$this->action\" method=\"post\">\n" );
- $wgOut->addHTML( $this->fieldset( 'lookup-user',
- $this->textbox( 'user-editname' ) .
- wfElement( 'input', array(
- 'type' => 'submit',
- 'name' => 'ssearchuser',
- 'value' => wfMsg( 'editusergroup' ) ) )
- ));
- $wgOut->addHTML( "</form>\n" );
+ global $wgOut, $wgRequest;
+ $username = $wgRequest->getText( 'user-editname' );
+ $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->action, 'name' => 'uluser' ) );
+ $form .= '<fieldset><legend>' . wfMsgHtml( 'userrights-lookup-user' ) . '</legend>';
+ $form .= '<p>' . Xml::inputLabel( wfMsg( 'userrights-user-editname' ), 'user-editname', 'username', 30, $username ) . '</p>';
+ $form .= '<p>' . Xml::submitButton( wfMsg( 'editusergroup' ), array( 'name' => 'ssearchuser' ) ) . '</p>';
+ $form .= '</fieldset>';
+ $form .= '</form>';
+ $wgOut->addHTML( $form );
}
/**
diff --git a/includes/SpecialVersion.php b/includes/SpecialVersion.php
index 8744597a..dba694c0 100644
--- a/includes/SpecialVersion.php
+++ b/includes/SpecialVersion.php
@@ -21,6 +21,8 @@ function wfSpecialVersion() {
}
class SpecialVersion {
+ private $firstExtOpened = true;
+
/**
* main()
*/
@@ -42,16 +44,21 @@ class SpecialVersion {
*/
/**
+ * Return wiki text showing the licence information and third party
+ * software versions (apache, php, mysql).
* @static
*/
function MediaWikiCredits() {
$version = self::getVersion();
$dbr =& wfGetDB( DB_SLAVE );
+ global $wgLanguageNames, $wgLanguageCode;
+ $mwlang = $wgLanguageNames[$wgLanguageCode];
+
$ret =
"__NOTOC__
This wiki is powered by '''[http://www.mediawiki.org/ MediaWiki]''',
- copyright (C) 2001-2006 Magnus Manske, Brion Vibber, Lee Daniel Crocker,
+ copyright (C) 2001-2007 Magnus Manske, Brion Vibber, Lee Daniel Crocker,
Tim Starling, Erik Möller, Gabriel Wicke, Ævar Arnfjörð Bjarmason,
Niklas Laxström, Domas Mituzas, Rob Church and others.
@@ -74,15 +81,17 @@ class SpecialVersion {
* [http://www.php.net/ PHP]: " . phpversion() . " (" . php_sapi_name() . ")
* " . $dbr->getSoftwareLink() . ": " . $dbr->getServerVersion();
- return str_replace( "\t\t", '', $ret );
+ return str_replace( "\t\t", '', $ret ) . "\n";
}
-
+
+ /** Return a string of the MediaWiki version with SVN revision if available */
public static function getVersion() {
global $wgVersion, $IP;
$svn = self::getSvnRevision( $IP );
return $svn ? "$wgVersion (r$svn)" : $wgVersion;
}
+ /** Generate wikitext showing extensions name, URL, author and description */
function extensionCredits() {
global $wgExtensionCredits, $wgExtensionFunctions, $wgParser, $wgSkinExtensionFunction;
@@ -97,10 +106,12 @@ class SpecialVersion {
);
wfRunHooks( 'SpecialVersionExtensionTypes', array( &$this, &$extensionTypes ) );
- $out = "\n* Extensions:\n";
+ $out = "<h2>Extensions</h2>\n";
+ $out .= wfOpenElement('table', array('id' => 'sv-ext') );
+
foreach ( $extensionTypes as $type => $text ) {
if ( count( @$wgExtensionCredits[$type] ) ) {
- $out .= "** $text:\n";
+ $out .= $this->openExtType( $text );
usort( $wgExtensionCredits[$type], array( $this, 'compare' ) );
@@ -119,30 +130,31 @@ class SpecialVersion {
}
if ( count( $wgExtensionFunctions ) ) {
- $out .= "** Extension functions:\n";
- $out .= '***' . $this->listToText( $wgExtensionFunctions ) . "\n";
+ $out .= $this->openExtType('Extension functions');
+ $out .= '<tr><td colspan="3">' . $this->listToText( $wgExtensionFunctions ) . "</td></tr>\n";
}
if ( $cnt = count( $tags = $wgParser->getTags() ) ) {
for ( $i = 0; $i < $cnt; ++$i )
$tags[$i] = "&lt;{$tags[$i]}&gt;";
- $out .= "** Parser extension tags:\n";
- $out .= '***' . $this->listToText( $tags ). "\n";
+ $out .= $this->openExtType('Parser extension tags');
+ $out .= '<tr><td colspan="3">' . $this->listToText( $tags ). "</td></tr>\n";
}
-
+
if( $cnt = count( $fhooks = $wgParser->getFunctionHooks() ) ) {
- $out .= "** Parser function hooks:\n";
- $out .= '***' . $this->listToText( $fhooks ) . "\n";
+ $out .= $this->openExtType('Parser function hooks');
+ $out .= '<tr><td colspan="3">' . $this->listToText( $fhooks ) . "</td></tr>\n";
}
if ( count( $wgSkinExtensionFunction ) ) {
- $out .= "** Skin extension functions:\n";
- $out .= '***' . $this->listToText( $wgSkinExtensionFunction ) . "\n";
+ $out .= $this->openExtType('Skin extension functions');
+ $out .= '<tr><td colspan="3">' . $this->listToText( $wgSkinExtensionFunction ) . "</td></tr>\n";
}
-
+ $out .= wfCloseElement( 'table' );
return $out;
}
+ /** Callback to sort extensions by type */
function compare( $a, $b ) {
if ( $a['name'] === $b['name'] )
return 0;
@@ -151,7 +163,7 @@ class SpecialVersion {
}
function formatCredits( $name, $version = null, $author = null, $url = null, $description = null) {
- $ret = '*** ';
+ $ret = '<tr><td>';
if ( isset( $url ) )
$ret .= "[$url ";
$ret .= "''$name";
@@ -160,13 +172,10 @@ class SpecialVersion {
$ret .= "''";
if ( isset( $url ) )
$ret .= ']';
- if ( isset( $description ) )
- $ret .= ', ' . $description;
- if ( isset( $description ) && isset( $author ) )
- $ret .= ', ';
- if ( isset( $author ) )
- $ret .= ' by ' . $this->listToText( (array)$author );
-
+ $ret .= '</td>';
+ $ret .= "<td>$description</td>";
+ $ret .= "<td>" . $this->listToText( (array)$author ) . "</td>";
+ $ret .= '</tr>';
return "$ret\n";
}
@@ -179,16 +188,36 @@ class SpecialVersion {
if ( count( $wgHooks ) ) {
$myWgHooks = $wgHooks;
ksort( $myWgHooks );
-
- $ret = "* Hooks:\n";
+
+ $ret = "<h2>Hooks</h2>\n"
+ . wfOpenElement('table', array('id' => 'sv-hooks') )
+ . "<tr><th>Hook name</th><th>Subscribed by</th></tr>\n";
+
foreach ($myWgHooks as $hook => $hooks)
- $ret .= "** $hook: " . $this->listToText( $hooks ) . "\n";
+ $ret .= "<tr><td>$hook</td><td>" . $this->listToText( $hooks ) . "</td></tr>\n";
+ $ret .= '</table>';
return $ret;
} else
return '';
}
+ private function openExtType($text, $name = null) {
+ $opt = array( 'colspan' => 3 );
+ $out = '';
+
+ if(!$this->firstExtOpened) {
+ // Insert a spacing line
+ $out .= '<tr class="sv-space">' . wfElement( 'td', $opt ) . "</tr>\n";
+ }
+ $this->firstExtOpened = false;
+
+ if($name) { $opt['id'] = "sv-$name"; }
+
+ $out .= "<tr>" . wfElement( 'th', $opt, $text) . "</tr>\n";
+ return $out;
+ }
+
/**
* @static
*
@@ -207,14 +236,16 @@ class SpecialVersion {
function listToText( $list ) {
$cnt = count( $list );
- if ( $cnt == 1 )
+ if ( $cnt == 1 ) {
// Enforce always returning a string
return (string)$this->arrayToString( $list[0] );
- else {
+ } elseif ( $cnt == 0 ) {
+ return '';
+ } else {
$t = array_slice( $list, 0, $cnt - 1 );
$one = array_map( array( &$this, 'arrayToString' ), $t );
$two = $this->arrayToString( $list[$cnt - 1] );
-
+
return implode( ', ', $one ) . " and $two";
}
}
@@ -227,9 +258,9 @@ class SpecialVersion {
* @return mixed
*/
function arrayToString( $list ) {
- if ( ! is_array( $list ) )
+ if ( ! is_array( $list ) ) {
return $list;
- else {
+ } else {
$class = get_class( $list[0] );
return "($class, {$list[1]})";
}
@@ -237,7 +268,7 @@ class SpecialVersion {
/**
* Retrieve the revision number of a Subversion working directory.
- *
+ *
* @bug 7335
*
* @param string $dir
@@ -281,8 +312,6 @@ class SpecialVersion {
// subversion is release 1.4
return intval( $content[3] );
}
-
- return false;
}
/**#@-*/
diff --git a/includes/SpecialWantedcategories.php b/includes/SpecialWantedcategories.php
index 97bb0a26..05ee7ec0 100644
--- a/includes/SpecialWantedcategories.php
+++ b/includes/SpecialWantedcategories.php
@@ -22,7 +22,7 @@ class WantedCategoriesPage extends QueryPage {
function getSQL() {
$dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'categorylinks', 'page' ) );
+ list( $categorylinks, $page ) = $dbr->tableNamesN( 'categorylinks', 'page' );
$name = $dbr->addQuotes( $this->getName() );
return
"
diff --git a/includes/SpecialWantedpages.php b/includes/SpecialWantedpages.php
index 7b070604..8e5cee3e 100644
--- a/includes/SpecialWantedpages.php
+++ b/includes/SpecialWantedpages.php
@@ -103,7 +103,7 @@ class WantedPagesPage extends QueryPage {
* @return string
*/
function makeWlhLink( &$title, &$skin, $text ) {
- $wlhTitle = Title::makeTitle( NS_SPECIAL, 'Whatlinkshere' );
+ $wlhTitle = SpecialPage::getTitleFor( 'Whatlinkshere' );
return $skin->makeKnownLinkObj( $wlhTitle, $text, 'target=' . $title->getPrefixedUrl() );
}
diff --git a/includes/SpecialWatchlist.php b/includes/SpecialWatchlist.php
index 87c925ac..33e19a2b 100644
--- a/includes/SpecialWatchlist.php
+++ b/includes/SpecialWatchlist.php
@@ -12,24 +12,23 @@ require_once( 'SpecialRecentchanges.php' );
/**
* Constructor
- * @todo Document $par parameter.
- * @param $par String: FIXME
+ *
+ * @param $par Parameter passed to the page
*/
function wfSpecialWatchlist( $par ) {
global $wgUser, $wgOut, $wgLang, $wgMemc, $wgRequest, $wgContLang;
- global $wgUseWatchlistCache, $wgWLCacheTimeout;
global $wgRCShowWatchingUsers, $wgEnotifWatchlist, $wgShowUpdatedMarker;
global $wgEnotifWatchlist;
$fname = 'wfSpecialWatchlist';
$skin =& $wgUser->getSkin();
- $specialTitle = Title::makeTitle( NS_SPECIAL, 'Watchlist' );
+ $specialTitle = SpecialPage::getTitleFor( 'Watchlist' );
$wgOut->setRobotPolicy( 'noindex,nofollow' );
# Anons don't get a watchlist
if( $wgUser->isAnon() ) {
$wgOut->setPageTitle( wfMsg( 'watchnologin' ) );
- $llink = $skin->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, 'Userlogin' ), wfMsgHtml( 'loginreqlink' ), 'returnto=' . $specialTitle->getPrefixedUrl() );
+ $llink = $skin->makeKnownLinkObj( SpecialPage::getTitleFor( 'Userlogin' ), wfMsgHtml( 'loginreqlink' ), 'returnto=' . $specialTitle->getPrefixedUrl() );
$wgOut->addHtml( wfMsgWikiHtml( 'watchlistanontext', $llink ) );
return;
} else {
@@ -45,6 +44,7 @@ function wfSpecialWatchlist( $par ) {
/* float */ 'days' => floatval( $wgUser->getOption( 'watchlistdays' ) ), /* 3.0 or 0.5, watch further below */
/* bool */ 'hideOwn' => (int)$wgUser->getBoolOption( 'watchlisthideown' ),
/* bool */ 'hideBots' => (int)$wgUser->getBoolOption( 'watchlisthidebots' ),
+ /* bool */ 'hideMinor' => (int)$wgUser->getBoolOption( 'watchlisthideminor' ),
/* ? */ 'namespace' => 'all',
);
@@ -55,12 +55,14 @@ function wfSpecialWatchlist( $par ) {
$prefs['days' ] = floatval( $wgUser->getOption( 'watchlistdays' ) );
$prefs['hideown' ] = $wgUser->getBoolOption( 'watchlisthideown' );
$prefs['hidebots'] = $wgUser->getBoolOption( 'watchlisthidebots' );
+ $prefs['hideminor'] = $wgUser->getBoolOption( 'watchlisthideminor' );
# Get query variables
- $days = $wgRequest->getVal( 'days', $prefs['days'] );
- $hideOwn = $wgRequest->getBool( 'hideOwn', $prefs['hideown'] );
+ $days = $wgRequest->getVal( 'days', $prefs['days'] );
+ $hideOwn = $wgRequest->getBool( 'hideOwn', $prefs['hideown'] );
$hideBots = $wgRequest->getBool( 'hideBots', $prefs['hidebots'] );
-
+ $hideMinor = $wgRequest->getBool( 'hideMinor', $prefs['hideminor'] );
+
# Get namespace value, if supplied, and prepare a WHERE fragment
$nameSpace = $wgRequest->getIntOrNull( 'namespace' );
if( !is_null( $nameSpace ) ) {
@@ -74,14 +76,14 @@ function wfSpecialWatchlist( $par ) {
# Watchlist editing
$action = $wgRequest->getVal( 'action' );
$remove = $wgRequest->getVal( 'remove' );
- $id = $wgRequest->getArray( 'id' );
+ $id = $wgRequest->getArray( 'id' );
$uid = $wgUser->getID();
if( $wgEnotifWatchlist && $wgRequest->getVal( 'reset' ) && $wgRequest->wasPosted() ) {
$wgUser->clearAllNotifications( $uid );
}
- # Deleting items from watchlist
+ # Deleting items from watchlist
if(($action == 'submit') && isset($remove) && is_array($id)) {
$wgOut->addWikiText( wfMsg( 'removingchecked' ) );
$wgOut->addHTML( '<p>' );
@@ -102,23 +104,13 @@ function wfSpecialWatchlist( $par ) {
$wgOut->addHTML( "</p>\n<p>" . wfMsg( 'wldone' ) . "</p>\n" );
}
- if ( $wgUseWatchlistCache ) {
- $memckey = wfMemcKey( 'watchlist', 'id', $wgUser->getId() );
- $cache_s = @$wgMemc->get( $memckey );
- if( $cache_s ){
- $wgOut->addWikiText( wfMsg('wlsaved') );
- $wgOut->addHTML( $cache_s );
- return;
- }
- }
-
- $dbr =& wfGetDB( DB_SLAVE );
- extract( $dbr->tableNames( 'page', 'revision', 'watchlist', 'recentchanges' ) );
+ $dbr =& wfGetDB( DB_SLAVE, 'watchlist' );
+ list( $page, $watchlist, $recentchanges ) = $dbr->tableNamesN( 'page', 'watchlist', 'recentchanges' );
$sql = "SELECT COUNT(*) AS n FROM $watchlist WHERE wl_user=$uid";
$res = $dbr->query( $sql, $fname );
$s = $dbr->fetchObject( $res );
-
+
# Patch *** A1 *** (see A2 below)
# adjust for page X, talk:page X, which are both stored separately, but treated together
$nitems = floor($s->n / 2);
@@ -144,27 +136,24 @@ function wfSpecialWatchlist( $par ) {
// Dump everything here
$nondefaults = array();
- wfAppendToArrayIfNotDefault( 'days', $days, $defaults, $nondefaults);
- wfAppendToArrayIfNotDefault( 'hideOwn', (int)$hideOwn, $defaults, $nondefaults);
- wfAppendToArrayIfNotDefault( 'hideBots', (int)$hideBots, $defaults, $nondefaults);
- wfAppendToArrayIfNotDefault( 'namespace', $nameSpace, $defaults, $nondefaults );
+ wfAppendToArrayIfNotDefault('days' , $days , $defaults, $nondefaults);
+ wfAppendToArrayIfNotDefault('hideOwn' , (int)$hideOwn , $defaults, $nondefaults);
+ wfAppendToArrayIfNotDefault('hideBots' , (int)$hideBots, $defaults, $nondefaults);
+ wfAppendToArrayIfNotDefault( 'hideMinor', (int)$hideMinor, $defaults, $nondefaults );
+ wfAppendToArrayIfNotDefault('namespace', $nameSpace , $defaults, $nondefaults);
if ( $days <= 0 ) {
- $docutoff = '';
- $cutoff = false;
+ $andcutoff = '';
$npages = wfMsg( 'watchlistall1' );
} else {
- $docutoff = "AND rev_timestamp > '" .
- ( $cutoff = $dbr->timestamp( time() - intval( $days * 86400 ) ) )
- . "'";
- /*
- $sql = "SELECT COUNT(*) AS n FROM $page, $revision WHERE rev_timestamp>'$cutoff' AND page_id=rev_page";
- $res = $dbr->query( $sql, $fname );
- $s = $dbr->fetchObject( $res );
- $npages = $s->n;
- */
- $npages = 40000 * $days;
-
+ $andcutoff = "AND rc_timestamp > '".$dbr->timestamp( time() - intval( $days * 86400 ) )."'";
+ /*
+ $sql = "SELECT COUNT(*) AS n FROM $page, $revision WHERE rev_timestamp>'$cutoff' AND page_id=rev_page";
+ $res = $dbr->query( $sql, $fname );
+ $s = $dbr->fetchObject( $res );
+ $npages = $s->n;
+ */
+ $npages = 40000 * $days;
}
/* Edit watchlist form */
@@ -182,15 +171,16 @@ function wfSpecialWatchlist( $par ) {
$sql = "SELECT wl_namespace, wl_title, page_is_redirect FROM $watchlist LEFT JOIN $page ON wl_namespace = page_namespace AND wl_title = page_title WHERE wl_user=$uid";
$res = $dbr->query( $sql, $fname );
-
+
# Batch existence check
$linkBatch = new LinkBatch();
while( $row = $dbr->fetchObject( $res ) )
$linkBatch->addObj( Title::makeTitleSafe( $row->wl_namespace, $row->wl_title ) );
$linkBatch->execute();
+
if( $dbr->numRows( $res ) > 0 )
$dbr->dataSeek( $res, 0 ); # Let's do the time warp again!
-
+
$sk = $wgUser->getSkin();
$list = array();
@@ -215,7 +205,6 @@ function wfSpecialWatchlist( $par ) {
} else {
global $wgContLang;
$toolLinks = array();
- $titleText = $titleObj->getPrefixedText();
$pageLink = $sk->makeLinkObj( $titleObj );
$toolLinks[] = $sk->makeLinkObj( $titleObj->getTalkPage(), $wgLang->getNsText( NS_TALK ) );
if( $titleObj->exists() )
@@ -228,7 +217,7 @@ function wfSpecialWatchlist( $par ) {
} else {
$spanopen = $spanclosed = '';
}
-
+
$wgOut->addHTML( "<li>{$checkbox}{$spanopen}{$pageLink}{$spanclosed} {$toolLinks}</li>\n" );
}
}
@@ -253,6 +242,7 @@ function wfSpecialWatchlist( $par ) {
# Toggles
$andHideOwn = $hideOwn ? "AND (rc_user <> $uid)" : '';
$andHideBots = $hideBots ? "AND (rc_bot = 0)" : '';
+ $andHideMinor = $hideMinor ? 'AND rc_minor = 0' : '';
# Show watchlist header
$header = '';
@@ -265,7 +255,7 @@ function wfSpecialWatchlist( $par ) {
# Toggle watchlist content (all recent edits or just the latest)
if( $wgUser->getOption( 'extendwatchlist' )) {
- $andLatest='';
+ $andLatest='';
$limitWatchlist = 'LIMIT ' . intval( $wgUser->getOption( 'wllimit' ) );
} else {
$andLatest= 'AND rc_this_oldid=page_latest';
@@ -287,23 +277,17 @@ function wfSpecialWatchlist( $par ) {
"\n\n" );
}
- $sql = "SELECT
- rc_namespace AS page_namespace, rc_title AS page_title,
- rc_comment AS rev_comment, rc_cur_id AS page_id,
- rc_user AS rev_user, rc_user_text AS rev_user_text,
- rc_timestamp AS rev_timestamp, rc_minor AS rev_minor_edit,
- rc_this_oldid AS rev_id,
- rc_last_oldid, rc_id, rc_patrolled,
- rc_new AS page_is_new,wl_notificationtimestamp
+ $sql = "SELECT *
FROM $watchlist,$recentchanges,$page
WHERE wl_user=$uid
AND wl_namespace=rc_namespace
AND wl_title=rc_title
- AND rc_timestamp > '$cutoff'
AND rc_cur_id=page_id
+ $andcutoff
$andLatest
$andHideOwn
$andHideBots
+ $andHideMinor
$nameSpaceClause
ORDER BY rc_timestamp DESC
$limitWatchlist";
@@ -325,40 +309,45 @@ function wfSpecialWatchlist( $par ) {
$wgOut->addHTML( "\n" . wlCutoffLinks( $days, 'Watchlist', $nondefaults ) . "<br />\n" );
# Spit out some control panel links
- $thisTitle = Title::makeTitle( NS_SPECIAL, 'Watchlist' );
+ $thisTitle = SpecialPage::getTitleFor( 'Watchlist' );
$skin = $wgUser->getSkin();
- $linkElements = array( 'hideOwn' => 'wlhideshowown', 'hideBots' => 'wlhideshowbots' );
-
- # Problems encountered using the fancier method
- $label = $hideBots ? wfMsgHtml( 'show' ) : wfMsgHtml( 'hide' );
- $linkBits = wfArrayToCGI( array( 'hideBots' => 1 - (int)$hideBots ), $nondefaults );
- $link = $skin->makeKnownLinkObj( $thisTitle, $label, $linkBits );
- $links[] = wfMsgHtml( 'wlhideshowbots', $link );
- $label = $hideOwn ? wfMsgHtml( 'show' ) : wfMsgHtml( 'hide' );
+ # Hide/show bot edits
+ $label = $hideBots ? wfMsgHtml( 'watchlist-show-bots' ) : wfMsgHtml( 'watchlist-hide-bots' );
+ $linkBits = wfArrayToCGI( array( 'hideBots' => 1 - (int)$hideBots ), $nondefaults );
+ $links[] = $skin->makeKnownLinkObj( $thisTitle, $label, $linkBits );
+
+ # Hide/show own edits
+ $label = $hideOwn ? wfMsgHtml( 'watchlist-show-own' ) : wfMsgHtml( 'watchlist-hide-own' );
$linkBits = wfArrayToCGI( array( 'hideOwn' => 1 - (int)$hideOwn ), $nondefaults );
- $link = $skin->makeKnownLinkObj( $thisTitle, $label, $linkBits );
- $links[] = wfMsgHtml( 'wlhideshowown', $link );
+ $links[] = $skin->makeKnownLinkObj( $thisTitle, $label, $linkBits );
+
+ # Hide/show minor edits
+ $label = $hideMinor ? wfMsgHtml( 'watchlist-show-minor' ) : wfMsgHtml( 'watchlist-hide-minor' );
+ $linkBits = wfArrayToCGI( array( 'hideMinor' => 1 - (int)$hideMinor ), $nondefaults );
+ $links[] = $skin->makeKnownLinkObj( $thisTitle, $label, $linkBits );
$wgOut->addHTML( implode( ' | ', $links ) );
# Form for namespace filtering
- $wgOut->addHTML( "\n" .
- wfOpenElement( 'form', array(
- 'method' => 'post',
- 'action' => $thisTitle->getLocalURL(),
- ) ) .
- wfMsgExt( 'namespace', array( 'parseinline') ) .
- HTMLnamespaceselector( $nameSpace, '' ) . "\n" .
- ( $hideOwn ? wfHidden('hideown', 1)."\n" : '' ) .
- ( $hideBots ? wfHidden('hidebots', 1)."\n" : '' ) .
- wfHidden( 'days', $days ) . "\n" .
- wfSubmitButton( wfMsgExt( 'allpagessubmit', array( 'escape') ) ) . "\n" .
- wfCloseElement( 'form' ) . "\n"
- );
-
- if ( $numRows == 0 ) {
- $wgOut->addWikitext( "<br />" . wfMsg( 'watchnochange' ), false );
+ $form = Xml::openElement( 'form', array( 'method' => 'post', 'action' => $thisTitle->getLocalUrl() ) );
+ $form .= '<p>';
+ $form .= Xml::label( wfMsg( 'namespace' ), 'namespace' ) . '&nbsp;';
+ $form .= Xml::namespaceSelector( $nameSpace, '' ) . '&nbsp;';
+ $form .= Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . '</p>';
+ $form .= Xml::hidden( 'days', $days );
+ if( $hideOwn )
+ $form .= Xml::hidden( 'hideOwn', 1 );
+ if( $hideBots )
+ $form .= Xml::hidden( 'hideBots', 1 );
+ if( $hideMinor )
+ $form .= Xml::hidden( 'hideMinor', 1 );
+ $form .= Xml::closeElement( 'form' );
+ $wgOut->addHtml( $form );
+
+ # If there's nothing to show, stop here
+ if( $numRows == 0 ) {
+ $wgOut->addWikiText( wfMsgNoTrans( 'watchnochange' ) );
return;
}
@@ -369,8 +358,8 @@ function wfSpecialWatchlist( $par ) {
$s = $list->beginRecentChangesList();
$counter = 1;
while ( $obj = $dbr->fetchObject( $res ) ) {
- # Make fake RC entry
- $rc = RecentChange::newFromCurRow( $obj, $obj->rc_last_oldid );
+ # Make RC entry
+ $rc = RecentChange::newFromRow( $obj );
$rc->counter = $counter++;
if ( $wgShowUpdatedMarker ) {
@@ -381,8 +370,8 @@ function wfSpecialWatchlist( $par ) {
}
if ($wgRCShowWatchingUsers && $wgUser->getOption( 'shownumberswatching' )) {
- $sql3 = "SELECT COUNT(*) AS n FROM $watchlist WHERE wl_title='" .wfStrencode($obj->page_title). "' AND wl_namespace='{$obj->page_namespace}'" ;
- $res3 = $dbr->query( $sql3, DB_READ, $fname );
+ $sql3 = "SELECT COUNT(*) AS n FROM $watchlist WHERE wl_title='" .$dbr->strencode($obj->page_title). "' AND wl_namespace='{$obj->page_namespace}'" ;
+ $res3 = $dbr->query( $sql3, $fname );
$x = $dbr->fetchObject( $res3 );
$rc->numberofWatchingusers = $x->n;
} else {
@@ -396,10 +385,6 @@ function wfSpecialWatchlist( $par ) {
$dbr->freeResult( $res );
$wgOut->addHTML( $s );
- if ( $wgUseWatchlistCache ) {
- $wgMemc->set( $memckey, $s, $wgWLCacheTimeout);
- }
-
}
function wlHoursLink( $h, $page, $options = array() ) {
@@ -428,7 +413,6 @@ function wlDaysLink( $d, $page, $options = array() ) {
function wlCutoffLinks( $days, $page = 'Watchlist', $options = array() ) {
$hours = array( 1, 2, 6, 12 );
$days = array( 1, 3, 7 );
- $cl = '';
$i = 0;
foreach( $hours as $h ) {
$hours[$i++] = wlHoursLink( $h, $page, $options );
@@ -451,19 +435,19 @@ function wlCutoffLinks( $days, $page = 'Watchlist', $options = array() ) {
* @return integer
*/
function wlCountItems( &$user, $talk = true ) {
- $dbr =& wfGetDB( DB_SLAVE );
-
+ $dbr =& wfGetDB( DB_SLAVE, 'watchlist' );
+
# Fetch the raw count
$res = $dbr->select( 'watchlist', 'COUNT(*) AS count', array( 'wl_user' => $user->mId ), 'wlCountItems' );
$row = $dbr->fetchObject( $res );
$count = $row->count;
$dbr->freeResult( $res );
-
+
# Halve to remove talk pages if needed
if( !$talk )
$count = floor( $count / 2 );
-
- return( $count );
+
+ return( $count );
}
/**
@@ -493,7 +477,7 @@ function wlHandleClear( &$out, &$request, $par ) {
$out->returnToMain();
} else {
# Confirming, so show a form
- $wlTitle = Title::makeTitle( NS_SPECIAL, 'Watchlist' );
+ $wlTitle = SpecialPage::getTitleFor( 'Watchlist' );
$out->addHTML( wfElement( 'form', array( 'method' => 'post', 'action' => $wlTitle->getLocalUrl( 'action=clear' ) ), NULL ) );
$out->addWikiText( wfMsgExt( 'watchlistcount', array( 'parsemag', 'escape'), $wgLang->formatNum( $count ) ) );
$out->addWikiText( wfMsg( 'watchlistcleartext' ) );
diff --git a/includes/SpecialWhatlinkshere.php b/includes/SpecialWhatlinkshere.php
index a95530fe..bed783f8 100644
--- a/includes/SpecialWhatlinkshere.php
+++ b/includes/SpecialWhatlinkshere.php
@@ -57,8 +57,6 @@ class WhatLinksHerePage {
$wgOut->setPagetitle( $this->target->getPrefixedText() );
$wgOut->setSubtitle( wfMsg( 'linklistsub' ) );
- $isredir = ' (' . wfMsg( 'isredirect' ) . ")\n";
-
$wgOut->addHTML( wfMsg( 'whatlinkshere-barrow' ) . ' ' .$this->skin->makeLinkObj($this->target, '', 'redirect=no' )."<br />\n");
$this->showIndirectLinks( 0, $this->target, $this->limit, $this->from, $this->dir );
@@ -78,8 +76,6 @@ class WhatLinksHerePage {
$dbr =& wfGetDB( DB_READ );
- extract( $dbr->tableNames( 'pagelinks', 'templatelinks', 'page' ) );
-
// Some extra validation
$from = intval( $from );
if ( !$from && $dir == 'prev' ) {
diff --git a/includes/SquidUpdate.php b/includes/SquidUpdate.php
index 37d97e01..2e2a4a5d 100644
--- a/includes/SquidUpdate.php
+++ b/includes/SquidUpdate.php
@@ -29,8 +29,6 @@ class SquidUpdate {
wfProfileIn( $fname );
# Get a list of URLs linking to this page
- $id = $title->getArticleID();
-
$dbr =& wfGetDB( DB_SLAVE );
$res = $dbr->select( array( 'links', 'page' ),
array( 'page_namespace', 'page_title' ),
@@ -201,9 +199,11 @@ class SquidUpdate {
$htcpOpCLR = 4; // HTCP CLR
// FIXME PHP doesn't support these socket constants (include/linux/in.h)
- define( "IPPROTO_IP", 0 );
- define( "IP_MULTICAST_LOOP", 34 );
- define( "IP_MULTICAST_TTL", 33 );
+ if( !defined( "IPPROTO_IP" ) ) {
+ define( "IPPROTO_IP", 0 );
+ define( "IP_MULTICAST_LOOP", 34 );
+ define( "IP_MULTICAST_TTL", 33 );
+ }
// pfsockopen doesn't work because we need set_sock_opt
$conn = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
@@ -215,6 +215,9 @@ class SquidUpdate {
$wgHTCPMulticastTTL );
foreach ( $urlArr as $url ) {
+ if( !is_string( $url ) ) {
+ wfDebugDieBacktrace( 'Bad purge URL' );
+ }
$url = SquidUpdate::expand( $url );
// Construct a minimal HTCP request diagram
@@ -223,7 +226,7 @@ class SquidUpdate {
$htcpTransID = rand();
$htcpSpecifier = pack( 'na4na*na8n',
- 4, 'NONE', strlen( $url ), $url,
+ 4, 'HEAD', strlen( $url ), $url,
8, 'HTTP/1.0', 0 );
$htcpDataLen = 8 + 2 + strlen( $htcpSpecifier );
diff --git a/includes/StreamFile.php b/includes/StreamFile.php
index 81538a84..949422d6 100644
--- a/includes/StreamFile.php
+++ b/includes/StreamFile.php
@@ -6,25 +6,23 @@ function wfStreamFile( $fname ) {
$stat = @stat( $fname );
if ( !$stat ) {
header( 'HTTP/1.0 404 Not Found' );
+ header( 'Cache-Control: no-cache' );
+ header( 'Content-Type: text/html' );
$encFile = htmlspecialchars( $fname );
$encScript = htmlspecialchars( $_SERVER['SCRIPT_NAME'] );
echo "<html><body>
<h1>File not found</h1>
<p>Although this PHP script ($encScript) exists, the file requested for output
($encFile) does not.</p>
-</body></html>";
+</body></html>
+";
return;
}
header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s', $stat['mtime'] ) . ' GMT' );
// Cancel output buffering and gzipping if set
- while( $status = ob_get_status() ) {
- ob_end_clean();
- if( $status['name'] == 'ob_gzhandler' ) {
- header( 'Content-Encoding:' );
- }
- }
+ wfResetOutputBuffers();
$type = wfGetType( $fname );
if ( $type and $type!="unknown/unknown") {
diff --git a/includes/StringUtils.php b/includes/StringUtils.php
new file mode 100644
index 00000000..0090604d
--- /dev/null
+++ b/includes/StringUtils.php
@@ -0,0 +1,301 @@
+<?php
+
+class StringUtils {
+ /**
+ * Perform an operation equivalent to
+ *
+ * preg_replace( "!$startDelim(.*?)$endDelim!", $replace, $subject );
+ *
+ * except that it's worst-case O(N) instead of O(N^2)
+ *
+ * Compared to delimiterReplace(), this implementation is fast but memory-
+ * hungry and inflexible. The memory requirements are such that I don't
+ * recommend using it on anything but guaranteed small chunks of text.
+ */
+ static function hungryDelimiterReplace( $startDelim, $endDelim, $replace, $subject ) {
+ $segments = explode( $startDelim, $subject );
+ $output = array_shift( $segments );
+ foreach ( $segments as $s ) {
+ $endDelimPos = strpos( $s, $endDelim );
+ if ( $endDelimPos === false ) {
+ $output .= $startDelim . $s;
+ } else {
+ $output .= $replace . substr( $s, $endDelimPos + strlen( $endDelim ) );
+ }
+ }
+ return $output;
+ }
+
+ /**
+ * Perform an operation equivalent to
+ *
+ * preg_replace_callback( "!$startDelim(.*)$endDelim!s$flags", $callback, $subject )
+ *
+ * This implementation is slower than hungryDelimiterReplace but uses far less
+ * memory. The delimiters are literal strings, not regular expressions.
+ *
+ * @param string $flags Regular expression flags
+ */
+ # If the start delimiter ends with an initial substring of the end delimiter,
+ # e.g. in the case of C-style comments, the behaviour differs from the model
+ # regex. In this implementation, the end must share no characters with the
+ # start, so e.g. /*/ is not considered to be both the start and end of a
+ # comment. /*/xy/*/ is considered to be a single comment with contents /xy/.
+ static function delimiterReplaceCallback( $startDelim, $endDelim, $callback, $subject, $flags = '' ) {
+ $inputPos = 0;
+ $outputPos = 0;
+ $output = '';
+ $foundStart = false;
+ $encStart = preg_quote( $startDelim, '!' );
+ $encEnd = preg_quote( $endDelim, '!' );
+ $strcmp = strpos( $flags, 'i' ) === false ? 'strcmp' : 'strcasecmp';
+ $endLength = strlen( $endDelim );
+ $m = array();
+
+ while ( $inputPos < strlen( $subject ) &&
+ preg_match( "!($encStart)|($encEnd)!S$flags", $subject, $m, PREG_OFFSET_CAPTURE, $inputPos ) )
+ {
+ $tokenOffset = $m[0][1];
+ if ( $m[1][0] != '' ) {
+ if ( $foundStart &&
+ $strcmp( $endDelim, substr( $subject, $tokenOffset, $endLength ) ) == 0 )
+ {
+ # An end match is present at the same location
+ $tokenType = 'end';
+ $tokenLength = $endLength;
+ } else {
+ $tokenType = 'start';
+ $tokenLength = strlen( $m[0][0] );
+ }
+ } elseif ( $m[2][0] != '' ) {
+ $tokenType = 'end';
+ $tokenLength = strlen( $m[0][0] );
+ } else {
+ throw new MWException( 'Invalid delimiter given to ' . __METHOD__ );
+ }
+
+ if ( $tokenType == 'start' ) {
+ $inputPos = $tokenOffset + $tokenLength;
+ # Only move the start position if we haven't already found a start
+ # This means that START START END matches outer pair
+ if ( !$foundStart ) {
+ # Found start
+ # Write out the non-matching section
+ $output .= substr( $subject, $outputPos, $tokenOffset - $outputPos );
+ $outputPos = $tokenOffset;
+ $contentPos = $inputPos;
+ $foundStart = true;
+ }
+ } elseif ( $tokenType == 'end' ) {
+ if ( $foundStart ) {
+ # Found match
+ $output .= call_user_func( $callback, array(
+ substr( $subject, $outputPos, $tokenOffset + $tokenLength - $outputPos ),
+ substr( $subject, $contentPos, $tokenOffset - $contentPos )
+ ));
+ $foundStart = false;
+ } else {
+ # Non-matching end, write it out
+ $output .= substr( $subject, $inputPos, $tokenOffset + $tokenLength - $outputPos );
+ }
+ $inputPos = $outputPos = $tokenOffset + $tokenLength;
+ } else {
+ throw new MWException( 'Invalid delimiter given to ' . __METHOD__ );
+ }
+ }
+ if ( $outputPos < strlen( $subject ) ) {
+ $output .= substr( $subject, $outputPos );
+ }
+ return $output;
+ }
+
+ /*
+ * Perform an operation equivalent to
+ *
+ * preg_replace( "!$startDelim(.*)$endDelim!$flags", $replace, $subject )
+ *
+ * @param string $startDelim Start delimiter regular expression
+ * @param string $endDelim End delimiter regular expression
+ * @param string $replace Replacement string. May contain $1, which will be
+ * replaced by the text between the delimiters
+ * @param string $subject String to search
+ * @return string The string with the matches replaced
+ */
+ static function delimiterReplace( $startDelim, $endDelim, $replace, $subject, $flags = '' ) {
+ $replacer = new RegexlikeReplacer( $replace );
+ return self::delimiterReplaceCallback( $startDelim, $endDelim,
+ $replacer->cb(), $subject, $flags );
+ }
+
+ /**
+ * More or less "markup-safe" explode()
+ * Ignores any instances of the separator inside <...>
+ * @param string $separator
+ * @param string $text
+ * @return array
+ */
+ static function explodeMarkup( $separator, $text ) {
+ $placeholder = "\x00";
+
+ // Remove placeholder instances
+ $text = str_replace( $placeholder, '', $text );
+
+ // Replace instances of the separator inside HTML-like tags with the placeholder
+ $replacer = new DoubleReplacer( $separator, $placeholder );
+ $cleaned = StringUtils::delimiterReplaceCallback( '<', '>', $replacer->cb(), $text );
+
+ // Explode, then put the replaced separators back in
+ $items = explode( $separator, $cleaned );
+ foreach( $items as $i => $str ) {
+ $items[$i] = str_replace( $placeholder, $separator, $str );
+ }
+
+ return $items;
+ }
+
+ /**
+ * Escape a string to make it suitable for inclusion in a preg_replace()
+ * replacement parameter.
+ *
+ * @param string $string
+ * @return string
+ */
+ static function escapeRegexReplacement( $string ) {
+ $string = str_replace( '\\', '\\\\', $string );
+ $string = str_replace( '$', '\\$', $string );
+ return $string;
+ }
+}
+
+/**
+ * Base class for "replacers", objects used in preg_replace_callback() and
+ * StringUtils::delimiterReplaceCallback()
+ */
+class Replacer {
+ function cb() {
+ return array( &$this, 'replace' );
+ }
+}
+
+/**
+ * Class to replace regex matches with a string similar to that used in preg_replace()
+ */
+class RegexlikeReplacer extends Replacer {
+ var $r;
+ function __construct( $r ) {
+ $this->r = $r;
+ }
+
+ function replace( $matches ) {
+ $pairs = array();
+ foreach ( $matches as $i => $match ) {
+ $pairs["\$$i"] = $match;
+ }
+ return strtr( $this->r, $pairs );
+ }
+
+}
+
+/**
+ * Class to perform secondary replacement within each replacement string
+ */
+class DoubleReplacer extends Replacer {
+ function __construct( $from, $to, $index = 0 ) {
+ $this->from = $from;
+ $this->to = $to;
+ $this->index = $index;
+ }
+
+ function replace( $matches ) {
+ return str_replace( $this->from, $this->to, $matches[$this->index] );
+ }
+}
+
+/**
+ * Class to perform replacement based on a simple hashtable lookup
+ */
+class HashtableReplacer extends Replacer {
+ var $table, $index;
+
+ function __construct( $table, $index = 0 ) {
+ $this->table = $table;
+ $this->index = $index;
+ }
+
+ function replace( $matches ) {
+ return $this->table[$matches[$this->index]];
+ }
+}
+
+/**
+ * Replacement array for FSS with fallback to strtr()
+ * Supports lazy initialisation of FSS resource
+ */
+class ReplacementArray {
+ /*mostly private*/ var $data = false;
+ /*mostly private*/ var $fss = false;
+
+ /**
+ * Create an object with the specified replacement array
+ * The array should have the same form as the replacement array for strtr()
+ */
+ function __construct( $data = array() ) {
+ $this->data = $data;
+ }
+
+ function __sleep() {
+ return array( 'data' );
+ }
+
+ function __wakeup() {
+ $this->fss = false;
+ }
+
+ /**
+ * Set the whole replacement array at once
+ */
+ function setArray( $data ) {
+ $this->data = $data;
+ $this->fss = false;
+ }
+
+ function getArray() {
+ return $this->data;
+ }
+
+ /**
+ * Set an element of the replacement array
+ */
+ function setPair( $from, $to ) {
+ $this->data[$from] = $to;
+ $this->fss = false;
+ }
+
+ function mergeArray( $data ) {
+ $this->data = array_merge( $this->data, $data );
+ $this->fss = false;
+ }
+
+ function merge( $other ) {
+ $this->data = array_merge( $this->data, $other->data );
+ $this->fss = false;
+ }
+
+ function replace( $subject ) {
+ if ( function_exists( 'fss_prep_replace' ) ) {
+ wfProfileIn( __METHOD__.'-fss' );
+ if ( $this->fss === false ) {
+ $this->fss = fss_prep_replace( $this->data );
+ }
+ $result = fss_exec_replace( $this->fss, $subject );
+ wfProfileOut( __METHOD__.'-fss' );
+ } else {
+ wfProfileIn( __METHOD__.'-strtr' );
+ $result = strtr( $subject, $this->data );
+ wfProfileOut( __METHOD__.'-strtr' );
+ }
+ return $result;
+ }
+}
+
+?>
diff --git a/includes/StubObject.php b/includes/StubObject.php
index 63945f27..1501d963 100644
--- a/includes/StubObject.php
+++ b/includes/StubObject.php
@@ -89,9 +89,16 @@ class StubUserLang extends StubObject {
function _newObject() {
global $wgContLanguageCode, $wgRequest, $wgUser, $wgContLang;
- $code = $wgRequest->getVal('uselang', '');
- if ($code == '')
- $code = $wgUser->getOption('language');
+ $code = $wgRequest->getVal('uselang', $wgUser->getOption('language') );
+
+ // if variant is explicitely selected, use it instead the one from wgUser
+ // see bug #7605
+ if($wgContLang->hasVariants()){
+ $variant = $wgContLang->getPreferredVariant();
+ if($variant != $wgContLanguageCode)
+ $code = $variant;
+ }
+
# Validate $code
if( empty( $code ) || !preg_match( '/^[a-z]+(-[a-z]+)?$/', $code ) ) {
$code = $wgContLanguageCode;
@@ -118,9 +125,8 @@ class StubUser extends StubObject {
global $wgCommandLineMode;
if( $wgCommandLineMode ) {
$user = new User;
- $user->setLoaded( true );
} else {
- $user = User::loadFromSession();
+ $user = User::newFromSession();
wfRunHooks('AutoAuthenticate',array(&$user));
}
return $user;
diff --git a/includes/Title.php b/includes/Title.php
index 4a5e7156..56414c8a 100644
--- a/includes/Title.php
+++ b/includes/Title.php
@@ -109,8 +109,6 @@ class Title {
* @access public
*/
public static function newFromText( $text, $defaultNamespace = NS_MAIN ) {
- $fname = 'Title::newFromText';
-
if( is_object( $text ) ) {
throw new MWException( 'Title::newFromText given an object' );
}
@@ -162,7 +160,7 @@ class Title {
* @static
* @access public
*/
- function newFromURL( $url ) {
+ public static function newFromURL( $url ) {
global $wgLegalTitleChars;
$t = new Title();
@@ -192,7 +190,7 @@ class Title {
* @access public
* @static
*/
- function newFromID( $id ) {
+ public static function newFromID( $id ) {
$fname = 'Title::newFromID';
$dbr =& wfGetDB( DB_SLAVE );
$row = $dbr->selectRow( 'page', array( 'page_namespace', 'page_title' ),
@@ -289,6 +287,7 @@ class Title {
$mwRedir = MagicWord::get( 'redirect' );
$rt = NULL;
if ( $mwRedir->matchStart( $text ) ) {
+ $m = array();
if ( preg_match( '/\[{2}(.*?)(?:\||\]{2})/', $text, $m ) ) {
# categories are escaped using : for example one can enter:
# #REDIRECT [[:Category:Music]]. Need to remove it.
@@ -299,7 +298,7 @@ class Title {
$rt = Title::newFromText( $m[1] );
# Disallow redirects to Special:Userlogout
- if ( !is_null($rt) && $rt->getNamespace() == NS_SPECIAL && preg_match( '/^Userlogout/i', $rt->getText() ) ) {
+ if ( !is_null($rt) && $rt->isSpecial( 'Userlogout' ) ) {
$rt = NULL;
}
}
@@ -540,7 +539,7 @@ class Title {
foreach ( $titles as $title ) {
if ( $wgUseFileCache ) {
- $cm = new CacheManager($title);
+ $cm = new HTMLFileCache($title);
@unlink($cm->fileCacheName());
}
@@ -568,6 +567,19 @@ class Title {
}
}
+ /**
+ * Escape a text fragment, say from a link, for a URL
+ */
+ static function escapeFragmentForURL( $fragment ) {
+ $fragment = str_replace( ' ', '_', $fragment );
+ $fragment = urlencode( Sanitizer::decodeCharReferences( $fragment ) );
+ $replaceArray = array(
+ '%3A' => ':',
+ '%' => '.'
+ );
+ return strtr( $fragment, $replaceArray );
+ }
+
#----------------------------------------------------------------------------
# Other stuff
#----------------------------------------------------------------------------
@@ -603,7 +615,19 @@ class Title {
* @access public
*/
function getNsText() {
- global $wgContLang;
+ global $wgContLang, $wgCanonicalNamespaceNames;
+
+ if ( '' != $this->mInterwiki ) {
+ // This probably shouldn't even happen. ohh man, oh yuck.
+ // But for interwiki transclusion it sometimes does.
+ // Shit. Shit shit shit.
+ //
+ // Use the canonical namespaces if possible to try to
+ // resolve a foreign namespace.
+ if( isset( $wgCanonicalNamespaceNames[$this->mNamespace] ) ) {
+ return $wgCanonicalNamespaceNames[$this->mNamespace];
+ }
+ }
return $wgContLang->getNsText( $this->mNamespace );
}
/**
@@ -640,12 +664,25 @@ class Title {
*/
function getInterwiki() { return $this->mInterwiki; }
/**
- * Get the Title fragment (i.e. the bit after the #)
+ * Get the Title fragment (i.e. the bit after the #) in text form
* @return string
* @access public
*/
function getFragment() { return $this->mFragment; }
/**
+ * Get the fragment in URL form, including the "#" character if there is one
+ *
+ * @return string
+ * @access public
+ */
+ function getFragmentForURL() {
+ if ( $this->mFragment == '' ) {
+ return '';
+ } else {
+ return '#' . Title::escapeFragmentForURL( $this->mFragment );
+ }
+ }
+ /**
* Get the default namespace index, for when there is no namespace
* @return int
* @access public
@@ -769,14 +806,15 @@ class Title {
*
* @param string $query an optional query string, not used
* for interwiki links
+ * @param string $variant language variant of url (for sr, zh..)
* @return string the URL
* @access public
*/
- function getFullURL( $query = '' ) {
+ function getFullURL( $query = '', $variant = false ) {
global $wgContLang, $wgServer, $wgRequest;
if ( '' == $this->mInterwiki ) {
- $url = $this->getLocalUrl( $query );
+ $url = $this->getLocalUrl( $query, $variant );
// Ugly quick hack to avoid duplicate prefixes (bug 4571 etc)
// Correct fix would be to move the prepending elsewhere.
@@ -786,9 +824,10 @@ class Title {
} else {
$baseUrl = $this->getInterwikiLink( $this->mInterwiki );
- $namespace = $wgContLang->getNsText( $this->mNamespace );
+ $namespace = wfUrlencode( $this->getNsText() );
if ( '' != $namespace ) {
# Can this actually happen? Interwikis shouldn't be parsed.
+ # Yes! It can in interwiki transclusion. But... it probably shouldn't.
$namespace .= ':';
}
$url = str_replace( '$1', $namespace . $this->mUrlform, $baseUrl );
@@ -803,9 +842,7 @@ class Title {
}
# Finally, add the fragment.
- if ( '' != $this->mFragment ) {
- $url .= '#' . $this->mFragment;
- }
+ $url .= $this->getFragmentForURL();
wfRunHooks( 'GetFullURL', array( &$this, &$url, $query ) );
return $url;
@@ -816,11 +853,20 @@ class Title {
* with action=render, $wgServer is prepended.
* @param string $query an optional query string; if not specified,
* $wgArticlePath will be used.
+ * @param string $variant language variant of url (for sr, zh..)
* @return string the URL
* @access public
*/
- function getLocalURL( $query = '' ) {
+ function getLocalURL( $query = '', $variant = false ) {
global $wgArticlePath, $wgScript, $wgServer, $wgRequest;
+ global $wgVariantArticlePath, $wgContLang, $wgUser;
+
+ // internal links should point to same variant as current page (only anonymous users)
+ if($variant == false && $wgContLang->hasVariants() && !$wgUser->isLoggedIn()){
+ $pref = $wgContLang->getPreferredVariant(false);
+ if($pref != $wgContLang->getCode())
+ $variant = $pref;
+ }
if ( $this->isExternal() ) {
$url = $this->getFullURL();
@@ -834,10 +880,22 @@ class Title {
} else {
$dbkey = wfUrlencode( $this->getPrefixedDBkey() );
if ( $query == '' ) {
- $url = str_replace( '$1', $dbkey, $wgArticlePath );
+ if($variant!=false && $wgContLang->hasVariants()){
+ if($wgVariantArticlePath==false)
+ $variantArticlePath = "$wgScript?title=$1&variant=$2"; // default
+ else
+ $variantArticlePath = $wgVariantArticlePath;
+
+ $url = str_replace( '$2', urlencode( $variant ), $variantArticlePath );
+ $url = str_replace( '$1', $dbkey, $url );
+
+ }
+ else
+ $url = str_replace( '$1', $dbkey, $wgArticlePath );
} else {
global $wgActionPaths;
$url = false;
+ $matches = array();
if( !empty( $wgActionPaths ) &&
preg_match( '/^(.*&|)action=([^&]*)(&(.*)|)$/', $query, $matches ) )
{
@@ -896,12 +954,13 @@ class Title {
* internal hostname for the server from the exposed one.
*
* @param string $query an optional query string
+ * @param string $variant language variant of url (for sr, zh..)
* @return string the URL
* @access public
*/
- function getInternalURL( $query = '' ) {
+ function getInternalURL( $query = '', $variant = false ) {
global $wgInternalServer;
- $url = $wgInternalServer . $this->getLocalURL( $query );
+ $url = $wgInternalServer . $this->getLocalURL( $query, $variant );
wfRunHooks( 'GetInternalURL', array( &$this, &$url, $query ) );
return $url;
}
@@ -943,14 +1002,22 @@ class Title {
* @return bool
*/
function isSemiProtected( $action = 'edit' ) {
- $restrictions = $this->getRestrictions( $action );
- # We do a full compare because this could be an array
- foreach( $restrictions as $restriction ) {
- if( strtolower( $restriction ) != 'autoconfirmed' ) {
- return( false );
+ if( $this->exists() ) {
+ $restrictions = $this->getRestrictions( $action );
+ if( count( $restrictions ) > 0 ) {
+ foreach( $restrictions as $restriction ) {
+ if( strtolower( $restriction ) != 'autoconfirmed' )
+ return false;
+ }
+ } else {
+ # Not protected
+ return false;
}
+ return true;
+ } else {
+ # If it doesn't exist, it can't be protected
+ return false;
}
- return( true );
}
/**
@@ -962,7 +1029,7 @@ class Title {
*/
function isProtected( $action = '' ) {
global $wgRestrictionLevels;
- if ( -1 == $this->mNamespace ) { return true; }
+ if ( NS_SPECIAL == $this->mNamespace ) { return true; }
if( $action == 'edit' || $action == '' ) {
$r = $this->getRestrictions( 'edit' );
@@ -994,7 +1061,7 @@ class Title {
global $wgUser;
if ( is_null( $this->mWatched ) ) {
- if ( -1 == $this->mNamespace || 0 == $wgUser->getID()) {
+ if ( NS_SPECIAL == $this->mNamespace || !$wgUser->isLoggedIn()) {
$this->mWatched = false;
} else {
$this->mWatched = $wgUser->isWatched( $this );
@@ -1043,8 +1110,7 @@ class Title {
# protect css/js subpages of user pages
# XXX: this might be better using restrictions
# XXX: Find a way to work around the php bug that prevents using $this->userCanEditCssJsSubpage() from working
- if( NS_USER == $this->mNamespace
- && preg_match("/\\.(css|js)$/", $this->mTextform )
+ if( $this->isCssJsSubpage()
&& !$wgUser->isAllowed('editinterface')
&& !preg_match('/^'.preg_quote($wgUser->getName(), '/').'\//', $this->mTextform) ) {
wfProfileOut( $fname );
@@ -1138,11 +1204,11 @@ class Title {
} else {
global $wgWhitelistRead;
- /** If anon users can create an account,
- they need to reach the login page first! */
- if( $wgUser->isAllowed( 'createaccount' )
- && $this->getNamespace() == NS_SPECIAL
- && $this->getText() == 'Userlogin' ) {
+ /**
+ * Always grant access to the login page.
+ * Even anons need to be able to log in.
+ */
+ if( $this->isSpecial( 'Userlogin' ) || $this->isSpecial( 'Resetpass' ) ) {
return true;
}
@@ -1172,12 +1238,27 @@ class Title {
}
/**
+ * Is this a subpage?
+ * @return bool
+ * @access public
+ */
+ function isSubpage() {
+ global $wgNamespacesWithSubpages;
+
+ if( isset( $wgNamespacesWithSubpages[ $this->mNamespace ] ) ) {
+ return ( strpos( $this->getText(), '/' ) !== false && $wgNamespacesWithSubpages[ $this->mNamespace ] == true );
+ } else {
+ return false;
+ }
+ }
+
+ /**
* Is this a .css or .js subpage of a user page?
* @return bool
* @access public
*/
function isCssJsSubpage() {
- return ( NS_USER == $this->mNamespace and preg_match("/\\.(css|js)$/", $this->mTextform ) );
+ return ( NS_USER == $this->mNamespace and preg_match("/\\/.*\\.(css|js)$/", $this->mTextform ) );
}
/**
* Is this a *valid* .css or .js subpage of a user page?
@@ -1205,7 +1286,7 @@ class Title {
* @access public
*/
function isCssSubpage() {
- return ( NS_USER == $this->mNamespace and preg_match("/\\.css$/", $this->mTextform ) );
+ return ( NS_USER == $this->mNamespace and preg_match("/\\/.*\\.css$/", $this->mTextform ) );
}
/**
* Is this a .js subpage of a user page?
@@ -1213,7 +1294,7 @@ class Title {
* @access public
*/
function isJsSubpage() {
- return ( NS_USER == $this->mNamespace and preg_match("/\\.js$/", $this->mTextform ) );
+ return ( NS_USER == $this->mNamespace and preg_match("/\\/.*\\.js$/", $this->mTextform ) );
}
/**
* Protect css/js subpages of user pages: can $wgUser edit
@@ -1234,6 +1315,15 @@ class Title {
* @access public
*/
function loadRestrictions( $res ) {
+ $this->mRestrictions['edit'] = array();
+ $this->mRestrictions['move'] = array();
+
+ if( !$res ) {
+ # No restrictions (page_restrictions blank)
+ $this->mRestrictionsLoaded = true;
+ return;
+ }
+
foreach( explode( ':', trim( $res ) ) as $restrict ) {
$temp = explode( '=', trim( $restrict ) );
if(count($temp) == 1) {
@@ -1249,23 +1339,24 @@ class Title {
/**
* Accessor/initialisation for mRestrictions
+ *
+ * @access public
* @param string $action action that permission needs to be checked for
* @return array the array of groups allowed to edit this article
- * @access public
*/
- function getRestrictions($action) {
- $id = $this->getArticleID();
- if ( 0 == $id ) { return array(); }
-
- if ( ! $this->mRestrictionsLoaded ) {
- $dbr =& wfGetDB( DB_SLAVE );
- $res = $dbr->selectField( 'page', 'page_restrictions', 'page_id='.$id );
- $this->loadRestrictions( $res );
- }
- if( isset( $this->mRestrictions[$action] ) ) {
- return $this->mRestrictions[$action];
+ function getRestrictions( $action ) {
+ if( $this->exists() ) {
+ if( !$this->mRestrictionsLoaded ) {
+ $dbr =& wfGetDB( DB_SLAVE );
+ $res = $dbr->selectField( 'page', 'page_restrictions', array( 'page_id' => $this->getArticleId() ) );
+ $this->loadRestrictions( $res );
+ }
+ return isset( $this->mRestrictions[$action] )
+ ? $this->mRestrictions[$action]
+ : array();
+ } else {
+ return array();
}
- return array();
}
/**
@@ -1366,7 +1457,7 @@ class Title {
);
if ($wgUseFileCache) {
- $cache = new CacheManager($this);
+ $cache = new HTMLFileCache($this);
@unlink($cache->fileCacheName());
}
@@ -1382,14 +1473,12 @@ class Title {
* @private
*/
/* private */ function prefix( $name ) {
- global $wgContLang;
-
$p = '';
if ( '' != $this->mInterwiki ) {
$p = $this->mInterwiki . ':';
}
if ( 0 != $this->mNamespace ) {
- $p .= $wgContLang->getNsText( $this->mNamespace ) . ':';
+ $p .= $this->getNsText() . ':';
}
return $p . $name;
}
@@ -1407,7 +1496,6 @@ class Title {
*/
/* private */ function secureAndSplit() {
global $wgContLang, $wgLocalInterwiki, $wgCapitalLinks;
- $fname = 'Title::secureAndSplit';
# Initialisation
static $rxTc = false;
@@ -1418,43 +1506,52 @@ class Title {
$this->mInterwiki = $this->mFragment = '';
$this->mNamespace = $this->mDefaultNamespace; # Usually NS_MAIN
+
+ $dbkey = $this->mDbkeyform;
+ # Strip Unicode bidi override characters.
+ # Sometimes they slip into cut-n-pasted page titles, where the
+ # override chars get included in list displays.
+ $dbkey = str_replace( "\xE2\x80\x8E", '', $dbkey ); // 200E LEFT-TO-RIGHT MARK
+ $dbkey = str_replace( "\xE2\x80\x8F", '', $dbkey ); // 200F RIGHT-TO-LEFT MARK
+
# Clean up whitespace
#
- $t = preg_replace( '/[ _]+/', '_', $this->mDbkeyform );
- $t = trim( $t, '_' );
+ $dbkey = preg_replace( '/[ _]+/', '_', $dbkey );
+ $dbkey = trim( $dbkey, '_' );
- if ( '' == $t ) {
+ if ( '' == $dbkey ) {
return false;
}
- if( false !== strpos( $t, UTF8_REPLACEMENT ) ) {
+ if( false !== strpos( $dbkey, UTF8_REPLACEMENT ) ) {
# Contained illegal UTF-8 sequences or forbidden Unicode chars.
return false;
}
- $this->mDbkeyform = $t;
+ $this->mDbkeyform = $dbkey;
# Initial colon indicates main namespace rather than specified default
# but should not create invalid {ns,title} pairs such as {0,Project:Foo}
- if ( ':' == $t{0} ) {
+ if ( ':' == $dbkey{0} ) {
$this->mNamespace = NS_MAIN;
- $t = substr( $t, 1 ); # remove the colon but continue processing
+ $dbkey = substr( $dbkey, 1 ); # remove the colon but continue processing
}
# Namespace or interwiki prefix
$firstPass = true;
do {
- if ( preg_match( "/^(.+?)_*:_*(.*)$/S", $t, $m ) ) {
+ $m = array();
+ if ( preg_match( "/^(.+?)_*:_*(.*)$/S", $dbkey, $m ) ) {
$p = $m[1];
$lowerNs = $wgContLang->lc( $p );
if ( $ns = Namespace::getCanonicalIndex( $lowerNs ) ) {
# Canonical namespace
- $t = $m[2];
+ $dbkey = $m[2];
$this->mNamespace = $ns;
} elseif ( $ns = $wgContLang->getNsIndex( $lowerNs )) {
# Ordinary namespace
- $t = $m[2];
+ $dbkey = $m[2];
$this->mNamespace = $ns;
} elseif( $this->getInterwikiLink( $p ) ) {
if( !$firstPass ) {
@@ -1464,12 +1561,12 @@ class Title {
}
# Interwiki link
- $t = $m[2];
+ $dbkey = $m[2];
$this->mInterwiki = $wgContLang->lc( $p );
# Redundant interwiki prefix to the local wiki
if ( 0 == strcasecmp( $this->mInterwiki, $wgLocalInterwiki ) ) {
- if( $t == '' ) {
+ if( $dbkey == '' ) {
# Can't have an empty self-link
return false;
}
@@ -1481,9 +1578,9 @@ class Title {
# If there's an initial colon after the interwiki, that also
# resets the default namespace
- if ( $t !== '' && $t[0] == ':' ) {
+ if ( $dbkey !== '' && $dbkey[0] == ':' ) {
$this->mNamespace = NS_MAIN;
- $t = substr( $t, 1 );
+ $dbkey = substr( $dbkey, 1 );
}
}
# If there's no recognized interwiki or namespace,
@@ -1491,25 +1588,24 @@ class Title {
}
break;
} while( true );
- $r = $t;
# We already know that some pages won't be in the database!
#
- if ( '' != $this->mInterwiki || -1 == $this->mNamespace ) {
+ if ( '' != $this->mInterwiki || NS_SPECIAL == $this->mNamespace ) {
$this->mArticleID = 0;
}
- $f = strstr( $r, '#' );
- if ( false !== $f ) {
- $this->mFragment = substr( $f, 1 );
- $r = substr( $r, 0, strlen( $r ) - strlen( $f ) );
+ $fragment = strstr( $dbkey, '#' );
+ if ( false !== $fragment ) {
+ $this->setFragment( $fragment );
+ $dbkey = substr( $dbkey, 0, strlen( $dbkey ) - strlen( $fragment ) );
# remove whitespace again: prevents "Foo_bar_#"
# becoming "Foo_bar_"
- $r = preg_replace( '/_*$/', '', $r );
+ $dbkey = preg_replace( '/_*$/', '', $dbkey );
}
# Reject illegal characters.
#
- if( preg_match( $rxTc, $r ) ) {
+ if( preg_match( $rxTc, $dbkey ) ) {
return false;
}
@@ -1518,19 +1614,26 @@ class Title {
* often be unreachable due to the way web browsers deal
* with 'relative' URLs. Forbid them explicitly.
*/
- if ( strpos( $r, '.' ) !== false &&
- ( $r === '.' || $r === '..' ||
- strpos( $r, './' ) === 0 ||
- strpos( $r, '../' ) === 0 ||
- strpos( $r, '/./' ) !== false ||
- strpos( $r, '/../' ) !== false ) )
+ if ( strpos( $dbkey, '.' ) !== false &&
+ ( $dbkey === '.' || $dbkey === '..' ||
+ strpos( $dbkey, './' ) === 0 ||
+ strpos( $dbkey, '../' ) === 0 ||
+ strpos( $dbkey, '/./' ) !== false ||
+ strpos( $dbkey, '/../' ) !== false ) )
{
return false;
}
- # We shouldn't need to query the DB for the size.
- #$maxSize = $dbr->textFieldSize( 'page', 'page_title' );
- if ( strlen( $r ) > 255 ) {
+ /**
+ * Limit the size of titles to 255 bytes.
+ * This is typically the size of the underlying database field.
+ * We make an exception for special pages, which don't need to be stored
+ * in the database, and may edge over 255 bytes due to subpage syntax
+ * for long titles, e.g. [[Special:Block/Long name]]
+ */
+ if ( ( $this->mNamespace != NS_SPECIAL && strlen( $dbkey ) > 255 ) ||
+ strlen( $dbkey ) > 512 )
+ {
return false;
}
@@ -1543,9 +1646,7 @@ class Title {
* site might be case-sensitive.
*/
if( $wgCapitalLinks && $this->mInterwiki == '') {
- $t = $wgContLang->ucfirst( $r );
- } else {
- $t = $r;
+ $dbkey = $wgContLang->ucfirst( $dbkey );
}
/**
@@ -1553,27 +1654,40 @@ class Title {
* "empty" local links can only be self-links
* with a fragment identifier.
*/
- if( $t == '' &&
+ if( $dbkey == '' &&
$this->mInterwiki == '' &&
$this->mNamespace != NS_MAIN ) {
return false;
}
// Any remaining initial :s are illegal.
- if ( $t !== '' && ':' == $t{0} ) {
+ if ( $dbkey !== '' && ':' == $dbkey{0} ) {
return false;
}
# Fill fields
- $this->mDbkeyform = $t;
- $this->mUrlform = wfUrlencode( $t );
+ $this->mDbkeyform = $dbkey;
+ $this->mUrlform = wfUrlencode( $dbkey );
- $this->mTextform = str_replace( '_', ' ', $t );
+ $this->mTextform = str_replace( '_', ' ', $dbkey );
return true;
}
/**
+ * Set the fragment for this title
+ * This is kind of bad, since except for this rarely-used function, Title objects
+ * are immutable. The reason this is here is because it's better than setting the
+ * members directly, which is what Linker::formatComment was doing previously.
+ *
+ * @param string $fragment text
+ * @access kind of public
+ */
+ function setFragment( $fragment ) {
+ $this->mFragment = str_replace( '_', ' ', substr( $fragment, 1 ) );
+ }
+
+ /**
* Get a Title object associated with the talk page of this article
* @return Title the object for the talk page
* @access public
@@ -1606,7 +1720,6 @@ class Title {
*/
function getLinksTo( $options = '', $table = 'pagelinks', $prefix = 'pl' ) {
$linkCache =& LinkCache::singleton();
- $id = $this->getArticleID();
if ( $options ) {
$db =& wfGetDB( DB_MASTER );
@@ -1698,10 +1811,23 @@ class Title {
* @access public
*/
function getSquidURLs() {
- return array(
+ global $wgContLang;
+
+ $urls = array(
$this->getInternalURL(),
$this->getInternalURL( 'action=history' )
);
+
+ // purge variant urls as well
+ if($wgContLang->hasVariants()){
+ $variants = $wgContLang->getVariants();
+ foreach($variants as $vCode){
+ if($vCode==$wgContLang->getCode()) continue; // we don't want default variant
+ $urls[] = $this->getInternalURL('',$vCode);
+ }
+ }
+
+ return $urls;
}
function purgeSquid() {
@@ -1864,7 +1990,6 @@ class Title {
}
$now = wfTimestampNow();
- $rand = wfRandom();
$newid = $nt->getArticleID();
$oldid = $this->getArticleID();
$dbw =& wfGetDB( DB_MASTER );
@@ -1902,7 +2027,7 @@ class Title {
'page' => $newid,
'comment' => $comment,
'text' => $redirectText ) );
- $revid = $redirectRevision->insertOn( $dbw );
+ $redirectRevision->insertOn( $dbw );
$redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
$linkCache->clearLink( $this->getPrefixedDBkey() );
@@ -1945,7 +2070,6 @@ class Title {
$oldid = $this->getArticleID();
$dbw =& wfGetDB( DB_MASTER );
$now = $dbw->timestamp();
- $rand = wfRandom();
$linkCache =& LinkCache::singleton();
# Save a null revision in the page's history notifying of the move
@@ -1975,7 +2099,7 @@ class Title {
'page' => $newid,
'comment' => $comment,
'text' => $redirectText ) );
- $revid = $redirectRevision->insertOn( $dbw );
+ $redirectRevision->insertOn( $dbw );
$redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
$linkCache->clearLink( $this->getPrefixedDBkey() );
@@ -2027,6 +2151,7 @@ class Title {
# Does the redirect point to the source?
# Or is it a broken self-redirect, usually caused by namespace collisions?
+ $m = array();
if ( preg_match( "/\\[\\[\\s*([^\\]\\|]*)]]/", $text, $m ) ) {
$redirTitle = Title::newFromText( $m[1] );
if( !is_object( $redirTitle ) ||
@@ -2078,7 +2203,7 @@ class Title {
'comment' => $comment,
'text' => "#REDIRECT [[" . $dest->getPrefixedText() . "]]\n",
) );
- $revisionId = $revision->insertOn( $dbw );
+ $revision->insertOn( $dbw );
$article->updateRevisionOn( $dbw, $revision, 0 );
# Link table
@@ -2171,7 +2296,7 @@ class Title {
* Get the revision ID of the previous revision
*
* @param integer $revision Revision ID. Get the revision that was before this one.
- * @return interger $oldrevision|false
+ * @return integer $oldrevision|false
*/
function getPreviousRevisionID( $revision ) {
$dbr =& wfGetDB( DB_SLAVE );
@@ -2184,7 +2309,7 @@ class Title {
* Get the revision ID of the next revision
*
* @param integer $revision Revision ID. Get the revision that was after this one.
- * @return interger $oldrevision|false
+ * @return integer $oldrevision|false
*/
function getNextRevisionID( $revision ) {
$dbr =& wfGetDB( DB_SLAVE );
@@ -2194,6 +2319,21 @@ class Title {
}
/**
+ * Get the number of revisions between the given revision IDs.
+ *
+ * @param integer $old Revision ID.
+ * @param integer $new Revision ID.
+ * @return integer Number of revisions between these IDs.
+ */
+ function countRevisionsBetween( $old, $new ) {
+ $dbr =& wfGetDB( DB_SLAVE );
+ return $dbr->selectField( 'revision', 'count(*)',
+ 'rev_page = ' . intval( $this->getArticleId() ) .
+ ' AND rev_id > ' . intval( $old ) .
+ ' AND rev_id < ' . intval( $new ) );
+ }
+
+ /**
* Compare with another title.
*
* @param Title $title
@@ -2258,26 +2398,12 @@ class Title {
* Get a cached value from a global cache that is invalidated when this page changes
* @param string $key the key
* @param callback $callback A callback function which generates the value on cache miss
+ *
+ * @deprecated use DependencyWrapper
*/
function getRelatedCache( $memc, $key, $expiry, $callback, $params = array() ) {
- $touched = $this->getTouched();
- $cacheEntry = $memc->get( $key );
- if ( $cacheEntry ) {
- if ( $cacheEntry['touched'] >= $touched ) {
- return $cacheEntry['value'];
- } else {
- wfDebug( __METHOD__.": $key expired\n" );
- }
- } else {
- wfDebug( __METHOD__.": $key not found\n" );
- }
- $value = call_user_func_array( $callback, $params );
- $cacheEntry = array(
- 'value' => $value,
- 'touched' => $touched
- );
- $memc->set( $key, $cacheEntry, $expiry );
- return $value;
+ return DependencyWrapper::getValueFromCache( $memc, $key, $expiry, $callback,
+ $params, new TitleDependency( $this ) );
}
function trackbackURL() {
@@ -2343,5 +2469,37 @@ class Title {
return 'nstab-' . $wgContLang->lc( $this->getSubjectNsText() );
}
}
+
+ /**
+ * Returns true if this title resolves to the named special page
+ * @param string $name The special page name
+ * @access public
+ */
+ function isSpecial( $name ) {
+ if ( $this->getNamespace() == NS_SPECIAL ) {
+ list( $thisName, /* $subpage */ ) = SpecialPage::resolveAliasWithSubpage( $this->getDBkey() );
+ if ( $name == $thisName ) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * If the Title refers to a special page alias which is not the local default,
+ * returns a new Title which points to the local default. Otherwise, returns $this.
+ */
+ function fixSpecialName() {
+ if ( $this->getNamespace() == NS_SPECIAL ) {
+ $canonicalName = SpecialPage::resolveAlias( $this->mDbkeyform );
+ if ( $canonicalName ) {
+ $localName = SpecialPage::getLocalNameFor( $canonicalName );
+ if ( $localName != $this->mDbkeyform ) {
+ return Title::makeTitle( NS_SPECIAL, $localName );
+ }
+ }
+ }
+ return $this;
+ }
}
?>
diff --git a/includes/User.php b/includes/User.php
index aa964d22..35ff8299 100644
--- a/includes/User.php
+++ b/includes/User.php
@@ -9,43 +9,31 @@
define( 'USER_TOKEN_LENGTH', 32 );
# Serialized record version
-define( 'MW_USER_VERSION', 3 );
+define( 'MW_USER_VERSION', 4 );
+
+# Some punctuation to prevent editing from broken text-mangling proxies.
+# FIXME: this is embedded unescaped into HTML attributes in various
+# places, so we can't safely include ' or " even though we really should.
+define( 'EDIT_TOKEN_SUFFIX', '\\' );
+
+/**
+ * Thrown by User::setPassword() on error
+ */
+class PasswordError extends MWException {
+ // NOP
+}
/**
*
* @package MediaWiki
*/
class User {
- /*
- * When adding a new private variable, dont forget to add it to __sleep()
- */
- /**@{{
- * @private
- */
- var $mBlockedby; //!<
- var $mBlockreason; //!<
- var $mBlock; //!<
- var $mDataLoaded; //!<
- var $mEmail; //!<
- var $mEmailAuthenticated; //!<
- var $mGroups; //!<
- var $mHash; //!<
- var $mId; //!<
- var $mName; //!<
- var $mNewpassword; //!<
- var $mNewtalk; //!<
- var $mOptions; //!<
- var $mPassword; //!<
- var $mRealName; //!<
- var $mRegistration; //!<
- var $mRights; //!<
- var $mSkin; //!<
- var $mToken; //!<
- var $mTouched; //!<
- var $mDatePreference; // !<
- var $mVersion; //!< serialized version
- /**@}} */
+ /**
+ * A list of default user toggles, i.e. boolean user preferences that are
+ * displayed by Special:Preferences as checkboxes. This list can be
+ * extended via the UserToggles hook or $wgContLang->getExtraUserToggles().
+ */
static public $mToggles = array(
'highlightbroken',
'justify',
@@ -62,6 +50,8 @@ class User {
'editwidth',
'watchcreations',
'watchdefault',
+ 'watchmoves',
+ 'watchdeletion',
'minordefault',
'previewontop',
'previewonfirst',
@@ -76,53 +66,200 @@ class User {
'externaldiff',
'showjumplinks',
'uselivepreview',
- 'autopatrol',
'forceeditsummary',
'watchlisthideown',
'watchlisthidebots',
- );
+ 'watchlisthideminor',
+ 'ccmeonemails',
+ );
+
+ /**
+ * List of member variables which are saved to the shared cache (memcached).
+ * Any operation which changes the corresponding database fields must
+ * call a cache-clearing function.
+ */
+ static $mCacheVars = array(
+ # user table
+ 'mId',
+ 'mName',
+ 'mRealName',
+ 'mPassword',
+ 'mNewpassword',
+ 'mNewpassTime',
+ 'mEmail',
+ 'mOptions',
+ 'mTouched',
+ 'mToken',
+ 'mEmailAuthenticated',
+ 'mEmailToken',
+ 'mEmailTokenExpires',
+ 'mRegistration',
+
+ # user_group table
+ 'mGroups',
+ );
+
+ /**
+ * The cache variable declarations
+ */
+ var $mId, $mName, $mRealName, $mPassword, $mNewpassword, $mNewpassTime,
+ $mEmail, $mOptions, $mTouched, $mToken, $mEmailAuthenticated,
+ $mEmailToken, $mEmailTokenExpires, $mRegistration, $mGroups;
- /** Constructor using User:loadDefaults() */
- function User() {
- $this->loadDefaults();
- $this->mVersion = MW_USER_VERSION;
+ /**
+ * Whether the cache variables have been loaded
+ */
+ var $mDataLoaded;
+
+ /**
+ * Initialisation data source if mDataLoaded==false. May be one of:
+ * defaults anonymous user initialised from class defaults
+ * name initialise from mName
+ * id initialise from mId
+ * session log in from cookies or session if possible
+ *
+ * Use the User::newFrom*() family of functions to set this.
+ */
+ var $mFrom;
+
+ /**
+ * Lazy-initialised variables, invalidated with clearInstanceCache
+ */
+ var $mNewtalk, $mDatePreference, $mBlockedby, $mHash, $mSkin, $mRights,
+ $mBlockreason, $mBlock, $mEffectiveGroups;
+
+ /**
+ * Lightweight constructor for anonymous user
+ * Use the User::newFrom* factory functions for other kinds of users
+ */
+ function User() {
+ $this->clearInstanceCache( 'defaults' );
}
/**
- * Static factory method
- * @param string $name Username, validated by Title:newFromText()
- * @param bool $validate Validate username
- * @return User
- * @static
+ * Load the user table data for this object from the source given by mFrom
*/
- function newFromName( $name, $validate = true ) {
- # Force usernames to capital
- global $wgContLang;
- $name = $wgContLang->ucfirst( $name );
+ function load() {
+ if ( $this->mDataLoaded ) {
+ return;
+ }
+ wfProfileIn( __METHOD__ );
- # Clean up name according to title rules
- $t = Title::newFromText( $name );
- if( is_null( $t ) ) {
- return null;
+ # Set it now to avoid infinite recursion in accessors
+ $this->mDataLoaded = true;
+
+ switch ( $this->mFrom ) {
+ case 'defaults':
+ $this->loadDefaults();
+ break;
+ case 'name':
+ $this->mId = self::idFromName( $this->mName );
+ if ( !$this->mId ) {
+ # Nonexistent user placeholder object
+ $this->loadDefaults( $this->mName );
+ } else {
+ $this->loadFromId();
+ }
+ break;
+ case 'id':
+ $this->loadFromId();
+ break;
+ case 'session':
+ $this->loadFromSession();
+ break;
+ default:
+ throw new MWException( "Unrecognised value for User->mFrom: \"{$this->mFrom}\"" );
}
+ wfProfileOut( __METHOD__ );
+ }
- # Reject various classes of invalid names
- $canonicalName = $t->getText();
- global $wgAuth;
- $canonicalName = $wgAuth->getCanonicalName( $t->getText() );
+ /**
+ * Load user table data given mId
+ * @return false if the ID does not exist, true otherwise
+ * @private
+ */
+ function loadFromId() {
+ global $wgMemc;
+ if ( $this->mId == 0 ) {
+ $this->loadDefaults();
+ return false;
+ }
+
+ # Try cache
+ $key = wfMemcKey( 'user', 'id', $this->mId );
+ $data = $wgMemc->get( $key );
+
+ if ( !is_array( $data ) || $data['mVersion'] < MW_USER_VERSION ) {
+ # Object is expired, load from DB
+ $data = false;
+ }
+
+ if ( !$data ) {
+ wfDebug( "Cache miss for user {$this->mId}\n" );
+ # Load from DB
+ if ( !$this->loadFromDatabase() ) {
+ # Can't load from ID, user is anonymous
+ return false;
+ }
+
+ # Save to cache
+ $data = array();
+ foreach ( self::$mCacheVars as $name ) {
+ $data[$name] = $this->$name;
+ }
+ $data['mVersion'] = MW_USER_VERSION;
+ $wgMemc->set( $key, $data );
+ } else {
+ wfDebug( "Got user {$this->mId} from cache\n" );
+ # Restore from cache
+ foreach ( self::$mCacheVars as $name ) {
+ $this->$name = $data[$name];
+ }
+ }
+ return true;
+ }
- if( $validate && !User::isValidUserName( $canonicalName ) ) {
+ /**
+ * Static factory method for creation from username.
+ *
+ * This is slightly less efficient than newFromId(), so use newFromId() if
+ * you have both an ID and a name handy.
+ *
+ * @param string $name Username, validated by Title:newFromText()
+ * @param mixed $validate Validate username. Takes the same parameters as
+ * User::getCanonicalName(), except that true is accepted as an alias
+ * for 'valid', for BC.
+ *
+ * @return User object, or null if the username is invalid. If the username
+ * is not present in the database, the result will be a user object with
+ * a name, zero user ID and default settings.
+ * @static
+ */
+ static function newFromName( $name, $validate = 'valid' ) {
+ if ( $validate === true ) {
+ $validate = 'valid';
+ }
+ $name = self::getCanonicalName( $name, $validate );
+ if ( $name === false ) {
return null;
+ } else {
+ # Create unloaded user object
+ $u = new User;
+ $u->mName = $name;
+ $u->mFrom = 'name';
+ return $u;
}
+ }
- $u = new User();
- $u->setName( $canonicalName );
- $u->setId( $u->idFromName( $canonicalName ) );
+ static function newFromId( $id ) {
+ $u = new User;
+ $u->mId = $id;
+ $u->mFrom = 'id';
return $u;
}
/**
- * Factory method to fetch whichever use has a given email confirmation code.
+ * Factory method to fetch whichever user has a given email confirmation code.
* This code is generated when an account is created or its e-mail address
* has changed.
*
@@ -132,44 +269,30 @@ class User {
* @return User
* @static
*/
- function newFromConfirmationCode( $code ) {
+ static function newFromConfirmationCode( $code ) {
$dbr =& wfGetDB( DB_SLAVE );
- $name = $dbr->selectField( 'user', 'user_name', array(
+ $id = $dbr->selectField( 'user', 'user_id', array(
'user_email_token' => md5( $code ),
'user_email_token_expires > ' . $dbr->addQuotes( $dbr->timestamp() ),
) );
- if( is_string( $name ) ) {
- return User::newFromName( $name );
+ if( $id !== false ) {
+ return User::newFromId( $id );
} else {
return null;
}
}
-
+
/**
- * Serialze sleep function, for better cache efficiency and avoidance of
- * silly "incomplete type" errors when skins are cached. The array should
- * contain names of private variables (see at top of User.php).
+ * Create a new user object using data from session or cookies. If the
+ * login credentials are invalid, the result is an anonymous user.
+ *
+ * @return User
+ * @static
*/
- function __sleep() {
- return array(
-'mDataLoaded',
-'mEmail',
-'mEmailAuthenticated',
-'mGroups',
-'mHash',
-'mId',
-'mName',
-'mNewpassword',
-'mNewtalk',
-'mOptions',
-'mPassword',
-'mRealName',
-'mRegistration',
-'mRights',
-'mToken',
-'mTouched',
-'mVersion',
-);
+ static function newFromSession() {
+ $user = new User;
+ $user->mFrom = 'session';
+ return $user;
}
/**
@@ -178,7 +301,7 @@ class User {
* @return string Nickname of a user
* @static
*/
- function whoIs( $id ) {
+ static function whoIs( $id ) {
$dbr =& wfGetDB( DB_SLAVE );
return $dbr->selectField( 'user', 'user_name', array( 'user_id' => $id ), 'User::whoIs' );
}
@@ -189,7 +312,7 @@ class User {
* @return string Realname of a user
* @static
*/
- function whoIsReal( $id ) {
+ static function whoIsReal( $id ) {
$dbr =& wfGetDB( DB_SLAVE );
return $dbr->selectField( 'user', 'user_real_name', array( 'user_id' => $id ), 'User::whoIsReal' );
}
@@ -200,16 +323,14 @@ class User {
* @return integer|null Database user id (null: if non existent
* @static
*/
- function idFromName( $name ) {
- $fname = "User::idFromName";
-
+ static function idFromName( $name ) {
$nt = Title::newFromText( $name );
if( is_null( $nt ) ) {
# Illegal name
return null;
}
$dbr =& wfGetDB( DB_SLAVE );
- $s = $dbr->selectRow( 'user', array( 'user_id' ), array( 'user_name' => $nt->getText() ), $fname );
+ $s = $dbr->selectRow( 'user', array( 'user_id' ), array( 'user_name' => $nt->getText() ), __METHOD__ );
if ( $s === false ) {
return 0;
@@ -237,8 +358,8 @@ class User {
* @param string $name Nickname of a user
* @return bool
*/
- function isIP( $name ) {
- return preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:xxx|\d{1,3})$/",$name);
+ static function isIP( $name ) {
+ return preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:xxx|\d{1,3})$/',$name);
/*return preg_match("/^
(?:[01]?\d{1,2}|2(:?[0-4]\d|5[0-5]))\.
(?:[01]?\d{1,2}|2(:?[0-4]\d|5[0-5]))\.
@@ -259,7 +380,7 @@ class User {
* @return bool
* @static
*/
- function isValidUserName( $name ) {
+ static function isValidUserName( $name ) {
global $wgContLang, $wgMaxNameChars;
if ( $name == ''
@@ -343,7 +464,7 @@ class User {
* @return bool
* @static
*/
- function isValidPassword( $password ) {
+ static function isValidPassword( $password ) {
global $wgMinimalPasswordLength;
return strlen( $password ) >= $wgMinimalPasswordLength;
}
@@ -362,35 +483,85 @@ class User {
* @static
* @return bool
*/
- function isValidEmailAddr ( $addr ) {
+ static function isValidEmailAddr ( $addr ) {
return ( trim( $addr ) != '' ) &&
(false !== strpos( $addr, '@' ) );
}
/**
+ * Given unvalidated user input, return a canonical username, or false if
+ * the username is invalid.
+ * @param string $name
+ * @param mixed $validate Type of validation to use:
+ * false No validation
+ * 'valid' Valid for batch processes
+ * 'usable' Valid for batch processes and login
+ * 'creatable' Valid for batch processes, login and account creation
+ */
+ static function getCanonicalName( $name, $validate = 'valid' ) {
+ # Force usernames to capital
+ global $wgContLang;
+ $name = $wgContLang->ucfirst( $name );
+
+ # Clean up name according to title rules
+ $t = Title::newFromText( $name );
+ if( is_null( $t ) ) {
+ return false;
+ }
+
+ # Reject various classes of invalid names
+ $name = $t->getText();
+ global $wgAuth;
+ $name = $wgAuth->getCanonicalName( $t->getText() );
+
+ switch ( $validate ) {
+ case false:
+ break;
+ case 'valid':
+ if ( !User::isValidUserName( $name ) ) {
+ $name = false;
+ }
+ break;
+ case 'usable':
+ if ( !User::isUsableName( $name ) ) {
+ $name = false;
+ }
+ break;
+ case 'creatable':
+ if ( !User::isCreatableName( $name ) ) {
+ $name = false;
+ }
+ break;
+ default:
+ throw new MWException( 'Invalid parameter value for $validate in '.__METHOD__ );
+ }
+ return $name;
+ }
+
+ /**
* Count the number of edits of a user
*
* @param int $uid The user ID to check
* @return int
+ * @static
*/
- function edits( $uid ) {
- $fname = 'User::edits';
-
+ static function edits( $uid ) {
$dbr =& wfGetDB( DB_SLAVE );
return $dbr->selectField(
'revision', 'count(*)',
array( 'rev_user' => $uid ),
- $fname
+ __METHOD__
);
}
/**
- * probably return a random password
- * @return string probably a random password
+ * Return a random password. Sourced from mt_rand, so it's not particularly secure.
+ * @todo: hash random numbers to improve security, like generateToken()
+ *
+ * @return string
* @static
- * @todo Check what is doing really [AV]
*/
- function randomPassword() {
+ static function randomPassword() {
global $wgMinimalPasswordLength;
$pwchars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz';
$l = strlen( $pwchars ) - 1;
@@ -405,57 +576,196 @@ class User {
}
/**
- * Set properties to default
- * Used at construction. It will load per language default settings only
- * if we have an available language object.
+ * Set cached properties to default. Note: this no longer clears
+ * uncached lazy-initialised properties. The constructor does that instead.
+ *
+ * @private
*/
- function loadDefaults() {
- static $n=0;
- $n++;
- $fname = 'User::loadDefaults' . $n;
- wfProfileIn( $fname );
+ function loadDefaults( $name = false ) {
+ wfProfileIn( __METHOD__ );
global $wgCookiePrefix;
- global $wgNamespacesToBeSearchedDefault;
$this->mId = 0;
- $this->mNewtalk = -1;
- $this->mName = false;
- $this->mRealName = $this->mEmail = '';
- $this->mEmailAuthenticated = null;
+ $this->mName = $name;
+ $this->mRealName = '';
$this->mPassword = $this->mNewpassword = '';
- $this->mRights = array();
- $this->mGroups = array();
- $this->mOptions = null;
- $this->mDatePreference = null;
-
- unset( $this->mSkin );
- $this->mDataLoaded = false;
- $this->mBlockedby = -1; # Unset
- $this->setToken(); # Random
- $this->mHash = false;
+ $this->mNewpassTime = null;
+ $this->mEmail = '';
+ $this->mOptions = null; # Defer init
if ( isset( $_COOKIE[$wgCookiePrefix.'LoggedOut'] ) ) {
$this->mTouched = wfTimestamp( TS_MW, $_COOKIE[$wgCookiePrefix.'LoggedOut'] );
- }
- else {
+ } else {
$this->mTouched = '0'; # Allow any pages to be cached
}
+ $this->setToken(); # Random
+ $this->mEmailAuthenticated = null;
+ $this->mEmailToken = '';
+ $this->mEmailTokenExpires = null;
$this->mRegistration = wfTimestamp( TS_MW );
+ $this->mGroups = array();
+
+ wfProfileOut( __METHOD__ );
+ }
+
+ /**
+ * Initialise php session
+ * @deprecated use wfSetupSession()
+ */
+ function SetupSession() {
+ wfSetupSession();
+ }
+
+ /**
+ * Load user data from the session or login cookie. If there are no valid
+ * credentials, initialises the user as an anon.
+ * @return true if the user is logged in, false otherwise
+ *
+ * @private
+ */
+ function loadFromSession() {
+ global $wgMemc, $wgCookiePrefix;
+
+ if ( isset( $_SESSION['wsUserID'] ) ) {
+ if ( 0 != $_SESSION['wsUserID'] ) {
+ $sId = $_SESSION['wsUserID'];
+ } else {
+ $this->loadDefaults();
+ return false;
+ }
+ } else if ( isset( $_COOKIE["{$wgCookiePrefix}UserID"] ) ) {
+ $sId = intval( $_COOKIE["{$wgCookiePrefix}UserID"] );
+ $_SESSION['wsUserID'] = $sId;
+ } else {
+ $this->loadDefaults();
+ return false;
+ }
+ if ( isset( $_SESSION['wsUserName'] ) ) {
+ $sName = $_SESSION['wsUserName'];
+ } else if ( isset( $_COOKIE["{$wgCookiePrefix}UserName"] ) ) {
+ $sName = $_COOKIE["{$wgCookiePrefix}UserName"];
+ $_SESSION['wsUserName'] = $sName;
+ } else {
+ $this->loadDefaults();
+ return false;
+ }
+
+ $passwordCorrect = FALSE;
+ $this->mId = $sId;
+ if ( !$this->loadFromId() ) {
+ # Not a valid ID, loadFromId has switched the object to anon for us
+ return false;
+ }
+
+ if ( isset( $_SESSION['wsToken'] ) ) {
+ $passwordCorrect = $_SESSION['wsToken'] == $this->mToken;
+ $from = 'session';
+ } else if ( isset( $_COOKIE["{$wgCookiePrefix}Token"] ) ) {
+ $passwordCorrect = $this->mToken == $_COOKIE["{$wgCookiePrefix}Token"];
+ $from = 'cookie';
+ } else {
+ # No session or persistent login cookie
+ $this->loadDefaults();
+ return false;
+ }
+
+ if ( ( $sName == $this->mName ) && $passwordCorrect ) {
+ wfDebug( "Logged in from $from\n" );
+ return true;
+ } else {
+ # Invalid credentials
+ wfDebug( "Can't log in from $from, invalid credentials\n" );
+ $this->loadDefaults();
+ return false;
+ }
+ }
+
+ /**
+ * Load user and user_group data from the database
+ * $this->mId must be set, this is how the user is identified.
+ *
+ * @return true if the user exists, false if the user is anonymous
+ * @private
+ */
+ function loadFromDatabase() {
+ # Paranoia
+ $this->mId = intval( $this->mId );
+
+ /** Anonymous user */
+ if( !$this->mId ) {
+ $this->loadDefaults();
+ return false;
+ }
- wfProfileOut( $fname );
+ $dbr =& wfGetDB( DB_MASTER );
+ $s = $dbr->selectRow( 'user', '*', array( 'user_id' => $this->mId ), __METHOD__ );
+
+ if ( $s !== false ) {
+ # Initialise user table data
+ $this->mName = $s->user_name;
+ $this->mRealName = $s->user_real_name;
+ $this->mPassword = $s->user_password;
+ $this->mNewpassword = $s->user_newpassword;
+ $this->mNewpassTime = wfTimestampOrNull( TS_MW, $s->user_newpass_time );
+ $this->mEmail = $s->user_email;
+ $this->decodeOptions( $s->user_options );
+ $this->mTouched = wfTimestamp(TS_MW,$s->user_touched);
+ $this->mToken = $s->user_token;
+ $this->mEmailAuthenticated = wfTimestampOrNull( TS_MW, $s->user_email_authenticated );
+ $this->mEmailToken = $s->user_email_token;
+ $this->mEmailTokenExpires = wfTimestampOrNull( TS_MW, $s->user_email_token_expires );
+ $this->mRegistration = wfTimestampOrNull( TS_MW, $s->user_registration );
+
+ # Load group data
+ $res = $dbr->select( 'user_groups',
+ array( 'ug_group' ),
+ array( 'ug_user' => $this->mId ),
+ __METHOD__ );
+ $this->mGroups = array();
+ while( $row = $dbr->fetchObject( $res ) ) {
+ $this->mGroups[] = $row->ug_group;
+ }
+ return true;
+ } else {
+ # Invalid user_id
+ $this->mId = 0;
+ $this->loadDefaults();
+ return false;
+ }
+ }
+
+ /**
+ * Clear various cached data stored in this object.
+ * @param string $reloadFrom Reload user and user_groups table data from a
+ * given source. May be "name", "id", "defaults", "session" or false for
+ * no reload.
+ */
+ function clearInstanceCache( $reloadFrom = false ) {
+ $this->mNewtalk = -1;
+ $this->mDatePreference = null;
+ $this->mBlockedby = -1; # Unset
+ $this->mHash = false;
+ $this->mSkin = null;
+ $this->mRights = null;
+ $this->mEffectiveGroups = null;
+
+ if ( $reloadFrom ) {
+ $this->mDataLoaded = false;
+ $this->mFrom = $reloadFrom;
+ }
}
/**
* Combine the language default options with any site-specific options
* and add the default language variants.
- *
+ * Not really private cause it's called by Language class
* @return array
* @static
* @private
*/
- function getDefaultOptions() {
+ static function getDefaultOptions() {
global $wgNamespacesToBeSearchedDefault;
/**
* Site defaults will override the global/language defaults
@@ -520,18 +830,22 @@ class User {
return;
}
- $fname = 'User::getBlockedStatus';
- wfProfileIn( $fname );
- wfDebug( "$fname: checking...\n" );
+ wfProfileIn( __METHOD__ );
+ wfDebug( __METHOD__.": checking...\n" );
$this->mBlockedby = 0;
$ip = wfGetIP();
+ if ($this->isAllowed( 'ipblock-exempt' ) ) {
+ # Exempt from all types of IP-block
+ $ip = '';
+ }
+
# User/IP blocking
$this->mBlock = new Block();
$this->mBlock->fromMaster( !$bFromSlave );
if ( $this->mBlock->load( $ip , $this->mId ) ) {
- wfDebug( "$fname: Found block.\n" );
+ wfDebug( __METHOD__.": Found block.\n" );
$this->mBlockedby = $this->mBlock->mBy;
$this->mBlockreason = $this->mBlock->mReason;
if ( $this->isLoggedIn() ) {
@@ -539,7 +853,7 @@ class User {
}
} else {
$this->mBlock = null;
- wfDebug( "$fname: No block.\n" );
+ wfDebug( __METHOD__.": No block.\n" );
}
# Proxy blocking
@@ -563,22 +877,23 @@ class User {
# Extensions
wfRunHooks( 'GetBlockedStatus', array( &$this ) );
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
}
function inSorbsBlacklist( $ip ) {
- global $wgEnableSorbs;
+ global $wgEnableSorbs, $wgSorbsUrl;
+
return $wgEnableSorbs &&
- $this->inDnsBlacklist( $ip, 'http.dnsbl.sorbs.net.' );
+ $this->inDnsBlacklist( $ip, $wgSorbsUrl );
}
function inDnsBlacklist( $ip, $base ) {
- $fname = 'User::inDnsBlacklist';
- wfProfileIn( $fname );
+ wfProfileIn( __METHOD__ );
$found = false;
$host = '';
+ $m = array();
if ( preg_match( '/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/', $ip, $m ) ) {
# Make hostname
for ( $i=4; $i>=1; $i-- ) {
@@ -597,7 +912,7 @@ class User {
}
}
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
return $found;
}
@@ -612,6 +927,13 @@ class User {
* @public
*/
function pingLimiter( $action='edit' ) {
+
+ # Call the 'PingLimiter' hook
+ $result = false;
+ if( !wfRunHooks( 'PingLimiter', array( &$this, $action, $result ) ) ) {
+ return $result;
+ }
+
global $wgRateLimits, $wgRateLimitsExcludedGroups;
if( !isset( $wgRateLimits[$action] ) ) {
return false;
@@ -624,8 +946,7 @@ class User {
}
global $wgMemc, $wgRateLimitLog;
- $fname = 'User::pingLimiter';
- wfProfileIn( $fname );
+ wfProfileIn( __METHOD__ );
$limits = $wgRateLimits[$action];
$keys = array();
@@ -646,6 +967,7 @@ class User {
if( isset( $limits['ip'] ) ) {
$keys["mediawiki:limiter:$action:ip:$ip"] = $limits['ip'];
}
+ $matches = array();
if( isset( $limits['subnet'] ) && preg_match( '/^(\d+\.\d+\.\d+)\.\d+$/', $ip, $matches ) ) {
$subnet = $matches[1];
$keys["mediawiki:limiter:$action:subnet:$subnet"] = $limits['subnet'];
@@ -659,22 +981,22 @@ class User {
$count = $wgMemc->get( $key );
if( $count ) {
if( $count > $max ) {
- wfDebug( "$fname: tripped! $key at $count $summary\n" );
+ wfDebug( __METHOD__.": tripped! $key at $count $summary\n" );
if( $wgRateLimitLog ) {
@error_log( wfTimestamp( TS_MW ) . ' ' . wfWikiID() . ': ' . $this->getName() . " tripped $key at $count $summary\n", 3, $wgRateLimitLog );
}
$triggered = true;
} else {
- wfDebug( "$fname: ok. $key at $count $summary\n" );
+ wfDebug( __METHOD__.": ok. $key at $count $summary\n" );
}
} else {
- wfDebug( "$fname: adding record for $key $summary\n" );
+ wfDebug( __METHOD__.": adding record for $key $summary\n" );
$wgMemc->add( $key, 1, intval( $period ) );
}
$wgMemc->incr( $key );
}
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
return $triggered;
}
@@ -693,20 +1015,19 @@ class User {
*/
function isBlockedFrom( $title, $bFromSlave = false ) {
global $wgBlockAllowsUTEdit;
- $fname = 'User::isBlockedFrom';
- wfProfileIn( $fname );
- wfDebug( "$fname: enter\n" );
+ wfProfileIn( __METHOD__ );
+ wfDebug( __METHOD__.": enter\n" );
if ( $wgBlockAllowsUTEdit && $title->getText() === $this->getName() &&
$title->getNamespace() == NS_USER_TALK )
{
$blocked = false;
- wfDebug( "$fname: self-talk page, ignoring any blocks\n" );
+ wfDebug( __METHOD__.": self-talk page, ignoring any blocks\n" );
} else {
- wfDebug( "$fname: asking isBlocked()\n" );
+ wfDebug( __METHOD__.": asking isBlocked()\n" );
$blocked = $this->isBlocked( $bFromSlave );
}
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
return $blocked;
}
@@ -729,174 +1050,55 @@ class User {
}
/**
- * Initialise php session
- * @deprecated use wfSetupSession()
+ * Get the user ID. Returns 0 if the user is anonymous or nonexistent.
*/
- function SetupSession() {
- wfSetupSession();
- }
-
- /**
- * Create a new user object using data from session
- * @static
- */
- function loadFromSession() {
- global $wgMemc, $wgCookiePrefix;
-
- if ( isset( $_SESSION['wsUserID'] ) ) {
- if ( 0 != $_SESSION['wsUserID'] ) {
- $sId = $_SESSION['wsUserID'];
- } else {
- return new User();
- }
- } else if ( isset( $_COOKIE["{$wgCookiePrefix}UserID"] ) ) {
- $sId = intval( $_COOKIE["{$wgCookiePrefix}UserID"] );
- $_SESSION['wsUserID'] = $sId;
- } else {
- return new User();
- }
- if ( isset( $_SESSION['wsUserName'] ) ) {
- $sName = $_SESSION['wsUserName'];
- } else if ( isset( $_COOKIE["{$wgCookiePrefix}UserName"] ) ) {
- $sName = $_COOKIE["{$wgCookiePrefix}UserName"];
- $_SESSION['wsUserName'] = $sName;
- } else {
- return new User();
- }
-
- $passwordCorrect = FALSE;
- $user = $wgMemc->get( $key = wfMemcKey( 'user', 'id', $sId ) );
- if( !is_object( $user ) || $user->mVersion < MW_USER_VERSION ) {
- # Expire old serialized objects; they may be corrupt.
- $user = false;
- }
- if($makenew = !$user) {
- wfDebug( "User::loadFromSession() unable to load from memcached\n" );
- $user = new User();
- $user->mId = $sId;
- $user->loadFromDatabase();
- } else {
- wfDebug( "User::loadFromSession() got from cache!\n" );
- # Set block status to unloaded, that should be loaded every time
- $user->mBlockedby = -1;
- }
-
- if ( isset( $_SESSION['wsToken'] ) ) {
- $passwordCorrect = $_SESSION['wsToken'] == $user->mToken;
- } else if ( isset( $_COOKIE["{$wgCookiePrefix}Token"] ) ) {
- $passwordCorrect = $user->mToken == $_COOKIE["{$wgCookiePrefix}Token"];
- } else {
- return new User(); # Can't log in from session
- }
-
- if ( ( $sName == $user->mName ) && $passwordCorrect ) {
- if($makenew) {
- if($wgMemc->set( $key, $user ))
- wfDebug( "User::loadFromSession() successfully saved user\n" );
- else
- wfDebug( "User::loadFromSession() unable to save to memcached\n" );
- }
- return $user;
- }
- return new User(); # Can't log in from session
+ function getID() {
+ $this->load();
+ return $this->mId;
}
/**
- * Load a user from the database
+ * Set the user and reload all fields according to that ID
+ * @deprecated use User::newFromId()
*/
- function loadFromDatabase() {
- $fname = "User::loadFromDatabase";
-
- # Counter-intuitive, breaks various things, use User::setLoaded() if you want to suppress
- # loading in a command line script, don't assume all command line scripts need it like this
- #if ( $this->mDataLoaded || $wgCommandLineMode ) {
- if ( $this->mDataLoaded ) {
- return;
- }
-
- # Paranoia
- $this->mId = intval( $this->mId );
-
- /** Anonymous user */
- if( !$this->mId ) {
- /** Get rights */
- $this->mRights = $this->getGroupPermissions( array( '*' ) );
- $this->mDataLoaded = true;
- return;
- } # the following stuff is for non-anonymous users only
-
- $dbr =& wfGetDB( DB_SLAVE );
- $s = $dbr->selectRow( 'user', array( 'user_name','user_password','user_newpassword','user_email',
- 'user_email_authenticated',
- 'user_real_name','user_options','user_touched', 'user_token', 'user_registration' ),
- array( 'user_id' => $this->mId ), $fname );
-
- if ( $s !== false ) {
- $this->mName = $s->user_name;
- $this->mEmail = $s->user_email;
- $this->mEmailAuthenticated = wfTimestampOrNull( TS_MW, $s->user_email_authenticated );
- $this->mRealName = $s->user_real_name;
- $this->mPassword = $s->user_password;
- $this->mNewpassword = $s->user_newpassword;
- $this->decodeOptions( $s->user_options );
- $this->mTouched = wfTimestamp(TS_MW,$s->user_touched);
- $this->mToken = $s->user_token;
- $this->mRegistration = wfTimestampOrNull( TS_MW, $s->user_registration );
-
- $res = $dbr->select( 'user_groups',
- array( 'ug_group' ),
- array( 'ug_user' => $this->mId ),
- $fname );
- $this->mGroups = array();
- while( $row = $dbr->fetchObject( $res ) ) {
- $this->mGroups[] = $row->ug_group;
- }
- $implicitGroups = array( '*', 'user' );
-
- global $wgAutoConfirmAge;
- $accountAge = time() - wfTimestampOrNull( TS_UNIX, $this->mRegistration );
- if( $accountAge >= $wgAutoConfirmAge ) {
- $implicitGroups[] = 'autoconfirmed';
- }
-
- # Implicit group for users whose email addresses are confirmed
- global $wgEmailAuthentication;
- if( $this->isValidEmailAddr( $this->mEmail ) ) {
- if( $wgEmailAuthentication ) {
- if( $this->mEmailAuthenticated )
- $implicitGroups[] = 'emailconfirmed';
- } else {
- $implicitGroups[] = 'emailconfirmed';
- }
- }
-
- $effectiveGroups = array_merge( $implicitGroups, $this->mGroups );
- $this->mRights = $this->getGroupPermissions( $effectiveGroups );
- }
-
- $this->mDataLoaded = true;
- }
-
- function getID() { return $this->mId; }
function setID( $v ) {
$this->mId = $v;
- $this->mDataLoaded = false;
+ $this->clearInstanceCache( 'id' );
}
+ /**
+ * Get the user name, or the IP for anons
+ */
function getName() {
- $this->loadFromDatabase();
- if ( $this->mName === false ) {
- $this->mName = wfGetIP();
+ if ( !$this->mDataLoaded && $this->mFrom == 'name' ) {
+ # Special case optimisation
+ return $this->mName;
+ } else {
+ $this->load();
+ if ( $this->mName === false ) {
+ $this->mName = wfGetIP();
+ }
+ return $this->mName;
}
- return $this->mName;
}
+ /**
+ * Set the user name.
+ *
+ * This does not reload fields from the database according to the given
+ * name. Rather, it is used to create a temporary "nonexistent user" for
+ * later addition to the database. It can also be used to set the IP
+ * address for an anonymous user to something other than the current
+ * remote IP.
+ *
+ * User::newFromName() has rougly the same function, when the named user
+ * does not exist.
+ */
function setName( $str ) {
- $this->loadFromDatabase();
+ $this->load();
$this->mName = $str;
}
-
/**
* Return the title dbkey form of the name, for eg user pages.
* @return string
@@ -907,7 +1109,7 @@ class User {
}
function getNewtalk() {
- $this->loadFromDatabase();
+ $this->load();
# Load the newtalk status if it is unloaded (mNewtalk=-1)
if( $this->mNewtalk === -1 ) {
@@ -960,10 +1162,9 @@ class User {
* @private
*/
function checkNewtalk( $field, $id ) {
- $fname = 'User::checkNewtalk';
$dbr =& wfGetDB( DB_SLAVE );
$ok = $dbr->selectField( 'user_newtalk', $field,
- array( $field => $id ), $fname );
+ array( $field => $id ), __METHOD__ );
return $ok !== false;
}
@@ -974,17 +1175,16 @@ class User {
* @private
*/
function updateNewtalk( $field, $id ) {
- $fname = 'User::updateNewtalk';
if( $this->checkNewtalk( $field, $id ) ) {
- wfDebug( "$fname already set ($field, $id), ignoring\n" );
+ wfDebug( __METHOD__." already set ($field, $id), ignoring\n" );
return false;
}
$dbw =& wfGetDB( DB_MASTER );
$dbw->insert( 'user_newtalk',
array( $field => $id ),
- $fname,
+ __METHOD__,
'IGNORE' );
- wfDebug( "$fname: set on ($field, $id)\n" );
+ wfDebug( __METHOD__.": set on ($field, $id)\n" );
return true;
}
@@ -995,16 +1195,15 @@ class User {
* @private
*/
function deleteNewtalk( $field, $id ) {
- $fname = 'User::deleteNewtalk';
if( !$this->checkNewtalk( $field, $id ) ) {
- wfDebug( "$fname: already gone ($field, $id), ignoring\n" );
+ wfDebug( __METHOD__.": already gone ($field, $id), ignoring\n" );
return false;
}
$dbw =& wfGetDB( DB_MASTER );
$dbw->delete( 'user_newtalk',
array( $field => $id ),
- $fname );
- wfDebug( "$fname: killed on ($field, $id)\n" );
+ __METHOD__ );
+ wfDebug( __METHOD__.": killed on ($field, $id)\n" );
return true;
}
@@ -1017,11 +1216,9 @@ class User {
return;
}
- $this->loadFromDatabase();
+ $this->load();
$this->mNewtalk = $val;
- $fname = 'User::setNewtalk';
-
if( $this->isAnon() ) {
$field = 'user_ip';
$id = $this->getName();
@@ -1070,7 +1267,7 @@ class User {
*
* Called implicitly from invalidateCache() and saveSettings().
*/
- private function clearUserCache() {
+ private function clearSharedCache() {
if( $this->mId ) {
global $wgMemc;
$wgMemc->delete( wfMemcKey( 'user', 'id', $this->mId ) );
@@ -1083,6 +1280,7 @@ class User {
* for reload on the next hit.
*/
function invalidateCache() {
+ $this->load();
if( $this->mId ) {
$this->mTouched = self::newTouchedTimestamp();
@@ -1092,12 +1290,12 @@ class User {
array( 'user_id' => $this->mId ),
__METHOD__ );
- $this->clearUserCache();
+ $this->clearSharedCache();
}
}
function validateCache( $timestamp ) {
- $this->loadFromDatabase();
+ $this->load();
return ($timestamp >= $this->mTouched);
}
@@ -1108,20 +1306,66 @@ class User {
* @return string Encrypted password.
*/
function encryptPassword( $p ) {
+ $this->load();
return wfEncryptPassword( $this->mId, $p );
}
- # Set the password and reset the random token
+ /**
+ * Set the password and reset the random token
+ * Calls through to authentication plugin if necessary;
+ * will have no effect if the auth plugin refuses to
+ * pass the change through or if the legal password
+ * checks fail.
+ *
+ * As a special case, setting the password to null
+ * wipes it, so the account cannot be logged in until
+ * a new password is set, for instance via e-mail.
+ *
+ * @param string $str
+ * @throws PasswordError on failure
+ */
function setPassword( $str ) {
- $this->loadFromDatabase();
+ global $wgAuth;
+
+ if( $str !== null ) {
+ if( !$wgAuth->allowPasswordChange() ) {
+ throw new PasswordError( wfMsg( 'password-change-forbidden' ) );
+ }
+
+ if( !$this->isValidPassword( $str ) ) {
+ global $wgMinimalPasswordLength;
+ throw new PasswordError( wfMsg( 'passwordtooshort',
+ $wgMinimalPasswordLength ) );
+ }
+ }
+
+ if( !$wgAuth->setPassword( $this, $str ) ) {
+ throw new PasswordError( wfMsg( 'externaldberror' ) );
+ }
+
+ $this->load();
$this->setToken();
- $this->mPassword = $this->encryptPassword( $str );
+
+ if( $str === null ) {
+ // Save an invalid hash...
+ $this->mPassword = '';
+ } else {
+ $this->mPassword = $this->encryptPassword( $str );
+ }
$this->mNewpassword = '';
+ $this->mNewpassTime = null;
+
+ return true;
}
- # Set the random token (used for persistent authentication)
+ /**
+ * Set the random token (used for persistent authentication)
+ * Called from loadDefaults() among other places.
+ * @private
+ */
function setToken( $token = false ) {
global $wgSecretKey, $wgProxyKey;
+ $this->load();
if ( !$token ) {
if ( $wgSecretKey ) {
$key = $wgSecretKey;
@@ -1136,55 +1380,81 @@ class User {
}
}
-
function setCookiePassword( $str ) {
- $this->loadFromDatabase();
+ $this->load();
$this->mCookiePassword = md5( $str );
}
- function setNewpassword( $str ) {
- $this->loadFromDatabase();
+ /**
+ * Set the password for a password reminder or new account email
+ * Sets the user_newpass_time field if $throttle is true
+ */
+ function setNewpassword( $str, $throttle = true ) {
+ $this->load();
$this->mNewpassword = $this->encryptPassword( $str );
+ if ( $throttle ) {
+ $this->mNewpassTime = wfTimestampNow();
+ }
}
+ /**
+ * Returns true if a password reminder email has already been sent within
+ * the last $wgPasswordReminderResendTime hours
+ */
+ function isPasswordReminderThrottled() {
+ global $wgPasswordReminderResendTime;
+ $this->load();
+ if ( !$this->mNewpassTime || !$wgPasswordReminderResendTime ) {
+ return false;
+ }
+ $expiry = wfTimestamp( TS_UNIX, $this->mNewpassTime ) + $wgPasswordReminderResendTime * 3600;
+ return time() < $expiry;
+ }
+
function getEmail() {
- $this->loadFromDatabase();
+ $this->load();
return $this->mEmail;
}
function getEmailAuthenticationTimestamp() {
- $this->loadFromDatabase();
+ $this->load();
return $this->mEmailAuthenticated;
}
function setEmail( $str ) {
- $this->loadFromDatabase();
+ $this->load();
$this->mEmail = $str;
}
function getRealName() {
- $this->loadFromDatabase();
+ $this->load();
return $this->mRealName;
}
function setRealName( $str ) {
- $this->loadFromDatabase();
+ $this->load();
$this->mRealName = $str;
}
/**
* @param string $oname The option to check
+ * @param string $defaultOverride A default value returned if the option does not exist
* @return string
*/
- function getOption( $oname ) {
- $this->loadFromDatabase();
+ function getOption( $oname, $defaultOverride = '' ) {
+ $this->load();
+
if ( is_null( $this->mOptions ) ) {
+ if($defaultOverride != '') {
+ return $defaultOverride;
+ }
$this->mOptions = User::getDefaultOptions();
}
+
if ( array_key_exists( $oname, $this->mOptions ) ) {
return trim( $this->mOptions[$oname] );
} else {
- return '';
+ return $defaultOverride;
}
}
@@ -1228,7 +1498,7 @@ class User {
}
function setOption( $oname, $val ) {
- $this->loadFromDatabase();
+ $this->load();
if ( is_null( $this->mOptions ) ) {
$this->mOptions = User::getDefaultOptions();
}
@@ -1245,7 +1515,9 @@ class User {
}
function getRights() {
- $this->loadFromDatabase();
+ if ( is_null( $this->mRights ) ) {
+ $this->mRights = self::getGroupPermissions( $this->getEffectiveGroups() );
+ }
return $this->mRights;
}
@@ -1255,7 +1527,7 @@ class User {
* @return array of strings
*/
function getGroups() {
- $this->loadFromDatabase();
+ $this->load();
return $this->mGroups;
}
@@ -1263,14 +1535,36 @@ class User {
* Get the list of implicit group memberships this user has.
* This includes all explicit groups, plus 'user' if logged in
* and '*' for all accounts.
+ * @param boolean $recache Don't use the cache
* @return array of strings
*/
- function getEffectiveGroups() {
- $base = array( '*' );
- if( $this->isLoggedIn() ) {
- $base[] = 'user';
+ function getEffectiveGroups( $recache = false ) {
+ if ( $recache || is_null( $this->mEffectiveGroups ) ) {
+ $this->load();
+ $this->mEffectiveGroups = $this->mGroups;
+ $this->mEffectiveGroups[] = '*';
+ if( $this->mId ) {
+ $this->mEffectiveGroups[] = 'user';
+
+ global $wgAutoConfirmAge;
+ $accountAge = time() - wfTimestampOrNull( TS_UNIX, $this->mRegistration );
+ if( $accountAge >= $wgAutoConfirmAge ) {
+ $this->mEffectiveGroups[] = 'autoconfirmed';
+ }
+
+ # Implicit group for users whose email addresses are confirmed
+ global $wgEmailAuthentication;
+ if( self::isValidEmailAddr( $this->mEmail ) ) {
+ if( $wgEmailAuthentication ) {
+ if( $this->mEmailAuthenticated )
+ $this->mEffectiveGroups[] = 'emailconfirmed';
+ } else {
+ $this->mEffectiveGroups[] = 'emailconfirmed';
+ }
+ }
+ }
}
- return array_merge( $base, $this->getGroups() );
+ return $this->mEffectiveGroups;
}
/**
@@ -1279,17 +1573,20 @@ class User {
* @string $group
*/
function addGroup( $group ) {
+ $this->load();
$dbw =& wfGetDB( DB_MASTER );
- $dbw->insert( 'user_groups',
- array(
- 'ug_user' => $this->getID(),
- 'ug_group' => $group,
- ),
- 'User::addGroup',
- array( 'IGNORE' ) );
+ if( $this->getId() ) {
+ $dbw->insert( 'user_groups',
+ array(
+ 'ug_user' => $this->getID(),
+ 'ug_group' => $group,
+ ),
+ 'User::addGroup',
+ array( 'IGNORE' ) );
+ }
- $this->mGroups = array_merge( $this->mGroups, array( $group ) );
- $this->mRights = User::getGroupPermissions( $this->getEffectiveGroups() );
+ $this->mGroups[] = $group;
+ $this->mRights = User::getGroupPermissions( $this->getEffectiveGroups( true ) );
$this->invalidateCache();
}
@@ -1300,6 +1597,7 @@ class User {
* @string $group
*/
function removeGroup( $group ) {
+ $this->load();
$dbw =& wfGetDB( DB_MASTER );
$dbw->delete( 'user_groups',
array(
@@ -1309,7 +1607,7 @@ class User {
'User::removeGroup' );
$this->mGroups = array_diff( $this->mGroups, array( $group ) );
- $this->mRights = User::getGroupPermissions( $this->getEffectiveGroups() );
+ $this->mRights = User::getGroupPermissions( $this->getEffectiveGroups( true ) );
$this->invalidateCache();
}
@@ -1353,8 +1651,7 @@ class User {
// In the spirit of DWIM
return true;
- $this->loadFromDatabase();
- return in_array( $action , $this->mRights );
+ return in_array( $action, $this->getRights() );
}
/**
@@ -1362,17 +1659,16 @@ class User {
* @todo FIXME : need to check the old failback system [AV]
*/
function &getSkin() {
- global $IP, $wgRequest;
+ global $wgRequest;
if ( ! isset( $this->mSkin ) ) {
- $fname = 'User::getSkin';
- wfProfileIn( $fname );
+ wfProfileIn( __METHOD__ );
# get the user skin
$userSkin = $this->getOption( 'skin' );
$userSkin = $wgRequest->getVal('useskin', $userSkin);
$this->mSkin =& Skin::newFromKey( $userSkin );
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
}
return $this->mSkin;
}
@@ -1416,6 +1712,10 @@ class User {
function clearNotification( &$title ) {
global $wgUser, $wgUseEnotif;
+ # Do nothing if the database is locked to writes
+ if( wfReadOnly() ) {
+ return;
+ }
if ($title->getNamespace() == NS_USER_TALK &&
$title->getText() == $this->getName() ) {
@@ -1451,7 +1751,7 @@ class User {
// any matching rows
if ( $watched ) {
$dbw =& wfGetDB( DB_MASTER );
- $success = $dbw->update( 'watchlist',
+ $dbw->update( 'watchlist',
array( /* SET */
'wl_notificationtimestamp' => NULL
), array( /* WHERE */
@@ -1482,7 +1782,7 @@ class User {
if( $currentUser != 0 ) {
$dbw =& wfGetDB( DB_MASTER );
- $success = $dbw->update( 'watchlist',
+ $dbw->update( 'watchlist',
array( /* SET */
'wl_notificationtimestamp' => NULL
), array( /* WHERE */
@@ -1500,6 +1800,7 @@ class User {
* @return string Encoding options
*/
function encodeOptions() {
+ $this->load();
if ( is_null( $this->mOptions ) ) {
$this->mOptions = User::getDefaultOptions();
}
@@ -1515,11 +1816,10 @@ class User {
* @private
*/
function decodeOptions( $str ) {
- global $wgLang;
-
$this->mOptions = array();
$a = explode( "\n", $str );
foreach ( $a as $s ) {
+ $m = array();
if ( preg_match( "/^(.[^=]*)=(.*)$/", $s, $m ) ) {
$this->mOptions[$m[1]] = $m[2];
}
@@ -1528,8 +1828,8 @@ class User {
function setCookies() {
global $wgCookieExpiration, $wgCookiePath, $wgCookieDomain, $wgCookieSecure, $wgCookiePrefix;
+ $this->load();
if ( 0 == $this->mId ) return;
- $this->loadFromDatabase();
$exp = time() + $wgCookieExpiration;
$_SESSION['wsUserID'] = $this->mId;
@@ -1548,12 +1848,11 @@ class User {
/**
* Logout user
- * It will clean the session cookie
+ * Clears the cookies and session, resets the instance cache
*/
function logout() {
global $wgCookiePath, $wgCookieDomain, $wgCookieSecure, $wgCookiePrefix;
- $this->loadDefaults();
- $this->setLoaded( true );
+ $this->clearInstanceCache( 'defaults' );
$_SESSION['wsUserID'] = 0;
@@ -1569,8 +1868,7 @@ class User {
* @fixme Only rarely do all these fields need to be set!
*/
function saveSettings() {
- $fname = 'User::saveSettings';
-
+ $this->load();
if ( wfReadOnly() ) { return; }
if ( 0 == $this->mId ) { return; }
@@ -1582,6 +1880,7 @@ class User {
'user_name' => $this->mName,
'user_password' => $this->mPassword,
'user_newpassword' => $this->mNewpassword,
+ 'user_newpass_time' => $dbw->timestampOrNull( $this->mNewpassTime ),
'user_real_name' => $this->mRealName,
'user_email' => $this->mEmail,
'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
@@ -1590,9 +1889,9 @@ class User {
'user_token' => $this->mToken
), array( /* WHERE */
'user_id' => $this->mId
- ), $fname
+ ), __METHOD__
);
- $this->clearUserCache();
+ $this->clearSharedCache();
}
@@ -1600,14 +1899,11 @@ class User {
* Checks if a user with the given name exists, returns the ID
*/
function idForName() {
- $fname = 'User::idForName';
-
- $gotid = 0;
$s = trim( $this->getName() );
if ( 0 == strcmp( '', $s ) ) return 0;
$dbr =& wfGetDB( DB_SLAVE );
- $id = $dbr->selectField( 'user', 'user_id', array( 'user_name' => $s ), $fname );
+ $id = $dbr->selectField( 'user', 'user_id', array( 'user_name' => $s ), __METHOD__ );
if ( $id === false ) {
$id = 0;
}
@@ -1615,10 +1911,61 @@ class User {
}
/**
- * Add user object to the database
+ * Add a user to the database, return the user object
+ *
+ * @param string $name The user's name
+ * @param array $params Associative array of non-default parameters to save to the database:
+ * password The user's password. Password logins will be disabled if this is omitted.
+ * newpassword A temporary password mailed to the user
+ * email The user's email address
+ * email_authenticated The email authentication timestamp
+ * real_name The user's real name
+ * options An associative array of non-default options
+ * token Random authentication token. Do not set.
+ * registration Registration timestamp. Do not set.
+ *
+ * @return User object, or null if the username already exists
+ */
+ static function createNew( $name, $params = array() ) {
+ $user = new User;
+ $user->load();
+ if ( isset( $params['options'] ) ) {
+ $user->mOptions = $params['options'] + $user->mOptions;
+ unset( $params['options'] );
+ }
+ $dbw =& wfGetDB( DB_MASTER );
+ $seqVal = $dbw->nextSequenceValue( 'user_user_id_seq' );
+ $fields = array(
+ 'user_id' => $seqVal,
+ 'user_name' => $name,
+ 'user_password' => $user->mPassword,
+ 'user_newpassword' => $user->mNewpassword,
+ 'user_newpass_time' => $dbw->timestamp( $user->mNewpassTime ),
+ 'user_email' => $user->mEmail,
+ 'user_email_authenticated' => $dbw->timestampOrNull( $user->mEmailAuthenticated ),
+ 'user_real_name' => $user->mRealName,
+ 'user_options' => $user->encodeOptions(),
+ 'user_token' => $user->mToken,
+ 'user_registration' => $dbw->timestamp( $user->mRegistration ),
+ 'user_editcount' => 0,
+ );
+ foreach ( $params as $name => $value ) {
+ $fields["user_$name"] = $value;
+ }
+ $dbw->insert( 'user', $fields, __METHOD__, array( 'IGNORE' ) );
+ if ( $dbw->affectedRows() ) {
+ $newUser = User::newFromId( $dbw->insertId() );
+ } else {
+ $newUser = null;
+ }
+ return $newUser;
+ }
+
+ /**
+ * Add an existing user object to the database
*/
function addToDatabase() {
- $fname = 'User::addToDatabase';
+ $this->load();
$dbw =& wfGetDB( DB_MASTER );
$seqVal = $dbw->nextSequenceValue( 'user_user_id_seq' );
$dbw->insert( 'user',
@@ -1627,23 +1974,29 @@ class User {
'user_name' => $this->mName,
'user_password' => $this->mPassword,
'user_newpassword' => $this->mNewpassword,
+ 'user_newpass_time' => $dbw->timestamp( $this->mNewpassTime ),
'user_email' => $this->mEmail,
'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
'user_real_name' => $this->mRealName,
'user_options' => $this->encodeOptions(),
'user_token' => $this->mToken,
'user_registration' => $dbw->timestamp( $this->mRegistration ),
- ), $fname
+ 'user_editcount' => 0,
+ ), __METHOD__
);
$this->mId = $dbw->insertId();
+
+ # Clear instance cache other than user table data, which is already accurate
+ $this->clearInstanceCache();
}
+ /**
+ * If the (non-anonymous) user is blocked, this function will block any IP address
+ * that they successfully log on from.
+ */
function spreadBlock() {
- # If the (non-anonymous) user is blocked, this function will block any IP address
- # that they successfully log on from.
- $fname = 'User::spreadBlock';
-
- wfDebug( "User:spreadBlock()\n" );
+ wfDebug( __METHOD__."()\n" );
+ $this->load();
if ( $this->mId == 0 ) {
return;
}
@@ -1653,41 +2006,7 @@ class User {
return;
}
- # Check if this IP address is already blocked
- $ipblock = Block::newFromDB( wfGetIP() );
- if ( $ipblock ) {
- # If the user is already blocked. Then check if the autoblock would
- # excede the user block. If it would excede, then do nothing, else
- # prolong block time
- if ($userblock->mExpiry &&
- ($userblock->mExpiry < Block::getAutoblockExpiry($ipblock->mTimestamp))) {
- return;
- }
- # Just update the timestamp
- $ipblock->updateTimestamp();
- return;
- } else {
- $ipblock = new Block;
- }
-
- # Make a new block object with the desired properties
- wfDebug( "Autoblocking {$this->mName}@" . wfGetIP() . "\n" );
- $ipblock->mAddress = wfGetIP();
- $ipblock->mUser = 0;
- $ipblock->mBy = $userblock->mBy;
- $ipblock->mReason = wfMsg( 'autoblocker', $this->getName(), $userblock->mReason );
- $ipblock->mTimestamp = wfTimestampNow();
- $ipblock->mAuto = 1;
- # If the user is already blocked with an expiry date, we don't
- # want to pile on top of that!
- if($userblock->mExpiry) {
- $ipblock->mExpiry = min ( $userblock->mExpiry, Block::getAutoblockExpiry( $ipblock->mTimestamp ));
- } else {
- $ipblock->mExpiry = Block::getAutoblockExpiry( $ipblock->mTimestamp );
- }
-
- # Insert it
- $ipblock->insert();
+ $userblock->doAutoblock( wfGetIp() );
}
@@ -1705,7 +2024,7 @@ class User {
* @return string
*/
function getPageRenderingHash() {
- global $wgContLang, $wgUseDynamicDates;
+ global $wgContLang, $wgUseDynamicDates, $wgLang;
if( $this->mHash ){
return $this->mHash;
}
@@ -1719,7 +2038,7 @@ class User {
$confstr .= '!' . $this->getDatePreference();
}
$confstr .= '!' . ($this->getOption( 'numberheadings' ) ? '1' : '');
- $confstr .= '!' . $this->getOption( 'language' );
+ $confstr .= '!' . $wgLang->getCode();
$confstr .= '!' . $this->getOption( 'thumbsize' );
// add in language specific options, if any
$extra = $wgContLang->getExtraHashOptions();
@@ -1743,12 +2062,9 @@ class User {
}
/**
- * Set mDataLoaded, return previous value
- * Use this to prevent DB access in command-line scripts or similar situations
+ * @deprecated
*/
- function setLoaded( $loaded ) {
- return wfSetVar( $this->mDataLoaded, $loaded );
- }
+ function setLoaded( $loaded ) {}
/**
* Get this user's personal page title.
@@ -1800,15 +2116,15 @@ class User {
* @return bool True if the given password is correct otherwise False.
*/
function checkPassword( $password ) {
- global $wgAuth, $wgMinimalPasswordLength;
- $this->loadFromDatabase();
+ global $wgAuth;
+ $this->load();
// Even though we stop people from creating passwords that
// are shorter than this, doesn't mean people wont be able
// to. Certain authentication plugins do NOT want to save
// domain passwords in a mysql database, so we should
// check this (incase $wgAuth->strict() is false).
- if( strlen( $password ) < $wgMinimalPasswordLength ) {
+ if( !$this->isValidPassword( $password ) ) {
return false;
}
@@ -1821,8 +2137,6 @@ class User {
$ep = $this->encryptPassword( $password );
if ( 0 == strcmp( $ep, $this->mPassword ) ) {
return true;
- } elseif ( ($this->mNewpassword != '') && (0 == strcmp( $ep, $this->mNewpassword )) ) {
- return true;
} elseif ( function_exists( 'iconv' ) ) {
# Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
# Check for this with iconv
@@ -1833,6 +2147,16 @@ class User {
}
return false;
}
+
+ /**
+ * Check if the given clear-text password matches the temporary password
+ * sent by e-mail for password reset operations.
+ * @return bool
+ */
+ function checkTemporaryPassword( $plaintext ) {
+ $hash = $this->encryptPassword( $plaintext );
+ return $hash === $this->mNewpassword;
+ }
/**
* Initialize (if necessary) and return a session token value
@@ -1855,7 +2179,7 @@ class User {
if( is_array( $salt ) ) {
$salt = implode( '|', $salt );
}
- return md5( $token . $salt );
+ return md5( $token . $salt ) . EDIT_TOKEN_SUFFIX;
}
/**
@@ -1896,6 +2220,7 @@ class User {
*/
function sendConfirmationMail() {
global $wgContLang;
+ $expiration = null; // gets passed-by-ref and defined in next line.
$url = $this->confirmationTokenUrl( $expiration );
return $this->sendMail( wfMsg( 'confirmemail_subject' ),
wfMsg( 'confirmemail_body',
@@ -1940,8 +2265,6 @@ class User {
* @private
*/
function confirmationToken( &$expiration ) {
- $fname = 'User::confirmationToken';
-
$now = time();
$expires = $now + 7 * 24 * 60 * 60;
$expiration = wfTimestamp( TS_MW, $expires );
@@ -1954,7 +2277,7 @@ class User {
array( 'user_email_token' => $hash,
'user_email_token_expires' => $dbw->timestamp( $expires ) ),
array( 'user_id' => $this->mId ),
- $fname );
+ __METHOD__ );
return $token;
}
@@ -1968,7 +2291,7 @@ class User {
*/
function confirmationTokenUrl( &$expiration ) {
$token = $this->confirmationToken( $expiration );
- $title = Title::makeTitle( NS_SPECIAL, 'Confirmemail/' . $token );
+ $title = SpecialPage::getTitleFor( 'Confirmemail', $token );
return $title->getFullUrl();
}
@@ -1976,7 +2299,7 @@ class User {
* Mark the e-mail address confirmed and save.
*/
function confirmEmail() {
- $this->loadFromDatabase();
+ $this->load();
$this->mEmailAuthenticated = wfTimestampNow();
$this->saveSettings();
return true;
@@ -2012,12 +2335,12 @@ class User {
*/
function isEmailConfirmed() {
global $wgEmailAuthentication;
- $this->loadFromDatabase();
+ $this->load();
$confirmed = true;
if( wfRunHooks( 'EmailConfirmed', array( &$this, &$confirmed ) ) ) {
if( $this->isAnon() )
return false;
- if( !$this->isValidEmailAddr( $this->mEmail ) )
+ if( !self::isValidEmailAddr( $this->mEmail ) )
return false;
if( $wgEmailAuthentication && !$this->getEmailAuthenticationTimestamp() )
return false;
@@ -2026,6 +2349,18 @@ class User {
return $confirmed;
}
}
+
+ /**
+ * Return true if there is an outstanding request for e-mail confirmation.
+ * @return bool
+ */
+ function isEmailConfirmationPending() {
+ global $wgEmailAuthentication;
+ return $wgEmailAuthentication &&
+ !$this->isEmailConfirmed() &&
+ $this->mEmailToken &&
+ $this->mEmailTokenExpires > wfTimestamp();
+ }
/**
* @param array $groups list of groups
@@ -2145,6 +2480,48 @@ class User {
return $text;
}
}
+
+ /**
+ * Increment the user's edit-count field.
+ * Will have no effect for anonymous users.
+ */
+ function incEditCount() {
+ if( !$this->isAnon() ) {
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->update( 'user',
+ array( 'user_editcount=user_editcount+1' ),
+ array( 'user_id' => $this->getId() ),
+ __METHOD__ );
+
+ // Lazy initialization check...
+ if( $dbw->affectedRows() == 0 ) {
+ // Pull from a slave to be less cruel to servers
+ // Accuracy isn't the point anyway here
+ $dbr = wfGetDB( DB_SLAVE );
+ $count = $dbr->selectField( 'revision',
+ 'COUNT(rev_user)',
+ array( 'rev_user' => $this->getId() ),
+ __METHOD__ );
+
+ // Now here's a goddamn hack...
+ if( $dbr !== $dbw ) {
+ // If we actually have a slave server, the count is
+ // at least one behind because the current transaction
+ // has not been committed and replicated.
+ $count++;
+ } else {
+ // But if DB_SLAVE is selecting the master, then the
+ // count we just read includes the revision that was
+ // just added in the working transaction.
+ }
+
+ $dbw->update( 'user',
+ array( 'user_editcount' => $count ),
+ array( 'user_id' => $this->getId() ),
+ __METHOD__ );
+ }
+ }
+ }
}
?>
diff --git a/includes/UserMailer.php b/includes/UserMailer.php
index 78a8be91..0101f744 100644
--- a/includes/UserMailer.php
+++ b/includes/UserMailer.php
@@ -39,7 +39,7 @@ class MailAddress {
* @param string $name Human-readable name if a string address is given
*/
function MailAddress( $address, $name=null ) {
- if( is_object( $address ) && is_a( $address, 'User' ) ) {
+ if( is_object( $address ) && $address instanceof User ) {
$this->address = $address->getEmail();
$this->name = $address->getName();
} else {
@@ -125,14 +125,23 @@ function userMailer( $to, $from, $subject, $body, $replyto=false ) {
} else {
# In the following $headers = expression we removed "Reply-To: {$from}\r\n" , because it is treated differently
# (fifth parameter of the PHP mail function, see some lines below)
+
+ # Line endings need to be different on Unix and Windows due to
+ # the bug described at http://trac.wordpress.org/ticket/2603
+ if ( wfIsWindows() ) {
+ $body = str_replace( "\n", "\r\n", $body );
+ $endl = "\r\n";
+ } else {
+ $endl = "\n";
+ }
$headers =
- "MIME-Version: 1.0\n" .
- "Content-type: text/plain; charset={$wgOutputEncoding}\n" .
- "Content-Transfer-Encoding: 8bit\n" .
- "X-Mailer: MediaWiki mailer\n".
- 'From: ' . $from->toString() . "\n";
+ "MIME-Version: 1.0$endl" .
+ "Content-type: text/plain; charset={$wgOutputEncoding}$endl" .
+ "Content-Transfer-Encoding: 8bit$endl" .
+ "X-Mailer: MediaWiki mailer$endl".
+ 'From: ' . $from->toString();
if ($replyto) {
- $headers .= "Reply-To: $replyto\n";
+ $headers .= "{$endl}Reply-To: $replyto";
}
$dest = $to->toString();
@@ -158,7 +167,7 @@ function userMailer( $to, $from, $subject, $body, $replyto=false ) {
*/
function mailErrorHandler( $code, $string ) {
global $wgErrorString;
- $wgErrorString = preg_replace( "/^mail\(\): /", '', $string );
+ $wgErrorString = preg_replace( '/^mail\(\)(\s*\[.*?\])?: /', '', $string );
}
@@ -239,7 +248,6 @@ class EmailNotification {
}
if( $userCondition ) {
$dbr =& wfGetDB( DB_MASTER );
- extract( $dbr->tableNames( 'watchlist' ) );
$res = $dbr->select( 'watchlist', array( 'wl_user' ),
array(
@@ -373,7 +381,7 @@ class EmailNotification {
} else {
$subject = str_replace('$PAGEEDITOR', $name, $subject);
$keys['$PAGEEDITOR'] = $name;
- $emailPage = Title::makeTitle( NS_SPECIAL, 'Emailuser/' . $name );
+ $emailPage = SpecialPage::getSafeTitleFor( 'Emailuser', $name );
$keys['$PAGEEDITOR_EMAIL'] = $emailPage->getFullUrl();
}
$userPage = $wgUser->getUserPage();
diff --git a/includes/WebRequest.php b/includes/WebRequest.php
index 32307ed2..35336954 100644
--- a/includes/WebRequest.php
+++ b/includes/WebRequest.php
@@ -47,10 +47,15 @@ class WebRequest {
function WebRequest() {
$this->checkMagicQuotes();
global $wgUsePathInfo;
- if( isset( $_SERVER['PATH_INFO'] ) && ($_SERVER['PATH_INFO'] != '') && $wgUsePathInfo ) {
- # Stuff it!
- $_GET['title'] = $_REQUEST['title'] =
- substr( $_SERVER['PATH_INFO'], 1 );
+ if ( $wgUsePathInfo ) {
+ if ( isset( $_SERVER['ORIG_PATH_INFO'] ) && $_SERVER['ORIG_PATH_INFO'] != '' ) {
+ # Mangled PATH_INFO
+ # http://bugs.php.net/bug.php?id=31892
+ # Also reported when ini_get('cgi.fix_pathinfo')==false
+ $_GET['title'] = $_REQUEST['title'] = substr( $_SERVER['ORIG_PATH_INFO'], 1 );
+ } elseif ( isset( $_SERVER['PATH_INFO'] ) && ($_SERVER['PATH_INFO'] != '') && $wgUsePathInfo ) {
+ $_GET['title'] = $_REQUEST['title'] = substr( $_SERVER['PATH_INFO'], 1 );
+ }
}
}
diff --git a/includes/WebStart.php b/includes/WebStart.php
index 0c71ce53..37582290 100644
--- a/includes/WebStart.php
+++ b/includes/WebStart.php
@@ -4,6 +4,16 @@
# starts the profiler and loads the configuration, and optionally loads
# Setup.php depending on whether MW_NO_SETUP is defined.
+# Test for PHP bug which breaks PHP 5.0.x on 64-bit...
+# As of 1.8 this breaks lots of common operations instead
+# of just some rare ones like export.
+$borked = str_replace( 'a', 'b', array( -1 => -1 ) );
+if( !isset( $borked[-1] ) ) {
+ echo "PHP 5.0.x is buggy on your 64-bit system; you must upgrade to PHP 5.1.x\n" .
+ "or higher. ABORTING. (http://bugs.php.net/bug.php?id=34879 for details)\n";
+ die( -1 );
+}
+
# Protect against register_globals
# This must be done before any globals are set by the code
if ( ini_get( 'register_globals' ) ) {
diff --git a/includes/Wiki.php b/includes/Wiki.php
index 401756be..4fa421a6 100644
--- a/includes/Wiki.php
+++ b/includes/Wiki.php
@@ -71,7 +71,7 @@ class MediaWiki {
if ( '' == $title && 'delete' != $action ) {
- $ret = Title::newFromText( wfMsgForContent( 'mainpage' ) );
+ $ret = Title::newMainPage();
} elseif ( $curid = $request->getInt( 'curid' ) ) {
# URLs like this are generated by RC, because rc_title isn't always accurate
$ret = Title::newFromID( $curid );
@@ -99,7 +99,7 @@ class MediaWiki {
if( !is_null( $search ) && $search !== '' ) {
// Compatibility with old search URLs which didn't use Special:Search
// Do this above the read whitelist check for security...
- $title = Title::makeTitle( NS_SPECIAL, 'Search' );
+ $title = SpecialPage::getTitleFor( 'Search' );
}
$this->setVal( 'Search', $search );
@@ -125,10 +125,10 @@ class MediaWiki {
$action = $this->getVal('Action');
if( !$this->getVal('DisableInternalSearch') && !is_null( $search ) && $search !== '' ) {
require_once( 'includes/SpecialSearch.php' );
- $title = Title::makeTitle( NS_SPECIAL, 'Search' );
+ $title = SpecialPage::getTitleFor( 'Search' );
wfSpecialSearch();
} else if( !$title or $title->getDBkey() == '' ) {
- $title = Title::makeTitle( NS_SPECIAL, 'Badtitle' );
+ $title = SpecialPage::getTitleFor( 'Badtitle' );
# Die now before we mess up $wgArticle and the skin stops working
throw new ErrorPageError( 'badtitle', 'badtitletext' );
} else if ( $title->getInterwiki() != '' ) {
@@ -141,16 +141,43 @@ class MediaWiki {
if ( !preg_match( '/^' . preg_quote( $this->getVal('Server'), '/' ) . '/', $url ) && $title->isLocal() ) {
$output->redirect( $url );
} else {
- $title = Title::makeTitle( NS_SPECIAL, 'Badtitle' );
+ $title = SpecialPage::getTitleFor( 'Badtitle' );
throw new ErrorPageError( 'badtitle', 'badtitletext' );
}
} else if ( ( $action == 'view' ) &&
(!isset( $this->GET['title'] ) || $title->getPrefixedDBKey() != $this->GET['title'] ) &&
!count( array_diff( array_keys( $this->GET ), array( 'action', 'title' ) ) ) )
{
- /* Redirect to canonical url, make it a 301 to allow caching */
- $output->setSquidMaxage( 1200 );
- $output->redirect( $title->getFullURL(), '301');
+ $targetUrl = $title->getFullURL();
+ // Redirect to canonical url, make it a 301 to allow caching
+ global $wgServer, $wgUsePathInfo;
+ if( isset( $_SERVER['REQUEST_URI'] ) &&
+ $targetUrl == $wgServer . $_SERVER['REQUEST_URI'] ) {
+ $message = "Redirect loop detected!\n\n" .
+ "This means the wiki got confused about what page was " .
+ "requested; this sometimes happens when moving a wiki " .
+ "to a new server or changing the server configuration.\n\n";
+
+ if( $wgUsePathInfo ) {
+ $message .= "The wiki is trying to interpret the page " .
+ "title from the URL path portion (PATH_INFO), which " .
+ "sometimes fails depending on the web server. Try " .
+ "setting \"\$wgUsePathInfo = false;\" in your " .
+ "LocalSettings.php, or check that \$wgArticlePath " .
+ "is correct.";
+ } else {
+ $message .= "Your web server was detected as possibly not " .
+ "supporting URL path components (PATH_INFO) correctly; " .
+ "check your LocalSettings.php for a customized " .
+ "\$wgArticlePath setting and/or toggle \$wgUsePathInfo " .
+ "to true.";
+ }
+ wfHttpError( 500, "Internal error", $message );
+ return false;
+ } else {
+ $output->setSquidMaxage( 1200 );
+ $output->redirect( $targetUrl, '301');
+ }
} else if ( NS_SPECIAL == $title->getNamespace() ) {
/* actions that need to be made when we have a special pages */
SpecialPage::executePath( $title );
diff --git a/includes/WikiError.php b/includes/WikiError.php
index 1b2c03bf..029184d4 100644
--- a/includes/WikiError.php
+++ b/includes/WikiError.php
@@ -59,8 +59,8 @@ class WikiError {
* @return bool
* @static
*/
- function isError( &$object ) {
- return is_a( $object, 'WikiError' );
+ public static function isError( $object ) {
+ return $object instanceof WikiError;
}
}
diff --git a/includes/Xml.php b/includes/Xml.php
index 34574458..67dda7fe 100644
--- a/includes/Xml.php
+++ b/includes/Xml.php
@@ -128,10 +128,13 @@ class Xml {
* @return string HTML
*/
public static function check( $name, $checked=false, $attribs=array() ) {
- return self::element( 'input', array(
- 'name' => $name,
- 'type' => 'checkbox',
- 'value' => 1 ) + self::attrib( 'checked', $checked ) + $attribs );
+ return self::element( 'input', array_merge(
+ array(
+ 'name' => $name,
+ 'type' => 'checkbox',
+ 'value' => 1 ),
+ self::attrib( 'checked', $checked ),
+ $attribs ) );
}
/**
@@ -255,6 +258,33 @@ class Xml {
}
/**
+ * Encode a variable of unknown type to JavaScript.
+ * Doesn't support hashtables just yet.
+ */
+ public static function encodeJsVar( $value ) {
+ if ( is_bool( $value ) ) {
+ $s = $value ? 'true' : 'false';
+ } elseif ( is_null( $value ) ) {
+ $s = 'null';
+ } elseif ( is_int( $value ) ) {
+ $s = $value;
+ } elseif ( is_array( $value ) ) {
+ $s = '[';
+ foreach ( $value as $name => $elt ) {
+ if ( $s != '[' ) {
+ $s .= ', ';
+ }
+ $s .= self::encodeJsVar( $elt );
+ }
+ $s .= ']';
+ } else {
+ $s = '"' . self::escapeJsString( $value ) . '"';
+ }
+ return $s;
+ }
+
+
+ /**
* Check if a string is well-formed XML.
* Must include the surrounding tag.
*
@@ -270,8 +300,8 @@ class Xml {
xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
if( !xml_parse( $parser, $text, true ) ) {
- $err = xml_error_string( xml_get_error_code( $parser ) );
- $position = xml_get_current_byte_index( $parser );
+ //$err = xml_error_string( xml_get_error_code( $parser ) );
+ //$position = xml_get_current_byte_index( $parser );
//$fragment = $this->extractFragment( $html, $position );
//$this->mXmlError = "$err at byte $position:\n$fragment";
xml_parser_free( $parser );
@@ -297,5 +327,19 @@ class Xml {
'</html>';
return Xml::isWellFormed( $html );
}
+
+ /**
+ * Replace " > and < with their respective HTML entities ( &quot;,
+ * &gt;, &lt;)
+ *
+ * @param $in String: text that might contain HTML tags.
+ * @return string Escaped string
+ */
+ public static function escapeTagsOnly( $in ) {
+ return str_replace(
+ array( '"', '>', '<' ),
+ array( '&quot;', '&gt;', '&lt;' ),
+ $in );
+ }
}
?>
diff --git a/includes/ZhClient.php b/includes/ZhClient.php
index 0451ce81..9c9461d5 100644
--- a/includes/ZhClient.php
+++ b/includes/ZhClient.php
@@ -38,6 +38,7 @@ class ZhClient {
*/
function connect() {
wfSuppressWarnings();
+ $errno = $errstr = '';
$this->mFP = fsockopen($this->mHost, $this->mPort, $errno, $errstr, 30);
wfRestoreWarnings();
if(!$this->mFP) {
@@ -115,7 +116,6 @@ class ZhClient {
foreach($info as $variant) {
list($code, $len) = explode(' ', $variant);
$ret[strtolower($code)] = substr($data, $i, $len);
- $r = $ret[strtolower($code)];
$i+=$len;
}
return $ret;
diff --git a/includes/api/ApiBase.php b/includes/api/ApiBase.php
index f578f41b..1a9c1e3d 100644
--- a/includes/api/ApiBase.php
+++ b/includes/api/ApiBase.php
@@ -35,6 +35,11 @@ abstract class ApiBase {
const PARAM_MAX2 = 4;
const PARAM_MIN = 5;
+ const LIMIT_BIG1 = 500; // Fast query, user's limit
+ const LIMIT_BIG2 = 5000; // Fast query, bot's limit
+ const LIMIT_SML1 = 50; // Slow query, user's limit
+ const LIMIT_SML2 = 500; // Slow query, bot's limit
+
private $mMainModule, $mModuleName, $mParamPrefix;
/**
@@ -42,7 +47,7 @@ abstract class ApiBase {
*/
public function __construct($mainModule, $moduleName, $paramPrefix = '') {
$this->mMainModule = $mainModule;
- $this->mModuleName = $moduleName;
+ $this->mModuleName = $moduleName;
$this->mParamPrefix = $paramPrefix;
}
@@ -51,12 +56,22 @@ abstract class ApiBase {
*/
public abstract function execute();
- /**
- * Get the name of the query being executed by this instance
- */
- public function getModuleName() {
- return $this->mModuleName;
- }
+ /**
+ * Get the name of the module being executed by this instance
+ */
+ public function getModuleName() {
+ return $this->mModuleName;
+ }
+
+ /**
+ * Get the name of the module as shown in the profiler log
+ */
+ public function getModuleProfileName($db = false) {
+ if ($db)
+ return 'API:' . $this->mModuleName . '-DB';
+ else
+ return 'API:' . $this->mModuleName;
+ }
/**
* Get main module
@@ -91,6 +106,15 @@ abstract class ApiBase {
}
/**
+ * If the module may only be used with a certain format module,
+ * it should override this method to return an instance of that formatter.
+ * A value of null means the default format will be used.
+ */
+ public function getCustomPrinter() {
+ return null;
+ }
+
+ /**
* Generates help message for this module, or false if there is no description
*/
public function makeHelpMsg() {
@@ -126,8 +150,17 @@ abstract class ApiBase {
if ($this->getMain()->getShowVersions()) {
$versions = $this->getVersion();
- if (is_array($versions))
+ $pattern = '(\$.*) ([0-9a-z_]+\.php) (.*\$)';
+ $replacement = '\\0' . "\n " . 'http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/includes/api/\\2';
+
+ if (is_array($versions)) {
+ foreach ($versions as &$v)
+ $v = eregi_replace($pattern, $replacement, $v);
$versions = implode("\n ", $versions);
+ }
+ else
+ $versions = eregi_replace($pattern, $replacement, $versions);
+
$msg .= "Version:\n $versions\n";
}
}
@@ -141,10 +174,32 @@ abstract class ApiBase {
$paramsDescription = $this->getParamDescription();
$msg = '';
- foreach (array_keys($params) as $paramName) {
+ $paramPrefix = "\n" . str_repeat(' ', 19);
+ foreach ($params as $paramName => $paramSettings) {
$desc = isset ($paramsDescription[$paramName]) ? $paramsDescription[$paramName] : '';
if (is_array($desc))
- $desc = implode("\n" . str_repeat(' ', 19), $desc);
+ $desc = implode($paramPrefix, $desc);
+
+ @ $type = $paramSettings[self :: PARAM_TYPE];
+ if (isset ($type)) {
+ if (isset ($paramSettings[self :: PARAM_ISMULTI]))
+ $prompt = 'Values (separate with \'|\'): ';
+ else
+ $prompt = 'One value: ';
+
+ if (is_array($type)) {
+ $desc .= $paramPrefix . $prompt . implode(', ', $type);
+ }
+ elseif ($type == 'namespace') {
+ // Special handling because namespaces are type-limited, yet they are not given
+ $desc .= $paramPrefix . $prompt . implode(', ', ApiBase :: getValidNamespaces());
+ }
+ }
+
+ $default = is_array($paramSettings) ? (isset ($paramSettings[self :: PARAM_DFLT]) ? $paramSettings[self :: PARAM_DFLT] : null) : $paramSettings;
+ if (!is_null($default) && $default !== false)
+ $desc .= $paramPrefix . "Default: $default";
+
$msg .= sprintf(" %-14s - %s\n", $this->encodeParamName($paramName), $desc);
}
return $msg;
@@ -180,7 +235,7 @@ abstract class ApiBase {
protected function getParamDescription() {
return false;
}
-
+
/**
* This method mangles parameter name based on the prefix supplied to the constructor.
* Override this method to change parameter name during runtime
@@ -213,13 +268,26 @@ abstract class ApiBase {
return $this->getParameterFromSettings($paramName, $paramSettings);
}
+ public static function getValidNamespaces() {
+ static $mValidNamespaces = null;
+ if (is_null($mValidNamespaces)) {
+
+ global $wgContLang;
+ $mValidNamespaces = array ();
+ foreach (array_keys($wgContLang->getNamespaces()) as $ns) {
+ if ($ns >= 0)
+ $mValidNamespaces[] = $ns;
+ }
+ }
+ return $mValidNamespaces;
+ }
+
/**
* Using the settings determine the value for the given parameter
* @param $paramName String: parameter name
* @param $paramSettings Mixed: default value or an array of settings using PARAM_* constants.
- */
+ */
protected function getParameterFromSettings($paramName, $paramSettings) {
- global $wgRequest;
// Some classes may decide to change parameter names
$paramName = $this->encodeParamName($paramName);
@@ -248,48 +316,58 @@ abstract class ApiBase {
ApiBase :: dieDebug(__METHOD__, "Boolean param $paramName's default is set to '$default'");
}
- $value = $wgRequest->getCheck($paramName);
- } else
- $value = $wgRequest->getVal($paramName, $default);
+ $value = $this->getMain()->getRequest()->getCheck($paramName);
+ } else {
+ $value = $this->getMain()->getRequest()->getVal($paramName, $default);
+
+ if (isset ($value) && $type == 'namespace')
+ $type = ApiBase :: getValidNamespaces();
+ }
if (isset ($value) && ($multi || is_array($type)))
$value = $this->parseMultiValue($paramName, $value, $multi, is_array($type) ? $type : null);
// More validation only when choices were not given
// choices were validated in parseMultiValue()
- if (!is_array($type) && isset ($value)) {
-
- switch ($type) {
- case 'NULL' : // nothing to do
- break;
- case 'string' : // nothing to do
- break;
- case 'integer' : // Force everything using intval()
- $value = is_array($value) ? array_map('intval', $value) : intval($value);
- break;
- case 'limit' :
- if (!isset ($paramSettings[self :: PARAM_MAX1]) || !isset ($paramSettings[self :: PARAM_MAX2]))
- ApiBase :: dieDebug(__METHOD__, "MAX1 or MAX2 are not defined for the limit $paramName");
- if ($multi)
- ApiBase :: dieDebug(__METHOD__, "Multi-values not supported for $paramName");
- $min = isset ($paramSettings[self :: PARAM_MIN]) ? $paramSettings[self :: PARAM_MIN] : 0;
- $value = intval($value);
- $this->validateLimit($paramName, $value, $min, $paramSettings[self :: PARAM_MAX1], $paramSettings[self :: PARAM_MAX2]);
- break;
- case 'boolean' :
- if ($multi)
- ApiBase :: dieDebug(__METHOD__, "Multi-values not supported for $paramName");
- break;
- case 'timestamp' :
- if ($multi)
- ApiBase :: dieDebug(__METHOD__, "Multi-values not supported for $paramName");
- if (!preg_match('/^[0-9]{14}$/', $value))
- $this->dieUsage("Invalid value '$value' for timestamp parameter $paramName", "badtimestamp_{$valueName}");
- break;
- default :
- ApiBase :: dieDebug(__METHOD__, "Param $paramName's type is unknown - $type");
-
+ if (isset ($value)) {
+ if (!is_array($type)) {
+ switch ($type) {
+ case 'NULL' : // nothing to do
+ break;
+ case 'string' : // nothing to do
+ break;
+ case 'integer' : // Force everything using intval()
+ $value = is_array($value) ? array_map('intval', $value) : intval($value);
+ break;
+ case 'limit' :
+ if (!isset ($paramSettings[self :: PARAM_MAX1]) || !isset ($paramSettings[self :: PARAM_MAX2]))
+ ApiBase :: dieDebug(__METHOD__, "MAX1 or MAX2 are not defined for the limit $paramName");
+ if ($multi)
+ ApiBase :: dieDebug(__METHOD__, "Multi-values not supported for $paramName");
+ $min = isset ($paramSettings[self :: PARAM_MIN]) ? $paramSettings[self :: PARAM_MIN] : 0;
+ $value = intval($value);
+ $this->validateLimit($paramName, $value, $min, $paramSettings[self :: PARAM_MAX1], $paramSettings[self :: PARAM_MAX2]);
+ break;
+ case 'boolean' :
+ if ($multi)
+ ApiBase :: dieDebug(__METHOD__, "Multi-values not supported for $paramName");
+ break;
+ case 'timestamp' :
+ if ($multi)
+ ApiBase :: dieDebug(__METHOD__, "Multi-values not supported for $paramName");
+ $value = wfTimestamp(TS_UNIX, $value);
+ if ($value === 0)
+ $this->dieUsage("Invalid value '$value' for timestamp parameter $paramName", "badtimestamp_{$paramName}");
+ $value = wfTimestamp(TS_MW, $value);
+ break;
+ default :
+ ApiBase :: dieDebug(__METHOD__, "Param $paramName's type is unknown - $type");
+ }
}
+
+ // There should never be any duplicate values in a list
+ if (is_array($value))
+ $value = array_unique($value);
}
return $value;
@@ -314,7 +392,7 @@ abstract class ApiBase {
if (is_array($allowedValues)) {
$unknownValues = array_diff($valuesList, $allowedValues);
if ($unknownValues) {
- $this->dieUsage('Unrecognised value' . (count($unknownValues) > 1 ? "s '" : " '") . implode("', '", $unknownValues) . "' for parameter '$valueName'", "unknown_$valueName");
+ $this->dieUsage('Unrecognised value' . (count($unknownValues) > 1 ? "s" : "") . " for parameter '$valueName'", "unknown_$valueName");
}
}
@@ -325,8 +403,6 @@ abstract class ApiBase {
* Validate the value against the minimum and user/bot maximum limits. Prints usage info on failure.
*/
function validateLimit($varname, $value, $min, $max, $botMax) {
- global $wgUser;
-
if ($value < $min) {
$this->dieUsage("$varname may not be less than $min (set to $value)", $varname);
}
@@ -345,7 +421,7 @@ abstract class ApiBase {
* Call main module's error handler
*/
public function dieUsage($description, $errorCode, $httpRespCode = 0) {
- $this->getMain()->mainDieUsage($description, $this->encodeParamName($errorCode), $httpRespCode);
+ throw new UsageException($description, $this->encodeParamName($errorCode), $httpRespCode);
}
/**
@@ -367,6 +443,7 @@ abstract class ApiBase {
if ($this->mTimeIn !== 0)
ApiBase :: dieDebug(__METHOD__, 'called twice without calling profileOut()');
$this->mTimeIn = microtime(true);
+ wfProfileIn($this->getModuleProfileName());
}
/**
@@ -380,6 +457,19 @@ abstract class ApiBase {
$this->mModuleTime += microtime(true) - $this->mTimeIn;
$this->mTimeIn = 0;
+ wfProfileOut($this->getModuleProfileName());
+ }
+
+ /**
+ * When modules crash, sometimes it is needed to do a profileOut() regardless
+ * of the profiling state the module was in. This method does such cleanup.
+ */
+ public function safeProfileOut() {
+ if ($this->mTimeIn !== 0) {
+ if ($this->mDBTimeIn !== 0)
+ $this->profileDBOut();
+ $this->profileOut();
+ }
}
/**
@@ -405,6 +495,7 @@ abstract class ApiBase {
if ($this->mDBTimeIn !== 0)
ApiBase :: dieDebug(__METHOD__, 'called twice without calling profileDBOut()');
$this->mDBTimeIn = microtime(true);
+ wfProfileIn($this->getModuleProfileName(true));
}
/**
@@ -421,6 +512,7 @@ abstract class ApiBase {
$this->mDBTime += $time;
$this->getMain()->mDBTime += $time;
+ wfProfileOut($this->getModuleProfileName(true));
}
/**
@@ -433,9 +525,9 @@ abstract class ApiBase {
}
public abstract function getVersion();
-
+
public static function getBaseVersion() {
- return __CLASS__ . ': $Id: ApiBase.php 16757 2006-10-03 05:41:55Z yurik $';
+ return __CLASS__ . ': $Id: ApiBase.php 17880 2006-11-23 08:25:56Z nickj $';
}
}
?> \ No newline at end of file
diff --git a/includes/api/ApiFeedWatchlist.php b/includes/api/ApiFeedWatchlist.php
new file mode 100644
index 00000000..7d1c1519
--- /dev/null
+++ b/includes/api/ApiFeedWatchlist.php
@@ -0,0 +1,125 @@
+<?php
+
+
+/*
+ * Created on Oct 13, 2006
+ *
+ * API for MediaWiki 1.8+
+ *
+ * Copyright (C) 2006 Yuri Astrakhan <FirstnameLastname@gmail.com>
+ *
+ * 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.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+if (!defined('MEDIAWIKI')) {
+ // Eclipse helper - will be ignored in production
+ require_once ("ApiBase.php");
+}
+
+class ApiFeedWatchlist extends ApiBase {
+
+ public function __construct($main, $action) {
+ parent :: __construct($main, $action);
+ }
+
+ public function getCustomPrinter() {
+ return new ApiFormatFeedWrapper($this->getMain());
+ }
+
+ public function execute() {
+ $feedformat = null;
+ extract($this->extractRequestParams());
+
+ // limit to 1 day
+ $startTime = wfTimestamp(TS_MW, time() - intval(1 * 86400));
+
+ // Prepare nested request
+ $params = new FauxRequest(array (
+ 'action' => 'query',
+ 'meta' => 'siteinfo',
+ 'siprop' => 'general',
+ 'list' => 'watchlist',
+ 'wlprop' => 'user|comment|timestamp',
+ 'wlstart' => $startTime,
+ 'wllimit' => 50
+ ));
+
+ // Execute
+ $module = new ApiMain($params);
+ $module->execute();
+
+ // Get data array
+ $data = $module->getResultData();
+
+ $feedItems = array ();
+ foreach ($data['query']['watchlist'] as $info) {
+ $feedItems[] = $this->createFeedItem($info);
+ }
+
+ global $wgFeedClasses, $wgSitename, $wgContLanguageCode;
+ $feedTitle = $wgSitename . ' - ' . wfMsgForContent('watchlist') . ' [' . $wgContLanguageCode . ']';
+ $feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullUrl();
+
+ $feed = new $wgFeedClasses[$feedformat] ($feedTitle, htmlspecialchars(wfMsgForContent('watchlist')), $feedUrl);
+
+ ApiFormatFeedWrapper :: setResult($this->getResult(), $feed, $feedItems);
+ }
+
+ private function createFeedItem($info) {
+ $titleStr = $info['title'];
+ $title = Title :: newFromText($titleStr);
+ $titleUrl = $title->getFullUrl();
+ $comment = isset( $info['comment'] ) ? $info['comment'] : null;
+ $timestamp = $info['timestamp'];
+ $user = $info['user'];
+
+ $completeText = "$comment ($user)";
+
+ return new FeedItem($titleStr, $completeText, $titleUrl, $timestamp, $user);
+ }
+
+ protected function getAllowedParams() {
+ global $wgFeedClasses;
+ $feedFormatNames = array_keys($wgFeedClasses);
+ return array (
+ 'feedformat' => array (
+ ApiBase :: PARAM_DFLT => 'rss',
+ ApiBase :: PARAM_TYPE => $feedFormatNames
+ )
+ );
+ }
+
+ protected function getParamDescription() {
+ return array (
+ 'feedformat' => 'The format of the feed'
+ );
+ }
+
+ protected function getDescription() {
+ return 'This module returns a watchlist feed';
+ }
+
+ protected function getExamples() {
+ return array (
+ 'api.php?action=feedwatchlist'
+ );
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiFeedWatchlist.php 17987 2006-11-29 05:45:03Z nickj $';
+ }
+}
+?>
diff --git a/includes/api/ApiFormatBase.php b/includes/api/ApiFormatBase.php
index 6f5b4aca..611960d3 100644
--- a/includes/api/ApiFormatBase.php
+++ b/includes/api/ApiFormatBase.php
@@ -75,32 +75,40 @@ abstract class ApiFormatBase extends ApiBase {
function initPrinter($isError) {
$isHtml = $this->getIsHtml();
$mime = $isHtml ? 'text/html' : $this->getMimeType();
+
+ // Some printers (ex. Feed) do their own header settings,
+ // in which case $mime will be set to null
+ if (is_null($mime))
+ return; // skip any initialization
+
header("Content-Type: $mime; charset=utf-8;");
if ($isHtml) {
?>
- <html>
- <head>
- <title>MediaWiki API</title>
- </head>
- <body>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+ <title>MediaWiki API</title>
+</head>
+<body>
<?php
if (!$isError) {
?>
- <br/>
- <small>
- This result is being shown in <?=$this->mFormat?> format,
- which might not be suitable for your application.<br/>
- See <a href='api.php'>API help</a> for more information.<br/>
- </small>
+<br/>
+<small>
+You are looking at the HTML representation of the <?=$this->mFormat?> format.<br/>
+HTML is good for debugging, but probably is not suitable for your application.<br/>
+Please see "format" parameter documentation at the <a href='api.php'>API help</a>
+for more information.
+</small>
<?php
}
?>
- <pre>
+<pre>
<?php
@@ -113,8 +121,10 @@ abstract class ApiFormatBase extends ApiBase {
public function closePrinter() {
if ($this->getIsHtml()) {
?>
- </pre>
- </body>
+
+</pre>
+</body>
+</html>
<?php
@@ -134,9 +144,10 @@ abstract class ApiFormatBase extends ApiBase {
*/
protected function formatHTML($text) {
// encode all tags as safe blue strings
- $text = ereg_replace('\<([^>]+)\>', '<font color=blue>&lt;\1&gt;</font>', $text);
+ $text = ereg_replace('\<([^>]+)\>', '<span style="color:blue;">&lt;\1&gt;</span>', $text);
// identify URLs
- $text = ereg_replace("[a-zA-Z]+://[^ '()<\n]+", '<a href="\\0">\\0</a>', $text);
+ $protos = "http|https|ftp|gopher";
+ $text = ereg_replace("($protos)://[^ '\"()<\n]+", '<a href="\\0">\\0</a>', $text);
// identify requests to api.php
$text = ereg_replace("api\\.php\\?[^ ()<\n\t]+", '<a href="\\0">\\0</a>', $text);
// make strings inside * bold
@@ -151,11 +162,71 @@ abstract class ApiFormatBase extends ApiBase {
* Returns usage examples for this format.
*/
protected function getExamples() {
- return 'api.php?action=query&meta=siteinfo&si=namespaces&format=' . $this->getModuleName();
+ return 'api.php?action=query&meta=siteinfo&siprop=namespaces&format=' . $this->getModuleName();
+ }
+
+ protected function getDescription() {
+ return $this->getIsHtml() ? ' (pretty-print in HTML)' : '';
}
public static function getBaseVersion() {
- return __CLASS__ . ': $Id: ApiFormatBase.php 16757 2006-10-03 05:41:55Z yurik $';
+ return __CLASS__ . ': $Id: ApiFormatBase.php 17374 2006-11-03 06:53:47Z yurik $';
+ }
+}
+
+/**
+ * This printer is used to wrap an instance of the Feed class
+ */
+class ApiFormatFeedWrapper extends ApiFormatBase {
+
+ public function __construct($main) {
+ parent :: __construct($main, 'feed');
+ }
+
+ /**
+ * Call this method to initialize output data
+ */
+ public static function setResult($result, $feed, $feedItems) {
+ // Store output in the Result data.
+ // This way we can check during execution if any error has occured
+ $data = & $result->getData();
+ $data['_feed'] = $feed;
+ $data['_feeditems'] = $feedItems;
+ }
+
+ /**
+ * Feed does its own headers
+ */
+ public function getMimeType() {
+ return null;
+ }
+
+ /**
+ * Optimization - no need to sanitize data that will not be needed
+ */
+ public function getNeedsRawData() {
+ return true;
+ }
+
+ public function execute() {
+ $data = $this->getResultData();
+ if (isset ($data['_feed']) && isset ($data['_feeditems'])) {
+ $feed = $data['_feed'];
+ $items = $data['_feeditems'];
+
+ $feed->outHeader();
+ foreach ($items as & $item)
+ $feed->outItem($item);
+ $feed->outFooter();
+ } else {
+ // Error has occured, print something usefull
+ // TODO: make this error more informative using ApiBase :: dieDebug() or similar
+ wfHttpError(500, 'Internal Server Error', '');
+ }
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiFormatBase.php 17374 2006-11-03 06:53:47Z yurik $';
}
}
-?> \ No newline at end of file
+?>
diff --git a/includes/api/ApiFormatJson.php b/includes/api/ApiFormatJson.php
index fdc29cf2..45c735c8 100644
--- a/includes/api/ApiFormatJson.php
+++ b/includes/api/ApiFormatJson.php
@@ -31,26 +31,39 @@ if (!defined('MEDIAWIKI')) {
class ApiFormatJson extends ApiFormatBase {
+ private $mIsRaw;
+
public function __construct($main, $format) {
parent :: __construct($main, $format);
+ $this->mIsRaw = ($format === 'rawfm');
}
public function getMimeType() {
return 'application/json';
}
+ public function getNeedsRawData() {
+ return $this->mIsRaw;
+ }
+
public function execute() {
- require ('ApiFormatJson_json.php');
- $json = new Services_JSON();
- $this->printText($json->encode($this->getResultData(), true));
+ if (!function_exists('json_encode') || $this->getIsHtml()) {
+ $json = new Services_JSON();
+ $this->printText($json->encode($this->getResultData(), $this->getIsHtml()));
+ } else {
+ $this->printText(json_encode($this->getResultData()));
+ }
}
protected function getDescription() {
- return 'Output data in JSON format';
+ if ($this->mIsRaw)
+ return 'Output data with the debuging elements in JSON format' . parent :: getDescription();
+ else
+ return 'Output data in JSON format' . parent :: getDescription();
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiFormatJson.php 16725 2006-10-01 21:20:55Z yurik $';
+ return __CLASS__ . ': $Id: ApiFormatJson.php 17374 2006-11-03 06:53:47Z yurik $';
}
}
?> \ No newline at end of file
diff --git a/includes/api/ApiFormatPhp.php b/includes/api/ApiFormatPhp.php
new file mode 100644
index 00000000..938ba032
--- /dev/null
+++ b/includes/api/ApiFormatPhp.php
@@ -0,0 +1,54 @@
+<?php
+
+
+/*
+ * Created on Oct 22, 2006
+ *
+ * API for MediaWiki 1.8+
+ *
+ * Copyright (C) 2006 Yuri Astrakhan <FirstnameLastname@gmail.com>
+ *
+ * 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.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+if (!defined('MEDIAWIKI')) {
+ // Eclipse helper - will be ignored in production
+ require_once ('ApiFormatBase.php');
+}
+
+class ApiFormatPhp extends ApiFormatBase {
+
+ public function __construct($main, $format) {
+ parent :: __construct($main, $format);
+ }
+
+ public function getMimeType() {
+ return 'application/vnd.php.serialized';
+ }
+
+ public function execute() {
+ $this->printText(serialize($this->getResultData()));
+ }
+
+ protected function getDescription() {
+ return 'Output data in serialized PHP format' . parent :: getDescription();
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiFormatPhp.php 17374 2006-11-03 06:53:47Z yurik $';
+ }
+}
+?> \ No newline at end of file
diff --git a/includes/api/ApiFormatWddx.php b/includes/api/ApiFormatWddx.php
new file mode 100644
index 00000000..e97b996c
--- /dev/null
+++ b/includes/api/ApiFormatWddx.php
@@ -0,0 +1,89 @@
+<?php
+
+
+/*
+ * Created on Oct 22, 2006
+ *
+ * API for MediaWiki 1.8+
+ *
+ * Copyright (C) 2006 Yuri Astrakhan <FirstnameLastname@gmail.com>
+ *
+ * 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.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+if (!defined('MEDIAWIKI')) {
+ // Eclipse helper - will be ignored in production
+ require_once ('ApiFormatBase.php');
+}
+
+class ApiFormatWddx extends ApiFormatBase {
+
+ public function __construct($main, $format) {
+ parent :: __construct($main, $format);
+ }
+
+ public function getMimeType() {
+ return 'text/xml';
+ }
+
+ public function execute() {
+ if (function_exists('wddx_serialize_value')) {
+ $this->printText(wddx_serialize_value($this->getResultData()));
+ } else {
+ $this->printText('<?xml version="1.0" encoding="utf-8"?>');
+ $this->printText('<wddxPacket version="1.0"><header/><data>');
+ $this->slowWddxPrinter($this->getResultData());
+ $this->printText('</data></wddxPacket>');
+ }
+ }
+
+ /**
+ * Recursivelly go through the object and output its data in WDDX format.
+ */
+ function slowWddxPrinter($elemValue) {
+ switch (gettype($elemValue)) {
+ case 'array' :
+ $this->printText('<struct>');
+ foreach ($elemValue as $subElemName => $subElemValue) {
+ $this->printText(wfElement('var', array (
+ 'name' => $subElemName
+ ), null));
+ $this->slowWddxPrinter($subElemValue);
+ $this->printText('</var>');
+ }
+ $this->printText('</struct>');
+ break;
+ case 'integer' :
+ case 'double' :
+ $this->printText(wfElement('number', null, $elemValue));
+ break;
+ case 'string' :
+ $this->printText(wfElement('string', null, $elemValue));
+ break;
+ default :
+ ApiBase :: dieDebug(__METHOD__, 'Unknown type ' . gettype($elemValue));
+ }
+ }
+
+ protected function getDescription() {
+ return 'Output data in WDDX format' . parent :: getDescription();
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiFormatWddx.php 17374 2006-11-03 06:53:47Z yurik $';
+ }
+}
+?> \ No newline at end of file
diff --git a/includes/api/ApiFormatXml.php b/includes/api/ApiFormatXml.php
index 6aa08e00..2326ba42 100644
--- a/includes/api/ApiFormatXml.php
+++ b/includes/api/ApiFormatXml.php
@@ -31,6 +31,8 @@ if (!defined('MEDIAWIKI')) {
class ApiFormatXml extends ApiFormatBase {
+ private $mRootElemName = 'api';
+
public function __construct($main, $format) {
parent :: __construct($main, $format);
}
@@ -42,18 +44,14 @@ class ApiFormatXml extends ApiFormatBase {
public function getNeedsRawData() {
return true;
}
+
+ public function setRootElement($rootElemName) {
+ $this->mRootElemName = $rootElemName;
+ }
public function execute() {
- $xmlindent = null;
- extract($this->extractRequestParams());
-
- if ($xmlindent || $this->getIsHtml())
- $xmlindent = -2;
- else
- $xmlindent = null;
-
$this->printText('<?xml version="1.0" encoding="utf-8"?>');
- $this->recXmlPrint('api', $this->getResultData(), $xmlindent);
+ $this->recXmlPrint($this->mRootElemName, $this->getResultData(), $this->getIsHtml() ? -2 : null);
}
/**
@@ -98,8 +96,6 @@ class ApiFormatXml extends ApiFormatBase {
$subElements = array ();
foreach ($elemValue as $subElemId => & $subElemValue) {
if (gettype($subElemId) === 'integer') {
- if (!is_array($subElemValue))
- ApiBase :: dieDebug(__METHOD__, "($elemName, ...) has a scalar indexed value.");
$indElements[] = $subElemValue;
unset ($elemValue[$subElemId]);
} elseif (is_array($subElemValue)) {
@@ -109,7 +105,7 @@ class ApiFormatXml extends ApiFormatBase {
}
if (is_null($subElemIndName) && !empty ($indElements))
- ApiBase :: dieDebug(__METHOD__, "($elemName, ...) has integer keys without _element value");
+ ApiBase :: dieDebug(__METHOD__, "($elemName, ...) has integer keys without _element value. Use ApiResult::setIndexedTagName().");
if (!empty ($subElements) && !empty ($indElements) && !is_null($subElemContent))
ApiBase :: dieDebug(__METHOD__, "($elemName, ...) has content and subelements");
@@ -139,23 +135,11 @@ class ApiFormatXml extends ApiFormatBase {
}
}
protected function getDescription() {
- return 'Output data in XML format';
- }
-
- protected function getAllowedParams() {
- return array (
- 'xmlindent' => false
- );
- }
-
- protected function getParamDescription() {
- return array (
- 'xmlindent' => 'Enable XML indentation'
- );
+ return 'Output data in XML format' . parent :: getDescription();
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiFormatXml.php 16725 2006-10-01 21:20:55Z yurik $';
+ return __CLASS__ . ': $Id: ApiFormatXml.php 17374 2006-11-03 06:53:47Z yurik $';
}
}
?> \ No newline at end of file
diff --git a/includes/api/ApiFormatYaml.php b/includes/api/ApiFormatYaml.php
index bd74f01a..2371903f 100644
--- a/includes/api/ApiFormatYaml.php
+++ b/includes/api/ApiFormatYaml.php
@@ -40,16 +40,15 @@ class ApiFormatYaml extends ApiFormatBase {
}
public function execute() {
- require ('ApiFormatYaml_spyc.php');
$this->printText(Spyc :: YAMLDump($this->getResultData()));
}
protected function getDescription() {
- return 'Output data in YAML format';
+ return 'Output data in YAML format' . parent :: getDescription();
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiFormatYaml.php 16725 2006-10-01 21:20:55Z yurik $';
+ return __CLASS__ . ': $Id: ApiFormatYaml.php 17374 2006-11-03 06:53:47Z yurik $';
}
}
?> \ No newline at end of file
diff --git a/includes/api/ApiFormatYaml_spyc.php b/includes/api/ApiFormatYaml_spyc.php
index 05a39e23..1ec8af48 100644
--- a/includes/api/ApiFormatYaml_spyc.php
+++ b/includes/api/ApiFormatYaml_spyc.php
@@ -463,6 +463,7 @@
* @param string $line A line from the YAML file
*/
function _getIndent($line) {
+ $match = array();
preg_match('/^\s{1,}/',$line,$match);
if (!empty($match[0])) {
$indent = substr_count($match[0],' ');
@@ -500,6 +501,7 @@
} elseif (preg_match('/^(.+):/',$line,$key)) {
// It's a key/value pair most likely
// If the key is in double quotes pull it out
+ $matches = array();
if (preg_match('/^(["\'](.*)["\'](\s)*:)/',$line,$matches)) {
$value = trim(str_replace($matches[1],'',$line));
$key = $matches[2];
@@ -529,6 +531,7 @@
* @return mixed
*/
function _toType($value) {
+ $matches = array();
if (preg_match('/^("(.*)"|\'(.*)\')/',$value,$matches)) {
$value = (string)preg_replace('/(\'\'|\\\\\')/',"'",end($matches));
$value = preg_replace('/\\\\"/','"',$value);
@@ -596,6 +599,7 @@
// Check for strings
$regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/';
+ $strings = array();
if (preg_match_all($regex,$inline,$strings)) {
$saved_strings[] = $strings[0][0];
$inline = preg_replace($regex,'YAMLString',$inline);
@@ -603,12 +607,14 @@
unset($regex);
// Check for sequences
+ $seqs = array();
if (preg_match_all('/\[(.+)\]/U',$inline,$seqs)) {
$inline = preg_replace('/\[(.+)\]/U','YAMLSeq',$inline);
$seqs = $seqs[0];
}
// Check for mappings
+ $maps = array();
if (preg_match_all('/{(.+)}/U',$inline,$maps)) {
$inline = preg_replace('/{(.+)}/U','YAMLMap',$inline);
$maps = $maps[0];
@@ -704,6 +710,7 @@
function _linkRef(&$n,$key,$k = NULL,$v = NULL) {
if (empty($k) && empty($v)) {
// Look for &refs
+ $matches = array();
if (preg_match('/^&([^ ]+)/',$n->data[$key],$matches)) {
// Flag the node so we know it's a reference
$this->_allNodes[$n->id]->ref = substr($matches[0],1);
@@ -837,7 +844,7 @@
$ret = array();
foreach($keys as $key) {
- list($unused,$val) = each($vals);
+ list( /* unused */ ,$val) = each($vals);
// This is the good part! If a key already exists, but it's part of a
// sequence (an int), just keep addin numbers until we find a fresh one.
if (isset($ret[$key]) and is_int($key)) {
diff --git a/includes/api/ApiLogin.php b/includes/api/ApiLogin.php
index 2aa571c1..d9697dc3 100644
--- a/includes/api/ApiLogin.php
+++ b/includes/api/ApiLogin.php
@@ -89,8 +89,8 @@ class ApiLogin extends ApiBase {
protected function getAllowedParams() {
return array (
- 'name' => '',
- 'password' => '',
+ 'name' => null,
+ 'password' => null,
'domain' => null
);
}
@@ -116,7 +116,7 @@ class ApiLogin extends ApiBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiLogin.php 16757 2006-10-03 05:41:55Z yurik $';
+ return __CLASS__ . ': $Id: ApiLogin.php 17065 2006-10-17 02:11:29Z yurik $';
}
}
?>
diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php
index 046d7d7c..606f022b 100644
--- a/includes/api/ApiMain.php
+++ b/includes/api/ApiMain.php
@@ -29,36 +29,79 @@ if (!defined('MEDIAWIKI')) {
require_once ('ApiBase.php');
}
+/**
+ * This is the main API class, used for both external and internal processing.
+ */
class ApiMain extends ApiBase {
+ /**
+ * When no format parameter is given, this format will be used
+ */
+ const API_DEFAULT_FORMAT = 'xmlfm';
+
+ /**
+ * List of available modules: action name => module class
+ */
+ private static $Modules = array (
+ 'help' => 'ApiHelp',
+ 'login' => 'ApiLogin',
+ 'opensearch' => 'ApiOpenSearch',
+ 'feedwatchlist' => 'ApiFeedWatchlist',
+ 'query' => 'ApiQuery'
+ );
+
+ /**
+ * List of available formats: format name => format class
+ */
+ private static $Formats = array (
+ 'json' => 'ApiFormatJson',
+ 'jsonfm' => 'ApiFormatJson',
+ 'php' => 'ApiFormatPhp',
+ 'phpfm' => 'ApiFormatPhp',
+ 'wddx' => 'ApiFormatWddx',
+ 'wddxfm' => 'ApiFormatWddx',
+ 'xml' => 'ApiFormatXml',
+ 'xmlfm' => 'ApiFormatXml',
+ 'yaml' => 'ApiFormatYaml',
+ 'yamlfm' => 'ApiFormatYaml',
+ 'rawfm' => 'ApiFormatJson'
+ );
+
private $mPrinter, $mModules, $mModuleNames, $mFormats, $mFormatNames;
- private $mApiStartTime, $mResult, $mShowVersions, $mEnableWrite;
+ private $mResult, $mShowVersions, $mEnableWrite, $mRequest, $mInternalMode, $mSquidMaxage;
/**
* Constructor
- * $apiStartTime - time of the originating call for profiling purposes
- * $modules - an array of actions (keys) and classes that handle them (values)
+ * @param $request object - if this is an instance of FauxRequest, errors are thrown and no printing occurs
+ * @param $enableWrite bool should be set to true if the api may modify data
*/
- public function __construct($apiStartTime, $modules, $formats, $enableWrite) {
+ public function __construct($request, $enableWrite = false) {
+
+ $this->mInternalMode = ($request instanceof FauxRequest);
+
// Special handling for the main module: $parent === $this
- parent :: __construct($this, 'main');
+ parent :: __construct($this, $this->mInternalMode ? 'main_int' : 'main');
+
+ $this->mModules = self :: $Modules;
+ $this->mModuleNames = array_keys($this->mModules); // todo: optimize
+ $this->mFormats = self :: $Formats;
+ $this->mFormatNames = array_keys($this->mFormats); // todo: optimize
- $this->mModules = $modules;
- $this->mModuleNames = array_keys($modules);
- $this->mFormats = $formats;
- $this->mFormatNames = array_keys($formats);
- $this->mApiStartTime = $apiStartTime;
$this->mResult = new ApiResult($this);
$this->mShowVersions = false;
$this->mEnableWrite = $enableWrite;
+
+ $this->mRequest = & $request;
+
+ $this->mSquidMaxage = 0;
}
- public function & getResult() {
- return $this->mResult;
+ public function & getRequest() {
+ return $this->mRequest;
}
- public function getShowVersions() {
- return $this->mShowVersions;
+ public function getResult() {
+ return $this->mResult;
}
public function requestWriteMode() {
@@ -67,94 +110,180 @@ class ApiMain extends ApiBase {
'statement is included in the site\'s LocalSettings.php file', 'readonly');
}
- protected function getAllowedParams() {
- return array (
- 'format' => array (
- ApiBase :: PARAM_DFLT => API_DEFAULT_FORMAT,
- ApiBase :: PARAM_TYPE => $this->mFormatNames
- ),
- 'action' => array (
- ApiBase :: PARAM_DFLT => 'help',
- ApiBase :: PARAM_TYPE => $this->mModuleNames
- ),
- 'version' => false
- );
+ public function setCacheMaxAge($maxage) {
+ $this->mSquidMaxage = $maxage;
}
- protected function getParamDescription() {
- return array (
- 'format' => 'The format of the output',
- 'action' => 'What action you would like to perform',
- 'version' => 'When showing help, include version for each module'
- );
+ public function createPrinterByName($format) {
+ return new $this->mFormats[$format] ($this, $format);
}
public function execute() {
$this->profileIn();
- $action = $format = $version = null;
- try {
- extract($this->extractRequestParams());
- $this->mShowVersions = $version;
+ if ($this->mInternalMode)
+ $this->executeAction();
+ else
+ $this->executeActionWithErrorHandling();
+ $this->profileOut();
+ }
- // Create an appropriate printer
- $this->mPrinter = new $this->mFormats[$format] ($this, $format);
+ protected function executeActionWithErrorHandling() {
- // Instantiate and execute module requested by the user
- $module = new $this->mModules[$action] ($this, $action);
- $module->profileIn();
- $module->execute();
- $module->profileOut();
- $this->printResult(false);
+ // In case an error occurs during data output,
+ // this clear the output buffer and print just the error information
+ ob_start();
- } catch (UsageException $e) {
+ try {
+ $this->executeAction();
+ } catch (Exception $e) {
+ //
+ // Handle any kind of exception by outputing properly formatted error message.
+ // If this fails, an unhandled exception should be thrown so that global error
+ // handler will process and log it.
+ //
+
+ // Error results should not be cached
+ $this->setCacheMaxAge(0);
// Printer may not be initialized if the extractRequestParams() fails for the main module
- if (!isset ($this->mPrinter))
- $this->mPrinter = new $this->mFormats[API_DEFAULT_FORMAT] ($this, API_DEFAULT_FORMAT);
+ if (!isset ($this->mPrinter)) {
+ $this->mPrinter = $this->createPrinterByName(self :: API_DEFAULT_FORMAT);
+ if ($this->mPrinter->getNeedsRawData())
+ $this->getResult()->setRawMode();
+ }
+
+ if ($e instanceof UsageException) {
+ //
+ // User entered incorrect parameters - print usage screen
+ //
+ $errMessage = array (
+ 'code' => $e->getCodeString(), 'info' => $e->getMessage());
+ ApiResult :: setContent($errMessage, $this->makeHelpMsg());
+
+ } else {
+ //
+ // Something is seriously wrong
+ //
+ $errMessage = array (
+ 'code' => 'internal_api_error',
+ 'info' => "Exception Caught: {$e->getMessage()}"
+ );
+ ApiResult :: setContent($errMessage, "\n\n{$e->getTraceAsString()}\n\n");
+ }
+
+ $headerStr = 'MediaWiki-API-Error: ' . $errMessage['code'];
+ if ($e->getCode() === 0)
+ header($headerStr, true);
+ else
+ header($headerStr, true, $e->getCode());
+
+ // Reset and print just the error message
+ ob_clean();
+ $this->getResult()->reset();
+ $this->getResult()->addValue(null, 'error', $errMessage);
+
+ // If the error occured during printing, do a printer->profileOut()
+ $this->mPrinter->safeProfileOut();
$this->printResult(true);
+ }
+ // Set the cache expiration at the last moment, as any errors may change the expiration.
+ // if $this->mSquidMaxage == 0, the expiry time is set to the first second of unix epoch
+ $expires = $this->mSquidMaxage == 0 ? 1 : time() + $this->mSquidMaxage;
+ header('Expires: ' . wfTimestamp(TS_RFC2822, $expires));
+ header('Cache-Control: s-maxage=' . $this->mSquidMaxage . ', must-revalidate, max-age=0');
+
+ ob_end_flush();
+ }
+
+ /**
+ * Execute the actual module, without any error handling
+ */
+ protected function executeAction() {
+ $action = $format = $version = null;
+ extract($this->extractRequestParams());
+ $this->mShowVersions = $version;
+
+ // Instantiate the module requested by the user
+ $module = new $this->mModules[$action] ($this, $action);
+
+ if (!$this->mInternalMode) {
+
+ // See if custom printer is used
+ $this->mPrinter = $module->getCustomPrinter();
+ if (is_null($this->mPrinter)) {
+ // Create an appropriate printer
+ $this->mPrinter = $this->createPrinterByName($format);
+ }
+
+ if ($this->mPrinter->getNeedsRawData())
+ $this->getResult()->setRawMode();
+ }
+
+ // Execute
+ $module->profileIn();
+ $module->execute();
+ $module->profileOut();
+
+ if (!$this->mInternalMode) {
+ // Print result data
+ $this->printResult(false);
}
- $this->profileOut();
}
/**
* Internal printer
*/
- private function printResult($isError) {
+ protected function printResult($isError) {
$printer = $this->mPrinter;
$printer->profileIn();
$printer->initPrinter($isError);
- if (!$printer->getNeedsRawData())
- $this->getResult()->SanitizeData();
$printer->execute();
$printer->closePrinter();
$printer->profileOut();
}
+ protected function getAllowedParams() {
+ return array (
+ 'format' => array (
+ ApiBase :: PARAM_DFLT => ApiMain :: API_DEFAULT_FORMAT,
+ ApiBase :: PARAM_TYPE => $this->mFormatNames
+ ),
+ 'action' => array (
+ ApiBase :: PARAM_DFLT => 'help',
+ ApiBase :: PARAM_TYPE => $this->mModuleNames
+ ),
+ 'version' => false
+ );
+ }
+
+ protected function getParamDescription() {
+ return array (
+ 'format' => 'The format of the output',
+ 'action' => 'What action you would like to perform',
+ 'version' => 'When showing help, include version for each module'
+ );
+ }
+
protected function getDescription() {
return array (
'',
'This API allows programs to access various functions of MediaWiki software.',
'For more details see API Home Page @ http://meta.wikimedia.org/wiki/API',
+ '',
+ 'Status: ALPHA -- all features shown on this page should be working,',
+ ' but the API is still in active development, and may change at any time.',
+ ' Make sure you monitor changes to this page, wikitech-l mailing list,',
+ ' or the source code in the includes/api directory for any changes.',
''
);
}
-
- public function mainDieUsage($description, $errorCode, $httpRespCode = 0) {
- $this->mResult->Reset();
- if ($httpRespCode === 0)
- header($errorCode, true);
- else
- header($errorCode, true, $httpRespCode);
-
- $data = array (
- 'code' => $errorCode,
- 'info' => $description
+
+ protected function getCredits() {
+ return array(
+ 'This API is being implemented by Yuri Astrakhan [[User:Yurik]] / FirstnameLastname@gmail.com',
+ 'Please leave your comments and suggestions at http://meta.wikimedia.org/wiki/API'
);
- ApiResult :: setContent($data, $this->makeHelpMsg());
- $this->mResult->addValue(null, 'error', $data);
-
- throw new UsageException($description, $errorCode);
}
/**
@@ -167,7 +296,7 @@ class ApiMain extends ApiBase {
$astriks = str_repeat('*** ', 10);
$msg .= "\n\n$astriks Modules $astriks\n\n";
- foreach ($this->mModules as $moduleName => $moduleClass) {
+ foreach( $this->mModules as $moduleName => $unused ) {
$msg .= "* action=$moduleName *";
$module = new $this->mModules[$moduleName] ($this, $moduleName);
$msg2 = $module->makeHelpMsg();
@@ -177,14 +306,17 @@ class ApiMain extends ApiBase {
}
$msg .= "\n$astriks Formats $astriks\n\n";
- foreach ($this->mFormats as $moduleName => $moduleClass) {
- $msg .= "* format=$moduleName *";
- $module = new $this->mFormats[$moduleName] ($this, $moduleName);
+ foreach( $this->mFormats as $formatName => $unused ) {
+ $msg .= "* format=$formatName *";
+ $module = $this->createPrinterByName($formatName);
$msg2 = $module->makeHelpMsg();
if ($msg2 !== false)
$msg .= $msg2;
$msg .= "\n";
}
+
+ $msg .= "\n*** Credits: ***\n " . implode("\n ", $this->getCredits()) . "\n";
+
return $msg;
}
@@ -198,12 +330,17 @@ class ApiMain extends ApiBase {
return $this->mIsBot;
}
+ public function getShowVersions() {
+ return $this->mShowVersions;
+ }
+
public function getVersion() {
$vers = array ();
- $vers[] = __CLASS__ . ': $Id: ApiMain.php 16820 2006-10-06 01:02:14Z yurik $';
+ $vers[] = __CLASS__ . ': $Id: ApiMain.php 17987 2006-11-29 05:45:03Z nickj $';
$vers[] = ApiBase :: getBaseVersion();
$vers[] = ApiFormatBase :: getBaseVersion();
$vers[] = ApiQueryBase :: getBaseVersion();
+ $vers[] = ApiFormatFeedWrapper :: getVersion(); // not accessible with format=xxx
return $vers;
}
}
@@ -213,14 +350,17 @@ class ApiMain extends ApiBase {
*/
class UsageException extends Exception {
- private $codestr;
+ private $mCodestr;
- public function __construct($message, $codestr) {
- parent :: __construct($message);
- $this->codestr = $codestr;
+ public function __construct($message, $codestr, $code = 0) {
+ parent :: __construct($message, $code);
+ $this->mCodestr = $codestr;
+ }
+ public function getCodeString() {
+ return $this->mCodestr;
}
public function __toString() {
- return "{$this->codestr}: {$this->message}";
+ return "{$this->getCodeString()}: {$this->getMessage()}";
}
}
-?> \ No newline at end of file
+?>
diff --git a/includes/api/ApiOpenSearch.php b/includes/api/ApiOpenSearch.php
new file mode 100644
index 00000000..a5a13a7b
--- /dev/null
+++ b/includes/api/ApiOpenSearch.php
@@ -0,0 +1,109 @@
+<?php
+
+
+/*
+ * Created on Oct 13, 2006
+ *
+ * API for MediaWiki 1.8+
+ *
+ * Copyright (C) 2006 Yuri Astrakhan <FirstnameLastname@gmail.com>
+ *
+ * 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.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+if (!defined('MEDIAWIKI')) {
+ // Eclipse helper - will be ignored in production
+ require_once ("ApiBase.php");
+}
+
+class ApiOpenSearch extends ApiBase {
+
+ public function __construct($main, $action) {
+ parent :: __construct($main, $action);
+ }
+
+ public function getCustomPrinter() {
+ return $this->getMain()->createPrinterByName('json');
+ }
+
+ public function execute() {
+ $search = null;
+ extract($this->ExtractRequestParams());
+
+ // Open search results may be stored for a very long time
+ $this->getMain()->setCacheMaxAge(1200);
+
+ $title = Title :: newFromText($search);
+ if(!$title)
+ return; // Return empty result
+
+ // Prepare nested request
+ $params = new FauxRequest(array (
+ 'action' => 'query',
+ 'list' => 'allpages',
+ 'apnamespace' => $title->getNamespace(),
+ 'aplimit' => 10,
+ 'apprefix' => $title->getDBkey()
+ ));
+
+ // Execute
+ $module = new ApiMain($params);
+ $module->execute();
+
+ // Get resulting data
+ $data = $module->getResultData();
+
+ // Reformat useful data for future printing by JSON engine
+ $srchres = array ();
+ foreach ($data['query']['allpages'] as & $pageinfo) {
+ // Note: this data will no be printable by the xml engine
+ // because it does not support lists of unnamed items
+ $srchres[] = $pageinfo['title'];
+ }
+
+ // Set top level elements
+ $result = $this->getResult();
+ $result->addValue(null, 0, $search);
+ $result->addValue(null, 1, $srchres);
+ }
+
+ protected function getAllowedParams() {
+ return array (
+ 'search' => null
+ );
+ }
+
+ protected function getParamDescription() {
+ return array (
+ 'search' => 'Search string'
+ );
+ }
+
+ protected function getDescription() {
+ return 'This module implements OpenSearch protocol';
+ }
+
+ protected function getExamples() {
+ return array (
+ 'api.php?action=opensearch&search=Te'
+ );
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiOpenSearch.php 17880 2006-11-23 08:25:56Z nickj $';
+ }
+}
+?> \ No newline at end of file
diff --git a/includes/api/ApiPageSet.php b/includes/api/ApiPageSet.php
index d2384b39..4728a9f8 100644
--- a/includes/api/ApiPageSet.php
+++ b/includes/api/ApiPageSet.php
@@ -32,8 +32,9 @@ if (!defined('MEDIAWIKI')) {
class ApiPageSet extends ApiQueryBase {
private $mAllPages; // [ns][dbkey] => page_id or 0 when missing
- private $mGoodTitles, $mMissingTitles, $mMissingPageIDs, $mRedirectTitles, $mNormalizedTitles;
+ private $mTitles, $mGoodTitles, $mMissingTitles, $mMissingPageIDs, $mRedirectTitles, $mNormalizedTitles;
private $mResolveRedirects, $mPendingRedirectIDs;
+ private $mGoodRevIDs, $mMissingRevIDs;
private $mRequestedPageFields;
@@ -41,11 +42,14 @@ class ApiPageSet extends ApiQueryBase {
parent :: __construct($query, __CLASS__);
$this->mAllPages = array ();
+ $this->mTitles = array();
$this->mGoodTitles = array ();
$this->mMissingTitles = array ();
$this->mMissingPageIDs = array ();
$this->mRedirectTitles = array ();
$this->mNormalizedTitles = array ();
+ $this->mGoodRevIDs = array();
+ $this->mMissingRevIDs = array();
$this->mRequestedPageFields = array ();
$this->mResolveRedirects = $resolveRedirects;
@@ -86,6 +90,21 @@ class ApiPageSet extends ApiQueryBase {
}
/**
+ * All Title objects provided.
+ * @return array of Title objects
+ */
+ public function getTitles() {
+ return $this->mTitles;
+ }
+
+ /**
+ * Returns the number of unique pages (not revisions) in the set.
+ */
+ public function getTitleCount() {
+ return count($this->mTitles);
+ }
+
+ /**
* Title objects that were found in the database.
* @return array page_id (int) => Title (obj)
*/
@@ -94,10 +113,10 @@ class ApiPageSet extends ApiQueryBase {
}
/**
- * Returns the number of unique pages (not revisions) in the set.
+ * Returns the number of found unique pages (not revisions) in the set.
*/
public function getGoodTitleCount() {
- return count($this->getGoodTitles());
+ return count($this->mGoodTitles);
}
/**
@@ -135,16 +154,25 @@ class ApiPageSet extends ApiQueryBase {
/**
* Get the list of revision IDs (requested with revids= parameter)
+ * @return array revID (int) => pageID (int)
*/
public function getRevisionIDs() {
- $this->dieUsage(__METHOD__ . ' is not implemented', 'notimplemented');
+ return $this->mGoodRevIDs;
+ }
+
+ /**
+ * Revision IDs that were not found in the database
+ * @return array of revision IDs
+ */
+ public function getMissingRevisionIDs() {
+ return $this->mMissingRevIDs;
}
/**
* Returns the number of revisions (requested with revids= parameter)
*/
public function getRevisionCount() {
- return 0; // TODO: implement
+ return count($this->getRevisionIDs());
}
/**
@@ -178,6 +206,8 @@ class ApiPageSet extends ApiQueryBase {
$this->initFromPageIds($pageids);
break;
case 'revids' :
+ if($this->mResolveRedirects)
+ $this->dieUsage('revids may not be used with redirect resolution', 'params');
$this->initFromRevIDs($revids);
break;
default :
@@ -216,23 +246,39 @@ class ApiPageSet extends ApiQueryBase {
}
/**
+ * Initialize PageSet from a list of Revision IDs
+ */
+ public function populateFromRevisionIDs($revIDs) {
+ $this->profileIn();
+ $revIDs = array_map('intval', $revIDs); // paranoia
+ $this->initFromRevIDs($revIDs);
+ $this->profileOut();
+ }
+
+ /**
* Extract all requested fields from the row received from the database
*/
public function processDbRow($row) {
- $pageId = intval($row->page_id);
-
+
// Store Title object in various data structures
$title = Title :: makeTitle($row->page_namespace, $row->page_title);
- $this->mAllPages[$row->page_namespace][$row->page_title] = $pageId;
+
+ // skip any pages that user has no rights to read
+ if ($title->userCanRead()) {
- if ($this->mResolveRedirects && $row->page_is_redirect == '1') {
- $this->mPendingRedirectIDs[$pageId] = $title;
- } else {
- $this->mGoodTitles[$pageId] = $title;
+ $pageId = intval($row->page_id);
+ $this->mAllPages[$row->page_namespace][$row->page_title] = $pageId;
+ $this->mTitles[] = $title;
+
+ if ($this->mResolveRedirects && $row->page_is_redirect == '1') {
+ $this->mPendingRedirectIDs[$pageId] = $title;
+ } else {
+ $this->mGoodTitles[$pageId] = $title;
+ }
+
+ foreach ($this->mRequestedPageFields as $fieldName => & $fieldValues)
+ $fieldValues[$pageId] = $row-> $fieldName;
}
-
- foreach ($this->mRequestedPageFields as $fieldName => & $fieldValues)
- $fieldValues[$pageId] = $row-> $fieldName;
}
public function finishPageSetGeneration() {
@@ -256,10 +302,13 @@ class ApiPageSet extends ApiQueryBase {
* #6 Repeat from step #1
*/
private function initFromTitles($titles) {
- $db = $this->getDB();
// Get validated and normalized title objects
$linkBatch = $this->processTitlesStrArray($titles);
+ if($linkBatch->isEmpty())
+ return;
+
+ $db = & $this->getDB();
$set = $linkBatch->constructSet('page', $db);
// Get pageIDs data from the `page` table
@@ -275,12 +324,15 @@ class ApiPageSet extends ApiQueryBase {
}
private function initFromPageIds($pageids) {
- $db = $this->getDB();
-
+ if(empty($pageids))
+ return;
+
$set = array (
'page_id' => $pageids
);
+ $db = & $this->getDB();
+
// Get pageIDs data from the `page` table
$this->profileDBIn();
$res = $db->select('page', $this->getPageTableFields(), $set, __METHOD__);
@@ -306,7 +358,7 @@ class ApiPageSet extends ApiQueryBase {
*/
private function initFromQueryResult($db, $res, &$remaining = null, $processTitles = null) {
if (!is_null($remaining) && is_null($processTitles))
- $this->dieDebug('Missing $processTitles parameter when $remaining is provided');
+ ApiBase :: dieDebug(__METHOD__, 'Missing $processTitles parameter when $remaining is provided');
while ($row = $db->fetchObject($res)) {
@@ -330,9 +382,11 @@ class ApiPageSet extends ApiQueryBase {
if($processTitles) {
// The remaining titles in $remaining are non-existant pages
foreach ($remaining as $ns => $dbkeys) {
- foreach ($dbkeys as $dbkey => $nothing) {
- $this->mMissingTitles[] = Title :: makeTitle($ns, $dbkey);
+ foreach ( $dbkeys as $dbkey => $unused ) {
+ $title = Title :: makeTitle($ns, $dbkey);
+ $this->mMissingTitles[] = $title;
$this->mAllPages[$ns][$dbkey] = 0;
+ $this->mTitles[] = $title;
}
}
}
@@ -348,13 +402,43 @@ class ApiPageSet extends ApiQueryBase {
}
private function initFromRevIDs($revids) {
- $this->dieUsage(__METHOD__ . ' is not implemented', 'notimplemented');
+
+ if(empty($revids))
+ return;
+
+ $db = & $this->getDB();
+ $pageids = array();
+ $remaining = array_flip($revids);
+
+ $tables = array('revision');
+ $fields = array('rev_id','rev_page');
+ $where = array('rev_deleted' => 0, 'rev_id' => $revids);
+
+ // Get pageIDs data from the `page` table
+ $this->profileDBIn();
+ $res = $db->select( $tables, $fields, $where, __METHOD__ );
+ while ( $row = $db->fetchObject( $res ) ) {
+ $revid = intval($row->rev_id);
+ $pageid = intval($row->rev_page);
+ $this->mGoodRevIDs[$revid] = $pageid;
+ $pageids[$pageid] = '';
+ unset($remaining[$revid]);
+ }
+ $db->freeResult( $res );
+ $this->profileDBOut();
+
+ $this->mMissingRevIDs = array_keys($remaining);
+
+ // Populate all the page information
+ if($this->mResolveRedirects)
+ ApiBase :: dieDebug(__METHOD__, 'revids may not be used with redirect resolution');
+ $this->initFromPageIds(array_keys($pageids));
}
private function resolvePendingRedirects() {
if($this->mResolveRedirects) {
- $db = $this->getDB();
+ $db = & $this->getDB();
$pageFlds = $this->getPageTableFields();
// Repeat until all redirects have been resolved
@@ -386,7 +470,7 @@ class ApiPageSet extends ApiQueryBase {
private function getRedirectTargets() {
$linkBatch = new LinkBatch();
- $db = $this->getDB();
+ $db = & $this->getDB();
// find redirect targets for all redirect pages
$this->profileDBIn();
@@ -443,7 +527,7 @@ class ApiPageSet extends ApiQueryBase {
// All IDs must exist in the page table
if (!empty($this->mPendingRedirectIDs[$plfrom]))
- $this->dieDebug('Invalid redirect IDs were found');
+ ApiBase :: dieDebug(__METHOD__, 'Invalid redirect IDs were found');
return $linkBatch;
}
@@ -508,7 +592,7 @@ class ApiPageSet extends ApiQueryBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiPageSet.php 16820 2006-10-06 01:02:14Z yurik $';
+ return __CLASS__ . ': $Id: ApiPageSet.php 17929 2006-11-25 17:11:58Z tstarling $';
}
}
-?> \ No newline at end of file
+?>
diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php
index 985bde63..e7b7f351 100644
--- a/includes/api/ApiQuery.php
+++ b/includes/api/ApiQuery.php
@@ -45,15 +45,19 @@ class ApiQuery extends ApiBase {
// 'templates' => 'ApiQueryTemplates',
private $mQueryListModules = array (
- 'allpages' => 'ApiQueryAllpages'
+ 'allpages' => 'ApiQueryAllpages',
+ 'logevents' => 'ApiQueryLogEvents',
+ 'watchlist' => 'ApiQueryWatchlist',
+ 'recentchanges' => 'ApiQueryRecentChanges',
+ 'backlinks' => 'ApiQueryBacklinks',
+ 'embeddedin' => 'ApiQueryBacklinks',
+ 'imagelinks' => 'ApiQueryBacklinks',
+ 'usercontribs' => 'ApiQueryContributions'
);
- // 'backlinks' => 'ApiQueryBacklinks',
// 'categorymembers' => 'ApiQueryCategorymembers',
// 'embeddedin' => 'ApiQueryEmbeddedin',
// 'imagelinks' => 'ApiQueryImagelinks',
- // 'logevents' => 'ApiQueryLogevents',
// 'recentchanges' => 'ApiQueryRecentchanges',
- // 'usercontribs' => 'ApiQueryUsercontribs',
// 'users' => 'ApiQueryUsers',
// 'watchlist' => 'ApiQueryWatchlist',
@@ -75,9 +79,12 @@ class ApiQuery extends ApiBase {
$this->mAllowedGenerators = array_merge($this->mListModuleNames, $this->mPropModuleNames);
}
- public function getDB() {
- if (!isset ($this->mSlaveDB))
+ public function & getDB() {
+ if (!isset ($this->mSlaveDB)) {
+ $this->profileDBIn();
$this->mSlaveDB = & wfGetDB(DB_SLAVE);
+ $this->profileDBOut();
+ }
return $this->mSlaveDB;
}
@@ -151,6 +158,7 @@ class ApiQuery extends ApiBase {
private function outputGeneralPageInfo() {
$pageSet = $this->getPageSet();
+ $result = $this->getResult();
// Title normalizations
$normValues = array ();
@@ -162,8 +170,8 @@ class ApiQuery extends ApiBase {
}
if (!empty ($normValues)) {
- ApiResult :: setIndexedTagName($normValues, 'n');
- $this->getResult()->addValue('query', 'normalized', $normValues);
+ $result->setIndexedTagName($normValues, 'n');
+ $result->addValue('query', 'normalized', $normValues);
}
// Show redirect information
@@ -176,8 +184,23 @@ class ApiQuery extends ApiBase {
}
if (!empty ($redirValues)) {
- ApiResult :: setIndexedTagName($redirValues, 'r');
- $this->getResult()->addValue('query', 'redirects', $redirValues);
+ $result->setIndexedTagName($redirValues, 'r');
+ $result->addValue('query', 'redirects', $redirValues);
+ }
+
+ //
+ // Missing revision elements
+ //
+ $missingRevIDs = $pageSet->getMissingRevisionIDs();
+ if (!empty ($missingRevIDs)) {
+ $revids = array ();
+ foreach ($missingRevIDs as $revid) {
+ $revids[$revid] = array (
+ 'revid' => $revid
+ );
+ }
+ $result->setIndexedTagName($revids, 'rev');
+ $result->addValue('query', 'badrevids', $revids);
}
//
@@ -195,7 +218,7 @@ class ApiQuery extends ApiBase {
// Report any missing page ids
foreach ($pageSet->getMissingPageIDs() as $pageid) {
$pages[$pageid] = array (
- 'id' => $pageid,
+ 'pageid' => $pageid,
'missing' => ''
);
}
@@ -203,12 +226,13 @@ class ApiQuery extends ApiBase {
// Output general page information for found titles
foreach ($pageSet->getGoodTitles() as $pageid => $title) {
$pages[$pageid] = array (
- 'ns' => $title->getNamespace(), 'title' => $title->getPrefixedText(), 'id' => $pageid);
+ 'pageid' => $pageid,
+ 'ns' => $title->getNamespace(), 'title' => $title->getPrefixedText());
}
if (!empty ($pages)) {
- ApiResult :: setIndexedTagName($pages, 'page');
- $this->getResult()->addValue('query', 'pages', $pages);
+ $result->setIndexedTagName($pages, 'page');
+ $result->addValue('query', 'pages', $pages);
}
}
@@ -238,13 +262,13 @@ class ApiQuery extends ApiBase {
// execute current pageSet to get the data for the generator module
$this->mPageSet->execute();
-
+
// populate resultPageSet with the generator output
$generator->profileIn();
$generator->executeGenerator($resultPageSet);
$resultPageSet->finishPageSetGeneration();
$generator->profileOut();
-
+
// Swap the resulting pageset back in
$this->mPageSet = $resultPageSet;
}
@@ -346,7 +370,7 @@ class ApiQuery extends ApiBase {
public function getVersion() {
$psModule = new ApiPageSet($this);
$vers = array ();
- $vers[] = __CLASS__ . ': $Id: ApiQuery.php 16820 2006-10-06 01:02:14Z yurik $';
+ $vers[] = __CLASS__ . ': $Id: ApiQuery.php 17374 2006-11-03 06:53:47Z yurik $';
$vers[] = $psModule->getVersion();
return $vers;
}
diff --git a/includes/api/ApiQueryAllpages.php b/includes/api/ApiQueryAllpages.php
index 51330d62..9c076e65 100644
--- a/includes/api/ApiQueryAllpages.php
+++ b/includes/api/ApiQueryAllpages.php
@@ -42,95 +42,84 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
public function executeGenerator($resultPageSet) {
if ($resultPageSet->isResolvingRedirects())
$this->dieUsage('Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator', 'params');
-
+
$this->run($resultPageSet);
}
private function run($resultPageSet = null) {
- $limit = $from = $namespace = $filterredir = null;
- extract($this->extractRequestParams());
- $db = $this->getDB();
+ wfProfileIn($this->getModuleProfileName() . '-getDB');
+ $db = & $this->getDB();
+ wfProfileOut($this->getModuleProfileName() . '-getDB');
- $where = array (
- 'page_namespace' => $namespace
- );
-
- if (isset ($from)) {
- $where[] = 'page_title>=' . $db->addQuotes(ApiQueryBase :: titleToKey($from));
- }
-
- if ($filterredir === 'redirects') {
- $where['page_is_redirect'] = 1;
- }
- elseif ($filterredir === 'nonredirects') {
- $where['page_is_redirect'] = 0;
- }
+ wfProfileIn($this->getModuleProfileName() . '-parseParams');
+ $limit = $from = $namespace = $filterredir = $prefix = null;
+ extract($this->extractRequestParams());
+
+ $this->addTables('page');
+ if (!$this->addWhereIf('page_is_redirect = 1', $filterredir === 'redirects'))
+ $this->addWhereIf('page_is_redirect = 0', $filterredir === 'nonredirects');
+ $this->addWhereFld('page_namespace', $namespace);
+ if (isset ($from))
+ $this->addWhere('page_title>=' . $db->addQuotes(ApiQueryBase :: titleToKey($from)));
+ if (isset ($prefix))
+ $this->addWhere("page_title LIKE '{$db->strencode(ApiQueryBase :: titleToKey($prefix))}%'");
if (is_null($resultPageSet)) {
- $fields = array (
+ $this->addFields(array (
'page_id',
'page_namespace',
'page_title'
- );
+ ));
} else {
- $fields = $resultPageSet->getPageTableFields();
+ $this->addFields($resultPageSet->getPageTableFields());
}
- $this->profileDBIn();
- $res = $db->select('page', $fields, $where, __CLASS__ . '::' . __METHOD__, array (
- 'USE INDEX' => 'name_title',
- 'LIMIT' => $limit +1,
- 'ORDER BY' => 'page_namespace, page_title'
- ));
- $this->profileDBOut();
+ $this->addOption('USE INDEX', 'name_title');
+ $this->addOption('LIMIT', $limit +1);
+ $this->addOption('ORDER BY', 'page_namespace, page_title');
+
+ wfProfileOut($this->getModuleProfileName() . '-parseParams');
+
+ $res = $this->select(__METHOD__);
+
+ wfProfileIn($this->getModuleProfileName() . '-saveResults');
$data = array ();
$count = 0;
while ($row = $db->fetchObject($res)) {
if (++ $count > $limit) {
// We've reached the one extra which shows that there are additional pages to be had. Stop here...
- $msg = array (
- 'continue' => $this->encodeParamName('from'
- ) . '=' . ApiQueryBase :: keyToTitle($row->page_title));
- $this->getResult()->addValue('query-status', 'allpages', $msg);
+ $this->setContinueEnumParameter('from', ApiQueryBase :: keyToTitle($row->page_title));
break;
}
- $title = Title :: makeTitle($row->page_namespace, $row->page_title);
- // skip any pages that user has no rights to read
- if ($title->userCanRead()) {
-
- if (is_null($resultPageSet)) {
- $id = intval($row->page_id);
- $data[] = $id; // in generator mode, just assemble a list of page IDs.
- } else {
- $resultPageSet->processDbRow($row);
- }
+ if (is_null($resultPageSet)) {
+ $vals = $this->addRowInfo('page', $row);
+ if ($vals)
+ $data[intval($row->page_id)] = $vals;
+ } else {
+ $resultPageSet->processDbRow($row);
}
}
$db->freeResult($res);
if (is_null($resultPageSet)) {
- ApiResult :: setIndexedTagName($data, 'p');
- $this->getResult()->addValue('query', 'allpages', $data);
+ $result = $this->getResult();
+ $result->setIndexedTagName($data, 'p');
+ $result->addValue('query', $this->getModuleName(), $data);
}
+
+ wfProfileOut($this->getModuleProfileName() . '-saveResults');
}
protected function getAllowedParams() {
-
- global $wgContLang;
- $validNamespaces = array ();
- foreach (array_keys($wgContLang->getNamespaces()) as $ns) {
- if ($ns >= 0)
- $validNamespaces[] = $ns; // strval($ns);
- }
-
return array (
'from' => null,
+ 'prefix' => null,
'namespace' => array (
ApiBase :: PARAM_DFLT => 0,
- ApiBase :: PARAM_TYPE => $validNamespaces
+ ApiBase :: PARAM_TYPE => 'namespace'
),
'filterredir' => array (
ApiBase :: PARAM_DFLT => 'all',
@@ -144,8 +133,8 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
ApiBase :: PARAM_DFLT => 10,
ApiBase :: PARAM_TYPE => 'limit',
ApiBase :: PARAM_MIN => 1,
- ApiBase :: PARAM_MAX1 => 500,
- ApiBase :: PARAM_MAX2 => 5000
+ ApiBase :: PARAM_MAX1 => ApiBase :: LIMIT_BIG1,
+ ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
)
);
}
@@ -153,9 +142,10 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
protected function getParamDescription() {
return array (
'from' => 'The page title to start enumerating from.',
- 'namespace' => 'The namespace to enumerate. Default 0 (Main).',
- 'filterredir' => 'Which pages to list: "all" (default), "redirects", or "nonredirects"',
- 'limit' => 'How many total pages to return'
+ 'prefix' => 'Search for all page titles that begin with this value.',
+ 'namespace' => 'The namespace to enumerate.',
+ 'filterredir' => 'Which pages to list.',
+ 'limit' => 'How many total pages to return.'
);
}
@@ -166,8 +156,8 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
protected function getExamples() {
return array (
'Simple Use',
- ' api.php?action=query&list=allpages',
- ' api.php?action=query&list=allpages&apfrom=B&aplimit=5',
+ ' Show a list of pages starting at the letter "B"',
+ ' api.php?action=query&list=allpages&apfrom=B',
'Using as Generator',
' Show info about 4 pages starting at the letter "T"',
' api.php?action=query&generator=allpages&gaplimit=4&gapfrom=T&prop=info',
@@ -177,7 +167,7 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryAllpages.php 16820 2006-10-06 01:02:14Z yurik $';
+ return __CLASS__ . ': $Id: ApiQueryAllpages.php 17880 2006-11-23 08:25:56Z nickj $';
}
}
-?> \ No newline at end of file
+?>
diff --git a/includes/api/ApiQueryBacklinks.php b/includes/api/ApiQueryBacklinks.php
new file mode 100644
index 00000000..413068f8
--- /dev/null
+++ b/includes/api/ApiQueryBacklinks.php
@@ -0,0 +1,358 @@
+<?php
+
+
+/*
+ * Created on Oct 16, 2006
+ *
+ * API for MediaWiki 1.8+
+ *
+ * Copyright (C) 2006 Yuri Astrakhan <FirstnameLastname@gmail.com>
+ *
+ * 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.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+if (!defined('MEDIAWIKI')) {
+ // Eclipse helper - will be ignored in production
+ require_once ("ApiQueryBase.php");
+}
+
+class ApiQueryBacklinks extends ApiQueryGeneratorBase {
+
+ private $rootTitle, $contRedirs, $contLevel, $contTitle, $contID;
+
+ // output element name, database column field prefix, database table
+ private $backlinksSettings = array (
+ 'backlinks' => array (
+ 'code' => 'bl',
+ 'prefix' => 'pl',
+ 'linktbl' => 'pagelinks'
+ ),
+ 'embeddedin' => array (
+ 'code' => 'ei',
+ 'prefix' => 'tl',
+ 'linktbl' => 'templatelinks'
+ ),
+ 'imagelinks' => array (
+ 'code' => 'il',
+ 'prefix' => 'il',
+ 'linktbl' => 'imagelinks'
+ )
+ );
+
+ public function __construct($query, $moduleName) {
+ $code = $prefix = $linktbl = null;
+ extract($this->backlinksSettings[$moduleName]);
+
+ parent :: __construct($query, $moduleName, $code);
+ $this->bl_ns = $prefix . '_namespace';
+ $this->bl_from = $prefix . '_from';
+ $this->bl_tables = array (
+ $linktbl,
+ 'page'
+ );
+ $this->bl_code = $code;
+
+ $this->hasNS = $moduleName !== 'imagelinks';
+ if ($this->hasNS) {
+ $this->bl_title = $prefix . '_title';
+ $this->bl_sort = "{$this->bl_ns}, {$this->bl_title}, {$this->bl_from}";
+ $this->bl_fields = array (
+ $this->bl_ns,
+ $this->bl_title
+ );
+ } else {
+ $this->bl_title = $prefix . '_to';
+ $this->bl_sort = "{$this->bl_title}, {$this->bl_from}";
+ $this->bl_fields = array (
+ $this->bl_title
+ );
+ }
+ }
+
+ public function execute() {
+ $this->run();
+ }
+
+ public function executeGenerator($resultPageSet) {
+ $this->run($resultPageSet);
+ }
+
+ private function run($resultPageSet = null) {
+ $continue = $namespace = $redirect = $limit = null;
+ extract($this->extractRequestParams());
+
+ if ($redirect)
+ ApiBase :: dieDebug(__METHOD__, 'Redirect is not yet been implemented', 'notimplemented');
+
+ $this->processContinue($continue, $redirect);
+
+ $this->addFields($this->bl_fields);
+ if (is_null($resultPageSet))
+ $this->addFields(array (
+ 'page_id',
+ 'page_namespace',
+ 'page_title'
+ ));
+ else
+ $this->addFields($resultPageSet->getPageTableFields()); // will include page_id
+
+ $this->addTables($this->bl_tables);
+ $this->addWhere($this->bl_from . '=page_id');
+
+ if ($this->hasNS)
+ $this->addWhereFld($this->bl_ns, $this->rootTitle->getNamespace());
+ $this->addWhereFld($this->bl_title, $this->rootTitle->getDBkey());
+ $this->addWhereFld('page_namespace', $namespace);
+ $this->addOption('LIMIT', $limit +1);
+ $this->addOption('ORDER BY', $this->bl_sort);
+
+ if ($redirect)
+ $this->addWhereFld('page_is_redirect', 0);
+
+ $db = & $this->getDB();
+ if (!is_null($continue)) {
+ $plfrm = intval($this->contID);
+ if ($this->contLevel == 0) {
+ // For the first level, there is only one target title, so no need for complex filtering
+ $this->addWhere($this->bl_from . '>=' . $plfrm);
+ } else {
+ $ns = $this->contTitle->getNamespace();
+ $t = $db->addQuotes($this->contTitle->getDBkey());
+ $whereWithoutNS = "{$this->bl_title}>$t OR ({$this->bl_title}=$t AND {$this->bl_from}>=$plfrm))";
+
+ if ($this->hasNS)
+ $this->addWhere("{$this->bl_ns}>$ns OR ({$this->bl_ns}=$ns AND ($whereWithoutNS)");
+ else
+ $this->addWhere($whereWithoutNS);
+ }
+ }
+
+ $res = $this->select(__METHOD__);
+
+ $count = 0;
+ $data = array ();
+ while ($row = $db->fetchObject($res)) {
+ if (++ $count > $limit) {
+ // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+ if ($redirect) {
+ $ns = $row-> {
+ $this->bl_ns };
+ $t = $row-> {
+ $this->bl_title };
+ $continue = $this->getContinueRedirStr(false, 0, $ns, $t, $row->page_id);
+ } else
+ $continue = $this->getContinueStr($row->page_id);
+ $this->setContinueEnumParameter('continue', $continue);
+ break;
+ }
+
+ if (is_null($resultPageSet)) {
+ $vals = $this->addRowInfo('page', $row);
+ if ($vals)
+ $data[intval($row->page_id)] = $vals;
+ } else {
+ $resultPageSet->processDbRow($row);
+ }
+ }
+ $db->freeResult($res);
+
+ if (is_null($resultPageSet)) {
+ $result = $this->getResult();
+ $result->setIndexedTagName($data, $this->bl_code);
+ $result->addValue('query', $this->getModuleName(), $data);
+ }
+ }
+
+ protected function processContinue($continue, $redirect) {
+ $pageSet = $this->getPageSet();
+ $count = $pageSet->getTitleCount();
+ if (!is_null($continue)) {
+ if ($count !== 0)
+ $this->dieUsage("When continuing the {$this->getModuleName()} query, no other titles may be provided", 'titles_on_continue');
+ $this->parseContinueParam($continue, $redirect);
+
+ // Skip all completed links
+
+ } else {
+ if ($count !== 1)
+ $this->dieUsage("The {$this->getModuleName()} query requires one title to start", 'bad_title_count');
+ $this->rootTitle = current($pageSet->getTitles()); // only one title there
+ }
+
+ // only image titles are allowed for the root
+ if (!$this->hasNS && $this->rootTitle->getNamespace() !== NS_IMAGE)
+ $this->dieUsage("The title for {$this->getModuleName()} query must be an image", 'bad_image_title');
+ }
+
+ protected function parseContinueParam($continue, $redirect) {
+ $continueList = explode('|', $continue);
+ if ($redirect) {
+ //
+ // expected redirect-mode parameter:
+ // ns|db_key|step|level|ns|db_key|id
+ // ns+db_key -- the root title
+ // step = 1 or 2 - which step to continue from - 1-titles, 2-redirects
+ // level -- how many levels to follow before starting enumerating.
+ // if level > 0 -- ns+title to continue from, otherwise skip these
+ // id = last page_id to continue from
+ //
+ if (count($continueList) > 4) {
+ $rootNs = intval($continueList[0]);
+ if (($rootNs !== 0 || $continueList[0] === '0') && !empty ($continueList[1])) {
+ $this->rootTitle = Title :: makeTitleSafe($rootNs, $continueList[1]);
+ if ($this->rootTitle && $this->rootTitle->userCanRead()) {
+
+ $step = intval($continueList[2]);
+ if ($step === 1 || $step === 2) {
+ $this->contRedirs = ($step === 2);
+
+ $level = intval($continueList[3]);
+ if ($level !== 0 || $continueList[3] === '0') {
+ $this->contLevel = $level;
+
+ if ($level === 0) {
+ if (count($continueList) === 5) {
+ $contID = intval($continueList[4]);
+ if ($contID !== 0 || $continueList[4] === '0') {
+ $this->contID = $contID;
+ return; // done
+ }
+ }
+ } else {
+ if (count($continueList) === 7) {
+ $contNs = intval($continueList[4]);
+ if (($contNs !== 0 || $continueList[4] === '0') && !empty ($continueList[5])) {
+ $this->contTitle = Title :: makeTitleSafe($contNs, $continueList[5]);
+
+ $contID = intval($continueList[6]);
+ if ($contID !== 0 || $continueList[6] === '0') {
+ $this->contID = $contID;
+ return; // done
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ } else {
+ //
+ // expected non-redirect-mode parameter:
+ // ns|db_key|id
+ // ns+db_key -- the root title
+ // id = last page_id to continue from
+ //
+ if (count($continueList) === 3) {
+ $rootNs = intval($continueList[0]);
+ if (($rootNs !== 0 || $continueList[0] === '0') && !empty ($continueList[1])) {
+ $this->rootTitle = Title :: makeTitleSafe($rootNs, $continueList[1]);
+ if ($this->rootTitle && $this->rootTitle->userCanRead()) {
+
+ $contID = intval($continueList[2]);
+ if ($contID !== 0) {
+ $this->contID = $contID;
+ return; // done
+ }
+ }
+ }
+ }
+ }
+
+ $this->dieUsage("Invalid continue param. You should pass the original value returned by the previous query", "_badcontinue");
+ }
+
+ protected function getContinueStr($lastPageID) {
+ return $this->rootTitle->getNamespace() .
+ '|' . $this->rootTitle->getDBkey() .
+ '|' . $lastPageID;
+ }
+
+ protected function getContinueRedirStr($isRedirPhase, $level, $ns, $title, $lastPageID) {
+ return $this->rootTitle->getNamespace() .
+ '|' . $this->rootTitle->getDBkey() .
+ '|' . ($isRedirPhase ? 1 : 2) .
+ '|' . $level .
+ ($level > 0 ? ('|' . $ns . '|' . $title) : '') .
+ '|' . $lastPageID;
+ }
+
+ protected function getAllowedParams() {
+
+ return array (
+ 'continue' => null,
+ 'namespace' => array (
+ ApiBase :: PARAM_ISMULTI => true,
+ ApiBase :: PARAM_TYPE => 'namespace'
+ ),
+ 'redirect' => false,
+ 'limit' => array (
+ ApiBase :: PARAM_DFLT => 10,
+ ApiBase :: PARAM_TYPE => 'limit',
+ ApiBase :: PARAM_MIN => 1,
+ ApiBase :: PARAM_MAX1 => ApiBase :: LIMIT_BIG1,
+ ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
+ )
+ );
+ }
+
+ protected function getParamDescription() {
+ return array (
+ 'continue' => 'When more results are available, use this to continue.',
+ 'namespace' => 'The namespace to enumerate.',
+ 'redirect' => 'If linking page is a redirect, find all pages that link to that redirect (not implemented)',
+ 'limit' => 'How many total pages to return.'
+ );
+ }
+
+ protected function getDescription() {
+ switch ($this->getModuleName()) {
+ case 'backlinks' :
+ return 'Find all pages that link to the given page';
+ case 'embeddedin' :
+ return 'Find all pages that embed (transclude) the given title';
+ case 'imagelinks' :
+ return 'Find all pages that use the given image title.';
+ default :
+ ApiBase :: dieDebug(__METHOD__, 'Unknown module name');
+ }
+ }
+
+ protected function getExamples() {
+ static $examples = array (
+ 'backlinks' => array (
+ "api.php?action=query&list=backlinks&titles=Main%20Page",
+ "api.php?action=query&generator=backlinks&titles=Main%20Page&prop=info"
+ ),
+ 'embeddedin' => array (
+ "api.php?action=query&list=embeddedin&titles=Template:Stub",
+ "api.php?action=query&generator=embeddedin&titles=Template:Stub&prop=info"
+ ),
+ 'imagelinks' => array (
+ "api.php?action=query&list=imagelinks&titles=Image:Albert%20Einstein%20Head.jpg",
+ "api.php?action=query&generator=imagelinks&titles=Image:Albert%20Einstein%20Head.jpg&prop=info"
+ )
+ );
+
+ return $examples[$this->getModuleName()];
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiQueryBacklinks.php 17880 2006-11-23 08:25:56Z nickj $';
+ }
+}
+?> \ No newline at end of file
diff --git a/includes/api/ApiQueryBase.php b/includes/api/ApiQueryBase.php
index 574f742e..ae4edf98 100644
--- a/includes/api/ApiQueryBase.php
+++ b/includes/api/ApiQueryBase.php
@@ -31,11 +31,260 @@ if (!defined('MEDIAWIKI')) {
abstract class ApiQueryBase extends ApiBase {
- private $mQueryModule;
-
+ private $mQueryModule, $tables, $where, $fields, $options;
+
public function __construct($query, $moduleName, $paramPrefix = '') {
parent :: __construct($query->getMain(), $moduleName, $paramPrefix);
$this->mQueryModule = $query;
+ $this->resetQueryParams();
+ }
+
+ protected function resetQueryParams() {
+ $this->tables = array ();
+ $this->where = array ();
+ $this->fields = array ();
+ $this->options = array ();
+ }
+
+ protected function addTables($value) {
+ if (is_array($value))
+ $this->tables = array_merge($this->tables, $value);
+ else
+ $this->tables[] = $value;
+ }
+
+ protected function addFields($value) {
+ if (is_array($value))
+ $this->fields = array_merge($this->fields, $value);
+ else
+ $this->fields[] = $value;
+ }
+
+ protected function addFieldsIf($value, $condition) {
+ if ($condition) {
+ $this->addFields($value);
+ return true;
+ }
+ return false;
+ }
+
+ protected function addWhere($value) {
+ if (is_array($value))
+ $this->where = array_merge($this->where, $value);
+ else
+ $this->where[] = $value;
+ }
+
+ protected function addWhereIf($value, $condition) {
+ if ($condition) {
+ $this->addWhere($value);
+ return true;
+ }
+ return false;
+ }
+
+ protected function addWhereFld($field, $value) {
+ if (!is_null($value))
+ $this->where[$field] = $value;
+ }
+
+ protected function addWhereRange($field, $dir, $start, $end) {
+ $isDirNewer = ($dir === 'newer');
+ $after = ($isDirNewer ? '>=' : '<=');
+ $before = ($isDirNewer ? '<=' : '>=');
+ $db = $this->getDB();
+
+ if (!is_null($start))
+ $this->addWhere($field . $after . $db->addQuotes($start));
+
+ if (!is_null($end))
+ $this->addWhere($field . $before . $db->addQuotes($end));
+
+ $this->addOption('ORDER BY', $field . ($isDirNewer ? '' : ' DESC'));
+ }
+
+ protected function addOption($name, $value = null) {
+ if (is_null($value))
+ $this->options[] = $name;
+ else
+ $this->options[$name] = $value;
+ }
+
+ protected function select($method) {
+
+ // getDB has its own profileDBIn/Out calls
+ $db = $this->getDB();
+
+ $this->profileDBIn();
+ $res = $db->select($this->tables, $this->fields, $this->where, $method, $this->options);
+ $this->profileDBOut();
+
+ return $res;
+ }
+
+ protected function addRowInfo($prefix, $row) {
+
+ $vals = array ();
+
+ // ID
+ if ( isset( $row-> { $prefix . '_id' } ) )
+ $vals[$prefix . 'id'] = intval( $row-> { $prefix . '_id' } );
+
+ // Title
+ $title = ApiQueryBase :: addRowInfo_title($row, $prefix . '_namespace', $prefix . '_title');
+ if ($title) {
+ if (!$title->userCanRead())
+ return false;
+ $vals['ns'] = $title->getNamespace();
+ $vals['title'] = $title->getPrefixedText();
+ }
+
+ switch ($prefix) {
+
+ case 'page' :
+ // page_is_redirect
+ @ $tmp = $row->page_is_redirect;
+ if ($tmp)
+ $vals['redirect'] = '';
+
+ break;
+
+ case 'rc' :
+ // PageId
+ @ $tmp = $row->rc_cur_id;
+ if (!is_null($tmp))
+ $vals['pageid'] = intval($tmp);
+
+ @ $tmp = $row->rc_this_oldid;
+ if (!is_null($tmp))
+ $vals['revid'] = intval($tmp);
+
+ if ( isset( $row->rc_last_oldid ) )
+ $vals['old_revid'] = intval( $row->rc_last_oldid );
+
+ $title = ApiQueryBase :: addRowInfo_title($row, 'rc_moved_to_ns', 'rc_moved_to_title');
+ if ($title) {
+ if (!$title->userCanRead())
+ return false;
+ $vals['new_ns'] = $title->getNamespace();
+ $vals['new_title'] = $title->getPrefixedText();
+ }
+
+ if ( isset( $row->rc_patrolled ) )
+ $vals['patrolled'] = '';
+
+ break;
+
+ case 'log' :
+ // PageId
+ @ $tmp = $row->page_id;
+ if (!is_null($tmp))
+ $vals['pageid'] = intval($tmp);
+
+ if ($row->log_params !== '') {
+ $params = explode("\n", $row->log_params);
+ if ($row->log_type == 'move' && isset ($params[0])) {
+ $newTitle = Title :: newFromText($params[0]);
+ if ($newTitle) {
+ $vals['new_ns'] = $newTitle->getNamespace();
+ $vals['new_title'] = $newTitle->getPrefixedText();
+ $params = null;
+ }
+ }
+
+ if (!empty ($params)) {
+ $this->getResult()->setIndexedTagName($params, 'param');
+ $vals = array_merge($vals, $params);
+ }
+ }
+
+ break;
+
+ case 'rev' :
+ // PageID
+ @ $tmp = $row->rev_page;
+ if (!is_null($tmp))
+ $vals['pageid'] = intval($tmp);
+ }
+
+ // Type
+ @ $tmp = $row-> {
+ $prefix . '_type' };
+ if (!is_null($tmp))
+ $vals['type'] = $tmp;
+
+ // Action
+ @ $tmp = $row-> {
+ $prefix . '_action' };
+ if (!is_null($tmp))
+ $vals['action'] = $tmp;
+
+ // Old ID
+ @ $tmp = $row-> {
+ $prefix . '_text_id' };
+ if (!is_null($tmp))
+ $vals['oldid'] = intval($tmp);
+
+ // User Name / Anon IP
+ @ $tmp = $row-> {
+ $prefix . '_user_text' };
+ if (is_null($tmp))
+ @ $tmp = $row->user_name;
+ if (!is_null($tmp)) {
+ $vals['user'] = $tmp;
+ @ $tmp = !$row-> {
+ $prefix . '_user' };
+ if (!is_null($tmp) && $tmp)
+ $vals['anon'] = '';
+ }
+
+ // Bot Edit
+ @ $tmp = $row-> {
+ $prefix . '_bot' };
+ if (!is_null($tmp) && $tmp)
+ $vals['bot'] = '';
+
+ // New Edit
+ @ $tmp = $row-> {
+ $prefix . '_new' };
+ if (is_null($tmp))
+ @ $tmp = $row-> {
+ $prefix . '_is_new' };
+ if (!is_null($tmp) && $tmp)
+ $vals['new'] = '';
+
+ // Minor Edit
+ @ $tmp = $row-> {
+ $prefix . '_minor_edit' };
+ if (is_null($tmp))
+ @ $tmp = $row-> {
+ $prefix . '_minor' };
+ if (!is_null($tmp) && $tmp)
+ $vals['minor'] = '';
+
+ // Timestamp
+ @ $tmp = $row-> {
+ $prefix . '_timestamp' };
+ if (!is_null($tmp))
+ $vals['timestamp'] = wfTimestamp(TS_ISO_8601, $tmp);
+
+ // Comment
+ @ $tmp = $row-> {
+ $prefix . '_comment' };
+ if (!empty ($tmp)) // optimize bandwidth
+ $vals['comment'] = $tmp;
+
+ return $vals;
+ }
+
+ private static function addRowInfo_title($row, $nsfld, $titlefld) {
+ if ( isset( $row-> $nsfld ) ) {
+ $ns = $row-> $nsfld;
+ @ $title = $row-> $titlefld;
+ if (!empty ($title))
+ return Title :: makeTitle($ns, $title);
+ }
+ return false;
}
/**
@@ -46,12 +295,19 @@ abstract class ApiQueryBase extends ApiBase {
}
/**
- * Get the main Query module
+ * Get the main Query module
*/
public function getQuery() {
return $this->mQueryModule;
}
+ protected function setContinueEnumParameter($paramName, $paramValue) {
+ $msg = array (
+ $this->encodeParamName($paramName
+ ) => $paramValue);
+ $this->getResult()->addValue('query-continue', $this->getModuleName(), $msg);
+ }
+
/**
* Get the Query database connection (readonly)
*/
@@ -67,6 +323,11 @@ abstract class ApiQueryBase extends ApiBase {
return $this->mQueryModule->getPageSet();
}
+ /**
+ * This is a very simplistic utility function
+ * to convert a non-namespaced title string to a db key.
+ * It will replace all ' ' with '_'
+ */
public static function titleToKey($title) {
return str_replace(' ', '_', $title);
}
@@ -76,7 +337,7 @@ abstract class ApiQueryBase extends ApiBase {
}
public static function getBaseVersion() {
- return __CLASS__ . ': $Id: ApiQueryBase.php 16757 2006-10-03 05:41:55Z yurik $';
+ return __CLASS__ . ': $Id: ApiQueryBase.php 17987 2006-11-29 05:45:03Z nickj $';
}
}
@@ -86,7 +347,7 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
public function __construct($query, $moduleName, $paramPrefix = '') {
parent :: __construct($query, $moduleName, $paramPrefix);
- $mIsGenerator = false;
+ $this->mIsGenerator = false;
}
public function setGeneratorMode() {
@@ -109,4 +370,4 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase {
*/
public abstract function executeGenerator($resultPageSet);
}
-?> \ No newline at end of file
+?>
diff --git a/includes/api/ApiQueryInfo.php b/includes/api/ApiQueryInfo.php
index de651b00..d93d37a2 100644
--- a/includes/api/ApiQueryInfo.php
+++ b/includes/api/ApiQueryInfo.php
@@ -46,14 +46,17 @@ class ApiQueryInfo extends ApiQueryBase {
$pageSet = $this->getPageSet();
$titles = $pageSet->getGoodTitles();
- $result = & $this->getResult();
+ $result = $this->getResult();
$pageIsRedir = $pageSet->getCustomField('page_is_redirect');
$pageTouched = $pageSet->getCustomField('page_touched');
$pageLatest = $pageSet->getCustomField('page_latest');
- foreach ($titles as $pageid => $title) {
- $pageInfo = array ('touched' => $pageTouched[$pageid], 'lastrevid' => $pageLatest[$pageid]);
+ foreach ( $titles as $pageid => $unused ) {
+ $pageInfo = array (
+ 'touched' => wfTimestamp(TS_ISO_8601, $pageTouched[$pageid]),
+ 'lastrevid' => intval($pageLatest[$pageid])
+ );
if ($pageIsRedir[$pageid])
$pageInfo['redirect'] = '';
@@ -76,7 +79,7 @@ class ApiQueryInfo extends ApiQueryBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryInfo.php 16757 2006-10-03 05:41:55Z yurik $';
+ return __CLASS__ . ': $Id: ApiQueryInfo.php 17929 2006-11-25 17:11:58Z tstarling $';
}
}
-?> \ No newline at end of file
+?>
diff --git a/includes/api/ApiQueryLogEvents.php b/includes/api/ApiQueryLogEvents.php
new file mode 100644
index 00000000..243f96fa
--- /dev/null
+++ b/includes/api/ApiQueryLogEvents.php
@@ -0,0 +1,173 @@
+<?php
+
+
+/*
+ * Created on Oct 16, 2006
+ *
+ * API for MediaWiki 1.8+
+ *
+ * Copyright (C) 2006 Yuri Astrakhan <FirstnameLastname@gmail.com>
+ *
+ * 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.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+if (!defined('MEDIAWIKI')) {
+ // Eclipse helper - will be ignored in production
+ require_once ('ApiQueryBase.php');
+}
+
+class ApiQueryLogEvents extends ApiQueryBase {
+
+ public function __construct($query, $moduleName) {
+ parent :: __construct($query, $moduleName, 'le');
+ }
+
+ public function execute() {
+ $limit = $type = $start = $end = $dir = $user = $title = null;
+ extract($this->extractRequestParams());
+
+ $db = & $this->getDB();
+
+ list($tbl_logging, $tbl_page, $tbl_user) = $db->tableNamesN('logging', 'page', 'user');
+
+ $this->addOption('STRAIGHT_JOIN');
+ $this->addTables("$tbl_logging LEFT OUTER JOIN $tbl_page ON " .
+ "log_namespace=page_namespace AND log_title=page_title " .
+ "INNER JOIN $tbl_user ON user_id=log_user");
+
+ $this->addFields(array (
+ 'log_type',
+ 'log_action',
+ 'log_timestamp',
+ 'log_user',
+ 'user_name',
+ 'log_namespace',
+ 'log_title',
+ 'page_id',
+ 'log_comment',
+ 'log_params'
+ ));
+
+ $this->addWhereFld('log_type', $type);
+ $this->addWhereRange('log_timestamp', $dir, $start, $end);
+ $this->addOption('LIMIT', $limit +1);
+
+ if (!is_null($user)) {
+ $userid = $db->selectField('user', 'user_id', array (
+ 'user_name' => $user
+ ));
+ if (!$userid)
+ $this->dieUsage("User name $user not found", 'param_user');
+ $this->addWhereFld('log_user', $userid);
+ }
+
+ if (!is_null($title)) {
+ $titleObj = Title :: newFromText($title);
+ if (is_null($titleObj))
+ $this->dieUsage("Bad title value '$title'", 'param_title');
+ $this->addWhereFld('log_namespace', $titleObj->getNamespace());
+ $this->addWhereFld('log_title', $titleObj->getDBkey());
+ }
+
+ $data = array ();
+ $count = 0;
+ $res = $this->select(__METHOD__);
+ while ($row = $db->fetchObject($res)) {
+ if (++ $count > $limit) {
+ // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+ $this->setContinueEnumParameter('start', $row->log_timestamp);
+ break;
+ }
+
+ $vals = $this->addRowInfo('log', $row);
+ if($vals)
+ $data[] = $vals;
+ }
+ $db->freeResult($res);
+
+ $this->getResult()->setIndexedTagName($data, 'item');
+ $this->getResult()->addValue('query', $this->getModuleName(), $data);
+ }
+
+ protected function getAllowedParams() {
+ return array (
+ 'type' => array (
+ ApiBase :: PARAM_ISMULTI => true,
+ ApiBase :: PARAM_TYPE => array (
+ 'block',
+ 'protect',
+ 'rights',
+ 'delete',
+ 'upload',
+ 'move',
+ 'import',
+ 'renameuser',
+ 'newusers',
+ 'makebot'
+ )
+ ),
+ 'start' => array (
+ ApiBase :: PARAM_TYPE => 'timestamp'
+ ),
+ 'end' => array (
+ ApiBase :: PARAM_TYPE => 'timestamp'
+ ),
+ 'dir' => array (
+ ApiBase :: PARAM_DFLT => 'older',
+ ApiBase :: PARAM_TYPE => array (
+ 'newer',
+ 'older'
+ )
+ ),
+ 'user' => null,
+ 'title' => null,
+ 'limit' => array (
+ ApiBase :: PARAM_DFLT => 10,
+ ApiBase :: PARAM_TYPE => 'limit',
+ ApiBase :: PARAM_MIN => 1,
+ ApiBase :: PARAM_MAX1 => ApiBase :: LIMIT_BIG1,
+ ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
+ )
+ );
+ }
+
+ protected function getParamDescription() {
+ return array (
+ 'type' => 'Filter log entries to only this type(s)',
+ 'start' => 'The timestamp to start enumerating from.',
+ 'end' => 'The timestamp to end enumerating.',
+ 'dir' => 'In which direction to enumerate.',
+ 'user' => 'Filter entries to those made by the given user.',
+ 'title' => 'Filter entries to those related to a page.',
+ 'limit' => 'How many total event entries to return.'
+ );
+ }
+
+ protected function getDescription() {
+ return 'Get events from logs.';
+ }
+
+ protected function getExamples() {
+ return array (
+ 'api.php?action=query&list=logevents'
+ );
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiQueryLogEvents.php 17952 2006-11-27 08:36:57Z nickj $';
+ }
+}
+?>
diff --git a/includes/api/ApiQueryRecentChanges.php b/includes/api/ApiQueryRecentChanges.php
new file mode 100644
index 00000000..38f51b05
--- /dev/null
+++ b/includes/api/ApiQueryRecentChanges.php
@@ -0,0 +1,187 @@
+<?php
+
+
+/*
+ * Created on Oct 19, 2006
+ *
+ * API for MediaWiki 1.8+
+ *
+ * Copyright (C) 2006 Yuri Astrakhan <FirstnameLastname@gmail.com>
+ *
+ * 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.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+if (!defined('MEDIAWIKI')) {
+ // Eclipse helper - will be ignored in production
+ require_once ('ApiQueryBase.php');
+}
+
+class ApiQueryRecentChanges extends ApiQueryBase {
+
+ public function __construct($query, $moduleName) {
+ parent :: __construct($query, $moduleName, 'rc');
+ }
+
+ public function execute() {
+ $limit = $prop = $namespace = $show = $dir = $start = $end = null;
+ extract($this->extractRequestParams());
+
+ $this->addTables('recentchanges');
+ $this->addWhereRange('rc_timestamp', $dir, $start, $end);
+ $this->addWhereFld('rc_namespace', $namespace);
+
+ if (!is_null($show)) {
+ $show = array_flip($show);
+ if ((isset ($show['minor']) && isset ($show['!minor'])) || (isset ($show['bot']) && isset ($show['!bot'])) || (isset ($show['anon']) && isset ($show['!anon'])))
+ $this->dieUsage("Incorrect parameter - mutually exclusive values may not be supplied", 'show');
+
+ $this->addWhereIf('rc_minor = 0', isset ($show['!minor']));
+ $this->addWhereIf('rc_minor != 0', isset ($show['minor']));
+ $this->addWhereIf('rc_bot = 0', isset ($show['!bot']));
+ $this->addWhereIf('rc_bot != 0', isset ($show['bot']));
+ $this->addWhereIf('rc_user = 0', isset ($show['anon']));
+ $this->addWhereIf('rc_user != 0', isset ($show['!anon']));
+ }
+
+ $this->addFields(array (
+ 'rc_timestamp',
+ 'rc_namespace',
+ 'rc_title',
+ 'rc_cur_id',
+ 'rc_this_oldid',
+ 'rc_last_oldid',
+ 'rc_type',
+ 'rc_moved_to_ns',
+ 'rc_moved_to_title'
+ ));
+
+ if (!is_null($prop)) {
+ $prop = array_flip($prop);
+ $this->addFieldsIf('rc_comment', isset ($prop['comment']));
+ if (isset ($prop['user'])) {
+ $this->addFields('rc_user');
+ $this->addFields('rc_user_text');
+ }
+ if (isset ($prop['flags'])) {
+ $this->addFields('rc_minor');
+ $this->addFields('rc_bot');
+ $this->addFields('rc_new');
+ }
+ }
+
+ $this->addOption('LIMIT', $limit +1);
+ $this->addOption('USE INDEX', 'rc_timestamp');
+
+ $data = array ();
+ $count = 0;
+ $db = & $this->getDB();
+ $res = $this->select(__METHOD__);
+ while ($row = $db->fetchObject($res)) {
+ if (++ $count > $limit) {
+ // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+ $this->setContinueEnumParameter('start', $row->rc_timestamp);
+ break;
+ }
+
+ $vals = $this->addRowInfo('rc', $row);
+ if ($vals)
+ $data[] = $vals;
+ }
+ $db->freeResult($res);
+
+ $result = $this->getResult();
+ $result->setIndexedTagName($data, 'rc');
+ $result->addValue('query', $this->getModuleName(), $data);
+ }
+
+ protected function getAllowedParams() {
+ return array (
+ 'start' => array (
+ ApiBase :: PARAM_TYPE => 'timestamp'
+ ),
+ 'end' => array (
+ ApiBase :: PARAM_TYPE => 'timestamp'
+ ),
+ 'dir' => array (
+ ApiBase :: PARAM_DFLT => 'older',
+ ApiBase :: PARAM_TYPE => array (
+ 'newer',
+ 'older'
+ )
+ ),
+ 'namespace' => array (
+ ApiBase :: PARAM_ISMULTI => true,
+ ApiBase :: PARAM_TYPE => 'namespace'
+ ),
+ 'prop' => array (
+ ApiBase :: PARAM_ISMULTI => true,
+ ApiBase :: PARAM_TYPE => array (
+ 'user',
+ 'comment',
+ 'flags'
+ )
+ ),
+ 'show' => array (
+ ApiBase :: PARAM_ISMULTI => true,
+ ApiBase :: PARAM_TYPE => array (
+ 'minor',
+ '!minor',
+ 'bot',
+ '!bot',
+ 'anon',
+ '!anon'
+ )
+ ),
+ 'limit' => array (
+ ApiBase :: PARAM_DFLT => 10,
+ ApiBase :: PARAM_TYPE => 'limit',
+ ApiBase :: PARAM_MIN => 1,
+ ApiBase :: PARAM_MAX1 => ApiBase :: LIMIT_BIG1,
+ ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
+ )
+ );
+ }
+
+ protected function getParamDescription() {
+ return array (
+ 'start' => 'The timestamp to start enumerating from.',
+ 'end' => 'The timestamp to end enumerating.',
+ 'dir' => 'In which direction to enumerate.',
+ 'namespace' => 'Filter log entries to only this namespace(s)',
+ 'prop' => 'Include additional pieces of information',
+ 'show' => array (
+ 'Show only items that meet this criteria.',
+ 'For example, to see only minor edits done by logged-in users, set show=minor|!anon'
+ ),
+ 'limit' => 'How many total pages to return.'
+ );
+ }
+
+ protected function getDescription() {
+ return 'Enumerate recent changes';
+ }
+
+ protected function getExamples() {
+ return array (
+ 'api.php?action=query&list=recentchanges'
+ );
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiQueryRecentChanges.php 17880 2006-11-23 08:25:56Z nickj $';
+ }
+}
+?> \ No newline at end of file
diff --git a/includes/api/ApiQueryRevisions.php b/includes/api/ApiQueryRevisions.php
index f6097bad..3f678ff7 100644
--- a/includes/api/ApiQueryRevisions.php
+++ b/includes/api/ApiQueryRevisions.php
@@ -39,16 +39,11 @@ class ApiQueryRevisions extends ApiQueryBase {
$limit = $startid = $endid = $start = $end = $dir = $prop = null;
extract($this->extractRequestParams());
- $db = $this->getDB();
-
- // true when ordered by timestamp from older to newer, false otherwise
- $dirNewer = ($dir === 'newer');
-
// If any of those parameters are used, work in 'enumeration' mode.
// Enum mode can only be used when exactly one page is provided.
// Enumerating revisions on multiple pages make it extremelly
// difficult to manage continuations and require additional sql indexes
- $enumRevMode = ($limit !== 0 || $startid !== 0 || $endid !== 0 || $dirNewer || isset ($start) || isset ($end));
+ $enumRevMode = (!is_null($limit) || !is_null($startid) || !is_null($endid) || $dir === 'newer' || !is_null($start) || !is_null($end));
$pageSet = $this->getPageSet();
$pageCount = $pageSet->getGoodTitleCount();
@@ -58,57 +53,38 @@ class ApiQueryRevisions extends ApiQueryBase {
if ($revCount === 0 && $pageCount === 0)
return;
- if ($revCount > 0 && $pageCount > 0)
- $this->dieUsage('The revids= parameter may not be used with titles, pageids, or generator options.', 'revids');
-
if ($revCount > 0 && $enumRevMode)
$this->dieUsage('The revids= parameter may not be used with the list options (limit, startid, endid, dirNewer, start, end).', 'revids');
- if ($revCount === 0 && $pageCount > 1 && $enumRevMode)
+ if ($pageCount > 1 && $enumRevMode)
$this->dieUsage('titles, pageids or a generator was used to supply multiple pages, but the limit, startid, endid, dirNewer, start, and end parameters may only be used on a single page.', 'multpages');
- $tables = array (
- 'revision'
- );
- $fields = array (
+ $this->addTables('revision');
+ $this->addFields(array (
'rev_id',
'rev_page',
'rev_text_id',
'rev_minor_edit'
- );
- $conds = array (
- 'rev_deleted' => 0
- );
- $options = array ();
-
- $showTimestamp = $showUser = $showComment = $showContent = false;
- if (isset ($prop)) {
- foreach ($prop as $p) {
- switch ($p) {
- case 'timestamp' :
- $fields[] = 'rev_timestamp';
- $showTimestamp = true;
- break;
- case 'user' :
- $fields[] = 'rev_user';
- $fields[] = 'rev_user_text';
- $showUser = true;
- break;
- case 'comment' :
- $fields[] = 'rev_comment';
- $showComment = true;
- break;
- case 'content' :
- $tables[] = 'text';
- $conds[] = 'rev_text_id=old_id';
- $fields[] = 'old_id';
- $fields[] = 'old_text';
- $fields[] = 'old_flags';
- $showContent = true;
- break;
- default :
- ApiBase :: dieDebug(__METHOD__, "unknown prop $p");
- }
+ ));
+ $this->addWhere('rev_deleted=0');
+
+ $showContent = false;
+
+ if (!is_null($prop)) {
+ $prop = array_flip($prop);
+ $this->addFieldsIf('rev_timestamp', isset ($prop['timestamp']));
+ $this->addFieldsIf('rev_comment', isset ($prop['comment']));
+ if (isset ($prop['user'])) {
+ $this->addFields('rev_user');
+ $this->addFields('rev_user_text');
+ }
+ if (isset ($prop['content'])) {
+ $this->addTables('text');
+ $this->addWhere('rev_text_id=old_id');
+ $this->addFields('old_id');
+ $this->addFields('old_text');
+ $this->addFields('old_flags');
+ $showContent = true;
}
}
@@ -118,10 +94,10 @@ class ApiQueryRevisions extends ApiQueryBase {
if ($enumRevMode) {
// This is mostly to prevent parameter errors (and optimize sql?)
- if ($startid !== 0 && isset ($start))
+ if (!is_null($startid) && !is_null($start))
$this->dieUsage('start and startid cannot be used together', 'badparams');
- if ($endid !== 0 && isset ($end))
+ if (!is_null($endid) && !is_null($end))
$this->dieUsage('end and endid cannot be used together', 'badparams');
// This code makes an assumption that sorting by rev_id and rev_timestamp produces
@@ -130,40 +106,30 @@ class ApiQueryRevisions extends ApiQueryBase {
// Switching to rev_id removes the potential problem of having more than
// one row with the same timestamp for the same page.
// The order needs to be the same as start parameter to avoid SQL filesort.
- $options['ORDER BY'] = ($startid !== 0 ? 'rev_id' : 'rev_timestamp') . ($dirNewer ? '' : ' DESC');
-
- $before = ($dirNewer ? '<=' : '>=');
- $after = ($dirNewer ? '>=' : '<=');
- if ($startid !== 0)
- $conds[] = 'rev_id' . $after . intval($startid);
- if ($endid !== 0)
- $conds[] = 'rev_id' . $before . intval($endid);
- if (isset ($start))
- $conds[] = 'rev_timestamp' . $after . $db->addQuotes($start);
- if (isset ($end))
- $conds[] = 'rev_timestamp' . $before . $db->addQuotes($end);
+ if (is_null($startid))
+ $this->addWhereRange('rev_timestamp', $dir, $start, $end);
+ else
+ $this->addWhereRange('rev_id', $dir, $startid, $endid);
// must manually initialize unset limit
- if (!isset ($limit))
+ if (is_null($limit))
$limit = 10;
-
$this->validateLimit($this->encodeParamName('limit'), $limit, 1, $userMax, $botMax);
// There is only one ID, use it
- $conds['rev_page'] = array_pop(array_keys($pageSet->getGoodTitles()));
-
+ $this->addWhereFld('rev_page', current(array_keys($pageSet->getGoodTitles())));
}
elseif ($pageCount > 0) {
// When working in multi-page non-enumeration mode,
// limit to the latest revision only
- $tables[] = 'page';
- $conds[] = 'page_id=rev_page';
- $conds[] = 'page_latest=rev_id';
+ $this->addTables('page');
+ $this->addWhere('page_id=rev_page');
+ $this->addWhere('page_latest=rev_id');
$this->validateLimit('page_count', $pageCount, 1, $userMax, $botMax);
// Get all page IDs
- $conds['page_id'] = array_keys($pageSet->getGoodTitles());
+ $this->addWhereFld('page_id', array_keys($pageSet->getGoodTitles()));
$limit = $pageCount; // assumption testing -- we should never get more then $pageCount rows.
}
@@ -171,72 +137,51 @@ class ApiQueryRevisions extends ApiQueryBase {
$this->validateLimit('rev_count', $revCount, 1, $userMax, $botMax);
// Get all revision IDs
- $conds['rev_id'] = array_keys($pageSet->getRevisionIDs());
+ $this->addWhereFld('rev_id', array_keys($pageSet->getRevisionIDs()));
$limit = $revCount; // assumption testing -- we should never get more then $revCount rows.
} else
ApiBase :: dieDebug(__METHOD__, 'param validation?');
- $options['LIMIT'] = $limit +1;
-
- $this->profileDBIn();
- $res = $db->select($tables, $fields, $conds, __METHOD__, $options);
- $this->profileDBOut();
+ $this->addOption('LIMIT', $limit +1);
$data = array ();
$count = 0;
+ $res = $this->select(__METHOD__);
+
+ $db = & $this->getDB();
while ($row = $db->fetchObject($res)) {
if (++ $count > $limit) {
// We've reached the one extra which shows that there are additional pages to be had. Stop here...
if (!$enumRevMode)
ApiBase :: dieDebug(__METHOD__, 'Got more rows then expected'); // bug report
-
- $startStr = 'startid=' . $row->rev_id;
- $msg = array (
- 'continue' => $startStr
- );
- $this->getResult()->addValue('query-status', 'revisions', $msg);
+ $this->setContinueEnumParameter('startid', $row->rev_id);
break;
}
- $vals = array (
- 'revid' => intval($row->rev_id
- ), 'oldid' => intval($row->rev_text_id));
-
- if ($row->rev_minor_edit) {
- $vals['minor'] = '';
- }
-
- if ($showTimestamp)
- $vals['timestamp'] = wfTimestamp(TS_ISO_8601, $row->rev_timestamp);
-
- if ($showUser) {
- $vals['user'] = $row->rev_user_text;
- if (!$row->rev_user)
- $vals['anon'] = '';
- }
-
- if ($showComment)
- $vals['comment'] = $row->rev_comment;
+ $vals = $this->addRowInfo('rev', $row);
+ if ($vals) {
+ if ($showContent)
+ ApiResult :: setContent($vals, Revision :: getRevisionText($row));
- if ($showContent) {
- ApiResult :: setContent($vals, Revision :: getRevisionText($row));
+ $this->getResult()->addValue(array (
+ 'query',
+ 'pages',
+ intval($row->rev_page
+ ), 'revisions'), intval($row->rev_id), $vals);
}
-
- $this->getResult()->addValue(array (
- 'query',
- 'pages',
- intval($row->rev_page
- ), 'revisions'), intval($row->rev_id), $vals);
}
$db->freeResult($res);
- // Ensure that all revisions are shown as '<r>' elements
- $data = & $this->getResultData();
- foreach ($data['query']['pages'] as & $page) {
- if (is_array($page) && array_key_exists('revisions', $page)) {
- ApiResult :: setIndexedTagName($page['revisions'], 'rev');
+ // Ensure that all revisions are shown as '<rev>' elements
+ $result = $this->getResult();
+ if ($result->getIsRawMode()) {
+ $data = $result->getData();
+ foreach ($data['query']['pages'] as & $page) {
+ if (is_array($page) && array_key_exists('revisions', $page)) {
+ $result->setIndexedTagName($page['revisions'], 'rev');
+ }
}
}
}
@@ -253,14 +198,17 @@ class ApiQueryRevisions extends ApiQueryBase {
)
),
'limit' => array (
- ApiBase :: PARAM_DFLT => 0,
ApiBase :: PARAM_TYPE => 'limit',
- ApiBase :: PARAM_MIN => 0,
- ApiBase :: PARAM_MAX1 => 50,
- ApiBase :: PARAM_MAX2 => 500
+ ApiBase :: PARAM_MIN => 1,
+ ApiBase :: PARAM_MAX1 => ApiBase :: LIMIT_SML1,
+ ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_SML2
+ ),
+ 'startid' => array (
+ ApiBase :: PARAM_TYPE => 'integer'
+ ),
+ 'endid' => array (
+ ApiBase :: PARAM_TYPE => 'integer'
),
- 'startid' => 0,
- 'endid' => 0,
'start' => array (
ApiBase :: PARAM_TYPE => 'timestamp'
),
@@ -279,7 +227,7 @@ class ApiQueryRevisions extends ApiQueryBase {
protected function getParamDescription() {
return array (
- 'prop' => 'Which properties to get for each revision: user|timestamp|comment|content',
+ 'prop' => 'Which properties to get for each revision.',
'limit' => 'limit how many revisions will be returned (enum)',
'startid' => 'from which revision id to start enumeration (enum)',
'endid' => 'stop revision enumeration on this revid (enum)',
@@ -314,7 +262,7 @@ class ApiQueryRevisions extends ApiQueryBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQueryRevisions.php 16757 2006-10-03 05:41:55Z yurik $';
+ return __CLASS__ . ': $Id: ApiQueryRevisions.php 17374 2006-11-03 06:53:47Z yurik $';
}
}
-?> \ No newline at end of file
+?>
diff --git a/includes/api/ApiQuerySiteinfo.php b/includes/api/ApiQuerySiteinfo.php
index 27c3f187..9e8c11ff 100644
--- a/includes/api/ApiQuerySiteinfo.php
+++ b/includes/api/ApiQuerySiteinfo.php
@@ -44,7 +44,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
case 'general' :
- global $wgSitename, $wgVersion, $wgCapitalLinks;
+ global $wgSitename, $wgVersion, $wgCapitalLinks, $wgRightsCode, $wgRightsText;
$data = array ();
$mainPage = Title :: newFromText(wfMsgForContent('mainpage'));
$data['mainpage'] = $mainPage->getText();
@@ -52,6 +52,9 @@ class ApiQuerySiteinfo extends ApiQueryBase {
$data['sitename'] = $wgSitename;
$data['generator'] = "MediaWiki $wgVersion";
$data['case'] = $wgCapitalLinks ? 'first-letter' : 'case-sensitive'; // 'case-insensitive' option is reserved for future
+ if (isset($wgRightsCode))
+ $data['rightscode'] = $wgRightsCode;
+ $data['rights'] = $wgRightsText;
$this->getResult()->addValue('query', $p, $data);
break;
@@ -65,10 +68,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
);
ApiResult :: setContent($data[$ns], $title);
}
- ApiResult :: setIndexedTagName($data, 'ns');
+ $this->getResult()->setIndexedTagName($data, 'ns');
$this->getResult()->addValue('query', $p, $data);
break;
-
+
default :
ApiBase :: dieDebug(__METHOD__, "Unknown prop=$p");
}
@@ -107,7 +110,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiQuerySiteinfo.php 16757 2006-10-03 05:41:55Z yurik $';
+ return __CLASS__ . ': $Id: ApiQuerySiteinfo.php 17265 2006-10-27 03:50:34Z yurik $';
}
}
?> \ No newline at end of file
diff --git a/includes/api/ApiQueryUserContributions.php b/includes/api/ApiQueryUserContributions.php
new file mode 100644
index 00000000..4f63cadb
--- /dev/null
+++ b/includes/api/ApiQueryUserContributions.php
@@ -0,0 +1,175 @@
+<?php
+
+
+/*
+ * Created on Oct 16, 2006
+ *
+ * API for MediaWiki 1.8+
+ *
+ * Copyright (C) 2006 Yuri Astrakhan <FirstnameLastname@gmail.com>
+ *
+ * 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.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+if (!defined('MEDIAWIKI')) {
+ // Eclipse helper - will be ignored in production
+ require_once ('ApiQueryBase.php');
+}
+
+class ApiQueryContributions extends ApiQueryBase {
+
+ public function __construct($query, $moduleName) {
+ parent :: __construct($query, $moduleName, 'uc');
+ }
+
+ public function execute() {
+
+ //Blank all our variables
+ $limit = $user = $start = $end = $dir = null;
+
+ //Get our parameters out
+ extract($this->extractRequestParams());
+
+ //Get a database instance
+ $db = & $this->getDB();
+
+ if (is_null($user))
+ $this->dieUsage("User parameter may not be empty", 'param_user');
+ $userid = $db->selectField('user', 'user_id', array (
+ 'user_name' => $user
+ ));
+ if (!$userid)
+ $this->dieUsage("User name $user not found", 'param_user');
+
+ //Get the table names
+ list ($tbl_page, $tbl_revision) = $db->tableNamesN('page', 'revision');
+
+ //We're after the revision table, and the corresponding page row for
+ //anything we retrieve.
+ $this->addTables("$tbl_revision LEFT OUTER JOIN $tbl_page ON " .
+ "page_id=rev_page");
+
+ //We want to know the namespace, title, new-ness, and ID of a page,
+ // and the id, text-id, timestamp, minor-status, summary and page
+ // of a revision.
+ $this->addFields(array('page_namespace', 'page_title', 'page_is_new',
+ 'rev_id', 'rev_text_id', 'rev_timestamp', 'rev_minor_edit',
+ 'rev_comment', 'rev_page'));
+
+ // We only want pages by the specified user.
+ $this->addWhereFld('rev_user_text', $user);
+ // ... and in the specified timeframe.
+ $this->addWhereRange('rev_timestamp', $dir, $start, $end );
+
+ $this->addOption('LIMIT', $limit + 1);
+
+ //Initialise some variables
+ $data = array ();
+ $count = 0;
+
+ //Do the actual query.
+ $res = $this->select( __METHOD__ );
+
+ //Fetch each row
+ while ( $row = $db->fetchObject( $res ) ) {
+ if (++ $count > $limit) {
+ // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+ $this->setContinueEnumParameter('start', $row->rev_timestamp);
+ break;
+ }
+
+ //There's a fancy function in ApiQueryBase that does
+ // most of the work for us. Use that for the page
+ // and revision.
+ $revvals = $this->addRowInfo('rev', $row);
+ $pagevals = $this->addRowInfo('page', $row);
+
+ //If we got data on the revision only, use only
+ // that data.
+ if($revvals && !$pagevals) {
+ $data[] = $revvals;
+ }
+ //If we got data on the page only, use only
+ // that data.
+ else if($pagevals && !$revvals) {
+ $data[] = $pagevals;
+ }
+ //... and if we got data on both the revision and
+ // the page, merge the data and send it out.
+ else if($pagevals && $revvals) {
+ $data[] = array_merge($revvals, $pagevals);
+ }
+ }
+
+ //Free the database record so the connection can get on with other stuff
+ $db->freeResult($res);
+
+ //And send the whole shebang out as output.
+ $this->getResult()->setIndexedTagName($data, 'item');
+ $this->getResult()->addValue('query', $this->getModuleName(), $data);
+ }
+
+ protected function getAllowedParams() {
+ return array (
+ 'limit' => array (
+ ApiBase :: PARAM_DFLT => 10,
+ ApiBase :: PARAM_TYPE => 'limit',
+ ApiBase :: PARAM_MIN => 1,
+ ApiBase :: PARAM_MAX1 => ApiBase :: LIMIT_BIG1,
+ ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
+ ),
+ 'start' => array (
+ ApiBase :: PARAM_TYPE => 'timestamp'
+ ),
+ 'end' => array (
+ ApiBase :: PARAM_TYPE => 'timestamp'
+ ),
+ 'user' => null,
+ 'dir' => array (
+ ApiBase :: PARAM_DFLT => 'older',
+ ApiBase :: PARAM_TYPE => array (
+ 'newer',
+ 'older'
+ )
+ )
+ );
+ }
+
+ protected function getParamDescription() {
+ return array (
+ 'limit' => 'The maximum number of contributions to return.',
+ 'start' => 'The start timestamp to return from.',
+ 'end' => 'The end timestamp to return to.',
+ 'user' => 'The user to retrieve contributions for.',
+ 'dir' => 'The direction to search (older or newer).'
+ );
+ }
+
+ protected function getDescription() {
+ return 'Get edits by a user..';
+ }
+
+ protected function getExamples() {
+ return array (
+ 'api.php?action=query&list=usercontribs&ucuser=YurikBot'
+ );
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiQueryUserContributions.php 17952 2006-11-27 08:36:57Z nickj $';
+ }
+}
+?>
diff --git a/includes/api/ApiQueryWatchlist.php b/includes/api/ApiQueryWatchlist.php
new file mode 100644
index 00000000..67564d62
--- /dev/null
+++ b/includes/api/ApiQueryWatchlist.php
@@ -0,0 +1,234 @@
+<?php
+
+
+/*
+ * Created on Sep 25, 2006
+ *
+ * API for MediaWiki 1.8+
+ *
+ * Copyright (C) 2006 Yuri Astrakhan <FirstnameLastname@gmail.com>
+ *
+ * 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.,
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+if (!defined('MEDIAWIKI')) {
+ // Eclipse helper - will be ignored in production
+ require_once ('ApiQueryBase.php');
+}
+
+class ApiQueryWatchlist extends ApiQueryGeneratorBase {
+
+ public function __construct($query, $moduleName) {
+ parent :: __construct($query, $moduleName, 'wl');
+ }
+
+ public function execute() {
+ $this->run();
+ }
+
+ public function executeGenerator($resultPageSet) {
+ $this->run($resultPageSet);
+ }
+
+ private function run($resultPageSet = null) {
+ global $wgUser;
+
+ if (!$wgUser->isLoggedIn())
+ $this->dieUsage('You must be logged-in to have a watchlist', 'notloggedin');
+
+ $allrev = $start = $end = $namespace = $dir = $limit = $prop = null;
+ extract($this->extractRequestParams());
+
+ $patrol = $timestamp = $user = $comment = false;
+ if (!is_null($prop)) {
+ if (!is_null($resultPageSet))
+ $this->dieUsage('prop parameter may not be used in a generator', 'params');
+
+ $user = (false !== array_search('user', $prop));
+ $comment = (false !== array_search('comment', $prop));
+ $timestamp = (false !== array_search('timestamp', $prop)); // TODO: $timestamp not currently being used.
+ $patrol = (false !== array_search('patrol', $prop));
+
+ if ($patrol) {
+ global $wgUseRCPatrol, $wgUser;
+ if (!$wgUseRCPatrol || !$wgUser->isAllowed('patrol'))
+ $this->dieUsage('patrol property is not available', 'patrol');
+ }
+ }
+
+ if (is_null($resultPageSet)) {
+ $this->addFields(array (
+ 'rc_cur_id',
+ 'rc_this_oldid',
+ 'rc_namespace',
+ 'rc_title',
+ 'rc_new',
+ 'rc_minor',
+ 'rc_timestamp'
+ ));
+
+ $this->addFieldsIf('rc_user', $user);
+ $this->addFieldsIf('rc_user_text', $user);
+ $this->addFieldsIf('rc_comment', $comment);
+ $this->addFieldsIf('rc_patrolled', $patrol);
+ }
+ elseif ($allrev) {
+ $this->addFields(array (
+ 'rc_this_oldid',
+ 'rc_namespace',
+ 'rc_title',
+ 'rc_timestamp'
+ ));
+ } else {
+ $this->addFields(array (
+ 'rc_cur_id',
+ 'rc_namespace',
+ 'rc_title',
+ 'rc_timestamp'
+ ));
+ }
+
+ $this->addTables(array (
+ 'watchlist',
+ 'page',
+ 'recentchanges'
+ ));
+
+ $userId = $wgUser->getID();
+ $this->addWhere(array (
+ 'wl_namespace = rc_namespace',
+ 'wl_title = rc_title',
+ 'rc_cur_id = page_id',
+ 'wl_user' => $userId
+ ));
+ $this->addWhereRange('rc_timestamp', $dir, $start, $end);
+ $this->addWhereFld('wl_namespace', $namespace);
+ $this->addWhereIf('rc_this_oldid=page_latest', !$allrev);
+ $this->addWhereIf("rc_timestamp > ''", !isset ($start) && !isset ($end));
+
+ $this->addOption('LIMIT', $limit +1);
+
+ $data = array ();
+ $count = 0;
+ $res = $this->select(__METHOD__);
+
+ $db = $this->getDB();
+ while ($row = $db->fetchObject($res)) {
+ if (++ $count > $limit) {
+ // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+ $this->setContinueEnumParameter('start', $row->rc_timestamp);
+ break;
+ }
+
+ if (is_null($resultPageSet)) {
+ $vals = $this->addRowInfo('rc', $row);
+ if($vals)
+ $data[] = $vals;
+ } else {
+ $title = Title :: makeTitle($row->rc_namespace, $row->rc_title);
+ // skip any pages that user has no rights to read
+ if ($title->userCanRead()) {
+ if ($allrev) {
+ $data[] = intval($row->rc_this_oldid);
+ } else {
+ $data[] = intval($row->rc_cur_id);
+ }
+ }
+ }
+ }
+
+ $db->freeResult($res);
+
+ if (is_null($resultPageSet)) {
+ $this->getResult()->setIndexedTagName($data, 'item');
+ $this->getResult()->addValue('query', $this->getModuleName(), $data);
+ }
+ elseif ($allrev) {
+ $resultPageSet->populateFromRevisionIDs($data);
+ } else {
+ $resultPageSet->populateFromPageIDs($data);
+ }
+ }
+
+ protected function getAllowedParams() {
+ return array (
+ 'allrev' => false,
+ 'start' => array (
+ ApiBase :: PARAM_TYPE => 'timestamp'
+ ),
+ 'end' => array (
+ ApiBase :: PARAM_TYPE => 'timestamp'
+ ),
+ 'namespace' => array (
+ ApiBase :: PARAM_ISMULTI => true,
+ ApiBase :: PARAM_TYPE => 'namespace'
+ ),
+ 'dir' => array (
+ ApiBase :: PARAM_DFLT => 'older',
+ ApiBase :: PARAM_TYPE => array (
+ 'newer',
+ 'older'
+ )
+ ),
+ 'limit' => array (
+ ApiBase :: PARAM_DFLT => 10,
+ ApiBase :: PARAM_TYPE => 'limit',
+ ApiBase :: PARAM_MIN => 1,
+ ApiBase :: PARAM_MAX1 => ApiBase :: LIMIT_BIG1,
+ ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
+ ),
+ 'prop' => array (
+ APIBase :: PARAM_ISMULTI => true,
+ APIBase :: PARAM_TYPE => array (
+ 'user',
+ 'comment',
+ 'timestamp',
+ 'patrol'
+ )
+ )
+ );
+ }
+
+ protected function getParamDescription() {
+ return array (
+ 'allrev' => 'Include multiple revisions of the same page within given timeframe.',
+ 'start' => 'The timestamp to start enumerating from.',
+ 'end' => 'The timestamp to end enumerating.',
+ 'namespace' => 'Filter changes to only the given namespace(s).',
+ 'dir' => 'In which direction to enumerate pages.',
+ 'limit' => 'How many total pages to return per request.',
+ 'prop' => 'Which additional items to get (non-generator mode only).'
+ );
+ }
+
+ protected function getDescription() {
+ return '';
+ }
+
+ protected function getExamples() {
+ return array (
+ 'api.php?action=query&list=watchlist',
+ 'api.php?action=query&list=watchlist&wlallrev',
+ 'api.php?action=query&generator=watchlist&prop=info',
+ 'api.php?action=query&generator=watchlist&gwlallrev&prop=revisions&rvprop=timestamp|user'
+ );
+ }
+
+ public function getVersion() {
+ return __CLASS__ . ': $Id: ApiQueryWatchlist.php 17987 2006-11-29 05:45:03Z nickj $';
+ }
+}
+?>
diff --git a/includes/api/ApiResult.php b/includes/api/ApiResult.php
index 67fbf41e..c9bfcfb9 100644
--- a/includes/api/ApiResult.php
+++ b/includes/api/ApiResult.php
@@ -31,21 +31,34 @@ if (!defined('MEDIAWIKI')) {
class ApiResult extends ApiBase {
- private $mData;
+ private $mData, $mIsRawMode;
/**
* Constructor
*/
public function __construct($main) {
parent :: __construct($main, 'result');
- $this->Reset();
+ $this->mIsRawMode = false;
+ $this->reset();
}
- public function Reset() {
+ public function reset() {
$this->mData = array ();
}
+
+ /**
+ * Call this function when special elements such as '_element'
+ * are needed by the formatter, for example in XML printing.
+ */
+ public function setRawMode() {
+ $this->mIsRawMode = true;
+ }
+
+ public function getIsRawMode() {
+ return $this->mIsRawMode;
+ }
- function & getData() {
+ public function & getData() {
return $this->mData;
}
@@ -73,11 +86,19 @@ class ApiResult extends ApiBase {
/**
* Adds the content element to the array.
* Use this function instead of hardcoding the '*' element.
+ * @param string $subElemName when present, content element is created as a sub item of the arr.
+ * Use this parameter to create elements in format <elem>text</elem> without attributes
*/
- public static function setContent(& $arr, $value) {
+ public static function setContent(& $arr, $value, $subElemName = null) {
if (is_array($value))
ApiBase :: dieDebug(__METHOD__, 'Bad parameter');
- ApiResult :: setElement($arr, '*', $value);
+ if (is_null($subElemName)) {
+ ApiResult :: setElement($arr, '*', $value);
+ } else {
+ if (!isset ($arr[$subElemName]))
+ $arr[$subElemName] = array ();
+ ApiResult :: setElement($arr[$subElemName], '*', $value);
+ }
}
// public static function makeContentElement($tag, $value) {
@@ -89,10 +110,13 @@ class ApiResult extends ApiBase {
* In case the array contains indexed values (in addition to named),
* all indexed values will have the given tag name.
*/
- public static function setIndexedTagName(& $arr, $tag) {
- // Do not use setElement() as it is ok to call this more than once
+ public function setIndexedTagName(& $arr, $tag) {
+ // In raw mode, add the '_element', otherwise just ignore
+ if (!$this->getIsRawMode())
+ return;
if ($arr === null || $tag === null || !is_array($arr) || is_array($tag))
ApiBase :: dieDebug(__METHOD__, 'Bad parameter');
+ // Do not use setElement() as it is ok to call this more than once
$arr['_element'] = $tag;
}
@@ -105,7 +129,7 @@ class ApiResult extends ApiBase {
$data = & $this->getData();
- if (isset ($path)) {
+ if (!is_null($path)) {
if (is_array($path)) {
foreach ($path as $p) {
if (!isset ($data[$p]))
@@ -122,32 +146,12 @@ class ApiResult extends ApiBase {
ApiResult :: setElement($data, $name, $value);
}
- /**
- * Recursivelly removes any elements from the array that begin with an '_'.
- * The content element '*' is the only special element that is left.
- * Use this method when the entire data object gets sent to the user.
- */
- public function SanitizeData() {
- ApiResult :: SanitizeDataInt($this->mData);
- }
-
- private static function SanitizeDataInt(& $data) {
- foreach ($data as $key => & $value) {
- if ($key[0] === '_') {
- unset ($data[$key]);
- }
- elseif (is_array($value)) {
- ApiResult :: SanitizeDataInt($value);
- }
- }
- }
-
public function execute() {
ApiBase :: dieDebug(__METHOD__, 'execute() is not supported on Result object');
}
public function getVersion() {
- return __CLASS__ . ': $Id: ApiResult.php 16757 2006-10-03 05:41:55Z yurik $';
+ return __CLASS__ . ': $Id: ApiResult.php 17076 2006-10-18 05:35:24Z yurik $';
}
}
?> \ No newline at end of file
diff --git a/includes/cbt/CBTCompiler.php b/includes/cbt/CBTCompiler.php
index 4ef8ee4a..59088bed 100644
--- a/includes/cbt/CBTCompiler.php
+++ b/includes/cbt/CBTCompiler.php
@@ -75,7 +75,6 @@ class CBTCompiler {
* Returns true on success, error message on failure
*/
function compile() {
- $fname = 'CBTProcessor::compile';
$this->mLastError = false;
$this->mOps = array();
@@ -222,7 +221,6 @@ class CBTCompiler {
if ( $char == '{' ) {
// Switch to text mode
++$p;
- $tokenStart = $p;
$this->doOpenText( $p, $end );
++$argCount;
} elseif ( $char == '}' ) {
@@ -292,7 +290,7 @@ class CBTCompiler {
wfProfileIn( $fname );
$stack = array();
- foreach( $this->mOps as $index => $op ) {
+ foreach( $this->mOps as $op ) {
switch( $op->opcode ) {
case CBT_PUSH:
$stack[] = $this->phpQuote( $op->arg1 );
diff --git a/includes/memcached-client.php b/includes/memcached-client.php
index b1ba778a..2c5cc6be 100644
--- a/includes/memcached-client.php
+++ b/includes/memcached-client.php
@@ -451,7 +451,8 @@ class memcached
return false;
$this->stats['get_multi']++;
-
+ $sock_keys = array();
+
foreach ($keys as $key)
{
$sock = $this->get_sock($key);
@@ -697,6 +698,7 @@ class memcached
list ($ip, $port) = explode(":", $host);
$sock = false;
$timeout = $this->_connect_timeout;
+ $errno = $errstr = null;
for ($i = 0; !$sock && $i < $this->_connect_attempts; $i++) {
if ($i > 0) {
# Sleep until the timeout, in case it failed fast
@@ -740,7 +742,7 @@ class memcached
function _dead_sock ($sock)
{
$host = array_search($sock, $this->_cache_sock);
- @list ($ip, $port) = explode(":", $host);
+ @list ($ip, /* $port */) = explode(":", $host);
$this->_host_dead[$ip] = time() + 30 + intval(rand(0, 10));
$this->_host_dead[$host] = $this->_host_dead[$ip];
unset($this->_cache_sock[$host]);
@@ -849,6 +851,7 @@ class memcached
stream_set_timeout($sock, 1, 0);
$line = fgets($sock);
+ $match = array();
if (!preg_match('/^(\d+)/', $line, $match))
return null;
return $match[1];
@@ -1001,8 +1004,9 @@ class memcached
if (isset($this->_cache_sock[$host]))
return $this->_cache_sock[$host];
+ $sock = null;
$now = time();
- list ($ip, $port) = explode (":", $host);
+ list ($ip, /* $port */) = explode (":", $host);
if (isset($this->_host_dead[$host]) && $this->_host_dead[$host] > $now ||
isset($this->_host_dead[$ip]) && $this->_host_dead[$ip] > $now)
return null;
diff --git a/includes/normal/RandomTest.php b/includes/normal/RandomTest.php
index e2601366..b86ab7c3 100644
--- a/includes/normal/RandomTest.php
+++ b/includes/normal/RandomTest.php
@@ -68,6 +68,7 @@ function showDiffs( $a, $b ) {
$diffs = new Diff( $ota, $nta );
$formatter = new TableDiffFormatter();
$funky = $formatter->format( $diffs );
+ $matches = array();
preg_match_all( '/<span class="diffchange">(.*?)<\/span>/', $funky, $matches );
foreach( $matches[1] as $bit ) {
$hex = bin2hex( $bit );
diff --git a/includes/normal/Utf8Test.php b/includes/normal/Utf8Test.php
index 71069598..34ab69c8 100644
--- a/includes/normal/Utf8Test.php
+++ b/includes/normal/Utf8Test.php
@@ -45,6 +45,7 @@ if( !$in ) {
$columns = 0;
while( false !== ( $line = fgets( $in ) ) ) {
+ $matches = array();
if( preg_match( '/^(Here come the tests:\s*)\|$/', $line, $matches ) ) {
$columns = strpos( $line, '|' );
break;
@@ -86,6 +87,7 @@ $failed = 0;
$success = 0;
$total = 0;
while( false !== ( $line = fgets( $in ) ) ) {
+ $matches = array();
if( preg_match( '/^(\d+)\s+(.*?)\s*\|/', $line, $matches ) ) {
$section = $matches[1];
print $line;
diff --git a/includes/normal/UtfNormal.php b/includes/normal/UtfNormal.php
index af3809d5..d8eac7b8 100644
--- a/includes/normal/UtfNormal.php
+++ b/includes/normal/UtfNormal.php
@@ -124,8 +124,9 @@ class UtfNormal {
*
* @param string $string a UTF-8 string
* @return string a clean, shiny, normalized UTF-8 string
+ * @static
*/
- function cleanUp( $string ) {
+ static function cleanUp( $string ) {
if( NORMALIZE_ICU ) {
# We exclude a few chars that ICU would not.
$string = preg_replace(
@@ -153,8 +154,9 @@ class UtfNormal {
*
* @param string $string a valid UTF-8 string. Input is not validated.
* @return string a UTF-8 string in normal form C
+ * @static
*/
- function toNFC( $string ) {
+ static function toNFC( $string ) {
if( NORMALIZE_ICU )
return utf8_normalize( $string, UNORM_NFC );
elseif( UtfNormal::quickIsNFC( $string ) )
@@ -169,8 +171,9 @@ class UtfNormal {
*
* @param string $string a valid UTF-8 string. Input is not validated.
* @return string a UTF-8 string in normal form D
+ * @static
*/
- function toNFD( $string ) {
+ static function toNFD( $string ) {
if( NORMALIZE_ICU )
return utf8_normalize( $string, UNORM_NFD );
elseif( preg_match( '/[\x80-\xff]/', $string ) )
@@ -186,8 +189,9 @@ class UtfNormal {
*
* @param string $string a valid UTF-8 string. Input is not validated.
* @return string a UTF-8 string in normal form KC
+ * @static
*/
- function toNFKC( $string ) {
+ static function toNFKC( $string ) {
if( NORMALIZE_ICU )
return utf8_normalize( $string, UNORM_NFKC );
elseif( preg_match( '/[\x80-\xff]/', $string ) )
@@ -203,8 +207,9 @@ class UtfNormal {
*
* @param string $string a valid UTF-8 string. Input is not validated.
* @return string a UTF-8 string in normal form KD
+ * @static
*/
- function toNFKD( $string ) {
+ static function toNFKD( $string ) {
if( NORMALIZE_ICU )
return utf8_normalize( $string, UNORM_NFKD );
elseif( preg_match( '/[\x80-\xff]/', $string ) )
@@ -216,10 +221,10 @@ class UtfNormal {
/**
* Load the basic composition data if necessary
* @private
+ * @static
*/
- function loadData() {
- # fixme : are $utfCanonicalComp, $utfCanonicalDecomp really used?
- global $utfCombiningClass, $utfCanonicalComp, $utfCanonicalDecomp;
+ static function loadData() {
+ global $utfCombiningClass;
if( !isset( $utfCombiningClass ) ) {
require_once( 'UtfNormalData.inc' );
}
@@ -230,8 +235,9 @@ class UtfNormal {
* Returns false if not or uncertain.
* @param string $string a valid UTF-8 string. Input is not validated.
* @return bool
+ * @static
*/
- function quickIsNFC( $string ) {
+ static function quickIsNFC( $string ) {
# ASCII is always valid NFC!
# If it's pure ASCII, let it through.
if( !preg_match( '/[\x80-\xff]/', $string ) ) return true;
@@ -270,8 +276,9 @@ class UtfNormal {
* Returns true if the string is _definitely_ in NFC.
* Returns false if not or uncertain.
* @param string $string a UTF-8 string, altered on output to be valid UTF-8 safe for XML.
+ * @static
*/
- function quickIsNFCVerify( &$string ) {
+ static function quickIsNFCVerify( &$string ) {
# Screen out some characters that eg won't be allowed in XML
$string = preg_replace( '/[\x00-\x08\x0b\x0c\x0e-\x1f]/', UTF8_REPLACEMENT, $string );
@@ -321,6 +328,7 @@ class UtfNormal {
# large ASCII parts can be handled much more quickly.
# Don't chop up Unicode areas for punctuation, though,
# that wastes energy.
+ $matches = array();
preg_match_all(
'/([\x00-\x7f]+|[\x80-\xff][\x00-\x40\x5b-\x5f\x7b-\xff]*)/',
$string, $matches );
@@ -488,8 +496,9 @@ class UtfNormal {
* @param string $string
* @return string
* @private
+ * @static
*/
- function NFC( $string ) {
+ static function NFC( $string ) {
return UtfNormal::fastCompose( UtfNormal::NFD( $string ) );
}
@@ -497,8 +506,9 @@ class UtfNormal {
* @param string $string
* @return string
* @private
+ * @static
*/
- function NFD( $string ) {
+ static function NFD( $string ) {
UtfNormal::loadData();
global $utfCanonicalDecomp;
return UtfNormal::fastCombiningSort(
@@ -509,8 +519,9 @@ class UtfNormal {
* @param string $string
* @return string
* @private
+ * @static
*/
- function NFKC( $string ) {
+ static function NFKC( $string ) {
return UtfNormal::fastCompose( UtfNormal::NFKD( $string ) );
}
@@ -518,8 +529,9 @@ class UtfNormal {
* @param string $string
* @return string
* @private
+ * @static
*/
- function NFKD( $string ) {
+ static function NFKD( $string ) {
global $utfCompatibilityDecomp;
if( !isset( $utfCompatibilityDecomp ) ) {
require_once( 'UtfNormalDataK.inc' );
@@ -537,8 +549,9 @@ class UtfNormal {
* @param string $string Valid UTF-8 string
* @param array $map hash of expanded decomposition map
* @return string a UTF-8 string decomposed, not yet normalized (needs sorting)
+ * @static
*/
- function fastDecompose( $string, &$map ) {
+ static function fastDecompose( $string, $map ) {
UtfNormal::loadData();
$len = strlen( $string );
$out = '';
@@ -597,8 +610,9 @@ class UtfNormal {
* @private
* @param string $string a valid, decomposed UTF-8 string. Input is not validated.
* @return string a UTF-8 string with combining characters sorted in canonical order
+ * @static
*/
- function fastCombiningSort( $string ) {
+ static function fastCombiningSort( $string ) {
UtfNormal::loadData();
global $utfCombiningClass;
$len = strlen( $string );
@@ -646,8 +660,9 @@ class UtfNormal {
* @private
* @param string $string a valid UTF-8 string in sorted normal form D or KD. Input is not validated.
* @return string a UTF-8 string with canonical precomposed characters used where possible
+ * @static
*/
- function fastCompose( $string ) {
+ static function fastCompose( $string ) {
UtfNormal::loadData();
global $utfCanonicalComp, $utfCombiningClass;
$len = strlen( $string );
@@ -778,8 +793,9 @@ class UtfNormal {
* interate through a string without really doing anything of substance.
* @param string $string
* @return string
+ * @static
*/
- function placebo( $string ) {
+ static function placebo( $string ) {
$len = strlen( $string );
$out = '';
for( $i = 0; $i < $len; $i++ ) {
@@ -789,4 +805,4 @@ class UtfNormal {
}
}
-?>
+?> \ No newline at end of file
diff --git a/includes/normal/UtfNormalGenerate.php b/includes/normal/UtfNormalGenerate.php
index 688a80f1..f0eb5330 100644
--- a/includes/normal/UtfNormalGenerate.php
+++ b/includes/normal/UtfNormalGenerate.php
@@ -43,6 +43,7 @@ if( !$in ) {
print "Initializing normalization quick check tables...\n";
$checkNFC = array();
while( false !== ($line = fgets( $in ) ) ) {
+ $matches = array();
if( preg_match( '/^([0-9A-F]+)(?:..([0-9A-F]+))?\s*;\s*(NFC_QC)\s*;\s*([MN])/', $line, $matches ) ) {
list( $junk, $first, $last, $prop, $value ) = $matches;
#print "$first $last $prop $value\n";
diff --git a/includes/normal/UtfNormalTest.php b/includes/normal/UtfNormalTest.php
index 6d95bf85..1181b633 100644
--- a/includes/normal/UtfNormalTest.php
+++ b/includes/normal/UtfNormalTest.php
@@ -73,6 +73,7 @@ $testedChars = array();
while( false !== ( $line = fgets( $in ) ) ) {
list( $data, $comment ) = explode( '#', $line );
if( $data === '' ) continue;
+ $matches = array();
if( preg_match( '/@Part([\d])/', $data, $matches ) ) {
if( $matches[1] > 0 ) {
$ok = reportResults( $total, $success, $failure ) && $ok;
@@ -236,7 +237,6 @@ function testInvariant( &$u, $char, $desc, $reportFailure = false ) {
$result = verbosify( $char, $u->toNFD( $char ), 1, 'NFD', $reportFailure ) && $result;
$result = verbosify( $char, $u->toNFKC( $char ), 1, 'NFKC', $reportFailure ) && $result;
$result = verbosify( $char, $u->toNFKD( $char ), 1, 'NFKD', $reportFailure ) && $result;
- $c = $char;
$result = verbosify( $char, $u->cleanUp( $char ), 1, 'cleanUp', $reportFailure ) && $result;
global $verbose;
if( $verbose && !$result && !$reportFailure ) {
diff --git a/includes/templates/Userlogin.php b/includes/templates/Userlogin.php
index 83ef4920..953fbd47 100644
--- a/includes/templates/Userlogin.php
+++ b/includes/templates/Userlogin.php
@@ -78,7 +78,7 @@ class UserloginTemplate extends QuickTemplate {
<tr>
<td></td>
<td align='left' style="white-space:nowrap">
- <input type='submit' name="wpLoginattempt" id="wpLoginattempt" tabindex="5" value="<?php $this->msg('login') ?>" />&nbsp;<?php if( $this->data['useemail'] ) { ?><input type='submit' name="wpMailmypassword" id="wpMailmypassword"
+ <input type='submit' name="wpLoginattempt" id="wpLoginattempt" tabindex="5" value="<?php $this->msg('login') ?>" />&nbsp;<?php if( $this->data['useemail'] && $this->data['canreset']) { ?><input type='submit' name="wpMailmypassword" id="wpMailmypassword"
tabindex="6"
value="<?php $this->msg('mailmypassword') ?>" />
<?php } ?>
diff --git a/install-utils.inc b/install-utils.inc
index 6f8637c3..84fbc8e8 100644
--- a/install-utils.inc
+++ b/install-utils.inc
@@ -61,12 +61,9 @@ function copydirectory( $source, $dest ) {
}
function readconsole( $prompt = '' ) {
- static $isatty = null, $fp = null;
- if ( is_null( $fp ) ) {
- $fp = fopen( 'php://stdin', 'r' );
- }
+ static $isatty = null;
if ( is_null( $isatty ) ) {
- if ( !function_exists( 'posix_isatty' ) || posix_isatty( $fp ) ) {
+ if ( !function_exists( 'posix_isatty' ) || posix_isatty( 0 /*STDIN*/ ) ) {
$isatty = true;
} else {
$isatty = false;
@@ -79,10 +76,10 @@ function readconsole( $prompt = '' ) {
if ( $isatty ) {
print $prompt;
}
- if ( feof( $fp ) ) {
+ if ( feof( STDIN ) ) {
return false;
}
- $st = fgets($fp, 1024);
+ $st = fgets(STDIN, 1024);
if ($st === false) return false;
$resp = trim( $st );
return $resp;
diff --git a/languages/Language.php b/languages/Language.php
index 454d60e1..fd7786e5 100644
--- a/languages/Language.php
+++ b/languages/Language.php
@@ -51,7 +51,7 @@ class FakeConverter {
function markNoConversion($text, $noParse=false) {return $text;}
function convertCategoryKey( $key ) {return $key; }
function convertLinkToAllVariants($text){ return array( $this->mLang->getCode() => $text); }
- function setNoTitleConvert(){}
+ function armourMath($text){ return $text; }
}
#--------------------------------------------------------------------------
@@ -67,13 +67,15 @@ class Language {
'separatorTransformTable', 'fallback8bitEncoding', 'linkPrefixExtension',
'defaultUserOptionOverrides', 'linkTrail', 'namespaceAliases',
'dateFormats', 'datePreferences', 'datePreferenceMigrationMap',
- 'defaultDateFormat', 'extraUserToggles' );
+ 'defaultDateFormat', 'extraUserToggles', 'specialPageAliases' );
static public $mMergeableMapKeys = array( 'messages', 'namespaceNames', 'mathNames',
'dateFormats', 'defaultUserOptionOverrides', 'magicWords' );
static public $mMergeableListKeys = array( 'extraUserToggles' );
+ static public $mMergeableAliasListKeys = array( 'specialPageAliases' );
+
static public $mLocalisationCache = array();
static public $mWeekdayMsgs = array(
@@ -229,12 +231,8 @@ class Language {
*/
function getNsIndex( $text ) {
$this->load();
- $index = @$this->mNamespaceIds[$this->lc($text)];
- if ( is_null( $index ) ) {
- return false;
- } else {
- return $index;
- }
+ $lctext = $this->lc($text);
+ return isset( $this->mNamespaceIds[$lctext] ) ? $this->mNamespaceIds[$lctext] : false;
}
/**
@@ -248,6 +246,10 @@ class Language {
}
function specialPage( $name ) {
+ $aliases = $this->getSpecialPageAliases();
+ if ( isset( $aliases[$name][0] ) ) {
+ $name = $aliases[$name][0];
+ }
return $this->getNsText(NS_SPECIAL) . ':' . $name;
}
@@ -304,7 +306,7 @@ class Language {
* Get language names, indexed by code.
* If $customisedOnly is true, only returns codes with a messages file
*/
- function getLanguageNames( $customisedOnly = false ) {
+ public static function getLanguageNames( $customisedOnly = false ) {
global $wgLanguageNames;
if ( !$customisedOnly ) {
return $wgLanguageNames;
@@ -755,7 +757,7 @@ class Language {
function getMessage( $key ) {
$this->load();
- return @$this->messages[$key];
+ return isset( $this->messages[$key] ) ? $this->messages[$key] : null;
}
function getAllMessages() {
@@ -908,6 +910,21 @@ class Language {
$str );
}
+ /**
+ * Return a case-folded representation of $s
+ *
+ * This is a representation such that caseFold($s1)==caseFold($s2) if $s1
+ * and $s2 are the same except for the case of their characters. It is not
+ * necessary for the value returned to make sense when displayed.
+ *
+ * Do *not* perform any other normalisation in this function. If a caller
+ * uses this function when it should be using a more general normalisation
+ * function, then fix the caller.
+ */
+ function caseFold( $s ) {
+ return $this->uc( $s );
+ }
+
function checkTitleEncoding( $s ) {
if( is_array( $s ) ) {
wfDebugDieBacktrace( 'Given array to checkTitleEncoding.' );
@@ -937,6 +954,11 @@ class Language {
* @return string
*/
function stripForSearch( $string ) {
+ global $wgDBtype;
+ if ( $wgDBtype != 'mysql' ) {
+ return $string;
+ }
+
# MySQL fulltext index doesn't grok utf-8, so we
# need to fold cases and convert to hex
@@ -1084,6 +1106,20 @@ class Language {
}
/**
+ * Get special page names, as an associative array
+ * case folded alias => real name
+ */
+ function getSpecialPageAliases() {
+ $this->load();
+ if ( !isset( $this->mExtendedSpecialPageAliases ) ) {
+ $this->mExtendedSpecialPageAliases = $this->specialPageAliases;
+ wfRunHooks( 'LangugeGetSpecialPageAliases',
+ array( &$this->mExtendedSpecialPageAliases, $this->getCode() ) );
+ }
+ return $this->mExtendedSpecialPageAliases;
+ }
+
+ /**
* Italic is unsuitable for some languages
*
* @public
@@ -1135,6 +1171,17 @@ class Language {
return $number;
}
+ function parseFormattedNumber( $number ) {
+ $s = $this->digitTransformTable();
+ if (!is_null($s)) { $number = strtr($number, array_flip($s)); }
+
+ $s = $this->separatorTransformTable();
+ if (!is_null($s)) { $number = strtr($number, array_flip($s)); }
+
+ $number = strtr( $number, array (',' => '') );
+ return $number;
+ }
+
/**
* Adds commas to a given number
*
@@ -1246,9 +1293,11 @@ class Language {
* @param string $wordform1
* @param string $wordform2
* @param string $wordform3 (optional)
+ * @param string $wordform4 (optional)
+ * @param string $wordform5 (optional)
* @return string
*/
- function convertPlural( $count, $w1, $w2, $w3) {
+ function convertPlural( $count, $w1, $w2, $w3, $w4, $w5) {
return $count == '1' ? $w1 : $w2;
}
@@ -1309,16 +1358,16 @@ class Language {
return $this->mConverter->parserConvert( $text, $parser );
}
- # Tell the converter that it shouldn't convert titles
- function setNoTitleConvert(){
- $this->mConverter->setNotitleConvert();
- }
-
# Check if this is a language with variants
function hasVariants(){
return sizeof($this->getVariants())>1;
}
+ # Put custom tags (e.g. -{ }-) around math to prevent conversion
+ function armourMath($text){
+ return $this->mConverter->armourMath($text);
+ }
+
/**
* Perform output conversion on a string, and encode for safe HTML output.
@@ -1479,7 +1528,7 @@ class Language {
$cache = wfGetPrecompiledData( self::getFileName( "Messages", $code, '.ser' ) );
if ( $cache ) {
self::$mLocalisationCache[$code] = $cache;
- wfDebug( "Got localisation for $code from precompiled data file\n" );
+ wfDebug( "Language::loadLocalisation(): got localisation for $code from precompiled data file\n" );
wfProfileOut( __METHOD__ );
return self::$mLocalisationCache[$code]['deps'];
}
@@ -1499,10 +1548,10 @@ class Language {
if ( self::isLocalisationOutOfDate( $cache ) ) {
$wgMemc->delete( $memcKey );
$cache = false;
- wfDebug( "Localisation cache for $code had expired due to update of $file\n" );
+ wfDebug( "Language::loadLocalisation(): localisation cache for $code had expired due to update of $file\n" );
} else {
self::$mLocalisationCache[$code] = $cache;
- wfDebug( "Got localisation for $code from cache\n" );
+ wfDebug( "Language::loadLocalisation(): got localisation for $code from cache\n" );
wfProfileOut( __METHOD__ );
return $cache['deps'];
}
@@ -1511,25 +1560,26 @@ class Language {
wfProfileIn( __METHOD__ );
}
+ # Default fallback, may be overridden when the messages file is included
if ( $code != 'en' ) {
$fallback = 'en';
} else {
$fallback = false;
}
-
+
# Load the primary localisation from the source file
$filename = self::getMessagesFileName( $code );
if ( !file_exists( $filename ) ) {
- wfDebug( "No localisation file for $code, using implicit fallback to en\n" );
+ wfDebug( "Language::loadLocalisation(): no localisation file for $code, using implicit fallback to en\n" );
$cache = array();
$deps = array();
} else {
$deps = array( $filename => filemtime( $filename ) );
require( $filename );
$cache = compact( self::$mLocalisationKeys );
- wfDebug( "Got localisation for $code from source\n" );
+ wfDebug( "Language::loadLocalisation(): got localisation for $code from source\n" );
}
-
+
if ( !empty( $fallback ) ) {
# Load the fallback localisation, with a circular reference guard
if ( isset( $recursionGuard[$code] ) ) {
@@ -1550,6 +1600,8 @@ class Language {
$cache[$key] = $cache[$key] + $secondary[$key];
} elseif ( in_array( $key, self::$mMergeableListKeys ) ) {
$cache[$key] = array_merge( $secondary[$key], $cache[$key] );
+ } elseif ( in_array( $key, self::$mMergeableAliasListKeys ) ) {
+ $cache[$key] = array_merge_recursive( $cache[$key], $secondary[$key] );
}
}
} else {
@@ -1626,7 +1678,7 @@ class Language {
*/
static function getMessageFor( $key, $code ) {
self::loadLocalisation( $code );
- return @self::$mLocalisationCache[$code]['messages'][$key];
+ return isset( self::$mLocalisationCache[$code]['messages'][$key] ) ? self::$mLocalisationCache[$code]['messages'][$key] : null;
}
/**
diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php
index a949ad4e..316bcb12 100644
--- a/languages/LanguageConverter.php
+++ b/languages/LanguageConverter.php
@@ -12,17 +12,15 @@ class LanguageConverter {
var $mMainLanguageCode;
var $mVariants, $mVariantFallbacks;
var $mTablesLoaded = false;
- var $mUseFss = false;
var $mTables;
- var $mFssObjects;
var $mTitleDisplay='';
var $mDoTitleConvert=true, $mDoContentConvert=true;
+ var $mTitleFromFlag = false;
var $mCacheKey;
var $mLangObj;
var $mMarkup;
var $mFlags;
var $mUcfirst = false;
- var $mNoTitleConvert = false;
/**
* Constructor
*
@@ -43,15 +41,12 @@ class LanguageConverter {
$this->mMainLanguageCode = $maincode;
$this->mVariants = $variants;
$this->mVariantFallbacks = $variantfallbacks;
- $this->mCacheKey = wfMemcKey( 'conversiontables' );
+ $this->mCacheKey = wfMemcKey( 'conversiontables', $maincode );
$m = array('begin'=>'-{', 'flagsep'=>'|', 'codesep'=>':',
'varsep'=>';', 'end'=>'}-');
$this->mMarkup = array_merge($m, $markup);
- $f = array('A'=>'A', 'T'=>'T');
+ $f = array('A'=>'A', 'T'=>'T', 'R' => 'R');
$this->mFlags = array_merge($f, $flags);
- if ( function_exists( 'fss_prep_replace' ) ) {
- $this->mUseFss = true;
- }
}
/**
@@ -84,7 +79,7 @@ class LanguageConverter {
* @access public
*/
function getPreferredVariant( $fromUser = true ) {
- global $wgUser, $wgRequest;
+ global $wgUser, $wgRequest, $wgVariantArticlePath, $wgDefaultLanguageVariant;
if($this->mPreferredVariant)
return $this->mPreferredVariant;
@@ -96,6 +91,17 @@ class LanguageConverter {
return $req;
}
+ // check the syntax /code/ArticleTitle
+ if($wgVariantArticlePath!=false && isset($_SERVER['SCRIPT_NAME'])){
+ // Note: SCRIPT_NAME probably won't hold the correct value if PHP is run as CGI
+ // (it will hold path to php.cgi binary), and might not exist on some very old PHP installations
+ $scriptBase = basename( $_SERVER['SCRIPT_NAME'] );
+ if(in_array($scriptBase,$this->mVariants)){
+ $this->mPreferredVariant = $scriptBase;
+ return $this->mPreferredVariant;
+ }
+ }
+
// get language variant preference from logged in users
// Don't call this on stub objects because that causes infinite
// recursion during initialisation
@@ -104,6 +110,12 @@ class LanguageConverter {
return $this->mPreferredVariant;
}
+ // see if default variant is globaly set
+ if($wgDefaultLanguageVariant != false && in_array( $wgDefaultLanguageVariant, $this->mVariants )){
+ $this->mPreferredVariant = $wgDefaultLanguageVariant;
+ return $this->mPreferredVariant;
+ }
+
# FIXME rewrite code for parsing http header. The current code
# is written specific for detecting zh- variants
if( !$this->mPreferredVariant ) {
@@ -114,13 +126,18 @@ class LanguageConverter {
$pv=$this->mMainLanguageCode;
if(array_key_exists('HTTP_ACCEPT_LANGUAGE', $_SERVER)) {
$header = str_replace( '_', '-', strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"]));
- $zh = strstr($header, 'zh-');
+ $zh = strstr($header, $pv.'-');
if($zh) {
$pv = substr($zh,0,5);
}
}
- return $pv;
+ // don't try to return bad variant
+ if(in_array( $pv, $this->mVariants ))
+ return $pv;
}
+
+ return $this->mMainLanguageCode;
+
}
/**
@@ -160,8 +177,10 @@ class LanguageConverter {
// disable convert to variants between <code></code> tags
$codefix = '<code>.+?<\/code>|';
+ // disable convertsion of <script type="text/javascript"> ... </script>
+ $scriptfix = '<script.*?>.*?<\/script>|';
- $reg = '/'.$codefix.'<[^>]+>|&[a-zA-Z#][a-z0-9]+;' . $marker . $htmlfix . '/s';
+ $reg = '/'.$codefix . $scriptfix . '<[^>]+>|&[a-zA-Z#][a-z0-9]+;' . $marker . $htmlfix . '/s';
$matches = preg_split($reg, $text, -1, PREG_SPLIT_OFFSET_CAPTURE);
@@ -187,13 +206,12 @@ class LanguageConverter {
* @return string Translated text
*/
function translate( $text, $variant ) {
+ wfProfileIn( __METHOD__ );
if( !$this->mTablesLoaded )
$this->loadTables();
- if ( $this->mUseFss ) {
- return fss_exec_replace( $this->mFssObjects[$variant], $text );
- } else {
- return strtr( $text, $this->mTables[$variant] );
- }
+ $text = $this->mTables[$variant]->replace( $text );
+ wfProfileOut( __METHOD__ );
+ return $text;
}
/**
@@ -272,6 +290,42 @@ class LanguageConverter {
}
/**
+ * Parse flags with syntax -{FLAG| ... }-
+ *
+ */
+ function parseFlags($marked){
+ $flags = array();
+
+ // process flag only if the flag is valid
+ if(strlen($marked) < 2 || !(in_array($marked[0],$this->mFlags) && $marked[1]=='|' ) )
+ return array($marked,array());
+
+ $tt = explode($this->mMarkup['flagsep'], $marked, 2);
+
+ if(sizeof($tt) == 2) {
+ $f = explode($this->mMarkup['varsep'], $tt[0]);
+ foreach($f as $ff) {
+ $ff = trim($ff);
+ if(array_key_exists($ff, $this->mFlags) &&
+ !array_key_exists($this->mFlags[$ff], $flags))
+ $flags[] = $this->mFlags[$ff];
+ }
+ $rules = $tt[1];
+ }
+ else
+ $rules = $marked;
+
+ if( !in_array('R',$flags) ){
+ //FIXME: may cause trouble here...
+ //strip &nbsp; since it interferes with the parsing, plus,
+ //all spaces should be stripped in this tag anyway.
+ $rules = str_replace('&nbsp;', '', $rules);
+ }
+
+ return array($rules,$flags);
+ }
+
+ /**
* convert text to different variants of a language. the automatic
* conversion is done in autoConvert(). here we parse the text
* marked with -{}-, which specifies special conversions of the
@@ -302,11 +356,14 @@ class LanguageConverter {
return $text;
if( $isTitle ) {
- if($this->mNoTitleConvert){
- $this->mTitleDisplay = $text;
- return $text;
+
+ // use the title from the T flag if any
+ if($this->mTitleFromFlag){
+ $this->mTitleFromFlag = false;
+ return $this->mTitleDisplay;
}
+ // check for __NOTC__ tag
if( !$this->mDoTitleConvert ) {
$this->mTitleDisplay = $text;
return $text;
@@ -324,57 +381,55 @@ class LanguageConverter {
}
}
- if( !$this->mDoContentConvert )
- return $text;
-
$plang = $this->getPreferredVariant();
if( isset( $this->mVariantFallbacks[$plang] ) ) {
$fallback = $this->mVariantFallbacks[$plang];
} else {
- // This sounds... bad?
- $fallback = '';
+ $fallback = $this->mMainLanguageCode;
}
$tarray = explode($this->mMarkup['begin'], $text);
$tfirst = array_shift($tarray);
- $text = $this->autoConvert($tfirst);
- foreach($tarray as $txt) {
+ if($this->mDoContentConvert)
+ $text = $this->autoConvert($tfirst);
+ else
+ $text = $tfirst;
+ foreach($tarray as $txt) {
$marked = explode($this->mMarkup['end'], $txt, 2);
- $flags = array();
- $tt = explode($this->mMarkup['flagsep'], $marked[0], 2);
- if(sizeof($tt) == 2) {
- $f = explode($this->mMarkup['varsep'], $tt[0]);
- foreach($f as $ff) {
- $ff = trim($ff);
- if(array_key_exists($ff, $this->mFlags) &&
- !array_key_exists($this->mFlags[$ff], $flags))
- $flags[] = $this->mFlags[$ff];
- }
- $rules = $tt[1];
+ // strip the flags from syntax like -{T| ... }-
+ list($rules,$flags) = $this->parseFlags($marked[0]);
+
+ // proces R flag: output raw content of -{ ... }-
+ if( in_array('R',$flags) ){
+ $disp = $rules;
+ } else if( $this->mDoContentConvert){
+ // parse the contents -{ ... }-
+ $carray = $this->parseManualRule($rules, $flags);
+
+ $disp = '';
+ if(array_key_exists($plang, $carray))
+ $disp = $carray[$plang];
+ else if(array_key_exists($fallback, $carray))
+ $disp = $carray[$fallback];
+ } else{
+ // if we don't do content convert, still strip the -{}- tags
+ $disp = $rules;
+ $flags = array();
}
- else
- $rules = $marked[0];
-
- //FIXME: may cause trouble here...
- //strip &nbsp; since it interferes with the parsing, plus,
- //all spaces should be stripped in this tag anyway.
- $rules = str_replace('&nbsp;', '', $rules);
-
- $carray = $this->parseManualRule($rules, $flags);
- $disp = '';
- if(array_key_exists($plang, $carray))
- $disp = $carray[$plang];
- else if(array_key_exists($fallback, $carray))
- $disp = $carray[$fallback];
+
if($disp) {
- if(in_array('T', $flags))
+ // use syntax -{T|zh:TitleZh;zh-tw:TitleTw}- for custom conversion in title
+ if(in_array('T', $flags)){
+ $this->mTitleFromFlag = true;
$this->mTitleDisplay = $disp;
+ }
else
$text .= $disp;
+ // use syntax -{A|zh:WordZh;zh-tw:WordTw}- to introduce a custom mapping between
+ // words WordZh and WordTw in the whole text
if(in_array('A', $flags)) {
- /* modify the conversion table for this session*/
/* fill in the missing variants, if any,
with fallbacks */
@@ -394,20 +449,20 @@ class LanguageConverter {
continue;
if(!array_key_exists($vto, $carray))
continue;
- $this->mTables[$vto][$carray[$vfrom]] = $carray[$vto];
-
+ $this->mTables[$vto]->setPair($carray[$vfrom], $carray[$vto]);
}
}
- if ( $this->mUseFss ) {
- $this->generateFssObjects();
- }
}
}
else {
$text .= $marked[0];
}
- if(array_key_exists(1, $marked))
- $text .= $this->autoConvert($marked[1]);
+ if(array_key_exists(1, $marked)){
+ if( $this->mDoContentConvert )
+ $text .= $this->autoConvert($marked[1]);
+ else
+ $text .= $marked[1];
+ }
}
return $text;
@@ -452,17 +507,34 @@ class LanguageConverter {
*/
function findVariantLink( &$link, &$nt ) {
global $wgDisableLangConversion;
- $pref = $this->getPreferredVariant();
- $ns=0;
+ $linkBatch = new LinkBatch();
+
+ $ns=NS_MAIN;
+
if(is_object($nt))
$ns = $nt->getNamespace();
$variants = $this->autoConvertToAllVariants($link);
if($variants == false) //give up
return;
+
+ $titles = array();
+
foreach( $variants as $v ) {
- $varnt = Title::newFromText( $v, $ns );
- if( $varnt && $varnt->getArticleID() > 0 ) {
+ if($v != $link){
+ $varnt = Title::newFromText( $v, $ns );
+ if(!is_null($varnt)){
+ $linkBatch->addObj($varnt);
+ $titles[]=$varnt;
+ }
+ }
+ }
+
+ // fetch all variants in single query
+ $linkBatch->execute();
+
+ foreach( $titles as $varnt ) {
+ if( $varnt->getArticleID() > 0 ) {
$nt = $varnt;
if( !$wgDisableLangConversion )
$link = $v;
@@ -536,40 +608,36 @@ class LanguageConverter {
global $wgMemc;
if( $this->mTablesLoaded )
return;
+ wfProfileIn( __METHOD__ );
$this->mTablesLoaded = true;
+ $this->mTables = false;
if($fromcache) {
+ wfProfileIn( __METHOD__.'-cache' );
$this->mTables = $wgMemc->get( $this->mCacheKey );
- if( !empty( $this->mTables ) ) //all done
- return;
+ wfProfileOut( __METHOD__.'-cache' );
}
- // not in cache, or we need a fresh reload.
- // we will first load the default tables
- // then update them using things in MediaWiki:Zhconversiontable/*
- global $wgMessageCache;
- $this->loadDefaultTables();
- foreach($this->mVariants as $var) {
- $cached = $this->parseCachedTable($var);
- $this->mTables[$var] = array_merge($this->mTables[$var], $cached);
- }
-
- $this->postLoadTables();
+ if ( !$this->mTables || !isset( $this->mTables['VERSION 2'] ) ) {
+ wfProfileIn( __METHOD__.'-recache' );
+ // not in cache, or we need a fresh reload.
+ // we will first load the default tables
+ // then update them using things in MediaWiki:Zhconversiontable/*
+ global $wgMessageCache;
+ $this->loadDefaultTables();
+ foreach($this->mVariants as $var) {
+ $cached = $this->parseCachedTable($var);
+ $this->mTables[$var]->mergeArray($cached);
+ }
- if($this->lockCache()) {
- $wgMemc->set($this->mCacheKey, $this->mTables, 43200);
- $this->unlockCache();
- }
- if ( $this->mUseFss ) {
- $this->generateFssObjects();
- }
- }
+ $this->postLoadTables();
+ $this->mTables['VERSION 2'] = true;
- /**
- * Generate FSS objects. The FSS extension must be available.
- */
- function generateFssObjects() {
- foreach ( $this->mTables as $variant => $table ) {
- $this->mFssObjects[$variant] = fss_prep_replace( $table );
+ if($this->lockCache()) {
+ $wgMemc->set($this->mCacheKey, $this->mTables, 43200);
+ $this->unlockCache();
+ }
+ wfProfileOut( __METHOD__.'-recache' );
}
+ wfProfileOut( __METHOD__ );
}
/**
@@ -731,10 +799,16 @@ class LanguageConverter {
return true;
}
- function setNoTitleConvert(){
- $this->mNoTitleConvert = true;
+ /**
+ * Armour rendered math against conversion
+ * Wrap math into rawoutput -{R| math }- syntax
+ */
+ function armourMath($text){
+ $ret = $this->mMarkup['begin'] . 'R|' . $text . $this->mMarkup['end'];
+ return $ret;
}
+
}
?>
diff --git a/languages/Names.php b/languages/Names.php
index 7b825c57..5cc89b41 100644
--- a/languages/Names.php
+++ b/languages/Names.php
@@ -35,7 +35,7 @@
'bug' => 'ᨅᨔ ᨕᨘá¨á¨—', # Buginese
'bxr' => 'БурÑад', # Buryat (Russia)
'ca' => 'Català', # Catalan
- 'cbk-zam' => 'Chavacano de Zamboanga', # Zamboanga Chavacano
+ 'cbk-zam' => 'Zamboangueño', # Zamboanga Chavacano
'cdo' => 'Mìng-dĕ̤ng-ngṳ̄', # Min Dong
'ce' => 'Ðохчийн', # Chechen
'ceb' => 'Cebuano', # Cebuano
@@ -45,9 +45,12 @@
'chy' => 'Tsetsêhestâhese', # Cheyenne
'co' => 'Corsu', # Corsican
'cr' => 'NÄ“hiyaw / á“€á¦áƒá”­á¤', # Cree
+ 'crh' => 'Qırımtatarca', # Crimean Tatar
+ 'crh-latn' => 'Qırımtatarca (Latin)', # Crimean Tatar (Latin)
+ 'crh-cyrl' => 'Qırımtatarca (Kiril)', # Crimean Tatar (Cyrillic)
'cs' => 'ÄŒesky', # Czech
'csb' => 'Kaszëbsczi', # Cassubian
- 'cu' => 'ÑловѣньÑкъ', # Old Church Slavonic (ancient language)
+ 'cu' => 'СловѣньÑкъ', # Old Church Slavonic (ancient language)
'cv' => 'Чăвашла', # Chuvash
'cy' => 'Cymraeg', # Welsh
'da' => 'Dansk', # Danish
@@ -87,6 +90,7 @@
'haw' => 'Hawai`i', # Hawaiian
'he' => 'עברית', # Hebrew
'hi' => 'हिनà¥à¤¦à¥€', # Hindi
+ 'hil' => 'Ilonggo', # Hiligaynon
'ho' => 'Hiri Motu', # Hiri Motu
'hr' => 'Hrvatski', # Croatian
'hsb' => 'Hornjoserbsce', # Upper Sorbian
@@ -109,13 +113,15 @@
'jbo' => 'Lojban', # Lojban
'jv' => 'Basa Jawa', # Javanese
'ka' => 'ქáƒáƒ áƒ—ული', # Georgian
+ 'kaa' => 'Qaraqalpaqsha', # Karakalpak
+ 'kab' => 'ثاقبايليث', # Kabyle
'kg' => 'Kongo', # Kongo, (FIXME!) should probaly be KiKongo or KiKoongo
'ki' => 'Gĩkũyũ', # Kikuyu, correctness not guaranteed
'kj' => 'Kuanyama', # Kuanyama (FIXME!)
'kk' => 'Қазақша', # Kazakh
- 'kk-cn' => 'قازاق', # Kazakh Arabic
- 'kk-kz' => 'Қазақ', # Kazakh Cyrillic
- 'kk-tr' => 'Qazaq', # Kazakh Latin
+ 'kk-cn' => 'قازاقشا (تٴوتە)', # Kazakh Arabic
+ 'kk-kz' => 'Қазақша (кирил)', # Kazakh Cyrillic
+ 'kk-tr' => 'Qazaqşa (latın)', # Kazakh Latin
'kl' => 'Kalaallisut', # Greenlandic
'km' => 'ភាសាážáŸ’មែរ', # Cambodian
'kn' => 'ಕನà³à²¨à²¡', # Kannada
@@ -134,11 +140,13 @@
'lg' => 'Luganda', # Ganda
'li' => 'Limburgs', # Limburgian
'lij' => 'Líguru', # Ligurian
+ 'lld' => 'Ladin', # Ladin
'lmo' => 'Lumbaart', # Lombard
- 'ln' => 'Lingala', # Lingala
+ 'ln' => 'Lingála', # Lingala
'lo' => 'ລາວ',# Laotian
'lt' => 'Lietuvių', # Lithuanian
'lv' => 'Latviešu', # Latvian
+ 'lzz' => 'Lazuri Nena', #Laz
'map-bms' => 'Basa Banyumasan', # Banyumasan
'mg' => 'Malagasy', # Malagasy
'mh' => 'Ebon', # Marshallese
@@ -156,6 +164,7 @@
'mzn' => 'مَزÙروني', # Mazandarin
'na' => 'Ekakairũ Naoero', # Nauruan
'nah' => 'Nahuatl', # Nahuatl, en:Wikipedia writes Nahuatlahtolli, while another form is Náhuatl
+ 'nan' => 'Bân-lâm-gú', # Min-nan -- (bug 8217) nan instead of zh-min-nan, http://www.sil.org/iso639-3/codes.asp?order=639_3&letter=n
'nap' => 'Nnapulitano', # Neapolitan
'nb' => 'Norsk (bokmål)', # Norwegian (Bokmal)
'nds' => 'Plattdüütsch', # Low German ''or'' Low Saxon
@@ -177,7 +186,7 @@
'os' => 'Иронау', # Ossetic
'pa' => 'ਪੰਜਾਬੀ', # Punjabi
'pag' => 'Pangasinan', # Pangasinan
- 'pam' => 'Pampangan', # Pampanga
+ 'pam' => 'Kapampangan', # Pampanga
'pap' => 'Papiamentu', # Papiamentu
'pdc' => 'Deitsch', # Pennsylvania German
'pih' => 'Norfuk / Pitkern', # Norfuk/Pitcairn/Norfolk
@@ -214,9 +223,9 @@
'so' => 'Soomaaliga', # Somali
'sq' => 'Shqip', # Albanian
'sr' => 'СрпÑки / Srpski', # Serbian
- 'sr-ec' => 'екавица', # Serbian cyrillic ekavian
+ 'sr-ec' => 'ћирилица', # Serbian cyrillic ekavian
'sr-jc' => 'ијекавица', # Serbian cyrillic iyekvian
- 'sr-el' => 'ekavica', # Serbian latin ekavian
+ 'sr-el' => 'latinica', # Serbian latin ekavian
'sr-jl' => 'ijekavica', # Serbian latin iyekavian
'ss' => 'SiSwati', # Swati
'st' => 'seSotho', # Southern Sotho
@@ -252,10 +261,10 @@
've' => 'Tshivenda', # Venda
'vec' => 'Vèneto', # Venetian
'vi' => 'Tiếng Việt', # Vietnamese
- 'vls' => 'West-Vlaoms', # West Flemish
+ 'vls' => 'West-Vlams', # West Flemish
'vo' => 'Volapük', # Volapük
'wa' => 'Walon', # Walloon
- 'war' => 'Samar-Leyte Visayan', # Waray-Waray
+ 'war' => 'Winaray', # Waray-Waray
'wo' => 'Wollof', # Wolof
'wuu' => 'å´è¯­', # Wu
'xal' => 'Хальмг', # Kalmyk
@@ -269,7 +278,7 @@
'zh-classical' => 'å¤æ–‡ / 文言文', # Classical Chinese/Literary Chinese
'zh-cn' => '中文(简体)', # Simplified
'zh-hk' => '中文(ç¹é«”)', # Traditional (Hong Kong)
- 'zh-min-nan' => 'Bân-lâm-gú', # Min-nan
+ 'zh-min-nan' => 'Bân-lâm-gú', # Min-nan -- (see bug 8217)
'zh-sg' => '中文(简体)', # Simplified (Singapore)
'zh-tw' => '中文(ç¹é«”)', # Traditional
'zh-yue' => '粵語', # Cantonese
diff --git a/languages/classes/LanguageBe.php b/languages/classes/LanguageBe.php
index f2a52cca..553d2ad3 100644
--- a/languages/classes/LanguageBe.php
+++ b/languages/classes/LanguageBe.php
@@ -12,7 +12,7 @@
*/
class LanguageBe extends Language {
- function convertPlural( $count, $wordform1, $wordform2, $wordform3) {
+ function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) {
$count = str_replace ('.', '', $count);
if ($count > 10 && floor(($count % 100) / 10) == 1) {
return $wordform3;
diff --git a/languages/classes/LanguageBs.php b/languages/classes/LanguageBs.php
index 4734fdc1..92d00090 100644
--- a/languages/classes/LanguageBs.php
+++ b/languages/classes/LanguageBs.php
@@ -7,7 +7,7 @@
class LanguageBs extends Language {
- function convertPlural( $count, $wordform1, $wordform2, $wordform3) {
+ function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) {
$count = str_replace ('.', '', $count);
if ($count > 10 && floor(($count % 100) / 10) == 1) {
return $wordform3;
diff --git a/languages/classes/LanguageCs.php b/languages/classes/LanguageCs.php
index 6b8d3d61..bd2f33a3 100644
--- a/languages/classes/LanguageCs.php
+++ b/languages/classes/LanguageCs.php
@@ -67,7 +67,7 @@ class LanguageCs extends Language {
# Plural form transformations, needed for some languages.
# Invoked by {{plural:count|wordform1|wordform2|wordform3}}
- function convertPlural( $count, $wordform1, $wordform2, $wordform3) {
+ function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) {
$count = str_replace( '\xc2\xa0', '', $count );
switch ( $count ) {
case 1:
diff --git a/languages/classes/LanguageCu.php b/languages/classes/LanguageCu.php
new file mode 100644
index 00000000..f30bd253
--- /dev/null
+++ b/languages/classes/LanguageCu.php
@@ -0,0 +1,50 @@
+<?php
+/** Old Church Slavonic (Ѩзыкъ ÑловѣньÑкъ)
+ *
+ * @package MediaWiki
+ * @subpackage Language
+ */
+
+/* Please, see Language.php for general function comments */
+class LanguageCu extends Language {
+ # Convert from the nominative form of a noun to some other case
+ # Invoked with {{grammar:case|word}}
+ function convertGrammar( $word, $case ) {
+ global $wgGrammarForms;
+ if ( isset($wgGrammarForms['Ñu'][$case][$word]) ) {
+ return $wgGrammarForms['Ñu'][$case][$word];
+ }
+
+ # These rules are not perfect, but they are currently only used for site names so it doesn't
+ # matter if they are wrong sometimes. Just add a special case for your site name if necessary.
+
+ #join and array_slice instead mb_substr
+ $ar = array();
+ preg_match_all( '/./us', $word, $ar );
+ if (!preg_match("/[a-zA-Z_]/us", $word))
+ switch ( $case ) {
+ case 'genitive': #родительный падеж
+ if ((join('',array_slice($ar[0],-4))=='вики') || (join('',array_slice($ar[0],-4))=='Вики'))
+ {}
+ elseif (join('',array_slice($ar[0],-2))=='ї')
+ $word = join('',array_slice($ar[0],0,-2)).'Ñ—Ñ©';
+ break;
+ case 'accusative': #винительный падеж
+ #stub
+ break;
+ }
+ return $word;
+ }
+
+ function convertPlural( $count, $wordform1, $wordform2, $wordform3, $wordform4, $w5) {
+ switch ($count % 10) {
+ case 1: return $wordform1;
+ case 2: return $wordform2;
+ case 3: return $wordform3;
+ case 4: return $wordform3;
+ default: return $wordform4;
+ }
+ }
+
+}
+?>
diff --git a/languages/classes/LanguageFi.php b/languages/classes/LanguageFi.php
index 47dd0e65..8fc25499 100644
--- a/languages/classes/LanguageFi.php
+++ b/languages/classes/LanguageFi.php
@@ -28,57 +28,32 @@ class LanguageFi extends Language {
# These rules are not perfect, but they are currently only used for site names so it doesn't
# matter if they are wrong sometimes. Just add a special case for your site name if necessary.
+
+ # wovel harmony flag
+ $aou = preg_match( '/[aou][^äöy]*$/i', $word );
+
+ # append i after final consonant
+ if ( preg_match( '/[bcdfghjklmnpqrstvwxz]$/i', $word ) )
+ $word .= 'i';
+
switch ( $case ) {
case 'genitive':
- if ( $word == 'Wikisitaatit' ) {
- $word = 'Wikisitaattien';
- } else {
- $word .= 'n';
- }
- break;
+ $word .= 'n';
+ break;
case 'elative':
- if ( $word == 'Wikisitaatit' ) {
- $word = 'Wikisitaateista';
- } else {
- if ( mb_substr($word, -1) == 'y' ) {
- $word .= 'stä';
- } else {
- $word .= 'sta';
- }
- }
+ $word .= ($aou ? 'sta' : 'stä');
break;
case 'partitive':
- if ( $word == 'Wikisitaatit' ) {
- $word = 'Wikisitaatteja';
- } else {
- if ( mb_substr($word, -1) == 'y' ) {
- $word .= 'ä';
- } else {
- $word .= 'a';
- }
- }
+ $word .= ($aou ? 'a' : 'ä');
break;
case 'illative':
# Double the last letter and add 'n'
# mb_substr has a compatibility function in GlobalFunctions.php
- if ( $word == 'Wikisitaatit' ) {
- $word = 'Wikisitaatteihin';
- } else {
- $word = $word . mb_substr($word,-1) . 'n';
- }
+ $word = $word . mb_substr($word, -1) . 'n';
break;
case 'inessive':
- if ( $word == 'Wikisitaatit' ) {
- $word = 'Wikisitaateissa';
- } else {
- if ( mb_substr($word, -1) == 'y' ) {
- $word .= 'ssä';
- } else {
- $word .= 'ssa';
- }
- }
+ $word .= ($aou ? 'ssa' : 'ssä');
break;
-
}
return $word;
}
diff --git a/languages/classes/LanguageFr.php b/languages/classes/LanguageFr.php
index 61cd91c6..b150ceff 100644
--- a/languages/classes/LanguageFr.php
+++ b/languages/classes/LanguageFr.php
@@ -10,7 +10,7 @@ class LanguageFr extends Language {
/**
* Use singular form for zero (see bug 7309)
*/
- function convertPlural( $count, $w1, $w2, $w3) {
+ function convertPlural( $count, $w1, $w2, $w3, $w4, $w5) {
return $count <= '1' ? $w1 : $w2;
}
}
diff --git a/languages/classes/LanguageHe.php b/languages/classes/LanguageHe.php
index 70de3115..e84d45d8 100644
--- a/languages/classes/LanguageHe.php
+++ b/languages/classes/LanguageHe.php
@@ -52,11 +52,13 @@ class LanguageHe extends Language {
* @param integer the number of items
* @param string the first form (singular)
* @param string the second form (plural)
- * @param string the third form (2 items, plural is used if not applicable and not specified)
+ * @param string the third form (2 items, plural is used if not applicable and not specified
+ * @param not used (for compatibility with ancestor)
+ * @param not used (for compatibility with ancestor)
*
* @return string of the suited form of word
*/
- public function convertPlural( $count, $w1, $w2, $w3) {
+ public function convertPlural( $count, $w1, $w2, $w3, $w4, $w5) {
if ( $count == '1' ) {
return $w1;
} elseif ( $count == '2' && $w3 ) {
diff --git a/languages/classes/LanguageHr.php b/languages/classes/LanguageHr.php
index b1f6b0fc..537c142d 100644
--- a/languages/classes/LanguageHr.php
+++ b/languages/classes/LanguageHr.php
@@ -6,7 +6,7 @@
*/
class LanguageHr extends Language {
- function convertPlural( $count, $wordform1, $wordform2, $wordform3) {
+ function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) {
$count = str_replace ('.', '', $count);
if ($count > 10 && floor(($count % 100) / 10) == 1) {
return $wordform3;
diff --git a/languages/classes/LanguageHsb.php b/languages/classes/LanguageHsb.php
new file mode 100644
index 00000000..08163b72
--- /dev/null
+++ b/languages/classes/LanguageHsb.php
@@ -0,0 +1,117 @@
+<?php
+/** Upper Sorbian (Hornjoserbsce)
+ *
+ * @package MediaWiki
+ * @subpackage Language
+ */
+
+class LanguageHsb extends Language {
+
+ # Convert from the nominative form of a noun to some other case
+ # Invoked with {{GRAMMAR:case|word}}
+
+ function convertGrammar( $word, $case ) {
+ global $wgGrammarForms;
+ if ( isset( $wgGrammarForms['hsb'][$case][$word] ) ) {
+ return $wgGrammarForms['hsb'][$case][$word];
+ }
+
+ switch ( $case ) {
+ case 'genitiw': # genitive
+ if ( $word == 'Wikipedija' ) {
+ $word = 'Wikipedije';
+ } elseif ( $word == 'Wikiknihi' ) {
+ $word = 'Wikiknih';
+ } elseif ( $word == 'Wikinowiny' ) {
+ $word = 'Wikinowin';
+ } elseif ( $word == 'Wikižórło' ) {
+ $word = 'Wikižórła';
+ } elseif ( $word == 'Wikicitaty' ) {
+ $word = 'Wikicitatow';
+ } elseif ( $word == 'Wikisłownik' ) {
+ $word = 'Wikisłownika';
+ }
+ break;
+ case 'datiw': # dativ
+ if ( $word == 'Wikipedija' ) {
+ $word = 'Wikipediji';
+ } elseif ( $word == 'Wikiknihi' ) {
+ $word = 'Wikikniham';
+ } elseif ( $word == 'Wikinowiny' ) {
+ $word = 'Wikinowinam';
+ } elseif ( $word == 'Wikižórło' ) {
+ $word = 'Wikižórłu';
+ } elseif ( $word == 'Wikicitaty' ) {
+ $word = 'Wikicitatam';
+ } elseif ( $word == 'Wikisłownik' ) {
+ $word = 'Wikisłownikej';
+ }
+ break;
+ case 'akuzativ': # akuzativ
+ if ( $word == 'Wikipedija' ) {
+ $word = 'Wikipediju';
+ } elseif ( $word == 'Wikiknihi' ) {
+ $word = 'Wikiknknihi';
+ } elseif ( $word == 'Wikinowiny' ) {
+ $word = 'Wikinowiny';
+ } elseif ( $word == 'Wikižórło' ) {
+ $word = 'Wikižórło';
+ } elseif ( $word == 'Wikicitaty' ) {
+ $word = 'Wikicitaty';
+ } elseif ( $word == 'Wikisłownik' ) {
+ $word = 'Wikisłownik';
+ }
+ break;
+ case 'instrumental': # instrumental
+ if ( $word == 'Wikipedija' ) {
+ $word = 'Wikipediju';
+ } elseif ( $word == 'Wikiknihi' ) {
+ $word = 'Wikiknihami';
+ } elseif ( $word == 'Wikinowiny' ) {
+ $word = 'Wikinowinami';
+ } elseif ( $word == 'Wikižórło' ) {
+ $word = 'Wikižórłom';
+ } elseif ( $word == 'Wikicitaty' ) {
+ $word = 'Wikicitatami';
+ } elseif ( $word == 'Wikisłownik' ) {
+ $word = 'Wikisłownikom';
+ } else {
+ $word = 'z ' . $word;
+ }
+ break;
+ case 'lokatiw': # lokatiw
+ if ( $word == 'Wikipedija' ) {
+ $word = 'Wikipediji';
+ } elseif ( $word == 'Wikiknihi' ) {
+ $word = 'Wikiknihach';
+ } elseif ( $word == 'Wikinowiny' ) {
+ $word = 'Wikinowinach';
+ } elseif ( $word == 'Wikižórło' ) {
+ $word = 'Wikižórłu';
+ } elseif ( $word == 'Wikicitaty' ) {
+ $word = 'Wikicitatach';
+ } elseif ( $word == 'Wikisłownik' ) {
+ $word = 'Wikisłowniku';
+ } else {
+ $word = 'wo ' . $word;
+ }
+ break;
+ }
+
+ return $word; # this will return the original value for 'nominatiw' (nominativ) and all undefined case values
+ }
+
+ function convertPlural( $count, $singular, $dual, $plural, $pluralgen, $w5 ) {
+ switch ( abs( $count ) % 100 ) {
+ case 1:
+ return $singular;
+ case 2:
+ return $dual;
+ case 3:
+ case 4:
+ return $plural;
+ default:
+ return $pluralgen;
+ }
+ }
+}
diff --git a/languages/classes/LanguageKk.deps.php b/languages/classes/LanguageKk.deps.php
new file mode 100644
index 00000000..22ad7ad5
--- /dev/null
+++ b/languages/classes/LanguageKk.deps.php
@@ -0,0 +1,12 @@
+<?php
+// This file exists to ensure that base classes are preloaded before
+// LanguageKk.php is compiled, working around a bug in the APC opcode
+// cache on PHP 5, where cached code can break if the include order
+// changed on a subsequent page view.
+// see http://mail.wikipedia.org/pipermail/wikitech-l/2006-January/033660.html
+
+
+require_once( dirname(__FILE__).'/../LanguageConverter.php' );
+require_once( dirname(__FILE__).'/LanguageKk_kz.php' );
+
+?>
diff --git a/languages/classes/LanguageKk.php b/languages/classes/LanguageKk.php
new file mode 100644
index 00000000..46162e01
--- /dev/null
+++ b/languages/classes/LanguageKk.php
@@ -0,0 +1,210 @@
+<?php
+/** Kazakh (Қазақша)
+ * converter routines
+ *
+ * @package MediaWiki
+ * @subpackage Language
+ */
+
+require_once( dirname(__FILE__).'/../LanguageConverter.php' );
+require_once( dirname(__FILE__).'/LanguageKk_kz.php' );
+
+class KkConverter extends LanguageConverter {
+ var $mLatinToCyrillic = array(
+ 'YA' => 'Я', 'Ya' => 'Я', 'ya' => 'Ñ', 'YE' => 'Е', 'Ye' => 'У', 'ye' => 'е',
+ 'YO' => 'Ð', 'Yo' => 'Ð', 'yo' => 'Ñ‘', 'YU' => 'Ю', 'Yu' => 'Ю', 'yu' => 'ÑŽ',
+ 'YW' => 'Ю', 'Yw' => 'Ю', 'yw' => 'ю',
+
+ 'bʺ' => 'бъ', 'dʺ' => 'дъ', 'fʺ' => 'фъ', 'gʺ' => 'гъ', 'kʺ' => 'къ', 'lʺ' => 'лъ',
+ 'mʺ' => 'мъ', 'nʺ' => 'нъ', 'pʺ' => 'пъ', 'rʺ' => 'ръ', 'sʺ' => 'ÑÑŠ', 'tʺ' => 'Ñ‚ÑŠ',
+ 'vʺ' => 'въ', 'zʺ' => 'зъ',
+ /* 'jʺ' => 'жъ', 'cʺ' => 'цъ', 'çʺ' => 'чъ', 'şʺ' => 'шъ', */
+
+ 'ŞÇʹ'=> 'ЩЬ', 'Şçʹ'=> 'Щь', 'Bʺ' => 'БЪ', 'Dʺ' => 'ДЪ', 'Fʺ' => 'ФЪ', 'Gʺ' => 'ГЪ', 'Kʺ' => 'КЪ', 'Lʺ' => 'ЛЪ',
+ 'Mʺ' => 'МЪ', 'Nʺ' => 'ÐЪ', 'Pʺ' => 'ПЪ', 'Rʺ' => 'РЪ', 'Sʺ' => 'СЪ', 'Tʺ' => 'ТЪ',
+ 'Vʺ' => 'ВЪ', 'Zʺ' => 'ЗЪ',
+ /* 'Jʺ' => 'ЖЪ', 'Cʺ' => 'ЦЪ', 'Çʺ' => 'ЧЪ', 'Şʺ' => 'ШЪ', */
+
+ 'şçʹ'=> 'щь', 'bʹ' => 'бь', 'dʹ' => 'дь', 'fʹ' => 'фь', 'gʹ' => 'гь', 'kʹ' => 'кь', 'lʹ' => 'ль',
+ 'mʹ' => 'мь', 'nʹ' => 'нь', 'pʹ' => 'пь', 'rʹ' => 'рь', 'sʹ' => 'ÑÑŒ', 'tʹ' => 'Ñ‚ÑŒ',
+ 'vʹ' => 'вь', 'zʹ' => 'зь', 'jʹ' => 'жь', 'cʹ' => 'ць', 'çʹ' => 'чь', 'şʹ' => 'шь',
+
+ 'Bʹ' => 'БЬ', 'Dʹ' => 'ДЬ', 'Fʹ' => 'ФЬ', 'Gʹ' => 'ГЬ', 'Kʹ' => 'КЬ', 'Lʹ' => 'ЛЬ',
+ 'Mʹ' => 'МЬ', 'Nʹ' => 'ÐЬ', 'Pʹ' => 'ПЬ', 'Rʹ' => 'РЬ', 'Sʹ' => 'СЬ', 'Tʹ' => 'ТЬ',
+ 'Vʹ' => 'ВЬ', 'Zʹ' => 'ЗЬ', 'Jʹ' => 'ЖЬ', 'Cʹ' => 'ЦЬ', 'Çʹ' => 'ЧЬ', 'Şʹ' => 'ШЬ',
+
+ 'ŞÇ' => 'Щ', 'Şç' => 'Щ', 'şç' => 'щ',
+
+ 'a' => 'а', 'ä' => 'ә', 'b' => 'б', 'c' => 'ц', 'ç' => 'ч', 'd' => 'д', 'e' => 'е',
+ 'é' => 'Ñ', 'f' => 'Ñ„', 'g' => 'г', 'ÄŸ' => 'Ò“', 'h' => 'Ò»', 'i' => 'Ñ–', 'ı' => 'Ñ‹',
+ 'ï' => 'и', 'j' => 'ж', 'k' => 'к', 'l' => 'л', 'm' => 'м', 'n' => 'н', 'ñ' => 'ң',
+ 'o' => 'о', 'ö' => 'Ó©', 'p' => 'п', 'q' => 'Ò›', 'r' => 'Ñ€', 's' => 'Ñ', 'ÅŸ' => 'ш',
+ 't' => 'т', 'u' => 'ұ', 'ü' => 'ү', 'v' => 'в', 'w' => 'у', 'x' => 'х', 'ý' => 'й',
+ 'z' => 'з',
+
+ 'A' => 'Ð', 'Ä' => 'Ó˜', 'B' => 'Б', 'C' => 'Ц', 'Ç' => 'Ч', 'D' => 'Д', 'E' => 'Е',
+ 'É' => 'Э', 'F' => 'Ф', 'G' => 'Г', 'Ğ' => 'Ғ', 'H' => 'Һ', 'İ' => 'І', 'I' => 'Ы',
+ 'Ã' => 'И', 'J' => 'Ж', 'K' => 'К', 'L' => 'Л', 'M' => 'Ðœ', 'N' => 'Ð', 'Ñ' => 'Ò¢',
+ 'O' => 'О', 'Ö' => 'Ө', 'P' => 'П', 'Q' => 'Қ', 'R' => 'Р', 'S' => 'С', 'Ş' => 'Ш',
+ 'T' => 'Т', 'U' => 'Ò°', 'Ãœ' => 'Ò®', 'V' => 'Ð’', 'W' => 'У', 'Ã' => 'Й', 'X' => 'Ð¥',
+ 'Z' => 'З'
+ );
+
+ var $mCyrillicToLatin = array(
+ 'а' => 'a', 'ә' => 'ä', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'ғ' => 'ğ',
+ 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 'ж' => 'j', 'з' => 'z', 'и' => 'ï',
+ 'й' => 'ý', 'к' => 'k', 'қ' => 'q', 'л' => 'l', 'м' => 'm', 'н' => 'n',
+ 'Ò£' => 'ñ', 'о' => 'o', 'Ó©' => 'ö', 'п' => 'p', 'Ñ€' => 'r', 'Ñ' => 's',
+ 'т' => 't', 'у' => 'w', 'ұ' => 'u', 'ү' => 'ü', 'ф' => 'f', 'х' => 'x',
+ 'һ' => 'h', 'ц' => 'c', 'ч' => 'ç', 'ш' => 'ş', 'щ' => 'şç', 'ъ' => 'ʺ',
+ 'Ñ‹' => 'ı', 'ÑŒ' => 'ʹ', 'Ñ–' => 'i', 'Ñ' => 'é', 'ÑŽ' => 'yw', 'Ñ' => 'ya',
+
+ 'Ð' => 'A', 'Ó˜' => 'Ä', 'Б' => 'B', 'Ð’' => 'V', 'Г' => 'G', 'Ò’' => 'Äž',
+ 'Д' => 'D', 'Е' => 'E', 'Ð' => 'Yo', 'Ж' => 'J', 'З' => 'Z', 'И' => 'Ã',
+ 'Й' => 'Ã', 'К' => 'K', 'Òš' => 'Q', 'Л' => 'L', 'Ðœ' => 'M', 'Ð' => 'N',
+ 'Ң' => 'Ñ', 'О' => 'O', 'Ө' => 'Ö', 'П' => 'P', 'Р' => 'R', 'С' => 'S',
+ 'Т' => 'T', 'У' => 'W', 'Ұ' => 'U', 'Ү' => 'Ü', 'Ф' => 'F', 'Х' => 'X',
+ 'Һ' => 'H', 'Ц' => 'C', 'Ч' => 'Ç', 'Ш' => 'Ş', 'Щ' => 'Şç', 'Ъ' => 'ʺ',
+ 'Ы' => 'I', 'Ь' => 'ʹ', 'І' => 'İ', 'Э' => 'É', 'Ю' => 'Yw', 'Я' => 'Ya'
+ );
+
+ var $mCyrillicToArabic = array(
+ 'ла' => 'لا', 'ЛÐ' => 'لا', 'Ла' => 'لا',
+
+ 'а' => 'ا', 'ә' => 'ٴا', 'б' => 'ب', 'в' => 'ۆ', 'г' => 'گ', 'ғ' => 'ع',
+ 'д' => 'د', 'е' => 'ە', 'ё' => 'يو', 'ж' => 'ج', 'з' => 'ز', 'и' => 'ي',
+ 'й' => 'ي', 'к' => 'ك', 'қ' => 'ق', 'л' => 'ل', 'м' => 'م', 'н' => 'ن',
+ 'Ò£' => 'Ú­', 'о' => 'Ùˆ', 'Ó©' => 'ٴو', 'п' => 'Ù¾', 'Ñ€' => 'ر', 'Ñ' => 'س',
+ 'Ñ‚' => 'ت', 'у' => 'Û‹', 'Ò±' => 'Û‡', 'Ò¯' => 'Ù´Û‡', 'Ñ„' => 'Ù', 'Ñ…' => 'Ø­',
+ 'һ' => 'ھ', 'ц' => 'تس', 'ч' => 'چ', 'ш' => 'ش', 'щ' => 'شش', 'ъ' => 'ي',
+ 'Ñ‹' => 'Ù‰', 'ÑŒ' => 'ÙŠ', 'Ñ–' => 'ٴى', 'Ñ' => 'Û•', 'ÑŽ' => 'ÙŠÛ‹', 'Ñ' => 'يا',
+
+ 'Ð' => 'ا', 'Ó˜' => 'ٴا', 'Б' => 'ب', 'Ð’' => 'Û†', 'Г' => 'Ú¯', 'Ò’' => 'ع',
+ 'Д' => 'د', 'Е' => 'Û•', 'Ð' => 'يو', 'Ж' => 'ج', 'З' => 'ز', 'И' => 'ÙŠ',
+ 'Й' => 'ÙŠ', 'К' => 'Ùƒ', 'Òš' => 'Ù‚', 'Л' => 'Ù„', 'Ðœ' => 'Ù…', 'Ð' => 'Ù†',
+ 'Ң' => 'ڭ', 'О' => 'و', 'Ө' => 'ٴو', 'П' => 'پ', 'Р' => 'ر', 'С' => 'س',
+ 'Т' => 'ت', 'У' => 'Û‹', 'Ò°' => 'Û‡', 'Ò®' => 'Ù´Û‡', 'Ф' => 'Ù', 'Ð¥' => 'Ø­',
+ 'Һ' => 'ھ', 'Ц' => 'تس', 'Ч' => 'چ', 'Ш' => 'ش', 'Щ' => 'شش', 'Ъ' => 'ي',
+ 'Ы' => 'ى', 'Ь' => 'ي', 'І' => 'ٴى', 'Э' => 'ە', 'Ю' => 'يۋ', 'Я' => 'يا',
+ );
+
+ function loadDefaultTables() {
+ $this->mTables = array(
+ 'kk-kz' => new ReplacementArray( $this->mLatinToCyrillic ),
+ 'kk-tr' => new ReplacementArray( $this->mCyrillicToLatin ),
+ 'kk-cn' => new ReplacementArray( $this->mCyrillicToArabic ),
+ 'kk' => new ReplacementArray()
+ );
+ }
+
+
+ // Do not convert content on talk pages
+ function parserConvert( $text, &$parser ){
+ if(is_object($parser->mTitle) && $parser->mTitle->isTalkPage())
+ $this->mDoContentConvert=false;
+ else
+ $this->mDoContentConvert=true;
+
+ return parent::parserConvert($text, $parser );
+ }
+
+ /*
+ * A function wrapper, if there is no selected variant,
+ * leave the link names as they were
+ */
+ function findVariantLink( &$link, &$nt ) {
+ $oldlink=$link;
+ parent::findVariantLink($link,$nt);
+ if($this->getPreferredVariant()==$this->mMainLanguageCode)
+ $link=$oldlink;
+ }
+
+ /*
+ * We want our external link captions to be converted in variants,
+ * so we return the original text instead -{$text}-, except for URLs
+ */
+ function markNoConversion($text, $noParse=false) {
+ if($noParse || preg_match("/^https?:\/\/|ftp:\/\/|irc:\/\//",$text))
+ return parent::markNoConversion($text);
+ return $text;
+ }
+
+ /*
+ * An ugly function wrapper for parsing Image titles
+ * (to prevent image name conversion)
+ */
+ function autoConvert($text, $toVariant=false) {
+ global $wgTitle;
+ if($wgTitle->getNameSpace()==NS_IMAGE){
+ $imagename = $wgTitle->getNsText();
+ if(preg_match("/^$imagename:/",$text)) return $text;
+ }
+ return parent::autoConvert($text,$toVariant);
+ }
+
+ /**
+ * It translates text into variant, specials:
+ * - ommiting roman numbers
+ */
+ function translate($text, $toVariant){
+ $breaks = '[^\w\x80-\xff]';
+
+ // regexp for roman numbers
+ $roman = 'M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})';
+
+ $reg = '/^'.$roman.'$|^'.$roman.$breaks.'|'.$breaks.$roman.'$|'.$breaks.$roman.$breaks.'/';
+
+ $matches = preg_split($reg, $text, -1, PREG_SPLIT_OFFSET_CAPTURE);
+
+ $m = array_shift($matches);
+ $ret = $this->mTables[$toVariant]->replace( $m[0] );
+ $mstart = $m[1]+strlen($m[0]);
+ foreach($matches as $m) {
+ $ret .= substr($text, $mstart, $m[1]-$mstart);
+ $ret .= parent::translate($m[0], $toVariant);
+ $mstart = $m[1] + strlen($m[0]);
+ }
+
+ return $ret;
+ }
+
+}
+
+class LanguageKk extends LanguageKk_kz {
+
+ function __construct() {
+ global $wgHooks;
+ parent::__construct();
+
+ $variants = array( 'kk', 'kk-kz', 'kk-tr', 'kk-cn' );
+ $variantfallbacks = array(
+ 'kk' => 'kk-kz',
+ 'kk-kz' => 'kk-kz',
+ 'kk-tr' => 'kk-tr',
+ 'kk-cn' => 'kk-cn'
+ );
+
+ $this->mConverter = new KkConverter( $this, 'kk', $variants, $variantfallbacks );
+ $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+ }
+
+ function convertGrammar( $word, $case ) {
+ $fname="LanguageKk::convertGrammar";
+ wfProfileIn( $fname );
+
+ //always convert to kk-kz before convertGrammar
+ $w1 = $word;
+ $word = $this->mConverter->autoConvert( $word, 'kk-kz' );
+ $w2 = $word;
+ $word = parent::convertGrammar( $word, $case );
+ //restore encoding
+ if( $w1 != $w2 ) {
+ $word = $this->mConverter->translate( $word, 'kk-tr' );
+ }
+ wfProfileOut( $fname );
+ return $word;
+ }
+
+}
+
+?>
diff --git a/languages/classes/LanguageKk_kz.php b/languages/classes/LanguageKk_kz.php
new file mode 100644
index 00000000..f01251c0
--- /dev/null
+++ b/languages/classes/LanguageKk_kz.php
@@ -0,0 +1,269 @@
+<?php
+/** Kazakh (Қазақша)
+ *
+ *
+ * @package MediaWiki
+ * @subpackage Language
+ */
+
+
+class LanguageKk_kz extends Language {
+
+ # Convert from the nominative form of a noun to some other case
+ # Invoked with {{GRAMMAR:case|word}}
+ /**
+ * Cases: genitive, dative, accusative, locative, ablative, comitative + possessive forms
+ */
+ function convertGrammar( $word, $case ) {
+ global $wgGrammarForms;
+ if ( isset( $wgGrammarForms['kk'][$case][$word] ) ) {
+ return $wgGrammarForms['kk'][$case][$word];
+ }
+ // Set up some constants...
+ // Vowels in last syllable
+ $frontVowels = array( "е", "Ó©", "Ò¯", "Ñ–", "Ó™", "Ñ" );
+ $backVowels = array( "а", "о", "Ò±", "Ñ‹", "Ñ", "Ñ‘" );
+ $allVowels = array( "е", "Ó©", "Ò¯", "Ñ–", "Ó™", "Ñ", "а", "о", "Ò±", "Ñ‹", "Ñ", "Ñ‘" );
+ // Preceding letters
+ $preVowels = $allVowels;
+ $preNasals = array( "м", "н", "ң" );
+ $preSonants = array( "и", "й", "л", "р", "у", "ю");
+ # $preVoiceds = array( "б", "в", "г", "ғ", "д", "ж", "з", "һ" );
+ # $preVoicelesses = array( "п", "Ñ„", "к", "Ò›", "Ñ‚", "ш", "Ñ", "Ñ…", "ц", "ч", "щ" );
+ $preConsonants = array( "п", "Ñ„", "к", "Ò›", "Ñ‚", "ш", "Ñ", "Ñ…", "ц", "ч", "щ", "б", "в", "г", "д" );
+ $preEzhZet = array( "ж", "з" );
+ $preSonorants = array( "и", "й", "л", "р", "у", "ю", "м", "н", "ң", "ж", "з");
+
+ // Possessives
+ $firsts = array( "м", "ң" ); // 1st singular, 2nd unformal
+ $seconds = array( "з" ); // 1st plural, 2nd formal
+ $thirds = array( "Ñ‹", "Ñ–" ); // 3rd
+
+ // Put the word in a form we can play with since we're using UTF-8
+ $ar = array();
+ $ar = preg_split('//u', $word, -1, PREG_SPLIT_NO_EMPTY);
+ $wordEnding = $ar[count( $ar ) - 1]; //Here's the last letter in the word
+ $wordReversed = array_reverse( $ar ); //Here's an array with the order of the letters in the word reversed so we can find a match quicker *shrug*
+
+ // Find the last vowel in the word
+ $wordLastVowel = NULL;
+ foreach ( $wordReversed as $xvalue ) {
+ foreach ( $allVowels as $yvalue ) {
+ if ( strcmp( $xvalue, $yvalue ) == 0 ) {
+ $wordLastVowel = $xvalue;
+ break;
+ } else {
+ continue;
+ }
+ }
+ if ( $wordLastVowel !== NULL ) {
+ break;
+ } else {
+ continue;
+ }
+ }
+
+ // Now convert the word
+ switch ( $case ) {
+ case "dc1":
+ case "genitive": #ilik
+ if ( in_array( $wordEnding, $preConsonants ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "Ñ‚Ñ–Ò£";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "Ñ‚Ñ‹Ò£";
+ }
+ } elseif ( in_array( $wordEnding, $preVowels ) || in_array( $wordEnding, $preNasals ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "нің";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "ның";
+ }
+ } elseif ( in_array( $wordEnding, $preSonants ) || in_array( $wordEnding, $preEzhZet )) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "дің";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "дың";
+ }
+ }
+ break;
+ case "dc2":
+ case "dative": #barıs
+ if ( in_array( $wordEnding, $preConsonants ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "ке";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "қа";
+ }
+ } elseif ( in_array( $wordEnding, $preVowels ) || in_array( $wordEnding, $preSonorants ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "ге";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "ға";
+ }
+ }
+ break;
+ case "dc21":
+ case "possessive dative": #täweldık + barıs
+ if ( in_array( $wordEnding, $firsts ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "е";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "а";
+ }
+ } elseif ( in_array( $wordEnding, $seconds ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "ге";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "ға";
+ }
+ } elseif ( in_array( $wordEnding, $thirds ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "не";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "на";
+ }
+ }
+ break;
+ case "dc3":
+ case "accusative": #tabıs
+ if ( in_array( $wordEnding, $preConsonants ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "Ñ‚Ñ–";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "Ñ‚Ñ‹";
+ }
+ } elseif ( in_array( $wordEnding, $preVowels ) ) {
+ if ( in_array($wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "ні";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "ны";
+ }
+ } elseif ( in_array( $wordEnding, $preSonorants) ) {
+ if ( in_array( $wordLastVowel, $frontVowels) ) {
+ $word = implode( "", $ar ) . "ді";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "ды";
+ }
+ }
+ break;
+ case "dc31":
+ case "possessive accusative": #täweldık + tabıs
+ if ( in_array( $wordEnding, $firsts ) || in_array( $wordEnding, $seconds ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "ді";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "ды";
+ }
+ } elseif ( in_array( $wordEnding, $thirds ) ) {
+ $word = implode( "", $ar ) . "н";
+ }
+ break;
+ case "dc4":
+ case "locative": #jatıs
+ if ( in_array( $wordEnding, $preConsonants ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "те";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "та";
+ }
+ } elseif ( in_array( $wordEnding, $preVowels ) || in_array( $wordEnding, $preSonorants ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels) ) {
+ $word = implode( "", $ar ) . "де";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "",$ar ) . "да";
+ }
+ }
+ break;
+ case "dc41":
+ case "possessive locative": #täweldık + jatıs
+ if ( in_array( $wordEnding, $firsts ) || in_array( $wordEnding, $seconds ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "де";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "да";
+ }
+ } elseif ( in_array( $wordEnding, $thirds ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels) ) {
+ $word = implode( "", $ar ) . "нде";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "",$ar ) . "нда";
+ }
+ }
+ break;
+ case "dc5":
+ case "ablative": #şığıs
+ if ( in_array( $wordEnding, $preConsonants ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "тен";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "тан";
+ }
+ } elseif ( in_array($wordEnding, $preVowels ) || in_array($wordEnding, $preSonants ) || in_array($wordEnding, $preEzhZet ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "ден";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "дан";
+ }
+ } elseif ( in_array($wordEnding, $preNasals ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "нен";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "нан";
+ }
+ }
+ break;
+ case "dc51":
+ case "possessive ablative": #täweldık + şığıs
+ if ( in_array( $wordEnding, $firsts ) || in_array( $wordEnding, $thirds ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "нен";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "нан";
+ }
+ } elseif ( in_array($wordEnding, $seconds ) ) {
+ if ( in_array( $wordLastVowel, $frontVowels ) ) {
+ $word = implode( "", $ar ) . "ден";
+ } elseif ( in_array( $wordLastVowel, $backVowels ) ) {
+ $word = implode( "", $ar ) . "дан";
+ }
+ }
+ break;
+ case "dc6":
+ case "comitative": #kömektes
+ if ( in_array( $wordEnding, $preConsonants ) ) {
+ $word = implode( "", $ar ) . "пен";
+ } elseif ( in_array( $wordEnding, $preVowels ) || in_array( $wordEnding, $preNasals ) || in_array( $wordEnding, $preSonants ) ) {
+ $word = implode( "", $ar ) . "мен";
+ } elseif ( in_array( $wordEnding, $preEzhZet ) ) {
+ $word = implode( "", $ar ) . "бен";
+ }
+ break;
+ case "dc61":
+ case "possessive comitative": #täweldık + kömektes
+ if ( in_array( $wordEnding, $preConsonants ) ) {
+ $word = implode( "", $ar ) . "пенен";
+ } elseif ( in_array( $wordEnding, $preVowels ) || in_array( $wordEnding, $preNasals ) || in_array( $wordEnding, $preSonants ) ) {
+ $word = implode( "", $ar ) . "менен";
+ } elseif ( in_array( $wordEnding, $preEzhZet ) ) {
+ $word = implode( "", $ar ) . "бенен";
+ }
+ break;
+ default: #dc0 #nominative #ataw
+ }
+ return $word;
+ }
+
+ /**
+ * Avoid grouping whole numbers between 0 to 9999
+ */
+ function commafy( $_ ) {
+ if ( !preg_match( '/^\d{1,4}$/', $_ ) ) {
+ return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev($_) ) );
+ } else {
+ return $_;
+ }
+ }
+}
+
+?>
diff --git a/languages/classes/LanguageKsh.php b/languages/classes/LanguageKsh.php
index 412a00f4..5b8c10d9 100644
--- a/languages/classes/LanguageKsh.php
+++ b/languages/classes/LanguageKsh.php
@@ -13,15 +13,16 @@ class LanguageKsh extends Language {
*/
public function commafy( $_ ) {
if ( !preg_match( '/^\d{1,4}$/', $_ ) ) {
- return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1&nbsp;', strrev( $_ ) ) );
+ return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
} else {
return $_;
}
}
+
/**
* Handle cases of (1, other, 0) or (1, other)
*/
- public function convertPlural( $count, $w1, $w2, $w3 ) {
+ public function convertPlural( $count, $w1, $w2, $w3, $w4, $w5 ) {
$count = str_replace (' ', '', $count);
if ( $count == '1' ) {
return $w1;
diff --git a/languages/classes/LanguageLt.php b/languages/classes/LanguageLt.php
index 53729006..14031feb 100644
--- a/languages/classes/LanguageLt.php
+++ b/languages/classes/LanguageLt.php
@@ -8,15 +8,15 @@
class LanguageLt extends Language {
/* Word forms (with examples):
- 1 - vienas (1) lapas
+ 1 - vienas (1) lapas, dvidešimt vienas (21) lapas
2 - trys (3) lapai
3 - penkiolika (15) lapų
- */
- function convertPlural( $count, $wordform1, $wordform2, $wordform3) {
- $count = str_replace (' ', '', $count);
+ */
+ function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) {
if ($count%10==1 && $count%100!=11) return $wordform1;
if ($count%10>=2 && ($count%100<10 || $count%100>=20)) return $wordform2;
- return $wordform3;
+ //if third form not specified, then use second form
+ return empty($wordform3)?$wordform2:$wordform3;
}
}
?>
diff --git a/languages/classes/LanguageLv.php b/languages/classes/LanguageLv.php
index 54cae487..c45d96e4 100644
--- a/languages/classes/LanguageLv.php
+++ b/languages/classes/LanguageLv.php
@@ -22,7 +22,7 @@ class LanguageLv extends Language {
* @param string $wordform3 (not used)
* @return string
*/
- function convertPlural( $count, $wordform1, $wordform2, $wordform3 ) {
+ function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5 ) {
return ( ( $count % 10 == 1 ) && ( $count % 100 != 11 ) ) ? $wordform1 : $wordform2;
}
diff --git a/languages/classes/LanguagePt_br.php b/languages/classes/LanguagePt_br.php
index 6132aaa2..06dc4d9c 100644
--- a/languages/classes/LanguagePt_br.php
+++ b/languages/classes/LanguagePt_br.php
@@ -10,7 +10,7 @@ class LanguagePt_br extends Language {
/**
* Use singular form for zero (see bug 7309)
*/
- function convertPlural( $count, $w1, $w2, $w3) {
+ function convertPlural( $count, $w1, $w2, $w3, $w4, $w5) {
return $count <= '1' ? $w1 : $w2;
}
}
diff --git a/languages/classes/LanguageRu.php b/languages/classes/LanguageRu.php
index b64a4144..a251aa52 100644
--- a/languages/classes/LanguageRu.php
+++ b/languages/classes/LanguageRu.php
@@ -57,7 +57,7 @@ class LanguageRu extends Language {
return $word;
}
- function convertPlural( $count, $wordform1, $wordform2, $wordform3) {
+ function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) {
$count = str_replace (' ', '', $count);
if ($count > 10 && floor(($count % 100) / 10) == 1) {
return $wordform3;
diff --git a/languages/classes/LanguageSk.php b/languages/classes/LanguageSk.php
index 2fa8df0f..5b71c6aa 100644
--- a/languages/classes/LanguageSk.php
+++ b/languages/classes/LanguageSk.php
@@ -76,8 +76,8 @@ class LanguageSk extends Language {
}
return $word;
}
-
- function convertPlural( $count, $w1, $w2, $w3) {
+
+ function convertPlural( $count, $w1, $w2, $w3, $w4, $w5) {
$count = str_replace ('.', '', $count);
$forms = array( $w1, $w2, $w3);
if ( $count == 1 ) {
diff --git a/languages/classes/LanguageSr.php b/languages/classes/LanguageSr.php
index 412463f8..59d31cab 100644
--- a/languages/classes/LanguageSr.php
+++ b/languages/classes/LanguageSr.php
@@ -53,12 +53,13 @@ class SrConverter extends LanguageConverter {
);
function loadDefaultTables() {
- $this->mTables = array();
- $this->mTables['sr-ec'] = $this->mToCyrillics;
- $this->mTables['sr-jc'] = $this->mToCyrillics;
- $this->mTables['sr-el'] = $this->mToLatin;
- $this->mTables['sr-jl'] = $this->mToLatin;
- $this->mTables['sr'] = array();
+ $this->mTables = array(
+ 'sr-ec' => new ReplacementArray( $this->mToCyrillics ),
+ 'sr-jc' => new ReplacementArray( $this->mToCyrillics),
+ 'sr-el' => new ReplacementArray( $this->mToLatin),
+ 'sr-jl' => new ReplacementArray( $this->mToLatin),
+ 'sr' => new ReplacementArray()
+ );
}
/* rules should be defined as -{ekavian | iyekavian-} -or-
@@ -67,40 +68,48 @@ class SrConverter extends LanguageConverter {
currently, and just produces a couple of bugs
*/
function parseManualRule($rule, $flags=array()) {
- // ignore all formatting
- foreach($this->mVariants as $v) {
- $carray[$v] = $rule;
- }
+ if(in_array('T',$flags)){
+ return parent::parseManualRule($rule, $flags);
+ }
+ // otherwise ignore all formatting
+ foreach($this->mVariants as $v) {
+ $carray[$v] = $rule;
+ }
+
return $carray;
}
- /*
- * Override function from LanguageConvertor
- * Additional checks:
- * - There should be no conversion for Talk pages
- */
- function getPreferredVariant(){
- global $wgTitle;
- if($wgTitle!=NULL && $wgTitle->isTalkPage()){
- return $this->mMainLanguageCode;
- }
- return parent::getPreferredVariant();
- }
+ // Do not convert content on talk pages
+ function parserConvert( $text, &$parser ){
+ if(is_object($parser->mTitle) && $parser->mTitle->isTalkPage())
+ $this->mDoContentConvert=false;
+ else
+ $this->mDoContentConvert=true;
+ return parent::parserConvert($text, $parser );
+ }
/*
- * A function wrapper, if there is no selected variant,
- * leave the link names as they were
+ * A function wrapper:
+ * - if there is no selected variant, leave the link
+ * names as they were
+ * - do not try to find variants for usernames
*/
function findVariantLink( &$link, &$nt ) {
+ // check for user namespace
+ if(is_object($nt)){
+ $ns = $nt->getNamespace();
+ if($ns==NS_USER || $ns==NS_USER_TALK)
+ return;
+ }
+
$oldlink=$link;
parent::findVariantLink($link,$nt);
if($this->getPreferredVariant()==$this->mMainLanguageCode)
$link=$oldlink;
}
-
/*
* We want our external link captions to be converted in variants,
* so we return the original text instead -{$text}-, except for URLs
@@ -117,7 +126,7 @@ class SrConverter extends LanguageConverter {
*/
function autoConvert($text, $toVariant=false) {
global $wgTitle;
- if($wgTitle->getNameSpace()==NS_IMAGE){
+ if(is_object($wgTitle) && $wgTitle->getNameSpace()==NS_IMAGE){
$imagename = $wgTitle->getNsText();
if(preg_match("/^$imagename:/",$text)) return $text;
}
@@ -139,7 +148,10 @@ class SrConverter extends LanguageConverter {
$matches = preg_split($reg, $text, -1, PREG_SPLIT_OFFSET_CAPTURE);
$m = array_shift($matches);
- $ret = strtr($m[0], $this->mTables[$toVariant]);
+ if( !isset( $this->mTables[$toVariant] ) ) {
+ throw new MWException( "Broken variant table: " . implode( ',', array_keys( $this->mTables ) ) );
+ }
+ $ret = $this->mTables[$toVariant]->replace( $m[0] );
$mstart = $m[1]+strlen($m[0]);
foreach($matches as $m) {
$ret .= substr($text, $mstart, $m[1]-$mstart);
@@ -150,7 +162,6 @@ class SrConverter extends LanguageConverter {
return $ret;
}
-
}
class LanguageSr extends LanguageSr_ec {
@@ -164,8 +175,8 @@ class LanguageSr extends LanguageSr_ec {
$variants = array('sr', 'sr-ec', 'sr-el');
$variantfallbacks = array(
'sr' => 'sr-ec',
- 'sr-ec' => 'sr-ec',
- 'sr-el' => 'sr-el',
+ 'sr-ec' => 'sr',
+ 'sr-el' => 'sr',
);
diff --git a/languages/classes/LanguageSr_ec.php b/languages/classes/LanguageSr_ec.php
index f84ebd06..72f56b8c 100644
--- a/languages/classes/LanguageSr_ec.php
+++ b/languages/classes/LanguageSr_ec.php
@@ -9,7 +9,7 @@
#--------------------------------------------------------------------------
class LanguageSr_ec extends Language {
- function convertPlural( $count, $wordform1, $wordform2, $wordform3) {
+ function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) {
$count = str_replace ('.', '', $count);
if ($count > 10 && floor(($count % 100) / 10) == 1) {
return $wordform3;
diff --git a/languages/classes/LanguageSr_el.php b/languages/classes/LanguageSr_el.php
index cba1b57e..1ecacc0e 100644
--- a/languages/classes/LanguageSr_el.php
+++ b/languages/classes/LanguageSr_el.php
@@ -9,7 +9,7 @@
#--------------------------------------------------------------------------
class LanguageSr_el extends Language {
- function convertPlural( $count, $wordform1, $wordform2, $wordform3) {
+ function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) {
$count = str_replace ('.', '', $count);
if ($count > 10 && floor(($count % 100) / 10) == 1) {
return $wordform3;
diff --git a/languages/classes/LanguageZh.php b/languages/classes/LanguageZh.php
index c34315ac..d4fbaf30 100644
--- a/languages/classes/LanguageZh.php
+++ b/languages/classes/LanguageZh.php
@@ -9,23 +9,25 @@ require_once( dirname(__FILE__).'/LanguageZh_cn.php' );
class ZhConverter extends LanguageConverter {
function loadDefaultTables() {
require( "includes/ZhConversion.php" );
- $this->mTables = array();
- $this->mTables['zh-cn'] = $zh2CN;
- $this->mTables['zh-tw'] = $zh2TW;
- $this->mTables['zh-sg'] = array_merge($zh2CN, $zh2SG);
- $this->mTables['zh-hk'] = array_merge($zh2TW, $zh2HK);
- $this->mTables['zh'] = array();
+ $this->mTables = array(
+ 'zh-cn' => new ReplacementArray( $zh2CN ),
+ 'zh-tw' => new ReplacementArray( $zh2TW ),
+ 'zh-sg' => new ReplacementArray( array_merge($zh2CN, $zh2SG) ),
+ 'zh-hk' => new ReplacementArray( array_merge($zh2TW, $zh2HK) ),
+ 'zh' => new ReplacementArray
+ );
}
function postLoadTables() {
- $this->mTables['zh-sg'] = array_merge($this->mTables['zh-cn'], $this->mTables['zh-sg']);
- $this->mTables['zh-hk'] = array_merge($this->mTables['zh-tw'], $this->mTables['zh-hk']);
+ $this->mTables['zh-sg']->merge( $this->mTables['zh-cn'] );
+ $this->mTables['zh-hk']->merge( $this->mTables['zh-tw'] );
}
/* there shouldn't be any latin text in Chinese conversion, so no need
- to mark anything
+ to mark anything.
+ $noParse is there for compatibility with LanguageConvert::markNoConversion
*/
- function markNoConversion($text) {
+ function markNoConversion($text, $noParse = false) {
return $text;
}
diff --git a/languages/messages/MessagesAf.php b/languages/messages/MessagesAf.php
index 56f88087..80efa4b7 100644
--- a/languages/messages/MessagesAf.php
+++ b/languages/messages/MessagesAf.php
@@ -248,10 +248,10 @@ om dit te bespreek.",
Om 'n nuwe bladsy te skep, tik in die invoerboks hier onder. Lees die [[{{ns:4}}:Help|hulp bladsy]]
vir meer inligting.
Indien jy per ongeluk hier is, gebruik jou blaaier se '''terug''' knop.",
-"anontalkpagetext" => "---- ''Dit is die besprekingsbladsy vir 'n anonieme gebruiker wat nie 'n rekening geskep het nie. Ons moet dus hul [[IP-adres]] gebruik om hulle te identifiseer. So 'n IP-adres kan deur verskeie gebruikers gedeel word. Indien jy 'n anonieme gebruiker is wat voel dat oneerbiedige komentaar aan jou gerig is, [[Special:Userlogin|skep 'n rekening of teken in]] om verwarring te voorkom met ander anonieme gebruikers.'' ",
+"anontalkpagetext" => "---- ''Dit is die besprekingsbladsy vir 'n anonieme gebruiker wat nie 'n rekening geskep het nie. Ons moet dus hul [[IP-adres]] gebruik om hulle te identifiseer. So 'n IP-adres kan deur verskeie gebruikers gedeel word. Indien jy 'n anonieme gebruiker is wat voel dat oneerbiedige komentaar aan jou gerig is, [[Special:Userlogin|skep 'n rekening of teken in]] om verwarring te voorkom met ander anonieme gebruikers.''",
"noarticletext" => "(Daar is tans geen inligting vir hierdie artikel nie.)",
"updated" => "(Gewysig)",
-"note" => "<strong>Nota:</strong> ",
+"note" => "<strong>Nota:</strong>",
"previewnote" => "Onthou dat dit slegs 'n voorskou is en nog nie gestoor is nie!",
"previewconflict" => "Hierdie voorskou reflekteer die teks in die boonste invoerboks soos dit sal lyk as jy dit stoor.",
"editing" => "Besig om $1 te wysig",
@@ -310,7 +310,7 @@ het om toegang te kry tot hierdie bladsy, reg is.",
Dit is miskien omdat jy gesoek het vir iets wat minder as drie letters bevat. Jy het miskien die navraag verkeerd ingetik.",
"matchtotals" => "Die navraag \"$1\" pas $2 artikeltitels
en teks in $3 artikels.",
-"noexactmatch" => "Geen bladsy met hierdie presiese titel bestaan nie, probeer 'n volteksnavraag. ",
+"noexactmatch" => "Geen bladsy met hierdie presiese titel bestaan nie, probeer 'n volteksnavraag.",
"titlematches" => "Artikeltitel resultate",
"notitlematches" => "Geen artikeltitel resultate nie",
"textmatches" => "Artikelteks resultate",
@@ -342,7 +342,7 @@ om voorkeure te spesifiseer.",
"math" => "Verbeeld wiskunde",
"math_failure" => "Kon nie verbeeld nie",
"math_unknown_error" => "onbekende fout",
-"math_unknown_function" => "onbekende funksie ",
+"math_unknown_function" => "onbekende funksie",
"math_lexing_error" => "leksikale fout",
"math_syntax_error" => "sintaksfout",
"saveprefs" => "Stoor voorkeure",
diff --git a/languages/messages/MessagesAr.php b/languages/messages/MessagesAr.php
index 476b6621..b8e7864e 100644
--- a/languages/messages/MessagesAr.php
+++ b/languages/messages/MessagesAr.php
@@ -434,6 +434,7 @@ $messages = array(
'oldpassword' => 'كلمة السر القديمة',
'orig' => 'الأصلي',
'otherlanguages' => ' لغات أخرى',
+'pagecategories' => 'تصنيÙات الصÙحة',
'pagemovedsub' => 'تم النقل بنجاح',
'pagemovedtext' => 'تم نقل الصÙحة "[[$1]]" إلى "[[$2]]".',
'passwordremindertitle' => 'تذكير بكلمة السر من {{SITENAME}}',
diff --git a/languages/messages/MessagesAz.php b/languages/messages/MessagesAz.php
index 7e0a505d..82eee6a4 100644
--- a/languages/messages/MessagesAz.php
+++ b/languages/messages/MessagesAz.php
@@ -78,6 +78,7 @@ $messages = array(
# Bits of text used by many pages: # Birçok sayfada geçen metinler
#
'categories' => 'Kateqoriyalar',
+'pagecategories' => 'Kateqoriyalar',
'category_header' => '"$1" kategoriyasındaki məqalələr',
'subcategories' => 'Alt kategoriyalar',
@@ -261,8 +262,8 @@ $messages = array(
'previewnote' => '<strong>Bu yalnız sınaq göstərişidir; dəyişikliklər hal-hazırda qeyd edilmemişdir!</strong>',
'editing' => 'RedaktÉ™ $1',
'editinguser' => 'RedaktÉ™ $1',
-'yourtext' => 'Metniniz ',
-'yourdiff' => 'Fərqlər ',
+'yourtext' => 'Metniniz',
+'yourdiff' => 'Fərqlər',
'templatesused' => 'Bu səhifədə istifadə edilmiş şablonlar:',
@@ -534,7 +535,7 @@ Hal-hazırda [http://meta.wikimedia.org/wiki/Help:Job_queue job queue] sayı: \'
'ipbreason' => 'Səbəb',
'ipbsubmit' => 'Bu istifadəçiyi əngəllə',
'badipaddress' => 'Yanlış IP',
-'blockipsuccesssub' => 'bloklandi ',
+'blockipsuccesssub' => 'bloklandi',
'blockipsuccesstext' => '[[{{ns:Special}}:Contributions/$1| $1]]bloklanıb. <br />See[[{{ns:Special}}:Ipblocklist|IP blok siyahisi]] bloklanmış IP lər.',
'ipblocklist' => 'ÆngÉ™llÉ™nmiÅŸ istifadəçilÉ™r siyahı',
'blocklink' => 'blokla',
@@ -583,7 +584,7 @@ Hal-hazırda [http://meta.wikimedia.org/wiki/Help:Job_queue job queue] sayı: \'
'listingcontinuesabbrev' => '(davam)',
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/*
+'monobook.js' => '/*
<pre>
*/
@@ -598,7 +599,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'İzləməyə aldığım məqalələr.\'
ta[\'pt-mycontris\'] = new Array(\'y\',\'Mən redakə etdiğim məqalələr siyahəsi\');
ta[\'pt-login\'] = new Array(\'o\',\'Hesab açmaniz tövsiə olur, ama icbar yoxdu .\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Hesab açib girişiniz tövsiyə olur, ama məndatlı dəyil.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Çixiş\');
+ta[\'pt-logout\'] = new Array(\'\',\'Çixiş\');
ta[\'ca-talk\'] = new Array(\'t\',\'Məqalə həqqində müzakirə edib, nəzərivi bildir\');
ta[\'ca-edit\'] = new Array(\'e\',\'Bu səhifani redaktə edə bilərsiz. Lütfən avvəl sinaq gostəriş edin.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Bu müzakirə səhifəsində iştirak edin.\');
diff --git a/languages/messages/MessagesBe.php b/languages/messages/MessagesBe.php
index 6087e139..b3a141b3 100644
--- a/languages/messages/MessagesBe.php
+++ b/languages/messages/MessagesBe.php
@@ -203,7 +203,7 @@ $messages = array(
'already_bureaucrat' => 'ГÑÑ‚Ñ‹ ўдзельнік ужо зьÑўлÑецца бюракратам',
'already_sysop' => 'ГÑÑ‚Ñ‹ ўдзельнік ужо зьÑўлÑецца адмініÑтратарам',
'alreadyloggedin' => "<strong>Удзельнік $1, Вы ўжо ўвайшлі!</strong><br />",
-'alreadyrolled' => 'Ðемагчыма ÑкаÑаваць апошнюю зьмену [[$1]], Ñкую зрабіў [[User:$2|$2]] ([[User talk:$2|гутаркі]]); нехта іншы ўжо зьмÑніў артыкул ці ÑкаÑаваў зьмены.
+'alreadyrolled' => 'Ðемагчыма ÑкаÑаваць апошнюю зьмену [[:$1]], Ñкую зрабіў [[User:$2|$2]] ([[User talk:$2|гутаркі]]); нехта іншы ўжо зьмÑніў артыкул ці ÑкаÑаваў зьмены.
ÐÐ¿Ð¾ÑˆÐ½Ñ–Ñ Ð·ÑŒÐ¼ÐµÐ½Ñ‹ Ð·Ñ€Ð¾Ð±Ð»ÐµÐ½Ñ‹Ñ [[User:$3|$3]] ([[User talk:$3|гутаркі]]).',
'ancientpages' => 'ÐайÑтарÑÐ¹ÑˆÑ‹Ñ Ñтаронкі',
@@ -274,7 +274,7 @@ $messages = array(
'cannotdelete' => 'Ðемагчыма выдаліць указаную Ñтаронку альбо выÑву. (Магчыма, Ñна ўжо Ð²Ñ‹Ð´Ð°Ð»ÐµÐ½Ð°Ñ ÐºÑ–Ð¼Ñьці іншым.)',
'cantcreateaccounttitle' => 'Ðемагчыма Ñтварыць рахунак',
'cantrollback' => 'Ðемагчыма ÑкаÑаваць зьмену; апошні Ñ€Ñдактар — адзіны аўтар гÑтай Ñтаронкі.',
-'categories' => '{{PLURAL:$1|КатÑгорыÑ|КатÑгорыі|КатÑгорыі}}',
+'categories' => 'КатÑгорыі',
'categoriespagetext' => 'У {{GRAMMAR:меÑны|{{SITENAME}}}} Ñ–Ñнуюць наÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ ÐºÐ°Ñ‚Ñгорыі:',
'category_header' => 'Ðртыкулы Ñž катÑгорыі «$1»',
'categoryarticlecount' => 'У гÑтай катÑгорыі Ñ‘Ñьць $1 {{PLURAL:$1|артыкул|артыкулы|артыкулаў}}.',
@@ -597,6 +597,7 @@ $messages = array(
'orig' => 'арыг',
'otherlanguages' => 'Ðа іншых мовах',
'others' => 'іншыÑ',
+'pagecategories' => '{{PLURAL:$1|КатÑгорыÑ|КатÑгорыі|КатÑгорыі}}',
'pagemovedtext' => 'Старонка «[[$1]]» перанеÑÐµÐ½Ð°Ñ Ñž «[[$2]]».',
'pagetitle' => '$1 - {{SITENAME}}',
'perfcached' => 'ÐаÑÑ‚ÑƒÐ¿Ð½Ñ‹Ñ Ð·ÑŒÐ²ÐµÑткі кÑÑˆÐ°Ð²Ð°Ð½Ñ‹Ñ Ñ– могуць быць ÑаÑтарÑлымі.',
diff --git a/languages/messages/MessagesBg.php b/languages/messages/MessagesBg.php
index b46bdccc..2b114851 100644
--- a/languages/messages/MessagesBg.php
+++ b/languages/messages/MessagesBg.php
@@ -165,6 +165,7 @@ $messages = array(
# Bits of text used by many pages:
#
'categories' => 'Категории',
+'pagecategories' => 'Категории',
'category_header' => 'Страници в ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ â€ž$1“',
'subcategories' => 'Подкатегории',
'linkprefix' => '/^(.*?)([a-zA-Z\x80-\xff]+)$/sD',
@@ -929,7 +930,7 @@ $2 Показване на пренаÑÐ¾Ñ‡Ð²Ð°Ð½Ð¸Ñ &nbsp; ТърÑене на
'rollbacklink' => 'връщане', #rollback
'rollbackfailed' => 'Връщането не Ñполучи', #Rollback failed
'cantrollback' => 'ПромÑната не може да Ñе извърши. ПоÑледниÑÑ‚ автор е единÑтвениÑÑ‚ ÑобÑтвеник на Ñтраницата.',
-'alreadyrolled' => 'РедакциÑта на [[$1]], направена от [[Потребител:$2|$2]] ([[Потребител беÑеда:$2|БеÑеда]]), не може да Ñе върне назад. ÐÑкой друг вече е редактирал Ñтраницата или е върнал назад промените.
+'alreadyrolled' => 'РедакциÑта на [[:$1]], направена от [[Потребител:$2|$2]] ([[Потребител беÑеда:$2|БеÑеда]]), не може да Ñе върне назад. ÐÑкой друг вече е редактирал Ñтраницата или е върнал назад промените.
ПоÑледната Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ðµ на [[Потребител:$3|$3]] ([[Потребител беÑеда:$3|БеÑеда]]).',
# only shown if there is an edit comment
@@ -1175,13 +1176,13 @@ $2 Показване на пренаÑÐ¾Ñ‡Ð²Ð°Ð½Ð¸Ñ &nbsp; ТърÑене на
'tooltip-minoredit' => 'ОтбелÑзване на промÑната като малка [alt-i]',
'tooltip-save' => 'СъхранÑване на промените [alt-s]',
'tooltip-preview' => 'Предварителен преглед, молÑ, използвайте го преди да Ñъхраните! [alt-p]',
-'tooltip-diff' => 'Показване на направените от Ð’Ð°Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ð¸ по текÑта [alt-d]',
+'tooltip-diff' => 'Показване на направените от Ð’Ð°Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ð¸ по текÑта [alt-v]',
'tooltip-compareselectedversions' => 'Показване на разликите между двете избрани верÑии на Ñтраницата [alt-v]',
'tooltip-watch' => 'ДобавÑне на Ñтраницата към ÑпиÑъка Ви за наблюдение [alt-w]',
# stylesheets
-'Monobook.css' => '/* чрез редактиране на този файл можете да промените облика Monobook */',
-#'Monobook.js' => '/* чрез редактиране на този файл можете да добавÑте функции на Javascript за облика Monobook */',
+'monobook.css' => '/* чрез редактиране на този файл можете да промените облика Monobook */',
+#'monobook.js' => '/* чрез редактиране на този файл можете да добавÑте функции на Javascript за облика Monobook */',
# TODO: превод
# Metadata
@@ -1234,7 +1235,7 @@ $2 Показване на пренаÑÐ¾Ñ‡Ð²Ð°Ð½Ð¸Ñ &nbsp; ТърÑене на
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '
+'monobook.js' => '
/* чрез редактиране на този файл можете да промените нÑкои неща на Javascript за облика Monobook */
/* tooltips and access keys */
var ta = new Object();
@@ -1247,7 +1248,7 @@ $2 Показване на пренаÑÐ¾Ñ‡Ð²Ð°Ð½Ð¸Ñ &nbsp; ТърÑене на
ta[\'pt-mycontris\'] = new Array(\'y\',\'СпиÑък на Вашите приноÑи\');
ta[\'pt-login\'] = new Array(\'o\',\'Ð’ момента не Ñте влезли. ÐаÑърчаваме Ви да влезете, въпреки че не е задължително.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'ÐаÑърчаваме Ви да влезете, въпреки че не е задължително.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Излизане от {{SITENAME}}\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Излизане от {{SITENAME}}\');
ta[\'ca-talk\'] = new Array(\'t\',\'БеÑеда отноÑно Ñтраницата\');
ta[\'ca-edit\'] = new Array(\'e\',\'Можете да редактирате Ñтраницата. МолÑ, използвайте бутона за предварителен преглед преди да Ñъхраните.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'ДобавÑне на коментар към Ñтраницата\');
@@ -1370,7 +1371,6 @@ $1
: \'\'$2\'\'
МолÑ, потвърдете, че наиÑтина желаете да Ñъздадете Ñтраницата отново.',
'recreate' => 'Ðово Ñъздаване',
-'tooltip-recreate' => '',
'unit-pixel' => 'px',
);
diff --git a/languages/messages/MessagesBpy.php b/languages/messages/MessagesBpy.php
index 37593649..7fb73a62 100644
--- a/languages/messages/MessagesBpy.php
+++ b/languages/messages/MessagesBpy.php
@@ -1,11 +1,299 @@
<?php
-/**
- * Bishnupriya
- * most speakers have Bengali as second language, use as default fallback
+/** Bishnupriya Manipuri (বিষà§à¦£à§à¦ªà§à¦°à¦¿à¦¯à¦¼à¦¾ মণিপà§à¦°à§€)
*
* @package MediaWiki
* @subpackage Language
+ * @Author Uttam Singha, Dec 2006
*/
+$rtl = false;
+$namespaceNames = array(
+ NS_MEDIA => 'মিডিয়া',
+ NS_SPECIAL => 'বিশেষ',
+ NS_MAIN => '',
+ NS_TALK => 'য়à§à¦¯à¦¾à¦°à§€',
+ NS_USER => 'আতাকà§à¦°à¦¾',
+ NS_USER_TALK => 'আতাকà§à¦°à¦¾à¦°_য়à§à¦¯à¦¾à¦°à§€',
+ # NS_PROJECT set by $wgMetaNamespace
+ NS_PROJECT_TALK => '$1_য়à§à¦¯à¦¾à¦°à§€',
+ NS_IMAGE => 'ছবি',
+ NS_IMAGE_TALK => 'ছবি_য়à§à¦¯à¦¾à¦°à§€',
+ NS_MEDIAWIKI => 'মিডিয়াউইকি',
+ NS_MEDIAWIKI_TALK => 'মিডিয়াউইকির_য়à§à¦¯à¦¾à¦°à§€',
+ NS_TEMPLATE => 'মডেল',
+ NS_TEMPLATE_TALK => 'মডেলর_য়à§à¦¯à¦¾à¦°à§€',
+ NS_HELP => 'পাংলাক',
+ NS_HELP_TALK => 'পাংলাকর_য়à§à¦¯à¦¾à¦°à§€',
+ NS_CATEGORY => 'থাক',
+ NS_CATEGORY_TALK => 'থাকর_য়à§à¦¯à¦¾à¦°à§€',
+);
+
+$messages = array(
+# Dates
+
+'sunday' => 'লামà§à¦‡à¦¸à¦¿à¦‚',
+'monday' => 'নিংথৌকাপা',
+'tuesday' => 'লেইপাকপা',
+'wednesday' => 'ইনসাইনসা',
+'thursday' => 'সাকলসেন',
+'friday' => 'ইরেই',
+'saturday' => 'থাংচা',
+'january' => 'জানà§à¦¯à¦¼à¦¾à¦°à§€',
+'february' => 'ফেবà§à¦°à§à¦¯à¦¼à¦¾à¦°à§€',
+'march' => 'মারà§à¦š',
+'april' => 'à¦à¦ªà§à¦°à¦¿à¦²',
+'may_long' => 'মে',
+'june' => 'জà§à¦¨',
+'july' => 'জà§à¦²à¦¾à¦‡',
+'august' => 'আগসà§à¦Ÿ',
+'september' => 'সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°',
+'october' => 'অকà§à¦Ÿà§‹à¦¬à¦°',
+'november' => 'নভেমà§à¦¬à¦°',
+'december' => 'ডিসেমà§à¦¬à¦°',
+'jan' => 'জানà§',
+'feb' => 'ফেবà§à¦°à§',
+'mar' => 'মারà§à¦š',
+'apr' => 'à¦à¦ªà§à¦°à¦¿à¦²',
+'may' => 'মে',
+'jun' => 'জà§à¦¨',
+'jul' => 'জà§à¦²à¦¾à¦‡',
+'aug' => 'আগসà§à¦Ÿ',
+'sep' => 'সেপà§à¦Ÿà§‡',
+'oct' => 'অকà§à¦Ÿà§‹',
+'nov' => 'নভে',
+'dec' => 'ডিসে',
+
+# Bits of text used by many pages:
+#
+
+'about' => 'বারে',
+'aboutpage' => '{{ns:project}}:বারে',
+'aboutsite' => '{{SITENAME}}র বারে',
+'accmailtext' => '"$1"-র খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿(password) $2-রাঙ দিয়াপেঠৱাদেনা ইল।',
+'accmailtitle' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿(password) দিয়াপেঠৱা দিলাং।',
+'accountcreated' => 'à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦¹à¦¾à¦¨ হঙকরানি ইল',
+'accountcreatedtext' => 'আতাকà§à¦°à¦¾ $1 -র কা à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦¹à¦¾à¦¨ হঙকরানি ইল।',
+'acct_creation_throttle_hit' => 'ঙাকà§à¦•à¦°à§‡à¦¦à¦¿à¦¬à¦¾à¦‚, তি à¦à¦¬à¦¾à¦•à¦¾à¦ªà§‡à¦¯à¦¼à¦¾ $1হান অà§à¦¯à¦¾à¦•à¦¾à¦‰à¦¨à§à¦Ÿ হংকরেবেলাসত৷ অতাতà§à¦¤ বপ হঙকরানির য়à§à¦¯à¦¾à¦¥à¦¾à¦‚ নেই।৷',
+'actioncomplete' => 'কামহান লমিল।',
+'addedwatch' => 'তালাবির তালিকাহাত থনা ইল',
+'addedwatchtext' => '"$1" পাতা à¦à¦¹à¦¾à¦¨ তর [[Special:Watchlist|আহির-আরà§à¦® তালিকা]]-ত তিলকরানি ইল। পিসেদে à¦à¦°à§‡ পাতা à¦à¦¹à¦¾à¦¨ বারো পাতা à¦à¦¹à¦¾à¦¨à¦° লগে সাকেই আসে য়à§à¦¯à¦¾à¦°à§€ পাতাত অইতই হারি জাতর পতানি à¦à¦¹à¦¾à¦¨à¦¾à¦¤ তিলকরানি অইতই। অতাবাদেউ [[Special:Recentchanges|হাদি à¦à¦¹à¦¾à¦¨à¦° পতানিহানি]]-ত পাতা à¦à¦¹à¦¾à¦¨à¦°à§‡ \'\'\'গাঢ়করা\'\'\' মেয়েকে দেহা দেনা অইতই যাতে তি নà§à¦™à¦¿à¦•à¦°à§‡ পাতা à¦à¦¹à¦¾à¦¨ চিনে পারবেতা। <p>পিসেদে তি পাতা à¦à¦¹à¦¾à¦¨à¦°à§‡ থেইকরানি মনেইলে "আহির-আরà§à¦®à§‡à¦¤à§à¦¤ থেইকরেদে" টà§à¦¯à¦¾à¦¬à¦—ত কà§à¦²à¦¿à¦• করিস৷',
+'allarticles' => 'নিবনà§à¦§à¦¹à¦¾à¦¬à¦¿',
+'allinnamespace' => 'পাতাহানি হাবি ($1 নাঙরজাগা)',
+'allmessages' => 'সিসà§à¦Ÿà§‡à¦®à¦° পৌহানি',
+'allmessagescurrent' => 'হাদি à¦à¦¹à¦¾à¦¨à¦° ৱাহি',
+'allmessagesmodified' => 'পতাসি অতা হà§à¦¦à§à¦¦à¦¾ দেহাদে',
+'allmessagesname' => 'নাং',
+'allmessagestext' => 'তলে মিডিয়াউইকি: নাঙরজাগাত পানা à¦à¦•à¦°à§‡à¦° সিসà§à¦Ÿà§‡à¦® পৌহানির তালিকাহান দেনা ইল।',
+'allowemail' => 'আরতা(বà§à¦¯à¦¬à¦¹à¦¾à¦° করেকà§à¦°à¦¾)ই ইমেইল করানির য়à§à¦¯à¦¾à¦¥à¦¾à¦‚ দে।',
+'allpages' => 'হাবি পাতাহানি',
+'allpagesbadtitle' => 'The given page title was invalid or had an inter-language or inter-wiki prefix. It may contain one more characters which cannot be used in titles.',
+'allpagesfrom' => 'যেহাতà§à¦¤ অকরিসি অহাতà§à¦¤ পাতাহানি দেহাদেঃ',
+'allpagesnext' => 'থাঙনাত',
+'allpagesprefix' => 'মেয়েক à¦à¦—ন অকরিসি ৱাহির পাতাহানি দেহাদেঃ',
+'allpagesprev' => 'আলথকে',
+'allpagessubmit' => 'হাত',
+'alphaindexline' => '$1 ত $2',
+'already_bureaucrat' => 'আতাকà§à¦°à¦¾ à¦à¦— à¦à¦šà§à¦¦à¦¿à¦¨à§‡ বà§à¦¯à§à¦°à§‹à¦•à§à¦°à§à¦¯à¦¾à¦Ÿà¦— ইয়াপরিলগাহে',
+'already_sysop' => 'আতাকà§à¦°à¦¾ à¦à¦— à¦à¦šà§à¦¦à¦¿à¦¨à§‡ ডানà§à¦¡à¦¿(পà§à¦°à¦¶à¦¾à¦¸à¦•)গ ইয়াপরিলগাহে',
+'alreadyloggedin' => '<strong>আতাকà§à¦°à¦¾ $1, তি আগেতà§à¦¤à¦° ভিতরে হমিয়া আসতগহে!</strong><br />',
+'alreadyrolled' => 'Cannot rollback last edit of [[$1]]
+by [[User:$2|$2]] ([[User talk:$2|Talk]]); someone else has edited or rolled back the page already.
+
+Last edit was by [[User:$3|$3]] ([[User talk:$3|Talk]]).',
+'ancientpages' => 'পà§à¦°à¦¾à¦¨à¦¾ পাতাহানি',
+'and' => 'বারো',
+'anoneditwarning' => '\'\'\'সিঙà§à¦‡à¦¸à¦ƒ\'\'\' তি লগইন নাকরিসত। পতানির ইতিহাসহাত তর IP addressহান সিজিল ইতই।',
+'anontalk' => 'অচিনা à¦à¦—র য়à§à¦¯à¦¾à¦°à¦¿à¦° পাতা',
+'anontalkpagetext' => '<div id="anontalktext"><hr style="clear: both; margin-top:8px" /> \'\'à¦à¦¹à¦¾à¦¨ অচিনা অতার য়à§à¦¯à¦¾à¦°à¦¿à¦° পাতাহান। à¦à¦°à§‡ আইপি ঠিকানা (IP Address) à¦à¦¹à¦¾à¦¨à¦¾à¦¤à§à¦¤ লগ-ইন নাকরিয়া পতানিত মেইকà§à¦·à§ অসিল। আকà§à¦•à§à¦¸ কà§à¦·à§‡à¦¨à§à¦¤à¦¾à¦®à§‡ আইপি ঠিকানা হামেসা বদল অর, বিশেষ করিয়া ডায়াল-আপ ইনà§à¦Ÿà¦¾à¦°à¦¨à§‡à¦Ÿ, পà§à¦°à¦•à§à¦¸à¦¿ সারà§à¦­à¦¾à¦° মাহি কà§à¦·à§‡à¦¤à§à¦° à¦à¦¤à¦¾ সিলরতা, বারো আগতà§à¦¤ বপ বà§à¦¯à¦¬à¦¹à¦¾à¦°à¦•à¦¾à¦°à§‡à¦•à§à¦°à¦¾à¦° কà§à¦·à§‡à¦¤à§à¦°à¦¤ পà§à¦°à¦¯à§‹à¦œà§à¦¯ ইতে পারে। অহানে তি নিশà§à¦šà¦•à§‡ à¦à¦°à§‡ আইপি à¦à¦¹à¦¾à¦¤à§à¦¤ উইকিপিডিয়াত হমিয়া কোন য়à§à¦¯à¦¾à¦°à§€ দেখর, অহান তরে নিঙকরিয়া নাউ ইতে পারে। অহানে হাবিতà§à¦¤ হবা অর, তি যদি [[{{ns:Special}}:Userlogin|লগ-ইন করর, বা নৱা à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿ খà§à¦²à¦°]] অহানবà§à¦²à¦¤à§‡à¦‰ লগ-ইন করলে কà§à¦™à¦—উ তর আইপি ঠিকানাহান, বারো অহানর মাতà§à¦™à§‡ তর অবসà§à¦¥à¦¾à¦¨à¦¹à¦¾à¦¨ সà§à¦ªà¦•à¦°à§‡à¦‰ হার না পেইবা।\'\'<br /> [<small><span class="plainlinks">[http://www.dnsstuff.com/tools/ipall.ch?domain={{PAGENAMEE}} আইপি ঠিকানাহার পৌ] &middot; [http://www.dnsstuff.com/tools/tracert.ch?ip={{PAGENAMEE}} টà§à¦°à§‡à¦¸à¦°à¦¾à¦‰à¦Ÿ] &middot; [http://www.dnsstuff.com/tools/whois.ch?ip={{PAGENAMEE}} WHOIS] &middot; [http://www.dnsstuff.com/tools/whois.ch?server=whois.abuse.net&ip={{PAGENAMEE}} ৱাকাত] &middot; [http://www.dnsstuff.com/tools/city.ch?ip={{PAGENAMEE}} শহর] &middot; [http://www.dnsstuff.com/tools/ptr.ch?ip={{PAGENAMEE}} উলà§à¦Ÿà¦¾ ডিà¦à¦¨à¦à¦¸]</span></small>] [<small>\'\'\'আঞà§à¦šà¦²à¦¿à¦• ইনà§à¦Ÿà¦¾à¦°à¦¨à§‡à¦Ÿ নিবনà§à¦§à¦¨à¦° তালিকা\'\'\': <span class="plainlinks">[http://ws.arin.net/whois/?queryinput={{PAGENAMEE}} আমেরিকা] &middot; [http://www.ripe.net/fcgi-bin/whois?searchtext={{PAGENAMEE}} ইউরোপ] &middot; [http://www.afrinic.net/cgi-bin/whois?query={{PAGENAMEE}} আফà§à¦°à¦¿à¦•à¦¾] &middot; [http://www.apnic.net/apnic-bin/whois.pl?searchtext={{PAGENAMEE}} à¦à¦¶à¦¿à¦¯à¦¼à¦¾-পà§à¦¯à¦¾à¦¸à¦¿à¦«à¦¿à¦•] &middot; [http://www.lacnic.net/cgi-bin/lacnic/whois?lg=EN&query={{PAGENAMEE}} লাতিন আমেরিকা ও কà§à¦¯à¦¾à¦°à¦¿à¦¬à¦¿à¦¯à¦¼ à¦à¦²à¦¾à¦•à¦¾]</span></small>] </div>',
+'anonymous' => '{{SITENAME}}র বেনাঙর আতাকà§à¦°à¦¾(গি)',
+'articleexists' => 'ইতে পারে à¦à¦°à§‡ শিরোনাঙর নিবনà§à¦§à¦¹à¦¾à¦¨ হঙপরসেগা, নাইলে তি দিয়াসত শিরোনাং à¦à¦¹à¦¾à¦¨ দেনার য়à§à¦¯à¦¾à¦¥à¦¾à¦‚ নেই। কৃপা করিয়া আরাক শিরোনাং আহান দেনার হৎনা কর।',
+'articlepage' => 'নিবনà§à¦§ চেইক',
+'articletitles' => 'যে পাতাহানি \'\'$1\'\' ন অকরাগ, অতার তালিকা',
+'autoredircomment' => '[[$1]]-ত যানার বারো-রà§à¦¨à¦¿à¦¦à§‡à¦¶ করানি ইল',
+'badaccess' => 'য়à§à¦¯à¦¾à¦¥à¦¾à¦™à§‡ লালসে',
+'badarticleerror' => 'à¦à¦°à§‡ পাতা à¦à¦¹à¦¾à¦¨ কাম à¦à¦¹à¦¾à¦¨ করানি সমà§à¦­à¦¬ নেই।',
+'badfilename' => 'ফাইলগর নাঙহান পতিয়া $1" করানি ইল।',
+'badipaddress' => 'আইপি ঠিকানাহান গà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯à¦¨à¦¾à¦‡à¦¸à§‡',
+'badretype' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿ (password) দà§à¦¬à¦¿à¦¯à¦¼à¦—ি না মিলের।',
+'badtitle' => 'শিরোনাঙহান গà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ নাইসে।',
+'badtitletext' => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title. It may contain one more characters which cannot be used in titles.',
+'blanknamespace' => '(গà§à¦°à¦¿)',
+'blockedtext' => 'তর আতাকà§à¦°à¦¾ নাঙহান নাইলেউ আইপি ঠিকানাহানরে $1 থেপকরানি অসে। à¦à¦¹à¦¾à¦¨à¦° কারণহান অসেতাইঃ:<br />\'\'$2\'\'<p>তি $1 নাইলেউ [[Project:পà§à¦°à¦¶à¦¾à¦¸à¦•à¦²à¦•à§‡à¦‡|পà§à¦°à¦¶à¦¾à¦¸à¦•à¦°]] মা যে কোন আগর লগে বিষয় à¦à¦¹à¦¾à¦¨à§à¦¨ য়à§à¦¯à¦¾à¦°à¦¿ পরি দে পারর। বিশেষ মাতিলতাঃ তর ই-মেইল ঠিকানাহান যদি [[Special:Preferences|তর পছন তালিকাত]] বরিয়া নাথার, অতা ইলে তি উইকিপিডিয়াত হের আতাকà§à¦°à¦¾à¦°à§‡ ই-মেইল করানি নà§à§±à¦¾à¦°à¦¬à§‡à¥¤ তর আইপি ঠিকানাহান ইলতাই $3। কৃপা করিয়া যে কোন যোগাযোগর সময়ত à¦à¦°à§‡ ঠিকানা à¦à¦¹à¦¾à¦¨ যেসাদেউ বরিস।',
+'blockedtitle' => 'আতাকà§à¦°à¦¾à¦—রে থেপ করানি অসে',
+'blockip' => 'আতাকà§à¦°à¦¾à¦—রে থেপকর',
+'blockipsuccesssub' => 'থেপকরানিহান চà§à¦®à¦¿à¦²',
+'blockipsuccesstext' => '[[{{ns:Special}}:Contributions/$1|$1]] রে থেপকরিয়া থসি <br />থেপকরানিহান খাল করানি থকিলে,[[{{ns:Special}}:Ipblocklist| থেপকরিয়া থসি আইপি ঠিকানার তালিকাহান]] চা।',
+'blocklink' => 'থেপ কর',
+'blocklistline' => '$1 তারিখে $2, $3 ($4) রে থেপকরানি অসে।',
+'blocklogentry' => '"[[$1]]"-রে $2 মেয়াদর কা থেপকরানি অসে।',
+'blocklogpage' => 'থেপকরানির log',
+'bold_sample' => 'গাঢ়পা ৱাহি',
+'bold_tip' => 'গাঢ়পা ৱাহি',
+'booksources' => 'লেরিকর উৎসহান',
+'boteditletter' => 'ব',
+'brokenredirects' => 'বারো-নিরà§à¦¦à§‡à¦¶ কামনাকরের',
+'bugreports' => 'লাল বিবরণী',
+'bugreportspage' => '{{ns:project}}:লাল_বিবরণী',
+'bydate' => 'তারিখর সিজিলন',
+'byname' => 'নাঙর সিজিলন',
+'bysize' => 'আকারহানর সিজিলন',
+'cachederror' => 'à¦à¦°à§‡ পাতা à¦à¦¹à¦¾à¦¨ বা লাতলগ পà§à¦›à¦¾à¦¨à¦¿ নাকরল। (নিঙকরà§à¦°à¦¿à¦¤à¦¾à¦ƒ আগেদে কà§à¦™à¦— আগই পà§à¦›à§‡ বেলাসিসাত)',
+'cancel' => 'বাতিল করেদে',
+'cantrollback' => 'আগেকার সঙসà§à¦•à¦°à¦¨à¦¹à¦¾à¦¤ আলথকে যানা নà§à§±à¦¾à¦°à¦²à§, লমিলগা সমà§à¦ªà¦¦à¦¨à¦¾à¦•à¦°à§‡à¦•à§à¦°à¦¾ অগ পাতা অহানর আকখà§à¦²à¦¾ লেখকগ।',
+'captcha-createaccount' => 'সà§à¦¬à¦¯à¦¼à¦‚কà§à¦°à¦¿à¦¯à¦¼ সà§à¦ªà§à¦¯à¦¾à¦®à¦° বিরà§à¦¦à§à¦§à§‡ সà§à¦°à¦•à§à¦·à¦¾à¦° কা তরতা à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿ খোলানির আগে তলর ছবিগর ভিতরর ৱাহিহানরে টাইপ করানি থকিতই: <br />([[Special:Captcha/help|à¦à¦¹à¦¾à¦¨ কিহান?]])',
+'categories' => 'বিষয়রথাকহানি',
+'categoriespagetext' => 'ইমারঠারর উইকিপিডিয়াত à¦à¦¬à¦¾à¦•à¦¾à¦° বিষয়রথাক:',
+'category_header' => '"$1" বিষয়রথাকে আসে নিবনà§à¦§à¦¹à¦¾à¦¨à¦¿',
+'categoryarticlecount' => 'à¦à¦°à§‡ বিষয়রথাকে $1হান নিবনà§à¦§ আসে।',
+'categorypage' => 'বিষয়থাকর পাতাহানি চা',
+'categorytree-category' => 'বিষয়রথাক',
+'changed' => 'পতেসে',
+'changepassword' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿(password) পতা',
+'changes' => 'পতানিহানি',
+'cite' => 'উদà§à¦§à§ƒà¦¤ করেদে',
+'cite_article_link' => 'নিবনà§à¦§ à¦à¦¹à¦¾à¦¨à¦°à§‡ উদà§à¦§à§ƒà¦¤ করেদে',
+'clearyourcache' => '\'\'\'খিয়াল থ:\'\'\' তর পছনহানি রকà§à¦·à¦¾ করানির থাঙনাত পতাহানি চানার কা তর বà§à¦°à¦¾à¦‰à¦œà¦¾à¦°à¦° কà§à¦¯à¦¾à¦¶ লালà§à¦¯à¦¼à¦¾ যানা লাগতে পারে। \'\'\'মোজিলা/ফায়ারফকà§à¦¸/সাফারি:\'\'\' শিফট কী চিপিয়া থয়া রিলোড-ঠকà§à¦²à¦¿à¦• কর, নাইলে \'\'কনà§à¦Ÿà§à¦°à§‹à¦²-শিফট-R\'\'(à¦à¦ªà¦² মà§à¦¯à¦¾à¦•-ঠ\'\'কমানà§à¦¡-শিফট-R\'\') আকপাকে চিপা; \'\'\'ইনà§à¦Ÿà¦¾à¦°à¦¨à§‡à¦Ÿ à¦à¦•à§à¦¸à¦ªà§à¦²à§‹à¦°à¦¾à¦°:\'\'\' \'\'কনà§à¦Ÿà§à¦°à§‹à¦²\'\' চিপিয়া থয়া রিফà§à¦°à§‡à¦¶-ঠকà§à¦²à¦¿à¦• কর, নাইলে \'\'কনà§à¦Ÿà§à¦°à§‹à¦²-F5\'\' চিপা; \'\'\'কংকারার:\'\'\' হà§à¦¦à§à¦¦à¦¾ রিলোড কà§à¦²à¦¿à¦• করলে বা F5 চিপিলে চলতই; \'\'\'অপেরা\'\'\' আতাকà§à¦°à¦¾à¦‡ \'\'Tools&rarr;Preferences\'\'-ঠগিয়া কাশ সমà§à¦ªà§‚রà§à¦£ ঙকà§à¦·à¦¿ করানি লাগতে পারে।',
+'columns' => 'দà§à¦°à¦—িঃ',
+'compareselectedversions' => 'বাসাইল সংসà§à¦•à¦°à¦£à¦¹à¦¾à¦¨à¦¿ তà§à¦²à¦¨à¦¾ কর',
+'confirm' => 'লেপকরানি',
+'confirm_purge' => 'পাতা à¦à¦¹à¦¾à¦¨à¦° কà§à¦¯à¦¾à¦¶à¦¹à¦¾à¦¨ ঙকà§à¦·à¦¿ করানি মনারতা?
+
+$1',
+'confirm_purge_button' => 'চà§à¦®à¦¿à¦¸à§‡',
+'confirmdelete' => 'পà§à¦¸à¦¾à¦¨à¦¿à¦¹à¦¾à¦¨ লেপকর',
+'confirmedittext' => 'যেহানউ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করানির আগে তর ই-মেইল ঠিকানাহন যেসাদেউ লেপকরানি লাগতই। কৃপাকরিয়া তর ই-মেইল ঠিকানাহান [[special:Preferences|আতাকà§à¦°à¦¾à¦° পছনতালিকা]]ত চà§à¦®à¦•à¦°à§‡ বরা।',
+'confirmedittitle' => 'সমà§à¦ªà¦¾à¦¦à¦¨à¦¾ করানির কা ই-মেইল লেপকানি থকিতই',
+'confirmemail' => 'ই-মেইল ঠিকানাহান লেপকর',
+'confirmemail_invalid' => 'লেপকরেকà§à¦°à¦¾ কোডগ চà§à¦® নাইসে। সমà§à¦­à¦¬à¦¤à¦ƒ à¦à¦— পà§à¦°à¦¾à¦¨à¦¾ ইয়া পরসেগা।',
+'confirmemail_loggedin' => 'তর ই-মেইল ঠিকানাহার লেপকরানিহান চà§à¦®à¦¿à¦²à¥¤',
+'confirmemail_send' => 'লেপকরেকà§à¦°à¦¾ কোডগ দিয়াপেঠাদে',
+'confirmemail_sendfailed' => 'লেপকরেকà§à¦°à¦¾ ই-মেইলহান দিয়াপেঠাদে নà§à§±à¦¾à¦°à¦°à¦¾à¦‚। ইমেইল ঠিকানাহান চà§à¦®à¦•à¦°à§‡ ইকরিসতà§à¦¤à¦¾à¦¨à¦¾à¦•à¦¿à¦¤à¦¾ আরাক আকমৠখিয়াল করিয়া চা। আলথকে আহিলঃ $1',
+'confirmemail_sent' => 'লেপকরেকà§à¦°à¦¾ ই-মেইলহান দিয়াপেঠা দিলাং।',
+'confirmemail_success' => 'তর ই-মেইল ঠিকানাহার লেপà§à¦ªà¦¾à¦¹à¦¾à¦¨ চà§à¦®à¦¿à¦²à¥¤ তি à¦à¦¬à¦¾à¦•à¦¾ হমানি(log in) পারর।',
+'contribslink' => 'অবদান',
+'currentevents' => 'হাদি à¦à¦¹à¦¾à¦¨à¦° ঘটনা',
+'currentevents-url' => 'হাদি à¦à¦¹à¦¾à¦¨à¦° ঘটনাহানি',
+'currentrev' => 'হাদিà¦à¦¹à¦¾à¦¨à¦° পতানি',
+'currentrevisionlink' => 'হাদি à¦à¦¹à¦¾à¦¨à¦° পতানি',
+'delete' => 'পà§à¦¸à¦¾à¦¨à¦¿',
+'delete_and_move' => 'পà§à¦¸à¦¾à¦¨à¦¿ বারো থেইকরানি',
+'delete_and_move_confirm' => 'হায়, পাতা à¦à¦¹à¦¾à¦¨ পà§à¦¸',
+'deletethispage' => 'পাতা à¦à¦¹à¦¾à¦¨ পà§à¦¸à§‡ বেলিক',
+'diff' => 'ফারাক',
+'edit' => 'পতানি',
+'edithelp' => 'পতানি পাংলাক',
+'edithelppage' => '{{ns:project}}:কিসাদে_পাতা_আহান_পতানি',
+'editold' => 'পতিক',
+'editsection' => 'পতিক',
+'editthispage' => 'পাতা à¦à¦¹à¦¾à¦¨ পতিক',
+'error' => 'লালà§à¦‡à¦¸à§‡',
+'errorpagetitle' => 'লাল',
+'faq' => 'পà§à¦°à¦¶à§à¦¨à¦°à¦œà§à¦¯à¦¼à¦¾à¦ª',
+'faqpage' => '{{ns:project}}:পà§à¦°à¦¶à§à¦¨à¦°à¦œà§à¦¯à¦¼à¦¾à¦ª',
+'go' => 'হাত',
+'help' => 'পাংলাক',
+'helppage' => '{{ns:project}}:পাংলাক',
+'hide' => 'আরà§à¦®',
+'hidetoc' => 'মেথেল আরà§à¦® কর',
+'hist' => 'ইতিহাসহান',
+'histfirst' => 'হাবà§à¦¬à¦¿à¦¤à§à¦¤ পà§à¦°à¦¾à¦¨à¦¾',
+'histlast' => 'হাবà§à¦¬à¦¿à¦¤à§à¦¤ নà§à§±à¦¾',
+'histlegend' => 'ফারাক (Diff) বাছানি: যে সংসà§à¦•à¦°à¦£à¦¹à¦¾à¦¨à¦¿ তà§à¦²à¦¨à¦¾ করানি চার, অহান লেপকরিয়া à¦à¦¨à§à¦Ÿà¦¾à¦° বা তলর খà§à¦¥à¦¾à¦®à¦—ত যাতা।<br />
+নিরà§à¦¦à§‡à¦¶à¦¿à¦•à¦¾: (à¦à¦¬) = à¦à¦¬à¦¾à¦•à¦¾à¦° সংসà§à¦•à¦°à¦£à¦¹à¦¾à¦¨à¦° লগে ফারাক,(আ) = জানে আগে-আগে গেলগা সংসà§à¦•à¦°à¦£à¦¹à¦¾à¦¨à¦° লগে ফারাক, হ = হà§à¦°à§-মà§à¦°à§ (নামাতলেউ à¦à¦•à¦°à¦¬ অসারে) সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¹à¦¾à¦¨à¥¤',
+'history_short' => 'ইতিহাসহান',
+'ilsubmit' => 'বিসারা',
+'imagelinks' => 'জà§à¦°à¦¿à¦¸à¦¿à¦¤à¦¾',
+'imagelist' => 'ছবির তালিকা',
+'imagepage' => 'ছবির পাতাহান চেইক',
+'jumptonavigation' => 'দিশা ধরানি',
+'lastmodifiedat' => 'পাতা à¦à¦¹à¦¾à¦¨à¦° লমিলগা পতানিহান $2, $1.',
+'mainpage' => 'পয়লা পাতা',
+'minoredit' => 'à¦à¦¹à¦¾à¦¨ হà§à¦°à§-মà§à¦°à§ সমà§à¦ªà¦¾à¦¦à¦¨à¦¾à¦¹à¦¾à¦¨à¦¹à§‡à¥¤',
+'minoreditletter' => 'হ',
+'move' => 'থেইকরানি',
+'mycontris' => 'মর অবদান',
+'mypage' => 'মর পাতাহান',
+'mytalk' => 'মর য়à§à¦¯à¦¾à¦°à¦¿-পরি',
+'navigation' => 'দিশা-ধরà§à¦¨à§€',
+'nbytes' => '$1 বাইট',
+'newmessageslink' => 'নà§à§±à¦¾ পৌ',
+'newpage' => 'নà§à§±à¦¾ পাতা',
+'newpageletter' => 'নà§',
+'nstab-main' => 'নিবনà§à¦§',
+'nstab-mediawiki' => 'পৌ',
+'nstab-project' => 'পà§à¦°à¦•à¦²à§à¦ª পাতা',
+'nstab-special' => 'বিশেষ',
+'nstab-user' => 'আতাকà§à¦°à¦¾à¦° পাতা',
+'ok' => 'চà§à¦®à¦¿à¦¸à§‡',
+'otherlanguages' => 'আরআর ঠারে',
+'permalink' => 'আকà§à¦¬à¦¾à¦²à¦¾ মিলাপ',
+'portal' => 'শিংলà§à¦ª',
+'portal-url' => '{{ns:project}}:শিংলà§à¦ª',
+'printableversion' => 'ছাপানি à¦à¦•à¦°à¦¬ সংসà§à¦•à¦°à¦£',
+'projectpage' => 'পà§à¦°à¦•à¦²à§à¦ªà¦° পাতাহান',
+'protectedinterface' => '[[Image:Padlock.svg|right|60px|]]পাতা à¦à¦¹à¦¾à¦¨à¦° মেথেল উইকি সফটওয়à§à¦¯à¦¾à¦°à¦° ইনà§à¦Ÿà¦¾à¦°à¦«à§‡à¦¸à¦° পৌহান দের, অহানে à¦à¦¹à¦¾à¦¨à¦°à§‡ ইতৠকরিয়া থনা অসে à¦à¦¬à¦¿à¦‰à¦¸à§‡à¦¤à§à¦¤ ঙাকà§à¦•à¦°à¦¾à¦¨à¦¿à¦° কাজে।',
+'protectthispage' => 'পাতা à¦à¦¹à¦¾à¦¨ ইতৠকরিক',
+'qbedit' => 'পতানি',
+'qbfind' => 'বিসারিয়া চা',
+'qbbrowse' => 'বà§à¦²à¦¿à¦¯à¦¼à¦¾ চা',
+'qbpageoptions' => 'পাতা à¦à¦¹à¦¾à¦¨à¦° সারà§à¦•',
+'qbpageinfo' => 'পাতা à¦à¦¹à¦¾à¦¨à¦° পৌ',
+'qbmyoptions' => 'মর পছন',
+'qbspecialpages' => 'বিশেষ পাতাহানি',
+'randompage' => 'খাংদা পাতা',
+'recentchanges' => 'হাদিà¦à¦¹à¦¾à¦¨ পতাসিতা',
+'recentchangeslinked' => 'সাকেই আসে পতা',
+'redirectedfrom' => '($1 -তà§à¦¤ পাকদিয়া আহিল)',
+'returnto' => 'আলথকে যাগা $1.',
+'retrievedfrom' => '\'$1\' -তà§à¦¤ আনানি অসে',
+'restriction-edit' => 'পতানিহান_চিয়ৌকর',
+'saturday' => 'থাংচা',
+'savefile' => 'ফাইল ইতà§',
+'saveprefs' => 'ইতà§',
+'search' => 'বিসারিয়া চা',
+'searcharticle' => 'হাত',
+'searchbutton' => 'বিসারানি',
+'showtoc' => 'ফংকর',
+'sitesubtitle' => 'খà§à¦²à¦¾à¦¸à¦¾ বিশà§à¦¬à¦•à§‹à¦· উইকিপিডিয়াতà§à¦¤',
+'sitesupport' => 'দান দেনা',
+'sitetitle' => 'উইকিপিডিয়া',
+'specialloguserlabel' => 'আতাকà§à¦°à¦¾à¦—:',
+'specialpage' => 'বিশেষ পাতাহান',
+'specialpages' => 'বিশেষ পাতাহানি',
+'tagline' => 'মà§à¦•à§à¦¤ বিশà§à¦¬à¦•à§‹à¦· উইকিপিডিয়াতà§à¦¤',
+'talk' => 'য়à§à¦¯à¦¾à¦°à§€',
+'talkpage' => 'পাতা à¦à¦¹à¦¾à¦¨à§à¦¨ য়à§à¦¯à¦¾à¦°à¦¿ দিক',
+'toc' => 'মেথেল',
+'toolbox' => 'আতিয়ার',
+'unwatch' => 'তালাবি নেই',
+'unwatchthispage' => 'তালাবি à¦à¦°à¦¾à¦¦à§‡à¦¨à¦¾',
+'upload' => 'আপলোড ফাইল',
+'uploadbtn' => 'আপলোড',
+'unprotectthispage' => 'পাতা à¦à¦¹à¦¾à¦¨à¦° ইতৠà¦à¦°à¦¾à¦¦à¦¿à¦•',
+'userlogin' => 'হমানি / নৱা à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿ খà§à¦²à¦¾à¦¨à¦¿',
+'userlogout' => 'নিকà§à¦²à¦¾à¦¨à¦¿',
+'userpage' => 'আতাকà§à¦°à¦¾à¦° পাতাহান চেইক',
+'viewcount' => 'পাতা à¦à¦¹à¦¾à¦¨ $1 মাউ চানা ইল।',
+'viewtalkpage' => 'য়à§à¦¯à¦¾à¦°à§€à¦° পাতাহান চেইক',
+'watch' => 'তালাবি',
+'watchlist' => 'মর তালাবি',
+'watchthis' => 'পাতাà¦à¦¹à¦¾à¦¨ খিয়ালে থ',
+'watchthispage' => 'পাতাà¦à¦¹à¦¾à¦¨ খিয়ালে থ',
+'watchthisupload' => 'পাতাà¦à¦¹à¦¾à¦¨ খিয়ালে থ',
+'whatlinkshere' => 'যে পাতাহানিতà§à¦¤ à¦à¦¹à¦¾à¦¨à¦¾à¦¤ মিলাপ আসে',
+'welcomecreation' => '== সমà§à¦­à¦¾à¦·à¦¾, $1! ==
+
+তর à¦à¦•à¦¾à¦‰à¦¨à§à¦Ÿà¦¹à¦¾à¦¨ মà§à¦•à¦¿à¦²à¥¤ তর {{SITENAME}} পছনহান পতানি না পাহà§à¦°à¦¿à¦¸à¥¤',
+'yourdiff' => 'ফারাকহানি',
+'yourdomainname' => 'তর ডোমেইনগ',
+'youremail' => 'ই-মেইল *:',
+'yourlanguage' => 'ঠারহান:',
+'yourname' => 'আতাকà§à¦°à¦¾à¦° নাংহান (Username)',
+'yournick' => 'দাহানির নাংহান:',
+'yourpassword' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿à¦— (password)',
+'yourpasswordagain' => 'খনà§à¦¤à¦¾à¦šà¦¾à¦¬à¦¿à¦— (password) আরাকমৠইকর',
+'yourrealname' => 'আৱৈপা নাংহান *:',
+'yourtext' => 'তর ইকরা বিষয়হানি',
+
+);
-$fallback = 'bn';
?>
diff --git a/languages/messages/MessagesBr.php b/languages/messages/MessagesBr.php
index 54c5b2f4..8b34e305 100644
--- a/languages/messages/MessagesBr.php
+++ b/languages/messages/MessagesBr.php
@@ -121,6 +121,7 @@ $messages = array(
# Bits of text used by many pages:
#
'categories' => 'Rummadoù ar bajenn',
+'pagecategories' => 'Rummadoù ar bajenn',
'category_header' => 'Niver a bennadoù er rummad "$1"',
'subcategories' => 'Isrummad',
'uncategorizedcategories' => 'Rummadoù hep rummadoù',
@@ -786,10 +787,10 @@ Eur ar servijer (UTC) eo an eur merket.
'rollbacklink' => 'disteuler',
'rollbackfailed' => 'C\'hwitet eo bet an distaoladenn',
'cantrollback' => "Dibosupl da zisteuler: an aozer diwezhañ eo an hini nemetañ da vezañ kemmet ar pennad-mañ",
-'alreadyrolled' => "Dibosupl eo disteuler ar c'hemm diwezhañ graet e [[$1]]
+'alreadyrolled' => "Dibosupl eo disteuler ar c'hemm diwezhañ graet e [[:$1]]
gant [[User:$2|$2]] ([[User talk:$2|Talk]]); kemmet pe distaolet eo bet c'hoazh gant unan bennak all.
-Ar c'hemm diwezhañ a oa gant [[User:$3|$3]] ([[User talk:$3|Talk]]). ", //Looxix
+Ar c'hemm diwezhañ a oa gant [[User:$3|$3]] ([[User talk:$3|Talk]]).", //Looxix
# only shown if there is an edit comment
'editcomment' => "Diverradenn ar c'hemm a oa: \"<i>$1</i>\".", //Looxix
'revertpage' => 'Adlakaat kemm diwezhañ $1',
diff --git a/languages/messages/MessagesBs.php b/languages/messages/MessagesBs.php
index f642c28e..62bc7f8e 100644
--- a/languages/messages/MessagesBs.php
+++ b/languages/messages/MessagesBs.php
@@ -95,9 +95,9 @@ $linkTrail = '/^([a-zćÄžšđž]+)(.*)$/sDu';
$messages = array(
'1movedto2' => 'stranica [[$1]] premještena u stranicu [[$2]]',
'1movedto2_redir' => 'stranica [[$1]] premještena u stranicu [[$2]] putem preusmjerenja',
-'Monobook.css' => '/*
+'monobook.css' => '/*
*/',
-'Monobook.js' => '
+'monobook.js' => '
/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Moja korisniÄka stranica\');
@@ -109,7 +109,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Spisak Älanaka koje pratite.\');
ta[\'pt-mycontris\'] = new Array(\'y\',\'Spisak mog doprinosa\');
ta[\'pt-login\'] = new Array(\'o\',\'Prijava nije obavezna, ali donosi mnogo koristi.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Prijava nije obavezna, ali donosi mnogo koristi.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Odjava sa projekta {{SITENAME}}\');
+ta[\'pt-logout\'] = new Array(\'\',\'Odjava sa projekta {{SITENAME}}\');
ta[\'ca-talk\'] = new Array(\'t\',\'Razgovor o sadržaju\');
ta[\'ca-edit\'] = new Array(\'e\',\'Možete da ureÄ‘ujete ovaj Älanak. Molimo Vas, koristite dugme "Prikaži izgled" prije konaÄnog saÄuvavanja vaÅ¡ih imjena.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Dodajte svoj komentar.\');
@@ -165,7 +165,7 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'Pogledajte stranicu kategorije\');
'allpages' => 'Sve stranice',
'alphaindexline' => '$1 u $2',
'alreadyloggedin' => '<strong>KorisniÄe $1, već ste prijavljeni!</strong><br />',
-'alreadyrolled' => 'Ne može se vratiti poslednja izmjena [[$1]] od korisnika [[{{ns:2}}:$2|$2]] ([[{{ns:3}}:$2|razgovor]]); neko drugi je već izmjenio ili vratio Älanak. Poslednja izmjena od korisnika [[{{ns:2}}:$3|$3]] ([[{{ns:3}}:$3|razgovor]]).',
+'alreadyrolled' => 'Ne može se vratiti poslednja izmjena [[:$1]] od korisnika [[{{ns:2}}:$2|$2]] ([[{{ns:3}}:$2|razgovor]]); neko drugi je već izmjenio ili vratio Älanak. Poslednja izmjena od korisnika [[{{ns:2}}:$3|$3]] ([[{{ns:3}}:$3|razgovor]]).',
'ancientpages' => 'Najstarije stranice',
'and' => 'i',
'anoneditwarning' => 'Niste prijavljeni. Vaša IP adresa će biti zapisana.',
@@ -699,6 +699,7 @@ na kome bi se izvela ova funkcija.',
'orig' => 'orig',
'othercontribs' => 'Bazirano na radu od strane korisnika $1.',
'otherlanguages' => 'Ostali jezici',
+'pagecategories' => 'Kategorije',
'pagemovedsub' => 'Premještanje uspjelo',
'pagemovedtext' => 'Stranica "[[$1]]" premještena je na "[[$2]]".',
'pagetitle' => '$1 - {{SITENAME}}',
@@ -839,7 +840,7 @@ Molimo Vas da provjerite URL pomoću kojeg ste pristupili ovoj stranici.',
'searchbutton' => 'Pretraži',
'searchdisabled' => '<p>Izvinjavamo se! Puno pretraga teksta je privremeno onemogućena. U međuvremenu, možete koristiti Google za pretragu. Indeks može biti stariji.',
'searchsubtitle' => 'Tražili ste [[:$1]] [[Special:Allpages/$1|&#x5B;Sadržaj&#x5D;]]',
-'searchsubtitleinvalid' => 'Tražili ste $1 ',
+'searchsubtitleinvalid' => 'Tražili ste $1',
'searchresults' => 'Rezultati pretrage',
'searchresultshead' => 'Podešavanja rezultata pretrage',
'searchresulttext' => 'Za više informacija o pretraživanju {{SITENAME}}, pogledajte [[{{ns:4}}:Pretraga|Pretraga]].',
diff --git a/languages/messages/MessagesCa.php b/languages/messages/MessagesCa.php
index f20f4174..f6c4450a 100644
--- a/languages/messages/MessagesCa.php
+++ b/languages/messages/MessagesCa.php
@@ -122,7 +122,8 @@ $messages = array(
'oct' => 'oct',
'nov' => 'nov',
'dec' => 'des',
-'categories' => '{{PLURAL:$1|Categoria|Categories}}',
+'categories' => 'Categories',
+'pagecategories' => '{{PLURAL:$1|Categoria|Categories}}',
'category_header' => 'Articles a la categoria «$1»',
'subcategories' => 'Subcategories',
'mainpage' => 'Pàgina principal',
@@ -488,7 +489,7 @@ Reviseu l\'URL que heu emprat per a accedir-hi.',
'loadhist' => 'Recuperant la història de la pàgina',
'currentrev' => 'Revisió actual',
'revisionasof' => 'Revisió de $1',
-'old-revision-navigation'=> 'Revisió de $1; $5<br />($6) $3 | $4 ($7) $2',
+'revision-info' => 'Revisió de $1; $2',
'previousrevision' => 'â†Versió anterior',
'nextrevision' => 'Versió posterior→',
'currentrevisionlink' => 'Versió actual',
@@ -1076,8 +1077,8 @@ L\'article de destí, "[[$1]]", ja existeix. Voleu esborrar-lo per fer lloc per
'tooltip-minoredit' => 'Marca-ho com una edició menor [alt-i]',
'tooltip-save' => 'Desa els vostres canvis [alt-s]',
'tooltip-diff' => 'Mostra quins canvis heu fet al text. [alt-v]',
-'Common.css' => '/* Editeu aquest fitxer per personalitzar totes les aparences per al lloc sencer */',
-'Monobook.css' => '/* Editeu aquest fitxer per personalitzar l\'aparença del monobook per a tot el lloc sencer */',
+'common.css' => '/* Editeu aquest fitxer per personalitzar totes les aparences per al lloc sencer */',
+'monobook.css' => '/* Editeu aquest fitxer per personalitzar l\'aparença del monobook per a tot el lloc sencer */',
'notacceptable' => 'El servidor wiki no pot oferir dades en un format que el client no pot llegir.',
'anonymous' => 'Usuaris anònims del projecte {{SITENAME}}',
'lastmodifiedatby' => 'Va modificar-se la pàgina per darrera vegada el $2, $1 per $3.',
@@ -1096,7 +1097,7 @@ L\'article de destí, "[[$1]]", ja existeix. Voleu esborrar-lo per fer lloc per
'markedaspatrolled' => 'Marca com a vigilat',
'markedaspatrollederror'=> 'No es pot marcar com a vigilat',
'markedaspatrollederrortext'=> 'Cal que especifiqueu una revisió per a marcar-la com a vigilada.',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'La vostra pàgina d\'usuari.\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'La pàgina d\'usuari per la ip que utilitzeu\');
@@ -1107,7 +1108,7 @@ L\'article de destí, "[[$1]]", ja existeix. Voleu esborrar-lo per fer lloc per
ta[\'pt-mycontris\'] = new Array(\'y\',\'Llista de les vostres contribucions.\');
ta[\'pt-login\'] = new Array(\'o\',\'Us animem a registrar-vos, però no és obligatori.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Us animem a registrar-vos, però no és obligatori.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Finalitza la sessió d\'usuari\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Finalitza la sessió d\'usuari\');
ta[\'ca-talk\'] = new Array(\'t\',\'Discussió sobre el contingut d\'aquesta pàgina.\');
ta[\'ca-edit\'] = new Array(\'e\',\'Podeu editar aquesta pàgina. Si us plau, previsualitzeu abans de desar.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Afegeix un comentari a aquesta discussió.\');
diff --git a/languages/messages/MessagesCs.php b/languages/messages/MessagesCs.php
index 8f763b07..7df30661 100644
--- a/languages/messages/MessagesCs.php
+++ b/languages/messages/MessagesCs.php
@@ -179,6 +179,7 @@ $messages = array(
# Části textu používané různými stránkami:
'categories' => 'Kategorie',
+'pagecategories' => 'Kategorie',
'category_header' => 'Články v kategorii „$1“',
'subcategories' => 'Podkategorie',
@@ -653,7 +654,7 @@ Můžete se vrátit a editovat již existující stránku, nebo [[Special:Userlo
'loadhist' => 'NaÄítá se stránka historie editací', #FIXME Apparently not used
'currentrev' => 'Aktuální verze',
'revisionasof' => 'Verze z $1',
-'old-revision-navigation' => 'Verze z $1; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'Verze z $1; $2',
'previousrevision' => '↠Starší verze',
'nextrevision' => 'Novější verze →',
'currentrevisionlink' => 'zobrazit aktuální verzi',
@@ -1208,7 +1209,7 @@ Rady a kontakt:
'rollbacklink' => 'vrácení zpět',
'rollbackfailed' => 'Nešlo vrátit zpět',
'cantrollback' => 'Nelze vrátit zpÄ›t poslední editaci, neboÅ¥ poslední pÅ™ispÄ›vatel je jediným autorem tohoto Älánku.',
-'alreadyrolled' => 'Nelze vrátit zpÄ›t poslední editaci [[$1]] od [[User:$2|$2]] ([[User talk:$2|Diskuse]]), protože nÄ›kdo jiný již Älánek editoval nebo vrátil tuto zmÄ›nu zpÄ›t. Poslední editace byla od [[User:$3|$3]] ([[User talk:$3|Diskuse]]).',
+'alreadyrolled' => 'Nelze vrátit zpÄ›t poslední editaci [[:$1]] od [[User:$2|$2]] ([[User talk:$2|Diskuse]]), protože nÄ›kdo jiný již Älánek editoval nebo vrátil tuto zmÄ›nu zpÄ›t. Poslední editace byla od [[User:$3|$3]] ([[User talk:$3|Diskuse]]).',
# only shown if there is an edit comment
'editcomment' => 'Shrnutí editace bylo: „<i>$1</i>“.',
'revertpage' => 'Editace uživatele „$2“ vrácena do předchozího stavu, jehož autorem je „$1“.',
@@ -1401,7 +1402,7 @@ V tÄ›chto případech musíte pÅ™esunout nebo slouÄit stránky manuálnÄ›, jest
'pagemovedsub' => 'Úspěšně přesunuto',
'pagemovedtext' => "Stránka „[[$1]]“ přesunuta na „[[$2]]“.
-'''Nyní''' následujte odkaz [[{{ns-1}}:Whatlinkshere/$1]]: pokud se v seznamu vyskytnou nÄ›jaké pÅ™esmÄ›rovaÄe, je tÅ™eba je upravit tak, aby ukazovaly na nový název ($2), jinak nebudou fungovat.",
+'''Nyní''' následujte odkaz [[{{ns:-1}}:Whatlinkshere/$1]]: pokud se v seznamu vyskytnou nÄ›jaké pÅ™esmÄ›rovaÄe, je tÅ™eba je upravit tak, aby ukazovaly na nový název ($2), jinak nebudou fungovat.",
'articleexists' => 'Takto nazvaná stránka již existuje, nebo Vámi zvolený název je neplatný. Zvolte jiný název.',
'talkexists' => 'Stránka byla pÅ™esunuta úspěšnÄ›, ale diskusní stránka pÅ™esunuta být nemohla, neboÅ¥ pod novým názvem již nÄ›jaká stránka existuje. ProveÄte prosím ruÄní slouÄení.',
'movedto' => 'přesunuto na',
@@ -1479,7 +1480,7 @@ Do níže uvedeného editaÄního pole zadejte názvy stránek, které chcete ex
# import log
'importlogpage' => 'Kniha importů',
'importlogpagetext' => 'Na této stránce se zobrazují správcovské importy stránek vÄetnÄ› historie editací z jiných wiki.',
-'import-logentry-upload' => 'naimportoval $1 naÄtením souboru',
+'import-logentry-upload' => 'naimportoval [[$1]] naÄtením souboru',
'import-logentry-upload-detail' => '$1 {{PLURAL:$1|revizi|revize|revizí}}',
'import-logentry-interwiki' => 'přenesl $1',
'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revizi|revize|revizí}} z $2',
@@ -1491,7 +1492,7 @@ Do níže uvedeného editaÄního pole zadejte názvy stránek, které chcete ex
'accesskey-watch' => 'w',
'accesskey-save' => 's',
'accesskey-preview' => 'p',
-'accesskey-diff' => 'd',
+'accesskey-diff' => 'v',
'accesskey-compareselectedversions' => 'v',
# tooltip help for some actions, most are in Monobook.js
@@ -1499,13 +1500,13 @@ Do níže uvedeného editaÄního pole zadejte názvy stránek, které chcete ex
'tooltip-minoredit' => 'OznaÄit jako malou editaci [alt-i]',
'tooltip-save' => 'Uložit vaše úpravy [alt-s]',
'tooltip-preview' => 'Prohlédnout vaše úpravy, prosíme použijte tuto funkci před uložením! [alt-p]',
-'tooltip-diff' => 'Zobrazit, jaké změny jste v textu provedli. [alt-d]',
+'tooltip-diff' => 'Zobrazit, jaké změny jste v textu provedli. [alt-v]',
'tooltip-compareselectedversions' => 'Porovnat rozdíly mezi zvolenými verzemi této stránky. [alt-v]',
'tooltip-watch' => 'Přidat stránku do seznamu sledovaných [alt-w]',
# stylesheets
-'Common.css' => '/* Zde uvedené CSS bude ovlivňovat všechny styly */',
-'Monobook.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „monobook“ */',
+'common.css' => '/* Zde uvedené CSS bude ovlivňovat všechny styly */',
+'monobook.css' => '/* Zde uvedené CSS bude ovlivňovat pouze styl „monobook“ */',
# Metadata
'nodublincore' => 'Na tomto serveru je vypnuto generování metadat Dublin Core RDF.',
@@ -1566,7 +1567,7 @@ Do níže uvedeného editaÄního pole zadejte názvy stránek, které chcete ex
'markedaspatrollederrortext' => 'Musíte zvolit revizi, která má být oznaÄena jako prověřená.',
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => "/* tooltips and access keys */
+'monobook.js' => "/* tooltips and access keys */
var ta = new Object();
ta['pt-userpage'] = new Array('.','Moje uživatelská stránka');
ta['pt-anonuserpage'] = new Array('.','Uživatelská stránka pro IP adresu, ze které editujete');
@@ -1577,7 +1578,7 @@ ta['pt-watchlist'] = new Array('l','Seznam stránek, jejichž změny sleduji');
ta['pt-mycontris'] = new Array('y','Seznam mých příspěvků');
ta['pt-login'] = new Array('o','DoporuÄujeme vám pÅ™ihlásit se, ovÅ¡em není to povinné.');
ta['pt-anonlogin'] = new Array('o','DoporuÄujeme vám pÅ™ihlásit se, ovÅ¡em není to povinné.');
-ta['pt-logout'] = new Array('o','Odhlásit se');
+ta['pt-logout'] = new Array('','Odhlásit se');
ta['ca-talk'] = new Array('t','Diskuse ke stránce');
ta['ca-edit'] = new Array('e','Tuto stránku můžete editovat. Prosíme použijte tlaÄítko Ukázat náhled pÅ™ed uložením.');
ta['ca-addsection'] = new Array('+','Přidat k této diskusi svůj komentář.');
@@ -2046,7 +2047,7 @@ Opravdu si přejete znovu tuto stránku založit?',
'confirm_purge_button' => 'OK',
'youhavenewmessagesmulti' => 'Na $1 máte nové zprávy',
-'newtalkseperator' => ',_',
+
'searchcontaining' => "Hledat Älánky obsahující ''$1''.",
'searchnamed' => "Hledat Älánky pojmenované ''$1''.",
'articletitles' => "ÄŒlánky zaÄínající ''$1''",
diff --git a/languages/messages/MessagesCsb.php b/languages/messages/MessagesCsb.php
index 2994460b..2d7d3a58 100644
--- a/languages/messages/MessagesCsb.php
+++ b/languages/messages/MessagesCsb.php
@@ -50,7 +50,7 @@ $messages = array(
'bydate' => 'wedle datumù',
'byname' => 'wedle miona',
'bysize' => 'wedle wiôlgòscë',
-'categories' => '{{PLURAL:$1|Kategòrëjô|Kategòrëje}}',
+'categories' => 'Kategòrëje',
'categoryarticlecount' => 'W ny kategòrëje je $1 artiklów.',
'category_header' => 'Artikle w kategòrëji "$1"',
'changepassword' => 'Zmiana parolë',
@@ -219,6 +219,7 @@ $messages = array(
'october' => 'Rujan',
'ok' => 'Jo!',
'othercontribs' => 'Òpiarté na prôcë $1.',
+'pagecategories' => '{{PLURAL:$1|Kategòrëjô|Kategòrëje}}',
'pagemovedsub' => 'Przeniesenié darzëło sã',
'pagemovedtext' => 'Starna "[[$1]]" òsta przeniesłô do "[[$2]]".',
'pagetitle' => '$1 - {{SITENAME}}',
diff --git a/languages/messages/MessagesCu.php b/languages/messages/MessagesCu.php
new file mode 100644
index 00000000..765ee002
--- /dev/null
+++ b/languages/messages/MessagesCu.php
@@ -0,0 +1,141 @@
+<?php
+/** Old Church Slavonic (Ѩзыкъ ÑловѣньÑкъ)
+ */
+
+$separatorTransformTable = array(
+ ',' => ".",
+ '.' => ','
+);
+
+$linkPrefixExtension = true;
+
+$namespaceNames = array(
+ NS_MEDIA => 'СрѣдьÑтва',
+ NS_SPECIAL => 'Ðарочьна',
+ NS_MAIN => '',
+ NS_TALK => 'БеÑѣда',
+ NS_USER => 'Польѕевател҄ь',
+ NS_USER_TALK => 'Польѕевател_беÑѣда',
+ #NS_PROJECT set by $wgMetaNamespace
+ NS_PROJECT_TALK => '{{grammar:genitive|$1}}_беÑѣда',
+ NS_IMAGE => 'Видъ',
+ NS_IMAGE_TALK => 'Вида_беÑѣда',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'MediaWiki_беÑѣда',
+ NS_TEMPLATE => 'Образьць',
+ NS_TEMPLATE_TALK => 'Образьца_беÑѣда',
+ NS_HELP => 'Помощь',
+ NS_HELP_TALK => 'Помощи_беÑѣда',
+ NS_CATEGORY => 'Катигорї',
+ NS_CATEGORY_TALK => 'Катигорїѩ_беÑѣда',
+);
+
+$defaultDateFormat = 'mdy';
+
+$dateFormats = array(
+ 'mdy time' => 'H:i',
+ 'mdy date' => 'xg j чиÑла, Y',
+ 'mdy both' => 'H:i, xg j чиÑла, Y',
+
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j F Y',
+ 'dmy both' => 'H:i, j F Y',
+
+ 'ymd time' => 'H:i',
+ 'ymd date' => 'Y F j',
+ 'ymd both' => 'H:i, Y F j',
+
+ 'ISO 8601 time' => 'xnH:xni:xns',
+ 'ISO 8601 date' => 'xnY-xnm-xnd',
+ 'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+);
+
+$linkTrail = '/^([a-zабвгдеєжѕзїіıићклмнопÑÑтѹфхѡѿцчшщъыьѣюѥѧѩѫѭѯѱѳѷѵґѓђёјйљњќуўџÑÒ„Ñ“»]+)(.*)$/sDu';
+
+$messages = array(
+'linkprefix' => '/^(.*?)(„|«)$/sD',
+
+'january' => 'їанѹарїи',
+'february' => 'феврѹарїи',
+'march' => 'мартїи',
+'april' => 'апрїлїи',
+'may_long' => 'маїи',
+'june' => 'їѹнїи',
+'july' => 'їѹлїи',
+'august' => 'аѵгѹÑÑ‚ÑŠ',
+'september' => 'Ñептемврїи',
+'october' => 'октѡврїи',
+'november' => 'ноемврїи',
+'december' => 'декемврїи',
+'january-gen' => 'їанѹарї',
+'february-gen' => 'феврѹарї',
+'march-gen' => 'мартї',
+'april-gen' => 'апрїлї',
+'may-gen' => 'маї',
+'june-gen' => 'їѹнї',
+'july-gen' => 'їѹлї',
+'august-gen' => 'аѵгѹÑта',
+'september-gen' => 'Ñептемврї',
+'october-gen' => 'октѡврї',
+'november-gen' => 'ноемврї',
+'december-gen' => 'декемврї',
+
+'1movedto2_redir' => '[[$1]] нареченъ [[$2]] врьхѹ прѣнаправлѥни Ñ¥ÑÑ‚ÑŠ.',
+'blockip' => 'Загради польѕеватель',
+'cite_article_link' => 'Приведи Ñтатїѭ',
+'contributions' => 'Добродѣни польѕевател',
+'createaccount' => 'Cъзижди Ñи мѣÑто',
+'currentevents' => 'Текѫща Ñъбыти',
+'delete' => 'ничьжи',
+'edit' => 'иÑправи',
+'editold' => 'иÑправи',
+'editsection' => 'иÑправи',
+'emailuser' => 'ПоÑъли епїÑтолѫ',
+'go' => 'Прѣиди',
+'help' => 'Помощь',
+'history_short' => 'ЇÑтѡрї',
+'ilsubmit' => 'Ищи',
+'login' => 'Въниди',
+'logout' => 'иходъ',
+'mainpage' => 'Главьна Ñтраница',
+'makebot-search' => 'Прѣиди',
+'move' => 'прѣименѹи',
+'mycontris' => 'Мо добродѣни',
+'mypreferences' => 'мои Ñтрои',
+'mytalk' => 'Мо беÑѣда',
+'navigation' => 'плаваниѥ',
+'nstab-main' => 'Ñтатї',
+'nstab-project' => 'Ñъвѣтъ',
+'nstab-special' => 'Ðарочьна',
+'nstab-user' => 'польѕеватель',
+'permalink' => 'ѸÑтавьна Ñъвѧзь',
+'portal' => 'Обьщины Ñъвѣтъ',
+'powersearch' => 'Ищи',
+'printableversion' => 'Печатьнъ образъ',
+'protect' => 'забрани',
+'qbedit' => 'иÑправи',
+'qbspecialpages' => 'Ðарочьны Ñтраницѧ',
+'recentchanges' => 'ПоÑлѣдьнѩ мѣны',
+'recentchangeslinked' => 'Вѧзаны мѣны',
+'restriction-edit' => 'иÑправи',
+'search' => 'поиÑкъ',
+'searcharticle' => 'Прѣиди',
+'searchbutton' => 'Ищи',
+'sitesupport' => 'Дани',
+'specialpage' => 'нарочьна Ñтраница',
+'specialpages' => 'Ðарочьны Ñтраницѧ',
+'talk' => 'беÑѣда',
+'toolbox' => 'Орѫди',
+'unprotect' => 'пѹÑти',
+'unwatch' => 'оÑтави блюдениѥ',
+'upload' => 'Положи дѣло',
+'uploadbtn' => 'Положи дѣло',
+'userlogin' => 'Въниди / Ñъзижди Ñи мѣÑто',
+'userlogout' => 'иходъ',
+'watch' => 'блюди',
+'watchlist' => 'Мо блюдени',
+'whatlinkshere' => ' ДоÑьдещьнѩ Ñъвѧзи',
+
+);
+
+?>
diff --git a/languages/messages/MessagesCv.php b/languages/messages/MessagesCv.php
index 0df378c7..fc540f2e 100644
--- a/languages/messages/MessagesCv.php
+++ b/languages/messages/MessagesCv.php
@@ -31,7 +31,7 @@ $linkTrail = '/^([a-zа-Ñĕçăӳ"»]+)(.*)$/sDu';
$messages = array(
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Пользователь Ñтраници\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'The user page for the ip you\'re editing as\');
@@ -42,7 +42,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'The list of pages you\'re monitoring fo
ta[\'pt-mycontris\'] = new Array(\'y\',\'List of my contributions\');
ta[\'pt-login\'] = new Array(\'o\',\'You are encouraged to log in, it is not mandatory however.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'You are encouraged to log in, it is not mandatory however.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Log out\');
+ta[\'pt-logout\'] = new Array(\'\',\'Log out\');
ta[\'ca-talk\'] = new Array(\'t\',\'СтатьÑна ÑӳтÑе ÑваÑÑи\');
ta[\'ca-edit\'] = new Array(\'e\',\'ЭÑир ку Ñтраницӑна тӳрлетме пултаратӑр. ТархаÑшӑн Ò«Ñ‹Ñ€Ñа хӑваричен Ñтраницӑ мӗнле пулаÑÑине пӑхӑр.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'КӗÑке ӑнлантару хушма пултаратӑр.\');
@@ -209,6 +209,7 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'View the category page\');',
'october' => 'Юпа',
'talkpage' => 'СӳтÑе ÑваÑÑи',
'categories' => 'КатегориÑем',
+'pagecategories' => 'КатегориÑем',
'hidetoc' => 'кӑтартмалла мар',
'april' => 'Ðка',
'listusers' => 'ХутшăнаканÑен ÑпиÑокĕ',
diff --git a/languages/messages/MessagesCy.php b/languages/messages/MessagesCy.php
index 711420f9..08ab035a 100644
--- a/languages/messages/MessagesCy.php
+++ b/languages/messages/MessagesCy.php
@@ -134,6 +134,7 @@ $messages = array(
# Bits of text used by many pages:
#
"categories" => "Categorïau tudalen",
+"pagecategories" => "Categorïau tudalen",
"category_header" => "Erthyglau mewn categori \"$1\"",
"subcategories" => "Is-categorïau",
"mainpage" => "Prif tudalen",
@@ -348,10 +349,10 @@ Allweddair defnyddwr \"$2\" rwan yw \"$3\". Ddylwch chi mewngofnodi rwan a newid
I creuo'r tudalen, dechreuwch teipio yn y bocs isaf
(gwelwch y [[{{ns:project}}:Help|tudalen help]] am mwy o hysbys).
Os ydych yma trwy camgymeriad, cliciwch eich botwm '''nol'''.",
-"anontalkpagetext" => "---- ''Dyma tudalen sgwrsio am defnyddwr sydd ddim eto wedi creu accownt, neu ddim yn eu defnyddio. Rhaid i ni defnyddio'r [[cyfeiriad IP]] rhifiadol i adnabod fe neu hi. Mae'n posib i llawer o bobl siario'r un cyfeiriad IP. Os ydych chi'n defnyddwr anhysbys ac yn teimlo mae esboniadau amherthynol wedi cael eu gwneud arnach chi, creuwch accownt neu mewngofnodwch i osgoi anhrefn gyda defnyddwyr anhysbys yn y dyfodol.'' ",
+"anontalkpagetext" => "---- ''Dyma tudalen sgwrsio am defnyddwr sydd ddim eto wedi creu accownt, neu ddim yn eu defnyddio. Rhaid i ni defnyddio'r [[cyfeiriad IP]] rhifiadol i adnabod fe neu hi. Mae'n posib i llawer o bobl siario'r un cyfeiriad IP. Os ydych chi'n defnyddwr anhysbys ac yn teimlo mae esboniadau amherthynol wedi cael eu gwneud arnach chi, creuwch accownt neu mewngofnodwch i osgoi anhrefn gyda defnyddwyr anhysbys yn y dyfodol.''",
"noarticletext" => "(Does dim testun yn y tudalen hon eto)",
"updated" => "(Diweddariad)",
-"note" => "<strong>Sylwch:</strong> ",
+"note" => "<strong>Sylwch:</strong>",
"previewnote" => "Cofiwch blaenwelediad ydi hwn, a dydi e ddim wedi cael eu chadw!",
"previewconflict" => "Mae blaenwelediad hwn yn dangos y testun yn yr ardal golygu uchaf, fel y fydd hi'n edrych os dewyswch chi arbed.",
"editing" => "Yn golygu $1",
@@ -444,7 +445,7 @@ i setio ffafraethau defnyddwr.",
"math" => "Rendro mathemateg",
"math_failure" => "wedi methu dosbarthu",
"math_unknown_error" => "gwall anhysbys",
-"math_unknown_function" => "ffwythiant anhysbys ",
+"math_unknown_function" => "ffwythiant anhysbys",
"math_lexing_error" => "gwall lecsio",
"math_syntax_error" => "gwall cystrawen",
"saveprefs" => "Cadw ffafraethau",
@@ -563,8 +564,8 @@ Dilynwch y cyswllt hon: ($2) i'r tudalen disgrifiad a llenwch gwybodaeth amdano'
"imghistlegend" => "Eglurhad: (cyf) = hon yw'r delwedd cyfoes, (dil) = dilewch yr hen fersiwn hon, (dych) = dychwelio i hen fersiwn hon.
<br /><i>Cliciwch ar dyddiad i weld y delwedd ag oedd llwythiad ar y dyddiad hon</i>.",
"imagelinks" => "Cysylltiadau delwedd",
-"linkstoimage" => "Mae'r tudalennau isod yn cysylltu i'r delwedd hon: ",
-"nolinkstoimage" => "Does dim tudalen yn cysylltu i'r delwedd hon. ",
+"linkstoimage" => "Mae'r tudalennau isod yn cysylltu i'r delwedd hon:",
+"nolinkstoimage" => "Does dim tudalen yn cysylltu i'r delwedd hon.",
# Statistics
#
@@ -674,7 +675,7 @@ y botwm 'dileu' ar gwaelod y sgrîn.",
"exblank" => "y tudalen oedd yn wâg",
"confirmdelete" => "Cadarnhaewch y dileuad",
"deletesub" => "(Yn dileuo \"$1\")",
-"historywarning" => "Rhubydd: Mae hanes gan y tudalen yr ydych yn mynd i dileuo: ",
+"historywarning" => "Rhubydd: Mae hanes gan y tudalen yr ydych yn mynd i dileuo:",
"confirmdeletetext" => "Rydych chi'n mynd i dileu erthygl neu llun yn parhaol, hefyd gyda'u hanes, oddiwrth y databas.
Cadarnhaewch yr ydych yn bwriadu gwneud hwn, ac yr ydych yn ddeallt y canlyniad, ac yr ydych yn gwneud hwn yn ôl [[{{ns:project}}:Polisi]].",
"actioncomplete" => "Gweithred llwyr",
@@ -692,10 +693,10 @@ Gwelwch $2 am cofnod o dileuon diweddar.",
"rollback" => "Roliwch golygon yn ôl",
"rollbacklink" => "rolio nôl",
"cantrollback" => "Ddim yn gallu gwrthdroi golygiad; y cyfrannwr olaf oedd yr unrhyw awdur yr erthygl hon.",
-"alreadyrolled" => "Amhosib rolio nôl golygiad olaf [[$1]]
+"alreadyrolled" => "Amhosib rolio nôl golygiad olaf [[:$1]]
gan [[Defnyddwr:$2|$2]] ([[Sgwrs defnyddwr:$2|Sgwrs]]); mae rhywun arall yn barod wedi olygu neu rolio nôl yr erthygl.
-[[Defnyddwr:$3|$3]] ([[Sgwrs defnyddwr:$3|Sgwrs]] gwneuthoedd yr olygiad olaf). ",
+[[Defnyddwr:$3|$3]] ([[Sgwrs defnyddwr:$3|Sgwrs]] gwneuthoedd yr olygiad olaf).",
# only shown if there is an edit comment
"editcomment" => "Crynodeb y golygiad oedd: \"<i>$1</i>\".",
"revertpage" => "Wedi gwrthdroi i golygiad olaf gan $1",
@@ -825,7 +826,7 @@ amusement.",
# Namespace 8 related
"allmessages" => "Holl_negeseuon",
-"allmessagestext" => "Dyma rhestr holl y negeseuon ar gael yn y lle-enw MediaWiki: ",
+"allmessagestext" => "Dyma rhestr holl y negeseuon ar gael yn y lle-enw MediaWiki:",
# Thumbnails
diff --git a/languages/messages/MessagesDa.php b/languages/messages/MessagesDa.php
index fd06355e..6a4d5119 100644
--- a/languages/messages/MessagesDa.php
+++ b/languages/messages/MessagesDa.php
@@ -124,6 +124,7 @@ $messages = array(
# Bits of text used by many pages:
#
"categories" => "Kategorier",
+"pagecategories" => "Kategorier",
"category_header" => 'Artikler i kategorien "$1"',
"subcategories" => "Underkategorier",
@@ -947,7 +948,7 @@ succes.",
"rollbackfailed" => "Kunne ikke fjerne redigeringen",
"cantrollback" => "Kan ikke fjerne redigering;
den sidste bruger er den eneste forfatter.",
-"alreadyrolled" => "Kan ikke fjerne den seneste redigering af [[$1]] foretaget af [[Bruger:$2|$2]] ([[Bruger diskussion:$2|diskussion]]); en anden har allerede redigeret siden eller fjernet redigeringen. Den seneste redigering er foretaget af [[Bruger:$3|$3]] ([[Bruger diskussion:$3|diskussion]]).",
+"alreadyrolled" => "Kan ikke fjerne den seneste redigering af [[:$1]] foretaget af [[Bruger:$2|$2]] ([[Bruger diskussion:$2|diskussion]]); en anden har allerede redigeret siden eller fjernet redigeringen. Den seneste redigering er foretaget af [[Bruger:$3|$3]] ([[Bruger diskussion:$3|diskussion]]).",
# only shown if there is an edit comment
"editcomment" => "Kommentaren til redigeringen var: \"<i>$1</i>\".",
"revertpage" => "Gendannelse til seneste version ved $1, fjerner ændringer fra $2",
@@ -1181,7 +1182,7 @@ MÃ¥lartiklen "[[$1]]" eksisterer allerede. Vil du slette den for at lave plads t
'accesskey-minoredit' => 'i',
'accesskey-save' => 's',
'accesskey-preview' => 'p',
-'accesskey-diff' => 'd',
+'accesskey-diff' => 'v',
'accesskey-compareselectedversions' => 'v',
# tooltip help for some actions, most are in Monobook.js
@@ -1189,13 +1190,13 @@ MÃ¥lartiklen "[[$1]]" eksisterer allerede. Vil du slette den for at lave plads t
'tooltip-minoredit' => 'Marker dette som en mindre ændring [alt-i]',
'tooltip-save' => 'Gem dine ændringer [alt-s]',
'tooltip-preview' => 'Forhåndsvis dine ændringer, brug venligst denne funktion inden du gemmer! [alt-p]',
-'tooltip-diff' => 'Vis hvilke ændringer du har lavet i teksten. [alt-d]',
+'tooltip-diff' => 'Vis hvilke ændringer du har lavet i teksten. [alt-v]',
'tooltip-compareselectedversions' => 'Se forskellene imellem de to valgte versioner af denne side. [alt-v]',
'tooltip-watch' => 'Tilføj denne side til din overvågningsliste [alt-w]',
# stylesheets
-#'Monobook.css' => '/* edit this file to customize the monobook skin for the entire site */',
-#'Monobook.js' => '/* redigér denne fil for at ændre js-indstillinger i monobook-udseendet */',
+#'monobook.css' => '/* edit this file to customize the monobook skin for the entire site */',
+#'monobook.js' => '/* redigér denne fil for at ændre js-indstillinger i monobook-udseendet */',
# Metadata
'nodublincore' => 'Dublin Core RDF-metadata er slået fra på denne server.',
@@ -1248,7 +1249,7 @@ MÃ¥lartiklen "[[$1]]" eksisterer allerede. Vil du slette den for at lave plads t
'rcpatroldisabledtext' => "Funktionen til seneste ændringer-patruljeringen er pt. slået fra.",
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Min brugerside\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Brugersiden for den ip-adresse du redigerer som\');
@@ -1259,7 +1260,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Listen over sider du overvåger for æn
ta[\'pt-mycontris\'] = new Array(\'y\',\'Listen over dine bidrag\');
ta[\'pt-login\'] = new Array(\'o\',\'Du opfordres til at logge på, men det er ikke obligatorisk.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Du opfordres til at logge på, men det er ikke obligatorisk\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Log af\');
+ta[\'pt-logout\'] = new Array(\'\',\'Log af\');
ta[\'ca-talk\'] = new Array(\'t\',\'Diskussion om indholdet på siden\');
ta[\'ca-edit\'] = new Array(\'e\',\'Du kan redigere denne side. Brug venligst forhåndsvisning før du gemmer.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Tilføj en kommentar til denne diskussion.\');
diff --git a/languages/messages/MessagesDe.php b/languages/messages/MessagesDe.php
index a4ad1377..19537cad 100644
--- a/languages/messages/MessagesDe.php
+++ b/languages/messages/MessagesDe.php
@@ -60,6 +60,80 @@ $bookstoreList = array(
$separatorTransformTable = array(',' => '.', '.' => ',' );
$linkTrail = '/^([äöüßa-z]+)(.*)$/sDu';
+/**
+ * Alternate names of special pages. All names are case-insensitive. The first
+ * listed alias will be used as the default. Aliases from the fallback
+ * localisation (usually English) will be included by default.
+ *
+ * This array may be altered at runtime using the LangugeGetSpecialPageAliases
+ * hook.
+ */
+$specialPageAliases = array(
+ 'DoubleRedirects' => array( 'Doppelte_Weiterleitungen' ),
+ 'BrokenRedirects' => array( 'Kaputte_Weiterleitungen' ),
+ 'Disambiguations' => array( 'Begriffsklärungsverweise' ),
+ 'Userlogin' => array( 'Anmelden' ),
+ 'Userlogout' => array( 'Abmelden' ),
+ 'Preferences' => array( 'Einstellungen' ),
+ 'Watchlist' => array( 'Beobachtungsliste' ),
+ 'Recentchanges' => array( 'Letzte_Änderungen' ),
+ 'Upload' => array( 'Hochladen' ),
+ 'Imagelist' => array( 'Dateien', 'Dateiliste' ),
+ 'Newimages' => array( 'Neue_Dateien' ),
+ 'Listusers' => array( 'Benutzer' ),
+ 'Statistics' => array( 'Statistik' ),
+ 'Randompage' => array( 'Zufällige_Seite' ),
+ 'Lonelypages' => array( 'Verwaiste_Seiten' ),
+ 'Uncategorizedpages' => array( 'Nicht_kategorisierte_Seiten' ),
+ 'Uncategorizedcategories' => array( 'Nicht_kategorisierte_Kategorien' ),
+ 'Uncategorizedimages' => array( 'Nicht_kategorisierte_Dateien' ),
+ 'Unusedcategories' => array( 'Unbenutzte_Kategorien' ),
+ 'Unusedimages' => array( 'Unbenutzte_Dateien' ),
+ 'Wantedpages' => array( 'Gewünschte_Seiten' ),
+ 'Wantedcategories' => array( 'Gewünschte_Kategorien' ),
+ 'Mostlinked' => array( 'Meistverlinkte_Seiten' ),
+ 'Mostlinkedcategories' => array( 'Meistbenutzte_Kategorien' ),
+ 'Mostcategories' => array( 'Meistkategorisierte_Seiten' ),
+ 'Mostimages' => array( 'Meistbenutzte_Dateien' ),
+ 'Mostrevisions' => array( 'Meistbearbeitete_Seiten' ),
+ 'Shortpages' => array( 'Kürzeste_Seiten' ),
+ 'Longpages' => array( 'Längste_Seiten' ),
+ 'Newpages' => array( 'Neue_Seiten' ),
+ 'Ancientpages' => array( 'Älteste_Seiten' ),
+ 'Deadendpages' => array( 'Sackgassenseiten' ),
+ 'Allpages' => array( 'Alle_Seiten' ),
+ 'Prefixindex' => array( 'Präfixindex' ) ,
+ 'Ipblocklist' => array( 'Gesperrte_IPs' ),
+ 'Specialpages' => array( 'Spezialseiten' ),
+ 'Contributions' => array( 'Beiträge' ),
+ 'Emailuser' => array( 'E-Mail' ),
+ 'Whatlinkshere' => array( 'Verweisliste' ),
+ 'Recentchangeslinked' => array( 'Änderungen_an_verlinkten_Seiten' ),
+ 'Movepage' => array( 'Verschieben' ),
+ 'Blockme' => array( 'Proxy-Sperre' ),
+ 'Booksources' => array( 'ISBN-Suche' ),
+ 'Categories' => array( 'Kategorien' ),
+ 'Export' => array( 'Exportieren' ),
+ 'Version' => array( 'Version' ),
+ 'Allmessages' => array( 'MediaWiki-Systemnachrichten' ),
+ 'Log' => array( 'Logbuch' ),
+ 'Blockip' => array( 'Sperren' ),
+ 'Undelete' => array( 'Wiederherstellen' ),
+ 'Import' => array( 'Importieren' ),
+ 'Lockdb' => array( 'Datenbank_sperren' ),
+ 'Unlockdb' => array( 'Datenbank_entsperren' ),
+ 'Userrights' => array( 'Benutzerrechte' ),
+ 'MIMEsearch' => array( 'MIME-Typ-Suche' ),
+ 'Unwatchedpages' => array( 'Ignorierte_Seiten', 'Unbeobachtete_Seiten' ),
+ 'Listredirects' => array( 'Weiterleitungen' ),
+ 'Revisiondelete' => array( 'Versionslöschung' ),
+ 'Unusedtemplates' => array( 'Unbenutzte_Vorlagen' ),
+ 'Randomredirect' => array( 'Zufällige_Weiterleitung' ),
+ 'Mypage' => array( 'Meine_Benutzerseite' ),
+ 'Mytalk' => array( 'Meine_Diskussionsseite' ),
+ 'Mycontributions' => array( 'Meine_Beiträge' ),
+ 'Listadmins' => array( 'Administratoren' ),
+ 'Search' => array( 'Suche' ),);
$dateFormats = array(
'mdy time' => 'H:i',
'mdy date' => 'M j. Y',
@@ -75,997 +149,1101 @@ $dateFormats = array(
);
$messages = array(
-
-# stylesheets
-'Common.css' => '/** CSS an dieser Stelle wirkt sich auf alle Skins aus */',
-'Monobook.css' => '/** Kleinschreibung nicht erzwingen */
-.portlet h5,
-.portlet h6,
-#p-personal ul,
-#p-cactions li a {
- text-transform: none;
-}',
-
# User preference toggles
-"tog-underline" => "Verweise unterstreichen:",
-'tog-highlightbroken' => 'Verweise auf leere Seiten hervorheben',
-"tog-justify" => "Text als Blocksatz",
-'tog-hideminor' => 'Kleine Änderungen ausblenden',
-'tog-extendwatchlist' => 'Erweiterte Beobachtungsliste',
-'tog-usenewrc' => 'Erweiterte Darstellung (JavaScript)',
-'tog-numberheadings' => 'Ãœberschriften automatisch nummerieren',
-'tog-showtoolbar' => 'Bearbeiten-Werkzeugleiste anzeigen',
-"tog-editondblclick" => "Seiten mit Doppelklick bearbeiten (JavaScript)",
-"tog-editsection" => "Links zum Bearbeiten einzelner Absätze anzeigen",
-"tog-editsectiononrightclick" => "Einzelne Absätze per Rechtsklick bearbeiten (JavaScript)",
-"tog-showtoc" => "Anzeigen eines Inhaltsverzeichnisses bei Seiten mit mehr als 3 Ãœberschriften",
-'tog-rememberpassword' => 'Benutzer auf diesem Computer dauerhaft anmelden',
-"tog-editwidth" => "Text-Eingabefeld mit voller Breite",
-'tog-watchcreations' => 'Selbst erstellte Seiten automatisch zu meiner Beobachtungsliste hinzufügen',
-"tog-watchdefault" => "Neue und geänderte Seiten beobachten",
-'tog-minordefault' => 'Alle eigenen Änderungen als geringfügig markieren',
-'tog-previewontop' => 'Vorschau oberhalb des Bearbeitungsfensters anzeigen',
-'tog-previewonfirst' => 'Beim ersten Bearbeiten immer die Vorschau anzeigen',
-"tog-nocache" => "Seitencache deaktivieren",
-'tog-enotifwatchlistpages' => 'Bei Änderungen an beobachteten Seiten E-Mails senden.',
-'tog-enotifusertalkpages' => 'Bei Änderungen an meiner Benutzer-Diskussionsseite E-Mails senden.',
-'tog-enotifminoredits' => 'Auch bei kleinen Änderungen an beobachteten Seiten E-Mails senden.',
-'tog-enotifrevealaddr' => 'Ihre E-Mail-Adresse wird in Benachrichtigungsmails gezeigt',
-'tog-shownumberswatching' => 'Anzahl der beobachtenden Benutzer anzeigen',
-'tog-fancysig' => 'Signatur ohne Verlinkung zur Benutzerseite',
-'tog-externaleditor' => 'Externen Editor als Standard benutzen',
-'tog-externaldiff' => 'Externes Diff-Programm als Standard benutzen',
-'tog-showjumplinks' => '„Wechseln-zu“-Links ermöglichen',
-'tog-uselivepreview' => 'Live-Vorschau nutzen (JavaScript) (experimentell)',
-'tog-autopatrol' => 'Alle eigenen Bearbeitungen als „kontrolliert“ markieren',
-'tog-forceeditsummary' => 'Warne mich, wenn ich beim Ändern eine Zusammenfassung vergesse',
-'tog-watchlisthideown' => 'Eigene Änderungen auf der Beobachtungsliste ausblenden',
-'tog-watchlisthidebots' => 'Bot-Änderungen auf der Beobachtungsliste ausblenden',
-
-'underline-always' => 'Immer',
-'underline-never' => 'Niemals',
-'underline-default' => 'Browsereinstellungen verwenden',
+'tog-underline' => 'Verweise unterstreichen:',
+'tog-highlightbroken' => 'Verweise auf leere Seiten hervorheben',
+'tog-justify' => 'Text als Blocksatz',
+'tog-hideminor' => 'Kleine Änderungen ausblenden',
+'tog-extendwatchlist' => 'Erweiterte Beobachtungsliste',
+'tog-usenewrc' => 'Erweiterte Darstellung (benötigt JavaScript)',
+'tog-numberheadings' => 'Ãœberschriften automatisch nummerieren',
+'tog-showtoolbar' => 'Bearbeiten-Werkzeugleiste anzeigen',
+'tog-editondblclick' => 'Seiten mit Doppelklick bearbeiten (JavaScript)',
+'tog-editsection' => 'Links zum Bearbeiten einzelner Absätze anzeigen',
+'tog-editsectiononrightclick' => 'Einzelne Absätze per Rechtsklick bearbeiten (JavaScript)',
+'tog-showtoc' => 'Anzeigen eines Inhaltsverzeichnisses bei Seiten mit mehr als 3 Ãœberschriften',
+'tog-rememberpassword' => 'Benutzer soll auf diesem Computer dauerhaft angemeldet bleiben',
+'tog-editwidth' => 'Text-Eingabefeld mit voller Breite',
+'tog-watchcreations' => 'Selbst erstellte Seiten automatisch beobachten',
+'tog-watchdefault' => 'Selbst geänderte und neu erstellte Seiten automatisch beobachten',
+'tog-watchmoves' => 'Selbst verschobene Seiten automatisch beobachten',
+'tog-watchdeletion' => 'Selbst gelöschte Seiten automatisch beobachten',
+'tog-minordefault' => 'Alle eigenen Änderungen als geringfügig markieren',
+'tog-previewontop' => 'Vorschau oberhalb des Bearbeitungsfensters anzeigen',
+'tog-previewonfirst' => 'Beim ersten Bearbeiten immer die Vorschau anzeigen',
+'tog-nocache' => 'Seitencache deaktivieren',
+'tog-enotifwatchlistpages' => 'Bei Änderungen an beobachteten Seiten E-Mails senden.',
+'tog-enotifusertalkpages' => 'Bei Änderungen an meiner Benutzer-Diskussionsseite E-Mails senden.',
+'tog-enotifminoredits' => 'Auch bei kleinen Änderungen an beobachteten Seiten E-Mails senden.',
+'tog-enotifrevealaddr' => 'Ihre E-Mail-Adresse wird in Benachrichtigungsmails gezeigt',
+'tog-shownumberswatching' => 'Anzahl der beobachtenden Benutzer anzeigen',
+'tog-fancysig' => 'Signatur ohne Verlinkung zur Benutzerseite',
+'tog-externaleditor' => 'Externen Editor als Standard benutzen',
+'tog-externaldiff' => 'Externes Diff-Programm als Standard benutzen',
+'tog-showjumplinks' => '„Wechseln-zu“-Links ermöglichen',
+'tog-uselivepreview' => 'Live-Vorschau nutzen (JavaScript) (experimentell)',
+'tog-forceeditsummary' => 'Warnen, wenn beim Speichern die Zusammenfassung fehlt',
+'tog-watchlisthideown' => 'Eigene Bearbeitungen in der Beobachtungsliste ausblenden',
+'tog-watchlisthidebots' => 'Bearbeitungen durch Bots in der Beobachtungsliste ausblenden',
+'tog-watchlisthideminor' => 'Kleine Bearbeitungen in der Beobachtungsliste ausblenden',
+'tog-nolangconversion' => 'Konvertierung von Sprachvarianten deaktivieren',
+'tog-ccmeonemails' => 'Schicke mir Kopien der E-Mails, die ich anderen Benutzern sende.',
+
+'underline-always' => 'immer',
+'underline-never' => 'nie',
+'underline-default' => 'von Browsereinstellung abhängig',
'skinpreview' => '(Vorschau)',
-
# Dates
-'sunday' => 'Sonntag',
-'monday' => 'Montag',
-'tuesday' => 'Dienstag',
-'wednesday' => 'Mittwoch',
-'thursday' => 'Donnerstag',
-'friday' => 'Freitag',
-'saturday' => 'Samstag',
-'sun' => 'So',
-'mon' => 'Mo',
-'tue' => 'Di',
-'wed' => 'Mi',
-'thu' => 'Do',
-'fri' => 'Fr',
-'sat' => 'Sa',
-'january' => 'Januar',
-'february' => 'Februar',
-'march' => 'März',
-'april' => 'April',
-'may_long' => 'Mai',
-'june' => 'Juni',
-'july' => 'Juli',
-'august' => 'August',
-'september' => 'September',
-'october' => 'Oktober',
-'november' => 'November',
-'december' => 'Dezember',
-'january-gen' => 'Januars',
-'february-gen' => 'Februars',
-'march-gen' => 'Märzes',
-'april-gen' => 'Aprils',
-'may-gen' => 'Mais',
-'june-gen' => 'Junis',
-'july-gen' => 'Julis',
-'august-gen' => 'Augusts',
-'september-gen' => 'Septembers',
-'october-gen' => 'Oktobers',
-'november-gen' => 'Novembers',
-'december-gen' => 'Dezembers',
-'jan' => 'Jan',
-'feb' => 'Feb',
-'mar' => 'Mär',
-'apr' => 'Apr',
-'may' => 'Mai',
-'jun' => 'Jun',
-'jul' => 'Jul',
-'aug' => 'Aug',
-'sep' => 'Sep',
-'oct' => 'Okt',
-'nov' => 'Nov',
-'dec' => 'Dez',
-
-
-# Bits of text used by many pages:
-#
-'categories' => '{{PLURAL:$1|Kategorie|Kategorien}}',
-'category_header' => 'Seiten in der Kategorie „$1“',
-"subcategories" => "Unterkategorien",
-"mainpage" => "Hauptseite",
-'mainpagetext' => 'MediaWiki wurde erfolgreich installiert.',
-'mainpagedocfooter' => 'Hilfe zur Benutzung und Konfiguration der Wiki Software finden Sie im [http://meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].',
-'portal' => "{{SITENAME}}-Portal",
-'portal-url' => '{{ns:project}}:Portal',
-"about" => "Ãœber",
-"aboutsite" => "Ãœber {{SITENAME}}",
-"aboutpage" => "{{ns:project}}:Ãœber_{{SITENAME}}",
-"article" => "Seite",
-"help" => "Hilfe",
-'helppage' => '{{ns:project}}:Hilfe',
-"bugreports" => "Kontakt",
-'bugreportspage' => '{{ns:project}}:Kontakt',
-"sitesupport" => "Spenden",
-'sitesupport-url' => '{{ns:project}}:Spenden',
-"faq" => "FAQ",
-'faqpage' => '{{ns:project}}:FAQ',
-"edithelp" => "Bearbeitungshilfe",
-'newwindow' => '(öffnet ein neues Fenster)',
-'edithelppage' => '{{ns:project}}:Bearbeitungshilfe',
-'cancel' => 'Abbrechen',
-"qbfind" => "Finden",
-"qbbrowse" => "Blättern",
-"qbedit" => "Ändern",
-"qbpageoptions" => "Seitenoptionen",
-"qbpageinfo" => "Seitendaten",
-"qbmyoptions" => "Einstellungen",
-"qbspecialpages" => "Spezialseiten",
-"moredotdotdot" => "Mehr...",
-'mypage' => 'Eigene Seite',
-'mytalk' => 'Eigene Diskussion',
-"anontalk" => "Diskussionsseite dieser IP",
-"navigation" => "Navigation",
-"currentevents" => "Aktuelle Ereignisse",
-'currentevents-url' => 'Aktuelle Ereignisse',
-'disclaimers' => 'Impressum',
-'disclaimerpage' => '{{ns:project}}:Impressum',
-'privacy' => 'Datenschutz',
-'privacypage' => '{{ns:project}}:Datenschutz',
-"errorpagetitle" => "Fehler",
-"returnto" => "Zurück zu $1.",
-'tagline' => 'Aus {{SITENAME}}',
-"help" => "Hilfe",
-"search" => "Suche",
-"searchbutton" => "Suche",
-"history" => "Versionen",
-'info_short' => 'Information',
-'history_short' => 'Versionen/Autoren',
-"printableversion" => "Druckversion",
-'print' => 'Drucken',
-"editthispage" => "Seite bearbeiten",
-"delete" => "löschen",
-"deletethispage" => "Diese Seite löschen",
-'undelete_short' => '{{PLURAL:$1|eine Änderung|$1 Änderungen}} wiederherstellen',
-"protect" => "schützen",
-'protectthispage' => 'Seite schützen',
-'unprotect' => 'freigeben',
-"unprotectthispage" => "Schutz aufheben",
-"newpage" => "Neue Seite",
-"talkpage" => "Diskussion",
-"specialpage" => "Spezialseite",
-"personaltools" => "Persönliche Werkzeuge",
-"postcomment" => "Kommentar hinzufügen",
-"articlepage" => "Seite",
-"toolbox" => "Werkzeuge",
-"projectpage" => "Meta-Text",
-"userpage" => "Benutzerseite",
-"imagepage" => "Bildseite",
-'mediawikipage' => 'Inhaltsseite anzeigen',
-'templatepage' => 'Vorlagenseite anzeigen',
-'viewhelppage' => 'Hilfeseite anzeigen',
-'categorypage' => 'Kategorieseite anzeigen',
-"viewtalkpage" => "Diskussion",
-"otherlanguages" => "Andere Sprachen",
-"redirectedfrom" => "(Weitergeleitet von $1)",
-'autoredircomment' => 'Weiterleitung nach [[$1]]',
-'redirectpagesub' => 'Weiterleitung',
-'lastmodifiedat' => 'Diese Seite wurde zuletzt am $1 um $2 Uhr geändert.',
-"viewcount" => "Diese Seite wurde bisher $1 mal abgerufen.",
-"copyright" => "Inhalt ist verfügbar unter der $1.",
-"protectedpage" => "Geschützte Seite",
-'jumpto' => 'Wechseln zu:',
-'jumptonavigation' => 'Navigation',
-'jumptosearch' => 'Suche',
-'badaccess' => 'Keine ausreichenden Rechte.',
-'badaccess-group0' => 'Sie haben nicht die erforderliche Berechtigung für diese Aktion.',
-'badaccess-group1' => 'Diese Aktion ist beschränkt auf Benutzer, die der Gruppe $1 angehören.',
-'badaccess-group2' => 'Diese Aktion ist beschränkt auf Benutzer, die einer der Gruppen $1 angehören.',
-'badaccess-groups' => 'Diese Aktion ist beschränkt auf Benutzer, die einer der Gruppen $1 angehören.',
-'versionrequired' => 'Version $1 von MediaWiki ist erforderlich',
-'versionrequiredtext' => 'Version $1 von MediaWiki ist erforderlich um diese Seite zu nutzen. Siehe [[{{ns:special}}:Version]]',
-'nbytes' => '$1 {{PLURAL:$1|Byte|Bytes}}',
-'ncategories' => '$1 {{PLURAL:$1|Kategorie|Kategorien}}',
-'nrevisions' => '{{PLURAL:$1|eine Bearbeitung|$1 Bearbeitungen}}',
-'go' => 'Ausführen',
-'searcharticle' => 'Seite',
-"ok" => "Suche",
-'pagetitle' => '$1 - {{SITENAME}}',
-'retrievedfrom' => 'Von „$1“',
-'youhavenewmessages' => 'Sie haben $1 ($2).',
-"newmessageslink" => "neue Nachrichten",
-'newmessagesdifflink' => 'Unterschied zur vorletzten Version',
-"editsection" => "bearbeiten",
-"editold" => "bearbeiten",
-'editsectionhint' => 'Abschnitt bearbeiten: $1',
-"toc" => "Inhaltsverzeichnis",
-"showtoc" => "Anzeigen",
-"hidetoc" => "Verbergen",
-"thisisdeleted" => "Ansehen oder wiederherstellen von $1?",
-'viewdeleted' => '$1 anzeigen?',
-'restorelink' => '{{PLURAL:$1|einer gelöschten Version|$1 gelöschten Versionen}}',
-"feedlinks" => "Feed:",
-'feed-invalid' => 'Ungültiger Abonnement-Typ.',
-'permalink' => 'Permanentlink',
-"listingcontinuesabbrev" => "(Forts.)",
-
-# Kurzworte für jeden Namespace, u.a. von MonoBook verwendet
-'nstab-main' => 'Seite',
-'nstab-user' => 'Benutzerseite',
-'nstab-media' => 'Media',
-'nstab-special' => 'Spezial',
-'nstab-project' => 'Portalseite',
-'nstab-image' => 'Datei',
-'nstab-mediawiki' => 'MediaWiki-Systemtext',
-'nstab-template' => 'Vorlage',
-'nstab-help' => 'Hilfeseite',
-'nstab-category' => 'Kategorie',
-
-# Editier-Werkzeugleiste
-"bold_sample"=>"Fetter Text",
-"bold_tip"=>"Fetter Text",
-"italic_sample"=>"Kursiver Text",
-"italic_tip"=>"Kursiver Text",
-"link_sample"=>"Link-Text",
-"link_tip"=>"Interner Link",
-"extlink_sample"=>"http://www.beispiel.de Link-Text",
-"extlink_tip"=>"Externer Link (http:// beachten)",
-"headline_sample"=>"Ebene 2 Ãœberschrift",
-"headline_tip"=>"Ebene 2 Ãœberschrift",
-"math_sample"=>"Formel hier einfügen",
-"math_tip"=>"Mathematische Formel (LaTeX)",
-"nowiki_sample"=>"Unformatierten Text hier einfügen",
-"nowiki_tip"=>"Unformatierter Text",
-"image_sample"=>"Beispiel.jpg",
-'image_tip' => 'Bildverweis',
-'media_sample' => 'Beispiel.ogg',
-"media_tip"=>"Mediendatei-Verweis",
-"sig_tip"=>"Ihre Signatur mit Zeitstempel",
-"hr_tip"=>"Horizontale Linie (sparsam verwenden)",
+'sunday' => 'Sonntag',
+'monday' => 'Montag',
+'tuesday' => 'Dienstag',
+'wednesday' => 'Mittwoch',
+'thursday' => 'Donnerstag',
+'friday' => 'Freitag',
+'saturday' => 'Samstag',
+'sun' => 'So',
+'mon' => 'Mo',
+'tue' => 'Di',
+'wed' => 'Mi',
+'thu' => 'Do',
+'fri' => 'Fr',
+'sat' => 'Sa',
+'january' => 'Januar',
+'february' => 'Februar',
+'march' => 'März',
+'april' => 'April',
+'may_long' => 'Mai',
+'june' => 'Juni',
+'july' => 'Juli',
+'august' => 'August',
+'september' => 'September',
+'october' => 'Oktober',
+'november' => 'November',
+'december' => 'Dezember',
+'january-gen' => 'Januars',
+'february-gen' => 'Februars',
+'march-gen' => 'Märzes',
+'april-gen' => 'Aprils',
+'may-gen' => 'Mais',
+'june-gen' => 'Junis',
+'july-gen' => 'Julis',
+'august-gen' => 'Augusts',
+'september-gen' => 'Septembers',
+'october-gen' => 'Oktobers',
+'november-gen' => 'Novembers',
+'december-gen' => 'Dezembers',
+'jan' => 'Jan',
+'feb' => 'Feb',
+'mar' => 'Mär',
+'apr' => 'Apr',
+'may' => 'Mai',
+'jun' => 'Jun',
+'jul' => 'Jul',
+'aug' => 'Aug',
+'sep' => 'Sep',
+'oct' => 'Okt',
+'nov' => 'Nov',
+'dec' => 'Dez',
+
+# Bits of text used by many pages
+'categories' => 'Kategorien',
+'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorien}}',
+'category_header' => 'Seiten in der Kategorie „$1“',
+'subcategories' => 'Unterkategorien',
+'category-media-header' => 'Medien in der Kategorie „$1“',
+
+'mainpage' => 'Hauptseite',
+'mainpagetext' => 'MediaWiki wurde erfolgreich installiert.',
+'mainpagedocfooter' => 'Hilfe zur Benutzung und Konfiguration der Wiki Software finden Sie im [http://meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].',
+
+'portal' => '{{SITENAME}}-Portal',
+'portal-url' => '{{ns:project}}:Portal',
+'about' => 'Ãœber',
+'aboutsite' => 'Ãœber {{SITENAME}}',
+'aboutpage' => '{{ns:project}}:Ãœber_{{SITENAME}}',
+'article' => 'Seite',
+'help' => 'Hilfe',
+'helppage' => '{{ns:project}}:Hilfe',
+'bugreports' => 'Kontakt',
+'bugreportspage' => '{{ns:project}}:Kontakt',
+'sitesupport' => 'Spenden',
+'sitesupport-url' => '{{ns:project}}:Spenden',
+'faq' => 'FAQ',
+'faqpage' => '{{ns:project}}:FAQ',
+'edithelp' => 'Bearbeitungshilfe',
+'newwindow' => '(öffnet ein neues Fenster)',
+'edithelppage' => '{{ns:project}}:Bearbeitungshilfe',
+'cancel' => 'Abbrechen',
+'qbfind' => 'Finden',
+'qbbrowse' => 'Blättern',
+'qbedit' => 'Ändern',
+'qbpageoptions' => 'Seitenoptionen',
+'qbpageinfo' => 'Seitendaten',
+'qbmyoptions' => 'Einstellungen',
+'qbspecialpages' => 'Spezialseiten',
+'moredotdotdot' => 'Mehr…',
+'mypage' => 'Eigene Seite',
+'mytalk' => 'Eigene Diskussion',
+'anontalk' => 'Diskussionsseite dieser IP',
+'navigation' => 'Navigation',
+
+# Metadata in edit box
+'metadata_help' => 'Metadaten:',
+
+'currentevents' => 'Aktuelle Ereignisse',
+'currentevents-url' => 'Aktuelle Ereignisse',
+
+'disclaimers' => 'Impressum',
+'disclaimerpage' => '{{ns:project}}:Impressum',
+'privacy' => 'Datenschutz',
+'privacypage' => '{{ns:project}}:Datenschutz',
+'errorpagetitle' => 'Fehler',
+'returnto' => 'Zurück zur Seite $1.',
+'tagline' => 'Aus {{SITENAME}}',
+'search' => 'Suche',
+'searchbutton' => 'Suche',
+'go' => 'Ausführen',
+'searcharticle' => 'Seite',
+'history' => 'Versionen',
+'history_short' => 'Versionen/Autoren',
+'updatedmarker' => '(geändert)',
+'info_short' => 'Information',
+'printableversion' => 'Druckversion',
+'permalink' => 'Permanentlink',
+'print' => 'Drucken',
+'edit' => 'bearbeiten',
+'editthispage' => 'Seite bearbeiten',
+'delete' => 'löschen',
+'deletethispage' => 'Diese Seite löschen',
+'undelete_short' => '{{PLURAL:$1|eine Änderung|$1 Änderungen}} wiederherstellen',
+'protect' => 'schützen',
+'protectthispage' => 'Seite schützen',
+'unprotect' => 'freigeben',
+'unprotectthispage' => 'Schutz aufheben',
+'newpage' => 'Neue Seite',
+'talkpage' => 'Diskussion',
+'specialpage' => 'Spezialseite',
+'personaltools' => 'Persönliche Werkzeuge',
+'postcomment' => 'Kommentar hinzufügen',
+'articlepage' => 'Seite',
+'talk' => 'Diskussion',
+'views' => 'Ansichten',
+'toolbox' => 'Werkzeuge',
+'userpage' => 'Benutzerseite',
+'projectpage' => 'Meta-Text',
+'imagepage' => 'Bildseite',
+'mediawikipage' => 'Inhaltsseite anzeigen',
+'templatepage' => 'Vorlagenseite anzeigen',
+'viewhelppage' => 'Hilfeseite anzeigen',
+'categorypage' => 'Kategorieseite anzeigen',
+'viewtalkpage' => 'Diskussion',
+'otherlanguages' => 'Andere Sprachen',
+'redirectedfrom' => '(Weitergeleitet von $1)',
+'redirectpagesub' => 'Weiterleitung',
+'lastmodifiedat' => 'Diese Seite wurde zuletzt am $1 um $2 Uhr geändert.', # $1 date, $2 time
+'viewcount' => 'Diese Seite wurde bisher $1 mal abgerufen.',
+'copyright' => 'Inhalt ist verfügbar unter der $1.',
+'protectedpage' => 'Geschützte Seite',
+'jumpto' => 'Wechseln zu:',
+'jumptonavigation' => 'Navigation',
+'jumptosearch' => 'Suche',
+
+'badaccess' => 'Keine ausreichenden Rechte.',
+'badaccess-group0' => 'Sie haben nicht die erforderliche Berechtigung für diese Aktion.',
+'badaccess-group1' => 'Diese Aktion ist beschränkt auf Benutzer, die der Gruppe $1 angehören.',
+'badaccess-group2' => 'Diese Aktion ist beschränkt auf Benutzer, die einer der Gruppen $1 angehören.',
+'badaccess-groups' => 'Diese Aktion ist beschränkt auf Benutzer, die einer der Gruppen $1 angehören.',
+
+'versionrequired' => 'Version $1 von MediaWiki ist erforderlich',
+'versionrequiredtext' => 'Version $1 von MediaWiki ist erforderlich, um diese Seite zu nutzen. Siehe [[{{ns:special}}:Version]]',
+
+'ok' => 'Suche',
+'pagetitle' => '$1 − {{SITENAME}}',
+'retrievedfrom' => 'Von „$1“',
+'youhavenewmessages' => 'Sie haben $1 ($2).',
+'newmessageslink' => 'neue Nachrichten',
+'newmessagesdifflink' => 'letzte Änderung',
+'editsection' => 'bearbeiten',
+'editold' => 'bearbeiten',
+'editsectionhint' => 'Abschnitt bearbeiten: $1',
+'toc' => 'Inhaltsverzeichnis',
+'showtoc' => 'Anzeigen',
+'hidetoc' => 'Verbergen',
+'thisisdeleted' => '$1 ansehen oder wiederherstellen?',
+'viewdeleted' => '$1 anzeigen?',
+'restorelink' => '$1 {{PLURAL:$1|gelöschte Version|gelöschte Versionen}}',
+'feedlinks' => 'Feed:',
+'feed-invalid' => 'Ungültiger Abonnement-Typ.',
+'feed-atom' => 'Atom',
+'feed-rss' => 'RSS',
+
+# Short words for each namespace, by default used in the 'article' tab in monobook
+'nstab-main' => 'Seite',
+'nstab-user' => 'Benutzerseite',
+'nstab-media' => 'Media',
+'nstab-special' => 'Spezialseite',
+'nstab-project' => 'Portalseite',
+'nstab-image' => 'Datei',
+'nstab-mediawiki' => 'MediaWiki-Systemtext',
+'nstab-template' => 'Vorlage',
+'nstab-help' => 'Hilfeseite',
+'nstab-category' => 'Kategorie',
# Main script and global functions
-#
-"nosuchaction" => "Diese Aktion gibt es nicht",
-'nosuchactiontext' => 'Die in der URL angegebene Aktion wird von der MediaWiki-Software nicht unterstützt.',
-"nosuchspecialpage" => "Diese Spezialseite gibt es nicht",
-'nospecialpagetext' => 'Sie haben eine nicht vorhandene Spezialseite aufgerufen. Eine Liste aller verfügabren Spezialseiten finden Sie unter [[{{ns:special}}:Specialpages]].',
+'nosuchaction' => 'Diese Aktion gibt es nicht',
+'nosuchactiontext' => 'Die in der URL angegebene Aktion wird von der MediaWiki-Software nicht unterstützt.',
+'nosuchspecialpage' => 'Diese Spezialseite gibt es nicht',
+'nospecialpagetext' => 'Die aufgerufene Spezialseite ist nicht vorhanden. Eine Liste aller verfügbaren Spezialseiten findet sich unter [[{{ns:special}}:Specialpages]].',
# General errors
-#
-"error" => "Fehler",
-"databaseerror" => "Fehler in der Datenbank",
-'dberrortext' => 'Es gab einen Syntaxfehler in der Datenbankabfrage.
+'error' => 'Fehler',
+'databaseerror' => 'Fehler in der Datenbank',
+'dberrortext' => 'Es gab einen Syntaxfehler in der Datenbankabfrage.
Die letzte Datenbankabfrage lautete: <blockquote><tt>$1</tt></blockquote> aus der Funktion „<tt>$2</tt>“.
MySQL meldete den Fehler „<tt>$3: $4</tt>“.',
-'dberrortextcl' => 'Es gab einen Syntaxfehler in der Datenbankabfrage.
+'dberrortextcl' => 'Es gab einen Syntaxfehler in der Datenbankabfrage.
Die letzte Datenbankabfrage lautete: „$1“ aus der Funktion „<tt>$2</tt>“.
MySQL meldete den Fehler: „<tt>$3: $4</tt>“.',
-"noconnect" => "Konnte keine Verbindung zur Datenbank auf $1 herstellen",
-"nodb" => "Konnte Datenbank $1 nicht auswählen",
-'cachederror' => 'Das Folgende ist eine Kopie aus dem Cache und möglicherweise nicht aktuell.',
-'laggedslavemode' => 'Warnung: Die angezeigte Seite kann unter Umständen die jüngsten Änderungen noch nicht beinhalten.',
-"readonly" => "Datenbank ist gesperrt",
-'enterlockreason' => 'Bitte geben Sie einen Grund ein, warum die Datenbank gesperrt werden soll und eine Abschätzung über die Dauer der Sperrung',
-'readonlytext' => 'Die Datenbank ist vorübergehend für Neueinträge und Änderungen gesperrt. Bitte versuchen Sie es später noch einmal.
+'noconnect' => 'Konnte keine Verbindung zur Datenbank auf $1 herstellen',
+'nodb' => 'Konnte Datenbank $1 nicht auswählen',
+'cachederror' => 'Das Folgende ist eine Kopie aus dem Cache und möglicherweise nicht aktuell.',
+'laggedslavemode' => 'Achtung: Die angezeigte Seite enthält unter Umständen nicht die jüngsten Bearbeitungen.',
+'readonly' => 'Datenbank ist gesperrt',
+'enterlockreason' => 'Bitte geben Sie einen Grund ein, warum die Datenbank gesperrt werden soll und eine Abschätzung über die Dauer der Sperrung',
+'readonlytext' => 'Die Datenbank ist vorübergehend für Neueinträge und Änderungen gesperrt. Bitte versuchen Sie es später noch einmal.
Grund der Sperrung: $1',
-'missingarticle' => 'Der Text für „$1“ wurde nicht in der Datenbank gefunden.
+'missingarticle' => 'Der Text für „$1“ wurde nicht in der Datenbank gefunden.
Die Seite ist möglicherweise gelöscht oder verschoben worden.
Falls dies nicht der Fall ist, haben Sie eventuell einen Fehler in der Software gefunden. Bitte melden Sie dies einem [[{{ns:project}}:Administrator]] unter Nennung der URL.',
-'readonly_lag' => 'Die Datenbank wurde kurzzeitig automatisch gesperrt, damit sich die Datenbanken abgleichen können.',
-"internalerror" => "Interner Fehler",
-'filecopyerror' => 'Konnte Datei „$1“ nicht nach „$2“ kopieren.',
-'filerenameerror' => 'Konnte Datei „$1“ nicht nach „$2“ umbenennen.',
-'filedeleteerror' => 'Konnte Datei „$1“ nicht löschen.',
-'filenotfound' => 'Konnte Datei „$1“ nicht finden.',
-'unexpected' => 'Unerwarteter Wert: „$1“=„$2“.',
-'formerror' => 'Fehler: Die Eingaben konnten nicht verarbeitet werden.',
-'badarticleerror' => 'Diese Aktion kann auf diese Seite nicht angewendet werden.',
-'cannotdelete' => 'Die gewählte Seite kann nicht gelöscht werden. Möglicherweise wurde sie bereits gelöscht.',
-"badtitle" => "Ungültiger Titel",
-'badtitletext' => 'Der Titel der angeforderten Seite ist ungültig, leer, oder ein ungültiger Sprachlink von einem anderen Wiki.',
-'perfdisabled' => '\'\'\'Entschuldigung!\'\'\' Diese Funktion wurde wegen Überlastung des Servers vorübergehend deaktiviert.',
-"perfdisabledsub" => "Hier ist eine gespeicherte Kopie von $1:",
-"perfcached" => "Die folgenden Daten stammen aus dem Cache und sind möglicherweise nicht aktuell:",
-'perfcachedts' => 'Diese Daten stammen aus dem Cache, letztes Update: $1',
-'wrong_wfQuery_params' => 'Falsche Parameter für wfQuery()<br />
+'readonly_lag' => 'Die Datenbank wurde kurzzeitig automatisch gesperrt, damit sich die Datenbanken abgleichen können.',
+'internalerror' => 'Interner Fehler',
+'filecopyerror' => 'Die Datei „$1“ konnte nicht nach „$2“ kopiert werden.',
+'filerenameerror' => 'Die Datei „$1“ konnte nicht nach „$2“ umbenannt werden.',
+'filedeleteerror' => 'Die Datei „$1“ konnte nicht gelöscht werden.',
+'filenotfound' => 'Die Datei „$1“ wurde nicht gefunden.',
+'unexpected' => 'Unerwarteter Wert: „$1“=„$2“.',
+'formerror' => 'Fehler: Die Eingaben konnten nicht verarbeitet werden.',
+'badarticleerror' => 'Diese Aktion kann auf diese Seite nicht angewendet werden.',
+'cannotdelete' => 'Die gewählte Seite kann nicht gelöscht werden. Möglicherweise wurde sie bereits gelöscht.',
+'badtitle' => 'Ungültiger Titel',
+'badtitletext' => 'Der Titel der angeforderten Seite ist ungültig, leer oder ein ungültiger Sprachlink von einem anderen Wiki.',
+'perfdisabled' => "'''Entschuldigung!''' Diese Funktion wurde wegen Überlastung des Servers vorübergehend deaktiviert.",
+'perfdisabledsub' => 'Hier ist eine gespeicherte Kopie von $1:', # obsolete?
+'perfcached' => 'Die folgenden Daten stammen aus dem Cache und sind möglicherweise nicht aktuell:',
+'perfcachedts' => 'Diese Daten stammen aus dem Cache, letztes Update: $1',
+'querypage-no-updates' => 'Die Aktualisierungsfunktion für diese Seite ist zur Zeit deaktiviert. Die Daten werden bis auf weiteres nicht erneuert.',
+'wrong_wfQuery_params' => 'Falsche Parameter für wfQuery()<br />
Funktion: $1<br />
Abfrage: $2',
-"viewsource" => "Quelltext betrachten",
-'viewsourcefor' => 'für $1',
-'protectedtext' => 'Diese Seite ist für das Bearbeiten gesperrt. Sie können jedoch den Quelltext dieser Seite betrachten und kopieren:',
-'protectedinterface' => 'Diese Seite enthält Text für die Benutzeroberfläche der MediaWiki-Software und ist gesperrt, um Missbrauch zu verhindern.',
-'editinginterface' => '\'\'\'Warnung:\'\'\' Diese Seite enthält von der MediaWiki-Software benutzten Text. Änderungen wirken sich auf die Benutzeroberfläche aus.',
-'sqlhidden' => '(SQL-Abfrage versteckt)',
-
+'viewsource' => 'Quelltext betrachten',
+'viewsourcefor' => 'für $1',
+'protectedpagetext' => 'Diese Seite ist für das Bearbeiten gesperrt.',
+'viewsourcetext' => 'Sie können jedoch den Quelltext dieser Seite betrachten und kopieren:',
+'protectedinterface' => 'Diese Seite enthält Text für das Sprach-Interface der Software und ist gesperrt, um Missbrauch zu verhindern.',
+'editinginterface' => "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software benutzten Text. Änderungen wirken sich auf die Benutzeroberfläche aus.",
+'sqlhidden' => '(SQL-Abfrage versteckt)',
# Login and logout pages
-#
-"logouttitle" => "Benutzer-Abmeldung",
-"logouttext" => "Sie sind nun abgemeldet.
-Sie können {{SITENAME}} jetzt anonym weiterbenutzen, oder sich unter dem selben oder einem anderen Benutzernamen wieder anmelden.",
-'welcomecreation' => '== Willkommen, $1! ==
+'logouttitle' => 'Benutzer-Abmeldung',
+'logouttext' => 'Sie sind nun abgemeldet.
+Sie können {{SITENAME}} jetzt anonym weiterbenutzen, oder sich unter dem selben oder einem anderen Benutzernamen wieder anmelden.',
+'welcomecreation' => '== Willkommen, $1! ==
Ihr Benutzerkonto wurde eingerichtet. Vergessen Sie nicht, Ihre Einstellungen anzupassen.',
-
-"loginpagetitle" => "Benutzer-Anmeldung",
-"yourname" => "Benutzername",
-"yourpassword" => "Passwort",
-"yourpasswordagain" => "Passwort wiederholen",
-'remembermypassword' => 'Benutzer auf diesem Computer dauerhaft anmelden',
-'yourdomainname' => 'Ihre Domain',
-'externaldberror' => 'Entweder es liegt ein Fehler bei der externen Authentifizierung vor, oder Sie dürfen Ihr externes Benutzerkonto nicht aktualisieren.',
-'loginproblem' => '\'\'\'Es gab ein Problem mit Ihrer Anmeldung.\'\'\'<br />Bitte versuchen Sie es nochmal!',
-'alreadyloggedin' => '\'\'\'Benutzer $1, Sie sind bereits angemeldet!\'\'\'<br />',
-
-"login" => "Anmelden",
-"loginprompt" => "Um sich bei {{SITENAME}} anmelden zu können, müssen Cookies aktiviert sein.",
-"userlogin" => "Anmelden",
-"logout" => "Abmelden",
-"userlogout" => "Abmelden",
-"notloggedin" => "Nicht angemeldet",
-'nologin' => 'Sie haben kein Benutzerkonto? $1.',
-'nologinlink' => 'Neues Benutzerkonto anlegen',
-'createaccount' => 'Neues Benutzerkonto anlegen',
-'accountcreated' => 'Benutzerkonto erstellt',
-'accountcreatedtext' => 'Das Benutzerkonto für $1 wurde erstellt.',
-'gotaccountlink' => 'Anmelden',
-'gotaccount' => 'Sie haben bereits ein Benutzerkonto? $1.',
-'createaccountmail' => 'über E-Mail',
-"badretype" => "Die beiden Passwörter stimmen nicht überein.",
-"userexists" => "Dieser Benutzername ist schon vergeben. Bitte wählen Sie einen anderen.",
-'youremail' => 'E-Mail-Adresse**:',
-'yournick' => 'Signatur:',
-'yourrealname' => 'Echter Name*:',
-'yourlanguage' => 'Sprache der Benutzeroberfläche:',
-'username' => 'Benutzername:',
-'uid' => 'Benutzer ID:',
-'yourvariant' => 'Variante',
-'badsig' => 'Die Syntax der Signatur ist ungültig; bitte HTML überprüfen.',
-'email' => 'E-Mail',
-'prefs-help-email' => '** <strong>E-Mail-Adresse</strong> (optional): Erlaubt anderen Benutzern Sie über Ihre Benutzerseite zu kontaktieren,
+'loginpagetitle' => 'Benutzer-Anmeldung',
+'yourname' => 'Benutzername',
+'yourpassword' => 'Passwort',
+'yourpasswordagain' => 'Passwort wiederholen',
+'remembermypassword' => 'Benutzer auf diesem Computer dauerhaft anmelden',
+'yourdomainname' => 'Ihre Domain',
+'externaldberror' => 'Entweder es liegt ein Fehler bei der externen Authentifizierung vor, oder Sie dürfen Ihr externes Benutzerkonto nicht aktualisieren.',
+'loginproblem' => "'''Es gab ein Problem mit Ihrer Anmeldung.'''<br />Bitte versuchen Sie es nochmal!",
+'alreadyloggedin' => "'''Benutzer $1, Sie sind bereits angemeldet!'''<br />",
+'login' => 'Anmelden',
+'loginprompt' => 'Um sich bei {{SITENAME}} anmelden zu können, müssen Cookies aktiviert sein.',
+'userlogin' => 'Anmelden',
+'logout' => 'Abmelden',
+'userlogout' => 'Abmelden',
+'notloggedin' => 'Nicht angemeldet',
+'nologin' => 'Sie haben kein Benutzerkonto? $1.',
+'nologinlink' => 'Neues Benutzerkonto anlegen',
+'createaccount' => 'Benutzerkonto anlegen',
+'gotaccount' => 'Sie haben bereits ein Benutzerkonto? $1.',
+'gotaccountlink' => 'Anmelden',
+'createaccountmail' => 'über E-Mail',
+'badretype' => 'Die beiden Passwörter stimmen nicht überein.',
+'userexists' => 'Dieser Benutzername ist schon vergeben. Bitte wählen Sie einen anderen.',
+'youremail' => 'E-Mail-Adresse**:',
+'username' => 'Benutzername:',
+'uid' => 'Benutzer-ID:',
+'yourrealname' => 'Echter Name*:',
+'yourlanguage' => 'Sprache der Benutzeroberfläche:',
+'yourvariant' => 'Variante',
+'yournick' => 'Unterschrift:',
+'badsig' => 'Die Syntax der Unterschrift ist ungültig; bitte HTML überprüfen.',
+'email' => 'E-Mail',
+'prefs-help-email-enotif' => 'An diese Adresse werden auch die Benachrichtigungsmails geschickt, sofern Sie das eingeschaltet haben.',
+'prefs-help-realname' => '* <strong>Echter Name</strong> (optional): Für anerkennende Nennungen Ihres Namens im Zusammenhang mit Ihren Beiträgen.',
+'loginerror' => 'Fehler bei der Anmeldung',
+'prefs-help-email' => '** <strong>E-Mail-Adresse</strong> (optional): Erlaubt anderen Benutzern Sie über Ihre Benutzerseite zu kontaktieren,
ohne dass Sie Ihre E-Mail-Adresse veröffentlichen müssen.
Für den Fall, dass Sie Ihr Passwort vergessen haben, kann Ihnen ein temporäres Einmal-Passwort zugesendet werden.',
-'prefs-help-email-enotif' => 'An diese Adresse werden auch die Benachrichtigungsmails geschickt, sofern Sie das eingeschaltet haben.',
-'prefs-help-realname' => '* <strong>Echter Name</strong> (optional): Für anerkennende Nennungen Ihres Namens im Zusammenhang mit Ihren Beiträgen.',
-"loginerror" => "Fehler bei der Anmeldung",
-'noname' => 'Sie müssen einen gültigen Benutzernamen angeben.',
-"loginsuccesstitle" => "Anmeldung erfolgreich",
-'loginsuccess' => 'Sie sind jetzt als „$1“ bei {{SITENAME}} angemeldet.',
-'nosuchuser' => 'Der Benutzername „$1“ existiert nicht. Überprüfen Sie die Schreibweise oder legen Sie ein neues Benutzerkonto an.',
-'nosuchusershort' => 'Der Benutzername „$1“ existiert nicht. Bitte überprüfen Sie die Schreibweise.',
-'nouserspecified' => 'Bitte geben Sie einen Benutzernamen an.',
-"wrongpassword" => "Das Passwort ist falsch (oder fehlt). Bitte versuchen Sie es erneut.",
-'mailmypassword' => 'Neues Passwort zusenden',
-'passwordremindertitle' => '[{{SITENAME}}] Neues Passwort',
-'passwordremindertext' => 'Jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat ein neues Passwort für die Anmeldung bei {{SITENAME}} ($4) angefordert.
+'nocookiesnew' => 'Der Benutzerzugang wurde erstellt, aber Sie sind nicht eingeloggt. {{SITENAME}} benötigt für diese Funktion Cookies, bitte aktivieren Sie diese und loggen sich dann mit Ihrem neuen Benutzernamen und dem Passwort ein.',
+'nocookieslogin' => '{{SITENAME}} benutzt Cookies zum Einloggen der Benutzer. Sie haben Cookies deaktiviert, bitte aktivieren Sie diese und versuchen es erneut.',
+'noname' => 'Sie müssen einen gültigen Benutzernamen angeben.',
+'loginsuccesstitle' => 'Anmeldung erfolgreich',
+'loginsuccess' => 'Sie sind jetzt als „$1“ bei {{SITENAME}} angemeldet.',
+'nosuchuser' => 'Der Benutzername „$1“ existiert nicht. Überprüfen Sie die Schreibweise oder legen Sie ein neues Benutzerkonto an.',
+'nosuchusershort' => 'Der Benutzername „$1“ existiert nicht. Bitte überprüfen Sie die Schreibweise.',
+'nouserspecified' => 'Bitte geben Sie einen Benutzernamen an.',
+'wrongpassword' => 'Das Passwort ist falsch (oder fehlt). Bitte versuchen Sie es erneut.',
+'wrongpasswordempty' => 'Das eingegebene Passwort war leer. Bitte versuchen Sie es erneut.',
+'mailmypassword' => 'Neues Passwort zusenden',
+'passwordremindertitle' => 'Neues Passwort für ein {{SITENAME}}-Benutzerkonto',
+'passwordremindertext' => 'Jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat ein neues Passwort für die Anmeldung bei {{SITENAME}} ($4) angefordert.
Das automatisch generierte Passwort für Benutzer $2 lautet nun: $3
Sie sollten sich jetzt anmelden und das Passwort ändern: {{fullurl:{{ns:special}}}}:Userlogin
Bitte ignoriesen Sie diese E-Mail, falls Sie diese nicht selbst angefordert haben. Das alte Passwort bleibt weiterhin gültig.',
-'noemail' => 'Benutzer „$1“ hat keine E-Mail-Adresse angegeben.',
-'passwordsent' => 'Ein temporäres Passwort wurde an die E-Mail-Adresse von Benutzer „$1“ gesendet.
+'noemail' => 'Benutzer „$1“ hat keine E-Mail-Adresse angegeben.',
+'passwordsent' => 'Ein temporäres Passwort wurde an die E-Mail-Adresse von Benutzer „$1“ gesendet.
Bitte melden Sie sich damit an, sobald Sie es erhalten.
Das alte Passwort bleibt weiterhin gültig.',
-'eauthentsent' => 'Eine Bestätigungsmail wurde an die angegebene E-Mail-Adresse verschickt.
+'blocked-mailpassword' => 'Die von Ihnen verwendete IP-Adresse ist für das Ändern von Seiten gesperrt. Um einen Missbrauch zu verhindern, wurde die Möglichkeit zur Anforderung eines neuen Passwortes ebenfalls gesperrt.',
+'eauthentsent' => 'Eine Bestätigungsmail wurde an die angegebene E-Mail-Adresse verschickt.
Bevor eine E-Mail von anderen Benutzern über die {{SITENAME}}-Mailfunktion empfangen werden kann, muss die Adresse und ihre tatsächliche Zugehörigkeit zu diesem Benutzerkonto erst bestätigt werden. Bitte befolgen Sie die Hinweise in der Bestätigungsmail.',
-'mailerror' => 'Fehler beim Senden der E-Mail: $1',
+'throttled-mailpassword' => 'Es wurde innerhalb der letzten $1 Stunden bereits ein neues Passwort angefordert. Um einen Missbrauch der Funktion zu verhindern, kann nur alle $1 Stunden ein neues Passwort angefordert werden.',
+'mailerror' => 'Fehler beim Senden der E-Mail: $1',
'acct_creation_throttle_hit' => 'Sie haben schon $1 Benutzerkonten und können jetzt keine weiteren mehr anlegen.',
-'emailconfirmlink' => 'E-Mail-Adresse bestätigen (authentifizieren).',
-'emailauthenticated' => 'Ihre E-Mail-Adresse wurde am $1 authentifiziert.',
-'emailnotauthenticated' => 'Ihre E-Mail-Adresse ist noch nicht authentifiziert. Es wird Ihnen keine E-Mail für eine der folgenden Funktionen zugesendet.',
-'invalidemailaddress' => 'Die E-Mail-Adresse wurde nicht akzeptiert, da sie ein ungültiges Format aufzuweisen scheint. Bitte geben Sie eine Adresse in einem gültigen Format ein, oder leeren Sie das Feld.',
-'noemailprefs' => 'Geben Sie eine E-Mail-Adresse an, damit die nachfolgenden Funktionen zur Verfügung stehen.',
-'wrongpasswordempty' => 'Das eingegebene Passwort war leer. Bitte versuchen Sie es erneut.',
+'emailauthenticated' => 'Ihre E-Mail-Adresse wurde bestätigt: $1.',
+'emailnotauthenticated' => 'Ihre E-Mail-Adresse ist noch nicht bestätigt. Es wird Ihnen keine E-Mail für eine der folgenden Funktionen zugesendet.',
+'noemailprefs' => 'Geben Sie eine E-Mail-Adresse an, damit die nachfolgenden Funktionen zur Verfügung stehen.',
+'emailconfirmlink' => 'E-Mail-Adresse bestätigen (authentifizieren).',
+'invalidemailaddress' => 'Die E-Mail-Adresse wurde nicht akzeptiert, da sie ein ungültiges Format aufzuweisen scheint. Bitte geben Sie eine Adresse in einem gültigen Format ein, oder leeren Sie das Feld.',
+'accountcreated' => 'Benutzerkonto erstellt',
+'accountcreatedtext' => 'Das Benutzerkonto $1 wurde eingerichtet.',
+
+# Password reset dialog
+'resetpass' => 'Passwort für Benutzerkonto zurücksetzen',
+'resetpass_announce' => 'Anmeldung mit dem per E-Mail zugesandten Code. Um die Anmeldung abzuschließen, müssen Sie jetzt ein neues Passwort wählen.',
+'resetpass_text' => '<!-- Add text here -->',
+'resetpass_header' => 'Passwort zurücksetzen',
+'resetpass_submit' => 'Passwort übermitteln und anmelden',
+'resetpass_success' => 'Ihr Passwort wurde erfolgreich geändert. Es folgt die Anmeldung…',
+'resetpass_bad_temporary' => 'Ungültiges vorläufiges Passwort. Sie haben bereits Ihr Passwort erfolgreich geändert oder ein neues, vorläufiges Passwort angefordert.',
+'resetpass_forbidden' => 'Das Passwort kann in {{SITENAME}} nicht geändert werden.',
+'resetpass_missing' => 'Leeres Formular.',
+
+# Edit page toolbar
+'bold_sample' => 'Fetter Text',
+'bold_tip' => 'Fetter Text',
+'italic_sample' => 'Kursiver Text',
+'italic_tip' => 'Kursiver Text',
+'link_sample' => 'Link-Text',
+'link_tip' => 'Interner Link',
+'extlink_sample' => 'http://www.beispiel.de Link-Text',
+'extlink_tip' => 'Externer Link (http:// beachten)',
+'headline_sample' => 'Ebene 2 Ãœberschrift',
+'headline_tip' => 'Ebene 2 Ãœberschrift',
+'math_sample' => 'Formel hier einfügen',
+'math_tip' => 'Mathematische Formel (LaTeX)',
+'nowiki_sample' => 'Unformatierten Text hier einfügen',
+'nowiki_tip' => 'Unformatierter Text',
+'image_sample' => 'Beispiel.jpg',
+'image_tip' => 'Bildverweis',
+'media_sample' => 'Beispiel.ogg',
+'media_tip' => 'Mediendatei-Verweis',
+'sig_tip' => 'Ihre Signatur mit Zeitstempel',
+'hr_tip' => 'Horizontale Linie (sparsam verwenden)',
# Edit pages
-#
-"summary" => "Zusammenfassung",
-"subject" => "Betreff",
-'minoredit' => 'Nur Kleinigkeiten wurden verändert',
-'watchthis' => 'Diese Seite beobachten',
-'savearticle' => 'Seite speichern',
-"preview" => "Vorschau",
-"showpreview" => "Vorschau zeigen",
-'showlivepreview' => 'Live-Vorschau',
-'showdiff' => 'Änderungen zeigen',
-'anoneditwarning' => "Sie bearbeiten diese Seite ohne angemeldet zu sein. Statt eines Benutzernamens wird die IP-Adresse in der Versionsgeschichte aufgezeichnet.",
-'missingsummary' => '\'\'\'Hinweis:\'\'\' Sie haben keine Zusammenfassung angegeben. Wenn Sie erneut „Speichern“ klicken, wird Ihre Änderung ohne Zusammenfassung übernommen.',
-'missingcommenttext' => 'Bitte geben Sie eine Zusammenfassung ein.',
-"blockedtitle" => "Benutzer ist blockiert",
-
-'blockedtext' => 'Ihr Benutzername oder Ihre IP-Adresse wurde von $1 blockiert.
+'summary' => 'Zusammenfassung',
+'subject' => 'Betreff',
+'minoredit' => 'Nur Kleinigkeiten wurden verändert',
+'watchthis' => 'Diese Seite beobachten',
+'savearticle' => 'Seite speichern',
+'preview' => 'Vorschau',
+'showpreview' => 'Vorschau zeigen',
+'showlivepreview' => 'Live-Vorschau',
+'showdiff' => 'Änderungen zeigen',
+'anoneditwarning' => 'Sie bearbeiten diese Seite ohne angemeldet zu sein. Statt eines Benutzernamens wird die IP-Adresse in der Versionsgeschichte aufgezeichnet.',
+'missingsummary' => "'''Hinweis:''' Sie haben keine Zusammenfassung angegeben. Wenn Sie erneut „Speichern“ klicken, wird Ihre Änderung ohne Zusammenfassung übernommen.",
+'missingcommenttext' => 'Bitte geben Sie eine Zusammenfassung ein.',
+'missingcommentheader' => "'''ACHTUNG:''' Sie haben keine Überschrift im Feld „Betreff:“ eingegeben. Wenn Sie erneut auf „Seite speichern“ klicken, wird Ihre Bearbeitung ohne Überschrift gespeichert.",
+'summary-preview' => 'Vorschau der Zusammenfassungszeile',
+'subject-preview' => 'Vorschau des Betreffs',
+'blockedtitle' => 'Benutzer ist blockiert',
+'blockedtext' => 'Ihr Benutzername oder Ihre IP-Adresse wurde von $1 blockiert.
Folgender Grund wurde angegeben: $2
Sie können $1 oder die [[{{ns:project}}:Administratoren]] kontaktieren, um über die Blockierung zu diskutieren.
-Bitte geben Sie Ihre IP-Adresse ($3) in allen Ihren Anfragen mit an.',
-'blockedoriginalsource' => 'Der Quelltext von \'\'\'$1\'\'\' wird hier angezeigt:',
-'blockededitsource' => 'Der Quelltext von \'\'\'Ihren Änderungen\'\'\' an \'\'\'$1\'\'\':',
-"whitelistedittitle" => "Zum Bearbeiten ist es erforderlich, angemeldet zu sein",
-'whitelistedittext' => 'Sie müssen sich $1, um Seiten bearbeiten zu können.',
-"whitelistreadtitle" => "Zum Lesen ist es erforderlich, angemeldet zu sein",
-'whitelistreadtext' => 'Sie müssen sich [[{{ns:special}}:Userlogin|hier anmelden]], um Seiten lesen zu können.',
-'whitelistacctitle' => 'Sie sind nicht berechtigt, einen Benutzer zu erzeugen.',
-'whitelistacctext' => 'Um in diesem Wiki Benutzer anlegen zu dürfen, müssen Sie sich [[{{ns:special}}:Userlogin|hier anmelden]] und die nötigen Berechtigungen haben.',
-'confirmedittitle' => 'Zum Bearbeiten ist die E-Mail-Bestätigung erforderlich.',
-'confirmedittext' => 'Sie müssen Ihre E-Mail-Adresse erst bestätigen, bevor Sie bearbeiten können. Bitte ergänzen und bestätigen Sie Ihre E-Mail-Adresse in den [[{{ns:special}}:Preferences|Einstellungen]].',
-'loginreqtitle' => 'Anmeldung erforderlich',
-'loginreqlink' => 'anmelden',
-'loginreqpagetext' => 'Sie müssen sich $1, um Seiten lesen zu können.',
-"accmailtitle" => "Passwort wurde verschickt.",
-"accmailtext" => "Das Passwort von $1 wurde an $2 geschickt.",
-"newarticle" => "(Neu)",
-'newarticletext' => 'Hier den Text der neuen Seite eintragen. Bitte nur in ganzen Sätzen schreiben und keine urheberrechtsgeschützten Texte anderer kopieren.',
-'anontalkpagetext' => '---- \'\'Diese Seite dient dazu, einem nicht angemeldeten Benutzer Nachrichten zu hinterlassen. Wenn Sie mit den Kommentaren auf dieser Seite nichts anfangen können, richten sie sich vermutlich an einen früheren Inhaber Ihrer IP-Adresse und Sie können sie ignorieren. Wenn Sie ein anonymer Benutzer sind und denken, dass irrelevante Kommentare an Sie gerichtet wurden, [[{{ns:special}}:Userlogin|melden Sie sich bitte an]], um zukünftige Verwirrung zu vermeiden. \'\'',
-'noarticletext' => '(Diese Seite enthält momentan noch keinen Text)',
-'usercsspreview' => '== Vorschau Ihres Benutzer-CSS ==
-\'\'\'Beachten Sie:\'\'\' Nach dem Speichern müssen Sie Ihren Browser anweisen, die neue Version zu laden: \'\'\'Mozilla/Firefox:\'\'\' \'\'Strg-Shift-R\'\', \'\'\'Internet Explorer:\'\'\' \'\'Strg-F5\'\', \'\'\'Opera:\'\'\' \'\'F5\'\', \'\'\'Safari:\'\'\' \'\'Cmd-Shift-R\'\', \'\'\'Konqueror:\'\'\' \'\'F5\'\'.',
-'userjspreview' => '== Vorschau Ihres Benutzer-JavaScript ==
-\'\'\'Beachten Sie:\'\'\' Nach dem Speichern müssen Sie Ihren Browser anweisen, die neue Version zu laden: \'\'\'Mozilla/Firefox:\'\'\' \'\'Strg-Shift-R\'\', \'\'\'Internet Explorer:\'\'\' \'\'Strg-F5\'\', \'\'\'Opera:\'\'\' \'\'F5\'\', \'\'\'Safari:\'\'\' \'\'Cmd-Shift-R\'\', \'\'\'Konqueror:\'\'\' \'\'F5\'\'.',
-'userinvalidcssjstitle' => '\'\'\'Warnung:\'\'\' Es existiert kein Skin „$1“. Bitte bedenken Sie, dass benutzerspezifische .css- and .js-Seiten mit einem Kleinbuchstaben anfangen müssen, also z.B. Benutzer:Foo/monobook.css an Stelle von Benutzer:Foo/Monobook.css.',
-'clearyourcache' => '\'\'\'Beachten Sie:\'\'\' Nach dem Speichern müssen Sie Ihren Browser anweisen, die neue Version zu laden:<br />
-\'\'\'Mozilla/Firefox:\'\'\' \'\'Strg-Shift-R\'\', \'\'\'Internet Explorer:\'\'\' \'\'Strg-F5\'\', \'\'\'Opera:\'\'\' \'\'F5\'\', \'\'\'Safari:\'\'\' \'\'Cmd-Shift-R\'\', \'\'\'Konqueror:\'\'\' \'\'F5\'\'.',
-'usercssjsyoucanpreview' => "<strong>Tipp:</strong> Benutzen Sie den Vorschau-Button, um Ihr neues css/js vor dem Speichern zu testen.",
-"updated" => "(Geändert)",
-"note" => "<strong>Hinweis:</strong>",
-'previewnote' => 'Dies ist nur eine Vorschau, die Seite wurde noch nicht gespeichert!',
-'session_fail_preview' => '<strong>Ihre Bearbeitung konnte nicht gespeichert werden, da Ihre Sitzungsdaten verloren gegangen sind.
+Bitte geben Sie Ihre IP-Adresse $3 und die Block-ID #$5 in allen Ihren Anfragen mit an.',
+'blockedoriginalsource' => "Der Quelltext von '''$1''' wird hier angezeigt:",
+'blockededitsource' => "Der Quelltext von '''Ihren Änderungen''' an '''$1''':",
+'whitelistedittitle' => 'Zum Bearbeiten ist es erforderlich, angemeldet zu sein',
+'whitelistedittext' => 'Sie müssen sich $1, um Seiten bearbeiten zu können.',
+'whitelistreadtitle' => 'Zum Lesen ist es erforderlich, angemeldet zu sein',
+'whitelistreadtext' => 'Sie müssen sich [[{{ns:special}}:Userlogin|hier anmelden]], um Seiten lesen zu können.',
+'whitelistacctitle' => 'Sie sind nicht berechtigt, ein Benutzerkonto anzulegen.',
+'whitelistacctext' => 'Um in {{SITENAME}} Benutzer anlegen zu dürfen, müssen Sie sich [[{{ns:special}}:Userlogin|hier anmelden]] und die nötigen Berechtigungen haben.',
+'confirmedittitle' => 'Zum Bearbeiten ist die E-Mail-Bestätigung erforderlich.',
+'confirmedittext' => 'Sie müssen Ihre E-Mail-Adresse erst bestätigen, bevor Sie bearbeiten können. Bitte ergänzen und bestätigen Sie Ihre E-Mail-Adresse in den [[{{ns:special}}:Preferences|Einstellungen]].',
+'loginreqtitle' => 'Anmeldung erforderlich',
+'loginreqlink' => 'anmelden',
+'loginreqpagetext' => 'Sie müssen sich $1, um Seiten lesen zu können.',
+'accmailtitle' => 'Passwort wurde verschickt.',
+'accmailtext' => 'Das Passwort von $1 wurde an $2 geschickt.',
+'newarticle' => '(Neu)',
+'newarticletext' => 'Hier den Text der neuen Seite eintragen. Bitte nur in ganzen Sätzen schreiben und keine urheberrechtsgeschützten Texte anderer kopieren.',
+'anontalkpagetext' => "---- ''Diese Seite dient dazu, einem nicht angemeldeten Benutzer Nachrichten zu hinterlassen. Wenn Sie mit den Kommentaren auf dieser Seite nichts anfangen können, richten sie sich vermutlich an einen früheren Inhaber Ihrer IP-Adresse und Sie können sie ignorieren. Wenn Sie ein anonymer Benutzer sind und denken, dass irrelevante Kommentare an Sie gerichtet wurden, [[{{ns:special}}:Userlogin|melden Sie sich bitte an]], um zukünftige Verwirrung zu vermeiden. ''",
+'noarticletext' => '(Diese Seite enthält momentan noch keinen Text)',
+'clearyourcache' => "'''Hinweis:''' Nach dem Speichern muss der Browserchache geleert werden, um die Änderungen zu sehen:<br />
+'''Mozilla/Firefox:''' ''Strg-Shift-R'', '''Internet Explorer:''' ''Strg-F5'', '''Opera:''' ''F5'', '''Safari:''' ''Cmd-Shift-R'', '''Konqueror:''' ''F5''.",
+'usercssjsyoucanpreview' => '<strong>Tipp:</strong> Benutzen Sie den Vorschau-Button, um Ihr neues css/js vor dem Speichern zu testen.',
+'usercsspreview' => "== Vorschau Ihres Benutzer-CSS ==
+'''Beachten Sie:''' Nach dem Speichern müssen Sie Ihren Browser anweisen, die neue Version zu laden: '''Mozilla/Firefox:''' ''Strg-Shift-R'', '''Internet Explorer:''' ''Strg-F5'', '''Opera:''' ''F5'', '''Safari:''' ''Cmd-Shift-R'', '''Konqueror:''' ''F5''.",
+'userjspreview' => "== Vorschau Ihres Benutzer-JavaScript ==
+'''Beachten Sie:''' Nach dem Speichern müssen Sie Ihren Browser anweisen, die neue Version zu laden: '''Mozilla/Firefox:''' ''Strg-Shift-R'', '''Internet Explorer:''' ''Strg-F5'', '''Opera:''' ''F5'', '''Safari:''' ''Cmd-Shift-R'', '''Konqueror:''' ''F5''.",
+'userinvalidcssjstitle' => "'''Warnung:''' Es existiert kein Skin „$1“. Bitte bedenken Sie, dass benutzerspezifische .css- und .js-Seiten mit einem Kleinbuchstaben anfangen müssen, also z.B. ''Benutzer:Mustermann/monobook.css'' an Stelle von ''Benutzer:Mustermann/Monobook.css''.",
+'updated' => '(Geändert)',
+'note' => '<strong>Hinweis:</strong>',
+'previewnote' => 'Dies ist nur eine Vorschau, die Seite wurde noch nicht gespeichert!',
+'previewconflict' => 'Diese Vorschau gibt den Inhalt des oberen Textfeldes wieder; so wird die Seite aussehen, wenn Sie jetzt speichern.',
+'session_fail_preview' => '<strong>Ihre Bearbeitung konnte nicht gespeichert werden, da Ihre Sitzungsdaten verloren gegangen sind.
Bitte versuchen Sie es erneut. Sollte das Problem bestehen bleiben, loggen Sie sich kurz aus und wieder ein.</strong>',
-'previewconflict' => 'Diese Vorschau gibt den Inhalt des oberen Textfeldes wieder; so wird die Seite aussehen, wenn Sie jetzt speichern.',
-'session_fail_preview_html' => '<strong>Ihre Bearbeitung konnte nicht gespeichert werden, da Ihre Sitzungsdaten verloren gegangen sind.</strong>
-
-\'\'Da in diesem Wiki reines HTML aktiviert ist, wurde die Vorschau ausgeblendet um JavaScript Attacken vorzubeugen.\'\'
-
-<strong>Bitte versuchen Sie es erneut. Sollte das Problem bestehen bleiben, melden Sie sich kurz ab und wieder an.</strong>',
-'importing' => 'importiere $1',
-"editing" => "Bearbeiten von $1",
-'editinguser' => 'Bearbeiten von Benutzer <b>$1</b>',
-"editingsection" => "Bearbeiten von $1 (Absatz)",
-"editingcomment" => "Bearbeiten von $1 (Kommentar)",
-'editconflict' => 'Bearbeitungskonflikt: $1',
-'explainconflict' => 'Jemand anders hat diese Seite geändert, nachdem Sie angefangen haben diese zu bearbeiten.
+'session_fail_preview_html' => "<strong>Ihre Bearbeitung konnte nicht gespeichert werden, da Ihre Sitzungsdaten verloren gegangen sind.</strong>
+
+''Da in diesem Wiki reines HTML aktiviert ist, wurde die Vorschau ausgeblendet um JavaScript Attacken vorzubeugen.''
+
+<strong>Bitte versuchen Sie es erneut. Sollte das Problem bestehen bleiben, melden Sie sich kurz ab und wieder an.</strong>",
+'importing' => 'importiere $1',
+'editing' => 'Bearbeiten von $1',
+'editinguser' => 'Bearbeiten von Benutzer <b>$1</b>',
+'editingsection' => 'Bearbeiten von $1 (Absatz)',
+'editingcomment' => 'Bearbeiten von $1 (Kommentar)',
+'editconflict' => 'Bearbeitungskonflikt: $1',
+'explainconflict' => 'Jemand anders hat diese Seite geändert, nachdem Sie angefangen haben diese zu bearbeiten.
Das obere Textfeld enthält den aktuellen Stand.
Das untere Textfeld enthält Ihre Änderungen.
Bitte fügen Sie Ihre Änderungen in das obere Textfeld ein.
<b>Nur</b> der Inhalt des oberen Textfeldes wird gespeichert, wenn Sie auf „Speichern“ klicken!<br />',
-"yourtext" => "Ihr Text",
-"storedversion" => "Gespeicherte Version",
-'nonunicodebrowser' => '<strong>Achtung:</strong> Ihr Browser kann Unicode-Zeichen nicht richtig verarbeiten. Bitte verwenden Sie einen anderen Browser um Seiten zu bearbeiten.',
-"editingold" => "<strong>ACHTUNG: Sie bearbeiten eine alte Version dieser Seite.
-Wenn Sie speichern, werden alle neueren Versionen überschrieben.</strong>",
-"yourdiff" => "Unterschiede",
-'copyrightwarning' => '<strong>Bitte <big>kopieren Sie keine Webseiten</big>, die nicht Ihre eigenen sind, benutzen Sie <big>keine urheberrechtlich geschützten Werke</big> ohne Erlaubnis des Copyright-Inhabers!</strong><br />
+'yourtext' => 'Ihr Text',
+'storedversion' => 'Gespeicherte Version',
+'nonunicodebrowser' => '<strong>Achtung:</strong> Ihr Browser kann Unicode-Zeichen nicht richtig verarbeiten. Bitte verwenden Sie einen anderen Browser um Seiten zu bearbeiten.',
+'editingold' => '<strong>ACHTUNG: Sie bearbeiten eine alte Version dieser Seite.
+Wenn Sie speichern, werden alle neueren Versionen überschrieben.</strong>',
+'yourdiff' => 'Unterschiede',
+'copyrightwarning' => '<strong>Bitte <big>kopieren Sie keine Webseiten</big>, die nicht Ihre eigenen sind, benutzen Sie <big>keine urheberrechtlich geschützten Werke</big> ohne Erlaubnis des Copyright-Inhabers!</strong><br />
Sie geben uns hiermit Ihre Zusage, dass Sie den Text <strong>selbst verfasst</strong> haben, dass der Text Allgemeingut (<strong>public domain</strong>) ist, oder dass der <strong>Copyright-Inhaber</strong> seine <strong>Zustimmung</strong> gegeben hat. Falls dieser Text bereits woanders veröffentlicht wurde, weisen Sie bitte auf der Diskussionsseite darauf hin.
<i>Bitte beachten Sie, dass alle {{SITENAME}}-Beiträge automatisch unter der „$2“ stehen (siehe $1 für Details). Falls Sie nicht möchten, dass Ihre Arbeit hier von anderen verändert und verbreitet wird, dann drücken Sie nicht auf „Speichern“.</i>',
-'copyrightwarning2' => 'Bitte beachten Sie, dass alle Beiträge zu {{SITENAME}} von anderen Mitwirkenden bearbeitet, geändert oder gelöscht werden können.
+'copyrightwarning2' => 'Bitte beachten Sie, dass alle Beiträge zu {{SITENAME}} von anderen Mitwirkenden bearbeitet, geändert oder gelöscht werden können.
Reichen Sie hier keine Texte ein, falls Sie nicht wollen dass diese ohne Einschränkung geändert werden können.
Sie bestätigen hiermit auch, dass Sie diese Texte selbst geschrieben haben oder diese von einer gemeinfreien Quelle kopiert haben
(siehe $1 für weitere Details). <strong>ÜBERTRAGEN SIE OHNE GENEHMIGUNG KEINE URHEBERRECHTLICH GESCHÜTZEN INHALTE!</strong>',
-"longpagewarning" => "<strong>WARNUNG: Diese Seite ist $1 kB groß; einige Browser könnten Probleme haben, Seiten zu bearbeiten, die größer als 32 kB sind.
-Überlegen Sie bitte, ob eine Aufteilung der Seite in kleinere Abschnitte möglich ist.</strong>",
-'longpageerror' => '<strong>FEHLER: Der Text, den Sie zu speichern versuchen, ist $1 kB groß. Das ist größer als das erlaubte Maximum von $2 kB. Speicherung nicht möglich.</strong>',
-"readonlywarning" => "<strong>WARNUNG: Die Datenbank wurde während dem Ändern der
+'longpagewarning' => '<strong>WARNUNG: Diese Seite ist $1 kB groß; einige Browser könnten Probleme haben, Seiten zu bearbeiten, die größer als 32 kB sind.
+Überlegen Sie bitte, ob eine Aufteilung der Seite in kleinere Abschnitte möglich ist.</strong>',
+'longpageerror' => '<strong>FEHLER: Der Text, den Sie zu speichern versuchen, ist $1 kB groß. Das ist größer als das erlaubte Maximum von $2 kB. Speicherung nicht möglich.</strong>',
+'readonlywarning' => '<strong>WARNUNG: Die Datenbank wurde während dem Ändern der
Seite für Wartungsarbeiten gesperrt, so dass Sie die Seite im Moment nicht
speichern können. Sichern Sie sich den Text und versuchen Sie die Änderungen
-später einzuspielen.</strong>",
-'protectedpagewarning' => '\'\'\'ACHTUNG: Diese Seite wurde gesperrt, so dass sie nur durch Benutzer mit Admninistratorrechten bearbeitet werden kann.\'\'\'',
-'semiprotectedpagewarning' => '\'\'\'Halbsperrung:\'\'\' Die Seite wurde so gesperrt, dass nur registrierte Benutzer diese ändern können.',
-'templatesused' => 'Folgende Vorlagen werden von dieser Seite verwendet:',
-'edittools' => '<!-- Dieser Text wird unter dem „Bearbeiten“-Formular sowie dem "Hochladen"-Formular angezeigt. -->',
-'nocreatetitle' => 'Die Erstellung neuer Seiten ist eingeschränkt.',
-'nocreatetext' => 'Der Server hat das Erstellen neuer Seiten eingeschränkt.
-
-Sie können bestehende Seiten ändern oder sich [[{{ns:special}}:Userlogin|anmelden]].',
-'cantcreateaccounttitle' => 'Benutzerkonto kann nicht erstellt werden',
-'cantcreateaccounttext' => 'Die Erstellung eines Benutzerkontos von dieser IP-Adresse (<b>$1</b>) wurde gesperrt.
-Dies geschah vermutlich auf Grund von wiederholtem Vandalismus von Ihrer Bildungseinrichtung oder anderen Benutzern Ihres Internet-Service-Provider.',
+später einzuspielen.</strong>',
+'protectedpagewarning' => "'''ACHTUNG: Diese Seite wurde gesperrt, so dass sie nur durch Benutzer mit Admninistratorrechten bearbeitet werden kann.'''",
+'semiprotectedpagewarning' => "'''Halbsperrung:''' Die Seite wurde so gesperrt, dass nur registrierte Benutzer diese ändern können.",
+'templatesused' => 'Folgende Vorlagen werden von dieser Seite verwendet:',
+'templatesusedpreview' => 'Folgende Vorlagen werden von dieser Artikelvorschau verwendet:',
+'templatesusedsection' => 'Folgende Vorlagen werden von diesem Abschnitt verwendet:',
+'template-protected' => '(gesperrt)',
+'template-semiprotected' => '(halbgesperrt)',
+'edittools' => '<!-- Dieser Text wird unter dem „Bearbeiten“-Formular sowie dem "Hochladen"-Formular angezeigt. -->',
+'nocreatetitle' => 'Die Erstellung neuer Seiten ist eingeschränkt.',
+'nocreatetext' => 'Der Server hat das Erstellen neuer Seiten eingeschränkt. Sie können bestehende Seiten ändern oder sich [[{{ns:special}}:Userlogin|anmelden]].',
+
+# "Undo" feature
+'undo-success' => 'Die Bearbeitung konnte erfolgreich entfernt werden. Bitte die Änderung in der Vergleichsansicht kontrollieren und dann auf auf „Seite speichern“ klicken, um die Änderung zu speichern.',
+'undo-failure' => '<span class="error">Die Bearbeitung konnte nicht entfernt werden, da der betroffene Abschnitt zwischenzeitlich verändert wurde.</span>',
+'undo-summary' => 'Version $1 von [[{{ns:special}}:Contributions/$2|$2]] ({{ns:user_talk}}:$2]]) wurde entfernt.',
+
+# Account creation failure
+'cantcreateaccounttitle' => 'Benutzerkonto kann nicht erstellt werden.',
+'cantcreateaccounttext' => 'Die Erstellung eines Benutzerkontos von der IP-Adresse <b>$1</b> wurde gesperrt.
+Dies geschah vermutlich auf Grund von wiederholtem Vandalismus von Besuchern der Bildungseinrichtung oder anderen Benutzern des Internet-Service-Providers.',
# History pages
-#
-"revhistory" => "Frühere Versionen",
-'viewpagelogs' => 'Logbücher für diese Seite anzeigen',
-'nohistory' => 'Es gibt keine früheren Versionen dieser Seite.',
-'revnotfound' => 'Diese Version wurde nicht gefunden.',
-"revnotfoundtext" => "Die Version dieser Seite, nach der Sie suchen, konnte nicht gefunden werden. Bitte überprüfen Sie die URL dieser Seite.",
-"loadhist" => "Lade Liste mit früheren Versionen",
-"currentrev" => "Aktuelle Version",
-"revisionasof" => "Version vom $1",
-'old-revision-navigation' => 'Version vom $1; $5<br />($6) $3 | $2 | $4 ($7)',
-'nextrevision' => 'Nächstjüngere Version →',
-'previousrevision' => '↠Nächstältere Version',
-'currentrevisionlink' => 'Aktuelle Version',
-"cur" => "Aktuell",
-"next" => "Nächste",
-"last" => "Vorherige",
-'deletedrev' => '[gelöscht]',
-'histfirst' => 'Älteste',
-'histlast' => 'Neueste',
-'rev-deleted-comment' => '(Kommentar entfernt)',
-'rev-deleted-user' => '(Benutzername entfernt)',
-'rev-deleted-text-permission' => '<div class="mw-warning plainlinks"> Diese Version wurde gelöscht und ist nicht mehr öffentlich einsehbar.
+'revhistory' => 'Frühere Versionen',
+'viewpagelogs' => 'Logbücher für diese Seite anzeigen',
+'nohistory' => 'Es gibt keine früheren Versionen dieser Seite.',
+'revnotfound' => 'Diese Version wurde nicht gefunden.',
+'revnotfoundtext' => 'Die Version dieser Seite, nach der Sie suchen, konnte nicht gefunden werden. Bitte überprüfen Sie die URL dieser Seite.',
+'loadhist' => 'Lade Liste mit früheren Versionen',
+'currentrev' => 'Aktuelle Version',
+'revisionasof' => 'Version vom $1',
+'revision-info' => 'Version vom $1 von $2',
+'previousrevision' => '↠Nächstältere Version',
+'nextrevision' => 'Nächstjüngere Version →',
+'currentrevisionlink' => 'Aktuelle Version',
+'cur' => 'Aktuell',
+'next' => 'Nächste',
+'last' => 'Vorherige',
+'orig' => 'Original',
+'histlegend' => 'Zur Anzeige der Änderungen einfach die zu vergleichenden Versionen auswählen und die Schaltfläche „{{int:compareselectedversions}}“ klicken.<br />
+* (Aktuell) = Unterschied zur aktuellen Version, (Vorherige) = Unterschied zur vorherigen Version
+* Uhrzeit/Datum = Version zu dieser Zeit, Benutzername/IP-Adresse des Bearbeiters, K = Kleine Änderung',
+'deletedrev' => '[gelöscht]',
+'histfirst' => 'Älteste',
+'histlast' => 'Neueste',
+'rev-deleted-comment' => '(Kommentar entfernt)',
+'rev-deleted-user' => '(Benutzername entfernt)',
+'rev-deleted-text-permission' => '<div class="mw-warning plainlinks"> Diese Version wurde gelöscht und ist nicht mehr öffentlich einsehbar.
Nähere Angaben zum Löschvorgang sowie eine Begründung finden sich im [{{fullurl:Spezial:Log/delete|page={{PAGENAMEE}}}} Lösch-Logbuch].</div>',
-'rev-deleted-text-view' => '<div class="mw-warning plainlinks">Diese Version wurde gelöscht und ist nicht mehr öffentlich einsehbar.
+'rev-deleted-text-view' => '<div class="mw-warning plainlinks">Diese Version wurde gelöscht und ist nicht mehr öffentlich einsehbar.
Als Administrator können Sie sie weiterhin einsehen.
Nähere Angaben zum Löschvorgang sowie eine Begründung finden sich im [{{fullurl:Spezial:Log/delete|page={{PAGENAMEE}}}} Lösch-Logbuch].</div>',
-"orig" => "Original",
-'histlegend' => 'Zur Anzeige der Änderungen einfach die zu vergleichenden Versionen auswählen und die Schaltfläche „{{int:compareselectedversions}}“ klicken („alt-v“).<br />
-* (Aktuell) = Unterschied zur aktuellen Version, (Vorherige) = Unterschied zur vorherigen Version
-* Uhrzeit/Datum = Version zu dieser Zeit, Benutzername/IP-Adresse des Bearbeiters, K = Kleine Änderung',
-
-'revdelete-legend' => 'Einschränkungen für die Versionen festlegen:',
-'revdelete-hide-text' => 'Verstecke den Text der Version',
-'revdelete-hide-comment' => 'Bearbeitungskommentar verstecken',
-'revdelete-hide-user' => 'Verstecke den Benutzernamen/die IP des Bearbeiters.',
-'revdelete-hide-restricted' => 'Diese Einschränkungen gelten auch für Administratoren (nicht nur für „normale“ Benutzer).',
-'revdelete-log' => 'Kommentar/Begründung (erscheint im Logbuch):',
-'revdelete-submit' => 'Auf ausgewählte Version anwenden',
-'revdelete-logentry' => 'Versionszugang geändert für [[$1]]',
-'rev-delundel' => 'zeige/verstecke',
-
-'history-feed-title' => 'Versionsgeschichte',
-'history-feed-description' => 'Versionsgeschichte für diese Seite im Wiki',
-'history-feed-item-nocomment' => '$1 um $2', # user at time
-'history-feed-empty' => 'Die angeforderte Seite existiert nicht.
-Vielleicht wurde sie aus dem Wiki gelöscht oder verschoben.
-[[{{ns:special}}:Search|Durchsuchen]] Sie das Wiki für passende neue Seiten.',
-'revisiondelete' => 'Versionen löschen/wiederherstellen',
-'revdelete-nooldid-title' => 'Keine Version angegeben',
-'revdelete-nooldid-text' => 'Sie haben keine Version angegeben, auf die diese Aktion ausgeführt werden soll.',
-'revdelete-selected' => 'Ausgewählte Version von [[:$1]]:',
-'revdelete-text' => 'Der Inhalt oder andere Bestandteile gelöschter Versionen sind nicht mehr öffentlich einsehbar, erscheinen jedoch weiterhin als Einträge in der Versionsgeschichte.
+'rev-delundel' => 'zeige/verstecke',
+
+'history-feed-title' => 'Versionsgeschichte',
+'history-feed-description' => 'Versionsgeschichte für diese Seite in {{SITENAME}}',
+'history-feed-item-nocomment' => '$1 um $2', # user at time
+'history-feed-empty' => 'Die angeforderte Seite existiert nicht.
+Vielleicht wurde sie gelöscht oder verschoben.
+[[{{ns:special}}:Search|Durchsuchen]] Sie {{SITENAME}} für passende neue Seiten.',
+
+# Revision deletion
+'revisiondelete' => 'Versionen löschen/wiederherstellen',
+'revdelete-nooldid-title' => 'Keine Version angegeben',
+'revdelete-nooldid-text' => 'Sie haben keine Version angegeben, auf die diese Aktion ausgeführt werden soll.',
+'revdelete-selected' => 'Ausgewählte Version von [[:$1]]:',
+'revdelete-text' => 'Der Inhalt oder andere Bestandteile gelöschter Versionen sind nicht mehr öffentlich einsehbar, erscheinen jedoch weiterhin als Einträge in der Versionsgeschichte.
Administroren können den entfernten Inhalt oder andere entfernte Bestandteile weiterhin einsehen und wiederherstellen, es sei denn, es wurde festgelegt, dass die Zugangsbeschränkungen auch für Administratoren gelten.',
+'revdelete-legend' => 'Einschränkungen für die Versionen festlegen:',
+'revdelete-hide-text' => 'Verstecke den Text der Version',
+'revdelete-hide-comment' => 'Bearbeitungskommentar verstecken',
+'revdelete-hide-user' => 'Verstecke den Benutzernamen/die IP des Bearbeiters.',
+'revdelete-hide-restricted' => 'Diese Einschränkungen gelten auch für Administratoren (nicht nur für „normale“ Benutzer).',
+'revdelete-log' => 'Kommentar/Begründung (erscheint im Logbuch):',
+'revdelete-submit' => 'Auf ausgewählte Version anwenden',
+'revdelete-logentry' => 'Versionszugang geändert für [[$1]]',
# Diffs
-#
-"difference" => "(Unterschied zwischen Versionen)",
-'loadingrev' => 'Lade Versionen zur Unterscheidung',
-"lineno" => "Zeile $1:",
-"editcurrent" => "Die aktuelle Version dieser Seite bearbeiten",
+'difference' => '(Unterschied zwischen Versionen)',
+'loadingrev' => 'Lade Versionen zur Unterscheidung',
+'lineno' => 'Zeile $1:',
+'editcurrent' => 'Die aktuelle Version dieser Seite bearbeiten',
'selectnewerversionfordiff' => 'Eine neuere Version zum Vergleich auswählen',
'selectolderversionfordiff' => 'Eine ältere Version zum Vergleich auswählen',
-'compareselectedversions' => 'Gewählte Versionen vergleichen',
+'compareselectedversions' => 'Gewählte Versionen vergleichen',
+'editundo' => 'Entfernen',
+'diff-multi' => '(Der Versionsvergleich bezieht {{plural:$1|eine dazwischen liegende Version|$1 dazwischen liegende Versionen}} mit ein.)',
# Search results
-#
-"searchresults" => "Suchergebnisse",
-'searchresulttext' => 'Für mehr Informationen zur Suche siehe „[[{{ns:project}}:Suche|{{SITENAME}} durchsuchen]]“.',
-'searchsubtitle' => 'Für Ihre Suchanfrage „[[:$1]]“.',
-'searchsubtitleinvalid' => 'Für Ihre Suchanfrage „$1“.',
-"badquery" => "Falsche Suchanfrage",
-'badquerytext' => 'Wir konnten Ihre Suchanfrage nicht verarbeiten.
+'searchresults' => 'Suchergebnisse',
+'searchresulttext' => 'Für mehr Informationen zur Suche siehe „[[{{ns:project}}:Suche|{{SITENAME}} durchsuchen]]“.',
+'searchsubtitle' => 'Für Ihre Suchanfrage „[[:$1]]“.',
+'searchsubtitleinvalid' => 'Für Ihre Suchanfrage „$1“.',
+'badquery' => 'Falsche Suchanfrage',
+'badquerytext' => 'Wir konnten Ihre Suchanfrage nicht verarbeiten.
Vermutlich haben Sie versucht, ein Wort zu suchen, das kürzer als vier Buchstaben ist.
Dies funktioniert im Moment noch nicht.
Möglicherweise haben Sie auch die Anfrage falsch formuliert, z.B.
„Lohn und und Steuern“.
Bitte versuchen Sie eine anders formulierte Suchanfrage.',
-'matchtotals' => 'Die Suchanfrage „$1“ stimmt mit $2 Seitentiteln und dem Inhalt von $3 Seiten überein.',
-'noexactmatch' => '\'\'\'Es existiert keine Seite mit dem Titel „$1“.\'\'\'
+'matchtotals' => 'Die Suchanfrage „$1“ stimmt mit $2 Seitentiteln und dem Inhalt von $3 Seiten überein.',
+'noexactmatch' => "'''Es existiert keine Seite mit dem Titel „$1“.'''
Versuchen Sie es über die Volltextsuche.
Alternativ können Sie auch den [[{{ns:special}}:Allpages|alphabetischen Index]] nach ähnlichen Begriffen durchsuchen.
-Wenn Sie sich mit dem Thema auskennen, können Sie selbst die Seite „[[$1]]“ verfassen.',
-'titlematches' => 'Ãœbereinstimmungen mit Seitentiteln',
-'notitlematches' => 'Keine Ãœbereinstimmungen mit Seitentiteln',
-'textmatches' => 'Ãœbereinstimmungen mit Inhalten',
-'notextmatches' => 'Keine Ãœbereinstimmungen mit Inhalten',
-"prevn" => "vorherige $1",
-"nextn" => "nächste $1",
-"viewprevnext" => "Zeige ($1) ($2) ($3).",
-'showingresults' => 'Hier sind <b>$1</b> Ergebnisse, beginnend mit Nummer <b>$2</b>.',
-'showingresultsnum' => 'Hier sind <b>$3</b> Ergebnisse, beginnend mit Nummer <b>$2</b>.',
-'nonefound' => '<strong>Hinweis</strong>: Erfolglose Suchanfragen werden häufig dadurch verursacht, dass mehr als ein Suchbegriff angegeben wurde. Nur Seiten die alle Suchbegriffe enthalten werden hier angezeigt. Versuchen Sie in diesem Fall die Anzahl der Suchbegriffe zu verringern.',
-"powersearch" => "Suche",
-'powersearchtext' => 'Suche in Namensräumen:<br />$1<br />$2 Weiterleitungen anzeigen<br />Suche nach: $3 $9',
-'searchdisabled' => 'Die {{SITENAME}} Suche wurde deaktiviert. Sie können unterdessen über Google suchen. Bitte bedenken Sie, dass der Suchindex für {{SITENAME}} veraltet sein kann.',
-'blanknamespace' => '(Seiten)',
+Wenn Sie sich mit dem Thema auskennen, können Sie selbst die Seite „[[$1]]“ verfassen.",
+'titlematches' => 'Ãœbereinstimmungen mit Seitentiteln',
+'notitlematches' => 'Keine Ãœbereinstimmungen mit Seitentiteln',
+'textmatches' => 'Ãœbereinstimmungen mit Inhalten',
+'notextmatches' => 'Keine Ãœbereinstimmungen mit Inhalten',
+'prevn' => 'vorherige $1',
+'nextn' => 'nächste $1',
+'viewprevnext' => 'Zeige ($1) ($2) ($3).',
+'showingresults' => 'Hier sind <b>$1</b> Ergebnisse, beginnend mit Nummer <b>$2</b>.',
+'showingresultsnum' => 'Hier sind <b>$3</b> Ergebnisse, beginnend mit Nummer <b>$2</b>.',
+'nonefound' => '<strong>Hinweis</strong>: Erfolglose Suchanfragen werden häufig dadurch verursacht, dass mehr als ein Suchbegriff angegeben wurde. Nur Seiten die alle Suchbegriffe enthalten werden hier angezeigt. Versuchen Sie in diesem Fall die Anzahl der Suchbegriffe zu verringern.',
+'powersearch' => 'Suche',
+'powersearchtext' => 'Suche in Namensräumen:<br />$1<br />$2 Weiterleitungen anzeigen<br />Suche nach: $3 $9',
+'searchdisabled' => 'Die {{SITENAME}} Suche wurde deaktiviert. Sie können unterdessen über Google suchen. Bitte bedenken Sie, dass der Suchindex für {{SITENAME}} veraltet sein kann.',
+'blanknamespace' => '(Seiten)',
# Preferences page
-#
-'preferences' => 'Einstellungen',
-'mypreferences' => 'Einstellungen',
-"prefsnologin" => "Nicht angemeldet",
-'prefsnologintext' => 'Sie müssen [[{{ns:special}}:Userlogin|angemeldet]] sein, um Ihre Einstellungen ändern zu können.',
-"prefsreset" => "Einstellungen wurden auf Standard zurückgesetzt.",
-"qbsettings" => "Seitenleiste",
-"changepassword" => "Passwort ändern",
-"skin" => "Skin",
-"math" => "TeX",
-"dateformat" => "Datumsformat",
-'datedefault' => 'Standard',
-'datetime' => 'Datum und Zeit',
-"math_failure" => "Parser-Fehler",
-"math_unknown_error" => "Unbekannter Fehler",
-"math_unknown_function" => "Unbekannte Funktion",
-"math_lexing_error" => "'Lexing'-Fehler",
-"math_syntax_error" => "Syntaxfehler",
-"saveprefs" => "Einstellungen speichern",
-"resetprefs" => "Einstellungen verwerfen",
-"oldpassword" => "Altes Passwort:",
-"newpassword" => "Neues Passwort:",
-"retypenew" => "Neues Passwort (nochmal):",
-'textboxsize' => 'Bearbeiten',
-"rows" => "Zeilen",
-"columns" => "Spalten",
-'searchresultshead' => 'Suche',
-'resultsperpage' => 'Treffer pro Seite:',
-'contextlines' => 'Zeilen pro Treffer:',
-'contextchars' => 'Zeichen pro Zeile:',
-'stubthreshold' => 'Kleine Seiten markieren bis (Zeichen):',
-"recentchangescount" => 'Anzahl der Einträge in „Letzte Änderungen“:',
-"savedprefs" => "Ihre Einstellungen wurden gespeichert.",
-"timezonelegend" => "Zeitzone",
-"timezonetext" => "Geben Sie die Anzahl der Stunden ein, die zwischen Ihrer Zeitzone und UTC liegen.",
-'localtime' => 'Ortszeit:',
-'timezoneoffset' => 'Unterschied¹:',
-'servertime' => 'Aktuelle Zeit auf dem Server:',
-'guesstimezone' => 'Aus Browser übernehmen',
-'allowemail' => 'E-Mail-Empfang von anderen Benutzern ermöglichen.',
-"defaultns" => "In diesen Namensräumen soll standardmäßig gesucht werden:",
-'default' => 'Voreinstellung',
-'files' => 'Dateien',
-'imagemaxsize' => 'Maximale Bildgröße auf Bildbeschreibungsseiten:',
-'thumbsize' => 'Größe der Vorschaubilder (Thumbnails):',
-'showbigimage' => 'Version mit hoher Auflösung herunterladen ($1 x $2 Pixel, $3 kB)',
+'preferences' => 'Einstellungen',
+'preferences-summary' => 'Auf dieser Spezialseite können Sie Ihre Zugangsdaten ändern und bestimmte Teile der Oberfläche individuell anpassen ',
+'mypreferences' => 'Einstellungen',
+'prefsnologin' => 'Nicht angemeldet',
+'prefsnologintext' => 'Sie müssen [[{{ns:special}}:Userlogin|angemeldet]] sein, um Ihre Einstellungen ändern zu können.',
+'prefsreset' => 'Die Eingaben wurden verworfen, es erfolgte keine Speicherung.',
+'qbsettings' => 'Seitenleiste',
+'changepassword' => 'Passwort ändern',
+'skin' => 'Skin',
+'math' => 'TeX',
+'dateformat' => 'Datumsformat',
+'datedefault' => 'Standard',
+'datetime' => 'Datum und Zeit',
+'math_failure' => 'Parser-Fehler',
+'math_unknown_error' => 'Unbekannter Fehler',
+'math_unknown_function' => 'Unbekannte Funktion',
+'math_lexing_error' => "'Lexing'-Fehler",
+'math_syntax_error' => 'Syntaxfehler',
+'math_image_error' => 'die PNG-Konvertierung schlug fehl.',
+'math_bad_tmpdir' => 'Kann das Temporärverzeichnis für mathematische Formeln nicht anlegen oder beschreiben.',
+'math_bad_output' => 'Kann das Zielverzeichnis für mathematische Formeln nicht anlegen oder beschreiben.',
+'math_notexvc' => 'Das texvc-Programm kann nicht gefunden werden. Bitte beachten Sie math/README.',
+'prefs-personal' => 'Benutzerdaten',
+'prefs-rc' => 'Anzeige von „Letzte Änderungen“',
+'prefs-watchlist' => 'Beobachtungsliste',
+'prefs-watchlist-days' => 'Anzahl der Tage, die die Beobachtungsliste standardmäßig umfassen soll:',
+'prefs-watchlist-edits' => 'Anzahl der Einträge in der erweiterten Beobachtungsliste:',
+'prefs-misc' => 'Verschiedenes',
+'saveprefs' => 'Einstellungen speichern',
+'resetprefs' => 'Eingaben verwerfen',
+'oldpassword' => 'Altes Passwort:',
+'newpassword' => 'Neues Passwort:',
+'retypenew' => 'Neues Passwort (nochmal):',
+'textboxsize' => 'Bearbeiten',
+'rows' => 'Zeilen',
+'columns' => 'Spalten',
+'searchresultshead' => 'Suche',
+'resultsperpage' => 'Treffer pro Seite:',
+'contextlines' => 'Zeilen pro Treffer:',
+'contextchars' => 'Zeichen pro Zeile:',
+'stubthreshold' => 'Kleine Seiten markieren bis (Byte):',
+'recentchangescount' => 'Anzahl der Einträge in „Letzte Änderungen“ und „Neue Artikel“:',
+'savedprefs' => 'Ihre Einstellungen wurden gespeichert.',
+'timezonelegend' => 'Zeitzone',
+'timezonetext' => 'Geben Sie die Anzahl der Stunden ein, die zwischen Ihrer Zeitzone und UTC liegen.',
+'localtime' => 'Ortszeit:',
+'timezoneoffset' => 'Unterschied¹:',
+'servertime' => 'Aktuelle Zeit auf dem Server:',
+'guesstimezone' => 'Vom Browser übernehmen',
+'allowemail' => 'E-Mail-Empfang von anderen Benutzern ermöglichen.',
+'defaultns' => 'In diesen Namensräumen soll standardmäßig gesucht werden:',
+'default' => 'Voreinstellung',
+'files' => 'Dateien',
+
+# User rights
+'userrights-lookup-user' => 'Verwalte Gruppenzugehörigkeit ',
+'userrights-user-editname' => 'Benutzername:',
+'editusergroup' => 'Benutzerrechte bearbeiten',
+'userrights-editusergroup' => 'Bearbeite Gruppenzugehörigkeit des Benutzers',
+'saveusergroups' => 'Gruppenzugehörigkeiten speichern',
+'userrights-groupsmember' => 'Mitglied von:',
+'userrights-groupsavailable' => 'Verfügbare Gruppen:',
+'userrights-groupshelp' => "Wählen Sie die Gruppen, aus denen der Benutzer entfernt oder zu denen er hinzugefügt werden soll.
+Nicht selektierte Gruppen werden nicht geändert. Eine Selektion kann mit '''Strg + Linksklick''' (bzw. Ctrl + Linksklick) entfernt werden.",
-# Recent changes
-#
-"changes" => "Änderungen",
-"recentchanges" => "Letzte Änderungen",
-'recentchangestext' => 'Auf dieser Seite können Sie die letzten Änderungen auf \'\'\'{{SITENAME}}\'\'\' nachverfolgen.',
-'rcnote' => 'Angezeigt werden die letzten <b>$1</b> Änderungen der letzten <b>$2</b> Tage (Stand: $3).<br />(<b>N</b> - neuer Beitrag; <b>K</b> - kleine Änderung; <b>B</b> - Bot-Änderung)',
-'rcnotefrom' => 'Angezeigt werden die Änderungen seit <b>$2</b> (max. <b>$1</b> Einträge).',
-'rclistfrom' => 'Nur Änderungen seit $1 zeigen.',
-'rclinks' => 'Zeige die letzten $1 Änderungen der letzten $2 Tage.<br />$3',
-"diff" => "Unterschied",
-"hist" => "Versionen",
-"hide" => "ausblenden",
-"show" => "einblenden",
-'minoreditletter' => 'K',
-'newpageletter' => 'N',
-'boteditletter' => 'B',
-'sectionlink' => '→',
-'number_of_watching_users_pageview' => '[$1 beobachtende/r Benutzer]',
-'rc_categories' => 'Nur Kategorien (getrennt mit „|“):',
-'rc_categories_any' => 'Alle',
+# Groups
+'group' => 'Gruppe:',
+'group-bot' => 'Bots',
+'group-sysop' => 'Administratoren',
+'group-bureaucrat' => 'Bürokraten',
+'group-all' => '(alle)',
+'group-bot-member' => 'Bot',
+'group-sysop-member' => 'Administrator',
+'group-bureaucrat-member' => 'Bürokrat',
-# Upload
-#
-"upload" => "Hochladen",
-"uploadbtn" => "Datei hochladen",
-'reupload' => 'Abbrechen',
-"reuploaddesc" => "Zurück zur Hochladen-Seite.",
-"uploadnologin" => "Nicht angemeldet",
-'uploadnologintext' => 'Sie müssen [[{{ns:special}}:Userlogin|angemeldet sein]], um Dateien hochladen zu können.',
-'upload_directory_read_only' => 'Der Webserver hat keine Schreibrechte für das Upload-Verzeichnis ($1).',
-"uploaderror" => "Fehler beim Hochladen",
-'uploadtext' => 'Gehen Sie zu der [[{{ns:special}}:Imagelist|Liste hochgeladener Dateien]], um vorhandene Dateien zu suchen und anzuzeigen.
-
-Benutzen Sie dieses Formular, um neue Dateien hochzuladen. Klicken Sie auf \'\'\'„Durchsuchen...“\'\'\', um einen Dateiauswahl-Dialog zu öffnen.
-Nach der Auswahl einer Datei wird der Dateiname im Textfeld \'\'\'„Quelldatei“\'\'\' angezeigt.
-Bestätigen Sie dann die Copyright-Vereinbarung und klicken anschließend auf \'\'\'„Datei hochladen“\'\'\'.
-Dies kann eine Weile dauern, besonders bei einer langsamen Internet-Verbindung.
+'grouppage-bot' => '{{ns:project}}:Bots',
+'grouppage-sysop' => '{{ns:project}}:Administratoren',
+'grouppage-bureaucrat' => '{{ns:project}}:Bürokraten',
-Um ein \'\'\'Bild\'\'\' in einer Seite zu verwenden, schreiben Sie an Stelle des Bildes zum Beispiel:
-* \'\'\'<tt><nowiki>[[{{ns:image}}:Datei.jpg]]</nowiki></tt>\'\'\'
-* \'\'\'<tt><nowiki>[[{{ns:image}}:Datei.jpg|Link-Text]]</nowiki></tt>\'\'\'
+# Recent changes
+'changes' => 'Änderungen',
+'recentchanges' => 'Letzte Änderungen',
+'recentchangestext' => "Auf dieser Seite können Sie die letzten Änderungen auf '''{{SITENAME}}''' nachverfolgen.",
+'recentchanges-feed-description' => 'Verfolge mit diesem Feed die letzten Änderungen in {{SITENAME}}.',
+'rcnote' => "Angezeigt werden die letzten <b>$1</b> Änderungen der letzten <b>$2</b> Tage. Stand: $3. (<b><tt>Neu</tt></b>&nbsp;– neuer Eintrag; <b><tt>K</tt></b>&nbsp;– kleine Änderung; <b><tt>B</tt></b>&nbsp;– Änderung durch einen Bot; ''(± Zahl)''&nbsp;– Größenänderung in Byte)",
+'rcnotefrom' => 'Angezeigt werden die Änderungen seit <b>$2</b> (max. <b>$1</b> Einträge).',
+'rclistfrom' => 'Nur Änderungen seit $1 zeigen.',
+'rcshowhideminor' => 'Kleine Änderungen $1',
+'rcshowhidebots' => 'Bots $1',
+'rcshowhideliu' => 'Angemeldete Benutzer $1',
+'rcshowhideanons' => 'Anonyme Benutzer $1',
+'rcshowhidepatr' => 'Überprüfte Änderungen $1',
+'rcshowhidemine' => 'Eigene Beiträge $1',
+'rclinks' => 'Zeige die letzten $1 Änderungen der letzten $2 Tage.<br />$3',
+'diff' => 'Unterschied',
+'hist' => 'Versionen',
+'hide' => 'ausblenden',
+'show' => 'einblenden',
+'minoreditletter' => 'K',
+'newpageletter' => 'N',
+'boteditletter' => 'B',
+'sectionlink' => '→',
+'number_of_watching_users_pageview' => '[$1 beobachtende/r Benutzer]',
+'rc_categories' => 'Nur Kategorien (getrennt mit „|“):',
+'rc_categories_any' => 'Alle',
+'rc-change-size' => '$1',
-Um \'\'\'Mediendateien\'\'\' einzubinden, verwenden Sie zum Beispiel:
-* \'\'\'<tt><nowiki>[[{{ns:media}}:Datei.ogg]]</nowiki></tt>\'\'\'
-* \'\'\'<tt><nowiki>[[{{ns:media}}:Datei.ogg|Link-Text]]</nowiki></tt>\'\'\'
+# Upload
+'upload' => 'Hochladen',
+'uploadbtn' => 'Datei hochladen',
+'reupload' => 'Abbrechen',
+'reuploaddesc' => 'Zurück zur Hochladen-Seite.',
+'uploadnologin' => 'Nicht angemeldet',
+'uploadnologintext' => 'Sie müssen [[{{ns:special}}:Userlogin|angemeldet sein]], um Dateien hochladen zu können.',
+'upload_directory_read_only' => 'Der Webserver hat keine Schreibrechte für das Upload-Verzeichnis ($1).',
+'uploaderror' => 'Fehler beim Hochladen',
+'uploadtext' => "Gehen Sie zu der [[{{ns:special}}:Imagelist|Liste hochgeladener Dateien]], um vorhandene Dateien zu suchen und anzuzeigen.
+
+Benutzen Sie dieses Formular, um neue Dateien hochzuladen. Klicken Sie auf '''„Durchsuchen...“''', um einen Dateiauswahl-Dialog zu öffnen.
+Nach der Auswahl einer Datei wird der Dateiname im Textfeld '''„Quelldatei“''' angezeigt.
+Bestätigen Sie dann die Copyright-Vereinbarung und klicken anschließend auf '''„Datei hochladen“'''.
+Dies kann eine Weile dauern, besonders bei einer langsamen Internet-Verbindung.
-Bitte beachten Sie, dass, genau wie bei normalen Seiteninhalten, andere Benutzer Ihre Dateien löschen oder verändern können.',
-"uploadlog" => "Datei-Logbuch",
-"uploadlogpage" => "Datei-Logbuch",
-"uploadlogpagetext" => "Hier ist die Liste der letzten hochgeladenen Dateien.
-Alle Zeiten sind UTC.
-<ul>
-</ul>",
-"filename" => "Dateiname",
-"filedesc" => "Beschreibung",
-'fileuploadsummary' => 'Beschreibung/Quelle:',
-"filestatus" => "Copyright-Status",
-"filesource" => "Quelle",
-'copyrightpage' => '{{ns:project}}:Urheberrecht',
-'copyrightpagename' => '{{SITENAME}} Urheberrecht',
-"uploadedfiles" => "Hochgeladene Dateien",
-'ignorewarning' => 'Warnung ignorieren und Datei speichern.',
-'ignorewarnings' => 'Warnungen ignorieren',
-'minlength' => 'Dateiname müssen mindestens drei Buchstaben lang sein.',
-'illegalfilename' => 'Der Dateiname „$1“ enthält mindestens ein nicht erlaubtes Zeichen. Bitte benennen Sie die Datei um und versuchen Sie diese erneut hochzuladen.',
-'badfilename' => 'Der Dateiname wurde in „$1“ geändert.',
-'badfiletype' => '„.$1“ ist kein empfohlenes Dateiformat.',
-'largefile' => 'Es wird nicht empfohlen Dateien hochzuladen, die größer als $1 Bytes sind. Diese Datei ist $2 Bytes groß.',
-'largefileserver' => 'Die Datei ist größer als die vom Server eingestellte Maximalgröße.',
-'emptyfile' => 'Die hochgeladene Datei ist leer. Der Grund kann ein Tippfehler im Dateinamen sein. Bitte kontrollieren Sie, ob Sie die Datei wirklich hochladen wollen.',
-'fileexists' => 'Eine Datei mit diesem Namen existiert bereits. Wenn Sie auf „Datei speichern“ klicken, wird die Datei überschrieben. Bitte prüfen Sie $1, wenn Sie sich nicht sicher sind.',
-'fileexists-forbidden' => 'Mit diesem Namen existiert bereits eine Datei. Bitte gehen Sie zurück und laden Ihre Datei unter einem anderen Namen hoch. [[{{ns:image}}:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'Mit diesem Namen existiert bereits eine Datei. Bitte gehen Sie zurück und laden Sie diese Datei unter einem anderen Namen hoch. [[{{ns:image}:$1|thumb|center|$1]]',
-'uploadedimage' => '„[[$1]]“ hochgeladen',
-'uploadscripted' => 'Diese Datei enthält HTML- oder Scriptcode der irrtümlich von einem Webbrowser ausgeführt werden könnte.',
-'uploadvirus' => 'Diese Datei enthält einen Virus! Details: $1',
-'uploadcorrupt' => 'Die Datei ist beschädigt oder hat einen falschen Namen. Bitte überprüfen Sie die Datei und laden Sie sie erneut hoch.',
-"successfulupload" => "Erfolgreich hochgeladen",
-'fileuploaded' => 'Die Datei „$1“ wurde erfolgreich hochgeladen. Bitte folgen Sie dem Link $2 zur Beschreibungsseite und geben Sie weitere Informationen zur Datei an.
+Um ein '''Bild''' in einer Seite zu verwenden, schreiben Sie an Stelle des Bildes zum Beispiel:
+* '''<tt><nowiki>[[{{ns:image}}:Datei.jpg]]</nowiki></tt>'''
+* '''<tt><nowiki>[[{{ns:image}}:Datei.jpg|Link-Text]]</nowiki></tt>'''
+
+Um '''Mediendateien''' einzubinden, verwenden Sie zum Beispiel:
+* '''<tt><nowiki>[[{{ns:media}}:Datei.ogg]]</nowiki></tt>'''
+* '''<tt><nowiki>[[{{ns:media}}:Datei.ogg|Link-Text]]</nowiki></tt>'''
+
+Bitte beachten Sie, dass, genau wie bei normalen Seiteninhalten, andere Benutzer Ihre Dateien löschen oder verändern können.",
+'uploadlog' => 'Datei-Logbuch',
+'uploadlogpage' => 'Datei-Logbuch',
+'uploadlogpagetext' => 'Hier ist die Liste der letzten hochgeladenen Dateien, siehe auch [[{{ns:spezial}}:Newimages]].',
+'filename' => 'Dateiname',
+'filedesc' => 'Beschreibung',
+'fileuploadsummary' => 'Beschreibung/Quelle:',
+'filestatus' => 'Copyright-Status',
+'filesource' => 'Quelle',
+'copyrightpage' => '{{ns:project}}:Urheberrecht',
+'copyrightpagename' => '{{SITENAME}} Urheberrecht',
+'uploadedfiles' => 'Hochgeladene Dateien',
+'ignorewarning' => 'Warnung ignorieren und Datei speichern.',
+'ignorewarnings' => 'Warnungen ignorieren',
+'minlength' => 'Dateinamen müssen mindestens drei Buchstaben lang sein.',
+'illegalfilename' => 'Der Dateiname „$1“ enthält mindestens ein nicht erlaubtes Zeichen. Bitte benennen Sie die Datei um und versuchen Sie diese erneut hochzuladen.',
+'badfilename' => 'Der Dateiname wurde in „$1“ geändert.',
+'badfiletype' => '„.$1“ ist kein empfohlenes Dateiformat.',
+'large-file' => 'Die Dateigröße sollte nach Möglichkeit $1 nicht überschreiten. Diese Datei ist $2 groß.',
+'largefileserver' => 'Die Datei ist größer als die vom Server eingestellte Maximalgröße.',
+'emptyfile' => 'Die hochgeladene Datei ist leer. Der Grund kann ein Tippfehler im Dateinamen sein. Bitte kontrollieren Sie, ob Sie die Datei wirklich hochladen wollen.',
+'fileexists' => 'Eine Datei mit diesem Namen existiert bereits. Wenn Sie auf „Datei speichern“ klicken, wird die Datei überschrieben. Bitte prüfen Sie $1, wenn Sie sich nicht sicher sind.',
+'fileexists-forbidden' => 'Mit diesem Namen existiert bereits eine Datei. Bitte gehen Sie zurück und laden Ihre Datei unter einem anderen Namen hoch. [[{{ns:image}}:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'Mit diesem Namen existiert bereits eine Datei. Bitte gehen Sie zurück und laden Sie diese Datei unter einem anderen Namen hoch. [[{{ns:image}:$1|thumb|center|$1]]',
+'successfulupload' => 'Erfolgreich hochgeladen',
+'fileuploaded' => 'Die Datei „$1“ wurde erfolgreich hochgeladen. Bitte folgen Sie dem Link $2 zur Beschreibungsseite und geben Sie weitere Informationen zur Datei an.
Falls es sich um ein Bild gehandelt hat, so können Sie mit <tt><nowiki>[[{{ns:image}}:$1|thumb|Description]]</nowiki></tt> ein Vorschaubild auf der Seite erzeugen lassen.',
-"uploadwarning" => "Warnung",
-"savefile" => "Datei speichern",
-'uploadedimage' => '„[[$1]]“ hochgeladen',
-'uploaddisabledtext' => 'Das Hochladen von Dateien ist in diesem Wiki deaktiviert.',
-'sourcefilename' => 'Quelldatei',
-'destfilename' => 'Dateiname ändern in',
-'watchthisupload' => 'Diese Seite beobachten',
-'filewasdeleted' => 'Eine Datei mit diesem Namen wurde schon einmal hochgeladen und zwischenzeitlich wieder gelöscht. Bitte prüfen Sie zuerst den Eintrag im $1, bevor Sie die Datei wirklich speichern.',
-
-'license' => 'Lizenz',
-'nolicense' => 'keine Vorauswahl',
-'upload_source_url' => ' (gültige, öffentlich zugängliche URL)',
-'upload_source_file' => ' (eine Datei auf Ihrem Computer)',
+'uploadwarning' => 'Warnung',
+'savefile' => 'Datei speichern',
+'uploadedimage' => 'hat [[$1]] hochgeladen',
+'uploaddisabled' => 'Entschuldigung, das Hochladen ist deaktiviert.',
+'uploaddisabledtext' => 'Das Hochladen von Dateien ist in {{SITENAME}} deaktiviert.',
+'uploadscripted' => 'Diese Datei enthält HTML- oder Scriptcode, der irrtümlich von einem Webbrowser ausgeführt werden könnte.',
+'uploadcorrupt' => 'Die Datei ist beschädigt oder hat einen falschen Namen. Bitte überprüfen Sie die Datei und laden Sie sie erneut hoch.',
+'uploadvirus' => 'Diese Datei enthält einen Virus! Details: $1',
+'sourcefilename' => 'Quelldatei',
+'destfilename' => 'Dateiname ändern',
+'watchthisupload' => 'Diese Seite beobachten',
+'filewasdeleted' => 'Eine Datei mit diesem Namen wurde schon einmal hochgeladen und zwischenzeitlich wieder gelöscht. Bitte prüfen Sie zuerst den Eintrag im $1, bevor Sie die Datei wirklich speichern.',
+
+'upload-proto-error' => 'Falsches Protokoll',
+'upload-proto-error-text' => 'Die URL muss mit <code>http://</code> oder <code>ftp://</code> beginnen.',
+'upload-file-error' => 'Interner Fehler',
+'upload-file-error-text' => 'Bei der Erstellung einer temporären Datei auf dem Server ist ein interner Fehler aufgetreten. Bitte informieren Sie einen System-Administrator.',
+'upload-misc-error' => 'Unbekannter Fehler beim Hochladen',
+'upload-misc-error-text' => 'Beim Hochladen ist ein unbekannter Fehler aufgetreten. Prüfen Sie die URL auf Fehler, den Online-Status der Seite und versuchen Sie es erneut. Wenn das Problem weiterbesteht, informieren Sie einen System-Administrator.',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'URL ist nicht erreichbar',
+'upload-curl-error6-text' => 'Die angegebene URL ist nicht erreichbar. Prüfen Sie sowohl die URL auf Fehler als auch den Online-Status der Seite.',
+'upload-curl-error28' => 'Zeitüberschreitung beim Hochladen',
+'upload-curl-error28-text' => 'Die Seite braucht zu lange für eine Antwort. Prüfen Sie, ob die Seite online ist, warten Sie einen kurzen Moment und versuchen Sie es dann erneut. Es kann sinnvoll sein, einen erneuten Versuch zu einer anderen Zeit zu probieren..',
+
+'license' => 'Lizenz',
+'nolicense' => 'keine Vorauswahl',
+'upload_source_url' => ' (gültige, öffentlich zugängliche URL)',
+'upload_source_file' => ' (eine Datei auf Ihrem Computer)',
# Image list
-#
-'imagelist' => 'Dateiliste',
-'imagelisttext' => 'Hier ist eine Liste von \'\'\'$1\'\'\' {{PLURAL:$1|Datei|Dateien}}, sortiert $2.',
-'imagelistforuser' => 'Diese Seite zeigt nur Dateien, die von $1 hochgeladen wurden.',
-'getimagelist' => 'Lade Dateiliste',
-"ilsubmit" => "Suche",
-'showlast' => 'Zeige die letzten $1 Dateien, sortiert nach $2.',
-"byname" => "nach Name",
-"bydate" => "nach Datum",
-'bysize' => 'nach Größe',
-"imgdelete" => "Löschen",
-"imgdesc" => "Beschreibung",
-'imgfile' => 'Datei',
-'imglegend' => 'Legende: (Beschreibung) = Zeige/Bearbeite Dateibeschreibung.',
-'imghistory' => 'Dateiversionen',
-"revertimg" => "Zurücksetzen",
-"deleteimg" => "Löschen",
-'deleteimgcompletely' => 'Alle Versionen dieser Datei löschen',
-'imghistlegend' => 'Legende: (Aktuell) = Dies ist die aktuelle Datei, (Löschen) = lösche diese alte Version, (Zurücksetzen) = diese alte Version wiederherstellen.',
-'imagelinks' => 'Dateiverweise',
-'linkstoimage' => 'Die folgenden Seiten benutzen diese Datei:',
-'nolinkstoimage' => 'Keine Seite benutzt diese Datei.',
-'sharedupload' => 'Diese Datei ist ein gemeinsam genutzter Upload und kann von anderen Projekten verwendet werden.',
-'shareduploadwiki' => 'Für weitere Informationen siehe $1.',
-'shareduploadwiki-linktext' => 'Dateibeschreibungsseite',
-'noimage' => 'Eine Datei mit diesem Namen existiert nicht, Sie können sie jedoch $1.',
-'noimage-linktext' => 'hochladen',
-'uploadnewversion-linktext' => 'Eine neue Version dieser Datei hochladen',
-'imagelist_date' => 'Datum',
-'imagelist_name' => 'Name',
-'imagelist_user' => 'Benutzer',
-'imagelist_size' => 'Größe (Byte)',
-'imagelist_description' => 'Beschreibung',
-'imagelist_search_for' => 'Suche nach Datei:',
-
+'imagelist' => 'Dateiliste',
+'imagelist-summary' => 'Diese Spezialseite listet alle hochgeladenen Dateien auf. Standardmäßig werden die zuletzt hochgeladenen Dateien zuerst angezeigt. Durch einen Klick auf die Spaltenüberschriften kann die Sortierung umgedreht werden oder es kann nach einer anderen Spalte sortiert werden.',
+'imagelisttext' => "Hier ist eine Liste von '''$1''' {{PLURAL:$1|Datei|Dateien}}, sortiert $2.",
+'imagelistforuser' => 'Diese Seite zeigt nur Dateien, die von $1 hochgeladen wurden.',
+'getimagelist' => 'Lade Dateiliste',
+'ilsubmit' => 'Suche',
+'showlast' => 'Zeige die letzten $1 Dateien, sortiert nach $2.',
+'byname' => 'nach Name',
+'bydate' => 'nach Datum',
+'bysize' => 'nach Größe',
+'imgdelete' => 'Löschen',
+'imgdesc' => 'Beschreibung',
+'imgfile' => 'Datei',
+'imglegend' => 'Legende: (Beschreibung) = Zeige/Bearbeite Dateibeschreibung.',
+'imghistory' => 'Dateiversionen',
+'revertimg' => 'Zurücksetzen',
+'deleteimg' => 'Löschen',
+'deleteimgcompletely' => 'Alle Versionen dieser Datei löschen',
+'imghistlegend' => 'Legende: (Aktuell) = Dies ist die aktuelle Datei, (Löschen) = lösche diese alte Version, (Zurücksetzen) = verwende wieder diese alte Version.',
+'imagelinks' => 'Dateiverweise',
+'linkstoimage' => 'Die folgenden Seiten benutzen diese Datei:',
+'nolinkstoimage' => 'Keine Seite benutzt diese Datei.',
+'sharedupload' => 'Diese Datei ist ein gemeinsam genutzter Upload und kann von anderen Projekten verwendet werden.',
+'shareduploadwiki' => 'Für weitere Informationen siehe $1.',
+'shareduploadwiki-linktext' => 'Datei-Beschreibungsseite',
+'noimage' => 'Eine Datei mit diesem Namen existiert nicht, Sie können sie jedoch $1.',
+'noimage-linktext' => 'hochladen',
+'uploadnewversion-linktext' => 'Eine neue Version dieser Datei hochladen',
+'imagelist_date' => 'Datum',
+'imagelist_name' => 'Name',
+'imagelist_user' => 'Benutzer',
+'imagelist_size' => 'Größe (Byte)',
+'imagelist_description' => 'Beschreibung',
+'imagelist_search_for' => 'Suche nach Datei:',
+
+# MIME search
+'mimesearch' => 'Suche nach MIME-Typ',
+'mimetype' => 'MIME-Typ:',
+'download' => 'Herunterladen',
+
+# Unwatched pages
+'unwatchedpages' => 'Nicht beobachtete Seiten',
+'unwatchedpages-summary' => 'Diese Spezialseite zeigt alle Seiten, die von keinem Benutzer auf einer Beobachtungsliste stehen.',
# List redirects
-'listredirects' => 'Weiterleitungsliste',
+'listredirects' => 'Weiterleitungsliste',
+'listredirects-summary' => 'Diese Spezialseite listet Weiterleitungen auf.',
# Unused templates
-'unusedtemplates' => 'Nicht benutzte Vorlagen',
-'unusedtemplatestext' => 'Diese Seite listet alle Vorlagen auf, die nicht in anderen Seiten eingebunden sind. Überprüfen Sie andere Links zu den Vorlagen, bevor Sie diese löschen.',
-'unusedtemplateswlh' => 'Andere Verweise',
+'unusedtemplates' => 'Nicht benutzte Vorlagen',
+'unusedtemplates-summary' => 'Diese Seite listet alle Vorlagen auf, die nicht in anderen Seiten eingebunden sind. Überprüfen Sie andere Links zu den Vorlagen, bevor Sie diese löschen.',
+'unusedtemplatestext' => '',
+'unusedtemplateswlh' => 'Andere Verweise',
# Random redirect
'randomredirect' => 'Zufällige Weiterleitung',
# Statistics
-#
-"statistics" => "Statistik",
-"sitestats" => "Seitenstatistik",
-"userstats" => "Benutzerstatistik",
-'sitestatstext' => 'Es gibt insgesamt \'\'\'$1\'\'\' Seiten in der Datenbank.
+'statistics' => 'Statistik',
+'sitestats' => 'Seitenstatistik',
+'userstats' => 'Benutzerstatistik',
+'sitestatstext' => "Es gibt insgesamt '''$1''' Seiten in der Datenbank.
Das schliesst Diskussionsseiten, Seiten über {{SITENAME}}, kleine Seiten, Weiterleitungen und andere Seiten ein,
die eventuell nicht als Seiten gewertet werden können.
-Diese ausgenommen gibt es \'\'\'$2\'\'\' Seiten, die als Seite gewertet werden können.
+Diese ausgenommen gibt es '''$2''' Seiten, die als Seite gewertet werden können.
+
+Insgesamt wurden '''$8''' Dateien hochgeladen.
-Insgesamt wurden \'\'\'$8\'\'\' Dateien hochgeladen.
+Insgesamt gab es '''$3''' Seitenabrufe und '''$4''' Seitenbearbeitungen seit dieses Wiki eingerichtet wurde.
+Daraus ergeben sich '''$5''' Bearbeitungen pro Seite und '''$6''' Seitenabrufe pro Bearbeitung.
-Insgesamt gab es \'\'\'$3\'\'\' Seitenabrufe und \'\'\'$4\'\'\' Seitenbearbeitungen seit dieses Wiki eingerichtet wurde.
-Daraus ergeben sich \'\'\'$5\'\'\' Bearbeitungen pro Seite und \'\'\'$6\'\'\' Seitenabrufe pro Bearbeitung.
+Länge der „Job queue“: '''$7'''",
+'userstatstext' => "Es gibt '''$1''' registrierte [[{{ns:special}}:Listusers|Benutzer]].
+Davon haben '''$2''' (=$4%) $5-Rechte.",
+'statistics-mostpopular' => 'Meist besuchte Seiten',
-Länge der „Job queue“: \'\'\'$7\'\'\'',
-'userstatstext' => 'Es gibt \'\'\'$1\'\'\' registrierte [[{{ns:special}}:Listusers|Benutzer]].
-Davon sind \'\'\'$2\'\'\' (=$4%) $5.',
-'statistics-mostpopular' => 'Meist besuchte Seiten',
+'disambiguations' => 'Begriffsklärungsseiten',
+'disambiguations-summary' => '',
+'disambiguationspage' => '{{ns:project}}:Begriffsklärung',
+'disambiguationstext' => 'Die folgenden Seiten verweisen auf eine <i>Seite zur Begriffsklärung</i>. Sie sollten statt dessen auf die eigentlich gemeinte Seite verweisen.<br />Eine Seite wird als Begriffsklärungsseite behandelt, wenn $1 auf sie verweist.<br />Verweise aus Namensräumen werden hier <i>nicht</i> aufgelistet.',
-# Maintenance Page
-#
-"disambiguations" => "Begriffsklärungsseiten",
-'disambiguationspage' => '{{ns:project}}:Begriffsklärung',
-"disambiguationstext" => "Die folgenden Seiten verweisen auf eine <i>Seite zur Begriffsklärung</i>. Sie sollten statt dessen auf die eigentlich gemeinte Seite verweisen.<br />Eine Seite wird als Begriffsklärungsseite behandelt, wenn $1 auf sie verweist.<br />Verweise aus Namensräumen werden hier <i>nicht</i> aufgelistet.",
-'doubleredirects' => 'Doppelte Weiterleitungen',
-'doubleredirectstext' => '<b>Achtung:</b> Diese Liste kann „falsche Positive“ enthalten. Das ist dann der Fall, wenn eine Weiterleitung außer dem Weiterleitungs-Verweis noch weiteren Text mit anderen Verweisen enthält. Letztere sollten dann entfernt werden.',
-'brokenredirects' => 'Kaputte Weiterleitungen',
-'brokenredirectstext' => 'Die folgenden Weiterleitungen verweisen auf nicht existierende Seiten:',
+'doubleredirects' => 'Doppelte Weiterleitungen',
+'doubleredirects-summary' => '<b>Achtung:</b> Diese Liste kann „falsche Positive“ enthalten. Das ist dann der Fall, wenn eine Weiterleitung außer dem Weiterleitungs-Verweis noch weiteren Text mit anderen Verweisen enthält. Letztere sollten dann entfernt werden.',
+'doubleredirectstext' => '',
+
+'brokenredirects' => 'Kaputte Weiterleitungen',
+'brokenredirects-summary' => 'Diese Spezialseite listet Weiterleitungen auf nicht existierende Artikel auf.',
+'brokenredirectstext' => '',
# Miscellaneous special pages
-#
-"lonelypages" => "Verwaiste Seiten",
-'lonelypagestext' => 'Auf die nachfolgenden Seiten wird innerhalb dieses Wikis nicht von anderen Seiten aus verwiesen.',
-'unusedimages' => 'Verwaiste Dateien',
-"popularpages" => "Beliebte Seiten",
-'nviews' => '{{PLURAL:$1|eine Abfrage|$1 Abfragen}}',
-'wantedcategories' => 'Gewünschte Kategorieseiten',
-'wantedpages' => 'Gewünschte Seiten',
-'mostlinkedcategories' => 'Meist benutzte Kategorien',
-'mostcategories' => 'Meist kategorisierte Seiten',
-'mostimages' => 'Meist benutzte Dateien',
-'mostrevisions' => 'Seiten mit den meisten Versionen',
-'nlinks' => '{{PLURAL:$1|ein Verweis|$1 Verweise}}',
-'nmembers' => '{{PLURAL:$1|ein Eintrag|$1 Einträge}}',
-'randompage' => 'Zufällige Seite',
-"shortpages" => "Kurze Seiten",
-"longpages" => "Lange Seiten",
-"listusers" => "Benutzerverzeichnis",
-"specialpages" => "Spezialseiten",
-"spheading" => "Spezialseiten",
-'restrictedpheading' => 'Spezialseiten für Administratoren',
-'recentchangeslinked' => 'Änderungen an verlinkten Seiten',
-'rclsub' => '(auf Seiten von „$1“)',
-"newpages" => "Neue Seiten",
-'newpages-username' => 'Benutzername:',
-'ancientpages' => 'Lange unbearbeitete Seiten',
-"movethispage" => "Seite verschieben",
-'unusedimagestext' => '<p>Bitte beachten Sie, dass andere Wikis möglicherweise einige dieser Dateien verwenden.',
-'unusedcategoriestext' => 'Die folgenden Kategorieseiten bestehen, obwohl sie momentan nicht in Verwendung sind.',
-'booksources' => 'ISBN-Suche',
-"booksourcetext" => "Dies ist eine Liste mit Links zu Internetseiten, die neue und gebrauchte Bücher verkaufen. Dort kann es auch weitere Informationen über die Bücher geben, die Sie interessieren. {{SITENAME}} ist mit keinem dieser Anbieter geschäftlich verbunden.",
-"alphaindexline" => "$1 bis $2",
-'newimages' => 'Neue Dateien',
-'showhidebots' => '(Bots $1)',
-'mimesearch' => 'Suche nach MIME-Typ',
-'mimetype' => 'MIME-Typ:',
-'download' => 'Herunterladen',
-'mostlinked' => 'Häufig verlinkte Seiten',
-'uncategorizedpages' => 'Nicht kategorisierte Seiten',
-'uncategorizedcategories' => 'Nicht kategorisierte Kategorien',
-'uncategorizedimages' => 'Nicht kategorisierte Dateien',
-'unusedcategories' => 'Verwaiste Kategorien',
-'unwatchedpages' => 'Nicht beobachtete Seiten',
-'categoriespagetext' => 'Die folgenden Kategorien existieren in diesem Wiki.',
-'data' => 'Daten',
-'groups' => 'Benutzergruppen',
-'noimages' => 'Keine Dateien gefunden.',
-
-# short names for language variants used for language conversion links.
-# to disable showing a particular link, set it to 'disable', e.g.
-# 'variantname-zh-sg' => 'disable',
-'variantname-zh-cn' => 'cn',
-'variantname-zh-tw' => 'tw',
-'variantname-zh-hk' => 'hk',
-'variantname-zh-sg' => 'sg',
-'variantname-zh' => 'zh',
-# variants for Serbian language
-'variantname-sr-ec' => 'sr-ec',
-'variantname-sr-el' => 'sr-el',
-'variantname-sr-jc' => 'sr-jc',
-'variantname-sr-jl' => 'sr-jl',
-'variantname-sr' => 'sr',
-# variants for Kazakh language
-'variantname-kk-tr' => 'kk-tr',
-'variantname-kk-kz' => 'kk-kz',
-'variantname-kk-cn' => 'kk-cn',
-'variantname-kk' => 'kk',
+'nbytes' => '$1 {{PLURAL:$1|Byte|Bytes}}',
+'ncategories' => '$1 {{PLURAL:$1|Kategorie|Kategorien}}',
+'nlinks' => '{{PLURAL:$1|ein Verweis|$1 Verweise}}',
+'nmembers' => '{{PLURAL:$1|ein Eintrag|$1 Einträge}}',
+'nrevisions' => '{{PLURAL:$1|eine Bearbeitung|$1 Bearbeitungen}}',
+'nviews' => '{{PLURAL:$1|eine Abfrage|$1 Abfragen}}',
+'lonelypages' => 'Verwaiste Seiten',
+'lonelypages-summary' => 'Diese Spezialseite zeigt Seiten, auf die von keiner anderen Seite verlinkt wird. Diese verwaisten Seiten sind deshalb nicht erwünscht, oder eventuell fragwürdig, weil sie über die normale Navigation durch {{SITENAME}} nie aufgerufen werden können. ',
+'lonelypagestext' => '',
+'uncategorizedpages' => 'Nicht kategorisierte Seiten',
+'uncategorizedpages-summary' => 'Diese Spezialseite zeigt alle Seiten, die noch keiner Kategorie zugewiesen wurden.',
+'uncategorizedcategories' => 'Nicht kategorisierte Kategorien',
+'uncategorizedcategories-summary' => 'Diese Spezialseite zeigt alle Kategorien, die selbst noch keiner Kategorie zugewiesen wurden.',
+'uncategorizedimages' => 'Nicht kategorisierte Dateien',
+'uncategorizedimages-summary' => 'Diese Spezialseite zeigt alle Bilder, die keiner Kategorie zugewiesen wurden.',
+'unusedcategories' => 'Verwaiste Kategorien',
+'unusedimages' => 'Verwaiste Dateien',
+'popularpages' => 'Beliebte Seiten',
+'wantedcategories' => 'Benutzte, aber nicht angelegte Kategorien',
+'wantedcategories-summary' => 'Diese Spezialseite listet Kategorien auf, die zwar in Seiten verwendet werden, welche aber nicht als Kategorie angelegt worden sind.',
+'wantedpages' => 'Gewünschte Seiten',
+'wantedpages-summary' => 'Diese Spezialseite listet alle Seiten auf, die noch nicht existieren, auf die aber von bestehenden Seiten bereits verlinkt wird.',
+'mostlinked' => 'Häufig verlinkte Seiten',
+'mostlinked-summary' => 'Diese Spezialseite zeigt, unabhängig vom Namensraum, alle besonders häufig verlinkten Seiten an.',
+'mostlinkedcategories' => 'Meistbenutzte Kategorien',
+'mostlinkedcategories-summary' => 'Diese Spezialseite zeigt eine Liste der meistbenutzten Kategorien.',
+'mostcategories' => 'Meistkategorisierte Seiten',
+'mostcategories-summary' => 'Diese Spezialseite zeigt besonders häufig kategorisierte Seiten an.',
+'mostimages' => 'Meistbenutzte Dateien',
+'mostimages-summary' => 'Diese Spezialseite zeigt eine Liste der meistbenutzten Dateien.',
+'mostrevisions' => 'Seiten mit den meisten Versionen',
+'mostrevisions-summary' => 'Diese Spezialseite zeigt eine Liste von Seiten mit den meisten Bearbeitungen.',
+'allpages' => 'Alle Seiten',
+'allpages-summary' => "Diese Spezialseite listet den Seitenbestand von {{SITENAME}} von A bis Z auf. Sortiert wird alphabetisch, erst Zahlen, dann Großbuchstaben, Kleinbuchstaben und schließlich Sonderzeichen. ''A&nbsp;10'' findet sich vor ''AZ'', der ''Aal'' ist jedoch noch dahinter eingeordnet.",
+'prefixindex' => 'Alle Seiten (mit Präfix)',
+'prefixindex-summary' => 'Diese Spezialseite zeigt alle Seiten, die mit der eingegebenen Zeichenfolge („Präfix“) beginnen. Die Ausgabe kann auf einen Namensraum eingeschränkt werden.',
+'randompage' => 'Zufällige Seite',
+'shortpages' => 'Kurze Seiten',
+'shortpages-summary' => 'Diese Liste zeigt die kürzesten Seiten im Hauptnamensraum an. Gezählt werden die Zeichen des Textes wie er im Bearbeitungsfenster dargestellt wird, also in Wiki-Syntax und ohne die Inhalte eingebundener Vorlagen. Grundlage der Zählung ist der UTF-8-kodierte Text, nach dem beispielsweise deutsche Umlaute als zwei Zeichen gelten.',
+'longpages' => 'Lange Seiten',
+'longpages-summary' => 'Diese Liste zeigt die längsten Seiten im Hauptnamensraum an. Gezählt werden die Zeichen des Textes wie er im Bearbeitungsfenster dargestellt wird, also in Wiki-Syntax und ohne die Inhalte eingebundener Vorlagen. Grundlage der Zählung ist der UTF-8-kodierte Text, nach dem beispielsweise deutsche Umlaute als zwei Zeichen gelten.',
+'deadendpages' => 'Sackgassenseiten',
+'deadendpages-summary' => 'Diese Spezialseite zeigt eine Liste von Seiten, die keine Links auf andere Seiten oder nur Links auf noch nicht vorhandene Seiten enthalten.',
+'deadendpagestext' => '',
+'listusers' => 'Benutzerverzeichnis',
+'listusers-summary' => "Diese Spezialseite listet alle registrierten Benutzer auf; die Gesamtzahl kann [[Special:Statistics|hier]] eingesehen werden. Über das Auswahlfeld ''Gruppe'' lässt sich die Abfrage auf bestimmte Benutzergruppen einschränken.",
+'specialpages' => 'Spezialseiten',
+'specialpages-summary' => 'Diese Seite bietet einen Überblick aller Spezialseiten. Diese werden automatisch generiert und können nicht bearbeitet werden.',
+'spheading' => 'Spezialseiten für alle Benutzer',
+'restrictedpheading' => 'Spezialseiten für Administratoren',
+'recentchangeslinked' => 'Änderungen an verlinkten Seiten',
+'rclsub' => '(auf Seiten von „$1“)',
+'newpages' => 'Neue Seiten',
+'newpages-summary' => 'Diese Spezialseite listet alle neu erstellten Seiten der letzten 30 Tage auf. Die Ausgabe kann auf einen Namensraum und/oder Benutzernamen eingeschränkt werden.',
+'newpages-username' => 'Benutzername:',
+'ancientpages' => 'Seit längerem unbearbeitete Artikel',
+'ancientpages-summary' => 'Diese Spezialseite zeigt eine Liste von Seiten, die am längsten nicht mehr geändert worden sind.',
+'intl' => 'Interwiki-Links',
+'move' => 'verschieben',
+'movethispage' => 'Seite verschieben',
+'unusedimagestext' => '<p>Bitte beachten Sie, dass andere Wikis möglicherweise einige dieser Dateien verwenden.',
+'unusedcategoriestext' => 'Diese Spezialseite zeigt alle Kategorien, die selber keiner Kategorie zugewiesen wurden.',
+
+# Book sources
+'booksources' => 'ISBN-Suche',
+'booksources-summary' => 'Auf dieser Spezialseite können Sie eine ISBN eingeben und erhalten dann eine Liste mit Informations- und Bezugsmöglichkeiten zur gesuchten ISBN. Bindestriche oder Leerzeichen zwischen den Ziffern spielen für die Suche keine Rolle.',
+'booksources-search-legend' => 'Suche nach Bezugsquellen für Bücher',
+'booksources-isbn' => 'ISBN:',
+'booksources-go' => 'Suche',
+'booksources-text' => 'Dies ist eine Liste mit Links zu Internetseiten, die neue und gebrauchte Bücher verkaufen. Dort kann es auch weitere Informationen über die Bücher geben. Wikipedia ist mit keinem dieser Anbieter geschäftlich verbunden.',
+
+'categoriespagetext' => 'Die folgenden Kategorien existieren in {{SITENAME}}.',
+'data' => 'Daten',
+'userrights' => 'Benutzerrechteverwaltung',
+'groups' => 'Benutzergruppen',
+'isbn' => 'ISBN',
+'alphaindexline' => '$1 bis $2',
+'version' => 'Version',
+'log' => 'Logbücher',
+'alllogstext' => 'Kombinierte Anzeige der Datei-, Lösch-, Seitenschutz-, Benutzerblockaden- und Rechte-Logbücher.<br />Sie können die Anzeige durch die Auswahl des Logbuchtyps, des Benutzers oder des Seitentitels einschränken.',
+'logempty' => 'Keine passenden Einträge.',
# Special:Allpages
-'allpages' => 'Alle Seiten',
-'prefixindex' => 'Alle Seiten (mit Präfix)',
-'nextpage' => "Nächste Seite ($1)",
-'allpagesfrom' => 'Seiten anzeigen ab:',
-'allpagesprefix' => 'Seiten anzeigen mit Präfix:',
-'allarticles' => 'Alle Seiten',
-'allinnamespace' => "Alle Seiten im Namensraum: $1",
-'allnotinnamespace' => 'Alle Seiten (nicht im $1 Namensraum)',
-'allpagesprev' => 'Vorherige',
-'allpagesnext' => 'Nächste',
-'allpagessubmit' => 'Anwenden',
-'allpagesbadtitle' => 'Der eingegebene Seitenname ist ungültig: Er hat entweder ein vorangestelltes Sprach-, ein Interwiki-Kürzel oder enthält ein oder mehrere Zeichen, welche in Seitennamen nicht verwendet werden dürfen.',
+'nextpage' => 'Nächste Seite ($1)',
+'prevpage' => 'Vorherige Seite ($1)',
+'allpagesfrom' => 'Seiten anzeigen ab:',
+'allarticles' => 'Alle Seiten',
+'allinnamespace' => 'Alle Seiten (Namensraum: $1)',
+'allnotinnamespace' => 'Alle Seiten (nicht im $1 Namensraum)',
+'allpagesprev' => 'Vorherige',
+'allpagesnext' => 'Nächste',
+'allpagessubmit' => 'Anwenden',
+'allpagesprefix' => 'Seiten anzeigen mit Präfix:',
+'allpagesbadtitle' => 'Der eingegebene Seitenname ist ungültig: Er hat entweder ein vorangestelltes Sprach-, ein Interwiki-Kürzel oder enthält ein oder mehrere Zeichen, welche in Seitennamen nicht verwendet werden dürfen.',
# Special:Listusers
-'listusersfrom' => 'Zeige Benutzer ab:',
-
-# Email this user
-#
-"mailnologin" => "Sie sind nicht angemeldet.",
-'mailnologintext' => 'Sie müssen [[{{ns:special}}:Userlogin|angemeldet sein]] und eine gültige E-Mail-Adresse haben, um anderen Benutzern E-Mails schicken zu können.',
-"emailuser" => "E-Mail an diesen Benutzer",
-"emailpage" => "E-Mail an Benutzer",
-"emailpagetext" => "Wenn dieser Benutzer eine gültige E-Mail-Adresse angegeben hat, können Sie ihm mit dem untenstehenden Formular eine E-Mail senden. Als Absender wird die E-Mail-Adresse aus Ihren Einstellungen eingetragen, damit der Benutzer Ihnen antworten kann.",
-"usermailererror" => "Das E-Mail-Objekt gab einen Fehler zurück:",
-"defemailsubject" => "{{SITENAME}} E-Mail",
-"noemailtitle" => "Keine E-Mail-Adresse",
-"noemailtext" => "Dieser Benutzer hat keine gültige E-Mail-Adresse angegeben, oder möchte keine E-Mail von anderen Benutzern empfangen.",
-"emailfrom" => "Von",
-"emailto" => "An",
-"emailsubject" => "Betreff",
-"emailmessage" => "Nachricht",
-"emailsend" => "Senden",
-"emailsent" => "E-Mail verschickt",
-"emailsenttext" => "Ihre E-Mail wurde verschickt.",
-
-
-# Beobachtungsliste
-#
-"watchlist" => "Beobachtungsliste",
-'watchlistfor' => '(für \'\'\'$1\'\'\')',
-"nowatchlist" => "Sie haben keine Einträge auf Ihrer Beobachtungsliste.",
-'watchlistanontext' => 'Sie müssen sich $1, um Ihre Beobachtungsliste zu sehen oder Einträge auf ihr zu bearbeiten.', // $1 -> 'loginreqlink'
-'watchlistcount' => '\'\'\'Sie haben {{PLURAL:$1|einen Eintrag|$1 Einträge}} auf Ihrer Beobachtungsliste (inkl. Diskussionsseiten).\'\'\'',
-'clearwatchlist' => 'Beobachtungsliste löschen',
-'watchlistcleartext' => 'Sind Sie sicher, dass Sie diese vollständig löschen wollen?',
-'watchlistclearbutton' => 'Beobachtungsliste löschen',
-'watchlistcleardone' => 'Ihre Beobachtungsliste wurde gelöscht. {{PLURAL:$1|Ein Eintrag wurde|$1 Einträge wurden}} entfernt.',
-"watchnologin" => "Sie sind nicht angemeldet",
-'watchnologintext' => 'Sie müssen [[{{ns:special}}:Userlogin|angemeldet]]
+'listusersfrom' => 'Zeige Benutzer ab:',
+
+# E-mail user
+'mailnologin' => 'Sie sind nicht angemeldet.',
+'mailnologintext' => 'Sie müssen [[{{ns:special}}:Userlogin|angemeldet sein]] und eine gültige E-Mail-Adresse haben, um anderen Benutzern E-Mails schicken zu können.',
+'emailuser' => 'E-Mail an diesen Benutzer',
+'emailpage' => 'E-Mail an Benutzer',
+'emailpagetext' => 'Wenn dieser Benutzer eine gültige E-Mail-Adresse angegeben hat, können Sie ihm mit dem untenstehenden Formular eine E-Mail senden. Als Absender wird die E-Mail-Adresse aus Ihren Einstellungen eingetragen, damit der Benutzer Ihnen antworten kann.',
+'usermailererror' => 'Das E-Mail-Objekt gab einen Fehler zurück:',
+'defemailsubject' => '{{SITENAME}}-E-Mail',
+'noemailtitle' => 'Keine E-Mail-Adresse',
+'noemailtext' => 'Dieser Benutzer hat keine gültige E-Mail-Adresse angegeben oder möchte keine E-Mail von anderen Benutzern empfangen.',
+'emailfrom' => 'Von',
+'emailto' => 'An',
+'emailsubject' => 'Betreff',
+'emailmessage' => 'Nachricht',
+'emailsend' => 'Senden',
+'emailccme' => 'Sende eine Kopie der E-Mail an mich',
+'emailccsubject' => 'Kopie Ihrer Nachricht an $1: $2',
+'emailsent' => 'E-Mail verschickt',
+'emailsenttext' => 'Ihre E-Mail wurde verschickt.',
+
+# Watchlist
+'watchlist' => 'Beobachtungsliste',
+'watchlistfor' => "(für '''$1''')",
+'nowatchlist' => 'Sie haben keine Einträge auf Ihrer Beobachtungsliste.',
+'watchlistanontext' => 'Sie müssen sich $1, um Ihre Beobachtungsliste zu sehen oder Einträge auf ihr zu bearbeiten.',
+'watchlistcount' => "'''Sie haben {{PLURAL:$1|einen Eintrag|$1 Einträge}} auf Ihrer Beobachtungsliste (inkl. Diskussionsseiten).'''",
+'clearwatchlist' => 'Beobachtungsliste löschen',
+'watchlistcleartext' => 'Sind Sie sicher, dass Sie diese vollständig löschen wollen?',
+'watchlistclearbutton' => 'Beobachtungsliste löschen',
+'watchlistcleardone' => 'Ihre Beobachtungsliste wurde gelöscht. {{PLURAL:$1|Ein Eintrag wurde|$1 Einträge wurden}} entfernt.',
+'watchnologin' => 'Sie sind nicht angemeldet',
+'watchnologintext' => 'Sie müssen [[{{ns:special}}:Userlogin|angemeldet]]
sein, um Ihre Beobachtungsliste zu bearbeiten.',
-"addedwatch" => "Zur Beobachtungsliste hinzugefügt",
-'addedwatchtext' => 'Die Seite „$1“ wurde zu Ihrer [[{{ns:special}}:Watchlist|Beobachtungsliste]] hinzugefügt.
+'addedwatch' => 'Zur Beobachtungsliste hinzugefügt',
+'addedwatchtext' => 'Die Seite „$1“ wurde zu Ihrer [[{{ns:special}}:Watchlist|Beobachtungsliste]] hinzugefügt.
Spätere Änderungen an dieser Seite und der dazugehörigen Diskussionsseite werden dort gelistet und
in der Übersicht der [[{{ns:special}}:Recentchanges|letzten Änderungen]] in Fettschrift dargestellt.
Wenn Sie die Seite wieder von Ihrer Beobachtungsliste entfernen möchten, klicken Sie auf der jeweiligen Seite auf „nicht mehr beobachten“.',
-"removedwatch" => "Von der Beobachtungsliste entfernt",
-'removedwatchtext' => 'Die Seite „$1“ wurde von Ihrer Beobachtungsliste entfernt.',
-"watchthispage" => "Seite beobachten",
-"unwatchthispage" => "Nicht mehr beobachten",
-"notanarticle" => "Keine Seite",
-'watchnochange' => 'Keine der von Ihnen beobachteten Seiten wurde während des angezeigten Zeitraums bearbeitet.',
-'watchdetails' => 'Sie beobachten {{PLURAL:$1|eine Seite|$1 Seiten}} | [[{{ns:special}}:Watchlist/edit|Komplette Liste zeigen und bearbeiten]] | [[{{ns:special}}:Watchlist/clear|Komplette Liste leeren]]',
-'wlheader-enotif' => 'Der E-Mail-Benachrichtigungsdienst ist aktiviert.<br />',
-'wlheader-showupdated' => 'Seiten mit noch nicht gesehenen Änderungen werden \'\'\'fett\'\'\' dargestellt.<br />',
-"watchmethod-recent" => "Überprüfen der letzten Bearbeitungen für die Beobachtungsliste",
-"watchmethod-list" => "Überprüfen der Beobachtungsliste nach letzten Bearbeitungen",
-"removechecked" => "Markierte Einträge löschen",
-"watchlistcontains" => "Ihre Beobachtungsliste enthält $1 Seiten.",
-'watcheditlist' => 'Dies ist eine alphabetische und nach Namensräumen gruppierte Liste aller von Ihnen beobachteten Seiten. Wenn Sie Einträge von der Beobachtungsliste wieder entfernen möchten, markieren Sie diese und klicken auf die Schaltfläche „Markierte Einträge löschen“ am Ende dieser Seite.',
-'removingchecked' => 'Die ausgewählten Einträge werden aus der Beobachtungsliste entfernt...',
-'couldntremove' => 'Der Eintrag „$1“ kann nicht gelöscht werden...',
-'iteminvalidname' => 'Problem mit dem Eintrag „$1“, ungültiger Name.',
-'wlnote' => 'Es folgen die letzten $1 Änderungen der letzten <b>$2</b> Stunden.',
-'wlshowlast' => 'Zeige die letzen: $1 Stunden - $2 Tage - $3',
-'wlsaved' => 'Dies ist eine gespeicherte Version Ihrer Beobachtungsliste.',
-'wlhideshowown' => '$1 meine Änderungen',
-'wlhideshowbots' => '$1 von Bot-Änderungen.',
-'wldone' => '...erledigt.',
-
-'updatedmarker' => '(geändert)',
-'enotif_mailer' => '{{SITENAME}} E-Mail-Benachrichtigungsdienst',
-'enotif_reset' => 'Alle Seiten als besucht markieren',
-'enotif_newpagetext' => 'Das ist eine neue Seite.',
-'changed' => 'geändert',
-'created' => 'erzeugt',
-'enotif_subject' => '[{{SITENAME}}] Die Seite "$PAGETITLE" wurde von $PAGEEDITOR $CHANGEDORCREATED',
-'enotif_lastvisited' => 'Alle Änderungen auf einen Blick: $1',
-'enotif_body' => 'Liebe/r $WATCHINGUSERNAME,
+'removedwatch' => 'Von der Beobachtungsliste entfernt',
+'removedwatchtext' => 'Die Seite „$1“ wurde von Ihrer Beobachtungsliste entfernt.',
+'watch' => 'beobachten',
+'watchthispage' => 'Seite beobachten',
+'unwatch' => 'nicht mehr beobachten',
+'unwatchthispage' => 'Nicht mehr beobachten',
+'notanarticle' => 'Keine Seite',
+'watchnochange' => 'Keine der von Ihnen beobachteten Seiten wurde während des angezeigten Zeitraums bearbeitet.',
+'watchdetails' => 'Sie beobachten {{PLURAL:$1|eine Seite|$1 Seiten}} | [[{{ns:special}}:Watchlist/edit|Komplette Liste zeigen und bearbeiten]] | [[{{ns:special}}:Watchlist/clear|Komplette Liste leeren]]',
+'wlheader-enotif' => 'Der E-Mail-Benachrichtigungsdienst ist aktiviert.<br />',
+'wlheader-showupdated' => "Seiten mit noch nicht gesehenen Änderungen werden '''fett''' dargestellt.<br />",
+'watchmethod-recent' => 'Überprüfen der letzten Bearbeitungen für die Beobachtungsliste',
+'watchmethod-list' => 'Überprüfen der Beobachtungsliste nach letzten Bearbeitungen',
+'removechecked' => 'Markierte Einträge löschen',
+'watchlistcontains' => 'Ihre Beobachtungsliste enthält $1 Seiten.',
+'watcheditlist' => 'Dies ist eine alphabetische und nach Namensräumen gruppierte Liste aller von Ihnen beobachteten Seiten. Wenn Sie Einträge von der Beobachtungsliste wieder entfernen möchten, markieren Sie diese und klicken auf die Schaltfläche „Markierte Einträge löschen“ am Ende dieser Seite.',
+'removingchecked' => 'Die ausgewählten Einträge werden aus der Beobachtungsliste entfernt...',
+'couldntremove' => 'Der Eintrag „$1“ kann nicht gelöscht werden.',
+'iteminvalidname' => 'Problem mit dem Eintrag „$1“, ungültiger Name.',
+'wlnote' => 'Es folgen die letzten $1 Änderungen der letzten <b>$2</b> Stunden.',
+'wlshowlast' => 'Zeige die Änderungen der letzten $1 Stunden, $2 Tage oder $3 (in den letzten 30 Tagen).',
+'wlsaved' => 'Dies ist eine gespeicherte Version Ihrer Beobachtungsliste.',
+'watchlist-show-bots' => 'Bot-Änderungen einblenden',
+'watchlist-hide-bots' => 'Bot-Änderungen ausblenden',
+'watchlist-show-own' => 'eigene Änderungen einblenden',
+'watchlist-hide-own' => 'eigene Änderungen ausblenden',
+'watchlist-show-minor' => 'kleine Änderungen einblenden',
+'watchlist-hide-minor' => 'kleine Änderungen ausblenden',
+'wldone' => 'Erfolgreich ausgeführt.',
+
+# Displayed when you click the "watch" button and it's in the process of watching
+'watching' => 'Beobachten',
+'unwatching' => 'Nicht beobachten',
+
+'enotif_mailer' => '{{SITENAME}} E-Mail-Benachrichtigungsdienst',
+'enotif_reset' => 'Alle Seiten als besucht markieren',
+'enotif_newpagetext' => 'Das ist eine neue Seite.',
+'changed' => 'geändert',
+'created' => 'erzeugt',
+'enotif_subject' => '[{{SITENAME}}] Die Seite "$PAGETITLE" wurde von $PAGEEDITOR $CHANGEDORCREATED',
+'enotif_lastvisited' => 'Alle Änderungen auf einen Blick: $1',
+'enotif_body' => 'Liebe/r $WATCHINGUSERNAME,
die {{SITENAME}} Seite "$PAGETITLE" wurde von $PAGEEDITOR am $PAGEEDITDATE $CHANGEDORCREATED.
@@ -1086,481 +1264,527 @@ Es werden solange keine weiteren Benachrichtigungsmails gesendet, bis Sie die Se
--
Um die Einstellungen Ihrer Beobachtungsliste anzupassen besuchen Sie: {{fullurl:Special:Watchlist/edit}}',
-
# Delete/protect/revert
-#
-"deletepage" => "Seite löschen",
-"confirm" => "Bestätigen",
-"excontent" => "Alter Inhalt: '$1'",
-'excontentauthor' => "Alter Inhalt: '$1' (einziger Bearbeiter war '$2')",
-"exbeforeblank" => "Inhalt vor dem Leeren der Seite: '$1'",
-"exblank" => "Seite war leer",
-'confirmdelete' => 'Löschen bestätigen',
-'deletesub' => '(Lösche „$1“)',
-'historywarning' => 'WARNUNG: Die Seite die Sie löschen wollen hat eine Versionsgeschichte:',
-'confirmdeletetext' => 'Sie sind dabei, eine Seite oder eine Datei und alle zugehörigen älteren Versionen
+'deletepage' => 'Seite löschen',
+'confirm' => 'Bestätigen',
+'excontent' => "Alter Inhalt: '$1'",
+'excontentauthor' => "Inhalt war: '$1' (einziger Bearbeiter: '[[{{ns:user}}:$2]]') - [[{{ns:user_talk}}:$2]]",
+'exbeforeblank' => "Inhalt vor dem Leeren der Seite: '$1'",
+'exblank' => 'Seite war leer',
+'confirmdelete' => 'Löschen bestätigen',
+'deletesub' => '(Lösche „$1“)',
+'historywarning' => 'WARNUNG: Die Seite, die Sie löschen wollen, hat eine Versionsgeschichte:',
+'confirmdeletetext' => 'Sie sind dabei, eine Seite oder eine Datei und alle zugehörigen älteren Versionen
zu löschen. Bitte bestätigen Sie dazu, dass Sie sich der Konsequenzen bewusst sind
und dass Sie in Übereinstimmung mit den [[{{ns:project}}:Löschregeln|Löschregeln]] handeln.',
-"actioncomplete" => "Aktion beendet",
-'deletedtext' => '„$1“ wurde gelöscht. Im $2 finden Sie eine Liste der letzten Löschungen.',
-'deletedarticle' => '„$1“ gelöscht',
-"dellogpage" => "Lösch-Logbuch",
-"dellogpagetext" => "Hier ist eine Liste der letzten Löschungen (UTC).
+'actioncomplete' => 'Aktion beendet',
+'deletedtext' => '„$1“ wurde gelöscht. Im $2 finden Sie eine Liste der letzten Löschungen.',
+'deletedarticle' => 'hat „$1“ gelöscht',
+'dellogpage' => 'Lösch-Logbuch',
+'dellogpagetext' => 'Hier ist eine Liste der letzten Löschungen (UTC).
<ul>
-</ul>",
-"deletionlog" => "Lösch-Logbuch",
-"reverted" => "Auf eine alte Version zurückgesetzt",
-"deletecomment" => "Grund der Löschung",
-"imagereverted" => "Auf eine alte Version zurückgesetzt.",
-"rollback" => 'Zurücksetzen der Änderungen',
-'rollback_short' => 'Zurücksetzen',
-'rollbacklink' => 'Zurücksetzen',
-'rollbackfailed' => 'Zurücksetzen gescheitert',
-'cantrollback' => 'Die Änderung kann nicht zurückgesetzt werden, da es keine früheren Autoren gibt.',
-'alreadyrolled' => 'Die Zurücknahme der Seite [[$1]] von [[{{ns:user}}:$2|$2]]
-([[{{ns:user_talk}}:$2|Diskussion]]) ist nicht möglich, da eine andere Änderung oder Rücknahme erfolgt ist.
-
-Die letzte Änderung ist von [[{{ns:user}}:$3|$3]] ([[{{ns:user_talk}}:$3|Diskussion]])',
-# only shown if there is an edit comment
-'editcomment' => 'Der Änderungskommentar war: „<i>$1</i>“.',
-'revertpage' => 'Änderungen von [[{{ns:user}}:$2]] rückgängig gemacht und letzte Version von [[{{ns:user}}:$1]] wiederhergestellt',
-'sessionfailure' => 'Es gab ein Problem mit Ihrer Benutzersitzung.
+</ul>',
+'deletionlog' => 'Lösch-Logbuch',
+'reverted' => 'Auf eine alte Version zurückgesetzt',
+'deletecomment' => 'Grund der Löschung',
+'imagereverted' => 'Auf eine alte Version zurückgesetzt.',
+'rollback' => 'Zurücksetzen der Änderungen',
+'rollback_short' => 'Zurücksetzen',
+'rollbacklink' => 'Zurücksetzen',
+'rollbackfailed' => 'Zurücksetzen gescheitert',
+'cantrollback' => 'Die Änderung kann nicht zurückgesetzt werden, da es keine früheren Autoren gibt.',
+'alreadyrolled' => 'Das Zurücksetzen der Änderungen von [[{{ns:user}}:$2|$2]] <small>([[{{ns:user_talk}}:$2|Diskussion]],
+[[{{ns:special}}:Contributions/$2|Beiträge]])</small> am Artikel [[:$1]] war nicht erfolgreich, da in der Zwischenzeit bereits ein anderer Benutzer
+Änderungen an diesem Artikel vorgenommen hat.<br />Die letzte Änderung stammt von [[{{ns:user}}:$3|$3]] <small>([[{{ns:user_talk}}:$3|Diskussion]])</small>.',
+'editcomment' => 'Der Änderungskommentar lautet: „<i>$1</i>“.', # only shown if there is an edit comment
+'revertpage' => 'Änderungen von [[{{ns:user}}:$2]] ([[{{ns:special}}:Contributions/$2|Beiträge]]) rückgängig gemacht und letzte Version von [[{{ns:user}}:$1]] wiederhergestellt',
+'sessionfailure' => 'Es gab ein Problem mit Ihrer Benutzersitzung.
Diese Aktion wurde aus Sicherheitsgründen abgebrochen, um eine falsche Zuordnung Ihrer Änderungen zu einem anderen Benutzer zu verhindern.
Bitte gehen Sie zurück und versuchen den Vorgang erneut auszuführen.',
+'protectlogpage' => 'Seitenschutz-Logbuch',
+'protectlogtext' => 'Dies ist eine Liste der blockierten Seiten.',
+'protectedarticle' => 'änderte den Seitenschutzstatus von [[$1]]',
+'unprotectedarticle' => 'hob den Schutz von $1 auf',
+'protectsub' => '(Sperren von „$1“)',
+'confirmprotecttext' => 'Soll diese Seite wirklich geschützt werden?',
+'confirmprotect' => 'Seitenschutzstatus ändern',
+'protectmoveonly' => 'Nur vor dem Verschieben schützen',
+'protectcomment' => 'Grund der Sperrung/Entsperrung:',
+'unprotectsub' => '(Aufhebung der Sperrung von „$1“)',
+'confirmunprotecttext' => 'Wollen Sie wirklich die Sperrung dieser Seite aufheben?',
+'confirmunprotect' => 'Aufhebung der Sperrung bestätigen',
+'unprotectcomment' => 'Grund für das Aufheben der Sperrung',
+'protect-unchain' => 'Verschiebeschutz ändern',
+'protect-text' => "Hier können Sie den Schutzstatus für die Seite '''$1''' einsehen und ändern.",
+'protect-viewtext' => 'Sie sind nicht berechtigt, den Seitenschutzstatus zu ändern. Hier ist der aktuelle Schutzstatus der Seite: [[$1]]',
+'protect-default' => 'Alle (Standard)',
+'protect-level-autoconfirmed' => 'Sperrung für nicht registrierte Benutzer',
+'protect-level-sysop' => 'Nur Administratoren',
+
+# Restrictions (nouns)
+'restriction-edit' => 'bearbeiten',
+'restriction-move' => 'verschieben',
# Undelete
-"undelete" => "Gelöschte Seite wiederherstellen",
-"undeletepage" => "Gelöschte Seiten wiederherstellen",
-'viewdeletedpage' => 'Gelöschte Seiten anzeigen',
-"undeletepagetext" => "Die folgenden Seiten wurden gelöscht, sind aber immer noch
-gespeichert und können wiederhergestellt werden.",
-'undeleteextrahelp' => '* Um die Seite komplett mit allen Versionen wiederherzustellen, geben Sie bitte eine Begründung an und klicken auf „Wiederherstellen“.
+'undelete' => 'Gelöschte Seite wiederherstellen',
+'undeletepage' => 'Gelöschte Seiten wiederherstellen',
+'viewdeletedpage' => 'Gelöschte Seiten anzeigen',
+'undeletepagetext' => 'Die folgenden Seiten wurden gelöscht, sind aber immer noch
+gespeichert und können von Administratoren wiederhergestellt werden.',
+'undeleteextrahelp' => '* Um die Seite komplett mit allen Versionen wiederherzustellen, geben Sie bitte eine Begründung an und klicken auf „Wiederherstellen“.
* Möchten Sie nur bestimmte Versionen wiederherstellen, so wählen Sie diese bitte einzeln an Hand der Markierungen aus,
geben eine Begründung an und klicken dann auf „Wiederherstellen“.
* „Zurücksetzen“ leert das Kommentarfeld und entfernt alle Markierungen bei den Versionen.',
-"undeletearticle" => "Gelöschte Seiten wiederherstellen",
-"undeleterevisions" => "$1 Versionen archiviert",
-"undeletehistory" => "Wenn Sie diese Seite wiederherstellen, werden auch alle alten
+'undeletearticle' => 'Gelöschte Seiten wiederherstellen',
+'undeleterevisions' => '$1 Versionen archiviert',
+'undeletehistory' => 'Wenn Sie diese Seite wiederherstellen, werden auch alle alten
Versionen wiederhergestellt. Wenn seit der Löschung eine neue Seite gleichen
namens erstellt wurde, werden die wiederhergestellten Versionen als alte Versionen
-dieser Seite erscheinen.",
-'undeletehistorynoadmin' => 'Diese Seite wurde gelöscht. Der Grund für die Löschung ist in der Zusammenfassung angegeben,
+dieser Seite erscheinen.',
+'undeletehistorynoadmin' => 'Diese Seite wurde gelöscht. Der Grund für die Löschung ist in der Zusammenfassung angegeben,
genauso wie Details zum letzten Benutzer der diese Seite vor der Löschung bearbeitet hat.
Der aktuelle Text der gelöschten Seite ist nur Administratoren zugänglich.',
-"undeleterevision" => "Gelöschte Version vom $1",
-"undeletebtn" => "Wiederherstellen",
-'undeletereset' => 'Zurücksetzen',
-'undeletecomment' => 'Begründung:',
-'undeletedarticle' => '„$1“ wiederhergestellt',
-'undeletedrevisions' => "$1 Versionen wiederhergestellt.",
-'undeletedrevisions-files' => '$1 Änderungen und $2 Dateien wiederhergestellt',
-'undeletedfiles' => '$1 Dateien wiederhergestellt',
-'cannotundelete' => 'Wiederherstellung fehlgeschlagen; jemand anderes hat die Seite bereits wiederhergestellt.',
-'undeletedpage' => '<big>\'\'\'$1 wurde wiederhergestellt\'\'\'</big>
-
-Im [[{{ns:special}}:Log/delete|Lösch-Logbuch]] finden Sie eine Übersicht von kürzlich gelöschten und wiederhergestellten Seiten.',
+'undeleterevision' => 'Gelöschte Version vom $1',
+'undeleterevision-missing' => 'Ungültige oder fehlende Version. Entweder ist der Link falsch oder die Version wurde aus dem Archiv wiederhergestellt oder entfernt.',
+'undeletebtn' => 'Wiederherstellen',
+'undeletereset' => 'Abbrechen',
+'undeletecomment' => 'Begründung:',
+'undeletedarticle' => 'hat $1 wiederhergestellt',
+'undeletedrevisions' => 'hat $1 Versionen wiederhergestellt',
+'undeletedrevisions-files' => 'hat $1 Versionen und $2 Dateien wiederhergestellt',
+'undeletedfiles' => 'hat $1 Dateien wiederhergestellt',
+'cannotundelete' => 'Wiederherstellung fehlgeschlagen; jemand anderes hat die Seite bereits wiederhergestellt.',
+'undeletedpage' => "<big>'''$1 wurde wiederhergestellt'''</big>
+
+Im [[{{ns:special}}:Log/delete|Lösch-Logbuch]] finden Sie eine Übersicht von kürzlich gelöschten und wiederhergestellten Seiten.",
# Namespace form on various pages
-'namespace' => 'Namensraum:',
-'invert' => 'Auswahl umkehren',
+'namespace' => 'Namensraum:',
+'invert' => 'Auswahl umkehren',
# Contributions
-#
-"contributions" => "Benutzerbeiträge",
-'mycontris' => 'Eigene Beiträge',
-"contribsub" => "Für $1",
-"nocontribs" => "Es wurden keine Änderungen für diese Kriterien gefunden.",
-"ucnote" => "Dies sind die letzten <b>$1</b> Beiträge des Benutzers in den letzten <b>$2</b> Tagen.",
-"uclinks" => "Zeige die letzten $1 Beiträge; zeige die letzten $2 Tage.",
-'uctop' => ' (aktuell)',
-'newbies' => 'Neulinge',
-
-'sp-newimages-showfrom' => 'Neue Dateien seit $1 anzeigen',
-
-'sp-contributions-newest' => 'Jüngste',
-'sp-contributions-oldest' => 'Älteste',
-'sp-contributions-newer' => 'Jüngere $1',
-'sp-contributions-older' => 'Ältere $1',
-'sp-contributions-newbies-sub' => 'Für Neulinge',
+'contributions' => 'Benutzerbeiträge',
+'mycontris' => 'Eigene Beiträge',
+'contribsub' => 'Für $1',
+'nocontribs' => 'Es wurden keine Änderungen für diese Kriterien gefunden.',
+'ucnote' => 'Dies sind die letzten <b>$1</b> Beiträge des Benutzers in den letzten <b>$2</b> Tagen.',
+'uclinks' => 'Zeige die letzten $1 Beiträge; zeige die letzten $2 Tage.',
+'uctop' => ' (aktuell)',
+'newbies' => 'Neulinge',
+
+'sp-contributions-newest' => 'Jüngste',
+'sp-contributions-oldest' => 'Älteste',
+'sp-contributions-newer' => 'Jüngere $1',
+'sp-contributions-older' => 'Ältere $1',
+'sp-contributions-newbies-sub' => 'Für Neulinge',
+'sp-contributions-blocklog' => 'Blockadelogbuch',
+
+'sp-newimages-showfrom' => 'Zeige neue Dateien ab $1',
# What links here
-#
-'whatlinkshere' => 'Links auf diese Seite',
-"notargettitle" => "Keine Seite angegeben",
-'notargettext' => 'Sie haben nicht angegeben, auf welche Seite diese Funktion angewendet werden soll.',
-"linklistsub" => "(Liste der Verweise)",
-'linkshere' => 'Die folgenden Seiten verweisen auf \'\'\'[[:$1]]\'\'\':',
-'nolinkshere' => 'Keine Seite verweist auf \'\'\'[[:$1]]\'\'\'.',
-'isredirect' => 'Weiterleitungsseite',
-'istemplate' => 'Vorlageneinbindung',
-
-# Block/unblock IP
-#
-'blockip' => 'Benutzer blockieren',
-'blockiptext' => 'Benutzen Sie das Formular, um einen Benutzer oder eine IP-Adresse zu blockieren.
+'whatlinkshere' => 'Links auf diese Seite',
+'whatlinkshere-summary' => 'Diese Spezialseite listet alle internen Links auf eine bestimmte Seite auf. Die möglichen Zusätze „(Vorlageneinbindung)“ und „(Weiterleitungsseite)“ zeigen jeweils an, dass die Seite nicht durch einen normalen Wikilink eingebunden ist. ',
+'notargettitle' => 'Keine Seite angegeben',
+'notargettext' => 'Sie haben nicht angegeben, auf welche Seite diese Funktion angewendet werden soll.',
+'linklistsub' => '(Liste der Verweise)',
+'linkshere' => "Die folgenden Seiten verweisen auf '''[[:$1]]''':",
+'nolinkshere' => "Keine Seite verweist auf '''[[:$1]]'''.",
+'isredirect' => 'Weiterleitungsseite',
+'istemplate' => 'Vorlageneinbindung',
+
+# Block/unblock
+'blockip' => 'IP-Adresse/Benutzer blockieren',
+'blockiptext' => 'Benutzen Sie das Formular, um einen Benutzer oder eine IP-Adresse zu blockieren.
Dies sollte nur erfolgen, um Vandalismus zu verhindern und in Ãœbereinstimmung mit unseren [[{{ns:project}}:Leitlinien|Leitlinien]] geschehen.
Bitte geben Sie den Grund für die Blockade an.',
-"ipaddress" => "IP-Adresse",
-'ipadressorusername' => 'IP-Adresse oder Benutzername',
-'ipbreason' => 'Begründung',
-'ipbanononly' => 'Nur anonyme Benutzer sperren',
-'ipbcreateaccount' => 'Erstellung von Benutzerkonten verhindern',
-'ipbsubmit' => 'Benutzer blockieren',
-'ipbother' => 'Andere Dauer',
-'ipboptions' => '1 Stunde:1 hour,2 Stunden:2 hours,6 Stunden:6 hours,1 Tag:1 day,3 Tage:3 days,1 Woche:1 week,2 Wochen:2 weeks,1 Monat:1 month,3 Monate:3 months,1 Jahr:1 year,Unbeschränkt:indefinite',
-'ipbotheroption' => 'Andere Dauer',
-"badipaddress" => "Die IP-Adresse hat ein falsches Format.",
-"blockipsuccesssub" => "Blockade erfolgreich",
-'blockipsuccesstext' => 'Der Benutzer/die IP-Adresse [[{{ns:special}}:Contributions/$1|$1]] wurde blockiert.
+'ipaddress' => 'IP-Adresse oder Benutzername',
+'ipadressorusername' => 'IP-Adresse oder Benutzername',
+'ipbexpiry' => 'Sperrdauer',
+'ipbreason' => 'Begründung',
+'ipbanononly' => 'Nur anonyme Benutzer sperren',
+'ipbcreateaccount' => 'Erstellung von Benutzerkonten verhindern',
+'ipbenableautoblock' => 'Sperre die aktuell von diesem Benutzer genutzte IP-Adresse sowie automatisch alle folgenden, von denen aus er Bearbeitungen oder das Anlegen von Benutzeraccounts versucht',
+'ipbsubmit' => 'IP-Adresse/Benutzer blockieren',
+'ipbother' => 'Andere Dauer (englisch)',
+'ipboptions' => '1 Stunde:1 hour,2 Stunden:2 hours,6 Stunden:6 hours,1 Tag:1 day,3 Tage:3 days,1 Woche:1 week,2 Wochen:2 weeks,1 Monat:1 month,3 Monate:3 months,1 Jahr:1 year,Unbeschränkt:indefinite',
+'ipbotheroption' => 'Andere Dauer',
+'badipaddress' => 'Die IP-Adresse hat ein falsches Format.',
+'blockipsuccesssub' => 'Blockade erfolgreich',
+'blockipsuccesstext' => 'Der Benutzer/die IP-Adresse [[{{ns:special}}:Contributions/$1|$1]] wurde blockiert.
Beachten Sie die [[{{ns:special}}:Ipblocklist|{{int:ipblocklist}}]] für alle aktiven Blockaden.',
-"unblockip" => "IP-Adresse freigeben",
-"unblockiptext" => "Benutzen Sie das Formular, um eine blockierte IP-Adresse freizugeben.",
-"ipusubmit" => "Diese Adresse freigeben",
-'unblocked' => '[[{{ns:user}}:$1|$1]] wurde freigegeben',
-"ipblocklist" => "Liste blockierter Benutzer/IP-Adressen",
-'ipblocklistempty' => 'Die Liste der Benutzersperrungen hat keine Einträge.',
-"blocklistline" => "$1, $2 blockierte $3 ($4)",
-'infiniteblock' => 'unbegrenzt',
-'expiringblock' => 'erlischt $1',
-'anononlyblock' => 'nur Anonyme',
-'createaccountblock' => 'Erstellung von Benutzerkonten gesperrt',
-"blocklink" => "blockieren",
-"unblocklink" => "freigeben",
-"contribslink" => "Beiträge",
-'autoblocker' => 'Automatische Blockierung, da Sie eine IP-Adresse benutzen mit „$1“. Grund: „$2“.',
+'unblockip' => 'IP-Adresse freigeben',
+'unblockiptext' => 'Benutzen Sie das Formular, um eine IP-Adresse oder einen Benutzer freizugeben.',
+'ipusubmit' => 'Diese Adresse freigeben',
+'unblocked' => '[[{{ns:user}}:$1|$1]] wurde freigegeben',
+'ipblocklist' => 'Liste gesperrter Benutzer/IP-Adressen',
+'ipblocklist-summary' => "Diese Spezialseite führt – ergänzend zum [[{{ns:sSpecial}}:Log/block|Benutzerblockaden-Logbuch]], das sämtliche, manuell vorgenommenen Sperrungen und Entsperrungen protokolliert – alle '''aktuell''' (noch) gesperrten Benutzer auf, einschließlich automatisch geblockter IP-Adressen in anonymisierter Form.",
+'blocklistline' => '$1, $2 blockierte $3 (bis $4)',
+'infiniteblock' => 'unbegrenzt',
+'expiringblock' => 'erlischt $1',
+'anononlyblock' => 'nur anonyme',
+'noautoblockblock' => 'Autoblock deaktiviert',
+'createaccountblock' => 'Erstellung von Benutzerkonten gesperrt',
+'ipblocklistempty' => 'Die Liste der Benutzersperrungen hat keine Einträge.',
+'blocklink' => 'blockieren',
+'unblocklink' => 'freigeben',
+'contribslink' => 'Beiträge',
+'autoblocker' => 'Automatische Blockierung, da Sie eine gemeinsame IP-Adresse mit „$1“ benutzen. Grund: „$2“.',
+'blocklogpage' => 'Benutzerblockaden-Logbuch',
+'blocklogentry' => 'blockiert [[{{ns:user}}:$1]] für einen Zeitraum von: $2',
+'blocklogtext' => 'Dies ist ein Log über Sperrungen und Entsperrungen von Benutzern. Automatisch geblockte IP-Adressen werden nicht erfasst. Siehe [[{{ns:special}}:Ipblocklist|IP block list]] für eine Liste der gesperrten Benutzern.',
+'unblocklogentry' => 'hat Blockade von [[$1]] aufgehoben',
+'range_block_disabled' => 'Die Möglichkeit, ganze Adressräume zu sperren, ist nicht aktiviert.',
+'ipb_expiry_invalid' => 'Die eingegebene Dauer ist ungültig.',
+'ipb_already_blocked' => '„$1“ wurde bereits gesperrt',
+'ip_range_invalid' => 'Ungültiger IP-Addressbereich.',
+'proxyblocker' => 'Proxyblocker',
+'ipb_cant_unblock' => 'Fehler: Block-ID $1 nicht gefunden. Die Sperre wurde bereits aufgehoben.',
+'proxyblockreason' => 'Ihre IP-Adresse wurde gesperrt, da sie ein offener Proxy ist. Bitte kontaktieren Sie Ihren Provider oder Ihre Systemtechnik und informieren Sie sie über dieses mögliche Sicherheitsproblem.',
+'proxyblocksuccess' => 'Fertig.',
+'sorbs' => 'SORBS DNSbl',
+'sorbsreason' => 'Ihre IP-Adresse ist bei [http://www.sorbs.net SORBS] DNSbl als offener PROXY gelistet.',
+'sorbs_create_account_reason' => 'Ihre IP-Adresse ist bei [http://www.sorbs.net SORBS] DNSbl als offener PROXY gelistet. Sie können keinen Benutzer anlegen.',
# Developer tools
-#
-"lockdb" => "Datenbank sperren",
-"unlockdb" => "Datenbank freigeben",
-"lockdbtext" => "Mit dem Sperren der Datenbank werden alle Änderungen an Benutzereinstellungen, Beobachtungslisten, Seiten usw. verhindert. Bitte bestätigen Sie Ihre Absicht, die Datenbank zu sperren.",
-"unlockdbtext" => "Das Aufheben der Datenbank-Sperre wird alle Änderungen wieder zulassen. Bitte bestätigen Sie Ihre Absicht, die Sperrung aufzuheben.",
-"lockconfirm" => "Ja, ich möchte die Datenbank sperren.",
-"unlockconfirm" => "Ja, ich möchte die Datenbank freigeben.",
-"lockbtn" => "Datenbank sperren",
-"unlockbtn" => "Datenbank freigeben",
-"locknoconfirm" => "Sie haben das Bestätigungsfeld nicht markiert.",
-"lockdbsuccesssub" => "Datenbank wurde erfolgreich gesperrt",
-"unlockdbsuccesssub" => "Datenbank wurde erfolgreich freigegeben",
-'lockdbsuccesstext' => 'Die {{SITENAME}}-Datenbank wurde gesperrt.
+'lockdb' => 'Datenbank sperren',
+'unlockdb' => 'Datenbank freigeben',
+'lockdbtext' => 'Mit dem Sperren der Datenbank werden alle Änderungen an Benutzereinstellungen, Beobachtungslisten, Seiten usw. verhindert. Bitte die Sperrung bestätigen.',
+'unlockdbtext' => 'Das Aufheben der Datenbank-Sperre wird alle Änderungen wieder zulassen. Bitte die Aufhebung bestätigen.',
+'lockconfirm' => 'Ja, ich möchte die Datenbank sperren.',
+'unlockconfirm' => 'Ja, ich möchte die Datenbank freigeben.',
+'lockbtn' => 'Datenbank sperren',
+'unlockbtn' => 'Datenbank freigeben',
+'locknoconfirm' => 'Sie haben das Bestätigungsfeld nicht markiert.',
+'lockdbsuccesssub' => 'Datenbank wurde erfolgreich gesperrt',
+'unlockdbsuccesssub' => 'Datenbank wurde erfolgreich freigegeben',
+'lockdbsuccesstext' => 'Die {{SITENAME}}-Datenbank wurde gesperrt.
<br />Bitte geben Sie die Datenbank [[Special:Unlockdb|wieder frei]], sobald die Wartung abgeschlossen ist.',
-"unlockdbsuccesstext" => "Die {{SITENAME}}-Datenbank wurde freigegeben.",
+'unlockdbsuccesstext' => 'Die {{SITENAME}}-Datenbank wurde freigegeben.',
'lockfilenotwritable' => 'Die Datenbank-Sperrdatei ist nicht beschreibbar. Zum Sperren oder Freigeben der Datenbank muss diese für den Webserver beschreibbar sein.',
-'databasenotlocked' => 'Die Datenbank ist nicht gesperrt.',
-
-# User levels special page
-#
-
-# switching pan
-'userrights' => 'Benutzerrechteverwaltung',
-'userrights-lookup-user' => 'Gruppenzugehörigkeiten verwalten',
-'userrights-user-editname' => 'Benutzername:',
-'editusergroup' => 'Bearbeite Benutzerrechte',
-
-# user groups editing
-#
-'userrights-editusergroup' => 'Bearbeite Gruppenzugehörigkeiten des Benutzers',
-'saveusergroups' => 'Gruppenzugehörigkeiten speichern',
-'userrights-groupsmember' => 'Mitglied von:',
-'userrights-groupsavailable' => 'Verfügbare Gruppen:',
-'userrights-groupshelp' => 'Wählen Sie die Gruppen, aus denen der Benutzer entfernt oder zu denen er hinzugefügt werden soll.
-Nicht selektierte Gruppen werden nicht geändert. Eine Selektion kann mit \'\'\'Strg + Linksklick\'\'\' (bzw. Ctrl + Linksklick) entfernt werden.',
-
-# Groups
-'group' => 'Gruppe:',
-'group-bot' => 'Bots',
-'group-sysop' => 'Administratoren',
-'group-bureaucrat' => 'Bürokraten',
-'group-all' => '(alle)',
-
-'group-bot-member' => 'Bot',
-'group-sysop-member' => 'Administrator',
-'group-bureaucrat-member' => 'Bürokrat',
-
-'grouppage-bot' => '{{ns:project}}:Bots',
-'grouppage-sysop' => '{{ns:project}}:Administratoren',
-'grouppage-bureaucrat' => '{{ns:project}}:Bürokraten',
+'databasenotlocked' => 'Die Datenbank ist nicht gesperrt.',
+
+# Make sysop
+'makesysoptitle' => 'Mache einen Benutzer zum Administrator',
+'makesysoptext' => 'Diese Maske wird von Bürokraten benutzt, um normale Benutzer zu Administratoren zu machen.',
+'makesysopname' => 'Name des Benutzers:',
+'makesysopsubmit' => 'Mache diesen Benutzer zu einem Administrator',
+'makesysopok' => '<b>Benutzer „$1“ ist nun ein Administrator.</b>',
+'makesysopfail' => '<b>Benutzer „$1“ konnte nicht zu einem Administrator gemacht werden. (Haben Sie den Namen richtig geschrieben?)</b>',
+'setbureaucratflag' => 'Mache Benutzer auch zum Bürokraten',
+'rightslog' => 'Benutzerrechte-Logbuch',
+'rightslogtext' => 'Dies ist das Logbuch der Änderungen der Benutzerrechte.',
+'rightslogentry' => 'änderte die Gruppenzugehörigkeit für „[[$1]]“ von „$2“ auf „$3“.',
+'rights' => 'Rechte:',
+'set_user_rights' => 'Benutzerrechte setzen',
+'user_rights_set' => '<b>Benutzerrechte für „$1“ aktualisiert</b>',
+'set_rights_fail' => '<b>Benutzerrechte für „$1“ konnten nicht gesetzt werden. (Wurde der Name korrekt eingegeben?)</b>',
+'makesysop' => 'Mache einen Benutzer zum Administrator',
+'already_sysop' => 'Dieser Benutzer ist bereits Administrator.',
+'already_bureaucrat' => 'Dieser Benutzer ist bereits Bürokrat.',
+'rightsnone' => '(nichts)',
# Move page
-#
-'movepage' => 'Seite verschieben',
-'movepagetext' => 'Mit diesem Formular können Sie eine Seite umbenennen (mitsamt allen Versionen). Der alte Titel wird zum neuen weiterleiten. Verweise auf den alten Titel werden nicht geändert, und die Diskussionsseite wird ebenfalls nicht mitverschoben.',
-'movepagetalktext' => 'Die dazugehörige Diskussionsseite wird mitverschoben, \'\'\'es sei denn:\'\'\'
+'movepage' => 'Seite verschieben',
+'movepagetext' => 'Mit diesem Formular können Sie eine Seite umbenennen (mitsamt allen Versionen). Der alte Titel wird zum neuen weiterleiten. Verweise auf den alten Titel werden nicht geändert, und die Diskussionsseite wird ebenfalls nicht mitverschoben.',
+'movepagetalktext' => "Die dazugehörige Diskussionsseite wird mitverschoben, '''es sei denn:'''
*Es existiert bereits eine Diskussionsseite mit diesem Namen, oder
*Sie wählen die untenstehende Option ab.
-In diesen Fällen müssen Sie, falls gewünscht, den Inhalt der Seite von Hand verschieben oder zusammenführen.',
-"movearticle" => "Seite verschieben",
-"movenologin" => "Sie sind nicht angemeldet",
-"movenologintext" => "Sie müssen ein registrierter Benutzer und
+In diesen Fällen müssen Sie, falls gewünscht, den Inhalt der Seite von Hand verschieben oder zusammenführen.",
+'movearticle' => 'Seite verschieben',
+'movenologin' => 'Sie sind nicht angemeldet',
+'movenologintext' => 'Sie müssen ein registrierter Benutzer und
[[{{ns:special}}:Userlogin|angemeldet]] sein,
-um eine Seite zu verschieben.",
-"newtitle" => "Zu neuem Titel",
-'movepagebtn' => 'Seite verschieben',
-"pagemovedsub" => "Verschiebung erfolgreich",
-'pagemovedtext' => 'Seite „[[$1]]“ wurde nach „[[$2]]“ verschoben.',
-'movereason' => 'Begründung',
-'revertmove' => 'zurück verschieben',
-'delete_and_move' => 'Löschen und Verschieben',
-'delete_and_move_text' =>
-'==Löschen erforderlich==
-
-Der Zielseite "[[$1]]" besteht bereits. Möchten Sie diesen löschen, um die Seite verschieben zu können?',
-'delete_and_move_confirm' => 'Ja, Seite löschen.',
-'delete_and_move_reason' => 'Gelöscht um Verschiebung zu ermöglichen',
-'selfmove' => 'Ursprungs- und Zielname sind gleich; eine Seite kann nicht zu sich selbst verschoben werden.',
-'immobile_namespace' => 'Der Quell- oder Zielnamensraum ist geschützt; Verschiebungen in diesen Namensraum hinein oder aus diesem heraus sind nicht möglich.',
-"articleexists" => "Unter diesem Namen existiert bereits eine Seite.
-Bitte wählen Sie einen anderen Namen.",
-'talkexists' => 'Die Seite selbst wurde erfolgreich verschoben, aber die zugehörige Diskussions-Seite nicht, da bereits eine mit dem neuen Titel existiert. Bitte gleichen Sie die Inhalte von Hand ab.',
-"movedto" => "verschoben nach",
-'movetalk' => 'Die Diskussionsseite mitverschieben, wenn möglich.',
-'talkpagemoved' => 'Die Diskussionsseite wurde ebenfalls verschoben.',
-'talkpagenotmoved' => 'Die Diskussionsseite wurde <strong>nicht</strong> verschoben.',
-
-"export" => "Seiten exportieren",
-'exporttext' => 'Mit dieser Spezialseite können Sie den Text (und die Bearbeitungs-/Versionsgeschichte) einzelner Seiten nach XML exportieren.
+um eine Seite zu verschieben.',
+'newtitle' => 'Ziel',
+'move-watch' => 'Diese Seite beobachten',
+'movepagebtn' => 'Seite verschieben',
+'pagemovedsub' => 'Verschiebung erfolgreich',
+'pagemovedtext' => 'Seite „[[$1]]“ wurde nach „[[$2]]“ verschoben.',
+'articleexists' => 'Unter diesem Namen existiert bereits eine Seite.
+Bitte wählen Sie einen anderen Namen.',
+'talkexists' => 'Die Seite selbst wurde erfolgreich verschoben, aber die zugehörige Diskussions-Seite nicht, da bereits eine mit dem neuen Titel existiert. Bitte gleichen Sie die Inhalte von Hand ab.',
+'movedto' => 'verschoben nach',
+'movetalk' => 'Die Diskussionsseite mitverschieben, wenn möglich.',
+'talkpagemoved' => 'Die Diskussionsseite wurde ebenfalls verschoben.',
+'talkpagenotmoved' => 'Die Diskussionsseite wurde <strong>nicht</strong> verschoben.',
+'1movedto2' => 'hat [[$1]] nach [[$2]] verschoben',
+'1movedto2_redir' => 'hat [[$1]] nach [[$2]] verschoben und dabei eine Weiterleitung überschrieben.',
+'movelogpage' => 'Verschiebungs-Logbuch',
+'movelogpagetext' => 'Dies ist eine Liste aller verschobenen Seiten.',
+'movereason' => 'Begründung',
+'revertmove' => 'zurück verschieben',
+'delete_and_move' => 'Löschen und Verschieben',
+'delete_and_move_text' => '==Zielseite vorhanden, löschen?==
+
+Die Seite „[[$1]]“ existiert bereits. Möchten Sie diese löschen, um die Seite verschieben zu können?',
+'delete_and_move_confirm' => 'Zielseite für die Verschiebung löschen',
+'delete_and_move_reason' => 'gelöscht, um Platz zu machen für Verschiebung',
+'selfmove' => 'Ursprungs- und Zielname sind gleich; eine Seite kann nicht zu sich selbst verschoben werden.',
+'immobile_namespace' => 'Der Quell- oder Zielnamensraum ist geschützt; Verschiebungen in diesen Namensraum hinein oder aus diesem heraus sind nicht möglich.',
+
+# Export
+'export' => 'Seiten exportieren',
+'exporttext' => 'Mit dieser Spezialseite können Sie den Text (und die Bearbeitungs-/Versionsgeschichte) einzelner Seiten nach XML exportieren.
Das Ergebnis kann in ein anderes Wiki mit MediaWiki-Software eingespielt, bearbeitet oder archiviert werden.
Tragen Sie einfach den oder die entsprechenden Seitentitel in das folgende Textfeld ein (pro Zeile jeweils nur für eine Seite).
Alternativ ist der Export auch mit der Syntax <tt><nowiki>[[Spezial:Export/Seitentitel]]</nowiki></tt> möglich, zum Beispiel [[{{ns:special}}:Export/{{Mediawiki:mainpage}}]] für die [[{{Mediawiki:mainpage}}]].',
-"exportcuronly" => "Nur die aktuelle Version der Seite exportieren",
-'exportnohistory' => '----
-\'\'\'Hinweis:\'\'\' Der Export kompletter Versionsgeschichten ist aus Performancegründen bis auf Weiteres nicht möglich.',
-'export-submit' => 'Seiten exportieren',
-"missingimage" => "<b>Fehlendes Bild</b><br /><i>$1</i>",
-'filemissing' => 'Datei fehlt',
+'exportcuronly' => 'Nur die aktuelle Version der Seite exportieren',
+'exportnohistory' => "----
+'''Hinweis:''' Der Export kompletter Versionsgeschichten ist aus Performancegründen bis auf Weiteres nicht möglich.",
+'export-submit' => 'Seiten exportieren',
+
+# Namespace 8 related
+'allmessages' => 'MediaWiki-Systemtexte',
+'allmessagesname' => 'Name',
+'allmessagesdefault' => 'Standardtext',
+'allmessagescurrent' => 'Aktueller Text',
+'allmessagestext' => 'Dies ist eine Liste der MediaWiki-Systemtexte.',
+'allmessagesnotsupportedUI' => 'Your current interface language <b>$1</b> is not supported by Special:Allmessages at this site.', # Do not translate this message
+'allmessagesnotsupportedDB' => '\'\'\'{{ns:special}}:Allmessages\'\'\' ist momentan nicht möglich, weil die Datenbank offline ist.',
+'allmessagesfilter' => 'Filter für Systemtexte:',
+'allmessagesmodified' => 'Nur geänderte zeigen',
+
+# Thumbnails
+'thumbnail-more' => 'vergrößern',
+'missingimage' => '<b>Fehlendes Bild</b><br /><i>$1</i>',
+'filemissing' => 'Datei fehlt',
'thumbnail_error' => 'Fehler beim Erstellen des Vorschaubildes: $1',
-#Tooltips:
-'tooltip-watch' => 'Diese Seite beobachten. [alt-w]',
-'tooltip-search' => 'Suchen [alt-f]',
-'tooltip-minoredit' => 'Diese Änderung als klein markieren. [alt-i]',
-'tooltip-save' => 'Änderungen speichern [alt-s]',
-'tooltip-preview' => 'Vorschau der Änderungen an dieser Seite. Benutzen Sie dies vor dem Speichern! [alt-p]',
-'tooltip-diff' => 'Zeigt Ihre Änderungen am Text tabellarisch an [alt-d]',
+# Special:Import
+'import' => 'Seiten importieren',
+'importinterwiki' => 'Transwiki-Import',
+'import-interwiki-text' => 'Wählen Sie ein Wiki und eine Seite zum Importieren aus.
+Das Datum der jeweiligen Versionen und die Autoren bleiben erhalten.
+Alle Transwiki Import-Aktionen werden im [[{{ns:special}}:Log/import|Import-Logbuch]] protokolliert.',
+'import-interwiki-history' => 'Importiere alle Versionen dieser Seite',
+'import-interwiki-submit' => 'Import',
+'import-interwiki-namespace' => 'Importiere die Seite in den Namensraum:',
+'importtext' => 'Auf dieser Spezialseite können über [[{{ns:special}}:Export]] exportierte Seiten in dieses Wiki importiert werden.',
+'importstart' => 'Importiere Seiten…',
+'import-revision-count' => '{{PLURAL:$1|eine Version|$1 Versionen}}',
+'importnopages' => 'Keine Seiten zum Importieren vorhanden.',
+'importfailed' => 'Import fehlgeschlagen: $1',
+'importunknownsource' => 'Unbekannte Importquelle',
+'importcantopen' => 'Importdatei konnte nicht geöffnet werden',
+'importbadinterwiki' => 'Falscher Interwiki-Link',
+'importnotext' => 'Leer oder kein Text',
+'importsuccess' => 'Import erfolgreich!',
+'importhistoryconflict' => 'Es existieren bereits ältere Versionen, welche mit diesen kollidieren. Möglicherweise wurde die Seite bereits vorher importiert.',
+'importnosources' => 'Für den Transwiki Import sind keine Quellen definiert. Das direkte Hochladen von Versionen ist blockiert.',
+'importnofile' => 'Es ist keine Importdatei ausgewählt worden!',
+'importuploaderror' => 'Das Hochladen der Importdatei ist fehlgeschlagen. Vielleicht ist die Datei größer als erlaubt.',
+
+# Import log
+'importlogpage' => 'Import-Logbuch',
+'importlogpagetext' => 'Administrativer Import von Seiten mit Versionsgeschichte von anderen Wikis.',
+'import-logentry-upload' => '[[$1]] wurde importiert',
+'import-logentry-upload-detail' => '{{PLURAL:$1|eine Version|$1 Versionen}}',
+'import-logentry-interwiki' => '[[$1]] wurde importiert (Transwiki)',
+'import-logentry-interwiki-detail' => '{{PLURAL:$1|eine Version|$1 Versionen}} von $2',
+
+# Keyboard access keys for power users
+'accesskey-search' => 'f',
+'accesskey-minoredit' => 'i',
+'accesskey-save' => 's',
+'accesskey-preview' => 'p',
+'accesskey-diff' => 'v',
+'accesskey-compareselectedversions' => 'v',
+'accesskey-watch' => 'w',
+
+# Tooltip help for some actions, most are in Monobook.js
+'tooltip-search' => 'Suchen [alt-f]',
+'tooltip-minoredit' => 'Diese Änderung als klein markieren. [alt-i]',
+'tooltip-save' => 'Änderungen speichern [alt-s]',
+'tooltip-preview' => 'Vorschau der Änderungen an dieser Seite. Bitte vor dem Speichern benutzen! [alt-p]',
+'tooltip-diff' => 'Zeigt Änderungen am Text tabellarisch an [alt-v]',
'tooltip-compareselectedversions' => 'Unterschiede zwischen zwei ausgewählten Versionen dieser Seite vergleichen. [alt-v]',
+'tooltip-watch' => 'Diese Seite beobachten. [alt-w]',
+
+# Stylesheets
+'common.css' => '/** CSS an dieser Stelle wirkt sich auf alle Skins aus */',
+'monobook.css' => '/** Kleinschreibung nicht erzwingen */
+.portlet h5,
+.portlet h6,
+#p-personal ul,
+#p-cactions li a {
+ text-transform: none;
+}',
# Metadata
-'nodublincore' => 'Dublin Core RDF-Metadaten sind für diesen Server deaktiviert.',
-'nocreativecommons' => 'Creative Commons RDF-Metadaten sind für diesen Server deaktiviert.',
-'notacceptable' => 'Der Wiki-Server kann die Daten nicht für Ihr Ausgabegerät aufbereiten.',
+'nodublincore' => 'Dublin-Core-RDF-Metadaten sind für diesen Server deaktiviert.',
+'nocreativecommons' => 'Creative-Commons-RDF-Metadaten sind für diesen Server deaktiviert.',
+'notacceptable' => 'Der Wiki-Server kann die Daten nicht für Ihr Ausgabegerät aufbereiten.',
# Attribution
-'anonymous' => 'Anonyme(r) Benutzer auf {{SITENAME}}',
-'lastmodifiedatby' => 'Diese Seite wurde zuletzt am $1 um $2 Uhr von $3 geändert.',
-'othercontribs' => 'Basiert auf der Arbeit von $1',
-'others' => 'andere',
-'creditspage' => 'Seiteninformationen',
-'nocredits' => 'Für diese Seite sind keine Informationen vorhanden.',
+'anonymous' => 'Anonyme(r) Benutzer auf {{SITENAME}}',
+'siteuser' => '{{SITENAME}}-Benutzer $1',
+'lastmodifiedatby' => 'Diese Seite wurde zuletzt am $1 um $2 Uhr von $3 geändert.', # $1 date, $2 time, $3 user
+'and' => 'und',
+'othercontribs' => 'Basiert auf der Arbeit von $1',
+'others' => 'andere',
+'siteusers' => '{{SITENAME}}-Benutzer $1',
+'creditspage' => 'Seiteninformationen',
+'nocredits' => 'Für diese Seite sind keine Informationen vorhanden.',
+
+# Spam protection
+'spamprotectiontitle' => 'Spamschutzfilter',
+'spamprotectiontext' => 'Die Seite die Sie speichern wollten wurde vom Spamschutzfilter blockiert. Das liegt wahrscheinlich an einem Link zu einer externen Seite.',
+'spamprotectionmatch' => 'Der folgende Text wurde von dem Spam-Filter gefunden: $1',
+'subcategorycount' => '{{PLURAL:$1|Es wird $1 Unterkategorie|Es werden $1 Unterkategorien}} angezeigt.',
+'categoryarticlecount' => 'Es {{PLURAL:$1|wird $1 Seite|werden $1 Seiten}} aus dieser Kategorie angezeigt.',
+'category-media-count' => 'Es {{PLURAL:$1|wird $1 Datei|werden $1 Dateien}} aus dieser Kategorie angezeigt.',
+'listingcontinuesabbrev' => '(Forts.)',
+'spambot_username' => 'MediaWiki Spam-Säuberung',
+'spam_reverting' => 'Letzte Version ohne Links zu $1 wiederhergestellt.',
+'spam_blanking' => 'Alle Versionen enthielten Links zu $1, bereinigt.',
# Info page
-'infosubtitle' => 'Seiteninformation',
-'numedits' => 'Anzahl der Seitenänderungen: $1',
-'numtalkedits' => 'Anzahl der Diskussionsänderungen: $1',
-'numwatchers' => 'Anzahl der Beobachter: $1',
-'numauthors' => 'Anzahl der Autoren: $1',
-'numtalkauthors' => 'Anzahl der Diskussionsteilnehmer: $1',
-
-#Tastatur-Shortcuts
-'accesskey-search' => 'f',
-'accesskey-minoredit' => 'i',
-'accesskey-save' => 's',
-'accesskey-preview' => 'p',
-'accesskey-diff' => 'd',
-'accesskey-compareselectedversions' => 'v',
-'accesskey-watch' => 'w',
-
-"makesysoptitle" => "Mache einen Benutzer zum Administrator",
-"makesysoptext" => "Diese Maske wird von Bürokraten benutzt, um normale Benutzer zu Administratoren zu machen.",
-"makesysopname" => "Name des Benutzers:",
-"makesysopsubmit" => "Mache diesen Benutzer zu einem Administrator",
-'makesysopok' => '<b>Benutzer „$1“ ist nun ein Administrator.</b>',
-'makesysopfail' => '<b>Benutzer „$1“ konnte nicht zu einem Administrator gemacht werden. (Haben Sie den Namen richtig geschrieben?)</b>',
-"makesysop" => "Mache einen Benutzer zum Administrator",
-'setbureaucratflag' => 'Mache Benutzer zum Bürokraten',
-'rightslog' => 'Rechte-Logbuch',
-'rightslogtext' => 'Dies ist das Logbuch der Änderungen der Benutzerrechte.',
-'rightslogentry' => 'Gruppenzugehörigkeit für „[[$1]]“ von „$2“ auf „$3“ geändert.',
-"rights" => "Rechte:",
-"set_user_rights" => "Benutzerrechte setzen",
-'user_rights_set' => '<b>Benutzerrechte für „$1“ aktualisiert</b>',
-'set_rights_fail' => '<b>Benutzerrechte für „$1“ konnten nicht gesetzt werden. (Haben Sie den Namen korrekt eingegeben?)</b>',
-'already_sysop' => 'Dieser Benutzer ist bereits Administrator.',
-'already_bureaucrat' => 'Dieser Benutzer ist bereits Bürokrat.',
-'rightsnone' => '(nichts)',
-
-'1movedto2' => 'hat [[$1]] nach [[$2]] verschoben',
-'1movedto2_redir' => 'hat [[$1]] nach [[$2]] verschoben und dabei eine Weiterleitung überschrieben.',
-'movelogpage' => 'Verschiebungs-Logbuch',
-'movelogpagetext' => 'Dies ist eine Liste aller verschobenen Seiten.',
-'allmessages' => 'MediaWiki-Systemtexte',
-'allmessagesname' => 'Name',
-"allmessagestext" => "Dies ist eine Liste aller möglichen Texte im MediaWiki-Namensraum.",
-'allmessagesnotsupportedUI' => 'Die aktuelle Sprache Ihrer Benutzeroberfläche <b>$1</b> wird auf dieser Seite nicht von {{ns:special}}:Allmessages unterstützt.',
-'allmessagesnotsupportedDB' => '\'\'\'{{ns:special}}:Allmessages\'\'\' ist momentan nicht möglich, weil die Datenbank offline ist.',
-'allmessagesdefault' => 'Standardtext',
-'allmessagescurrent' => 'Aktueller Text',
-'allmessagesfilter' => 'Filter für Meldungsnamen:',
-'allmessagesmodified' => 'Nur geänderte zeigen',
-"thumbnail-more" => "vergrößern",
-"and" => "und",
-'rcshowhideminor' => 'Kleine Änderungen $1',
-'rcshowhidebots' => 'Bots $1',
-'rcshowhideliu' => 'Angemeldete Benutzer $1',
-'rcshowhideanons' => 'Anonyme Benutzer $1',
-'rcshowhidepatr' => 'Überprüfte Änderungen $1',
-'rcshowhidemine' => 'Eigene Beiträge $1',
-"uploaddisabled" => "Entschuldigung, das Hochladen ist deaktiviert.",
-'deadendpages' => 'Sackgassenseiten',
-'deadendpagestext' => 'Die folgenden Seiten verweisen nicht auf andere Seiten in diesem Wiki.',
-'intl' => 'Interwiki Links',
-"version" => "Version",
-"log" => "Logbücher",
-'alllogstext' => 'Kombinierte Anzeige der Datei-, Lösch-, Seitenschutz-, Benutzerblockaden- und Rechte-Logbücher.<br />Sie können die Anzeige durch die Auswahl des Logbuchtyps, des Benutzers oder des Seitentitels einschränken.',
-'logempty' => 'Keine passenden Einträge.',
-"protectlogpage" => "Seitenschutz-Logbuch",
-'protectlogtext' => 'Dies ist eine Liste der blockierten Seiten.',
-'protectedarticle' => '„[[$1]]“ geschützt',
-'unprotectedarticle' => '„[[$1]]“ freigegeben',
-'protectsub' => '(Sperren von „$1“)',
-"confirmprotecttext" => "Soll diese Seite wirklich geschützt werden?",
-'protect-text' => 'Hier können Sie den Schutzstatus für die Seite \'\'\'$1\'\'\' einsehen und ändern.',
-'protect-level-autoconfirmed' => 'nicht registrierte Benuter blocken',
-'protect-level-sysop' => 'nur Administratoren',
-'restriction-edit' => 'bearbeiten',
-'restriction-move' => 'verschieben',
-'protect-unchain' => 'Verschiebeschutz ändern',
-'ipbexpiry' => 'Sperrdauer',
-"blocklogpage" => "Benutzerblockaden-Logbuch",
-'blocklogentry' => 'blockiert [[{{ns:user}}:$1]] - ([[{{ns:special}}:Contributions/$1|Beiträge]]) für einen Zeitraum von: $2',
-'blocklogtext' => 'Dies ist ein Log über Sperrungen und Entsperrungen von Benutzern. Automatisch geblockte IP-Adressen werden nicht erfasst. Siehe [[{{ns:special}}:Ipblocklist|IP block list]] für eine Liste der gesperrten Benutzern.',
-'unblocklogentry' => 'Blockade von [[{{ns:user}}:$1]] aufgehoben',
-"range_block_disabled" => "Die Möglichkeit, ganze Adressräume zu sperren, ist nicht aktiviert.",
-"ipb_expiry_invalid" => "Die angegebene Ablaufzeit ist ungültig.",
-'ipb_already_blocked' => '„$1“ ist bereits gesperrt',
-"ip_range_invalid" => "Ungültiger IP-Addressbereich.",
-"confirmprotect" => "Sperrung bestätigen",
-'protectmoveonly' => 'Nur vor dem Verschieben schützen',
-'protectcomment' => 'Grund der Sperrung:',
-'unprotectsub' => '(Aufhebung der Sperrung von „$1“)',
-"confirmunprotecttext" => "Wollen Sie wirklich die Sperrung dieser Seite aufheben?",
-"confirmunprotect" => "Aufhebung der Sperrung bestätigen",
-"unprotectcomment" => "Grund für das Aufheben der Sperrung",
-'protect-viewtext' => 'Sie sind nicht berechtigt, den Seitenschutzstatus zu ändern. Hier ist der aktuelle Schutzstatus der Seite: [[$1]]',
-'protect-default' => '(Standard)',
-"proxyblocker" => "Proxyblocker",
-'ipb_cant_unblock' => 'Fehler: Block ID $1 nicht gefunden. Die Sperre wurde vermutlich bereits aufgehoben.',
-"proxyblockreason" => "Ihre IP-Adresse wurde gesperrt, da sie ein offener Proxy ist. Bitte kontaktieren Sie Ihren Provider oder Ihre Systemtechnik und informieren Sie sie über dieses mögliche Sicherheitsproblem.",
-"proxyblocksuccess" => "Fertig.",
-'sorbs' => 'SORBS DNSbl',
-'sorbsreason' => 'Ihre IP-Adresse ist bei [http://www.sorbs.net SORBS] DNSbl als offener PROXY gelistet.',
-'sorbs_create_account_reason' => 'Ihre IP-Adresse ist bei [http://www.sorbs.net SORBS] DNSbl als offener PROXY gelistet. Sie können keinen Benutzer anlegen.',
-"math_image_error" => "die PNG-Konvertierung schlug fehl.",
-"math_bad_tmpdir" => "Kann das Temporärverzeichnis für mathematische Formeln nicht anlegen oder beschreiben.",
-"math_bad_output" => "Kann das Zielverzeichnis für mathematische Formeln nicht anlegen oder beschreiben.",
-"math_notexvc" => "Das texvc-Programm kann nicht gefunden werden. Bitte beachten Sie math/README.",
-'prefs-personal' => 'Benutzerdaten',
-'prefs-rc' => 'Anzeige von „Letzte Änderungen“',
-'prefs-watchlist' => 'Beobachtungsliste',
-'prefs-watchlist-days' => 'Anzahl der Tage, die auf der Beobachtungsliste angezeigt werden sollen:',
-'prefs-watchlist-edits' => 'Anzahl der Einträge in der erweiterten Beobachtungsliste:',
-'prefs-misc' => 'Verschiedenes',
-
-# Special:Import
-'import' => 'Seiten importieren',
-'importinterwiki' => 'Transwiki Import',
-'import-interwiki-text' => 'Wählen Sie ein Wiki und eine Seite zum Importieren aus.
-Das Datum der jeweiligen Versionen und die Autoren bleiben erhalten.
-Alle Transwiki Import-Aktionen werden im [[{{ns:special}}:Log/import|Import-Logbuch]] protokolliert.',
-'import-interwiki-history' => 'Alle Versionen dieser Seite kopieren',
-'import-interwiki-submit' => 'Import',
-'import-interwiki-namespace' => 'Importiere Seiten in den Namensraum:',
-'importtext' => 'Auf dieser Spezialseite können über [[{{ns:special}}:Export]] exportierte Seiten in dieses Wiki importiert werden.',
-'importstart' => 'Importiere Seiten...',
-'import-revision-count' => '$1 {{PLURAL:$1|Version|Versionen}}',
-'importnopages' => 'Keine Seiten zum Importieren vorhanden.',
-'importfailed' => 'Import fehlgeschlagen: $1',
-'importunknownsource' => 'Unbekannte Importquelle',
-'importcantopen' => 'Importdatei konnte nicht geöffnet werden',
-'importbadinterwiki' => 'Falscher Interwiki Link',
-'importnotext' => 'Leer oder kein Text',
-'importsuccess' => 'Import erfolgreich!',
-'importhistoryconflict' => 'Es existieren bereits ältere Versionen, welche mit diesen kollidieren. Möglicherweise wurde die Seite bereits vorher importiert.',
-'importnosources' => 'Für den Transwiki Import sind keine Quellen definiert. Das direkte Hochladen von Versionen ist blockiert.',
-'importnofile' => 'Es ist keine Importdatei ausgewählt worden!',
-'importuploaderror' => 'Das Hochladen der Importdatei ist fehlgeschlagen. Vielleicht ist die Datei größer als erlaubt.',
-
-# import log
-'importlogpage' => 'Import-Logbuch',
-'importlogpagetext' => 'Administrativer Import von Seiten mit Versionsgeschichte von anderen Wikis.',
-'import-logentry-upload' => '[[$1]] wurde importiert',
-'import-logentry-upload-detail' => '{{PLURAL:$1|eine Version|$1 Versionen}}',
-'import-logentry-interwiki' => '[[$1]] wurde importiert (Transwiki)',
-'import-logentry-interwiki-detail' => '{{PLURAL:$1|eine Version|$1 Versionen}} von $2',
-
-"isbn" => "ISBN",
-"siteuser" => "{{SITENAME}}-Benutzer $1",
-"siteusers" => "{{SITENAME}}-Benutzer $1",
-'watch' => 'beobachten',
-'unwatch' => 'nicht mehr beobachten',
-'move' => 'verschieben',
-'edit' => 'bearbeiten',
-'talk' => 'Diskussion',
-'views' => 'Ansichten',
-"nocookiesnew" => "Der Benutzerzugang wurde erstellt, aber Sie sind nicht eingeloggt. {{SITENAME}} benötigt für diese Funktion Cookies, bitte aktivieren Sie diese und loggen sich dann mit Ihrem neuen Benutzernamen und dem Passwort ein.",
-"nocookieslogin" => "{{SITENAME}} benutzt Cookies zum Einloggen der Benutzer. Sie haben Cookies deaktiviert, bitte aktivieren Sie diese und versuchen es erneut.",
-
-'spamprotectiontitle' => 'Spamschutzfilter',
-'spamprotectiontext' => 'Die Seite die Sie speichern wollten wurde vom Spamschutzfilter blockiert. Das liegt wahrscheinlich an einem Link zu einer externen Seite.',
-'spamprotectionmatch' => 'Der folgende Text hat den Spamfilter ausgelöst: $1',
-'subcategorycount' => 'Diese Kategorie hat {{PLURAL:$1|eine Unterkategorie|$1 Unterkategorien}}.',
-'categoryarticlecount' => 'Es gibt {{PLURAL:$1|einen|$1}} Seiten in dieser Kategorie.',
-'spambot_username' => 'MediaWiki Spam-Säuberung',
-'spam_reverting' => 'Letzte Version ohne Links zu $1 wiederhergestellt.',
-'spam_blanking' => 'Alle Versionen enthielten Links zu $1, bereinigt.',
-
-# math
-'mw_math_png' => "Immer als PNG darstellen",
-'mw_math_simple' => "Einfaches TeX als HTML darstellen, sonst PNG",
-'mw_math_html' => "Wenn möglich als HTML darstellen, sonst PNG",
-'mw_math_source' =>"Als TeX belassen (für Textbrowser)",
-'mw_math_modern' => "Empfehlenswert für moderne Browser",
+'infosubtitle' => 'Seiteninformation',
+'numedits' => 'Anzahl der Seitenänderungen: $1',
+'numtalkedits' => 'Anzahl der Diskussionsänderungen: $1',
+'numwatchers' => 'Anzahl der Beobachter: $1',
+'numauthors' => 'Anzahl der Autoren: $1',
+'numtalkauthors' => 'Anzahl der Diskussionsteilnehmer: $1',
+
+# Math options
+'mw_math_png' => 'Immer als PNG darstellen',
+'mw_math_simple' => 'Einfaches TeX als HTML darstellen, sonst PNG',
+'mw_math_html' => 'Wenn möglich als HTML darstellen, sonst PNG',
+'mw_math_source' => 'Als TeX belassen (für Textbrowser)',
+'mw_math_modern' => 'Empfehlenswert für moderne Browser',
'mw_math_mathml' => 'MathML (experimentell)',
# Patrolling
-'markaspatrolleddiff' => 'Als geprüft markieren',
-'markaspatrolledtext' => 'Diese Seitenänderung als geprüft markieren',
-'markedaspatrolled' => 'Als geprüft markiert',
-'markedaspatrolledtext' => 'Die ausgewählte Seitenänderung wurde als geprüft markiert.',
-'rcpatroldisabled' => 'Prüfung der letzten Änderungen gesperrt',
-'rcpatroldisabledtext' => 'Die Prüfung der letzten Änderungen ist zur Zeit gesperrt.',
-'markedaspatrollederror' => 'Markierung als „geprüft“ nicht möglich.',
-'markedaspatrollederrortext' => 'Sie müssen eine Seitenänderung auswählen.',
-
-# labels for User: and Title: on Special:Log pages
-'specialloguserlabel' => 'Benutzer:',
+'markaspatrolleddiff' => 'Als geprüft markieren',
+'markaspatrolledtext' => 'Diese Seitenänderung als geprüft markieren',
+'markedaspatrolled' => 'Als geprüft markiert',
+'markedaspatrolledtext' => 'Die ausgewählte Seitenänderung wurde als geprüft markiert.',
+'rcpatroldisabled' => 'Prüfung der letzten Änderungen gesperrt',
+'rcpatroldisabledtext' => 'Die Prüfung der letzten Änderungen ist zur Zeit gesperrt.',
+'markedaspatrollederror' => 'Markierung als „geprüft“ nicht möglich.',
+'markedaspatrollederrortext' => 'Sie müssen eine Seitenänderung auswählen.',
+'markedaspatrollederror-noautopatrol' => 'Es ist Ihnen nicht erlaubt, eigene Bearbeitungen als geprüft zu markieren.',
+
+# Monobook.js: tooltips and access keys for monobook
+'monobook.js' => "/* tooltips and access keys */
+var ta = new Object();
+ta['pt-userpage'] = new Array('.','Eigene Benutzerseite');
+ta['pt-anonuserpage'] = new Array('.','Benutzerseite der IP-Adresse von der aus Sie Änderungen durchführen');
+ta['pt-mytalk'] = new Array('n','Eigene Diskussionsseite');
+ta['pt-anontalk'] = new Array('n','Diskussion über Änderungen von dieser IP-Adresse');
+ta['pt-preferences'] = new Array('','Eigene Einstellungen');
+ta['pt-watchlist'] = new Array('l','Liste der beobachteten Seiten');
+ta['pt-mycontris'] = new Array('y','Liste eigener Beiträge');
+ta['pt-login'] = new Array('o','Sich einzuloggen wird zwar gerne gesehen, ist aber keine Pflicht.');
+ta['pt-anonlogin'] = new Array('o','Sich einzuloggen wird zwar gerne gesehen, ist aber keine Pflicht.');
+ta['pt-logout'] = new Array('','Abmelden');
+ta['ca-talk'] = new Array('t','Diskussion zum Seiteninhalt');
+ta['ca-edit'] = new Array('e','Seite bearbeiten. Bitte benutzen Sie vor dem Speichern die Vorschaufunktion.');
+ta['ca-addsection'] = new Array('+','Einen Kommentar zu dieser Diskussion hinzufügen.');
+ta['ca-viewsource'] = new Array('e','Diese Seite ist geschützt. Sie können sich den Quelltext ansehen.');
+ta['ca-history'] = new Array('h','Frühere Versionen dieser Seite');
+ta['ca-protect'] = new Array('=','Diese Seite schützen');
+ta['ca-delete'] = new Array('d','Diese Seite löschen');
+ta['ca-undelete'] = new Array('d','Einträge wiederherstellen, bevor diese Seite gelöscht wurde');
+ta['ca-move'] = new Array('m','Diese Seite verschieben');
+ta['ca-watch'] = new Array('w','Diese Seite zu Ihrer Beobachtungsliste hinzufügen');
+ta['ca-unwatch'] = new Array('w','Diese Seite von Ihrer Beobachtungsliste entfernen');
+ta['search'] = new Array('f','Dieses Wiki durchsuchen');
+ta['p-logo'] = new Array('','Hauptseite');
+ta['n-mainpage'] = new Array('z','Hauptseite anzeigen');
+ta['n-portal'] = new Array('','Über das Portal, was Sie tun können, wo was zu finden ist');
+ta['n-currentevents'] = new Array('','Hintergrundinformationen zu aktuellen Ereignissen');
+ta['n-recentchanges'] = new Array('r','Liste der letzten Änderungen in diesem Wiki.');
+ta['n-randompage'] = new Array('x','Zufällige Seite');
+ta['n-help'] = new Array('','Hilfeseite anzeigen');
+ta['n-sitesupport'] = new Array('','Unterstützen Sie uns');
+ta['t-whatlinkshere'] = new Array('j','Liste aller Seiten, die hierher zeigen');
+ta['t-recentchangeslinked'] = new Array('k','Letzte Änderungen an Seiten, die von hier verlinkt sind');
+ta['feed-rss'] = new Array('','RSS-Feed für diese Seite');
+ta['feed-atom'] = new Array('','Atom-Feed für diese Seite');
+ta['t-contributions'] = new Array('','Liste der Beiträge von diesem Benutzer ansehen');
+ta['t-emailuser'] = new Array('','Eine E-Mail an diesen Benutzer senden');
+ta['t-upload'] = new Array('u','Dateien hochladen');
+ta['t-specialpages'] = new Array('q','Liste aller Spezialseiten');
+ta['ca-nstab-main'] = new Array('c','Seiteninhalt anzeigen');
+ta['ca-nstab-user'] = new Array('c','Benutzerseite anzeigen');
+ta['ca-nstab-media'] = new Array('c','Mediendateienseite anzeigen');
+ta['ca-nstab-special'] = new Array('','Dies ist eine Spezialseite. Sie können diese nicht ändern.');
+ta['ca-nstab-project'] = new Array('a','Portalseite anzeigen');
+ta['ca-nstab-image'] = new Array('c','Bilderseite anzeigen');
+ta['ca-nstab-mediawiki'] = new Array('c','MediaWiki-Systemtext anzeigen');
+ta['ca-nstab-template'] = new Array('c','Vorlage anzeigen');
+ta['ca-nstab-help'] = new Array('c','Hilfeseite anzeigen');
+ta['ca-nstab-category'] = new Array('c','Kategorieseite anzeigen');",
+
+# Common.js: contains nothing but a placeholder comment
+'common.js' => '/* Jedes JavaScript hier wird für alle Benutzer für jede Seite geladen. */',
+
+# Image deletion
+'deletedrevision' => 'Alte Version $1 gelöscht.',
+
+# Browsing diffs
+'previousdiff' => '↠Zum vorherigen Versionsunterschied',
+'nextdiff' => 'Zum nächsten Versionsunterschied →',
+
+'imagemaxsize' => 'Maximale Bildgröße auf Bildbeschreibungsseiten:',
+'thumbsize' => 'Standardgröße der Vorschaubilder (thumbnails):',
+'showbigimage' => 'Version mit hoher Auflösung herunterladen ($1 x $2 Pixel, $3 kB)',
+
+'newimages' => 'Neue Dateien',
+'newimages-summary' => 'Diese Spezialseite zeigt die zuletzt hochgeladenen Bilder und Dateien an.',
+'showhidebots' => '(Bots $1)',
+'noimages' => 'Keine Dateien gefunden.',
+
+# List interwikis
+'listinterwikis' => 'Liste der Interwikis',
+
+/*
+Short names for language variants used for language conversion links.
+To disable showing a particular link, set it to 'disable', e.g.
+'variantname-zh-sg' => 'disable',
+Variants for Chinese language
+*/
+'variantname-zh-cn' => 'cn',
+'variantname-zh-tw' => 'tw',
+'variantname-zh-hk' => 'hk',
+'variantname-zh-sg' => 'sg',
+'variantname-zh' => 'zh',
+
+# Variants for Serbian language
+'variantname-sr-ec' => 'sr-ec',
+'variantname-sr-el' => 'sr-el',
+'variantname-sr-jc' => 'sr-jc',
+'variantname-sr-jl' => 'sr-jl',
+'variantname-sr' => 'sr',
+
+# Variants for Kazakh language
+'variantname-kk-tr' => 'kk-tr',
+'variantname-kk-kz' => 'kk-kz',
+'variantname-kk-cn' => 'kk-cn',
+'variantname-kk' => 'kk',
+
+# Labels for User: and Title: on Special:Log pages
+'specialloguserlabel' => 'Benutzer:',
'speciallogtitlelabel' => 'Titel:',
-'passwordtooshort' => 'Ihr Passwort ist zu kurz. Es muss mindestens $1 Zeichen lang sein.',
-# Media Warning
-'mediawarning' => '\'\'\'Warnung:\'\'\' Diese Art von Datei kann böswilligen Programmcode enthalten. Durch das Herunterladen oder Öffnen der Datei kann Ihr Computer beschädigt werden.<hr />',
+'passwordtooshort' => 'Das Passwort ist zu kurz. Es muss mindestens $1 Zeichen lang sein.',
-'fileinfo' => '$1 kB, MIME Typ: <code>$2</code>',
+# Media Warning
+'mediawarning' => "'''Warnung:''' Diese Art von Datei kann böswilligen Programmcode enthalten. Durch das Herunterladen oder Öffnen der Datei kann Ihr Computer beschädigt werden.<hr />",
-# external editor support
-'edit-externally' => 'Diese Datei mit einem externen Programm bearbeiten',
-'edit-externally-help' => 'Siehe die [http://meta.wikimedia.org/wiki/Help:External_editors Installationsanweisungen] für weitere Informationen',
+'fileinfo' => '$1 kB, MIME Typ: <code>$2</code>',
# Metadata
-'metadata' => 'Metadaten',
-'metadata-help' => 'Diese Datei enthält weitere Informationen, die in der Regel von der Digitalkamera oder dem verwendeten Scanner stammen. Durch nachträgliche Bearbeitung der Originaldatei können einige Details verändert worden sein.',
-'metadata_help' => 'Metadaten:',
-'metadata-expand' => 'Erweiterte Details einblenden',
-'metadata-collapse' => 'Erweiterte Details ausblenden',
-'metadata-fields' => 'Die folgenden EXIF-Metadaten in diesem MediaWiki-Systemtext werden auf Bildbeschreibungsseiten angezeigt. Weitere EXIF-Metadaten werden standardmäßig ausgeblendet.
+'metadata' => 'Metadaten',
+'metadata-help' => 'Diese Datei enthält weitere Informationen, die in der Regel von der Digitalkamera oder dem verwendeten Scanner stammen. Durch nachträgliche Bearbeitung der Originaldatei können einige Details verändert worden sein.',
+'metadata-expand' => 'Erweiterte Details einblenden',
+'metadata-collapse' => 'Erweiterte Details ausblenden',
+'metadata-fields' => 'Die folgenden Felder der EXIF-Metadaten in diesem MediaWiki-Systemtext werden auf Bildbeschreibungsseiten angezeigt; weitere standardmäßig „eingeklappte“ Details können angezeigt werden.
* make
* model
* datetimeoriginal
@@ -1568,266 +1792,303 @@ Alle Transwiki Import-Aktionen werden im [[{{ns:special}}:Log/import|Import-Logb
* fnumber
* focallength',
-# Exif tags
-'exif-aperturevalue' => 'Blendenwert',
-'exif-artist' => 'Fotograf',
-'exif-bitspersample' => 'Bits pro Farbkomponente',
-'exif-brightnessvalue' => 'Helligkeitswert',
-'exif-cfapattern' => 'CFA-Muster',
-'exif-colorspace' => 'Farbraum',
-'exif-colorspace-1' => 'sRGB',
-'exif-colorspace-ffff.h' => 'FFFF.H',
-'exif-componentsconfiguration' => 'Bedeutung einzelner Komponenten',
-'exif-componentsconfiguration-0' => 'Existiert nicht',
-'exif-componentsconfiguration-1' => 'Y',
-'exif-componentsconfiguration-2' => 'Cb',
-'exif-componentsconfiguration-3' => 'Cr',
-'exif-componentsconfiguration-4' => 'R',
-'exif-componentsconfiguration-5' => 'G',
-'exif-componentsconfiguration-6' => 'B',
-'exif-compressedbitsperpixel' => 'Komprimierte Bits pro Pixel',
-'exif-compression' => 'Art der Kompression',
-'exif-compression-1' => 'Unkomprimiert',
-'exif-compression-6' => 'JPEG',
-'exif-contrast' => 'Kontrast',
-'exif-contrast-0' => 'Normal',
-'exif-contrast-1' => 'Schwach',
-'exif-contrast-2' => 'Stark',
-'exif-copyright' => 'Urheberrechte',
-'exif-customrendered' => 'Benutzerdefinierte Bildverarbeitung',
-'exif-customrendered-0' => 'Standard',
-'exif-customrendered-1' => 'Benutzerdefiniert',
-'exif-datetime' => 'Speicherzeitpunkt',
-'exif-datetimedigitized' => 'Digitalisierungszeitpunkt',
-'exif-datetimeoriginal' => 'Erfassungszeitpunkt',
-'exif-devicesettingdescription' => 'Geräteeinstellung',
-'exif-digitalzoomratio' => 'Digitalzoom',
-'exif-exifversion' => 'Exif-Version',
-'exif-exposurebiasvalue' => 'Belichtungsvorgabe',
-'exif-exposureindex' => 'Belichtungsindex',
-'exif-exposuremode' => 'Belichtungsmodus',
-'exif-exposuremode-0' => 'Automatische Belichtung',
-'exif-exposuremode-1' => 'Manuelle Belichtung',
-'exif-exposuremode-2' => 'Belichtungsreihe',
-'exif-exposureprogram' => 'Belichtungsprogramm',
-'exif-exposureprogram-0' => 'Unbekannt',
-'exif-exposureprogram-1' => 'Manuell',
-'exif-exposureprogram-2' => 'Standardprogramm',
-'exif-exposureprogram-3' => 'Zeitautomatik',
-'exif-exposureprogram-4' => 'Blendenautomatik',
-'exif-exposureprogram-5' => 'Kreativprogramm mit Bevorzugung hoher Schärfentiefe',
-'exif-exposureprogram-6' => 'Action-Programm mit Bevorzugung einer kurzen Belichtungszeit',
-'exif-exposureprogram-7' => 'Portrait-Programm',
-'exif-exposureprogram-8' => 'Landschaftsaufnahmen',
-'exif-exposuretime' => 'Belichtungsdauer',
-'exif-exposuretime-format' => '$1 Sekunden ($2)',
-'exif-filesource' => 'Quelle der Datei',
-'exif-filesource-3' => 'DSC',
-'exif-flash' => 'Blitz',
-'exif-flashenergy' => 'Blitzstärke',
-'exif-flashpixversion' => 'unterstützte Flashpix-Version',
-'exif-fnumber' => 'Blende',
-'exif-fnumber-format' => 'f/$1',
-'exif-focallength' => 'Brennweite',
-'exif-focallength-format' => '$1 mm',
-'exif-focallengthin35mmfilm' => 'Brennweite (Kleinbildäquivalent)',
-'exif-focalplaneresolutionunit' => 'Einheit der Sensorauflösung',
-'exif-focalplaneresolutionunit-2' => 'Zoll',
-'exif-focalplanexresolution' => 'Sensorauflösung horizontal',
-'exif-focalplaneyresolution' => 'Sensorauflösung vertikal',
-'exif-gaincontrol' => 'Verstärkung',
-'exif-gaincontrol-0' => 'Keine',
-'exif-gaincontrol-1' => 'Gering',
-'exif-gaincontrol-2' => 'High gain up',
-'exif-gaincontrol-3' => 'Low gain down',
-'exif-gaincontrol-4' => 'High gain down',
-'exif-gpsaltitude' => 'Höhe',
-'exif-gpsaltituderef' => 'Bezugshöhe',
-'exif-gpsareainformation' => 'Name des GPS-Gebietes',
-'exif-gpsdatestamp' => 'GPS-Datum',
-'exif-gpsdestbearing' => 'Motivrichtung',
-'exif-gpsdestbearingref' => 'Referenz für Motivrichtung',
-'exif-gpsdestdistance' => 'Motiventfernung',
-'exif-gpsdestdistanceref' => 'Referenz für die Motiventfernung',
-'exif-gpsdestlatitude' => 'Breite',
-'exif-gpsdestlatituderef' => 'Referenz für die Breite',
-'exif-gpsdestlongitude' => 'Länge',
-'exif-gpsdestlongituderef' => 'Referenz für die Länge',
-'exif-gpsdifferential' => 'GPS-Differentialkorrektur',
-'exif-gpsdirection-m' => 'Magnetische Richtung',
-'exif-gpsdirection-t' => 'Tatsächliche Richtung',
-'exif-gpsdop' => 'Maßpräzision',
-'exif-gpsimgdirection' => 'Bildrichtung',
-'exif-gpsimgdirectionref' => 'Referenz für die Ausrichtung des Bildes',
-'exif-gpslatitude' => 'Geografische Breite',
-'exif-gpslatitude-n' => 'nördl. Breite',
-'exif-gpslatitude-s' => 'südl. Breite',
-'exif-gpslatituderef' => 'nördl. oder südl. Breite',
-'exif-gpslongitude' => 'Geografische Länge',
-'exif-gpslongitude-e' => 'östl. Länge',
-'exif-gpslongitude-w' => 'westl. Länge',
-'exif-gpslongituderef' => 'östl. oder westl. Länge',
-'exif-gpsmapdatum' => 'Geodätisches Datum benutzt',
-'exif-gpsmeasuremode' => 'Messverfahren',
-'exif-gpsmeasuremode-2' => '2-dimensionale Messung',
-'exif-gpsmeasuremode-3' => '3-dimensionale Messung',
-'exif-gpsprocessingmethod' => 'Name des GPS-Verfahrens',
-'exif-gpssatellites' => 'Für die Messung benutzte Satelliten',
-'exif-gpsspeed' => 'Geschwindigkeit des GPS-Empfängers',
-'exif-gpsspeed-k' => 'km/h',
-'exif-gpsspeed-m' => 'mph',
-'exif-gpsspeed-n' => 'Knoten',
-'exif-gpsspeedref' => 'Geschwindigkeitseinheit',
-'exif-gpsstatus' => 'Empfängerstatus',
-'exif-gpsstatus-a' => 'Messung läuft',
-#'exif-gpsstatus-v' => 'Measurement interoperability',
-'exif-gpstimestamp' => 'GPS-Zeit',
-'exif-gpstrack' => 'Bewegungsrichtung',
-'exif-gpstrackref' => 'Referenz für Bewegungsrichtung',
-'exif-gpsversionid' => 'GPS-Tag-Version',
-'exif-imagedescription' => 'Bildtitel',
-'exif-imagelength' => 'Länge',
-'exif-imageuniqueid' => 'Bild-ID',
-'exif-imagewidth' => 'Breite',
-'exif-isospeedratings' => 'Film- oder Sensorempfindlichkeit (ISO)',
-'exif-jpeginterchangeformat' => 'Offset zu JPEG SOI',
-'exif-jpeginterchangeformatlength' => 'Größe der JPEG-Daten in Bytes',
-'exif-lightsource' => 'Lichtquelle',
-'exif-lightsource-0' => 'Unbekannt',
-'exif-lightsource-1' => 'Tageslicht',
-'exif-lightsource-10' => 'Bewölkt',
-'exif-lightsource-11' => 'Schatten',
-'exif-lightsource-12' => 'Tageslicht fluoreszierend (D 5700–7100 K)',
-'exif-lightsource-13' => 'Tagesweiß fluoreszierend (N 4600–5400 K)',
-'exif-lightsource-14' => 'Kaltweiß fluoreszierend (W 3900–4500 K)',
-'exif-lightsource-15' => 'Weiß fluoreszierend (WW 3200–3700 K)',
-'exif-lightsource-17' => 'Standardlicht A',
-'exif-lightsource-18' => 'Standardlicht B',
-'exif-lightsource-19' => 'Standardlicht C',
-'exif-lightsource-2' => 'Fluoreszierend',
-'exif-lightsource-20' => 'D55',
-'exif-lightsource-21' => 'D65',
-'exif-lightsource-22' => 'D75',
-'exif-lightsource-23' => 'D50',
-'exif-lightsource-24' => 'ISO Studio Kunstlicht',
-'exif-lightsource-255' => 'Andere Lichtquelle',
-'exif-lightsource-3' => 'Glühlampe',
-'exif-lightsource-4' => 'Blitz',
-'exif-lightsource-9' => 'Schönes Wetter',
-'exif-make' => 'Hersteller',
-'exif-makernote' => 'Herstellernotiz',
-'exif-maxaperturevalue' => 'Größte Blende',
-'exif-meteringmode' => 'Messverfahren',
-'exif-meteringmode-0' => 'Unbekannt',
-'exif-meteringmode-1' => 'Durchschnittlich',
-'exif-meteringmode-2' => 'Mittenzentriert',
-'exif-meteringmode-255' => 'Unbekannt',
-'exif-meteringmode-3' => 'Spotmessung',
-'exif-meteringmode-4' => 'Mehrfachspotmessung',
-'exif-meteringmode-5' => 'Muster',
-'exif-meteringmode-6' => 'Bildteil',
-'exif-model' => 'Modell',
-'exif-oecf' => 'Optoelektronischer Umrechnungsfaktor',
-'exif-orientation' => 'Kameraausrichtung',
-'exif-orientation-1' => 'Normal',
-'exif-orientation-2' => 'Horizontal gedreht',
-'exif-orientation-3' => 'Um 180° gedreht',
-'exif-orientation-4' => 'Vertikal gedreht',
-'exif-orientation-5' => 'Entgegen dem Uhrzeigersinn um 90° gedreht und vertikal gewendet',
-'exif-orientation-6' => 'Um 90° in Uhrzeigersinn gedreht',
-'exif-orientation-7' => 'Um 90° in Uhrzeigersinn gedreht und vertikal gewendet',
-'exif-orientation-8' => 'Um 90° entgegen dem Uhrzeigersinn gedreht',
-'exif-photometricinterpretation-2' => 'RGB',
-'exif-photometricinterpretation-6' => 'YCbCr',
-'exif-photometricinterpretation' => 'Pixelzusammensetzung',
-'exif-pixelxdimension' => 'Gültige Bildhöhe',
-'exif-pixelydimension' => 'Gültige Bildbreite',
-'exif-planarconfiguration' => 'Datenausrichtung',
-'exif-planarconfiguration-1' => 'Grobformat',
-'exif-planarconfiguration-2' => 'Planarformat',
-#'exif-primarychromaticities' => 'Chromaticities of primarities',
-'exif-referenceblackwhite' => 'Schwarz/Weiß-Referenzpunkte',
-'exif-relatedsoundfile' => 'Zugehörige Tondatei',
-'exif-resolutionunit' => 'Masseinheit der Auflösung',
-'exif-rowsperstrip' => 'Anzahl Zeilen pro Streifen',
-'exif-samplesperpixel' => 'Anzahl Komponenten',
-'exif-saturation' => 'Sättigung',
-'exif-saturation-0' => 'Normal',
-'exif-saturation-1' => 'Gering',
-'exif-saturation-2' => 'Hoch',
-'exif-scenecapturetype' => 'Aufnahmeart',
-'exif-scenecapturetype-0' => 'Standard',
-'exif-scenecapturetype-1' => 'Landschaft',
-'exif-scenecapturetype-2' => 'Portrait',
-'exif-scenecapturetype-3' => 'Nachtszene',
-'exif-scenetype' => 'Szenentyp',
-'exif-scenetype-1' => 'Normal',
-'exif-sensingmethod' => 'Messmethode',
-'exif-sensingmethod-1' => 'Undefiniert',
-'exif-sensingmethod-2' => 'Ein-Chip-Farbsensor',
-'exif-sensingmethod-3' => 'Zwei-Chip-Farbsensor',
-'exif-sensingmethod-4' => 'Drei-Chip-Farbsensor',
-#'exif-sensingmethod-5' => 'Color sequential area sensor',
-'exif-sensingmethod-7' => 'Trilinearer Sensor',
-#'exif-sensingmethod-8' => 'Color sequential linear sensor',
-'exif-sharpness' => 'Schärfe',
-'exif-sharpness-0' => 'Normal',
-'exif-sharpness-1' => 'Gering',
-'exif-sharpness-2' => 'Stark',
-'exif-shutterspeedvalue' => 'Belichtungszeitwert',
-'exif-software' => 'Software',
-#'exif-spatialfrequencyresponse' => 'Spatial frequency response',
-'exif-spectralsensitivity' => 'Spectral Sensitivity',
-#'exif-stripbytecounts' => 'Bytes per compressed strip',
-'exif-stripoffsets' => 'Bilddaten-Versatz',
-'exif-subjectarea' => 'Bereich',
-'exif-subjectdistance' => 'Entfernung',
-'exif-subjectdistance-value' => '$1 Meter',
-'exif-subjectdistancerange' => 'Motiventfernung',
-'exif-subjectdistancerange-0' => 'Unbekannt',
-'exif-subjectdistancerange-1' => 'Makro',
-'exif-subjectdistancerange-2' => 'Nah',
-'exif-subjectdistancerange-3' => 'Entfernt',
-'exif-subjectlocation' => 'Motivstandort',
-'exif-subsectime' => 'Speicherzeitpunkt (1/100 s)',
-'exif-subsectimedigitized' => 'Digitalisierungszeitpunkt (1/100 s)',
-'exif-subsectimeoriginal' => 'Erfassungszeitpunkt (1/100 s)',
-'exif-transferfunction' => 'Ãœbertragungsfunktion',
-'exif-usercomment' => 'Benutzerkommentare',
-'exif-whitebalance' => 'Weißabgleich',
-'exif-whitebalance-0' => 'Automatisch',
-'exif-whitebalance-1' => 'Manuell',
-'exif-whitepoint' => 'Manuell mit Messung',
-'exif-xresolution' => 'Horizontale Auflösung',
-'exif-xyresolution-c' => '$1 dpc',
-'exif-xyresolution-i' => '$1 dpi',
-'exif-ycbcrcoefficients' => 'YCbCr-Koeffizienten',
-'exif-ycbcrpositioning' => 'Y und C Positionierung',
-'exif-ycbcrsubsampling' => 'Subsampling Rate von Y bis C',
-'exif-yresolution' => 'Vertikale Auflösung',
+# EXIF tags
+'exif-imagewidth' => 'Breite',
+'exif-imagelength' => 'Länge',
+'exif-bitspersample' => 'Bits pro Farbkomponente',
+'exif-compression' => 'Art der Kompression',
+'exif-photometricinterpretation' => 'Pixelzusammensetzung',
+'exif-orientation' => 'Kameraausrichtung',
+'exif-samplesperpixel' => 'Anzahl Komponenten',
+'exif-planarconfiguration' => 'Datenausrichtung',
+'exif-ycbcrsubsampling' => 'Subsampling Rate von Y bis C',
+'exif-ycbcrpositioning' => 'Y und C Positionierung',
+'exif-xresolution' => 'Horizontale Auflösung',
+'exif-yresolution' => 'Vertikale Auflösung',
+'exif-resolutionunit' => 'Maßeinheit der Auflösung',
+'exif-stripoffsets' => 'Bilddaten-Versatz',
+'exif-rowsperstrip' => 'Anzahl Zeilen pro Streifen',
+'exif-jpeginterchangeformat' => 'Offset zu JPEG SOI',
+'exif-jpeginterchangeformatlength' => 'Größe der JPEG-Daten in Bytes',
+'exif-transferfunction' => 'Ãœbertragungsfunktion',
+'exif-whitepoint' => 'Manuell mit Messung',
+'exif-ycbcrcoefficients' => 'YCbCr-Koeffizienten',
+'exif-referenceblackwhite' => 'Schwarz/Weiß-Referenzpunkte',
+'exif-datetime' => 'Speicherzeitpunkt',
+'exif-imagedescription' => 'Bildtitel',
+'exif-make' => 'Hersteller',
+'exif-model' => 'Modell',
+'exif-software' => 'Software',
+'exif-artist' => 'Fotograf',
+'exif-copyright' => 'Urheberrechte',
+'exif-exifversion' => 'Exif-Version',
+'exif-flashpixversion' => 'unterstützte Flashpix-Version',
+'exif-colorspace' => 'Farbraum',
+'exif-componentsconfiguration' => 'Bedeutung einzelner Komponenten',
+'exif-compressedbitsperpixel' => 'Komprimierte Bits pro Pixel',
+'exif-pixelydimension' => 'Gültige Bildbreite',
+'exif-pixelxdimension' => 'Gültige Bildhöhe',
+'exif-makernote' => 'Herstellernotiz',
+'exif-usercomment' => 'Benutzerkommentare',
+'exif-relatedsoundfile' => 'Zugehörige Tondatei',
+'exif-datetimeoriginal' => 'Erfassungszeitpunkt',
+'exif-datetimedigitized' => 'Digitalisierungszeitpunkt',
+'exif-subsectime' => 'Speicherzeitpunkt (1/100 s)',
+'exif-subsectimeoriginal' => 'Erfassungszeitpunkt (1/100 s)',
+'exif-subsectimedigitized' => 'Digitalisierungszeitpunkt (1/100 s)',
+'exif-exposuretime' => 'Belichtungsdauer',
+'exif-exposuretime-format' => '$1 Sekunden ($2)',
+'exif-fnumber' => 'Blende',
+'exif-fnumber-format' => 'f/$1',
+'exif-exposureprogram' => 'Belichtungsprogramm',
+'exif-spectralsensitivity' => 'Spectral Sensitivity',
+'exif-isospeedratings' => 'Film- oder Sensorempfindlichkeit (ISO)',
+'exif-oecf' => 'Optoelektronischer Umrechnungsfaktor',
+'exif-shutterspeedvalue' => 'Belichtungszeitwert',
+'exif-aperturevalue' => 'Blendenwert',
+'exif-brightnessvalue' => 'Helligkeitswert',
+'exif-exposurebiasvalue' => 'Belichtungsvorgabe',
+'exif-maxaperturevalue' => 'Größte Blende',
+'exif-subjectdistance' => 'Entfernung',
+'exif-meteringmode' => 'Messverfahren',
+'exif-lightsource' => 'Lichtquelle',
+'exif-flash' => 'Blitz',
+'exif-focallength' => 'Brennweite',
+'exif-focallength-format' => '$1 mm',
+'exif-subjectarea' => 'Bereich',
+'exif-flashenergy' => 'Blitzstärke',
+'exif-focalplanexresolution' => 'Sensorauflösung horizontal',
+'exif-focalplaneyresolution' => 'Sensorauflösung vertikal',
+'exif-focalplaneresolutionunit' => 'Einheit der Sensorauflösung',
+'exif-subjectlocation' => 'Motivstandort',
+'exif-exposureindex' => 'Belichtungsindex',
+'exif-sensingmethod' => 'Messmethode',
+'exif-filesource' => 'Quelle der Datei',
+'exif-scenetype' => 'Szenentyp',
+'exif-cfapattern' => 'CFA-Muster',
+'exif-customrendered' => 'Benutzerdefinierte Bildverarbeitung',
+'exif-exposuremode' => 'Belichtungsmodus',
+'exif-whitebalance' => 'Weißabgleich',
+'exif-digitalzoomratio' => 'Digitalzoom',
+'exif-focallengthin35mmfilm' => 'Brennweite (Kleinbildäquivalent)',
+'exif-scenecapturetype' => 'Aufnahmeart',
+'exif-gaincontrol' => 'Verstärkung',
+'exif-contrast' => 'Kontrast',
+'exif-saturation' => 'Sättigung',
+'exif-sharpness' => 'Schärfe',
+'exif-devicesettingdescription' => 'Geräteeinstellung',
+'exif-subjectdistancerange' => 'Motiventfernung',
+'exif-imageuniqueid' => 'Bild-ID',
+'exif-gpsversionid' => 'GPS-Tag-Version',
+'exif-gpslatituderef' => 'nördl. oder südl. Breite',
+'exif-gpslatitude' => 'Geografische Breite',
+'exif-gpslongituderef' => 'östl. oder westl. Länge',
+'exif-gpslongitude' => 'Geografische Länge',
+'exif-gpsaltituderef' => 'Bezugshöhe',
+'exif-gpsaltitude' => 'Höhe',
+'exif-gpstimestamp' => 'GPS-Zeit',
+'exif-gpssatellites' => 'Für die Messung benutzte Satelliten',
+'exif-gpsstatus' => 'Empfängerstatus',
+'exif-gpsmeasuremode' => 'Messverfahren',
+'exif-gpsdop' => 'Maßpräzision',
+'exif-gpsspeedref' => 'Geschwindigkeitseinheit',
+'exif-gpsspeed' => 'Geschwindigkeit des GPS-Empfängers',
+'exif-gpstrackref' => 'Referenz für Bewegungsrichtung',
+'exif-gpstrack' => 'Bewegungsrichtung',
+'exif-gpsimgdirectionref' => 'Referenz für die Ausrichtung des Bildes',
+'exif-gpsimgdirection' => 'Bildrichtung',
+'exif-gpsmapdatum' => 'Geodätisches Datum benutzt',
+'exif-gpsdestlatituderef' => 'Referenz für die Breite',
+'exif-gpsdestlatitude' => 'Breite',
+'exif-gpsdestlongituderef' => 'Referenz für die Länge',
+'exif-gpsdestlongitude' => 'Länge',
+'exif-gpsdestbearingref' => 'Referenz für Motivrichtung',
+'exif-gpsdestbearing' => 'Motivrichtung',
+'exif-gpsdestdistanceref' => 'Referenz für die Motiventfernung',
+'exif-gpsdestdistance' => 'Motiventfernung',
+'exif-gpsprocessingmethod' => 'Name des GPS-Verfahrens',
+'exif-gpsareainformation' => 'Name des GPS-Gebietes',
+'exif-gpsdatestamp' => 'GPS-Datum',
+'exif-gpsdifferential' => 'GPS-Differentialkorrektur',
+
+# EXIF attributes
+'exif-compression-1' => 'Unkomprimiert',
+'exif-compression-6' => 'JPEG',
+
+'exif-photometricinterpretation-2' => 'RGB',
+'exif-photometricinterpretation-6' => 'YCbCr',
+
+'exif-unknowndate' => 'Unbekanntes Datum',
+
+'exif-orientation-1' => 'Normal', # 0th row: top; 0th column: left
+'exif-orientation-2' => 'Horizontal gedreht', # 0th row: top; 0th column: right
+'exif-orientation-3' => 'Um 180° gedreht', # 0th row: bottom; 0th column: right
+'exif-orientation-4' => 'Vertikal gedreht', # 0th row: bottom; 0th column: left
+'exif-orientation-5' => 'Entgegen dem Uhrzeigersinn um 90° gedreht und vertikal gewendet', # 0th row: left; 0th column: top
+'exif-orientation-6' => 'Um 90° in Uhrzeigersinn gedreht', # 0th row: right; 0th column: top
+'exif-orientation-7' => 'Um 90° in Uhrzeigersinn gedreht und vertikal gewendet', # 0th row: right; 0th column: bottom
+'exif-orientation-8' => 'Um 90° entgegen dem Uhrzeigersinn gedreht', # 0th row: left; 0th column: bottom
+
+'exif-planarconfiguration-1' => 'Grobformat',
+'exif-planarconfiguration-2' => 'Planarformat',
+
+'exif-xyresolution-i' => '$1 dpi',
+'exif-xyresolution-c' => '$1 dpc',
+
+'exif-colorspace-1' => 'sRGB',
+'exif-colorspace-ffff.h' => 'FFFF.H',
+
+'exif-componentsconfiguration-0' => 'Existiert nicht',
+'exif-componentsconfiguration-1' => 'Y',
+'exif-componentsconfiguration-2' => 'Cb',
+'exif-componentsconfiguration-3' => 'Cr',
+'exif-componentsconfiguration-4' => 'R',
+'exif-componentsconfiguration-5' => 'G',
+'exif-componentsconfiguration-6' => 'B',
+
+'exif-exposureprogram-0' => 'Unbekannt',
+'exif-exposureprogram-1' => 'Manuell',
+'exif-exposureprogram-2' => 'Standardprogramm',
+'exif-exposureprogram-3' => 'Zeitautomatik',
+'exif-exposureprogram-4' => 'Blendenautomatik',
+'exif-exposureprogram-5' => 'Kreativprogramm mit Bevorzugung hoher Schärfentiefe',
+'exif-exposureprogram-6' => 'Action-Programm mit Bevorzugung einer kurzen Belichtungszeit',
+'exif-exposureprogram-7' => 'Portrait-Programm',
+'exif-exposureprogram-8' => 'Landschaftsaufnahmen',
+
+'exif-subjectdistance-value' => '$1 Meter',
+
+'exif-meteringmode-0' => 'Unbekannt',
+'exif-meteringmode-1' => 'Durchschnittlich',
+'exif-meteringmode-2' => 'Mittenzentriert',
+'exif-meteringmode-3' => 'Spotmessung',
+'exif-meteringmode-4' => 'Mehrfachspotmessung',
+'exif-meteringmode-5' => 'Muster',
+'exif-meteringmode-6' => 'Bildteil',
+'exif-meteringmode-255' => 'Unbekannt',
+
+'exif-lightsource-0' => 'Unbekannt',
+'exif-lightsource-1' => 'Tageslicht',
+'exif-lightsource-2' => 'Fluoreszierend',
+'exif-lightsource-3' => 'Glühlampe',
+'exif-lightsource-4' => 'Blitz',
+'exif-lightsource-9' => 'Schönes Wetter',
+'exif-lightsource-10' => 'Bewölkt',
+'exif-lightsource-11' => 'Schatten',
+'exif-lightsource-12' => 'Tageslicht fluoreszierend (D 5700–7100 K)',
+'exif-lightsource-13' => 'Tagesweiß fluoreszierend (N 4600–5400 K)',
+'exif-lightsource-14' => 'Kaltweiß fluoreszierend (W 3900–4500 K)',
+'exif-lightsource-15' => 'Weiß fluoreszierend (WW 3200–3700 K)',
+'exif-lightsource-17' => 'Standardlicht A',
+'exif-lightsource-18' => 'Standardlicht B',
+'exif-lightsource-19' => 'Standardlicht C',
+'exif-lightsource-20' => 'D55',
+'exif-lightsource-21' => 'D65',
+'exif-lightsource-22' => 'D75',
+'exif-lightsource-23' => 'D50',
+'exif-lightsource-24' => 'ISO Studio Kunstlicht',
+'exif-lightsource-255' => 'Andere Lichtquelle',
+
+'exif-focalplaneresolutionunit-2' => 'Zoll',
+
+'exif-sensingmethod-1' => 'Undefiniert',
+'exif-sensingmethod-2' => 'Ein-Chip-Farbsensor',
+'exif-sensingmethod-3' => 'Zwei-Chip-Farbsensor',
+'exif-sensingmethod-4' => 'Drei-Chip-Farbsensor',
+'exif-sensingmethod-7' => 'Trilinearer Sensor',
+
+'exif-filesource-3' => 'DSC',
+
+'exif-scenetype-1' => 'Normal',
+
+'exif-customrendered-0' => 'Standard',
+'exif-customrendered-1' => 'Benutzerdefiniert',
+
+'exif-exposuremode-0' => 'Automatische Belichtung',
+'exif-exposuremode-1' => 'Manuelle Belichtung',
+'exif-exposuremode-2' => 'Belichtungsreihe',
+
+'exif-whitebalance-0' => 'Automatisch',
+'exif-whitebalance-1' => 'Manuell',
+
+'exif-scenecapturetype-0' => 'Standard',
+'exif-scenecapturetype-1' => 'Landschaft',
+'exif-scenecapturetype-2' => 'Portrait',
+'exif-scenecapturetype-3' => 'Nachtszene',
+
+'exif-gaincontrol-0' => 'Keine',
+'exif-gaincontrol-1' => 'Gering',
+'exif-gaincontrol-2' => 'High gain up',
+'exif-gaincontrol-3' => 'Low gain down',
+'exif-gaincontrol-4' => 'High gain down',
+
+'exif-contrast-0' => 'Normal',
+'exif-contrast-1' => 'Schwach',
+'exif-contrast-2' => 'Stark',
+
+'exif-saturation-0' => 'Normal',
+'exif-saturation-1' => 'Gering',
+'exif-saturation-2' => 'Hoch',
+
+'exif-sharpness-0' => 'Normal',
+'exif-sharpness-1' => 'Gering',
+'exif-sharpness-2' => 'Stark',
+
+'exif-subjectdistancerange-0' => 'Unbekannt',
+'exif-subjectdistancerange-1' => 'Makro',
+'exif-subjectdistancerange-2' => 'Nah',
+'exif-subjectdistancerange-3' => 'Entfernt',
+
+# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'nördl. Breite',
+'exif-gpslatitude-s' => 'südl. Breite',
+
+# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'östl. Länge',
+'exif-gpslongitude-w' => 'westl. Länge',
+
+'exif-gpsstatus-a' => 'Messung läuft',
+
+'exif-gpsmeasuremode-2' => '2-dimensionale Messung',
+'exif-gpsmeasuremode-3' => '3-dimensionale Messung',
+
+# Pseudotags used for GPSSpeedRef and GPSDestDistanceRef
+'exif-gpsspeed-k' => 'km/h',
+'exif-gpsspeed-m' => 'mph',
+'exif-gpsspeed-n' => 'Knoten',
+
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'Tatsächliche Richtung',
+'exif-gpsdirection-m' => 'Magnetische Richtung',
+
+# External editor support
+'edit-externally' => 'Diese Datei mit einem externen Programm bearbeiten',
+'edit-externally-help' => 'Siehe die [[meta:Help:External editors|Installationsanweisungen]] für weitere Informationen',
# 'all' in various places, this might be different for inflected languages
-'recentchangesall' => 'alle',
-'imagelistall' => 'alle',
-'watchlistall1' => 'alle',
-'watchlistall2' => 'alle',
-'namespacesall' => 'alle',
+'recentchangesall' => 'alle',
+'imagelistall' => 'alle',
+'watchlistall1' => 'alle',
+'watchlistall2' => 'alle',
+'namespacesall' => 'alle',
# E-mail address confirmation
-'confirmemail' => 'Bestätigung der E-Mail-Adresse (Authentifizierung)',
-'confirmemail_noemail' => 'Sie haben keine gültige E-Mail-Adresse in Ihrem [[Special:Preferences|Benutzerprofil]] angegeben.',
-'confirmemail_text' => 'Dieses Wiki erfordert, dass Sie Ihre E-Mail-Adresse bestätigen (authentifizieren), bevor Sie die erweiterten E-Mail-Funktionen benutzen können. Durch einen Klick auf die Schaltfläche unten wird eine E-Mail an Sie gesendet. Diese E-Mail enthält einen Link mit einem Bestätigungs-Code. Durch Klicken auf diesen Link wird bestätigt, dass Ihre E-Mail-Adresse gültig ist.',
-'confirmemail_send' => 'Anforderung einer E-Mail zur Adressenbestätigung',
-'confirmemail_sent' => 'Es wurde Ihnen eine E-Mail zur Adressenbestätigung gesendet.',
-'confirmemail_sendfailed' => 'Eine Bestätigung konnte auf Grund einer Fehlkonfiguration des Servers oder ungültigen Zeichen in der E-Mail-Adresse nicht verschickt werden.',
-'confirmemail_invalid' => 'Ungültiger Bestätigungs-Code. Die Gültigkeitsdauer des Codes ist eventuell abgelaufen.',
-'confirmemail_needlogin' => 'Sie müssen sich $1 um Ihre E-Mail-Adresse zu bestätigen.',
-'confirmemail_success' => 'Ihre E-Mail-Adresse wurde erfolgreich bestätigt. Sie können sich jetzt einloggen.',
-'confirmemail_loggedin' => 'Ihre E-Mail-Adresse wurde erfolgreich bestätigt.',
-'confirmemail_error' => 'Es gab einen Fehler bei der Bestätigung Ihrer E-Mail-Adresse.',
-
-'confirmemail_subject' => '[{{SITENAME}}] Bestätigung Ihrer E-Mail-Adresse',
-'confirmemail_body' => 'Hallo,
+'confirmemail' => 'E-Mail-Adresse bestätigen (Authentifizierung)',
+'confirmemail_noemail' => 'Sie haben keine gültige E-Mail-Adresse in Ihrem [[{{ns:special}}:Preferences|Benutzerprofil]] eingetragen.',
+'confirmemail_text' => 'Dieses Wiki erfordert, dass Sie Ihre E-Mail-Adresse bestätigen (authentifizieren), bevor Sie die erweiterten E-Mail-Funktionen benutzen können. Durch einen Klick auf die Schaltfläche unten wird eine E-Mail an Sie gesendet. Diese E-Mail enthält einen Link mit einem Bestätigungs-Code. Durch Klicken auf diesen Link wird bestätigt, dass Ihre E-Mail-Adresse gültig ist.',
+'confirmemail_pending' => '<div class="error">Es wurde Ihnen bereits ein Bestätigungs-Code per E-Mail zugeschickt. Wenn Sie Ihr Benutzerkonto erst vor kurzem erstellt haben, warten Sie bitte noch ein paar Minuten auf die E-Mail, bevor Sie einen neuen Code anfordern.</div>', 'confirmemail_send' => 'Bestätigungscode zuschicken',
+'confirmemail_sent' => 'Bestätigungs-E-Mail wurde verschickt.',
+'confirmemail_oncreate' => 'Ein Bestätigungs-Code wurde an Ihre E-Mail-Adresse gesandt. Dieser Code wird für die Anmeldung nicht benötigt, jedoch wird er zur Aktivierung der E-Mail-Funktionen innerhalb des Wikis gebraucht.',
+'confirmemail_sendfailed' => 'Die Bestätigungs-E-Mail konnte nicht versendet werden. Bitte prüfen Sie die E-Mail-Adresse auf ungültige Zeichen.
+
+Rückmeldung des Mailservers: $1',
+'confirmemail_invalid' => 'Ungültiger Bestätigungs-Code. Die Gültigkeitsdauer des Codes ist eventuell abgelaufen.',
+'confirmemail_needlogin' => 'Sie müssen sich $1 um Ihre E-Mail-Adresse zu bestätigen.',
+'confirmemail_success' => 'Ihre E-Mail-Adresse wurde erfolgreich bestätigt. Sie können sich jetzt einloggen.',
+'confirmemail_loggedin' => 'Ihre E-Mail-Adresse wurde erfolgreich bestätigt.',
+'confirmemail_error' => 'Es gab einen Fehler bei der Bestätigung Ihrer E-Mail-Adresse.',
+'confirmemail_subject' => '[{{SITENAME}}] - Bestätigung der E-Mail-Adresse',
+'confirmemail_body' => 'Hallo,
jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat eine Bestätigung dieser E-Mail-Adresse für das Benutzerkonto "$2" für {{SITENAME}} angefordert.
@@ -1841,132 +2102,85 @@ Wenn diese E-Mail-Adresse *nicht* zu dem genannten Benutzerkonto gehört, folgen
{{SITENAME}}: {{fullurl:{{Mediawiki:mainpage}}}}',
# Inputbox extension, may be useful in other contexts as well
-'tryexact' => 'Versuche exakte Suche:',
+'tryexact' => 'Versuche exakte Suche:',
'searchfulltext' => 'Gesamten Text durchsuchen',
-'createarticle' => 'Seite anlegen',
+'createarticle' => 'Seite anlegen',
# Scary transclusion
-'scarytranscludedisabled' => '[Interwiki Einbindung ist deaktiviert]',
-'scarytranscludefailed' => '[Vorlageneinbindung für $1 ist gescheitert]',
-'scarytranscludetoolong' => '[URL ist zu lang; Entschuldigung]',
+'scarytranscludedisabled' => '[Interwiki-Einbindung ist deaktiviert]',
+'scarytranscludefailed' => '[Vorlageneinbindung für $1 ist gescheitert]',
+'scarytranscludetoolong' => '[URL ist zu lang; Entschuldigung]',
# Trackbacks
-'trackbackbox' => '<div id="mw_trackbacks">
+'trackbackbox' => '<div id="mw_trackbacks">
Trackbacks für diese Seite:<br />
$1
</div>',
-'trackbackremove' => '([$1 löschen])',
-'trackbacklink' => 'Trackback',
+'trackbackremove' => '([$1 löschen])',
+'trackbacklink' => 'Trackback',
'trackbackdeleteok' => 'Trackback wurde erfolgreich gelöscht.',
-# delete conflict
-'deletedwhileediting' => 'Warnung. Diese Seite wurde gelöscht, nach dem Sie angefangen haben diese zu bearbeiten!',
-'confirmrecreate' => 'Benutzer [[{{ns:user}}:$1|$1]] ([[{{ns:user_talk}}:$1|Diskussion]]) hat diese Seite gelöscht, nachdem Sie angefangen haben ihn zu bearbeiten. Die Begründung lautete:
-\'\'$2\'\'
-Bitte bestätigen Sie, dass Sie diese Seite wirklich neu erstellen möchten.',
-'recreate' => 'Wiederherstellen',
-'tooltip-recreate' => 'Seite neu erstellen, obwohl sie gelöscht wurde.',
+# Delete conflict
+'deletedwhileediting' => '<span class="error">Achtung: Diese Seite wurde gelöscht, nachdem Sie angefangen haben, sie zu bearbeiten!
+Sehen Sie im [{{fullurl:{{ns:special}}:Log|type=delete&page=}}{{FULLPAGENAMEE}} Lösch-Logbuch] nach,
+warum die Seite gelöscht wurde. Wenn Sie die Seite speichern, wird sie neu angelegt.</span>
+',
+'confirmrecreate' => "Benutzer [[{{ns:user}}:$1|$1]] ([[{{ns:user_talk}}:$1|Diskussion]]) hat diese Seite gelöscht, nachdem Sie angefangen haben ihn zu bearbeiten. Die Begründung lautete:
+''$2''
+Bitte bestätigen Sie, dass Sie diese Seite wirklich neu erstellen möchten.",
+'recreate' => 'Wiederherstellen',
+'tooltip-recreate' => 'Seite neu erstellen, obwohl sie gelöscht wurde.',
'unit-pixel' => 'px',
-'searchcontaining' => "Suche nach Seiten, in denen ''$1'' vorkommt.",
-'searchnamed' => "Suche nach Seiten, deren Name ''$1'' enthält.",
-'articletitles' => "Seiten, die mit ''$1'' beginnen",
-'hideresults' => 'Verbergen',
-
-# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* tooltips and access keys */
-var ta = new Object();
-ta[\'pt-userpage\'] = new Array(\'.\',\'Eigene Benutzerseite\');
-ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Benutzerseite der IP-Adresse von der aus Sie Änderungen durchführen\');
-ta[\'pt-mytalk\'] = new Array(\'n\',\'Eigene Diskussionsseite\');
-ta[\'pt-anontalk\'] = new Array(\'n\',\'Diskussion über Änderungen von dieser IP-Adresse\');
-ta[\'pt-preferences\'] = new Array(\'\',\'Eigene Einstellungen\');
-ta[\'pt-watchlist\'] = new Array(\'l\',\'Liste der beobachteten Seiten\');
-ta[\'pt-mycontris\'] = new Array(\'y\',\'Liste eigener Beiträge\');
-ta[\'pt-login\'] = new Array(\'o\',\'Sich einzuloggen wird zwar gerne gesehen, ist aber keine Pflicht.\');
-ta[\'pt-anonlogin\'] = new Array(\'o\',\'Sich einzuloggen wird zwar gerne gesehen, ist aber keine Pflicht.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Abmelden\');
-ta[\'ca-talk\'] = new Array(\'t\',\'Diskussion zum Seiteninhalt\');
-ta[\'ca-edit\'] = new Array(\'e\',\'Seite bearbeiten. Bitte benutzen Sie vor dem Speichern die Vorschaufunktion.\');
-ta[\'ca-addsection\'] = new Array(\'+\',\'Einen Kommentar zu dieser Diskussion hinzufügen.\');
-ta[\'ca-viewsource\'] = new Array(\'e\',\'Diese Seite ist geschützt. Sie können sich den Quelltext ansehen.\');
-ta[\'ca-history\'] = new Array(\'h\',\'Frühere Versionen dieser Seite\');
-ta[\'ca-protect\'] = new Array(\'=\',\'Diese Seite schützen\');
-ta[\'ca-delete\'] = new Array(\'d\',\'Diese Seite löschen\');
-ta[\'ca-undelete\'] = new Array(\'d\',\'Einträge wiederherstellen, bevor diese Seite gelöscht wurde\');
-ta[\'ca-move\'] = new Array(\'m\',\'Diese Seite verschieben\');
-ta[\'ca-watch\'] = new Array(\'w\',\'Diese Seite zu Ihrer Beobachtungsliste hinzufügen\');
-ta[\'ca-unwatch\'] = new Array(\'w\',\'Diese Seite von Ihrer Beobachtungsliste entfernen\');
-ta[\'search\'] = new Array(\'f\',\'Dieses Wiki durchsuchen\');
-ta[\'p-logo\'] = new Array(\'\',\'Hauptseite\');
-ta[\'n-mainpage\'] = new Array(\'z\',\'Hauptseite anzeigen\');
-ta[\'n-portal\'] = new Array(\'\',\'Über das Portal, was Sie tun können, wo was zu finden ist\');
-ta[\'n-currentevents\'] = new Array(\'\',\'Hintergrundinformationen zu aktuellen Ereignissen\');
-ta[\'n-recentchanges\'] = new Array(\'r\',\'Liste der letzten Änderungen in diesem Wiki.\');
-ta[\'n-randompage\'] = new Array(\'x\',\'Zufällige Seite\');
-ta[\'n-help\'] = new Array(\'\',\'Hilfeseite anzeigen\');
-ta[\'n-sitesupport\'] = new Array(\'\',\'Unterstützen Sie uns\');
-ta[\'t-whatlinkshere\'] = new Array(\'j\',\'Liste aller Seiten, die hierher zeigen\');
-ta[\'t-recentchangeslinked\'] = new Array(\'k\',\'Letzte Änderungen an Seiten, die von hier verlinkt sind\');
-ta[\'feed-rss\'] = new Array(\'\',\'RSS-Feed für diese Seite\');
-ta[\'feed-atom\'] = new Array(\'\',\'Atom-Feed für diese Seite\');
-ta[\'t-contributions\'] = new Array(\'\',\'Liste der Beiträge von diesem Benutzer ansehen\');
-ta[\'t-emailuser\'] = new Array(\'\',\'Eine E-Mail an diesen Benutzer senden\');
-ta[\'t-upload\'] = new Array(\'u\',\'Dateien hochladen\');
-ta[\'t-specialpages\'] = new Array(\'q\',\'Liste aller Spezialseiten\');
-ta[\'ca-nstab-main\'] = new Array(\'c\',\'Seiteninhalt anzeigen\');
-ta[\'ca-nstab-user\'] = new Array(\'c\',\'Benutzerseite anzeigen\');
-ta[\'ca-nstab-media\'] = new Array(\'c\',\'Mediendateienseite anzeigen\');
-ta[\'ca-nstab-special\'] = new Array(\'\',\'Dies ist eine Spezialseite. Sie können diese nicht ändern.\');
-ta[\'ca-nstab-project\'] = new Array(\'a\',\'Portalseite anzeigen\');
-ta[\'ca-nstab-image\'] = new Array(\'c\',\'Bilderseite anzeigen\');
-ta[\'ca-nstab-mediawiki\'] = new Array(\'c\',\'MediaWiki-Systemtext anzeigen\');
-ta[\'ca-nstab-template\'] = new Array(\'c\',\'Vorlage anzeigen\');
-ta[\'ca-nstab-help\'] = new Array(\'c\',\'Hilfeseite anzeigen\');
-ta[\'ca-nstab-category\'] = new Array(\'c\',\'Kategorieseite anzeigen\');',
-
-# image deletion
-'deletedrevision' => 'Alte Version $1 gelöscht.',
-
-# browsing diffs
-'previousdiff' => '↠Zum vorherigen Versionsunterschied',
-'nextdiff' => 'Zum nächsten Versionsunterschied →',
-
# HTML dump
'redirectingto' => 'Weitergeleitet nach [[$1]]',
# action=purge
-'confirm_purge' => "Den Cache dieser Seite leeren? $1",
+'confirm_purge' => 'Den Cache dieser Seite leeren? $1',
'confirm_purge_button' => 'OK',
-'newtalkseperator' => ',_',
-'youhavenewmessagesmulti' => "Sie haben neue Nachrichten: $1",
+'youhavenewmessagesmulti' => 'Sie haben neue Nachrichten: $1',
+
+'searchcontaining' => "Suche nach Seiten, in denen ''$1'' vorkommt.",
+'searchnamed' => "Suche nach Seiten, deren Name ''$1'' enthält.",
+'articletitles' => "Seiten, die mit ''$1'' beginnen",
+'hideresults' => 'Verbergen',
# DISPLAYTITLE
'displaytitle' => '(Link zu dieser Seite als [[$1]])',
-'loginlanguagelabel' => 'Sprache: $1',
-
+'loginlanguagelabel' => 'Sprache: $1',
# Multipage image navigation
'imgmultipageprev' => '↠vorige Seite',
'imgmultipagenext' => 'nächste Seite →',
-'imgmultigo' => 'OK',
-'imgmultigotopre' => 'Gehe zu Seite',
+'imgmultigo' => 'OK',
+'imgmultigotopre' => 'Gehe zu Seite',
# Table pager
-'ascending_abbrev' => 'auf',
-'descending_abbrev' => 'ab',
-'table_pager_next' => 'Nächste Seite',
-'table_pager_prev' => 'Vorherige Seite',
-'table_pager_first' => 'Erste Seite',
-'table_pager_last' => 'Letzte Seite',
-'table_pager_limit' => 'Zeige $1 Einträge pro Seite',
-'table_pager_limit_submit' => 'Los',
-'table_pager_empty' => 'Keine Ergebnisse',
+'ascending_abbrev' => 'auf',
+'descending_abbrev' => 'ab',
+'table_pager_next' => 'Nächste Seite',
+'table_pager_prev' => 'Vorherige Seite',
+'table_pager_first' => 'Erste Seite',
+'table_pager_last' => 'Letzte Seite',
+'table_pager_limit' => 'Zeige $1 Einträge pro Seite',
+'table_pager_limit_submit' => 'Los',
+'table_pager_empty' => 'Keine Ergebnisse',
+
+# Auto-summaries
+'autosumm-blank' => 'Die Seite wurde geleert.',
+'autosumm-replace' => "Der Seiteninhalt wurde durch einen anderen Text ersetzt: '$1'",
+'autoredircomment' => 'Weiterleitung nach [[$1]] erstellt', # This should be changed to the new naming convention, but existed beforehand
+'autosumm-new' => 'Die Seite wurde neu angelegt: $1',
+
+# Size units
+'size-bytes' => '$1 B',
+'size-kilobytes' => '$1 KB',
+'size-megabytes' => '$1 MB',
+'size-gigabytes' => '$1 GB',
);
-
?>
diff --git a/languages/messages/MessagesEl.php b/languages/messages/MessagesEl.php
index 88f52117..170fa699 100644
--- a/languages/messages/MessagesEl.php
+++ b/languages/messages/MessagesEl.php
@@ -129,6 +129,7 @@ $messages = array(
# Bits of text used by many pages:
#----------------------------------------------------#
'categories' => 'ΚατηγοÏίες',
+'pagecategories' => 'ΚατηγοÏίες',
'category_header' => 'ΆÏθÏα στην κατηγοÏία "$1"',
'subcategories' => 'ΥποκατηγοÏίες',
@@ -981,7 +982,7 @@ Tο σÏστημα ειδοποίησης του {{SITENAME}}
'rollbackfailed' => 'Η επαναφοÏά απέτυχε.',
'cantrollback' => 'Δεν είναι δυνατή η αναίÏεση αυτής της αλλαγής, Ï€Ïόκειται για την αÏχική ενέÏγεια δημιουÏγίας της σελίδας.',
-'alreadyrolled' => 'ΑδÏνατον να αναιÏεθεί η τελευταία αλλαγή της σελίδας [[$1]]
+'alreadyrolled' => 'ΑδÏνατον να αναιÏεθεί η τελευταία αλλαγή της σελίδας [[:$1]]
από το χÏήστη [[User:$2|$2]] ([[User talk:$2|Συζήτηση]]), κάποιος έχει ήδη αναιÏέσει την αλλαγή ή έχει αλλάξει εκ νέου τη σελίδα.
Τελευταία αλλαγή από το χÏήστη [[User:$3|$3]] ([[User talk:$3|Συζήτηση]]).',
@@ -1246,7 +1247,7 @@ Tο σÏστημα ειδοποίησης του {{SITENAME}}
'accesskey-minoredit' => 'i',
'accesskey-save' => 's',
'accesskey-preview' => 'p',
-'accesskey-diff' => 'd',
+'accesskey-diff' => 'v',
'accesskey-compareselectedversions' => 'v',
@@ -1256,15 +1257,15 @@ Tο σÏστημα ειδοποίησης του {{SITENAME}}
'tooltip-minoredit' => 'ΧαÏακτηÏήστε τις αλλαγές "μικÏής κλίμακας" [alt-i]',
'tooltip-save' => 'Αποθήκευση αλλαγών [alt-s]',
'tooltip-preview' => 'ΠÏοεπισκόπηση - ΠαÏακαλοÏμε να χÏησιμοποιήτε αυτή την επιλογή Ï€Ïιν αποθηκεÏσετε τις αλλαγές σας! [alt-p]',
-'tooltip-diff' => 'ΠÏοβολή των αλλαγών που κάνατε στο κείμενο. [alt-d]',
+'tooltip-diff' => 'ΠÏοβολή των αλλαγών που κάνατε στο κείμενο. [alt-v]',
'tooltip-compareselectedversions' => 'Εμφάνιση των διαφοÏών ανάμεσα στις δÏο αναθεωÏήσεις της σελίδας που έχετε επιλέξει. [alt-v]',
'tooltip-watch' => 'ΠÏοσθήκη της σελίδας στη λίστα παÏακολοÏθησης [alt-w]',
# stylesheets
#-------------------#
-'Monobook.css' => '/* edit this file to customize the monobook skin for the entire site */',
-#'Monobook.js' => '/* edit this file to change js things in the monobook skin */',
+'monobook.css' => '/* edit this file to customize the monobook skin for the entire site */',
+#'monobook.js' => '/* edit this file to change js things in the monobook skin */',
# Metadata
@@ -1331,7 +1332,7 @@ Tο σÏστημα ειδοποίησης του {{SITENAME}}
# Monobook.js: tooltips and access keys for monobook
#------------------------------------------------------------------------------------#
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Η Ï€Ïοσωπική μου σελίδα στο Wiκi\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Η σελίδα χÏήστη στον οποίο αντιστοιχεί η διεÏθυνση IP που έχετε\');
@@ -1342,7 +1343,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Η λίστα με τις σελίδεÏ
ta[\'pt-mycontris\'] = new Array(\'y\',\'Κατάλογος των συνεισφοÏών μου\');
ta[\'pt-login\'] = new Array(\'o\',\'Σας Ï€Ïοτείνουμε να συνδεθείτε παÏόλο που δεν είναι αναγκαίο.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Σας Ï€Ïοτείνουμε να συνδεθείτε παÏόλο που δεν είναι αναγκαίο.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'ΑποσÏνδεση\');
+ta[\'pt-logout\'] = new Array(\'\',\'ΑποσÏνδεση\');
ta[\'ca-talk\'] = new Array(\'t\',\'Συζήτηση για το παÏόν άÏθÏο\');
ta[\'ca-edit\'] = new Array(\'e\',\'ΜποÏείτε να επεξεÏγαστείτε αυτό το άÏθÏο. ΧÏησιμοποιείστε την "ΠÏοεπισκόπηση" Ï€Ïιν αποθηκεÏσετε.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'ΠÏοσθέστε σχόλιο στη συζήτηση.\');
diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php
index f6d455e1..209d9217 100644
--- a/languages/messages/MessagesEn.php
+++ b/languages/messages/MessagesEn.php
@@ -1,12 +1,28 @@
<?php
/**
* This is the default English localisation file
+ *
+ * END USERS: DO NOT EDIT THIS FILE DIRECTLY!
+ *
+ * REPEAT!
+ *
+ * DO NOT EDIT THIS FILE DIRECTLY!
+ * NOTHING WILL HAPPEN WHEN YOU DO THAT!
+ *
+ * You can make your customizations on the wiki.
+ * While logged in as a sysop user, go to [[Special:Allmessages]]
+ * and edit the MediaWiki:* pages listed there.
+ *
+ * DO NOT EDIT THIS FILE DIRECTLY OR YOU WILL JUST BE CONFUSED!
*/
/**
* Fallback language, used for all unspecified messages and behaviour. This
* is English by default, for all files other than this one.
+ *
+ * Do NOT set this to false in any other message file! Leave the line out to
+ * accept the default fallback to "en".
*/
$fallback = false;
@@ -144,8 +160,18 @@ $datePreferences = array(
'ISO 8601',
);
+/**
+ * The date format to use for generated dates in the user interface.
+ * This may be one of the above date preferences, or the special value
+ * "dmy or mdy", which uses mdy if $wgAmericanDates is true, and dmy
+ * if $wgAmericanDates is false.
+ */
$defaultDateFormat = 'dmy or mdy';
+/**
+ * Associative array mapping old numeric date formats, which may still be
+ * stored in user preferences, to the new string formats.
+ */
$datePreferenceMigrationMap = array(
'default',
'mdy',
@@ -179,6 +205,9 @@ $dateFormats = array(
'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
);
+/**
+ * Default list of book sources
+ */
$bookstoreList = array(
'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
'PriceSCAN' => 'http://www.pricescan.com/books/bookDetail.asp?isbn=$1',
@@ -186,10 +215,16 @@ $bookstoreList = array(
'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
);
-# Note to translators:
-# Please include the English words as synonyms. This allows people
-# from other wikis to contribute more easily.
-#
+/**
+ * Magic words
+ * Customisable syntax for wikitext and elsewhere
+ *
+ * Note to translators:
+ * Please include the English words as synonyms. This allows people
+ * from other wikis to contribute more easily.
+ *
+ * This array can be modified at runtime with the LanguageGetMagic hook
+ */
$magicWords = array(
# ID CASE SYNONYMS
'redirect' => array( 0, '#REDIRECT' ),
@@ -288,7 +323,7 @@ $magicWords = array(
'newsectionlink' => array( 1, '__NEWSECTIONLINK__' ),
'currentversion' => array( 1, 'CURRENTVERSION' ),
'urlencode' => array( 0, 'URLENCODE:' ),
- 'anchorencode' => array( 0, 'ANCHORENCODE' ),
+ 'anchorencode' => array( 0, 'ANCHORENCODE' ),
'currenttimestamp' => array( 1, 'CURRENTTIMESTAMP' ),
'localtimestamp' => array( 1, 'LOCALTIMESTAMP' ),
'directionmark' => array( 1, 'DIRECTIONMARK', 'DIRMARK' ),
@@ -299,9 +334,93 @@ $magicWords = array(
'formatnum' => array( 0, 'FORMATNUM' ),
'padleft' => array( 0, 'PADLEFT' ),
'padright' => array( 0, 'PADRIGHT' ),
+ 'special' => array( 0, 'special', ),
+ 'defaultsort' => array( 1, 'DEFAULTSORT:' ),
+);
+/**
+ * Alternate names of special pages. All names are case-insensitive. The first
+ * listed alias will be used as the default. Aliases from the fallback
+ * localisation (usually English) will be included by default.
+ *
+ * This array may be altered at runtime using the LangugeGetSpecialPageAliases
+ * hook.
+ */
+$specialPageAliases = array(
+ 'DoubleRedirects' => array( 'DoubleRedirects' ),
+ 'BrokenRedirects' => array( 'BrokenRedirects' ),
+ 'Disambiguations' => array( 'Disambiguations' ),
+ 'Userlogin' => array( 'Userlogin' ),
+ 'Userlogout' => array( 'Userlogout' ),
+ 'Preferences' => array( 'Preferences' ),
+ 'Watchlist' => array( 'Watchlist' ),
+ 'Recentchanges' => array( 'Recentchanges' ),
+ 'Upload' => array( 'Upload' ),
+ 'Imagelist' => array( 'Imagelist' ),
+ 'Newimages' => array( 'Newimages' ),
+ 'Listusers' => array( 'Listusers', 'Userlist' ),
+ 'Statistics' => array( 'Statistics' ),
+ 'Randompage' => array( 'Random', 'Randompage' ),
+ 'Lonelypages' => array( 'Lonelypages' ),
+ 'Uncategorizedpages' => array( 'Uncategorizedpages' ),
+ 'Uncategorizedcategories' => array( 'Uncategorizedcategories' ),
+ 'Uncategorizedimages' => array( 'Uncategorizedimages' ),
+ 'Unusedcategories' => array( 'Unusedcategories' ),
+ 'Unusedimages' => array( 'Unusedimages' ),
+ 'Wantedpages' => array( 'Wantedpages' ),
+ 'Wantedcategories' => array( 'Wantedcategories' ),
+ 'Mostlinked' => array( 'Mostlinked' ),
+ 'Mostlinkedcategories' => array( 'Mostlinkedcategories' ),
+ 'Mostcategories' => array( 'Mostcategories' ),
+ 'Mostimages' => array( 'Mostimages' ),
+ 'Mostrevisions' => array( 'Mostrevisions' ),
+ 'Shortpages' => array( 'Shortpages' ),
+ 'Longpages' => array( 'Longpages' ),
+ 'Newpages' => array( 'Newpages' ),
+ 'Ancientpages' => array( 'Ancientpages' ),
+ 'Deadendpages' => array( 'Deadendpages' ),
+ 'Allpages' => array( 'Allpages' ),
+ 'Prefixindex' => array( 'Prefixindex' ) ,
+ 'Ipblocklist' => array( 'Ipblocklist' ),
+ 'Specialpages' => array( 'Specialpages' ),
+ 'Contributions' => array( 'Contributions' ),
+ 'Emailuser' => array( 'Emailuser' ),
+ 'Whatlinkshere' => array( 'Whatlinkshere' ),
+ 'Recentchangeslinked' => array( 'Recentchangeslinked' ),
+ 'Movepage' => array( 'Movepage' ),
+ 'Blockme' => array( 'Blockme' ),
+ 'Booksources' => array( 'Booksources' ),
+ 'Categories' => array( 'Categories' ),
+ 'Export' => array( 'Export' ),
+ 'Version' => array( 'Version' ),
+ 'Allmessages' => array( 'Allmessages' ),
+ 'Log' => array( 'Log', 'Logs' ),
+ 'Blockip' => array( 'Blockip' ),
+ 'Undelete' => array( 'Undelete' ),
+ 'Import' => array( 'Import' ),
+ 'Lockdb' => array( 'Lockdb' ),
+ 'Unlockdb' => array( 'Unlockdb' ),
+ 'Userrights' => array( 'Userrights' ),
+ 'MIMEsearch' => array( 'MIMEsearch' ),
+ 'Unwatchedpages' => array( 'Unwatchedpages' ),
+ 'Listredirects' => array( 'Listredirects' ),
+ 'Listinterwikis' => array( 'Listinterwikis' ),
+ 'Revisiondelete' => array( 'Revisiondelete' ),
+ 'Unusedtemplates' => array( 'Unusedtemplates' ),
+ 'Randomredirect' => array( 'Randomredirect' ),
+ 'Mypage' => array( 'Mypage' ),
+ 'Mytalk' => array( 'Mytalk' ),
+ 'Mycontributions' => array( 'Mycontributions' ),
+ 'Listadmins' => array( 'Listadmins' ),
+ 'Popularpages' => array( 'Popularpages' ),
+ 'Search' => array( 'Search' ),
+ 'Resetpass' => array( 'Resetpass' ),
);
+/**
+ * Regular expression matching the "link trail", e.g. "ed" in [[Toast]]ed, as
+ * the first group, and the remainder of the string as the second group.
+ */
$linkTrail = '/^([a-z]+)(.*)$/sD';
#-------------------------------------------------------------------
@@ -351,6 +470,8 @@ parent class in order maintain consistency across languages.
'tog-editwidth' => 'Edit box has full width',
'tog-watchcreations' => 'Add pages I create to my watchlist',
'tog-watchdefault' => 'Add pages I edit to my watchlist',
+'tog-watchmoves' => 'Add pages I move to my watchlist',
+'tog-watchdeletion' => 'Add pages I delete to my watchlist',
'tog-minordefault' => 'Mark all edits minor by default',
'tog-previewontop' => 'Show preview before edit box',
'tog-previewonfirst' => 'Show preview on first edit',
@@ -365,10 +486,12 @@ parent class in order maintain consistency across languages.
'tog-externaldiff' => 'Use external diff by default',
'tog-showjumplinks' => 'Enable "jump to" accessibility links',
'tog-uselivepreview' => 'Use live preview (JavaScript) (Experimental)',
-'tog-autopatrol' => 'Mark edits I make as patrolled',
'tog-forceeditsummary' => 'Prompt me when entering a blank edit summary',
'tog-watchlisthideown' => 'Hide my edits from the watchlist',
'tog-watchlisthidebots' => 'Hide bot edits from the watchlist',
+'tog-watchlisthideminor' => 'Hide minor edits from the watchlist',
+'tog-nolangconversion' => 'Disable variants conversion',
+'tog-ccmeonemails' => 'Send me copies of emails I send to other users',
'underline-always' => 'Always',
'underline-never' => 'Never',
@@ -429,9 +552,12 @@ parent class in order maintain consistency across languages.
'dec' => 'Dec',
# Bits of text used by many pages:
#
-'categories' => '{{PLURAL:$1|Category|Categories}}',
+'categories' => 'Categories',
+'pagecategories' => '{{PLURAL:$1|Category|Categories}}',
+'pagecategorieslink' => 'Special:Categories',
'category_header' => 'Articles in category "$1"',
'subcategories' => 'Subcategories',
+'category-media-header' => 'Media in category "$1"',
'linkprefix' => '/^(.*?)([a-zA-Z\x80-\xff]+)$/sD',
@@ -530,7 +656,6 @@ parent class in order maintain consistency across languages.
'viewtalkpage' => 'View discussion',
'otherlanguages' => 'In other languages',
'redirectedfrom' => '(Redirected from $1)',
-'autoredircomment' => 'Redirecting to [[$1]]',
'redirectpagesub' => 'Redirect page',
'lastmodifiedat' => 'This page was last modified $2, $1.', //$1 date, $2 time
'viewcount' => 'This page has been accessed {{plural:$1|one time|$1 times}}.',
@@ -557,7 +682,7 @@ parent class in order maintain consistency across languages.
'retrievedfrom' => 'Retrieved from "$1"',
'youhavenewmessages' => 'You have $1 ($2).',
'newmessageslink' => 'new messages',
-'newmessagesdifflink' => 'diff to penultimate revision',
+'newmessagesdifflink' => 'last change',
'editsection'=>'edit',
'editold'=>'edit',
'editsectionhint' => 'Edit section: $1',
@@ -569,6 +694,8 @@ parent class in order maintain consistency across languages.
'restorelink' => '{{PLURAL:$1|one deleted edit|$1 deleted edits}}',
'feedlinks' => 'Feed:',
'feed-invalid' => 'Invalid subscription feed type.',
+'feed-atom' => 'Atom',
+'feed-rss' => 'RSS',
'sitenotice' => '-', # the equivalent to wgSiteNotice
'anonnotice' => '-',
@@ -636,19 +763,19 @@ Please report this to an administrator, making note of the URL.',
'badarticleerror' => 'This action cannot be performed on this page.',
'cannotdelete' => 'Could not delete the page or file specified. (It may have already been deleted by someone else.)',
'badtitle' => 'Bad title',
-'badtitletext' => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title. It may contain one more characters which cannot be used in titles.',
+'badtitletext' => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title. It may contain one or more characters which cannot be used in titles.',
'perfdisabled' => 'Sorry! This feature has been temporarily disabled because it slows the database down to the point that no one can use the wiki.',
'perfdisabledsub' => 'Here is a saved copy from $1:', # obsolete?
'perfcached' => 'The following data is cached and may not be up to date.',
'perfcachedts' => 'The following data is cached, and was last updated $1.',
+'querypage-no-updates' => 'Updates for this page are currently disabled. Data here will not presently be refreshed.',
'wrong_wfQuery_params' => 'Incorrect parameters to wfQuery()<br />
Function: $1<br />
Query: $2',
'viewsource' => 'View source',
'viewsourcefor' => 'for $1',
-'protectedtext' => 'This page has been locked to prevent editing.
-
-You can view and copy the source of this page:',
+'protectedpagetext' => 'This page has been locked to prevent editing.',
+'viewsourcetext' => 'You can view and copy the source of this page:',
'protectedinterface' => 'This page provides interface text for the software, and is locked to prevent abuse.',
'editinginterface' => "'''Warning:''' You are editing a page which is used to provide interface text for the software. Changes to this page will affect the appearance of the user interface for other users.",
'sqlhidden' => '(SQL query hidden)',
@@ -727,9 +854,14 @@ your old password.',
'passwordsent' => 'A new password has been sent to the e-mail address
registered for "$1".
Please log in again after you receive it.',
+'blocked-mailpassword' => 'Your IP address is blocked from editing, and so
+is not allowed to use the password recovery function to prevent abuse.',
'eauthentsent' => 'A confirmation e-mail has been sent to the nominated e-mail address.
Before any other mail is sent to the account, you will have to follow the instructions in the e-mail,
to confirm that the account is actually yours.',
+'throttled-mailpassword' => 'A password reminder has already been sent, within the
+last $1 hours. To prevent abuse, only one password reminder will be sent per
+$1 hours.',
'loginend' => '',
'signupend' => '{{int:loginend}}',
'mailerror' => 'Error sending mail: $1',
@@ -744,6 +876,18 @@ format. Please enter a well-formatted address or empty that field.',
'accountcreated' => 'Account created',
'accountcreatedtext' => 'The user account for $1 has been created.',
+# Password reset dialog
+'resetpass' => 'Reset account password',
+'resetpass_announce' => 'You logged in with a temporary e-mailed code. To finish logging in, you must set a new password here:',
+'resetpass_text' => "<!-- Add text here -->",
+'resetpass_header' => 'Reset password',
+'resetpass_submit' => 'Set password and log in',
+'resetpass_success' => 'Your password has been changed successfully! Now logging you in...',
+'resetpass_bad_temporary' => 'Invalid temporary password. You may have already successfully changed your password or requested a new temporary password.',
+'resetpass_forbidden' => 'Passwords cannot be changed on this wiki',
+'resetpass_missing' => 'No form data.',
+
+
# Edit page toolbar
'bold_sample'=>'Bold text',
'bold_tip'=>'Bold text',
@@ -780,6 +924,9 @@ format. Please enter a well-formatted address or empty that field.',
'anoneditwarning' => "'''Warning:''' You are not logged in. Your IP address will be recorded in this page's edit history.",
'missingsummary' => "'''Reminder:''' You have not provided an edit summary. If you click Save again, your edit will be saved without one.",
'missingcommenttext' => 'Please enter a comment below.',
+'missingcommentheader' => "'''Reminder:''' You have not provided a subject/headline for this comment. If you click Save again, your edit will be saved without one.",
+'summary-preview' => 'Summary preview',
+'subject-preview' => 'Subject/headline preview',
'blockedtitle' => 'User is blocked',
'blockedtext' => "<big>'''Your user name or IP address has been blocked.'''</big>
@@ -787,7 +934,7 @@ The block was made by $1. The reason given is ''$2''.
You can contact $1 or another [[{{ns:project}}:Administrators|administrator]] to discuss the block.
You cannot use the 'email this user' feature unless a valid email address is specified in your
-[[Special:Preferences|account preferences]]. Your current IP address is $3. Please include this in any queries.",
+[[Special:Preferences|account preferences]]. Your current IP address is $3, and the block ID is #$5. Please include either or both of these in any queries.",
'blockedoriginalsource' => "The source of '''$1''' is shown below:",
'blockededitsource' => "The text of '''your edits''' to '''$1''' is shown below:",
'whitelistedittitle' => 'Login required to edit',
@@ -867,10 +1014,21 @@ the text into a text file and save it for later.</strong>',
'protectedpagewarning' => "<strong>WARNING: This page has been locked so that only users with sysop privileges can edit it.</strong>",
'semiprotectedpagewarning' => "'''Note:''' This page has been locked so that only registered users can edit it.",
'templatesused' => 'Templates used on this page:',
+'templatesusedpreview' => 'Templates used in this preview:',
+'templatesusedsection' => 'Templates used in this section:',
+'template-protected' => '(protected)',
+'template-semiprotected' => '(semi-protected)',
'edittools' => '<!-- Text here will be shown below edit and upload forms. -->',
'nocreatetitle' => 'Page creation limited',
'nocreatetext' => 'This site has restricted the ability to create new pages.
You can go back and edit an existing page, or [[Special:Userlogin|log in or create an account]].',
+
+# "Undo" feature
+'undo-success' => 'The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.',
+'undo-failure' => 'The edit could not be undone due to conflicting intermediate edits.',
+'undo-summary' => 'Undo revision $1 by [[Special:Contributions/$2]] ([[User talk:$2]])',
+
+# Account creation failure
'cantcreateaccounttitle' => 'Can\'t create account',
'cantcreateaccounttext' => 'Account creation from this IP address (<b>$1</b>) has been blocked.
This is probably due to persistent vandalism from your school or Internet service
@@ -887,7 +1045,8 @@ Please check the URL you used to access this page.",
'loadhist' => 'Loading page history',
'currentrev' => 'Current revision',
'revisionasof' => 'Revision as of $1',
-'old-revision-navigation' => 'Revision as of $1; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'Revision as of $1 by $2',
+'revision-nav' => '($1) $2 | $3 ($4) | $5 ($6)',
'previousrevision' => 'â†Older revision',
'nextrevision' => 'Newer revision→',
'currentrevisionlink' => 'Current revision',
@@ -916,6 +1075,7 @@ there may be details in the [{{fullurl:Special:Log/delete|page={{PAGENAMEE}}}} d
#'rev-delundel' => 'del/undel',
'rev-delundel' => 'show/hide',
+
'history-feed-title' => 'Revision history',
'history-feed-description' => 'Revision history for this page on the wiki',
'history-feed-item-nocomment' => '$1 at $2', # user at time
@@ -949,11 +1109,13 @@ is placed by the site operators.",
#
'difference' => '(Difference between revisions)',
'loadingrev' => 'loading revision for diff',
-'lineno' => "Line $1:",
+'lineno' => "Line $1:",
'editcurrent' => 'Edit the current version of this page',
'selectnewerversionfordiff' => 'Select a newer version for comparison',
'selectolderversionfordiff' => 'Select an older version for comparison',
'compareselectedversions' => 'Compare selected versions',
+'editundo' => 'undo',
+'diff-multi' => "({{plural:$1|One intermediate revision|$1 intermediate revisions}} not shown.)",
# Search results
#
@@ -1093,6 +1255,7 @@ Unselected groups will not be changed. You can deselect a group with CTRL + Left
'recentchanges' => 'Recent changes',
'recentchanges-url' => 'Special:Recentchanges',
'recentchangestext' => 'Track the most recent changes to the wiki on this page.',
+'recentchanges-feed-description' => 'Track the most recent changes to the wiki in this feed.',
'rcnote' => "Below are the last <strong>$1</strong> changes in the last <strong>$2</strong> days, as of $3.",
'rcnotefrom' => "Below are the changes since <b>$2</b> (up to <b>$1</b> shown).",
'rclistfrom' => "Show new changes starting from $1",
@@ -1115,6 +1278,7 @@ Unselected groups will not be changed. You can deselect a group with CTRL + Left
'number_of_watching_users_pageview' => '[$1 watching user/s]',
'rc_categories' => 'Limit to categories (separate with "|")',
'rc_categories_any' => 'Any',
+'rc-change-size' => '$1',
# Upload
#
@@ -1150,7 +1314,7 @@ To include the image in a page, use a link in the form
'illegalfilename' => 'The filename "$1" contains characters that are not allowed in page titles. Please rename the file and try uploading it again.',
'badfilename' => 'File name has been changed to "$1".',
'badfiletype' => "\".$1\" is not a recommended image file format.",
-'largefile' => 'It is recommended that files do not exceed $1 bytes in size; this file is $2 bytes',
+'large-file' => 'It is recommended that files are no larger than $1; this file is $2.',
'largefileserver' => 'This file is bigger than the server is configured to allow.',
'emptyfile' => 'The file you uploaded seems to be empty. This might be due to a typo in the file name. Please check whether you really want to upload this file.',
'fileexists' => 'A file with this name exists already, please check $1 if you are not sure if you want to change it.',
@@ -1174,6 +1338,18 @@ created and by whom, and anything else you may know about it. If this is an imag
'watchthisupload' => 'Watch this page',
'filewasdeleted' => 'A file of this name has been previously uploaded and subsequently deleted. You should check the $1 before proceeding to upload it again.',
+'upload-proto-error' => 'Incorrect protocol',
+'upload-proto-error-text' => 'Remote upload requires URLs beginning with <code>http://</code> or <code>ftp://</code>.',
+'upload-file-error' => 'Internal error',
+'upload-file-error-text' => 'An internal error occurred when attempting to create a temporary file on the server. Please contact a system administrator.',
+'upload-misc-error' => 'Unknown upload error',
+'upload-misc-error-text' => 'An unknown error occurred during the upload. Please verify that the URL is valid and accessible and try again. If the problem persists, contact a system administrator.',
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => "Couldn't reach URL",
+'upload-curl-error6-text' => 'The URL provided could not be reached. Please double-check that the URL is correct and the site is up.',
+'upload-curl-error28' => 'Upload timeout',
+'upload-curl-error28-text' => 'The site took too long to respond. Please check the site is up, wait a short while and try again. You may want to try at a less busy time.',
+
'license' => 'Licensing',
'nolicense' => 'None selected',
'licenses' => '-', # Don't duplicate this in translations
@@ -1238,6 +1414,7 @@ this old version, (rev) = revert to this old version.
# Unused templates
'unusedtemplates' => 'Unused templates',
+'unusedtemplates-summary' => '',
'unusedtemplatestext' => 'This page lists all pages in the template namespace which are not included in another page. Remember to check for other links to the templates before deleting them.',
'unusedtemplateswlh' => 'other links',
@@ -1267,13 +1444,16 @@ The [http://meta.wikimedia.org/wiki/Help:Job_queue job queue] length is '''$7'''
'statistics-mostpopular' => 'Most viewed pages',
'disambiguations' => 'Disambiguation pages',
+'disambiguations-summary' => '',
'disambiguationspage' => 'Template:disambig',
'disambiguationstext' => "The following pages link to a <i>disambiguation page</i>. They should link to the appropriate topic instead.<br />A page is treated as disambiguation if it is linked from $1.<br />Links from other namespaces are <i>not</i> listed here.",
'doubleredirects' => 'Double redirects',
+'doubleredirects-summary' => '',
'doubleredirectstext' => "Each row contains links to the first and second redirect, as well as the first line of the second redirect text, usually giving the \"real\" target page, which the first redirect should point to.",
'brokenredirects' => 'Broken redirects',
+'brokenredirects-summary' => '',
'brokenredirectstext' => 'The following redirects link to non-existent pages:',
@@ -1287,6 +1467,7 @@ The [http://meta.wikimedia.org/wiki/Help:Job_queue job queue] length is '''$7'''
'nviews' => '$1 {{PLURAL:$1|view|views}}',
'lonelypages' => 'Orphaned pages',
+'lonelypages-summary' => '',
'lonelypagestext' => 'The following pages are not linked from other pages in this wiki.',
'uncategorizedpages' => 'Uncategorized pages',
'uncategorizedpages-summary' => '',
@@ -1323,6 +1504,7 @@ The [http://meta.wikimedia.org/wiki/Help:Job_queue job queue] length is '''$7'''
'longpages' => 'Long pages',
'longpages-summary' => '',
'deadendpages' => 'Dead-end pages',
+'deadendpages-summary' => '',
'deadendpagestext' => 'The following pages do not link to other pages in this wiki.',
'listusers' => 'User list',
'listusers-summary' => '',
@@ -1345,17 +1527,21 @@ a direct URL, and so may still be listed here despite being
in active use.</p>',
'unusedcategoriestext' => 'The following category pages exist although no other article or category make use of them.',
+# Book sources
'booksources' => 'Book sources',
'booksources-summary' => '',
+'booksources-search-legend' => 'Search for book sources',
+'booksources-isbn' => 'ISBN:',
+'booksources-go' => 'Go',
+'booksources-text' => 'Below is a list of links to other sites that sell new and used books, and may also have
+further information about books you are looking for:',
+
'categoriespagetext' => 'The following categories exist in the wiki.',
'data' => 'Data',
'userrights' => 'User rights management',
'userrights-summary' => '',
'groups' => 'User groups',
-'booksourcetext' => "Below is a list of links to other sites that
-sell new and used books, and may also have further information
-about books you are looking for.",
'isbn' => 'ISBN',
'rfcurl' => 'http://www.ietf.org/rfc/rfc$1.txt',
'pubmedurl' => 'http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=pubmed&dopt=Abstract&list_uids=$1',
@@ -1369,6 +1555,7 @@ You can narrow down the view by selecting a log type, the user name, or the affe
# Special:Allpages
'nextpage' => 'Next page ($1)',
+'prevpage' => 'Previous page ($1)',
'allpagesfrom' => 'Display pages starting at:',
'allarticles' => 'All articles',
'allinnamespace' => 'All pages ($1 namespace)',
@@ -1377,12 +1564,12 @@ You can narrow down the view by selecting a log type, the user name, or the affe
'allpagesnext' => 'Next',
'allpagessubmit' => 'Go',
'allpagesprefix' => 'Display pages with prefix:',
-'allpagesbadtitle' => 'The given page title was invalid or had an inter-language or inter-wiki prefix. It may contain one more characters which cannot be used in titles.',
+'allpagesbadtitle' => 'The given page title was invalid or had an inter-language or inter-wiki prefix. It may contain one or more characters which cannot be used in titles.',
# Special:Listusers
'listusersfrom' => 'Display users starting at:',
-# E this user
+# Email this user
#
'mailnologin' => 'No send address',
'mailnologintext' => "You must be [[Special:Userlogin|logged in]]
@@ -1405,6 +1592,8 @@ or has chosen not to receive e-mail from other users.',
'emailsubject' => 'Subject',
'emailmessage' => 'Message',
'emailsend' => 'Send',
+'emailccme' => 'E-mail me a copy of my message.',
+'emailccsubject'=> 'Copy of your message to $1: $2',
'emailsent' => 'E-mail sent',
'emailsenttext' => 'Your e-mail message has been sent.',
@@ -1453,9 +1642,16 @@ at the bottom of the screen (deleting a content page also deletes the accompanyi
'wlnote' => 'Below are the last $1 changes in the last <b>$2</b> hours.',
'wlshowlast' => 'Show last $1 hours $2 days $3',
'wlsaved' => 'This is a saved version of your watchlist.',
-'wlhideshowown' => '$1 my edits',
-'wlhideshowbots' => '$1 bot edits',
+'watchlist-show-bots' => 'Show bot edits',
+'watchlist-hide-bots' => 'Hide bot edits',
+'watchlist-show-own' => 'Show my edits',
+'watchlist-hide-own' => 'Hide my edits',
+'watchlist-show-minor' => 'Show minor edits',
+'watchlist-hide-minor' => 'Hide minor edits',
'wldone' => 'Done.',
+# Displayed when you click the "watch" button and it's in the process of watching
+'watching' => 'Watching...',
+'unwatching' => 'Unwatching...',
'enotif_mailer' => '{{SITENAME}} Notification Mailer',
'enotif_reset' => 'Mark all pages visited',
@@ -1518,7 +1714,7 @@ See $2 for a record of recent deletions.",
'rollbacklink' => 'rollback',
'rollbackfailed' => 'Rollback failed',
'cantrollback' => 'Cannot revert edit; last contributor is only author of this page.',
-'alreadyrolled' => "Cannot rollback last edit of [[$1]]
+'alreadyrolled' => "Cannot rollback last edit of [[:$1]]
by [[User:$2|$2]] ([[User talk:$2|Talk]]); someone else has edited or rolled back the page already.
Last edit was by [[User:$3|$3]] ([[User talk:$3|Talk]]).",
@@ -1574,6 +1770,8 @@ will not be automatically replaced.',
shown in the summary below, along with details of the users who had edited this page
before deletion. The actual text of these deleted revisions is only available to administrators.',
'undeleterevision' => "Deleted revision as of $1",
+'undeleterevision-missing' => "Invalid or missing revision. You may have a bad link, or the
+revision may have been restored or removed from the archive.",
'undeletebtn' => 'Restore',
'undeletereset' => 'Reset',
'undeletecomment' => 'Comment:',
@@ -1601,14 +1799,14 @@ Consult the [[Special:Log/delete|deletion log]] for a record of recent deletions
'uctop' => ' (top)' ,
'newbies' => 'newbies',
-'sp-newimages-showfrom' => 'Show new images starting from $1',
-
'sp-contributions-newest' => 'Newest',
'sp-contributions-oldest' => 'Oldest',
'sp-contributions-newer' => 'Newer $1',
'sp-contributions-older' => 'Older $1',
'sp-contributions-newbies-sub' => 'For newbies',
+'sp-contributions-blocklog' => 'Block log',
+'sp-newimages-showfrom' => 'Show new images starting from $1',
# What links here
#
@@ -1639,6 +1837,7 @@ pages that were vandalized).",
'ipbreason' => 'Reason',
'ipbanononly' => 'Block anonymous users only',
'ipbcreateaccount' => 'Prevent account creation',
+'ipbenableautoblock' => 'Automatically block the last IP address used by this user, and any subsequent addresses they try to edit from',
'ipbsubmit' => 'Block this user',
'ipbother' => 'Other time',
'ipboptions' => '2 hours:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,infinite:infinite',
@@ -1658,6 +1857,7 @@ to a previously blocked IP address or username.',
'infiniteblock' => 'infinite',
'expiringblock' => 'expires $1',
'anononlyblock' => 'anon. only',
+'noautoblockblock' => 'autoblock disabled',
'createaccountblock' => 'account creation blocked',
'ipblocklistempty' => 'The blocklist is empty.',
'blocklink' => 'block',
@@ -1678,9 +1878,9 @@ the list of currently operational bans and blocks.',
'ipb_cant_unblock' => 'Error: Block ID $1 not found. It may have been unblocked already.',
'proxyblockreason' => 'Your IP address has been blocked because it is an open proxy. Please contact your Internet service provider or tech support and inform them of this serious security problem.',
'proxyblocksuccess' => 'Done.',
-'sorbs' => 'SORBS DNSBL',
-'sorbsreason' => 'Your IP address is listed as an open proxy in the [http://www.sorbs.net SORBS] DNSBL.',
-'sorbs_create_account_reason' => 'Your IP address is listed as an open proxy in the [http://www.sorbs.net SORBS] DNSBL. You cannot create an account',
+'sorbs' => 'DNSBL',
+'sorbsreason' => 'Your IP address is listed as an open proxy in the DNSBL used by this site.',
+'sorbs_create_account_reason' => 'Your IP address is listed as an open proxy in the DNSBL used by this site. You cannot create an account',
# Developer tools
@@ -1761,6 +1961,7 @@ In those cases, you will have to move or merge the page manually if desired.',
'movenologintext' => "You must be a registered user and [[Special:Userlogin|logged in]]
to move a page.",
'newtitle' => 'To new title',
+'move-watch' => 'Watch this page',
'movepagebtn' => 'Move page',
'pagemovedsub' => 'Move succeeded',
'pagemovedtext' => "Page \"[[$1]]\" moved to \"[[$2]]\".",
@@ -1852,7 +2053,7 @@ All transwiki import actions are logged at the [[Special:Log/import|import log]]
# import log
'importlogpage' => 'Import log',
'importlogpagetext' => 'Administrative imports of pages with edit history from other wikis.',
-'import-logentry-upload' => 'imported $1 by file upload',
+'import-logentry-upload' => 'imported [[$1]] by file upload',
'import-logentry-upload-detail' => '$1 revision(s)',
'import-logentry-interwiki' => 'transwikied $1',
'import-logentry-interwiki-detail' => '$1 revision(s) from $2',
@@ -1877,8 +2078,8 @@ All transwiki import actions are logged at the [[Special:Log/import|import log]]
'tooltip-watch' => 'Add this page to your watchlist [alt-w]',
# stylesheets
-'Common.css' => '/** CSS placed here will be applied to all skins */',
-'Monobook.css' => '/* CSS placed here will affect users of the Monobook skin */',
+'common.css' => '/** CSS placed here will be applied to all skins */',
+'monobook.css' => '/* CSS placed here will affect users of the Monobook skin */',
# Metadata
'nodublincore' => 'Dublin Core RDF metadata disabled for this server.',
@@ -1904,6 +2105,7 @@ All transwiki import actions are logged at the [[Special:Log/import|import log]]
'spamprotectionmatch' => 'The following text is what triggered our spam filter: $1',
'subcategorycount' => "There {{PLURAL:$1|is one subcategory|are $1 subcategories}} to this category.",
'categoryarticlecount' => "There {{PLURAL:$1|is one article|are $1 articles}} in this category.",
+'category-media-count' => "There {{PLURAL:$1|is one file|are $1 files}} in this category.",
'listingcontinuesabbrev' => " cont.",
'spambot_username' => 'MediaWiki spam cleanup',
'spam_reverting' => 'Reverting to last version not containing links to $1',
@@ -1935,9 +2137,10 @@ All transwiki import actions are logged at the [[Special:Log/import|import log]]
'rcpatroldisabledtext' => "The Recent Changes Patrol feature is currently disabled.",
'markedaspatrollederror' => "Cannot mark as patrolled",
'markedaspatrollederrortext' => "You need to specify a revision to mark as patrolled.",
+'markedaspatrollederror-noautopatrol' => 'You are not allowed to mark your own changes as patrolled.',
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'My user page\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'The user page for the ip you\\\'re editing as\');
@@ -1948,7 +2151,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'The list of pages you\\\'re monitoring
ta[\'pt-mycontris\'] = new Array(\'y\',\'List of my contributions\');
ta[\'pt-login\'] = new Array(\'o\',\'You are encouraged to log in, it is not mandatory however.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'You are encouraged to log in, it is not mandatory however.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Log out\');
+ta[\'pt-logout\'] = new Array(\'\',\'Log out\');
ta[\'ca-talk\'] = new Array(\'t\',\'Discussion about the content page\');
ta[\'ca-edit\'] = new Array(\'e\',\'You can edit this page. Please use the preview button before saving.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Add a comment to this discussion.\');
@@ -1988,6 +2191,9 @@ ta[\'ca-nstab-template\'] = new Array(\'c\',\'View the template\');
ta[\'ca-nstab-help\'] = new Array(\'c\',\'View the help page\');
ta[\'ca-nstab-category\'] = new Array(\'c\',\'View the category page\');',
+# Common.js: contains nothing but a placeholder comment
+'common.js' => '/* Any JavaScript here will be loaded for all users on every page load. */',
+
# image deletion
'deletedrevision' => 'Deleted old revision $1.',
@@ -2183,6 +2389,8 @@ is collapsed. Others will be hidden by default.
'exif-compression-1' => 'Uncompressed',
'exif-compression-6' => 'JPEG',
+'exif-unknowndate' => 'Unknown date',
+
'exif-photometricinterpretation-2' => 'RGB',
'exif-photometricinterpretation-6' => 'YCbCr',
@@ -2348,9 +2556,19 @@ is collapsed. Others will be hidden by default.
before using e-mail features. Activate the button below to send a confirmation
mail to your address. The mail will include a link containing a code; load the
link in your browser to confirm that your e-mail address is valid.",
+'confirmemail_pending' => '<div class="error">
+A confirmation code has already been e-mailed to you; if you recently
+created your account, you may wish to wait a few minutes for it to
+arrive before trying to request a new code.
+</div>',
'confirmemail_send' => 'Mail a confirmation code',
'confirmemail_sent' => 'Confirmation e-mail sent.',
-'confirmemail_sendfailed' => 'Could not send confirmation mail. Check address for invalid characters.',
+'confirmemail_oncreate' => 'A confirmation code was sent to your e-mail address.
+This code is not required to log in, but you will need to provide it before
+enabling any e-mail-based features in the wiki.',
+'confirmemail_sendfailed' => 'Could not send confirmation mail. Check address for invalid characters.
+
+Mailer returned: $1',
'confirmemail_invalid' => 'Invalid confirmation code. The code may have expired.',
'confirmemail_needlogin' => 'You need to $1 to confirm your email address.',
'confirmemail_success' => 'Your e-mail address has been confirmed. You may now log in and enjoy the wiki.',
@@ -2452,6 +2670,42 @@ Please confirm that really want to recreate this page.',
'table_pager_limit_submit' => 'Go',
'table_pager_empty' => 'No results',
+# Auto-summaries
+'autosumm-blank' => 'Removing all content from page',
+'autosumm-replace' => 'Replacing page with \'$1\'',
+'autoredircomment' => 'Redirecting to [[$1]]', # This should be changed to the new naming convention, but existed beforehand.
+'autosumm-new' => 'New page: $1',
+
+# Autoblock whitelist
+'autoblock_whitelist' => 'AOL http://webmaster.info.aol.com/proxyinfo.html
+*64.12.96.0/19
+*149.174.160.0/20
+*152.163.240.0/21
+*152.163.248.0/22
+*152.163.252.0/23
+*152.163.96.0/22
+*152.163.100.0/23
+*195.93.32.0/22
+*195.93.48.0/22
+*195.93.64.0/19
+*195.93.96.0/19
+*195.93.16.0/20
+*198.81.0.0/22
+*198.81.16.0/20
+*198.81.8.0/23
+*202.67.64.128/25
+*205.188.192.0/20
+*205.188.208.0/23
+*205.188.112.0/20
+*205.188.146.144/30
+*207.200.112.0/21',
+
+# Size units
+'size-bytes' => '$1 B',
+'size-kilobytes' => '$1 KB',
+'size-megabytes' => '$1 MB',
+'size-gigabytes' => '$1 GB',
+
);
?>
diff --git a/languages/messages/MessagesEo.php b/languages/messages/MessagesEo.php
index b34256ae..e4322468 100644
--- a/languages/messages/MessagesEo.php
+++ b/languages/messages/MessagesEo.php
@@ -100,12 +100,13 @@ $messages = array(
'may' => 'Maj',
'aug' => 'AÅ­g',
'oct' => 'Okt',
-'categories' => '{{PLURAL:$1|Kategorio|Kategorioj}}',
+'categories' => 'Kategorioj',
+'pagecategories' => '{{PLURAL:$1|Kategorio|Kategorioj}}',
'category_header' => 'Artikoloj en kategorio "$1"',
'subcategories' => 'Subkategorioj',
'mainpage' => 'ĈefpaÄo',
'mainpagetext' => 'Vikisoftvaro sukcese instaliÄis.',
-'mainpagedocfooter' => 'Consult the [http://meta.wikipedia.org/wiki/MediaWiki_User%27s_Guide User\'s Guide] for information on using the wiki software.
+'mainpagedocfooter' => 'Consult the [http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide User\'s Guide] for information on using the wiki software.
== Getting started ==
@@ -868,7 +869,7 @@ Vidu la paÄon $2 por registro de lastatempaj forigoj.',
'rollbacklink' => 'restarigu antaÅ­an',
'rollbackfailed' => 'Restarigo malsukcesis',
'cantrollback' => 'Neeblas restarigi antaÅ­an redakton; la redaktinto lasta estas la sola de la paÄo.',
-'alreadyrolled' => 'Ne eblas restarigi la lastan redakton de [[$1]] de la [[User:$2|$2]] ([[User talk:$2|diskuto]]) pro tio, ke oni intertempe redaktis la paÄon. La lasta redaktinto estas [[User:$3|$3]] ([[User talk:$3|diskuto]]).',
+'alreadyrolled' => 'Ne eblas restarigi la lastan redakton de [[:$1]] de la [[User:$2|$2]] ([[User talk:$2|diskuto]]) pro tio, ke oni intertempe redaktis la paÄon. La lasta redaktinto estas [[User:$3|$3]] ([[User talk:$3|diskuto]]).',
'editcomment' => 'La komento estis: \'<i>$1</i>\'.',
'revertpage' => 'Restarigis redaktojn de [[Special:Contributions/$2|$2]] ([[User talk:$2|diskuto]]); restarigis al la lasta versio de [[User:$1|$1]]',
'sessionfailure' => 'Åœajnas ke estas problemo kun via ensalutado;
@@ -1092,10 +1093,10 @@ La celartikolo "[[$1]]" jam ekzistas. Ĉu vi volas forigi Äin por krei spacon p
'tooltip-minoredit' => 'Marku tiun ÅanÄon kiel malgrava [alt-i]',
'tooltip-save' => 'Konservu viajn ÅanÄojn [alt-s]',
'tooltip-preview' => 'AntaÅ­rigardu viajn ÅanÄojn. Bonvolu uzi tion antaÅ­ ol konservi ilin! [alt-p]',
-'tooltip-diff' => 'Show which changes you made to the text. [alt-d]',
+'tooltip-diff' => 'Show which changes you made to the text. [alt-v]',
'tooltip-compareselectedversions'=> 'Vidu la malsamojn inter ambaÅ­ selektitaj versioj de ĉi paÄo. [alt-v]',
'tooltip-watch' => 'Aldonu ĉi paÄon al via atentaro [alt-w]',
-'Monobook.css' => '/* CSS placed here will affect users of the Monobook skin */',
+'monobook.css' => '/* CSS placed here will affect users of the Monobook skin */',
'anonymous' => 'Anonima(j) uzanto(j) de {{SITENAME}}',
'siteuser' => '{{SITENAME}} uzanto $1',
'lastmodifiedatby' => 'Ĉi paÄo estis laste ÅanÄita je $2, $1 de $3.',
@@ -1125,7 +1126,7 @@ La celartikolo "[[$1]]" jam ekzistas. Ĉu vi volas forigi Äin por krei spacon p
'markedaspatrolledtext' => 'La elektita versio estas markita kiel patrolita.',
'rcpatroldisabled' => 'Patrolado de lastaj ÅanÄoj malaktivigita',
'rcpatroldisabledtext' => 'La funkcio patrolado de la lastaj ÅanÄoj estas nun malaktivigita.',
-'Monobook.js' => '/* iletikedoj kaj rektaj klavoj */
+'monobook.js' => '/* iletikedoj kaj rektaj klavoj */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Mia uzantopaÄo\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'La uzantopaÄo por la IP adreso sub kiu vi estas redaktanta\');
@@ -1136,7 +1137,7 @@ La celartikolo "[[$1]]" jam ekzistas. Ĉu vi volas forigi Äin por krei spacon p
ta[\'pt-mycontris\'] = new Array(\'y\',\'Listo de miaj kontribuoj\');
ta[\'pt-login\'] = new Array(\'o\',\'Vi estas invitita ensaluti, tamen ne estas devige.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Vi estas invitita ensaluti, tamen ne estas devige.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Elsalutu\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Elsalutu\');
ta[\'ca-talk\'] = new Array(\'t\',\'Diskuto pri la artikolo\');
ta[\'ca-edit\'] = new Array(\'e\',\'Vi povas redakti tiun ĉi paÄon. Bv uzi la antaÅ­vidbutonon antaÅ­ ol konservi.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Aldonu komenton al tiu diskuto.\');
diff --git a/languages/messages/MessagesEs.php b/languages/messages/MessagesEs.php
index 852466d1..7b82e001 100644
--- a/languages/messages/MessagesEs.php
+++ b/languages/messages/MessagesEs.php
@@ -119,7 +119,8 @@ $messages = array(
'oct' => 'oct',
'nov' => 'nov',
'dec' => 'dic',
-'categories' => '{{PLURAL:$1|Categoría|Categorías}}',
+'categories' => 'Categorías',
+'pagecategories' => '{{PLURAL:$1|Categoría|Categorías}}',
'category_header' => 'Artículos en la categoría "$1"',
'subcategories' => 'Subcategorías',
'mainpage' => 'Portada',
@@ -821,8 +822,11 @@ pulsa el botón \'Eliminar artículos seleccionados\' al final de la página.',
'wlnote' => 'Abajo están los últimos $1 cambios en las últimas <b>$2</b> horas.',
'wlshowlast' => 'Mostrar las últimas $1 horas $2 días $3',
'wlsaved' => 'Esta es una versión guardada de tu lista de seguimiento.',
-'wlhideshowown' => '$1 mis ediciones.',
-'wlhideshowbots' => '$1 ediciones de bots.',
+'watchlist-show-bots' => 'Mostrar ediciones de bots',
+'watchlist-hide-bots' => 'Esconder ediciones de bots',
+'watchlist-show-own' => 'Mostrar mis ediciones',
+'watchlist-hide-own' => 'Esconder mis ediciones',
+
'enotif_mailer' => 'Notificación por correo de {{SITENAME}}',
'enotif_reset' => 'Marcar todas las páginas visitadas',
'enotif_newpagetext' => 'Se trata de una nueva página.',
@@ -885,7 +889,7 @@ Todos los tiempos se muestran en hora del servidor (UTC).
'rollbacklink' => 'Revertir',
'rollbackfailed' => 'Reversión fallida',
'cantrollback' => 'No se pueden revertir las ediciones; el último colaborador es el único autor de este artículo.',
-'alreadyrolled' => 'No se puede revertir la última edición de [[$1]] por [[User:$2|$2]] ([[User talk:$2|discusión]]); alguien más ya ha editado o revertido esa página. La última edición fue hecha por [[User:$3|$3]] ([[User talk:$3|discusión]]).',
+'alreadyrolled' => 'No se puede revertir la última edición de [[:$1]] por [[User:$2|$2]] ([[User talk:$2|discusión]]); alguien más ya ha editado o revertido esa página. La última edición fue hecha por [[User:$3|$3]] ([[User talk:$3|discusión]]).',
'editcomment' => 'El resumen de la edición fue: "<i>$1</i>".',
'revertpage' => 'Revertidas las ediciones realizadas por [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]); hacia la última versión por [[User:$1|$1]]',
'sessionfailure' => 'Parece que hay un problema con tu sesión;
@@ -1095,10 +1099,10 @@ En el último caso puedes usar un enlace, por ejemplo [[Special:Export/{{Mediawi
'tooltip-minoredit' => 'Marcar este cambio como menor [alt-i]',
'tooltip-save' => 'Guardar tus cambios [alt-s]',
'tooltip-preview' => 'Previsualiza tus cambios, ¡por favor, usa esto antes de grabar! [alt-p]',
-'tooltip-diff' => 'Muestra los cambios que has introducido en el texto. [alt-d]',
+'tooltip-diff' => 'Muestra los cambios que has introducido en el texto. [alt-v]',
'tooltip-compareselectedversions'=> 'Ver las diferencias entre las dos versiones seleccionadas de esta página. [alt-v]',
'tooltip-watch' => 'Añadir esta página a tu lista de seguimiento [alt-w]',
-'Monobook.css' => '/* cambia este archivo para personalizar la piel monobook para el sitio entero */',
+'monobook.css' => '/* cambia este archivo para personalizar la piel monobook para el sitio entero */',
'nodublincore' => 'Metadatos Dublin Core RDF deshabilitados en este servidor.',
'nocreativecommons' => 'Metadatos Creative Commons RDF deshabilitados en este servidor.',
'notacceptable' => 'El servidor wiki no puede proveer los datos en un formato que tu cliente (navegador) pueda entender.',
@@ -1136,7 +1140,7 @@ La siguiente expresión regular define los enlaces que se encuentran bloqueados
'markedaspatrolledtext' => 'La versión seleccionada ha sido marcada como revisada.',
'rcpatroldisabled' => 'Revisión de los Cambios Recientes deshabilitada',
'rcpatroldisabledtext' => 'La capacidad de revisar los Cambios Recientes está deshabilitada en este momento.',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Mi página de usuario\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'La página de usuario de la IP desde la que editas\');
@@ -1147,7 +1151,7 @@ La siguiente expresión regular define los enlaces que se encuentran bloqueados
ta[\'pt-mycontris\'] = new Array(\'y\',\'Lista de mis contribuciones\');
ta[\'pt-login\'] = new Array(\'o\',\'Te animamos a registrarte, aunque no es obligatorio\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Te animamos a registrarte, aunque no es obligatorio\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Salir de la sesión\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Salir de la sesión\');
ta[\'ca-talk\'] = new Array(\'t\',\'Discusión acerca del artículo\');
ta[\'ca-edit\'] = new Array(\'e\',\'Puedes editar esta página. Por favor, usa el botón de previsualización antes de grabar.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Añade un comentario a esta discusión\');
@@ -1469,7 +1473,7 @@ Esto se debe probablemente a vandalismos persistentes desde tu escuela o tu prov
'cantcreateaccounttitle' => 'No se puede crear la cuenta',
'categorypage' => 'Ver página de categoría',
'clearwatchlist' => 'Limpiar lista de seguimiento',
-'Common.css' => '/* Los estilos CSS definidos aquí aplicarán a todas las pieles (skins) */',
+'common.css' => '/* Los estilos CSS definidos aquí aplicarán a todas las pieles (skins) */',
'confirmedittext' => 'Debes confirmar tu dirección electrónica antes de editar páginas. Por favor, establece y valida una dirección electrónica a través de tus [[Special:Preferences|preferencias de usuario]].',
'confirmedittitle' => 'Se requiere confirmación de dirección electrónica para editar',
'confirmemail_needlogin' => 'Necesitas $1 para confirmar tu dirección electrónica.',
@@ -1520,7 +1524,7 @@ Las fechas de revisiones y los nombres de editores se preservarán.
Todas las importaciones transwiki se registran en el [[Special:Log/import|registro de importaciones]].',
'import-logentry-interwiki' => 'transwikificada $1',
'import-logentry-interwiki-detail' => '$1 revisión/ones desde $2',
-'import-logentry-upload' => 'importada $1 por subida de archivo',
+'import-logentry-upload' => 'importada [[$1]] por subida de archivo',
'import-logentry-upload-detail' => '$1 revisión/ones',
'importlogpage' => 'Registro de importaciones',
'importlogpagetext' => 'Importaciones administrativas de páginas con historial desde otros wikis.',
@@ -1561,7 +1565,6 @@ Todas las importaciones transwiki se registran en el [[Special:Log/import|regist
'mon' => 'lun',
'newpageletter' => 'N',
'newpages-username' => 'Nombre de usuario',
-'newtalkseperator' => ',_',
'noexactmatch' => '<div style="border: 1px solid #ccc; padding: 7px;"><div style="background: #F9F9F9; padding: 7px">
<div style="font-size:115%"><b>No existe ningún artículo con el título que has escrito.</b></div>
<hr />
@@ -1586,7 +1589,7 @@ Ten en cuenta que {{SITENAME}} es un wiki en desarrollo que va siendo construido
'november-gen' => 'noviembre',
'october-gen' => 'octubre',
'ok' => 'OK',
-'old-revision-navigation' => 'Revisión a fecha de $1; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'Revisión a fecha de $1; $2',
'orig' => 'orig',
'pagetitle' => '$1 - {{SITENAME}}',
'prefs-watchlist' => 'Seguimiento',
diff --git a/languages/messages/MessagesEt.php b/languages/messages/MessagesEt.php
index 425f9d30..b4464eb5 100644
--- a/languages/messages/MessagesEt.php
+++ b/languages/messages/MessagesEt.php
@@ -147,6 +147,7 @@ $messages = array(
# Bits of text used by many pages:
#
'categories' => 'Kategooriad',
+'pagecategories' => 'Kategooriad',
'category_header' => 'Selles kategoorias on "$1" artiklit',
'subcategories' => 'Alamkategooriad',
diff --git a/languages/messages/MessagesEu.php b/languages/messages/MessagesEu.php
index c8d63934..5f211701 100644
--- a/languages/messages/MessagesEu.php
+++ b/languages/messages/MessagesEu.php
@@ -5,7 +5,6 @@
* @subpackage Language
*/
-
$quickbarSettings = array(
'Ezein ere', 'Eskuinean', 'Ezkerrean', 'Ezkerrean mugikor'
);
@@ -39,163 +38,1869 @@ $namespaceNames = array(
);
$messages = array(
-'1movedto2' => '$1 izenburua $2-en truke aldatu da.',
-'about' => 'buruz',
-'aboutpage' => '{{ns:project}}:{{SITENAME}}ri_buruz', // TODO: grammar
-'accesskey-diff' => 'd',
-'allmessages' => 'Mezu_guztiak',
-'allpages' => 'Orri guztiak',
-'alphaindexline' => '$1 -tik $2 -raino',
-'alreadyloggedin' => '<strong>Lankide $1, barruan zaude!</strong><br />',
-'ancientpages' => 'Orri zaharrak',
-'bold_sample' => 'Lodia',
-'bold_tip' => 'Lodia',
-'cancel' => 'Bertan behera utzi',
-'categories' => 'Kategoriak',
+'tog-underline' => 'Loturak azpimarratu:',
+'tog-highlightbroken' => 'Lotura hautsiak <a href="" class="new">horrela</a> erakutsi (bestela, honela<a href="" class="internal">?</a>).',
+'tog-justify' => 'Paragrafoak justifikatu',
+'tog-hideminor' => 'Azken aldaketetan aldaketa txikiak ezkutatu',
+'tog-extendwatchlist' => 'Jarraipen zerrenda zabaldu aldaketa guztiak ikusteko',
+'tog-usenewrc' => 'Hobetutako azken aldaketak (JavaScript)',
+'tog-numberheadings' => 'Goiburukoak automatikoki zenbakitu',
+'tog-showtoolbar' => 'Aldaketen tresna-barra erakutsi (JavaScript)',
+'tog-editondblclick' => 'Klik bikoitzaren bitartez orrialdeak aldatu (JavaScript)',
+'tog-editsection' => 'Atalak [aldatu] loturen bitartez aldatzeko aukera gaitu',
+'tog-editsectiononrightclick' => 'Atalen izenburuetan klik eginez atala<br />aldatzea gaitu (JavaScript)',
+'tog-showtoc' => 'Edukien taula erakutsi (3 goiburukotik gorako orrialdeentzako)',
+'tog-rememberpassword' => 'Nire saioa ordenagailu honetan gogoratu',
+'tog-editwidth' => 'Zabalera osoko aldaketa koadroa',
+'tog-watchcreations' => 'Sortzen ditudan orrialdeak jarraipen zerrendara gehitu',
+'tog-watchdefault' => 'Aldatzen ditudan orrialdeak jarraipen zerrendara gehitu',
+'tog-minordefault' => 'Lehenetsi bezala aldaketa txiki bezala markatu guztiak',
+'tog-previewontop' => 'Aurrebista aldaketa koadroaren aurretik erakutsi',
+'tog-previewonfirst' => 'Lehen aldaketan aurrebista erakutsi',
+'tog-nocache' => 'Orrialdeen katxea ezgaitu',
+'tog-enotifwatchlistpages' => 'Jarraitzen ari naizen orrialde baten aldaketak daudenean e-posta jaso',
+'tog-enotifusertalkpages' => 'Nire eztabaida orrialdea aldatzen denean e-posta jaso',
+'tog-enotifminoredits' => 'Aldaketa txikiak direnean ere e-posta jaso',
+'tog-enotifrevealaddr' => 'Jakinarazpen mezuetan nire e-posta helbidea erakutsi',
+'tog-shownumberswatching' => 'Jarraitzen duen erabiltzaile kopurua erakutsi',
+'tog-fancysig' => 'Lotura automatikorik gabeko sinadura',
+'tog-externaleditor' => 'Lehenetsi bezala kanpoko editore bat erabili',
+'tog-externaldiff' => 'Lehenetsi bezala kanpoko diff erreminta erabili',
+'tog-showjumplinks' => '"Hona jo" irisgarritasun loturak gaitu',
+'tog-uselivepreview' => 'Zuzeneko aurrebista erakutsi (JavaScript) (Proba fasean)',
+'tog-autopatrol' => 'Mark edits I make as patrolled', // Zalantza
+'tog-forceeditsummary' => 'Aldaketaren laburpena zuri uzterakoan ohartarazi',
+'tog-watchlisthideown' => 'Jarraipen zerrendan nire aldaketak ezkutatu',
+'tog-watchlisthidebots' => 'Jarraipen zerrendan bot-en aldaketak ezkutatu',
+
+'underline-always' => 'Beti',
+'underline-never' => 'Inoiz ez',
+'underline-default' => 'Nabigatzailearen lehenetsitako balioa',
+
+'skinpreview' => '(Aurrebista)',
+
+# dates
+'sunday' => 'Igandea',
+'monday' => 'Astelehena',
+'tuesday' => 'Asteartea',
+'wednesday' => 'Asteazkena',
+'thursday' => 'Osteguna',
+'friday' => 'Ostirala',
+'saturday' => 'Larunbata',
+'sun' => 'Iga',
+'mon' => 'Asl',
+'tue' => 'Asr',
+'wed' => 'Asz',
+'thu' => 'Osg',
+'fri' => 'Osr',
+'sat' => 'Lar',
+'january' => 'Urtarrila',
+'february' => 'Otsaila',
+'march' => 'Martxoa',
+'april' => 'Apirila',
+'may_long' => 'Maiatza',
+'june' => 'Ekaina',
+'july' => 'Uztaila',
+'august' => 'Abuztua',
+'september' => 'Iraila',
+'october' => 'Urria',
+'november' => 'Azaroa',
+'december' => 'Abendua',
+'january-gen' => 'Urtarril',
+'february-gen' => 'Otsail',
+'march-gen' => 'Martxo',
+'april-gen' => 'Apiril',
+'may-gen' => 'Maiatz',
+'june-gen' => 'Ekain',
+'july-gen' => 'Uztail',
+'august-gen' => 'Abuztu',
+'september-gen' => 'Irail',
+'october-gen' => 'Urri',
+'november-gen' => 'Azaro',
+'december-gen' => 'Abendu',
+'jan' => 'Urt',
+'feb' => 'Ots',
+'mar' => 'Mar',
+'apr' => 'Api',
+'may' => 'Mai',
+'jun' => 'Eka',
+'jul' => 'Uzt',
+'aug' => 'Abu',
+'sep' => 'Ira',
+'oct' => 'Urr',
+'nov' => 'Aza',
+'dec' => 'Abe',
+# Bits of text used by many pages:
+#
+'categories' => '{{PLURAL:$1|Kategoria|Kategoriak}}',
'category_header' => '"$1" kategoriako artikuluak',
-'categoryarticlecount' => 'Kategoria honetan $1 artikulu daude.',
-'contributions' => 'Lankidearen ekarpenak',
-/*'copyrightwarning' => 'Mesedez, egin kontu {{SITENAME}}-ri egindako ekarpen guztiak GNU Dokumentazio aske Lizentziaren barnean egin dela suposatzen dela (begira $1). Ez ezazu sakatu bidaltzeko botoia zure idatzia, baimenik gabe eta zure nahiaren aurka hedatzen ikustea nahi ez baduzu. Zu ere, idatzia zure kabuz idatzi duzula, edo publikora zabaldutako leku batetik ateratzen ari zarela agintzen ari zara. <strong>EZ EZAZU COPYRIGHT BATEN MENPEAN DAGOEN LANA BAIMENIK GABE ERABILI!</strong>', // TODO: grammar*/
-'cur' => 'azk',
-'currentevents' => 'Gaurkotasun',
-'currentrev' => 'Azken eguneratzea',
-'deadendpages' => 'Artikulu itsuak',
-'deletethispage' => 'Orria ezabatu',
-'edithelp' => 'Editatzeko laguntza',
-'edithelppage' => '{{ns:project}}:Editatzeko laguntza',
-'editing' => '"$1" editatzen',
-'editinguser' => '"$1" editatzen',
-'editsection' => 'editatu',
-'editold' => 'editatu',
-'editthispage' => 'Orria editatu',
-'go' => 'Joan',
-'searcharticle' => 'Joan',
-'headline_sample' => 'Goiburuko',
-'headline_tip' => '2. mailako goiburukoa',
-'help' => 'Laguntza',
-'helppage' => '{{ns:project}}:Laguntza',
-'hide' => 'ezkutatu',
-'hidetoc' => 'ezkutatu',
-'histlegend' => 'Legenda: betsionen artean desberdintasunak: (azk) = azkena, (aur) = aurrekoa;
-t = edikateka txikiak',
-'history' => 'Orriaren historia',
+'subcategories' => 'Azpikategoriak',
+
+
+'linkprefix' => '/^(.*?)([a-zA-Z\x80-\xff]+)$/sD',
+'mainpage' => 'Azala',
+'mainpagetext' => "<big>'''MediaWiki arrakastaz instalatu da.'''</big>",
+'mainpagedocfooter' => "Ikus [http://meta.wikimedia.org/wiki/Help:Contents Erabiltzaile Gida] wiki softwarea erabiltzen hasteko informazio gehiagorako.
+
+== Nola hasi ==
+
+* [http://www.mediawiki.org/wiki/Help:Configuration_settings Konfigurazio balioen zerrenda]
+* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ (Maiz egindako galderak)]
+* [http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]",
+
+'portal' => 'Wikipediako txokoa',
+'portal-url' => 'Project:Txokoa',
+'about' => 'Honi Buruz',
+'aboutsite' => '{{SITENAME}}(e)ri buruz',
+'aboutpage' => 'Project:Honi_buruz',
+'article' => 'Artikulua',
+'help' => 'Laguntza',
+'helppage' => 'Help:Contents',
+'bugreports' => 'Programazio-erroreen jakinarazpenak',
+'bugreportspage' => 'Project:Programazio-erroreen jakinarazpenak',
+'sitesupport' => 'Dohaintzak',
+'sitesupport-url' => 'Project:Gune laguntza',
+'faq' => 'Maiz egindako galderak',
+'faqpage' => 'Project:Maiz egindako galderak',
+'edithelp' => 'Aldaketak egiteko laguntza',
+'newwindow' => '(leiho berrian irekitzen da)',
+'edithelppage' => 'Help:Aldaketak egiteko laguntza',
+'cancel' => 'Bertan behera utzi',
+'qbfind' => 'Aurkitu',
+'qbbrowse' => 'Arakatu',
+'qbedit' => 'Aldatu',
+'qbpageoptions' => 'Orrialde hau',
+'qbpageinfo' => 'Testuingurua',
+'qbmyoptions' => 'Nire orrialdeak',
+'qbspecialpages' => 'Aparteko orrialdeak',
+'moredotdotdot' => 'Gehiago...',
+'mypage' => 'Nire orrialdea',
+'mytalk' => 'Nire eztabaida',
+'anontalk' => 'IP honen eztabaida',
+'navigation' => 'Nabigazioa',
+
+# Metadata in edit box
+'metadata_help' => 'Metadata (ikus [[{{ns:project}}:Metadata]] azalpen baterako):',
+
+'currentevents' => 'Albisteak',
+'currentevents-url' => 'Albisteak',
+
+'disclaimers' => 'Mugaketak',
+'disclaimerpage' => 'Project:Erantzukizunen mugaketa orokorra',
+'privacy' => 'Pribatutasun politika',
+'privacypage' => 'wikimedia:Pribatutsan politika',
+'errorpagetitle' => 'Errorea',
+'returnto' => '$1(e)ra itzuli.',
+'tagline' => '{{SITENAME}}(e)tik',
+'help' => 'Laguntza',
+'search' => 'Bilatu',
+'searchbutton' => 'Bilatu',
+'go' => 'Joan',
+'searcharticle' => 'Joan',
+'history' => 'Orrialdearen historia',
'history_short' => 'Historia',
-'hr_tip' => 'Lerro horizontal (neurritasunaz)',
-'ilsubmit' => 'Bilatu',
-'image_sample' => 'Adibide.png',
-'imagelist' => 'Irudien zerrenda',
-'italic_sample' => 'Etzana',
-'italic_tip' => 'Etzana',
-'last' => 'aur',
-'lastmodifiedat' => 'Orriaren azken eguneratzea: $2, $1.',
-'loadhist' => 'Orriaren historia kargatzen',
-'login' => 'Izena eman/Saio-hasiera',
-'loginpagetitle' => 'Saio hasiera',
-'loginproblem' => '<b>Arazoren bat egon da zure saio-hasieran.</b><br />¡Saiatu berriro!',
-'logout' => 'Saio-bukaera',
-'logouttext' => 'Zure saioa amaitu duzu.
-Izena eman gabe {{SITENAME}} erabiltzen jarraitu ahal duzu, edo izen berdin edo bestearekin beste saioa hasi ahal duzu.<br />Orri batzuk saioa mantentzen duzuela adierazi dezakete arakatzailearen katxea garbitu arte.',
-'logouttitle' => 'Saio amaiera',
-'lonelypages' => 'Orri umezurtzak',
-'longpages' => 'Orri luzeak',
-'mainpage' => 'Azala',
-'minoredit' => 'Edizio txikia',
-'minoreditletter' => 't',
-'moredotdotdot' => 'Gehiago...',
-'movearticle' => 'Oraingo izenburua',
-'movepage' => 'Orriaren izenburua aldatu',
-'movepagebtn' => 'Orriaren izenburua aldatu',
-'movethispage' => 'Izenburua aldatu',
-'mycontris' => 'Nire ekarpenak',
-'newarticletext' => 'Orri hau ez dago datu-basean; artikulua hastea nahi baduzu, testu lehioan idatzi dezakezu (Mesedez, zure lehen bisita bada, irakurri lehen [[{{ns:project}}:Laguntza|Laguntza orria]]).
-Honaino nahigabe helduz gero, zure arakatzaileko \'\'\'atzera\'\'\' botoia sakatu.',
-'newpage' => 'Orri berria',
-'newpageletter' => 'B',
-'newpages' => 'Orri berriak',
-'newtitle' => 'Izenburu berria',
-'nextn' => 'hurrengo $1ak',
-'nlinks' => '$1 esteka',
-'noname' => 'Lankide izena ez duzu eman.',
-'nowatchlist' => 'Zure segimendu zerrenda hutsik dago.',
-'nstab-category' => 'Kategoria',
-'nstab-help' => 'Laguntza',
-'nstab-image' => 'Irudia',
+'updatedmarker' => 'nire azkeneko bisitaz geroztik eguneratuta',
+'info_short' => 'Informazioa',
+'printableversion' => 'Inprimatzeko bertsioa',
+'permalink' => 'Lotura finkoa',
+'print' => 'Inprimatu',
+'edit' => 'Aldatu',
+'editthispage' => 'Orrialde hau aldatu',
+'delete' => 'Ezabatu',
+'deletethispage' => 'Orrialde hau ezabatu',
+'undelete_short' => 'Berreskuratu {{PLURAL:$1|aldaketa bat|$1 aldaketa}}',
+'protect' => 'Babestu',
+'protectthispage' => 'Orrialde hau babestu',
+'unprotect' => 'Babesa kendu',
+'unprotectthispage' => 'Orrialde honi babesa kendu',
+'newpage' => 'Orrialde berria',
+'talkpage' => 'Orrialde honi buruz eztabaidatu',
+'specialpage' => 'Aparteko orrialdea',
+'personaltools' => 'Tresna pertsonalak',
+'postcomment' => 'Azalpen bat bidali',
+'articlepage' => 'Artikulua ikusi',
+'talk' => 'Eztabaida',
+'views' => 'Bistaratzeak',
+'toolbox' => 'Tresna taula',
+'userpage' => 'Lankide orrialdea ikusi',
+'projectpage' => 'Proiektuaren orrialdea ikusi',
+'imagepage' => 'Irudiaren orrialdea ikusi',
+'mediawikipage' => 'Mezu orrialdea ikusi',
+'templatepage' => 'Txantiloi orrialdea ikusi',
+'viewhelppage' => 'Laguntza orrialdea ikusi',
+'categorypage' => 'Kategoria orrialdea ikusi',
+'viewtalkpage' => 'Eztabaida ikusi',
+'otherlanguages' => 'Beste hizkuntzetan',
+'redirectedfrom' => '($1(e)tik birzuzenduta)',
+'autoredircomment' => '[[$1]] orrialdera birzuzentzentzen',
+'redirectpagesub' => 'Birzuzenketa orria',
+'lastmodifiedat' => 'Orrialdearen azken aldaketa: $2, $1.', //$1 date, $2 time
+'viewcount' => 'Orrialde hau {{plural:$1|behin|$1 aldiz}} bisitatu da.',
+'copyright' => 'Eduki guztia $1(r)en babespean dago.',
+'protectedpage' => 'Babestutako orrialdea',
+'jumpto' => 'Hona jo:',
+'jumptonavigation' => 'nabigazioa',
+'jumptosearch' => 'bilatu',
+
+'badaccess' => 'Baimen errorea',
+'badaccess-group0' => 'Ez daukazu ekintza hori burutzeko baimenik.',
+'badaccess-group1' => 'Ekintza hori $1 taldeko erabiltzaileei mugatuta dago.',
+'badaccess-group2' => 'Ekintza hori $1 taldeetako bateko erabiltzaileei mugatuta dago.',
+'badaccess-groups' => 'Ekintza hori $1 taldeetako batetako erabiltzaileei mugatuta dago.',
+
+'versionrequired' => 'MediaWikiren $1 bertsioa beharrezkoa da',
+'versionrequiredtext' => 'MediaWikiren $1 bertsioa beharrezkoa da orrialde hau erabiltzeko. Ikus [[Special:Version]]',
+
+'ok' => 'Ados',
+'pagetitle' => '$1 - {{SITENAME}}',
+'retrievedfrom' => '"$1"(e)tik jasota',
+'youhavenewmessages' => '$1 dauzkazu ($2).',
+'newmessageslink' => 'Mezu berriak',
+'newmessagesdifflink' => 'azken aldaketa ikusi',
+'editsection'=>'aldatu',
+'editold'=>'aldatu',
+'editsectionhint' => 'Atala aldatu: $1',
+'toc' => 'Edukiak',
+'showtoc' => 'erakutsi',
+'hidetoc' => 'ezkutatu',
+'thisisdeleted' => '$1 ikusi edo leheneratu?',
+'viewdeleted' => '$1 ikusi?',
+'restorelink' => '{{PLURAL:$1|ezabatutako aldaketa bat|ezabatutako $1 aldaketa}}',
+'feedlinks' => 'Jarioa:',
+'feed-invalid' => 'Baliogabeko harpidetza jario mota.',
+
+# Short words for each namespace, by default used in the 'article' tab in monobook
'nstab-main' => 'Artikulua',
-'nstab-mediawiki' => 'Oharra',
-'nstab-special' => 'Berezia',
+'nstab-user' => 'Erabiltzaile orrialdea',
+'nstab-media' => 'Media orrialdea',
+'nstab-special' => 'Apartekoa',
+'nstab-project' => 'Proiektu orrialdea',
+'nstab-image' => 'Fitxategia',
+'nstab-mediawiki' => 'Mezua',
'nstab-template' => 'Txantiloia',
-'otherlanguages' => 'Beste hizkuntzak',
-'pagemovedtext' => '"$1"-ren izenburua "$2"-en truke aldatu da.',
-'passwordremindertext' => 'Norbaitek (zu seguruenik, IP $1 helbidetik) {{SITENAME}}n saio berria hasteko pasahitza bidaltzea eskatu du.
-"$2" lankidearen pasahitza orain "$3" da.
-Mesedez, hasi saioa eta pasahitz hau berri baten truke aldatu.', // TODO: grammar
-'passwordremindertitle' => '{{SITENAME}}ren pasahitz oroigarria', // TODO: grammar
-'passwordsent' => 'Pasahitz oroigarria "$1"-ren helbide elektronikora bidali dugu.
-Mesedez hasi saioa pasahitza hartu bezain laster.',
-'popularpages' => 'Orri bisitatuenak',
-'preferences' => 'Hobespenak',
-'prefs-misc' => 'Nahaztea',
-'preview' => 'Aurrebista',
-'prevn' => 'aurreko $1ak',
-'printableversion' => 'Inprimatzeko bertsio',
-'randompage' => 'Ausazko orria',
-'rclinks' => 'Erakutsi azken $1 aldaketak $2 egunetan.<br />$3',
-'rclistfrom' => 'Erakutsi $1tik aldaketa berriak',
-'rcnote' => 'Azken <strong>$1</strong> aldaketak <strong>$2</strong> egunetan erakusten.',
+'nstab-help' => 'Laguntza orrialdea',
+'nstab-category' => 'Kategoria',
+
+# Main script and global functions
+#
+'nosuchaction' => 'Ekintza hori ez da existitizen',
+'nosuchactiontext' => 'URL bidez zehaztutako ekintza ez du wikiak ezagutzen',
+'nosuchspecialpage' => 'Ez da aparteko orrialde hori existitzen',
+'nospecialpagetext' => 'Baliogabeko aparteko orrialde bat eskatu duzu; existitzen direnen zerrenda ikus dezakezu [[{{ns:special}}:Specialpages]] orrialdean.',
+
+# General errors
+#
+'error' => 'Errorea',
+'databaseerror' => 'Datu-base errorea',
+'dberrortext' => 'Datu-basean kontsulta egiterakoan sintaxi errore bat gertatu da. Baliteke softwareak bug bat izatea. Datu-basean egindako azken kontsulta:
+<blockquote><tt>$1</tt></blockquote>
+Funtzio honekin: "<tt>$2</tt>".
+MySQLk emandako errore informazioa: "<tt>$3: $4</tt>".',
+'dberrortextcl' => 'Datu-basean kontsulta egiterakoan sintaxi errore bat gertatu da. Datu-basean egindako azken kontsulta:
+"$1"
+Funtzio honekin: "$2".
+MySQLk emandako errore informazioa: "$3: $4"',
+'noconnect' => 'Sentitzen dugu! Wikian arazo teknikoak direla-eta, ezin izan da datu-basera konektatu. <br />
+$1',
+'nodb' => 'Ezin izan da $1 datu-basea hautatu',
+'cachederror' => 'Honako hau eskatutako orrialdearen katxeko kopia da, litekeena da eguneratuta ez azaltzea.',
+'laggedslavemode' => 'Oharra: Baliteke orrialde honetan azken aldaketak ez erakustea.',
+'readonly' => 'Datu-basea blokeatuta dago',
+'enterlockreason' => 'Zehaztu blokeatzeko arrazoia, noiz kenduko den jakinaraziz',
+'readonlytext' => 'Datu-basea artikulu berriak sortu edo aldaketak ez egiteko blokeatuta dago, seguruenik mantenu lanak direla-eta. Blokeo hori kentzerakoan beti bezala egongo da berriz.
+
+Blokeatu duen administratzaileak azalpen hau eman du: $1',
+'missingarticle' => 'Datu-baseak ez du aurkitu beharko lukeen orrialde baten testua aurkitu, "$1" izena duena.
+
+Arrazoia iraungitako diff bat edo ezabatutako orrialde baten historia lotura jarraitzea izan liteke.
+
+Hau ez bada zure egoera, baliteke softwarean bug bat aurkitu izana.
+Mesedez, administratzaileari jakinarazi, URLa bidaliz.',
+'readonly_lag' => 'Datu-basea automatikoki blokeatu da menpeko zerbitzariak nagusiarekin sinkronizatu bitartean',
+'internalerror' => 'Barne errorea',
+'filecopyerror' => 'Ezin izan da "$1" fitxategia "$2"(e)ra kopiatu.',
+'filerenameerror' => 'Ezin izan zaio "$1" fitxategiari "$2" izen berria eman.',
+'filedeleteerror' => 'Ezin izan da "$1" fitxategia ezabatu.',
+'filenotfound' => 'Ezin izan da "$1" fitxategia aurkitu.',
+'unexpected' => 'Espero ez zen balioa: "$1"="$2".',
+'formerror' => 'Errorea: ezin izan da formularioa bidali',
+'badarticleerror' => 'Ezin da ekintza hau orrialde honetan burutu.',
+'cannotdelete' => 'Ezin izan da zehaztutako orrialde edo fitxategia ezabatu. (Baliteke beste norbaitek ezabatu izana.)',
+'badtitle' => 'Izenburu ezegokia',
+'badtitletext' => 'Eskatutako orrialde izenburua ez da baliozkoa, hutsik dago, edo gaizki lotutako hizkuntzen arteko lotura da. Baliteke izenburuetan erabili ezin den karaktereren bat izatea.',
+'perfdisabled' => 'Sentitzen dugu! Ezaugarri hau denbora batez ezgaituta dago, wikian arazoak sortzen baititu, datu-basea motelduz.',
+'perfdisabledsub' => 'Hemen duzu $1(e)tik gordetako kopia:', # obsolete?
+'perfcached' => 'Hurrengo datuak katxean gordeta daude eta litekeena da guztiz eguneratuta ez egotea:',
+'perfcachedts' => 'Hurrengo datuak katxean daude, $1 eguneratu zen azkenekoz.',
+'wrong_wfQuery_params' => 'Baliogabeko parametroak eman zaizkio wfQuery() funtzioari<br />
+Funtzioa: $1<br />
+Kontsulta: $2',
+'viewsource' => 'Kodea ikusi',
+'viewsourcefor' => '$1',
+'protectedtext' => 'Orrialde hau blokeatu egin da aldaketak ekiditeko.
+
+Orrialde honen kodea ikusi eta kopiatu dezakezu:',
+'protectedinterface' => 'TOrrialde honek softwarearentzako interfaze testua gordetzen du eta blokeatuta dago bandalismoak saihesteko.',
+'editinginterface' => "'''Oharra:''' Softwarearentzako interfaze testua duen orrialde bat aldatzen ari zara. Orrialde honetako aldaketek erabiltzaile guztiei eragingo die.",
+'sqlhidden' => '(ezkutuko SQL kontsulta)',
+
+# Login and logout pages
+#
+'logouttitle' => 'Saioa ixtea',
+'logouttext' => '<strong>Saioa itxi egin duzu.</strong><br />
+Erabiltzaile anonimo bezala jarraitu dezakezu {{SITENAME}} erabiltzen, edo saioa has dezakezu berriz erabiltzaile berdinarekin edo ezberdin batekin. Kontuan izan orrialde batzuk saioa hasita bazenu bezala ikus ditzakezula nabigatzailearen katxea garbitu arte.',
+
+'welcomecreation' => "== Ongi etorri, $1! ==
+
+Zure kontua sortu egin da. Ez ahaztu {{SITENAME}}(e)ko hobespenak aldatzea.",
+
+'loginpagetitle' => 'Saio hasiera',
+'yourname' => 'Erabiltzaile izena',
+'yourpassword' => 'Pasahitza',
+'yourpasswordagain' => 'Pasahitza berriz',
+'remembermypassword' => 'Nire saioa ordenagailu honetan gogoratu',
+'yourdomainname' => 'Zure domeinua',
+'externaldberror' => 'There was either an external authentication database error or you are not allowed to update your external account.', // Zalantza
+'loginproblem' => '<b>Arazoa gertatu da saioa hasterakoan.</b><br />Saiatu berriz!',
+'alreadyloggedin' => "<strong>$1, saioa hasi duzu jada!</strong><br />",
+
+'login' => 'Saioa hasi',
+'loginprompt' => 'Cookieak gaituta izatea beharrezkoa da {{SITENAME}}(e)n saioa hasteko.',
+'userlogin' => 'Saioa hasi / kontua sortu',
+'logout' => 'Saioa itxi',
+'userlogout' => 'Saioa itxi',
+'notloggedin' => 'Saioa hasi gabe',
+'nologin' => 'Ez duzu erabiltzaile konturik? $1.',
+'nologinlink' => 'Kontua sortu',
+'createaccount' => 'Kontua sortu',
+'gotaccount' => 'Baduzu erabiltzaile kontua? $1.',
+'gotaccountlink' => 'Saioa hasi',
+'createaccountmail' => 'e-postaz',
+'badretype' => 'Idatzitako pasahitzak ez dira berdinak.',
+'userexists' => 'Aukeratutako erabiltzaile izena hartuta dago. Mesedez, ezberdin bat aukeratu.',
+'youremail' => 'E-posta *:',
+'username' => 'Erabiltzaile izena:',
+'uid' => 'Erabiltzaile IDa:',
+'yourrealname' => 'Benetako izena *:',
+'yourlanguage' => 'Hizkuntza:',
+'yourvariant' => 'Aldaera',
+'yournick' => 'Erabiltzaile izena:',
+'badsig' => 'Baliogabeko sinadura; egiaztatu HTML etiketak.',
+'email' => 'E-posta',
+'prefs-help-email-enotif' => 'Helbide hau e-posta bidezko ohartarazpenak bidaltzeko ere erabiltzen da, hobespenetan gaituz gero.',
+'prefs-help-realname' => '* Benetako izena (aukerakoa): zehaztea erabakiz gero, zure lanarentzako atribuzio bezala balioko du.',
+'loginerror' => 'Errorea saioa hastean',
+'prefs-help-email' => '* E-posta (aukerakoa): Beste lankideak zurekin harremanetan jartzeko, zure nortasuna ezagutzera eman gabe.',
+'nocookiesnew' => 'Erabiltzaile kontua sortu da, baina ez da saioa hasi. {{SITENAME}}(e)k cookieak erabiltzen ditu saioekin eta ezgaituta dauzkazu. Gaitu itzazu mesedez, eta ondoren saiatu saioa hasten zure erabiltzaile izen eta pasahitz berriak erabiliz.',
+'nocookieslogin' => '{{SITENAME}}(e)k cookieak erabiltzen ditu saioekin eta ezgaituta dauzkazu. Gaitu itzazu mesedez, eta saiatu berriz.',
+'noname' => 'Ez duzu baliozko erabiltzaile izen bat zehaztu.',
+'loginsuccesstitle' => 'Saio hasiera egina',
+'loginsuccess' => "'''Saioa hasi duzu {{SITENAME}}(e)n \"$1\" izenarekin.'''",
+'nosuchuser' => 'Ez dago "$1" izena duen lankiderik. Mesedez, egiaztatu ondo idatzi duzun edo kontu berria sor ezazu.',
+'nosuchusershort' => 'Ez dago "$1" izena duen erabiltzailerik. Egiaztatu ongi idatzi duzula.',
+'nouserspecified' => 'Erabiltzaile izena zehaztu beharra daukazu.',
+'wrongpassword' => 'Pasahitza ez da zuzena. Saiatu berriz.',
+'wrongpasswordempty' => 'Pasahitza hutsik dago. Saiatu berriz.',
+'mailmypassword' => 'Pasahitza e-postaz bidali',
+'passwordremindertitle' => 'Pasahitzaren gogorarazpena {{SITENAME}}(e)tik',
+'passwordremindertext' => 'Norbaitek (zuk ziurrenik, $1 IP helbidetik)
+{{SITENAME}}(e)ko pasahitza zuri bidaltzea eskatu du ($4).
+"$2" erabiltzailearen pasahitza "$3" da orain.
+Saioa hasi eta pasahitza aldatu beharko zenuke orain.
+
+Eskaera hau beste norbaitek egin badu edo jada pasahitza gogoratu baduzu eta ez baduzu aldatu nahi, mezu honi kasurik ez egin eta jarraitu zuri pasahitz zaharra erabiltzen.',
+'noemail' => 'Ez dago "$1" erabiltzailearen e-posta helbiderik gordeta.',
+'passwordsent' => 'Pasahitz berria bidali da "$1" erabiltzailearen e-posta helbidera.
+Mesedez, saioa hasi jasotakoan.',
+'eauthentsent' => 'Egiaztapen mezu bat bidali da zehaztutako e-posta helbidera.
+Helbide horretara beste edozein mezu bidali aurretik, bertan azaltzen diren argibideak jarraitu behar dituzu, e-posta hori zurea dela egiaztatzeko.',
+'mailerror' => 'Errorea mezua bidaltzerakoan: $1',
+'acct_creation_throttle_hit' => 'Sentitzen dugu, $1 erabiltzaile kontu sortu dituzu dagoeneko. Ezin duzu gehiago sortu.',
+'emailauthenticated' => 'Zure e-posta helbidea egiaztatu zeneko data: $1.',
+'emailnotauthenticated' => 'Zure posta helbidea egiaztatu gabe dago. Ez da mezurik bidaliko hurrengo ezaugarrientzako.',
+'noemailprefs' => 'Zehaztu e-posta helbide bat ezaugarri hauek erabili ahal izateko.',
+'emailconfirmlink' => 'Egiaztatu zure e-posta helbidea',
+'invalidemailaddress' => 'Ezin da e-posta helbide hori ontzat eman baliogabeko formatua duela dirudielako. Mesedez, formatu egokia duen helbide bat zehaztu, edo hutsik utzi.',
+'accountcreated' => 'Kontua sortuta',
+'accountcreatedtext' => '$1 erabiltzaile kontua sortu egin da.',
+
+# Edit page toolbar
+'bold_sample'=>'Testu beltza',
+'bold_tip'=>'Testu beltza',
+'italic_sample'=>'Testu etzana',
+'italic_tip'=>'Testu etzana',
+'link_sample'=>'Loturaren izenburua',
+'link_tip'=>'Barne lotura',
+'extlink_sample'=>'http://www.adibidea.com loturaren izenburua',
+'extlink_tip'=>'Kanpo lotura (gogoratu http:// aurrizkia)',
+'headline_sample'=>'Goiburuko testua',
+'headline_tip'=>'2. mailako goiburukoa',
+'math_sample'=>'Formula hemen idatzi',
+'math_tip'=>'Formula matematikoa (LaTeX)',
+'nowiki_sample'=>'Formatu gabeko testua idatzi hemen',
+'nowiki_tip'=>'Ez egin jaramonik wiki formatuari',
+'image_sample'=>'Adibidea.jpg',
+'image_tip'=>'Txertatutako irudia',
+'media_sample'=>'Adibidea.ogg',
+'media_tip'=>'Media fitxategi lotura',
+'sig_tip'=>'Zure sinadura data eta orduarekin',
+'hr_tip'=>'Lerro horizontala (gutxitan erabili)',
+
+# Edit pages
+#
+'summary' => 'Laburpena',
+'subject' => 'Izenburua',
+'minoredit' => 'Hau aldaketa txikia da',
+'watchthis' => 'Orrialde hau jarraitu',
+'savearticle' => 'Orrialdea gorde',
+'preview' => 'Aurrebista',
+'showpreview' => 'Aurrebista erakutsi',
+'showlivepreview' => 'Zuzeneko aurrebista',
+'showdiff' => 'Aldaketak erakutsi',
+'anoneditwarning' => "'''Oharra:''' Ez duzu saioa hasi. Zure IP helbidea orrialde honetako historian gordeko da.",
+'missingsummary' => "'''Gogorarazpena:''' Ez duzu aldaketa laburpen bat zehaztu. Berriz ere gordetzeko aukeratzen baduzu, laburpen mezurik gordeko da.",
+'missingcommenttext' => 'Mesedez, iruzkin bat idatzi jarraian.',
+'blockedtitle' => 'Erabiltzailea blokeatuta dago',
+'blockedtext' => "Zure erabiltzaile izena edo IP helbidea $1(e)k blokeatu du. Emandako arrazoia honako hau da: ''$2'' $1 edo Wikipediako beste [[Wikipedia:Administratzaileak|administratzaile]] batekin harremanetan jarri beharko zinateke zure blokeoa eztabaidatzeko. Kontuan izan ezingo duzula \"Erabiltzaile honi e-posta bidali\" aukera erabili zure [[Aparteko:Preferences|Hobespenetan]] baliozko e-posta helbide bat definitu ezean. Zure IP helbidea $3 da. Mesedez, edozein kontsulta egiterakoan, helbide hori aipatu.",
+'blockedoriginalsource' => "Jarraian ikus daiteke '''$1'''(r)en kodea:",
+'blockededitsource' => "Jarraian ikus daitezke '''$1'''(e)n egin dituzun aldaketak:",
+'whitelistedittitle' => 'Saioa hastea beharrezkoa da aldaketak egiteko',
+'whitelistedittext' => '$1 behar duzu orrialdeak aldatu ahal izateko..',
+'whitelistreadtitle' => 'Saioa hastea beharrezkoa da irakurtzeko',
+'whitelistreadtext' => '[[Special:Userlogin|Saioa hasi]] behar duzu orrialdeak irakurtzeko.',
+'whitelistacctitle' => 'Ez daukazu kontu berri bat sortzeko baimenik',
+'whitelistacctext' => 'Wiki honetan kontu berriak sortu ahal izateko [[Special:Userlogin|saioa hasi]] eta baimena izatea beharrezko da.',
+'confirmedittitle' => 'E-posta egiaztatzea beharrezkoa da aldaketak egiteko',
+'confirmedittext' => 'Orrialdeetan aldaketak egin aurretik zure e-posta helbidea egiaztatu beharra daukazu. Mesedez, zehaztu eta egiaztatu zure e-posta helbidea [[Aparteko:Preferences|hobespenetan]].',
+'loginreqtitle' => 'Saioa hastea beharrezkoa',
+'loginreqlink' => 'saioa hasi',
+'loginreqpagetext' => 'Beste orrialde batzuk ikusteko $1 beharra daukazu..',
+'accmailtitle' => 'Pasahitza bidali da.',
+'accmailtext' => '"$1"(r)en pasahitza $2(e)ra bidali da.',
+'newarticle' => '(Berria)',
+'newarticletext' =>
+"Orrialde hau ez da existitzen oraindik. Orrialde sortu nahi baduzu, beheko koadroan idazten hasi zaitezke (ikus [[{{ns:help}}:Contents|laguntza orrialdea]] informazio gehiagorako). Hona nahi gabe etorri bazara, nabigatzaileko '''atzera''' botoian klik egin.",
+'anontalkpagetext' => "----''Honako hau konturik sortu ez edo erabiltzen ez duen erabiltzaile anonimo baten eztabaida orria da. Bere [[IP helbide]]a erabili beharko da beraz identifikatzeko. Erabiltzaile batek baino gehiagok IP bera erabil dezakete ordea. Erabiltzaile anonimoa bazara eta zurekin zerikusirik ez duten mezuak jasotzen badituzu, mesedez [[Aparteko:Userlogin|Izena eman edo saioa hasi]] etorkizunean horrelakoak gerta ez daitezen.''",
+'noarticletext' => 'Oraindik ez dago testurik orrialde honetan; beste orrialde batzuetan [[{{ns:special}}:Search/{{PAGENAME}}|bilatu dezakezu izenburu hau]] edo [{{fullurl:{{FULLPAGENAME}}|action=edit}} berau aldatu ere egin dezakezu].',
+'clearyourcache' => "'''Oharra:''' Gorde ondoren zure nabigatzailearen katxea ekidin beharko duzu aldaketak ikusteko. '''Mozilla / Firefox / Safari:''' ''Shift'' tekla sakatu birkargatzeko momentuan, edo ''Ctrl-Shift-R'' sakatu (''Cmd-Shift-R'' Apple Mac baten); '''IE:''' ''Ctrl'' tekla sakatu birkargatzeko momentuan, edo ''Ctrl-F5'' sakatu; '''Konqueror:''': Birkargatzeko klik egin, edo F5 sakatu, besterik ez; '''Opera''' erabiltzaileek ''Tresnak-Hobespenak'' atalera jo eta katxea garbitzeko aukera hautatu.",
+'usercssjsyoucanpreview' => '<strong>Laguntza:</strong> Zure CSS/JS berria gorde aurretik probatzeko \'Aurrebista erakutsi\' botoia erabili.',
+'usercsspreview' => '\'\'\'Ez ahaztu zure CSS kodea aurreikusten zabiltzala, oraindik ez dela gorde!\'\'\'',
+'userjspreview' => '\'\'\'Gogoratu zure JavaScript kodea probatu/aurreikusten zabiltzala, oraindik ez da gorde!\'\'\'',
+'userinvalidcssjstitle' => '\'\'\'Oharra:\'\'\' Ez da "$1" itxura existitzen. Kontuan izan .css eta .js fitxategi pertsonalizatuen izenak letra xehez idatzi behar direla; adibidez, Lankide:Adibide/monobook.css, eta ez Lankide:Adibide/Monobook.css.',
+'updated' => '(Eguneratua)',
+'note' => '<strong>Oharra:</strong>',
+'previewnote' => '<strong>Gogoratu hau aurreikusketa bat dela, beraz gorde egin beharko duzu!</strong>',
+'session_fail_preview' => '<strong>Sentitzen dugu! Ezin izan da zure aldaketa prozesatu, saioko datu batzuen galera dela-eta. Mesedez, saiatu berriz. Arazoak jarraitzen badu, saiatu saioa amaitu eta berriz hasten.</strong>',
+'previewconflict' => 'Aurreikuspenak aldaketen koadroan idatzitako testua erakusten du, gorde ondoren agertuko den bezala.',
+'session_fail_preview_html' => '<strong>Sentitzen dugu! Ezin izan dugu zure aldaketa burutu, saio datu galera bat medio.</strong>
+
+\'\'Wiki honek HTML kodea onartzen duenez, aurreikuspena ezgaituta dago JavaScript erasoak saihestu asmoz.\'\'
+
+<strong>Aldaketa saiakera hau zuzena baldin bada, saiatu berriro mesedez. Arazoak jarraitzen badu, saiatu saioa itxi eta berriz hasten.</strong>',
+'importing' => '$1 inportatzen',
+'editing' => '$1 aldatzen',
+'editinguser' => '<b>$1</b> erabiltzailea aldatzen',
+'editingsection' => '$1 aldatzen (atala)',
+'editingcomment' => '$1 aldatzen (iruzkina)',
+'editconflict' => 'Aldaketa gatazka: $1',
+'explainconflict' => 'Zu orrialdea aldatzen hasi ondoren beste norbaitek ere aldaketak egin ditu. Goiko testu koadroan ikus daiteke orrialdeak uneotan duen edukia. Zure aldaketak beheko testu koadroan ikus daitezke. Zure testua dagoenarekin elkartu beharko duzu. Orrialdea gordetzeko erabakitzen duzun unean goiko koadroko edukia <b>bakarrik</b> gordeko da.<br />',
+'yourtext' => 'Zure testua',
+'storedversion' => 'Gordetako bertsioa',
+'nonunicodebrowser' => "<strong>OHARRA: Zure nabigatzailea ez dator Unicode arauarekin bat. Artikuluak modu seguruan aldatu ahal izateko beste sistema bat gaitu da: ASCII ez diren karaktereak kode hamaseitar bezala agertuko dira aldaketa koadroan.</strong>",
+'editingold' => "<strong>KONTUZ: Artikulu honen bertsio zahar bat aldatzen ari zara. Gorde egiten baduzu, azkenengo aldaketa baino lehenagoko aldakuntzak, ezabatuak izango dira.</strong>",
+'yourdiff' => 'Ezberdintasunak',
+'copyrightwarning' => 'Kontuan izan {{SITENAME}}(e)n egindako ekarpen guztiak $2 baldintzapean argitaratzen direla (ikus $1 informazio gehiagorako). Zure testua banatzeko baldintza hauekin ados ez bazaude, ez ezazu bidali.<br />
+Era berean, bidaltzen ari zaren edukia zuk zeuk idatzitakoa dela edo jabetza publikoko edo baliabide aske batetik kopiatu duzula zin egin ari zara.
+<strong>EZ BIDALI BAIMENIK GABEKO COPYRIGHTDUN EDUKIRIK!</strong>',
+'copyrightwarning2' => 'Mesedez, kontuan izan {{SITENAME}}(e)n egindako ekarpen guztiak besteek aldatu edo ezabatu ditzaketela. Ez baduzu besteek aldaketak egitea nahi, ez ezazu bidali.<br />
+Era berean, bidaltzen ari zaren edukia zuk zeuk idatzitakoa dela edo jabetza publikoko edo baliabide aske batetik kopiatu duzula zin egin ari zara (ikus $1 informazio gehiagorako).
+<strong>EZ BIDALI BAIMENIK GABEKO COPYRIGHTDUN EDUKIRIK!</strong>',
+'longpagewarning' => '<strong>OHARRA: Orrialde honek $1 kilobyteko tamaina du; nabigatzaile batzuek arazoak izan litzakete 32kb-tik gorako testuekin. Mesedez, saiatu orrialdea atal txikiagoetan banatzen.</strong>',
+'longpageerror' => "<strong>ERROREA: Bidali duzun testuak $1 kilobyteko luzera du, eta $2 kilobyteko maximoa baino luzeagoa da. Ezin da gorde.</strong>",
+'readonlywarning' => '<strong>OHARRA: Datu-basea blokeatu egin da mantenu lanak burutzeko, beraz ezingo dituzu orain zure aldaketak gorde. Testua fitxategi baten kopiatu dezakezu, eta beranduago erabiltzeko gorde.</strong>',
+'protectedpagewarning' => "<strong>OHARRA: Orri hau blokeaturik dago, administratzaileek soilik eraldatu dezakete. Ikusi [[Project:Babestutako orria|Babestutako Orria]].</strong>",
+'semiprotectedpagewarning' => "<strong>Oharra: Orrialde hau erregistratutako erabiltzaileek bakarrik aldatzeko babestuta dago.</strong>",
+'templatesused' => 'Orrialde honetan erabiltzen diren txantiloiak:',
+'edittools' => '<!-- Hemen jarritako testua aldaketa eta igoera formularioen azpian agertuko da. -->',
+'nocreatetitle' => 'Orrialdeak sortzea mugatuta',
+'nocreatetext' => 'Gune honek orrialde berriak sortzeko gaitasuna mugatu du. Atzera egin dezakezu existitzen den orrialde bat aldatzeko, edo [[Special:Userlogin|saio hasi edo kontua sortu]].',
+'cantcreateaccounttitle' => 'Ezin izan da kontua sortu',
+'cantcreateaccounttext' => 'IP helbide honetatik (<b>$1</b>) izena emateko aukera blokeatu egin da. Baliteke zauden eskolan edo Interneteko Zerbitzu Hornitzailean gertatuko bandalismoren batengatik gertatzea hau.',
+
+# History pages
+#
+'revhistory' => 'Berrikuspenen historiala',
+'viewpagelogs' => 'Orrialde honen erregistroak ikusi',
+'nohistory' => 'Orrialde honek ez dauka aldaketa historiarik.',
+'revnotfound' => 'Ezin izan da berrikuspena aurkitu',
+'revnotfoundtext' => "Ezin izan da eskatzen ari zaren orrialdearen berrikuspen zaharra aurkitu. Mesedez, egiaztatu orrialde honetara iristeko erabili duzun URLa.",
+'loadhist' => 'Orrialdearen historia kargatzen',
+'currentrev' => 'Oraingo berrikuspena',
+'revisionasof' => '$1(e)ko berrikuspena',
+'previousrevision' => 'â†Berrikuspen zaharragoa',
+'nextrevision' => 'Berrikuspen berriagoa→',
+'currentrevisionlink' => 'Oraingo berrikuspena ikusi',
+'cur' => 'orain',
+'next' => 'hurrengoa',
+'last' => 'azkena',
+'orig' => 'orij',
+'histlegend' => 'Diff hautapena: hautatu alderatu nahi dituzun bi bertsioak eta beheko botoian klik egin.<br />
+Legenda: (orain) = oraingo bertsioarekiko ezberdintasuna,
+(azkena) = aurreko bertsioarekiko ezberdintasuna, t = aldaketa txikia.',
+'deletedrev' => '[ezabatuta]',
+'histfirst' => 'Lehena',
+'histlast' => 'Azkena',
+'rev-deleted-comment' => '(iruzkina ezabatu da)',
+'rev-deleted-user' => '(erabiltzailea ezabatu da)',
+'rev-deleted-text-permission' => '<div class="mw-warning plainlinks">
+Orrialdearen berrikuspen hau artxibo publikoetatik kendu da. Xehetasunak [{{fullurl:Special:Log/delete|page={{PAGENAMEE}}}} ezabaketa erregistroan] ikus daitezke.
+</div>',
+'rev-deleted-text-view' => '<div class="mw-warning plainlinks">
+Orrialdearen berrikuspen hau artxibo publikoetatik kendu da. Guneko administratzaile bezala ikusteko aukera daukazu ordea; xehetasunak [{{fullurl:Special:Log/delete|page={{PAGENAMEE}}}} ezabaketa erregistroan] ikus ditzakezu.
+</div>',
+'rev-delundel' => 'erakutsi/ezkutatu',
+
+'history-feed-title' => 'Berrikuspenen historia',
+'history-feed-description' => 'Wikiko orrialde honen berrikuspenen historia',
+'history-feed-item-nocomment' => 'nork: $1 noiz: $2', # user at time
+'history-feed-empty' => 'Eskatutako orrialdea ez da existitzen. Baliteke wikitik ezabatu edo izenez aldatu izana. Saiatu [[Special:Search|wikian zerikusia duten orrialdeak bilatzen]].',
+
+# Revision deletion
+#
+'revisiondelete' => 'Berrikuspenak ezabatu/leheneratu',
+'revdelete-nooldid-title' => 'Helburu berrikuspenik ez',
+'revdelete-nooldid-text' => 'Ez d(it)uzu eragiketa hau burutzeko helburu berrikuspena(k) zehaztu.',
+'revdelete-selected' => '[[:$1]](r)en hautatutako berrikuspena:',
+'revdelete-text' => "Ezabatutako berrikuspenek orrialdearen historian agertzen jarraituko dute, baina bere edukiak ez dira publikoki eskuratu ahal izango.
+
+Wiki honetako beste administratzaileek ezkutuko eduki hau ikusteko aukera izango dute, eta baita leheneratzeko ere, gunearen arduradunek beste mugapenen bat ezartzen ez badute behintzat.",
+'revdelete-legend' => 'Berrikuspen mugapenak ezarri:',
+'revdelete-hide-text' => 'Berrikuspenaren testua ezkutatu',
+'revdelete-hide-comment' => 'Aldaketaren iruzkina ezkutatu',
+'revdelete-hide-user' => 'Egilearen erabiltzaile izena/IPa ezkutatu',
+'revdelete-hide-restricted' => 'Mugapen hauek administratzaileei zein besteei aplikatu',
+'revdelete-log' => 'Erregistroaren iruzkina:',
+'revdelete-submit' => 'Hautatutako berrikuspenari aplikatu',
+'revdelete-logentry' => '[[$1]](r)entzako berriskupen ikusgaitasuna aldatu da',
+
+# Diffs
+#
+'difference' => '(Bertsioen arteko ezberdintasunak)',
+'loadingrev' => 'diff-entzako berrikuspena eskuratzen',
+'lineno' => "$1. lerroa:",
+'editcurrent' => 'Orrialdearen oraingo bertsioa aldatu',
+'selectnewerversionfordiff' => 'Hautatu bertsio berriago bat konparaketa egiteko',
+'selectolderversionfordiff' => 'Hautatu bertsio zaharrago bat konparaketa egiteko',
+'compareselectedversions' => 'Hautatutako bertsioak alderatu',
+
+# Search results
+#
+'searchresults' => 'Bilaketaren emaitzak',
+'searchresulttext' => "{{SITENAME}}(e)n bilaketak egiteko informazio gehiagorako, ikus [[Project:Bilaketa|{{SITENAME}}(e)n bilatzen]].",
+'searchsubtitle' => "'''[[:$1]]''' bilatu duzu",
+'searchsubtitleinvalid' => "'''$1''' bilatu duzu",
+'badquery' => 'Gaizki osatutako bilaketa katea',
+'badquerytext' => 'Ezin izan dugu zure kontsulta burutu. Baliteke hau hiru letra baino laburragoa den hitz bat bilatzen saiatzeagatik izatea, eta hori ezin da egin. Litekeena da ere adierazpena gaizki idatzi izana, adibidez "euskal euskal herria". Saiatu beste kontsulta batekin mesedez.',
+'matchtotals' => "\"$1\" bilaketak $2 orrialde izenburu eta $3 orrialderen testu aurkitu ditu.",
+'noexactmatch' => "'''Ez dago \"$1\" izenburua duen orrialderik.''' [[:$1|Orrialde hau]] sortu dezakezu.",
+'titlematches' => 'Emaitzak artikuluen izenburuetan',
+'notitlematches' => 'Ez dago bat datorren orrialde izenbururik',
+'textmatches' => 'Emaitza orrialde testuetan',
+'notextmatches' => 'Ez dago bat datorren orrialde testurik',
+'prevn' => "aurreko $1ak",
+'nextn' => "hurrengo $1ak",
+'viewprevnext' => "Ikusi ($1) ($2) ($3).",
+'showingresults' => "Jarraian <b>$1</b> emaitz ikus daitezke, <b>$2</b>.etik hasita.",
+'showingresultsnum' => "Hasieran #<b>$2</b> duten <b>$3</b> emaitza erakusten dira jarraian.",
+'nonefound' => "'''Oharra''': Arrakastarik gabeko bilaketen arrazoi nagusietako bat \"dute\" eta \"da\" bezalako hitz arruntak bilatzea izan ohi da, edo baita bilaketan hitz gehiegi zehazteagatik ere (emaitzetan hitz guztiak dituzten emaitzak baino ez dira azalduko).",
+'powersearch' => 'Bilatu',
+'powersearchtext' => "Izen-tarte hauetan bilatu:<br />$1<br />$2 Birzuzenketen zerrenda<br />$3 $9 bilatu",
+'searchdisabled' => '{{SITENAME}}(e)n ezgaituta dago bilaketa. Dena dela, Google erabiliz ere egin dezakezu bilaketa. Kontuan izan bertan dituzten {{SITENAME}}(e)ko emaitzak zaharkituta egon daitezkeela.',
+
+'blanknamespace' => '(Nagusia)',
+
+# Preferences page
+#
+'preferences' => 'Hobespenak',
+'mypreferences' => 'Nire hobespenak',
+'prefsnologin' => 'Saioa hasi gabe',
+'prefsnologintext' => "[[Special:Userlogin|Saioa hasi behar duzu]] zure hobespenak ezartzeko.",
+'prefsreset' => 'Hobespenak hasieratu egin dira.',
+'qbsettings' => 'Laster-barra',
+'changepassword' => 'Pasahitza aldatu',
+'skin' => 'Itxura',
+'math' => 'Math',
+'dateformat' => 'Data formatua',
+'datedefault' => 'Hobespenik ez',
+'datetime' => 'Data eta ordua',
+'math_failure' => 'Interpretazio errorea',
+'math_unknown_error' => 'errore ezezaguna',
+'math_unknown_function' => 'funtzio ezezaguna',
+'math_lexing_error' => 'errore lexikoa',
+'math_syntax_error' => 'sintaxi errorea',
+'math_image_error' => 'PNG bilakatze errorea; egiaztatu latex, dvips, gs eta convert ongi instalatuta daudela',
+'math_bad_tmpdir' => 'Ezin da math direktorio tenporala sortu edo bertan idatzi',
+'math_bad_output' => 'Ezin da math direktorioa sortu edo bertan idatzi',
+'math_notexvc' => 'texvc exekutagarria falta da; mesedez, ikus math/README konfiguratzeko.',
+'prefs-personal' => 'Erabiltzaile profila',
+'prefs-rc' => 'Azken aldaketak',
+'prefs-watchlist' => 'Jarraipen zerrenda',
+'prefs-watchlist-days' => 'Jarraipen zerrendan erakutsi beharreko egun kopurua:',
+'prefs-watchlist-edits' => 'Jarraipen zerrendan erakutsi beharreko aldaketa kopurua:',
+'prefs-misc' => 'Denetarik',
+'saveprefs' => 'Gorde',
+'resetprefs' => 'Hasieratu',
+'oldpassword' => 'Pasahitz zaharra:',
+'newpassword' => 'Pasahitz berria:',
+'retypenew' => 'Pasahitz berria berriz idatzi:',
+'textboxsize' => 'Aldatzen',
+'rows' => 'Lerroak:',
+'columns' => 'Zutabeak:',
+'searchresultshead' => 'Bilaketa',
+'resultsperpage' => 'Emaitza orrialdeko:',
+'contextlines' => 'Lerro emaitzako:',
+'contextchars' => 'Lerro bakoitzeko karaktere kopurua:',
+'stubthreshold' => 'Zirriborroak erakusteko muga:',
+'recentchangescount' => 'Aldaketa berrietako izenburu kopurua:',
+'savedprefs' => 'Zure hobespenak gorde egin dira.',
+'timezonelegend' => 'Ordu zona',
+'timezonetext' => 'Zure ordu lokala eta zerbitzariaren orduaren (UTC) arteko ezberdintasuna.',
+'localtime' => 'Ordu lokala',
+'timezoneoffset' => 'Ezberdintasuna¹',
+'servertime' => 'Zerbitzariko ordua',
+'guesstimezone' => 'Nabigatzailetik jaso',
+'allowemail' => 'Beste erabiltzaileengandik e-posta mezuak jasotzea gaitu',
+'defaultns' => 'Izen-tarte hauetan bilatu lehenetsitzat:',
+'default' => 'lehenetsia',
+'files' => 'Fitxategiak',
+
+# User rights
+'userrights-lookup-user' => 'Erabiltzaile taldeak kudeatu',
+'userrights-user-editname' => 'Erabiltzaile izena idatzi:',
+'editusergroup' => 'Erabiltzaile taldeak editatu',
+
+'userrights-editusergroup' => 'Erabiltzaile taldeak editatu',
+'saveusergroups' => 'Erabiltzaile taldeak gorde',
+'userrights-groupsmember' => 'Partaide da hemen:',
+'userrights-groupsavailable' => 'Existitzen diren taldeak:',
+'userrights-groupshelp' => 'Hautatu erabiltzaileari gehitu edo kendu nahi dizkiozun taldeak. Deshautatutako taldeak ez dira aldatuko. Talde bat deshautatu dezakezu CTRL + Ezker Klika eginez',
+
+# Groups
+'group' => 'Taldea:',
+'group-bot' => 'Bot-ak',
+'group-sysop' => 'Administratzaileak',
+'group-bureaucrat' => 'Burokratak',
+'group-all' => '(guztiak)',
+
+'group-bot-member' => 'Bot',
+'group-sysop-member' => 'Administratzaile',
+'group-bureaucrat-member' => 'Burokrata',
+
+'grouppage-bot' => '{{ns:project}}:Bot-ak',
+'grouppage-sysop' => '{{ns:project}}:Administratzaileak',
+'grouppage-bureaucrat' => '{{ns:project}}:Burokratak',
+
+# Recent changes
+#
+'changes' => 'aldaketak',
'recentchanges' => 'Aldaketa berriak',
-'recentchangeslinked' => 'Lotutako orrien aldaketak',
-'remembermypassword' => 'Gogoratu pasahitza saio tartean (cookie gorde).',
-'savearticle' => 'Orria gorde',
-'search' => 'Bilatu',
-'searchbutton' => 'Bilatu',
-'searchresults' => 'Bilaketaren emaitza',
-'shortpages' => 'Artikulu laburrak',
-'show' => 'erakutsi',
-'showpreview' => 'Aurrebista erakutsi',
-'showtoc' => 'erakutsi',
-'sitestats' => 'Gunearen estatistikak',
-'sitestatstext' => 'Datu-basean guztira <b>$1</b> orri daude; eztabaidatzeko, wikipedari buruzko orriak, \'\'redirect\'\'-k eta artikulu laburrak barne hartzen.
-Horiek baztertzen, <b>$2</b> artikulu dira datu-basean.<p>
-There have been a total of <b>$3</b> page views, and <b>$4</b> page edits
-since the software was upgraded (July 20, 2002).
-That comes to <b>$5</b> average edits per page, and <b>$6</b> views per edit.',
-'sitesupport' => 'Emariak',
-'specialpages' => 'Orri bereziak',
-'statistics' => 'Estatistikak',
-'summary' => 'Laburpen',
-'talk' => 'Eztabaida',
-'talkpage' => 'Eztabaida orri honen gainean',
-'toc' => 'Aurkibidea',
-'toolbox' => 'Lanabesak',
-'undelete' => 'Orria ezabatuta berreskuratu',
-'unusedimages' => 'Irudi umezurtzak',
-'userexists' => 'Beste lankide erabiltzen ari den izena eman duzu. Mesedez, beste izen aukeratu.',
-'userlogin' => 'Izena eman edo saio berria hasi',
-'userstats' => 'Lankideen estatistikak',
-'userstatstext' => '<b>$1</b> lankideek izena eman dute.
-<b>$2</b> administratzaileak dira (ikusi $3).',
-'viewprevnext' => 'Erakutsi ($1) ($2) ($3).',
-'viewtalkpage' => 'Eztabaida erakutsi',
-'wantedpages' => 'Orri eskatutakoenak',
-'watchlist' => 'Segimendu zerrenda',
-'watchlistcontains' => 'Zure segimendu zerrenda $1 orri ditu.',
-'watchthis' => 'Artikulua zelatatu',
-'watchthispage' => 'Orria zelatatu',
-'welcomecreation' => '<h2>Ongi etorri, $1!</h2><p>Zure kontua sotu duzu.
-Ez ahaztu zure hobespenak pertsonalizatu.',
-'whatlinkshere' => 'Honekin lotzen diren orriak',
-'projectpage' => 'Erakutsi Meta-orria',
-'wrongpassword' => 'Pasahitza ez da zuzena. Saiatu berriro.',
-'yourdiff' => 'Desberdintasunak',
-'youremail' => 'Zure helbide elektronikoa (e-mail)*',
-'yourname' => 'Zure erabiltzaile-izena',
-'yournick' => 'Zure gaitzizena (sinatzeko)',
-'yourpassword' => 'Zure pasahitza',
-'yourpasswordagain' => 'Idatzi berriro pasahitza',
-'yourrealname' => 'Zure benetako izena*',
-'yourtext' => 'Zure testua',
+'recentchangestext' => 'Orrialde honetan wiki honetan egindako azken aldaketak erakusten dira.',
+'rcnote' => "Jarraian azken <strong>$2</strong> egunetako azken <strong>$1</strong> aldaketak erakusten dira, $3 eguneratuta.",
+'rcnotefrom' => "Jarraian azaltzen diren aldaketak data honetatik aurrerakoak dira: <b>$2</b> (gehienez <b>$1</b> erakusten dira).",
+'rclistfrom' => "Erakutsi $1 ondorengo aldaketa berriak",
+'rcshowhideminor' => '$1 aldaketa txikiak',
+'rcshowhidebots' => '$1 bot-ak',
+'rcshowhideliu' => '$1 erabiltzaile erregistratuak',
+'rcshowhideanons' => '$1 anonimoak',
+'rcshowhidepatr' => '$1 patruilatutako aldaketak',
+'rcshowhidemine' => '$1 nire aldaketak',
+'rclinks' => "Erakutsi azken $1 aldaketak $2 egunetan.<br>$3",
+'diff' => 'ezb',
+'hist' => 'hist',
+'hide' => 'Ezkutatu',
+'show' => 'Erakutsi',
+'minoreditletter' => 't',
+'newpageletter' => 'B',
+'boteditletter' => 'b',
+'sectionlink' => '→',
+'number_of_watching_users_pageview' => '[$1 jarraitzaile]',
+'rc_categories' => 'Kategorietara mugatu ("|" karaktereaz banandu)',
+'rc_categories_any' => 'Edozein',
-);
+# Upload
+#
+'upload' => 'Fitxategia igo',
+'uploadbtn' => 'Fitxategia igo',
+'reupload' => 'Berriz igo',
+'reuploaddesc' => 'Igotzeko formulariora itzuli.',
+'uploadnologin' => 'Saioa hasi gabe',
+'uploadnologintext' => "Fitxategiak igotzeko [[Aparteko:Userlogin|saioa hasi]] behar duzu.",
+'upload_directory_read_only' => 'Web zerbitzariak ez dauka igoera direktorioan ($1) idazteko baimenik.',
+'uploaderror' => 'Errorea igotzerakoan',
+'uploadtext' => "Fitxategiak igotzeko beheko formularioa erabil dezakezu. Aurretik igotako irudiak ikusi edo bilatzeko [[Special:Imagelist|igotako fitxategien zerrendara]] jo. Igoerak eta ezabatutakoak [[Special:Log/upload|igoera erregistroan]] zerrendatzen dira.
+
+Orrialde baten irudi bat txertatzeko, erabili kode hauetako bat:
+'''<nowiki>[[{{ns:image}}:Fitxategia.jpg]]</nowiki>''',
+'''<nowiki>[[{{ns:image}}:Fitxategia.png|testu alternatiboa]]</nowiki>''' edo
+'''<nowiki>[[{{ns:media}}:Fitxategia.ogg]]</nowiki>''' irudia zuzenean erabiltzeko.",
+'uploadlog' => 'igoera erregistroa',
+'uploadlogpage' => 'Igoera erregistroa',
+'uploadlogpagetext' => 'Jarraian azken igoeren zerrenda ikus daiteke.',
+'filename' => 'Fitxategi izena',
+'filedesc' => 'Laburpena',
+'fileuploadsummary' => 'Laburpena:',
+'filestatus' => 'Copyright egoera',
+'filesource' => 'Iturria',
+'copyrightpage' => "Project:Eskubideak",
+'copyrightpagename' => "{{SITENAME}} copyright",
+'uploadedfiles' => 'Igotako fitxategiak',
+'ignorewarning' => 'Oharra ezikusi eta fitxategia gorde.',
+'ignorewarnings' => 'Edozein ohar ezikusi.',
+'minlength' => 'Fitxategi izenak hiru karaktere izan behar ditu gutxienez.',
+'illegalfilename' => '"$1" fitxategiaren izenak orrialdeen izenburuetan erabili ezin diren karaktereak ditu. Mesedez, fitxategiari izena aldatu eta saiatu berriz igotzen.',
+'badfilename' => 'Irudiaren izena aldatu da: "$1".',
+'badfiletype' => "\".$1\" ez da gomendatutako irudi fitxategi formatua.",
+'largefile' => 'Ez da gomendagarria fitxategiak $1 bytetik gorakoak izatea; fitxategi honek $2 byte ditu',
+'largefileserver' => 'Fitxategi hau zerbitzariak baimentzen duena baino handiagoa da.',
+'emptyfile' => 'Badirudi igotzen ari zaren fitxategia hutsik dagoela. Mesedez, egiaztatu fitxategi hori dela igo nahi duzuna.',
+'fileexists' => 'Badago izen hori daukan fitxategi bat; mesedez, ikusi existitzen den $1 fitxategia aldatu nahi duzun egiaztatzeko.',
+'fileexists-forbidden' => 'Badago izen hori daukan fitxategi bat; mesedez, atzera itzuli eta igo fitxategia izen ezberdin batekin. [[Image:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'Badago izen hori daukan fitxategi bat elkarbanatutako fitxategi-biltegian; mesedez, atzera itzuli eta igo fitxategia izen ezberdin batekin. [[Image:$1|thumb|center|$1]]',
+'successfulupload' => 'Igoera arrakastatsua',
+'fileuploaded' => "$1 fitxategia igo da. Mesedez, jarraitu hurrengo lotura hau: jo $2 deskribapen orrialdera eta fitxategiaren inguruko informazioa osatu, hala nola bere jatorria, noiz sortu den eta nork, eta fitxategiaren inguruan jakin beharko litzatekeen beste edozein datu. Hau irudi bat bada, honela txertatu dezakezu: <tt><nowiki>[[Irudi:$1|thumb|Deskribapena]]</nowiki></tt>",
+'uploadwarning' => 'Igotzeko oharra',
+'savefile' => 'Fitxategia gorde',
+'uploadedimage' => "\"[[$1]]\" igo da",
+'uploaddisabled' => 'Igoerak ezgaituta daude',
+'uploaddisabledtext' => 'Fitxategiak igotzea ezgaituta dago wiki honetan.',
+'uploadscripted' => 'Fitxategi honek web zerbitzariak modu ezegokian interpretatu lezakeen HTML edo script kodea dauka.',
+'uploadcorrupt' => 'Fitxategiak akatsak ditu edo luzapena ezegokia da. Mesedez, egiaztatu fitxategia ondo dagoela eta berriz igo.',
+'uploadvirus' => 'Fitxategiak birusa dauka! Xehetasunak: $1',
+'sourcefilename' => 'Iturri-fitxategiaren izena',
+'destfilename' => 'Helburu fitxategi izena',
+'watchthisupload' => 'Orrialde hau jarraitu',
+'filewasdeleted' => 'Izen hau duen fitxategi bat igo eta ezabatu da jada. $1 aztertu beharko zenuke berriz igo aurretik.',
+
+'license' => 'Lizentzia',
+'nolicense' => 'Hautatu gabe',
+'upload_source_url' => ' (baliozko URL publikoa)',
+'upload_source_file' => ' (zure ordenagailuko fitxategi bat)',
+
+# Image list
+#
+'imagelist' => 'Fitxategien zerrenda',
+'imagelisttext' => "Jarraian duzu $2(e)z ordenatutako {{plural:$1|fitxategi baten|'''$1''' fitxategiren}} zerrenda.",
+'imagelistforuser' => "Honek $1(e)k igotako irudiak bakarrik erakusten ditu.",
+'getimagelist' => 'fitxategi zerrenda jasotzen',
+'ilsubmit' => 'Bilatu',
+'showlast' => 'Erakutsi azken $1 fitxategiak $2 ordenatuta.',
+'byname' => 'izenaren arabera',
+'bydate' => 'dataren arabera',
+'bysize' => 'tamainaren arabera',
+'imgdelete' => 'ezb',
+'imgdesc' => 'desk',
+'imgfile' => 'fitxategia',
+'imglegend' => 'Legenda: (desk) = fitxategiaren deskribapena erakutsi/aldatu.',
+'imghistory' => 'Fitxategiaren historia',
+'revertimg' => 'des',
+'deleteimg' => 'ezb',
+'deleteimgcompletely' => 'Fitxategi honen bertsio guztiak ezabatu',
+'imghistlegend' => 'Legenda: (orain) = oraingo fitxategia, (ezab) = ezabatu bertsio zahar hau, (ber) = bertsio zahar honetara itzuli. <br /><i>Dataren gainean klik egin egun hartan igotako fitxategia ikusteko</i>.',
+'imagelinks' => 'Loturak',
+'linkstoimage' => 'Hurrengo orrialdeek dute fitxategi honetarako lotura:',
+'nolinkstoimage' => 'Ez dago fitxategi honetara lotura egiten duen orrialderik.',
+'sharedupload' => 'Fitxategi hau elkarbanatutako igoera bat da eta beste proiektuek ere erabil dezakete.',
+'shareduploadwiki' => 'Informazio gehiagorako $1 ikusi mesedez.',
+'shareduploadwiki-linktext' => 'fitxategiaren deskribapen orrialdea',
+'noimage' => 'Ez dago fitxategirik izen honekin, $1 dezakezu nahi baduzu.',
+'noimage-linktext' => 'igo egin',
+'uploadnewversion-linktext' => 'Fitxategi honen bertsio berri bat igo',
+'imagelist_date' => 'Data',
+'imagelist_name' => 'Izena',
+'imagelist_user' => 'Erabiltzailea',
+'imagelist_size' => 'Tamaina (byte)',
+'imagelist_description' => 'Deskribapena',
+'imagelist_search_for' => 'Irudiaren izenagatik bilatu:',
+
+# Mime search
+#
+'mimesearch' => 'MIME bilaketa',
+'mimetype' => 'MIME mota:',
+'download' => 'deskargatu',
+
+# Unwatchedpages
+#
+'unwatchedpages' => 'Jarraitu gabeko orrialdeak',
+
+# List redirects
+'listredirects' => 'Birzuzenketen zerrenda',
+
+# Unused templates
+'unusedtemplates' => 'Erabili gabeko txantiloiak',
+'unusedtemplatestext' => 'Orrialde honetan beste edozein orrialdetan erabiltzen ez diren txantiloi izen-tarteko orrialdeak zerrendatzen dira. Ez ahaztu txantiloietara egon daitezkeen loturak egiaztatzeaz ezabatu aurretik.',
+'unusedtemplateswlh' => 'beste loturak',
+
+# Random redirect
+'randomredirect' => 'Ausazko birzuzenketa',
+
+# Statistics
+#
+'statistics' => 'Estatistikak',
+'sitestats' => '{{SITENAME}}(e)ko estatistikak',
+'userstats' => 'Erabiltzaile estatistikak',
+'sitestatstext' => "Datu-basean guztira '''$1''' orrialde daude.
+Kopuru horretan \"eztabaida\" orrialdeak, {{SITENAME}}(r)i buruzko orrialdeak, zirriborroak, birzuzenketak eta eduki orrialde bezala kontsideratu ezin diren beste batzuk ere kontuan hartzen dira. Horiek baztertuz, '''$2''' orrialde daude ziurrenik edukia daukatenak.
+
+'''$8''' fitxategi igo dira.
+
+Guztira '''$3''' orrialde irakurketa egon dira, eta '''$4''' orrialde aldaketa wikia abian jarri zenez geroztik.
+Horren arabera, '''$5''' aldaketa egin dira orrialde bakoitzeko bataz beste, eta aldaketa bakoitzeko '''$6''' irakurketa egin dira.
+
+[http://meta.wikimedia.org/wiki/Help:Job_queue Atazen zerrendaren] luzera '''$7'''(e)koa da.",
+'userstatstext' => "'''$1''' erabiltzaile daude izen emanda, horietatik '''$2''' (edo '''$4%''') $5 direlarik.",
+'statistics-mostpopular' => 'Orrialde bisitatuenak',
+
+'disambiguations' => 'Argipen orrialdeak',
+'disambiguationspage' => 'Template:argipen',
+'disambiguationstext' => "Jarraian zerrendatutako orrialdeek <i>argipen orrialde</i> baterako lotura daukate. Horrez ordez, lotura egokia ipini beharko litzaieke.<br /> Orrialde bat argipen bezala antzematen da $1(e)tik lotura baldin badauka.<br />Beste izen-tarte batzutatik datozen loturak <i>ez</i> dira erakusten.",
+
+'doubleredirects' => 'Birzuzenketa bikoitzak',
+'doubleredirectstext' => "Lerro bakoitzean lehen eta bigarren birzuzenketetarako loturak ikus daitezke, eta baita edukia daukan edo eduki beharko lukeen orrialderako lotura ere. Lehen birzuzenketak azken honetara zuzendu beharko luke.",
+
+'brokenredirects' => 'Hautsitako birzuzenketak',
+'brokenredirectstext' => 'Jarraian zerrendatutako birzuzenketak existitzen ez diren orrialdeetara zuzenduta daude:',
+
+# Miscellaneous special pages
+#
+'nbytes' => '{{PLURAL:$1|byte 1|$1 byte}}',
+'ncategories' => '{{PLURAL:$1|kategoria 1|$1 kategoria}}',
+'nlinks' => '{{PLURAL:$1|lotura 1|$1 lotura}}',
+'nmembers' => '{{PLURAL:$1|partaide 1|$1 partaide}}',
+'nrevisions' => '{{PLURAL:$1|berrikuspen 1|$1 berrikuspen}}',
+'nviews' => '{{PLURAL:$1|ikusketa 1|$1 ikusketa}}',
+
+'lonelypages' => 'Orrialde umezurtzak',
+'lonelypagestext' => 'Jarraian zerrendatutako orrialdeek ez daukate wikiko beste orrialdeetatik loturarik.',
+'uncategorizedpages' => 'Kategorizatu gabeko orrialdeak',
+'uncategorizedcategories' => 'Kategorizatu gabeko kategoriak',
+'uncategorizedimages' => 'Kategorizatu gabeko irudiak',
+'unusedcategories' => 'Erabili gabeko kategoriak',
+'unusedimages' => 'Erabili gabeko fitxategiak',
+'popularpages' => 'Orrialde bisitatuenak',
+'wantedcategories' => 'Eskatutako kategoriak',
+'wantedpages' => 'Eskatutako orrialdeak',
+'mostlinked' => 'Gehien lotutako orrialdeak',
+'mostlinkedcategories' => 'Gehien lotutako kategoriak',
+'mostcategories' => 'Sailkapenean kategoria gehien dituzten orrialdeak',
+'mostimages' => 'Gehien lotutako irudiak',
+'mostrevisions' => 'Berrikuspen gehien dituzten orrialdeak',
+'allpages' => 'Orrialde guztiak',
+'prefixindex' => 'Aurrizkien aurkibidea',
+'randompage' => 'Ausazko orrialdea',
+'shortpages' => 'Orrialde laburrak',
+'longpages' => 'Orrialde luzeak',
+'deadendpages' => 'Orrialde itsuak',
+'deadendpagestext' => 'Jarraian zerrendatutako orrialdeek ez daukate wikiko beste edozein orrialdetarako loturarik.',
+'listusers' => 'Erabiltzaileen zerrenda',
+'specialpages' => 'Aparteko orrialdeak',
+'spheading' => 'Erabiltzaile guztientzako aparteko orrialdeak',
+'restrictedpheading' => 'Mugatutako aparteko orrialdeak',
+'recentchangeslinked' => 'Lotutako orrialdeen aldaketak',
+'rclsub' => "(\"$1\"(e)tik lotutako orrialdeetara)",
+'newpages' => 'Orrialde berriak',
+'newpages-username' => 'Erabiltzaile izena:',
+'ancientpages' => 'Orrialde zaharrenak',
+'intl' => 'Hizkuntzen arteko loturak',
+'move' => 'Move',
+'movethispage' => 'Orrialde hau mugitu',
+'unusedimagestext' => '<p>Mesedez, kontuan izan beste webgune batzutatik URL zuzena erabiliz lotura izan dezaketela irudira, eta kasu horretan ez lirateke hemengo zerrendetan azalduko.</p>',
+'unusedcategoriestext' => 'Hurrengo kategoria orrialde guztiak datu-basean existitzen dira, baina ez du inongo orrialde edo kategoriak erabiltzen.',
+
+'booksources' => 'Iturri liburuak',
+'categoriespagetext' => 'Hurrengo kategoriak daude wiki honetan:',
+'data' => 'Datuak',
+'userrights' => 'Erabiltzaile baimenen kudeaketa',
+'groups' => 'Erabiltzaile taldeak',
+
+'booksources-text' => "Jarraian liburu berri eta erabiliak saltzen dituzten guneetarako loturen zerrenda bat ikus dezakezu, bilatzen ari zaren liburu horientzako informazio gehigarria aurkitzeko lagungarria izan daitekeena:",
+'isbn' => 'ISBN',
+'alphaindexline' => "$1(e)tik $2(e)raino",
+'version' => 'Bertsioa',
+'log' => 'Erregistroak',
+'alllogstext' => 'Igoera, ezabaketa, babes, blokeaketa eta administratzaile erregistroen erakusketa. Zerrenda mugatu dezakezu erregistro mota, erabiltzaile izena edo eragindako orrialdea aukeratuz.',
+'logempty' => 'Ez dago emaitzarik erregistroan.',
+
+
+# Special:Allpages
+'nextpage' => 'Hurrengo orrialdea ($1)',
+'allpagesfrom' => 'Honela hasten diren orrialdeak erakutsi:',
+'allarticles' => 'Artikulu guztiak',
+'allinnamespace' => 'Orrialde guztiak ($1 izen-tartea)',
+'allnotinnamespace' => 'Orrialde guztiak ($1 izen-tartean ez daudenak)',
+'allpagesprev' => 'Aurrekoa',
+'allpagesnext' => 'Hurrengoa',
+'allpagessubmit' => 'Joan',
+'allpagesprefix' => 'Aurrizki hau duten orrialdeak bistaratu:',
+'allpagesbadtitle' => 'Orrialdearen izena baliogabekoa da edo interwiki edo hizkuntzen arteko aurrizkia dauka. Izenburuetan erabili ezin daitezkeen karaktere bat edo gehiago izan ditzake.',
+
+# Special:Listusers
+'listusersfrom' => 'Hemendik aurrerako erabiltzaileak bistaratu:',
+
+# E this user
+#
+'mailnologin' => 'Bidalketa helbiderik ez',
+'mailnologintext' => "Beste erabiltzaileei e-posta mezuak bidaltzeko [[Special:Userlogin|saioa hasi]] eta baliozko e-posta helbidea behar duzu izan zure [[Special:Preferences|hobespenetan]].",
+'emailuser' => 'Erabiltzaile honi e-posta bidali',
+'emailpage' => 'Erabiltzaileari e-posta bidali',
+'emailpagetext' => 'Erabiltzaile honek baliozko e-posta helbide bat ezarri badu bere hobespenetan, beheko formularioa erabiliz mezu bat bidal dakioke. Hobespenetan daukazun e-posta helbidea azalduko da mezuaren bidaltzaile bezala eta beraz erantzun ahal izango dizu.',
+'usermailererror' => 'Mail objektuak errore hau itzuli du:',
+'defemailsubject' => "E-posta {{SITENAME}}(e)tik",
+'noemailtitle' => 'Posta helbiderik ez',
+'noemailtext' => 'Erabiltzaile honek ez du baliozko posta helbiderik zehaztu edo beste erabiltzaileengandik mezurik ez jasotzea aukeratu du.',
+'emailfrom' => 'Nork',
+'emailto' => 'Nori',
+'emailsubject' => 'Gaia',
+'emailmessage' => 'Mezua',
+'emailsend' => 'Mezua',
+'emailsent' => 'Mezua bidali egin da',
+'emailsenttext' => 'Zure e-posta mezua bidali egin da.',
+
+# Watchlist
+'watchlist' => 'Nire jarraipen zerrenda',
+'watchlistfor' => "('''$1''')",
+'nowatchlist' => 'Zure jarraipen zerrenda hutsik dago.',
+'watchlistanontext' => 'Mesedez $1 zure jarraipen zerrendako orrialdeak ikusi eta aldatu ahal izateko.',
+'watchlistcount' => "'''$1 elementu dituzu zure jarraipen zerrendan, eztabaida orrialdeak barne.'''",
+'clearwatchlist' => 'Jarraipen zerrenda garbitu',
+'watchlistcleartext' => 'Ziur zaude ezabatu nahi dituzula?',
+'watchlistclearbutton' => 'Jarraipen zerrenda garbitu',
+'watchlistcleardone' => 'Zure jarraipen zerrenda garbitu egin da. $1 elementu ezabatu dira.',
+'watchnologin' => 'Saioa hasi gabe',
+'watchnologintext' => '[[Special:Userlogin|Saioa hasi]] behar duzu zure jarraipen zerrenda aldatzeko.',
+'addedwatch' => 'Jarraipen zerrendan gehitu da',
+'addedwatchtext' => "\"$1\" orrialdea zure [[Special:Watchlist|jarraipen edo zelatatuen zerrendara]] erantsi da. Orrialde honen hurrengo aldaketak zerrenda horretan ageriko dira aurrerantzean, eta gainera [[Special:Recentchanges|aldaketa berrien zerrendan]] beltzez ageriko da, erraztasunez antzeman ahal izateko.
+
+Jarraipen zerrendatik artikulua kentzeko, artikuluan ''ez jarraitu''ri eman.",
+'removedwatch' => 'Jarraipen zerrendatik ezabatuta',
+'removedwatchtext' => "\"[[:$1]]\" orrialdea zure jarraipen zerrendatik kendu da.",
+'watch' => 'Jarraitu',
+'watchthispage' => 'Orrialde hau jarraitu',
+'unwatch' => 'Ez jarraitu',
+'unwatchthispage' => 'Jarraitzeari utzi',
+'notanarticle' => 'Ez da eduki orrialdea',
+'watchnochange' => 'Hautatutako denbora tartean ez da aldaketarik izan zure jarraipen zerrendako orrialdeetan.',
+'watchdetails' => '* $1 orrialde jarraitzen, eztabaida orrialdeak kontuan hartu gabe
+* [[Special:Watchlist/edit|Jarraipen zerrenda osoa erakutsi eta editatu]]
+* [[Special:Watchlist/clear|Orrialde guztiak kendu]]',
+'wlheader-enotif' => "* Posta bidezko ohartarazpena gaituta dago.",
+'wlheader-showupdated' => "* Bisitatu zenituen azken alditik aldaketak izan dituzten orrialdeak '''beltzez''' nabarmenduta daude",
+'watchmethod-recent'=> 'Aldaketa berriak aztertzen jarraipen zerrendako orrialdeen bila',
+'watchmethod-list' => 'jarraipen zerrendako orrialdeak aldaketa berrien bila aztertzen',
+'removechecked' => 'Hautatutakoak jarraipen zerrendatik ezabatu',
+'watchlistcontains' => "Zure jarraipen zerrendak $1 orrialde ditu.",
+'watcheditlist' => 'Hona hemen jarraitzen ari zaren orrialdeen zerrenda alfabetikoa. Zerrendatik kendu nahi dituzun orrialdeak hautatu eta \'hautatutakoak ezabatu\' botoian klik egin (eduki orrialde bat kentzeak bere eztabaida orrialdea kentzea ere suposatzen du, eta alderantziz).',
+'removingchecked' => 'Jarraipen zerrendatik eskatutakoak ezabatzen...',
+'couldntremove' => "Ezin izan da '$1' ezabatu...",
+'iteminvalidname' => "Arazoa '$1' elementuarekin, baliogabeko izena...",
+'wlnote' => 'Jarraian ikus daitezke azken \'\'\'$2\'\'\' egunetako azken $1 aldaketak.',
+'wlshowlast' => 'Erakutsi azken $1 orduak $2 egunak $3',
+'wlsaved' => 'Honako hau zure jarraipen zerrendaren gordetako bertsio bat da.',
+'wlhideshowown' => '$1 nire aldaketak',
+'wlhideshowbots' => '$1 bot-en aldaketak',
+'wldone' => 'Egina.',
+
+'enotif_mailer' => '{{SITENAME}}(e)ko Oharpen Postaria',
+'enotif_reset' => 'Orrialde guztiak bisitatu bezala markatu',
+'enotif_newpagetext'=> 'Honako hau orrialde berria da.',
+'changed' => 'aldatu',
+'created' => 'sortu',
+'enotif_subject' => '{{SITENAME}}(e)ko $PAGETITLE orrialdea $PAGEEDITOR(e)k $CHANGEDORCREATED du',
+'enotif_lastvisited' => 'Jo $1 orrialdera zure azken bisitaz geroztik izandako aldaketa guztiak ikusteko.',
+'enotif_body' => 'Kaixo $WATCHINGUSERNAME,
+
+{{SITENAME}}(e)ko $PAGETITLE orrialdea $CHANGEDORCREATED egin du $PAGEEDITOR(e)k une honetan: $PAGEEDITDATE, ikus $PAGETITLE_URL azken bertsiorako.
+
+$NEWPAGE
+
+Egilearen laburpena: $PAGESUMMARY $PAGEMINOREDIT
+
+Egilearekin harremanetan jarri:
+e-posta: $PAGEEDITOR_EMAIL
+wiki: $PAGEEDITOR_WIKI
+
+Ez dira oharpen gehiago bidaliko orrialde hau berriz bisitatzen ez baduzu. Horrez gain, orrialdeen oharpen konfigurazioa leheneratu dezakezu jarraipen zerrendatik.
+
+ {{SITENAME}}(e)ko oharpen sistema
+
+--
+Zure jarraipen zerrendako konfigurazioa aldatzeko, ikus
+{{fullurl:{{ns:special}}:Watchlist/edit}}
+
+Laguntza:
+{{fullurl:{{ns:help}}:Contents}}',
+
+# Delete/protect/revert
+#
+'deletepage' => 'Orrialdea ezabatu',
+'confirm' => 'Baieztatu',
+'excontent' => "edukia honakoa zen: '$1'",
+'excontentauthor' => "edukia honakoa zen: '$1' (parte hartu duen lankide bakarra: '$2')",
+'exbeforeblank' => "hustu aurreko edukiera: '$1'",
+'exblank' => 'orrialdea hutsik zegoen',
+'confirmdelete' => 'Ezabaketa baieztatu',
+'deletesub' => "(\"$1\" ezabatzen)",
+'historywarning' => 'Kontuz! Ezabatuko duzun orrialdeak honako historia du:',
+'confirmdeletetext' => "Orrialde edo irudi bat eta beste historia guztia datu-basetik ezabatzear zaude. Mesedez, egiaztatu hori egin nahi duzula, ondorioak zeintzuk diren badakizula, eta [[{{ns:project}}:Politikak|politikak]] errespetatuz egingo duzula.",
+'actioncomplete' => 'Ekintza burutu da',
+'deletedtext' => "\"$1\" ezabatu egin da. Ikus $2 azken ezabaketen erregistroa ikusteko.",
+'deletedarticle' => "\"[[$1]]\" ezabatu da",
+'dellogpage' => 'Ezabaketa erregistroa',
+'dellogpagetext' => 'Behean ikus daiteke azken ezabaketen zerrenda.',
+'deletionlog' => 'ezabaketa erregistroa',
+'reverted' => 'Lehenagoko berrikuspen batera itzuli da',
+'deletecomment' => 'Ezabatzeko arrazoia',
+'imagereverted' => 'Lehenagoko bertsiora leheneratu egin da.',
+'rollback' => 'Aldaketak desegin',
+'rollback_short' => 'Desegin',
+'rollbacklink' => 'desegin',
+'rollbackfailed' => 'Desegiteak huts egin dud',
+'cantrollback' => 'Ezin da aldaketa desegin; erabiltzaile bakarrak hartu du parte.',
+'alreadyrolled' => "Ezin da [[Lankide:$2|$2]](e)k ([[Lankide eztabaida:$2|Eztabaida]]) [[$1]](e)n egindako azken aldaketa desegin; beste norbaitek editatu du edo jada desegin du. Azken aldaketa [[Lankide:$3|$3]](e)k ([[Lankide eztabaida:$3|Eztabaida]]) egin du.",
+# only shown if there is an edit comment
+'editcomment' => "Aldaketaren iruzkina: \"<i>$1</i>\".",
+'revertpage' => "$2ren aldaketak ezabatu dira, $1ren azken bertsiora itzuliz.",
+'sessionfailure' => 'Badirudi saioarekin arazoren bat dagoela; bandalismoak saihesteko ekintza hau ezeztatu egin da. Mesedez, nabigatzaileko "atzera" botoian klik egin, hona ekarri zaituen orrialde hori berriz kargatu, eta saiatu berriz.',
+'protectlogpage' => 'Babes erregistroa',
+'protectlogtext' => "Orrialdeen blokeo eta desblokeo zerrenda azaltzen da jarraian.",
+'protectedarticle' => '"[[$1]]" babestu da"',
+'unprotectedarticle' => '"[[$1]]"(r)i babesa kendu zaio',
+'protectsub' => '("$1" babesten)',
+'confirmprotecttext' => 'Ziur zaude orrialde hau babestu nahi duzula?',
+'confirmprotect' => 'Babesa baieztatu',
+'protectmoveonly' => 'Mugitzea babestu bakarrik',
+'protectcomment' => 'Babesteko arrazoia',
+'unprotectsub' =>"(babesa kentzen: \"$1\")",
+'confirmunprotecttext' => 'Ziur zaude orrialde honi babesa kendu nahi diozula?',
+'confirmunprotect' => 'Babesa kentzea baieztatu',
+'unprotectcomment' => 'Babesa kentzeko arrazoia',
+'protect-unchain' => 'Mugitzeko blokeoa kendu',
+'protect-text' => '<strong>$1</strong> orrialdearen babes maila ikusi eta aldatu egin beharko zenuke.',
+'protect-viewtext' => 'Ez daukazu babesak aldatzeko baimenik. Hemen duzu <strong>$1</strong> orrialdearen oraingo konfigurazioa:',
+'protect-default' => '(lehenetsia)',
+'protect-level-autoconfirmed' => 'Erregistratu gabeko erabiltzaileak blokeatu',
+'protect-level-sysop' => 'Administratzaileak bakarrik',
+
+# restrictions (nouns)
+'restriction-edit' => 'Aldatu',
+'restriction-move' => 'Mugitu',
+
+# Undelete
+'undelete' => 'Ezabatutako orrialdeak ikusi',
+'undeletepage' => 'Ezabatutako orrialdeak ikusi eta leheneratu',
+'viewdeletedpage' => 'Ezabatutako orrialdeak ikusi',
+'undeletepagetext' => 'Jarraian zerrendatzen diren orrialdeak ezabatu egin dira baina oraindik artxiboa gordeta daude eta leheneratu egin daitezke. Artxiboa noizean behin hustu egin liteke.',
+'undeleteextrahelp' => "Orrialde osoa leheneratzeko, koadrotxo guztiak hautatu gabe utzi eta '''''Leheneratu'''''n klik egin. Aukeratutako leheneratze bat burutzeko, leheneratu nahi dituzun berrikuspenen koadrotxoak markatu eta '''''Leheneratu''''' klik egin. '''''Hasieratu'''''n klik eginez gero koadrotxo guztiak eta iruzkin koadroa hustu egingo dira.",
+'undeletearticle' => 'Ezabatutako orrialdea leheneratu',
+'undeleterevisions' => "$1 berrikuspen gordeta",
+'undeletehistory' => 'Orrialdea leheneratzen baduzu, berrikuspena guztiak leheneratuko dira historian. Ezabatu ondoren izen berdina duen orrialde berri bat sortzen bada leheneratutako berrikuspenak azalduko dira historian, eta oraingo berrikuspena ez da automatikoki ordezkatuko.',
+'undeletehistorynoadmin' => 'Artikulua ezabatu egin da. Ezabatzeko azalpena beheko laburpenean erakusten da, ezabatu aurretik parte hartu zuten erabiltzaileen xehetasunekin batera. Ezabatutako berrikuspenen oraingo testua administratzaileek bakarrik ikus dezakete.',
+'undeleterevision' => "$1 berrikuspen gordeta",
+'undeletebtn' => 'Leheneratu',
+'undeletereset' => 'Hasieratu',
+'undeletecomment' => 'Iruzkina:',
+'undeletedarticle' => "\"[[$1]]\" leheneratu da",
+'undeletedrevisions' => "$1 berrikuspen leheneratu dira",
+'undeletedrevisions-files' => "$1 berrikuspen eta $2 fitxategi leheneratu dira",
+'undeletedfiles' => "$1 fitxategi leheneratu dira",
+'cannotundelete' => 'Errorea birsortzerakoan; baliteke beste norbaitek lehenago birsortu izana.',
+'undeletedpage' => "<big>'''$1 leheneratu egin da'''</big>
+
+[[Special:Log/delete|Ezabaketa erregistrora]] jo azken ezabaketa eta leheneraketak ikusteko.",
+
+# Namespace form on various pages
+'namespace' => 'Izen-tartea:',
+'invert' => 'Hautapena alderanztu',
+# Contributions
+#
+'contributions' => 'Lankidearen ekarpenak',
+'mycontris' => 'Nire ekarpenak',
+'contribsub' => "$1",
+'nocontribs' => 'Ez da ezaugarri horiekin bat datorren aldaketarik aurkitu.',
+'ucnote' => "Behean agertzen dira erabiltzaile honen azken <b>$1</b> aldaketak azken <b>$2</b> egunetan.",
+'uclinks' => "Azken $1 aldaketak ikusi; azken $2 egunak ikusi.",
+'uctop' => ' (Azken aldaketa)' ,
+'newbies' => 'hasiberriak',
+
+'sp-newimages-showfrom' => 'Irudi berriak erakutsi $1(e)tik hasita',
+
+'sp-contributions-newest' => 'Berriena',
+'sp-contributions-oldest' => 'Zaharrena',
+'sp-contributions-newer' => '$1 berriago',
+'sp-contributions-older' => '$1 zaharrago',
+'sp-contributions-newbies-sub' => 'Hasiberrientzako',
+
+
+# What links here
+#
+'whatlinkshere' => 'Honekin lotzen diren orrialdeak',
+'whatlinkshere-barrow' => '&lt;',
+'notargettitle' => 'Helburu orrialderik ez',
+'notargettext' => 'Ez duzu eragiketa hau burutzeko helburu orrialde edo erabiltzaile bat zehaztu.',
+'linklistsub' => '(Loturen zerrenda)',
+'linkshere' => "Hurrengoek dute '''[[:$1]]''' orrialderako lotura:",
+'nolinkshere' => "Ez dago '''[[:$1]]''' lotura duen orrialderik.",
+'isredirect' => 'berbideraketa orrialdea',
+'istemplate' => 'erabilpena',
+
+# Block/unblock IP
+#
+'blockip' => 'Erabiltzailea blokeatu',
+'blockiptext' => "IP helbide edo erabiltzaile izen bati idazketa baimenak kentzeko beheko formularioa erabil dezakezu. Ekintza hau bandalismoa saihesteko baino ez da burutu behar, eta beti ere [[{{ns:project}}:Politikak|politikak]] errespetatuz. Blokeoaren arrazoi bat ere zehaztu ezazu (adibidez, orrialde batzuk zehaztuz).",
+'ipaddress' => 'IP Helbidea',
+'ipadressorusername' => 'IP Helbidea edo erabiltzaile izena',
+'ipbexpiry' => 'Iraungipena',
+'ipbreason' => 'Arrazoia',
+'ipbanononly' => 'Erabiltzaile anonimoak bakarrik blokeatu',
+'ipbcreateaccount' => 'Kontua sortzea debekatu',
+'ipbsubmit' => 'Erabiltzaile hau blokeatu',
+'ipbother' => 'Beste denbora-tarte bat',
+'ipboptions' => '15 minutu:15 minutes,30 minutu:30 minutes,ordu 1:1 hour,2 ordu:2 hours,egun bat:1 day,3 egun:3 days,aste 1:1 week,2 aste:2 weeks,hilabete 1:1 month,betirako:infinite',
+'ipbotheroption' => 'beste bat',
+'badipaddress' => 'Baliogabeko IP helbidea',
+'blockipsuccesssub' => 'Blokeoa burutu da',
+'blockipsuccesstext' => '[[{{ns:Special}}:Contributions/$1|$1]] erabiltzaileari blokeoa ezarri zaio. Ikus [[{{ns:Special}}:Ipblocklist|IP blokeoen zerrenda]] blokeoak aztertzeko.',
+'unblockip' => 'Erabiltzailea desblokeatu',
+'unblockiptext' => 'Erabili beheko formularioa lehenago blokeatutako IP helbide edo erabiltzaile baten idazketa baimenak leheneratzeko.',
+'ipusubmit' => 'Helbide hau desblokeatu',
+'unblocked' => '[[User:$1|$1]] desblokeatu egin da',
+'ipblocklist' => 'Blokeatutako IP helbide eta erabiltzaileen zerrenda',
+'blocklistline' => "$1, $2(e)k $3 blokeatu du (iraungipena: $4)",
+'infiniteblock' => 'infinitu',
+'expiringblock' => 'iraungipen data: $1',
+'anononlyblock' => 'anon. soilik',
+'createaccountblock' => 'kontua sortzea blokeatuta',
+'ipblocklistempty' => 'Blokeo zerrenda hutsik dago.',
+'blocklink' => 'blokeatu',
+'unblocklink' => 'blokeoa kendu',
+'contribslink' => 'ekarpenak',
+'autoblocker' => '"[[Lankide:$1|$1]]"(e)k berriki erabili duen IP helbidea duzulako autoblokeatu zaizu. $1(e)k emandako arrazoia zera da: "\'\'\'$2\'\'\'"',
+'blocklogpage' => 'Blokeo erregistroa',
+'blocklogentry' => '"[[Lankide:$1|$1]]" $2(e)ko iraungipenarekin blokeatu da.',
+'blocklogtext' => 'Erabiltzaileen blokeoen ezarpen eta ezabaketen erregistroa da hau. Ez dira automatikoki blokeatutako IP helbideak zerrendatzen. Ikus [[Special:Ipblocklist|IP blokeoen zerrenda]] aktibo dauden blokeoak aztertzeko.',
+'unblocklogentry' => '$1 desblokeatu da',
+'range_block_disabled' => 'Administratzaileak IP eremuak blokeatzeko gaitasuna ezgaituta dago.',
+'ipb_expiry_invalid' => 'Baliogabeko iraungipen denbora',
+'ipb_already_blocked' => '"$1" badago blokeatuta',
+'ip_range_invalid' => 'Baliogabeko IP eremua.',
+'proxyblocker' => 'Proxy blokeatzailea',
+'ipb_cant_unblock' => 'Errorea: Ez da $1 IDa duen blokeoa aurkitu. Baliteke blokeoa jada kenduta egotea.',
+'proxyblockreason' => 'Zure IP helbidea blokeatu egin da proxy ireki baten zaudelako. Mesedez, zure Interneteko Zerbitzu Hornitzailearekin harremanetan jar zaitez segurtasun arazo honetaz ohartarazteko.',
+'proxyblocksuccess' => 'Egina.',
+'sorbs' => 'SORBS DNSBL',
+'sorbsreason' => 'Zure IP helbidea proxy ireki bezala zerrendatuta dago [http://www.sorbs.net SORBS]eko DNSBLan.',
+'sorbs_create_account_reason' => 'Zure IP helbidea proxy ireki bezala zerrendatuta dago [http://www.sorbs.net SORBS]eko DNSBLan. Ezin duzu kontua sortu.',
+
+# Developer tools
+#
+'lockdb' => 'Datu-basea blokeatu',
+'unlockdb' => 'Datu-basea desblokeatu',
+'lockdbtext' => 'Datu-basea blokeatzeak edozein erabiltzailek orrialdeak aldatzea, hobespenak aldatzea, jarraipen zerrendan aldaketak egitea, eta datu-basean edozein aldaketa behar duen edozein ekintza galaraziko du. Mesedez, baieztatu zure asmoa hori dela, eta blokeoa kenduko duzula mantenua burutu ondoren.',
+'unlockdbtext' => 'Datu-basea desblokeatzerakoan erabiltzaile guztiek orrialdeak aldatu, beraien hobespenak ezarri, jarraipen zerrendan aldaketak egin eta beste eragiketa batzuk burutzeko gaitasuna leheneratuko du. Mesedez, baieztatu egin nahi duzuna hori dela.',
+'lockconfirm' => 'Bai, datu-basea blokeatu nahi dut',
+'unlockconfirm' => 'Bai, datu-basea desblokeatu nahi dut',
+'lockbtn' => 'Datu-basea blokeatu',
+'unlockbtn' => 'Datu-basea desblokeatu',
+'locknoconfirm' => 'Ez duzu baieztapen kutxa hautatu.',
+'lockdbsuccesssub' => 'Datu-basea blokeatu egin da',
+'unlockdbsuccesssub' => 'Datu-basearen blokeoa kendu da',
+'lockdbsuccesstext' => 'Datu-basea blokeatu egin da. <br />Ez ahaztu mantenu lanak burutu ondoren [[Special:Unlockdb|blokeoa kentzeaz]].',
+'unlockdbsuccesstext' => 'Datu-basea desblokeatu egin da.',
+'lockfilenotwritable' => 'Ezin da datu-baseko blokeo fitxategian idatzi. Datu-basea blokeatu edo desblokeatzeko, zerbitzariak idazteko aukera izan beharra dauka.',
+'databasenotlocked' => 'Datu-basea ez dago blokeatuta.',
+
+# Make sysop
+'makesysoptitle' => 'Lankide bat administratzaile egin',
+'makesysoptext' => 'Lankide arruntei administratzaile baimenak emateko erabiltzen da orrialde hau. Lankidearen izena ipini laukian eta botoia sakatu.',
+'makesysopname' => 'Lankidearen izena:',
+'makesysopsubmit' => 'Lankide hau administratzaile egin',
+'makesysopok' => "<strong>\"$1\" lankidea administratzailea da orain</strong>",
+'makesysopfail' => "<strong>Ezin da \"$1\" lankidea administratzaile egin. (Ziur zaude izena zuzen idatzi duzula?)</strong>",
+'setbureaucratflag' => 'Burokrata egin',
+'rightslog' => 'Erabiltzaile eskubideen erregistroa',
+'rightslogtext' => 'Erabiltzaile eskubideetan izandako aldaketen erregistroa da hau.',
+'rightslogentry' => '$1(r)en partaidetza aldatu da $2(e)tik $3(e)ra',
+'rights' => 'Eskubideak:',
+'set_user_rights' => 'Erabiltzailearen eskubideak ezarri',
+'user_rights_set' => "<strong>\"$1\"(r)en eskubideak eguneratu egin dira</strong>",
+'set_rights_fail' => "<strong>Ezin izan dira \"$1\"(r)entzako eskubideak ezarri. (Izena ondo idatzi duzu?)</strong>",
+'makesysop' => 'Lankide bat administratzaile egin',
+'already_sysop' => 'Erabiltzaile hau bada administratzailea',
+'already_bureaucrat' => 'Erabiltzaile hau bada burokrata',
+'rightsnone' => '(bat ere ez)',
+
+# Move page
+#
+'movepage' => 'Orrialdea mugitu',
+'movepagetext' => 'Hurrengo pausoak jarraituz, artikulu edo orrialde baten izena aldatu daiteke. Izenburu zaharra, automatikoki izenburu berriari birzuzenduko zaio.
+Gogora ezazu, orrialdearen izena ez dela aldatuko, nahi duzun izena dagoeneko sortuta badago Wikipedian; birzuzenketa bat edo historiarik gabeko orrialde bat ez bada.
+
+<b>KONTUZ!</b>
+Artikulu oso erabilia edo asko aldatzen denaren izenburua aldatzera bazoaz, mesedez, lehenbizi artikuluaren eztabaidan adierazi ezazu beste lankideen iritziak jasotzeko.',
+'movepagetalktext' => 'Dagokion eztabaida orrialdea berarekin batera mugitu da, honako kasu hauetan \'\'\'ezik:\'\'\'
+* Hutsik ez dagoen eztabaida orrialde bat existitzen bada izen berrian.
+* Beheko koadroa hautatzen ez baduzu.
+
+Kasu horietan orrialdea eskuz mugitu edo bestearekin bateratu beharko duzu.',
+'movearticle' => 'Orrialdea mugitu',
+'movenologin' => 'Saioa hasi gabe',
+'movenologintext' => "Orrialde bat mugitzeko erregistratutako erabiltzailea izan behar duzu eta [[Special:Userlogin|saioa hasi]].",
+'newtitle' => 'Izenburu berria',
+'movepagebtn' => 'Orrialde mugitu',
+'pagemovedsub' => 'Mugimendua eginda',
+'pagemovedtext' => "\"$1\" izenburua \"$2\"(r)en truke aldatu da.",
+'articleexists' => 'Izen hori duen artikulu bat badago edo hautatutako izena ez da baliozkoa. Mesedez, beste izen bat aukeratu.',
+'talkexists' => "'''Orrialde hau arazorik gabe mugitu da, baina eztabaida orrialde ezin izan da mugitu izenburu berriarekin jada bat existitzen delako. Mesedez, eskuz batu itzazu biak.'''",
+'movedto' => 'hona mugitu da:',
+'movetalk' => 'Eztabaida orrialdea ere mugitu, ahal bada.',
+'talkpagemoved' => 'Artikulu honen eztabaida ere mugitu egin da.',
+'talkpagenotmoved' => 'Artikulu honen eztabaida <strong>ez</strong> da mugitu.',
+'1movedto2' => '$1 izenburua $2(r)engatik aldatu da',
+'1movedto2_redir' => '$1 izenburua $2(r)engatik aldatu da birzuzenketaren gainetik',
+'movelogpage' => 'Mugimendu erregistroa',
+'movelogpagetext' => 'Mugitutako orrialdeen zerrenda bat azaltzen da jarraian.',
+'movereason' => 'Arrazoia',
+'revertmove' => 'desegin',
+'delete_and_move' => 'Ezabatu eta mugitu',
+'delete_and_move_text' =>
+'== Ezabatzeko beharra ==
+
+"[[$1]]" helburua existitzen da. Lekua egiteko ezabatu nahi al duzu?',
+'delete_and_move_confirm' => 'Bai, orrialdea ezabatu',
+'delete_and_move_reason' => 'Lekua egiteko ezabatu da',
+'selfmove' => "Helburu izenburua berdina da; ezin da orrialde bat bere gainera mugitu.",
+'immobile_namespace' => "Hasierako edo amaierako izenburua Aparteko motakoa da; ezin da izen-tarte horretatik eta horretara ezer mugitu.",
+
+# Export
+
+'export' => 'Orrialdeak esportatu',
+'exporttext' => 'Orrialde bat edo batzuen testua eta historia esportatu dezakezu XML fitxategi batzuetan. Ondoren, MediaWiki erabiltzen duen beste wiki baten jarri dezakezu Special:Import orrialdea erabiliz.
+
+Orrialdeak esportatzeko zehaztu hauen izenburuak beheko koadroan, izenburu bat lerroko, eta aukeratu zein bertsio esportatu nahi dituzun.
+
+Horrez gain, lotura zuzena ere erabil dezakezu; adibidez, [[{{ns:Special}}:Export/{{int:mainpage}}]] {{int:mainpage}} orrialdearentzako.',
+'exportcuronly' => 'Oraingo berrikuspena bakarrik hartu, ez historia guztia',
+'exportnohistory' => "----
+'''Oharra:''' Formulario honen bitartez orrialdeen historia osoak esportatzeko aukera ezgaitu egin da, errendimendua dela-eta.",
+'export-submit' => 'Esportatu',
+
+# Namespace 8 related
+
+'allmessages' => 'Sistemako mezu guztiak',
+'allmessagesname' => 'Izena',
+'allmessagesdefault' => 'Testu lehenetsia',
+'allmessagescurrent' => 'Oraingo testua',
+'allmessagestext' => 'MediaWikin erabiltzen diren mezu guztien zerrenda:',
+'allmessagesnotsupportedUI' => 'Aukeratuta duzun hizkuntza (\'\'\'$1\'\'\') ez du Special:Allmessages orrialdeak onartzen gune honetan.',
+'allmessagesnotsupportedDB' => 'Ezin da \'\'\'Special:Allmessages\'\'\' erabili \'\'\'$wgUseDatabaseMessages\'\'\' ezgaituta dagoelako.',
+'allmessagesfilter' => 'Mezu izenaren iragazkia:',
+'allmessagesmodified' => 'Aldatutakoak bakarrik erakutsi',
+
+# Thumbnails
+
+'thumbnail-more' => 'Handitu',
+'missingimage' => '<b>Irudia falta da</b><br /><i>$1</i>',
+'filemissing' => 'Fitxategia falta da',
+'thumbnail_error' => 'Errorea irudi txikia sortzerakoan: $1',
+
+# Special:Import
+'import' => 'Orrialdeak inportatu',
+'importinterwiki' => 'Wikien arteko inportazioa',
+'import-interwiki-text' => 'Aukeratu inportatzeko wiki eta orrialde izenburu bat. Berrikuspenen datak eta egileak gorde egingo dira. Inportazio ekintza guzti hauek [[Special:Log/import|inportazio erregistroan]] gordetzen dira.',
+'import-interwiki-history' => 'Orrialde honen historiako bertsio guztiak kopiatu',
+'import-interwiki-submit' => 'Inportatu',
+'import-interwiki-namespace' => 'Izen-tarte honetako orrialdeak transferitu:',
+'importtext' => 'Mesedez, jatorrizko wikitik orrialdea esportatzeko Special:Export tresna erabil ezazu, zure diskoan gorde eta jarraian hona igo.',
+'importstart' => "Orrialdeak inportatzen...",
+'import-revision-count' => '{{PLURAL:$1|berrikuspen 1|$1 berrikuspen}}',
+'importnopages' => "Ez dago orrialderik inportatzeko.",
+'importfailed' => "Inportazioak huts egin du: $1",
+'importunknownsource' => "Inportazio iturri mota ezezaguna",
+'importcantopen' => "Ezin izan da inportazio fitxategia ireki",
+'importbadinterwiki' => "Interwiki lotura ezegokia",
+'importnotext' => 'Hutsik dago edo testurik gabe',
+'importsuccess' => 'Inportazioa burutu da!',
+'importhistoryconflict' => 'Gatazka sortzen ari den berrikuspen historia dago (baliteke orrialdea lehenago inportatu izana)',
+'importnosources' => 'Ez dago wikien arteko inportazio iturririk eta historialak zuzenean igotzea ezgaituta dago.',
+'importnofile' => 'Ez da inportazio fitxategirik igo.',
+'importuploaderror' => 'Inportazio fitxategiaren igoerak huts egin du; baliteke fitxategiaren tamaina baimendutakoa baino handiagoa izatea.',
+
+# import log
+'importlogpage' => 'Inportazio erregistroa',
+'importlogpagetext' => 'Beste wiki batzutatik historial eta guzti egindako orrialdeen inportazio administratiboak.',
+'import-logentry-upload' => '[[$1]] igoera bitartez inportatu da',
+'import-logentry-upload-detail' => '$1 berrikuspen',
+'import-logentry-interwiki' => '$1 wiki artean mugitu da',
+'import-logentry-interwiki-detail' => '$1 berrikuspen $2(e)tik',
+
+# Keyboard access keys for power users
+'accesskey-search' => 'f',
+'accesskey-minoredit' => 'i',
+'accesskey-save' => 's',
+'accesskey-preview' => 'p',
+'accesskey-diff' => 'v',
+'accesskey-compareselectedversions' => 'v',
+'accesskey-watch' => 'w',
+
+# tooltip help for some actions, most are in Monobook.js
+'tooltip-search' => '{{SITENAME}}(e)n bilatu [alt-f]',
+'tooltip-minoredit' => 'Aldaketa txiki bezala markatu hau [alt-i]',
+'tooltip-save' => 'Zure aldaketak gorde [alt-s]',
+'tooltip-preview' => 'Zure aldaketak aurreikusi, mesedez gorde aurretik erabili! [alt-p]',
+'tooltip-diff' => 'Testuari egindako aldaketak erakutsi. [alt-v]',
+'tooltip-compareselectedversions' => 'Orrialde honen bi hautatutako bertsioen arteko ezberdintasunak ikusi. [alt-v]',
+'tooltip-watch' => 'Orrialde hau zure segimendu zerrendan gehitu [alt-w]',
+
+# stylesheets
+'common.css' => '/** Hemen idatzitako CSS kodeak itxura guztietan izango du eragina */',
+'monobook.css' => '/* Hemen idatzitako CSS kodeak Monobook itxuran bakarrik izango du eragina */',
+
+# Metadata
+'nodublincore' => 'Dublin Core RDF metadatuak ezgaitu egin dira zerbitzari honetarako.',
+'nocreativecommons' => 'Creative Commons RDF metadatuak ezgaitu egin dira zerbitzari honetarako.',
+'notacceptable' => 'Wiki zerbitzariak ezin ditu datuak zure bezeroak irakur ditzakeen formatu batean eskaini.',
+
+# Attribution
+
+'anonymous' => '{{SITENAME}}(e)ko lankide anonimoak',
+'siteuser' => '{{SITENAME}}(e)ko $1 erabiltzailea',
+'lastmodifiedatby' => 'Orrialdearen azken aldaketa: $2, $1. Nork: $3.', // $1 date, $2 time. $3 user
+'and' => 'eta',
+'othercontribs' => '$1(r)en lanean oinarrituta.',
+'others' => 'besteak',
+'siteusers' => '{{SITENAME}}(e)ko $1 erabiltzailea(k)',
+'creditspage' => 'Orrialdearen kredituak',
+'nocredits' => 'Ez dago krediturik eskuragarri orrialde honentzako.',
+
+# Spam protection
+
+'spamprotectiontitle' => 'Spam-arengandik babesteko iragazkia',
+'spamprotectiontext' => 'Gorde nahi duzun orrialdea spam iragazkiak blokeatu du. Baliteke kanpo lotura batek sortzea arazo hori.',
+'spamprotectionmatch' => 'Gure spam iragazkiak testu hau antzeman du: $1',
+'subcategorycount' => "{{PLURAL:$1|Azpikategoria bat dago|$1 azpikategoria daude}} kategoria honetan.",
+'categoryarticlecount' => "Kategoria honetan {{PLURAL:$1|artikulu bakarra dago|$1 artikulu daude}}.",
+'listingcontinuesabbrev' => " jarr.",
+'spambot_username' => 'MediaWikiren spam garbiketa',
+'spam_reverting' => '$1(e)rako loturarik ez daukan azken bertsiora itzultzen',
+'spam_blanking' => 'Berrikuspen guztiek $1(e)rako lotura zeukaten, husten',
+
+# Info page
+'infosubtitle' => 'Orrialdearen informazioa',
+'numedits' => 'Aldaketa kopurua (artikulua): $1',
+'numtalkedits' => 'Aldaketa kopurua (eztabaida orrialdea): $1',
+'numwatchers' => 'Jarraitzaile kopurua: $1',
+'numauthors' => 'Egile ezberdinen kopurua (artikulua): $1',
+'numtalkauthors' => 'Egile ezberdinen kopurua (eztabaida orrialdea): $1',
+
+# Math options
+'mw_math_png' => 'Beti PNG irudiak sortu',
+'mw_math_simple' => 'Oso sinplea bada HTML, eta bestela PNG',
+'mw_math_html' => 'Posible bada HTML, eta bestela PNG',
+'mw_math_source' => 'TeX bezala utzi (testu bidezko nabigatzaileentzako)',
+'mw_math_modern' => 'Nabigatzaile berrientzako gomendatuta',
+'mw_math_mathml' => 'MathML posible bada (proba fasean)',
+
+# Patrolling
+'markaspatrolleddiff' => "Patruilatu bezala markatu",
+'markaspatrolledtext' => "Artikulu hau patruilatu bezala markatu",
+'markedaspatrolled' => "Patruilatu bezala markatu da",
+'markedaspatrolledtext' => "Hautatutako berrikuspena patruilatu bezala markatu da.",
+'rcpatroldisabled' => "Aldaketa berrien patruilaketa ezgaituta dago",
+'rcpatroldisabledtext' => "Aldaketa berrien patruilaketa ezaugarria ezgaituta dago orain.",
+'markedaspatrollederror' => "Ezin da patruilatu bezala markatu",
+'markedaspatrollederrortext' => "Patruilatu bezala markatzeko berrikuspen bat hautatu beharra daukazu.",
+
+# Monobook.js: tooltips and access keys for monobook
+'monobook.js' => '/* tooltips and access keys */
+var ta = new Object();
+ta[\'pt-userpage\'] = new Array(\'.\',\'Nire lankide orrialdea\');
+ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Zure IParen lankide orrialdea\');
+ta[\'pt-mytalk\'] = new Array(\'n\',\'Nire eztabaida orrialdea\');
+ta[\'pt-anontalk\'] = new Array(\'n\',\'Zure IParen eztabaida\');
+ta[\'pt-preferences\'] = new Array(\'\',\'Nire hobespenak\');
+ta[\'pt-watchlist\'] = new Array(\'l\',\'Jarraitzen dituzun orrialdeen zerrenda.\');
+ta[\'pt-mycontris\'] = new Array(\'y\',\'Nire ekarpenak\');
+ta[\'pt-login\'] = new Array(\'o\',\'Izen ematera gonbidatzen zaitugu.\');
+ta[\'pt-anonlogin\'] = new Array(\'o\',\'Izen ematera gonbidatzen zaitugu.\');
+ta[\'pt-logout\'] = new Array(\'o\',\'Saioa itxi\');
+ta[\'ca-talk\'] = new Array(\'t\',\'Artikuluari buruzko eztabaida\');
+ta[\'ca-edit\'] = new Array(\'e\',\'Artikulu hau aldatu dezakezu. Mesedez, aurrebista botoia erabil ezazu gorde baino lehen.\');
+ta[\'ca-addsection\'] = new Array(\'+\',\'Eztabaida honetan iruzkin bat erantsi ezazu.\');
+ta[\'ca-viewsource\'] = new Array(\'e\',\'Artikulu hau babesturik dago. Bere kodea soilik ikus dezakezu.\');
+ta[\'ca-history\'] = new Array(\'h\',\'Artikulu honen aurreko bertsioak.\');
+ta[\'ca-protect\'] = new Array(\'=\',\'Artikulu hau babestu\');
+ta[\'ca-delete\'] = new Array(\'d\',\'Artikulu hau ezabatu\');
+ta[\'ca-undelete\'] = new Array(\'d\',\'Ezabatu baino lehenago egindako aldaketak berrezarri.\');
+ta[\'ca-move\'] = new Array(\'m\',\'Orrialde hau mugitu\');
+ta[\'ca-watch\'] = new Array(\'w\',\'Orrialde hau jarraipen zerrendan gehitu\');
+ta[\'ca-unwatch\'] = new Array(\'w\',\'Orrialde hau jarraipen zerrendatik kendu\');
+ta[\'search\'] = new Array(\'f\',\'Wiki honetan bilatu\');
+ta[\'p-logo\'] = new Array(\'\',\'Azala\');
+ta[\'n-mainpage\'] = new Array(\'z\',\'Azala bisitatu\');
+ta[\'n-portal\'] = new Array(\'\',\'Proiektuaren inguruan, zer egin dezakezu, non aurkitu nahi duzuna\');
+ta[\'n-currentevents\'] = new Array(\'\',\'Oraingo gertaeren inguruko informazio gehigarria\');
+ta[\'n-recentchanges\'] = new Array(\'r\',\'Wikiko azken aldaketen zerrenda.\');
+ta[\'n-randompage\'] = new Array(\'x\',\'Ausazko orrialde bat kargatu\');
+ta[\'n-help\'] = new Array(\'\',\'Aurkitzeko lekua.\');
+ta[\'n-sitesupport\'] = new Array(\'\',\'Lagun iezaguzu\');
+ta[\'t-whatlinkshere\'] = new Array(\'j\',\'Hona lotzen duten wiki orrialde guztien zerrenda\');
+ta[\'t-recentchangeslinked\'] = new Array(\'k\',\'Orrialde honetatik lotutako orrialdeen azken aldaketak\');
+ta[\'feed-rss\'] = new Array(\'\',\'Orrialde honen RSS jarioa\');
+ta[\'feed-atom\'] = new Array(\'\',\'Orrialde honen atom jarioa\');
+ta[\'t-contributions\'] = new Array(\'\',\'Lankide honen ekarpen zerrenda ikusi\');
+ta[\'t-emailuser\'] = new Array(\'\',\'Lankide honi e-posta mezua bidali\');
+ta[\'t-upload\'] = new Array(\'u\',\'Irudiak edo media fitxategiak igo\');
+ta[\'t-specialpages\'] = new Array(\'q\',\'Aparteko orrialde guztien zerrenda\');
+ta[\'ca-nstab-main\'] = new Array(\'c\',\'Eduki orrialdea ikusi\');
+ta[\'ca-nstab-user\'] = new Array(\'c\',\'Lankide orrialdea ikusi\');
+ta[\'ca-nstab-media\'] = new Array(\'c\',\'Media orrialdea ikusi\');
+ta[\'ca-nstab-special\'] = new Array(\'\',\'Hau aparteko orrialde bat da, ezin duzu orrialdea aldatu.\');
+ta[\'ca-nstab-project\'] = new Array(\'a\',\'Proiektuaren orrialdea ikusi\');
+ta[\'ca-nstab-image\'] = new Array(\'c\',\'Irudiaren orrialdea ikusi\');
+ta[\'ca-nstab-mediawiki\'] = new Array(\'c\',\'Sistemaren mezua ikusi\');
+ta[\'ca-nstab-template\'] = new Array(\'c\',\'Txantiloia ikusi\');
+ta[\'ca-nstab-help\'] = new Array(\'c\',\'Laguntza orrialdea ikusi\');
+ta[\'ca-nstab-category\'] = new Array(\'c\',\'Kategoria orrialdea ikusi\');',
+
+# image deletion
+'deletedrevision' => '$1 berrikuspen zaharra ezabatu da.',
+
+# browsing diffs
+'previousdiff' => '↠Aurreko ezberdintasuna',
+'nextdiff' => 'Hurrengo ezberdintasuna →',
+
+'imagemaxsize' => 'Irudiak deskribapen-orrialdetan hurrengo tamainara txikitu:',
+'thumbsize' => 'Irudi txikiaren tamaina:',
+'showbigimage' => 'Bereizmen handiko bertsioa deskargatu ($1x$2, $3 KB)',
+
+'newimages' => 'Fitxategi berrien galeria',
+'showhidebots' => '($1 bot-ak)',
+'noimages' => 'Ez dago ezer ikusteko.',
+
+# short names for language variants used for language conversion links.
+# to disable showing a particular link, set it to 'disable', e.g.
+# 'variantname-zh-sg' => 'disable',
+'variantname-zh-cn' => 'cn',
+'variantname-zh-tw' => 'tw',
+'variantname-zh-hk' => 'hk',
+'variantname-zh-sg' => 'sg',
+'variantname-zh' => 'zh',
+# variants for Serbian language
+'variantname-sr-ec' => 'sr-ec',
+'variantname-sr-el' => 'sr-el',
+'variantname-sr-jc' => 'sr-jc',
+'variantname-sr-jl' => 'sr-jl',
+'variantname-sr' => 'sr',
+# variants for Kazakh language
+'variantname-kk-tr' => 'kk-tr',
+'variantname-kk-kz' => 'kk-kz',
+'variantname-kk-cn' => 'kk-cn',
+'variantname-kk' => 'kk',
+
+# labels for User: and Title: on Special:Log pages
+'specialloguserlabel' => 'Lankidea:',
+'speciallogtitlelabel' => 'Izenburua:',
+
+'passwordtooshort' => 'Zure pasahitza laburregia da. $1 karaktere izan behar ditu gutxienez.',
+
+# Media Warning
+'mediawarning' => '\'\'\'Oharra\'\'\': Fitxategi honek kode mingarria izan lezake; zure sisteman exekutatzea arriskutsua izan liteke.<hr />',
+
+'fileinfo' => '$1KB, MIME mota: <code>$2</code>',
+
+# Metadata
+'metadata' => 'Metadatuak',
+'metadata-help' => 'Fitxategi honek informazio gehigarri dauka, ziurrenik kamera digital edo eskanerrak egiterako momentuan gehitutakoa. Hori dela-eta, jatorrizko fitxategi hori aldatu egin bada, baliteke xehetasun batzuek errealitatearekin bat ez egitea.',
+'metadata-expand' => 'Xehetasunak erakutsi',
+'metadata-collapse' => 'Xehetasunak ezkutatu',
+'metadata-fields' => 'Mezu honetan zerrendatutako EXIF metadatu eremuak irudiaren orrialdean erakutsiko dira. Gainontzekoak ezkutatu egindako dira lehenetsi bezala.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* focallength',
+
+# Exif tags
+'exif-imagewidth' =>'Width',
+'exif-imagelength' =>'Height',
+'exif-bitspersample' =>'Bits per component',
+'exif-compression' =>'Compression scheme',
+'exif-photometricinterpretation' =>'Pixel composition',
+'exif-orientation' =>'Orientation',
+'exif-samplesperpixel' =>'Number of components',
+'exif-planarconfiguration' =>'Data arrangement',
+'exif-ycbcrsubsampling' =>'Subsampling ratio of Y to C',
+'exif-ycbcrpositioning' =>'Y and C positioning',
+'exif-xresolution' =>'Horizontal resolution',
+'exif-yresolution' =>'Vertical resolution',
+'exif-resolutionunit' =>'Unit of X and Y resolution',
+'exif-stripoffsets' =>'Image data location',
+'exif-rowsperstrip' =>'Number of rows per strip',
+'exif-stripbytecounts' =>'Bytes per compressed strip',
+'exif-jpeginterchangeformat' =>'Offset to JPEG SOI',
+'exif-jpeginterchangeformatlength' =>'Bytes of JPEG data',
+'exif-transferfunction' =>'Transfer function',
+'exif-whitepoint' =>'White point chromaticity',
+'exif-primarychromaticities' =>'Chromaticities of primarities',
+'exif-ycbcrcoefficients' =>'Color space transformation matrix coefficients',
+'exif-referenceblackwhite' =>'Pair of black and white reference values',
+'exif-datetime' =>'File change date and time',
+'exif-imagedescription' =>'Image title',
+'exif-make' =>'Camera manufacturer',
+'exif-model' =>'Camera model',
+'exif-software' =>'Software used',
+'exif-artist' =>'Author',
+'exif-copyright' =>'Copyright holder',
+'exif-exifversion' =>'Exif version',
+'exif-flashpixversion' =>'Supported Flashpix version',
+'exif-colorspace' =>'Color space',
+'exif-componentsconfiguration' =>'Meaning of each component',
+'exif-compressedbitsperpixel' =>'Image compression mode',
+'exif-pixelydimension' =>'Valid image width',
+'exif-pixelxdimension' =>'Valid image height',
+'exif-makernote' =>'Manufacturer notes',
+'exif-usercomment' =>'User comments',
+'exif-relatedsoundfile' =>'Related audio file',
+'exif-datetimeoriginal' =>'Date and time of data generation',
+'exif-datetimedigitized' =>'Date and time of digitizing',
+'exif-subsectime' =>'DateTime subseconds',
+'exif-subsectimeoriginal' =>'DateTimeOriginal subseconds',
+'exif-subsectimedigitized' =>'DateTimeDigitized subseconds',
+'exif-exposuretime' =>'Exposure time',
+'exif-exposuretime-format' => '$1 sec ($2)',
+'exif-fnumber' =>'F Number',
+'exif-fnumber-format' =>'f/$1',
+'exif-exposureprogram' =>'Exposure Program',
+'exif-spectralsensitivity' =>'Spectral sensitivity',
+'exif-isospeedratings' =>'ISO speed rating',
+'exif-oecf' =>'Optoelectronic conversion factor',
+'exif-shutterspeedvalue' =>'Shutter speed',
+'exif-aperturevalue' =>'Aperture',
+'exif-brightnessvalue' =>'Brightness',
+'exif-exposurebiasvalue' =>'Exposure bias',
+'exif-maxaperturevalue' =>'Maximum land aperture',
+'exif-subjectdistance' =>'Subject distance',
+'exif-meteringmode' =>'Metering mode',
+'exif-lightsource' =>'Light source',
+'exif-flash' =>'Flash',
+'exif-focallength' =>'Lens focal length',
+'exif-focallength-format' =>'$1 mm',
+'exif-subjectarea' =>'Subject area',
+'exif-flashenergy' =>'Flash energy',
+'exif-spatialfrequencyresponse' =>'Spatial frequency response',
+'exif-focalplanexresolution' =>'Focal plane X resolution',
+'exif-focalplaneyresolution' =>'Focal plane Y resolution',
+'exif-focalplaneresolutionunit' =>'Focal plane resolution unit',
+'exif-subjectlocation' =>'Subject location',
+'exif-exposureindex' =>'Exposure index',
+'exif-sensingmethod' =>'Sensing method',
+'exif-filesource' =>'File source',
+'exif-scenetype' =>'Scene type',
+'exif-cfapattern' =>'CFA pattern',
+'exif-customrendered' =>'Custom image processing',
+'exif-exposuremode' =>'Exposure mode',
+'exif-whitebalance' =>'White Balance',
+'exif-digitalzoomratio' =>'Digital zoom ratio',
+'exif-focallengthin35mmfilm' =>'Focal length in 35 mm film',
+'exif-scenecapturetype' =>'Scene capture type',
+'exif-gaincontrol' =>'Scene control',
+'exif-contrast' =>'Contrast',
+'exif-saturation' =>'Saturation',
+'exif-sharpness' =>'Sharpness',
+'exif-devicesettingdescription' =>'Device settings description',
+'exif-subjectdistancerange' =>'Subject distance range',
+'exif-imageuniqueid' =>'Unique image ID',
+'exif-gpsversionid' =>'GPS tag version',
+'exif-gpslatituderef' =>'North or South Latitude',
+'exif-gpslatitude' =>'Latitude',
+'exif-gpslongituderef' =>'East or West Longitude',
+'exif-gpslongitude' =>'Longitude',
+'exif-gpsaltituderef' =>'Altitude reference',
+'exif-gpsaltitude' =>'Altitude',
+'exif-gpstimestamp' =>'GPS time (atomic clock)',
+'exif-gpssatellites' =>'Satellites used for measurement',
+'exif-gpsstatus' =>'Receiver status',
+'exif-gpsmeasuremode' =>'Measurement mode',
+'exif-gpsdop' =>'Measurement precision',
+'exif-gpsspeedref' =>'Speed unit',
+'exif-gpsspeed' =>'Speed of GPS receiver',
+'exif-gpstrackref' =>'Reference for direction of movement',
+'exif-gpstrack' =>'Direction of movement',
+'exif-gpsimgdirectionref' =>'Reference for direction of image',
+'exif-gpsimgdirection' =>'Direction of image',
+'exif-gpsmapdatum' =>'Geodetic survey data used',
+'exif-gpsdestlatituderef' =>'Reference for latitude of destination',
+'exif-gpsdestlatitude' =>'Latitude destination',
+'exif-gpsdestlongituderef' =>'Reference for longitude of destination',
+'exif-gpsdestlongitude' =>'Longitude of destination',
+'exif-gpsdestbearingref' =>'Reference for bearing of destination',
+'exif-gpsdestbearing' =>'Bearing of destination',
+'exif-gpsdestdistanceref' =>'Reference for distance to destination',
+'exif-gpsdestdistance' =>'Distance to destination',
+'exif-gpsprocessingmethod' =>'Name of GPS processing method',
+'exif-gpsareainformation' =>'Name of GPS area',
+'exif-gpsdatestamp' =>'GPS date',
+'exif-gpsdifferential' =>'GPS differential correction',
+
+# Exif attributes
+
+'exif-compression-1' => 'Uncompressed',
+'exif-compression-6' => 'JPEG',
+
+'exif-photometricinterpretation-2' => 'RGB',
+'exif-photometricinterpretation-6' => 'YCbCr',
+
+'exif-orientation-1' => 'Normal', // 0th row: top; 0th column: left
+'exif-orientation-2' => 'Flipped horizontally', // 0th row: top; 0th column: right
+'exif-orientation-3' => 'Rotated 180°', // 0th row: bottom; 0th column: right
+'exif-orientation-4' => 'Flipped vertically', // 0th row: bottom; 0th column: left
+'exif-orientation-5' => 'Rotated 90° CCW and flipped vertically', // 0th row: left; 0th column: top
+'exif-orientation-6' => 'Rotated 90° CW', // 0th row: right; 0th column: top
+'exif-orientation-7' => 'Rotated 90° CW and flipped vertically', // 0th row: right; 0th column: bottom
+'exif-orientation-8' => 'Rotated 90° CCW', // 0th row: left; 0th column: bottom
+
+'exif-planarconfiguration-1' => 'chunky format',
+'exif-planarconfiguration-2' => 'planar format',
+
+'exif-xyresolution-i' => '$1 dpi',
+'exif-xyresolution-c' => '$1 dpc',
+
+'exif-colorspace-1' => 'sRGB',
+'exif-colorspace-ffff.h' => 'FFFF.H',
+
+'exif-componentsconfiguration-0' => 'does not exist',
+'exif-componentsconfiguration-1' => 'Y',
+'exif-componentsconfiguration-2' => 'Cb',
+'exif-componentsconfiguration-3' => 'Cr',
+'exif-componentsconfiguration-4' => 'R',
+'exif-componentsconfiguration-5' => 'G',
+'exif-componentsconfiguration-6' => 'B',
+
+'exif-exposureprogram-0' => 'Not defined',
+'exif-exposureprogram-1' => 'Manual',
+'exif-exposureprogram-2' => 'Normal program',
+'exif-exposureprogram-3' => 'Aperture priority',
+'exif-exposureprogram-4' => 'Shutter priority',
+'exif-exposureprogram-5' => 'Creative program (biased toward depth of field)',
+'exif-exposureprogram-6' => 'Action program (biased toward fast shutter speed)',
+'exif-exposureprogram-7' => 'Portrait mode (for closeup photos with the background out of focus)',
+'exif-exposureprogram-8' => 'Landscape mode (for landscape photos with the background in focus)',
+
+'exif-subjectdistance-value' => '$1 metres',
+
+'exif-meteringmode-0' => 'Unknown',
+'exif-meteringmode-1' => 'Average',
+'exif-meteringmode-2' => 'CenterWeightedAverage',
+'exif-meteringmode-3' => 'Spot',
+'exif-meteringmode-4' => 'MultiSpot',
+'exif-meteringmode-5' => 'Pattern',
+'exif-meteringmode-6' => 'Partial',
+'exif-meteringmode-255' => 'Other',
+
+'exif-lightsource-0' => 'Unknown',
+'exif-lightsource-1' => 'Daylight',
+'exif-lightsource-2' => 'Fluorescent',
+'exif-lightsource-3' => 'Tungsten (incandescent light)',
+'exif-lightsource-4' => 'Flash',
+'exif-lightsource-9' => 'Fine weather',
+'exif-lightsource-10' => 'Cloudy weather',
+'exif-lightsource-11' => 'Shade',
+'exif-lightsource-12' => 'Daylight fluorescent (D 5700 – 7100K)',
+'exif-lightsource-13' => 'Day white fluorescent (N 4600 – 5400K)',
+'exif-lightsource-14' => 'Cool white fluorescent (W 3900 – 4500K)',
+'exif-lightsource-15' => 'White fluorescent (WW 3200 – 3700K)',
+'exif-lightsource-17' => 'Standard light A',
+'exif-lightsource-18' => 'Standard light B',
+'exif-lightsource-19' => 'Standard light C',
+'exif-lightsource-20' => 'D55',
+'exif-lightsource-21' => 'D65',
+'exif-lightsource-22' => 'D75',
+'exif-lightsource-23' => 'D50',
+'exif-lightsource-24' => 'ISO studio tungsten',
+'exif-lightsource-255' => 'Other light source',
+
+'exif-focalplaneresolutionunit-2' => 'inches',
+
+'exif-sensingmethod-1' => 'Undefined',
+'exif-sensingmethod-2' => 'One-chip color area sensor',
+'exif-sensingmethod-3' => 'Two-chip color area sensor',
+'exif-sensingmethod-4' => 'Three-chip color area sensor',
+'exif-sensingmethod-5' => 'Color sequential area sensor',
+'exif-sensingmethod-7' => 'Trilinear sensor',
+'exif-sensingmethod-8' => 'Color sequential linear sensor',
+
+'exif-filesource-3' => 'DSC',
+
+'exif-scenetype-1' => 'A directly photographed image',
+
+'exif-customrendered-0' => 'Normal process',
+'exif-customrendered-1' => 'Custom process',
+
+'exif-exposuremode-0' => 'Auto exposure',
+'exif-exposuremode-1' => 'Manual exposure',
+'exif-exposuremode-2' => 'Auto bracket',
+
+'exif-whitebalance-0' => 'Auto white balance',
+'exif-whitebalance-1' => 'Manual white balance',
+
+'exif-scenecapturetype-0' => 'Standard',
+'exif-scenecapturetype-1' => 'Landscape',
+'exif-scenecapturetype-2' => 'Portrait',
+'exif-scenecapturetype-3' => 'Night scene',
+
+'exif-gaincontrol-0' => 'None',
+'exif-gaincontrol-1' => 'Low gain up',
+'exif-gaincontrol-2' => 'High gain up',
+'exif-gaincontrol-3' => 'Low gain down',
+'exif-gaincontrol-4' => 'High gain down',
+
+'exif-contrast-0' => 'Normal',
+'exif-contrast-1' => 'Soft',
+'exif-contrast-2' => 'Hard',
+
+'exif-saturation-0' => 'Normal',
+'exif-saturation-1' => 'Low saturation',
+'exif-saturation-2' => 'High saturation',
+
+'exif-sharpness-0' => 'Normal',
+'exif-sharpness-1' => 'Soft',
+'exif-sharpness-2' => 'Hard',
+
+'exif-subjectdistancerange-0' => 'Unknown',
+'exif-subjectdistancerange-1' => 'Macro',
+'exif-subjectdistancerange-2' => 'Close view',
+'exif-subjectdistancerange-3' => 'Distant view',
+
+// Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'North latitude',
+'exif-gpslatitude-s' => 'South latitude',
+
+// Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'East longitude',
+'exif-gpslongitude-w' => 'West longitude',
+
+'exif-gpsstatus-a' => 'Measurement in progress',
+'exif-gpsstatus-v' => 'Measurement interoperability',
+
+'exif-gpsmeasuremode-2' => '2-dimensional measurement',
+'exif-gpsmeasuremode-3' => '3-dimensional measurement',
+
+// Pseudotags used for GPSSpeedRef and GPSDestDistanceRef
+'exif-gpsspeed-k' => 'Kilometres per hour',
+'exif-gpsspeed-m' => 'Miles per hour',
+'exif-gpsspeed-n' => 'Knots',
+
+// Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'True direction',
+'exif-gpsdirection-m' => 'Magnetic direction',
+
+# external editor support
+'edit-externally' => 'Fitxategi hau editatu kanpo-aplikazio bat erabiliz',
+'edit-externally-help' => 'Ikus [http://meta.wikimedia.org/wiki/Help:External_editors konfiguraziorako argibideak] informazio gehiagorako.',
+
+# 'all' in various places, this might be different for inflected languages
+'recentchangesall' => 'guztiak',
+'imagelistall' => 'guztiak',
+'watchlistall1' => 'guztiak',
+'watchlistall2' => 'guztiak',
+'namespacesall' => 'guztiak',
+
+# E-mail address confirmation
+'confirmemail' => 'E-posta helbidea egiaztatu',
+'confirmemail_noemail' => 'Ez daukazu e-posta helbiderik zehaztuta zure [[Aparteko:Preferences|hobespenetan]].',
+'confirmemail_text' => "Wiki honetan zure e-posta helbidea egiaztatzea beharrezkoa da e-postarekin zerikusia duten ezaugarriak erabili aurretik. Beheko botoia jo zure helbidera egiaztapen mezu bat bidaltzeko. Mezuan kode bat duen lotura bat joango da atxikita; lotura hori zure nabigatzailean ireki ezazu e-posta helbidea egiaztatzeko.",
+'confirmemail_send' => 'Egiaztapen kodea e-postaz bidali',
+'confirmemail_sent' => 'Egiaztapen mezua bidali da.',
+'confirmemail_sendfailed' => 'Ezin izan da egiaztapen mezua bidali. Ziurtatu e-posta helbidean baliogabeko karaktererik ez dagoela. Zerbitzariaren mezua: $1',
+'confirmemail_invalid' => 'Baliogabeko egiaztapen kodea. Baliteke kodea iraungi izana.',
+'confirmemail_needlogin' => '$1 behar duzu zure e-posta helbidea egiaztatzeko.',
+'confirmemail_success' => 'Zure e-posta helbidea egiaztatu da. Saioa hasi eta ekarpenak egin ditzakezu orain.',
+'confirmemail_loggedin' => 'Zure e-posta helbidea egiaztatu da.',
+'confirmemail_error' => 'Akatsen bat gertatu da egiaztapena burutzerakoan.',
+
+'confirmemail_subject' => 'E-posta helbide egiaztapena {{SITENAME}}(e)n',
+'confirmemail_body' => "Norbaitek, ziurrenik zuk ($1 IP helbidetik), \"$2\" kontua erregistratu du {{SITENAME}}(e)n e-posta helbide honekin.
+
+Izen hori zuri dagokizula eta {{SITENAME}}(e)n zure e-posta egiaztatzeko, hurrengo lotura hau zure nabigatzailean ireki behar duzu:
+
+$3
+
+Zu *ez* bazara, ez jo lotura horretara. Egiaztapen kode hau $4 iraungiko da.",
+
+# Inputbox extension, may be useful in other contexts as well
+'tryexact' => 'Izenburu zehatza bilatu',
+'searchfulltext' => 'Testu osoa bilatu',
+'createarticle' => 'Artikulua sortu',
+
+# Scary transclusion
+'scarytranscludedisabled' => '[Interwikien transklusioa ezgaituta dago]',
+'scarytranscludefailed' => '[Arazoa $1 txantiloia eskuratzerakoan; barkatu]',
+'scarytranscludetoolong' => '[URLa luzeegia da; barkatu]',
+
+# Trackbacks
+'trackbackbox' => '<div id="mw_trackbacks"> Artikulu honen aipuak:<br /> $1 </div>',
+'trackbackremove' => ' ([$1 Ezabatu])',
+'trackbacklink' => 'Aipua',
+'trackbackdeleteok' => 'Aipua ezabatu egin da.',
+
+
+# delete conflict
+
+'deletedwhileediting' => 'Oharra: Zu aldaketak egiten hasi ondoren ezabatu egin da orrialde hau!',
+'confirmrecreate' => '[[User:$1|$1]] erabiltzaileak ([[User talk:$1|eztabaida]]) orrialde hau ezabatu zu aldatzen hasi eta gero. Hona arrazoia: : \'\'$2\'\' Mesedez, baieztatu orrialde hau berriz sortu nahi duzula.',
+'recreate' => 'Birsortu',
+'tooltip-recreate' => 'Orrialdea birsortu ezabatu egin den arren',
+
+'unit-pixel' => 'px',
+
+# HTML dump
+'redirectingto' => '[[$1]] orrialdera berbideratzen...',
+
+# action=purge
+'confirm_purge' => "Orrialde honen katxea ezabatu?
+
+$1",
+'confirm_purge_button' => 'Ados',
+
+'youhavenewmessagesmulti' => "Mezu berriak dituzu $1(e)n",
+'searchcontaining' => "''$1'' barne duten orrialdeen bilaketa.",
+'searchnamed' => "''$1'' izenburua duten artikuluen bilaketa.",
+'articletitles' => "''$1''(r)ekin hasten diren artikuluak",
+'hideresults' => 'Emaitzak ezkutatu',
+
+# DISPLAYTITLE
+'displaytitle' => '(Orrialde honetara lotzen da [[$1]] bezala)',
+
+'loginlanguagelabel' => 'Hizkuntza: $1',
+
+# Multipage image navigation
+'imgmultipageprev' => '&larr; aurreko orrialdea',
+'imgmultipagenext' => 'hurrengo orrialdea &rarr;',
+'imgmultigo' => 'Joan!',
+'imgmultigotopre' => 'Orrialdera jo',
+
+# Table pager
+'ascending_abbrev' => 'gor',
+'descending_abbrev' => 'behe',
+'table_pager_next' => 'Hurrengo orrialdea',
+'table_pager_prev' => 'Aurreko orrialdea',
+'table_pager_first' => 'Lehen orrialdea',
+'table_pager_last' => 'Azken orrialdea',
+'table_pager_limit' => 'Orrialdeko $1 elementu erakutsi',
+'table_pager_limit_submit' => 'Joan',
+'table_pager_empty' => 'Emaitzik ez',
+
+);
?>
diff --git a/languages/messages/MessagesFa.php b/languages/messages/MessagesFa.php
index 90e53104..035c7264 100644
--- a/languages/messages/MessagesFa.php
+++ b/languages/messages/MessagesFa.php
@@ -118,6 +118,7 @@ $messages = array(
# Bits of text used by many pages:
#
'categories' => "رده‌های صÙحات",
+'pagecategories' => "رده‌های صÙحات",
'category_header' => "مقاله‌های رده‌ی «$1»",
'subcategories' => "زیررده‌ها",
@@ -234,7 +235,7 @@ The administrator who locked it offered this explanation:
'badtitletext' => "عنوان درخواستی نامعتبر، خالی، یا عنوانی بین زبانی یا بین‌ویکی‌ای با پیوند نادرست بود.",
'perfdisabled' => "شرمنده! این امکان موÙقتاً برداشته شده چون پایگاه داده را چنان کند می‌کند
Ú©Ù‡ هیچ کس نمی‌تواند از ویکی استÙاده کند.",
-'perfdisabledsub' => "این نسخه‌ی ذخیره‌شده‌ای از $1 است: ",
+'perfdisabledsub' => "این نسخه‌ی ذخیره‌شده‌ای از $1 است:",
'wrong_wfQuery_params' => "پارامترهای wfQuery() نادرست است<br />
تابع: $1<br />
پرس‌وجو: $2",
@@ -365,10 +366,10 @@ cookieها را از کار انداخته‌اید. لطÙاً cookieها را
بنابراین برای شناسایی‌اش مجبوریم از [[نشانی IP]] عددی استÙاده کنیم. چنین نشانی‌های IPای ممکن است توسط چندین کاربر به Ø´Ú©Ù„
مشترک استÙاده شود.
اگر شما کاربر گمنامی هستید Ùˆ تصور می‌کنید اظهار نظرات نامربوط به شما صورت گرÙته است،
-لطÙاً برای پیشگیری از اشتباه گرÙته شدن با کاربران گمنام دیگر در آیند [[ویژه:Userlogin|حسابی ایجاد کنید یا به سیستم وارد شوید]].'' ",
+لطÙاً برای پیشگیری از اشتباه گرÙته شدن با کاربران گمنام دیگر در آیند [[ویژه:Userlogin|حسابی ایجاد کنید یا به سیستم وارد شوید]].''",
'noarticletext' => "(این صÙحه در حال حاضر متنی ندارد)",
'updated' => "(به‌روز شد)",
-'note' => "<strong>نکته:</strong> ",
+'note' => "<strong>نکته:</strong>",
'previewnote' => "توجه کنید Ú©Ù‡ این Ùقط پیش‌نمایش است، Ùˆ ذخیره نشده است!",
'previewconflict' => "این پیش‌نمایش منعکس‌کننده‌ی متن ناحیه‌ی ویرایش متن بالایی است،
به شکلی که اگر بخواهید متن را ذخیره کنید نشان داده خواهد شد.",
@@ -480,7 +481,7 @@ $2 تغییرمسیرها Ùهرست شوند &nbsp; جستجو برای $3 $9",
'dateformat' => "قالب تاریخ",
'math_failure' => "شکست در تجزیه",
'math_unknown_error' => "خطای ناشناخته",
-'math_unknown_function' => "تابع ناشناخته‌ی ",
+'math_unknown_function' => "تابع ناشناخته‌ی",
'math_lexing_error' => "خطای lexing",
'math_syntax_error' => "خطای نحوی",
'math_image_error' => "تبدیل به PNG شکست خورد",
@@ -749,7 +750,7 @@ $3...
'exblank' => "صÙحه خالی بود",
'confirmdelete' => "تأیید حذÙ",
'deletesub' => "(در حال حذ٠«$1»)",
-'historywarning' => "هشدار: صÙحه‌ای Ú©Ù‡ دارید حذ٠می‌کند تاریخچه‌ای دارد: ",
+'historywarning' => "هشدار: صÙحه‌ای Ú©Ù‡ دارید حذ٠می‌کند تاریخچه‌ای دارد:",
'actioncomplete' => "عمل انجام شد",
'deletedtext' => "«$1» حذ٠شده است.
برای سابقه‌ی حذÙ‌های اخیر به $2 مراجعه کنید.",
@@ -764,10 +765,10 @@ $3...
'deletecomment' => "دلیل حذÙ",
'imagereverted' => "برگرداندن به نسخه‌ی قدیمی‌تر با موÙقیت انجام شد.",
'cantrollback' => "نمی‌توان ویرایش را برگرداند؛ آخرین مشارکت‌کننده تنها مؤل٠این مقاله است.",
-'alreadyrolled' => "Cannot rollback last edit of [[$1]]
+'alreadyrolled' => "Cannot rollback last edit of [[:$1]]
by [[User:$2|$2]] ([[User talk:$2|Talk]]); someone else has edited or rolled back the article already.
-آخرین ویرایش توسط [[کاربر:$3|$3]] ([[بحث کاربر:$3|بحث]]). ",
+آخرین ویرایش توسط [[کاربر:$3|$3]] ([[بحث کاربر:$3|بحث]]).",
# only shown if there is an edit comment
'editcomment' => "توضیح ویرایش این بود: \"<i>$1</i>\".",
'revertpage' => "ویرایش $2 برگردانده شد، به آخرین تغییری که $1 انجام داده است",
diff --git a/languages/messages/MessagesFi.php b/languages/messages/MessagesFi.php
index a259d4ee..f1e787ed 100644
--- a/languages/messages/MessagesFi.php
+++ b/languages/messages/MessagesFi.php
@@ -64,8 +64,8 @@ $namespaceNames = array(
NS_PROJECT_TALK => 'Keskustelu_{{grammar:elative|$1}}',
NS_IMAGE => 'Kuva',
NS_IMAGE_TALK => 'Keskustelu_kuvasta',
- NS_MEDIAWIKI => 'MediaWiki',
- NS_MEDIAWIKI_TALK => 'MediaWiki_talk',
+ NS_MEDIAWIKI => 'Järjestelmäviesti',
+ NS_MEDIAWIKI_TALK => 'Keskustelu_järjestelmäviestistä',
NS_TEMPLATE => 'Malline',
NS_TEMPLATE_TALK => 'Keskustelu_mallineesta',
NS_HELP => 'Ohje',
@@ -77,6 +77,76 @@ $namespaceNames = array(
$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
$linkTrail = '/^([a-zäö]+)(.*)$/sDu';
+$specialPageAliases = array(
+ 'DoubleRedirects' => array( 'Kaksinkertaiset_uudelleenohjaukset' ),
+ 'BrokenRedirects' => array( 'Virheelliset_uudelleenohjaukset' ),
+ 'Disambiguations' => array( 'Täsmennyssivut' ),
+ 'Userlogin' => array( 'Kirjaudu_sisään' ),
+ 'Userlogout' => array( 'Kirjaudu_ulos' ),
+ 'Preferences' => array( 'Asetukset' ),
+ 'Watchlist' => array( 'Tarkkailulista' ),
+ 'Recentchanges' => array( 'Tuoreet_muutokset' ),
+ 'Upload' => array( 'Lisää_tiedosto' ),
+ 'Imagelist' => array( 'Tiedostoluettelo' ),
+ 'Newimages' => array( 'Uudet_kuvat' ),
+ 'Listusers' => array( 'Käyttäjät' ),
+ 'Statistics' => array( 'Tilastot' ),
+ 'Randompage' => array( 'Satunnainen_sivu' ),
+ 'Lonelypages' => array( 'Yksinäiset_sivut' ),
+ 'Uncategorizedpages' => array( 'Luokittelemattomat_sivut' ),
+ 'Uncategorizedcategories' => array( 'Luokittelemattomat_luokat' ),
+ 'Uncategorizedimages' => array( 'Luokittelemattomat_tiedostot' ),
+ 'Unusedcategories' => array( 'Käyttämättömät_luokat' ),
+ 'Unusedimages' => array( 'Käyttämättömät_tiedostot' ),
+ 'Wantedpages' => array( 'Halutuimmat_sivut' ),
+ 'Wantedcategories' => array( 'Halutuimmat_luokat' ),
+ 'Mostlinked' => array( 'Viitatuimmat_sivut' ),
+ 'Mostlinkedcategories' => array( 'Viitatuimmat_luokat' ),
+ 'Mostcategories' => array( 'Luokitelluimmat_sivut' ),
+ 'Mostimages' => array( 'Viitatuimmat_kuvat' ),
+ 'Mostrevisions' => array( 'Muokatuimmat_sivut' ),
+ 'Shortpages' => array( 'Lyhyet_sivut' ),
+ 'Longpages' => array( 'Pitkät_sivut' ),
+ 'Newpages' => array( 'Uudet_sivut' ),
+ 'Ancientpages' => array( 'Kuolleet_sivut' ),
+ 'Deadendpages' => array( 'Linkittömät_sivut' ),
+ 'Allpages' => array( 'Kaikki_sivut' ),
+ 'Prefixindex' => array( 'Etuliiteluettelo' ) ,
+ 'Ipblocklist' => array( 'Muokkausestot' ),
+ 'Specialpages' => array( 'Toimintosivut' ),
+ 'Contributions' => array( 'Muokkaukset' ),
+ 'Emailuser' => array( 'Lähetä_sähköpostia' ),
+ 'Whatlinkshere' => array( 'Tänne_viittaavat_sivut' ),
+ 'Recentchangeslinked' => array( 'Linkitetyt_muutokset' ),
+ 'Movepage' => array( 'Siirrä_sivu' ),
+ 'Blockme' => array( 'Estä_minut' ),
+ 'Booksources' => array( 'Kirjalähteet' ),
+ 'Categories' => array( 'Luokat' ),
+ 'Export' => array( 'Vie_sivuja' ),
+ 'Version' => array( 'Versio' ),
+ 'Allmessages' => array( 'Järjestelmäviestit' ),
+ 'Log' => array( 'Loki', 'Lokit' ),
+ 'Blockip' => array( 'Estä' ),
+ 'Undelete' => array( 'Palauta' ),
+ 'Import' => array( 'Tuo_sivuja' ),
+ 'Lockdb' => array( 'Lukitse_tietokanta' ),
+ 'Unlockdb' => array( 'Avaa_tietokanta' ),
+ 'Userrights' => array( 'Käyttöoikeudet' ),
+ 'MIMEsearch' => array( 'MIME-haku' ),
+ 'Unwatchedpages' => array( 'Tarkkailemattomat_sivut' ),
+ 'Listredirects' => array( 'Uudelleenohjaukset' ),
+ 'Listinterwikis' => array( 'Ulkowikilinkit' ),
+ 'Revisiondelete' => array( 'Poista_muokkaus' ),
+ 'Unusedtemplates' => array( 'Käyttämättömät_mallineet' ),
+ 'Randomredirect' => array( 'Satunnainen_uudelleenohjaus' ),
+ 'Mypage' => array( 'Oma_sivu' ),
+ 'Mytalk' => array( 'Oma_keskustelu' ),
+ 'Mycontributions' => array( 'Omat_muokkaukset' ),
+ 'Listadmins' => array( 'Ylläpitäjät' ),
+ 'Popularpages' => array( 'Suositut_sivut' ),
+ 'Search' => array( 'Haku' ),
+ 'Resetpass' => array( 'Alusta_salasana' ),
+);
$messages = array(
@@ -98,6 +168,8 @@ $messages = array(
'tog-editwidth' => 'Muokkauskenttä on sivun levyinen',
'tog-watchcreations' => 'Lisää luomani sivut tarkkailulistalle',
'tog-watchdefault' => 'Lisää oletuksena uudet ja muokatut sivut tarkkailulistalle',
+'tog-watchmoves' => 'Lisää siirtämäni sivut tarkkailulistalle',
+'tog-watchdeletion' => 'Lisää poistamani sivut tarkkailulistalle',
'tog-minordefault' => 'Muutokset ovat oletuksena pieniä',
'tog-previewontop' => 'Näytä esikatselu muokkauskentän yläpuolella',
'tog-previewonfirst' => 'Näytä esikatselu heti, kun muokkaus aloitetaan',
@@ -112,10 +184,12 @@ $messages = array(
'tog-externaldiff' => 'Käytä ulkoista diff-ohjelmaa oletuksena',
'tog-showjumplinks' => 'Lisää loikkaa-käytettävyyslinkit sivun alkuun',
'tog-uselivepreview' => 'Käytä pikaesikatselua (JavaScript) (kokeellinen)',
-'tog-autopatrol' => 'Merkitse tekemäni muutokset tarkastetuiksi',
'tog-forceeditsummary'=> 'Huomauta, jos yhteenvetoa ei ole annettu',
'tog-watchlisthideown' => 'Piilota omat muokkaukset',
'tog-watchlisthidebots' => 'Piilota bottien muokkaukset',
+'tog-watchlisthideminor'=> 'Piilota pienet muokkaukset',
+'tog-nolangconversion' => 'Disable variants conversion',
+'tog-ccmeonemails' => 'Lähetä minulle kopio MediaWikin kautta lähetetyistä sähköposteista',
'underline-always' => 'Aina',
'underline-never' => 'Ei koskaan',
@@ -177,9 +251,11 @@ $messages = array(
# Bits of text used by many pages:
#
-'categories' => '{{PLURAL:$1|Luokka|Luokat}}',
+'categories' => 'Luokat',
+'pagecategories' => '{{PLURAL:$1|Luokka|Luokat}}',
'category_header' => 'Sivut, jotka ovat luokassa $1',
'subcategories' => 'Alaluokat',
+'category-media-header' => 'Luokan â€$1†sisältämät mediatiedostot',
'mainpage' => 'Etusivu',
'mainpagetext' => '\'\'\'Mediawiki on onnistuneesti asennettu.\'\'\'',
'mainpagedocfooter' => 'Lisätietoja käytöstä on sivulla [http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide User\'s Guide].
@@ -228,7 +304,7 @@ Taivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) — {{GRAMMAR:partitive
'navigation' => 'Valikko',
# Metadata in edit box
-'metadata_help' => 'Sisältökuvaukset (lisätietoja sivulla [[{{ns:project}}:Sisältökuvaukset]]):',
+'metadata_help' => 'Sisältökuvaukset (lisätietoja sivulla [[Project:Sisältökuvaukset]]):',
'currentevents' => 'Ajankohtaista',
'currentevents-url' => '{{ns:project}}:Ajankohtaista',
@@ -242,10 +318,10 @@ Taivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) — {{GRAMMAR:partitive
'tagline' => '{{SITENAME}}',
'whatlinkshere' => 'Tänne viittaavat sivut',
'help' => 'Ohje',
-'search' => 'Etsi',
+'search' => 'Haku',
'searchbutton' => 'Etsi',
'go' => 'Siirry',
-'searcharticle' => 'Siirry',
+'searcharticle' => 'Siirry',
'history' => 'Historia',
'history_short' => 'Historia',
'updatedmarker' => 'päivitetty viimeisimmän käyntisi jälkeen',
@@ -365,10 +441,12 @@ Taivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) — {{GRAMMAR:partitive
'perfdisabledsub' => 'Tässä on tallennettu kopio $1', # obsolete? ei ole
'perfcached' => 'Seuraava data on tuotu välimuistista, eikä se ole välttämättä ajan tasalla.',
'perfcachedts' => 'Seuraava data on tuotu välimuistista ja se päivitettiin viimeksi $1.',
+'querypage-no-updates'=> 'Tämän sivun tietoja ei toistaiseksi päivitetä.',
'wrong_wfQuery_params'=> 'Virheelliset parametrit wfQuery()<br />Funktio: $1<br />Tiedustelu: $2',
'viewsource' => 'Lähdekoodi',
'viewsourcefor' => 'sivulle $1',
-'protectedtext' => '<big>\'\'\'Tämä sivu on suojattu muutoksilta\'\'\'</big><hr />Sivun lähdekoodi:',
+'protectedpagetext' => 'Tämä sivu on suojattu muutoksilta.',
+'viewsourcetext' => 'Voit tarkastella ja kopioida tämän sivun lähdekoodia:',
'protectedinterface' => 'Tämä sivu sisältää ohjelmiston käyttöliittymätekstiä ja on suojattu häiriköinnin estämiseksi.',
'editinginterface' => '<center>Muokkaat sivua, joka sisältää ohjelmiston käyttöliittymätekstiä.</center>',
'sqlhidden' => '(SQL-kysely piilotettu)',
@@ -431,7 +509,9 @@ Taivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) — {{GRAMMAR:partitive
'passwordremindertext'=> 'Joku IP-osoitteesta $1 pyysi {{GRAMMAR:partitive|{{SITENAME}}}} ($4) lähettämään uuden salasanan. Salasana käyttäjälle $2 on nyt $3. Kirjaudu sisään ja vaihda salasana.',
'noemail' => 'Käyttäjälle \'\'\'$1\'\'\' ei ole määritelty sähköpostiosoitetta.',
'passwordsent' => 'Uusi salasana on lähetetty käyttäjän <b>$1</b> sähköpostiosoitteeseen.',
+'blocked-mailpassword'=> 'Osoitteellesi on asetettu muokkausesto, joka estää käyttämästä salasanamuistutustoimintoa.',
'eauthentsent' => 'Varmennussähköposti on lähetetty annettuun sähköpostiosoitteeseen. Muita viestejä ei lähetetä, ennen kuin olet toiminut viestin ohjeiden mukaan ja varmistanut, että sähköpostiosoite kuuluu sinulle.',
+'throttled-mailpassword' => 'Salasanamuistutus on lähetetty viimeisen $1 tunnin sisällä. Salasanamuistutuksia lähetään enintään $1 tunnin välein.',
'mailerror' => 'Virhe lähetettäessä sähköpostia: $1',
'acct_creation_throttle_hit' => 'Olet jo luonut $1 tunnusta. Et voi luoda uutta.',
'emailauthenticated' => 'Sähköpostiosoitteesi varmennettiin $1.',
@@ -442,7 +522,16 @@ Taivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) — {{GRAMMAR:partitive
'accountcreated' => 'Käyttäjätunnus luotiin',
'accountcreatedtext' => 'Käyttäjän $1 käyttäjätunnus luotiin.',
-
+# Password reset dialog
+'resetpass' => 'Salasanan alustus',
+'resetpass_announce' => 'Kirjauduit sisään sähköpostitse lähetetyllä väliaikaissalasanalla. Päätä sisäänkirjautuminen asettamalla uusi salasana.',
+'resetpass_text' => "<!-- Lisää tekstiä tähän -->",
+'resetpass_header' => 'Uuden salasanan asettaminen',
+'resetpass_submit' => 'Aseta salasana ja kirjaudu sisään',
+'resetpass_success' => 'Salasanan vaihto onnistui.',
+'resetpass_bad_temporary' => 'Kelvoton väliaikaissalasana. Olet saattanut jo asettaa uuden salasanan tai pyytänyt uutta väliaikaissalasanaa.',
+'resetpass_forbidden' => 'Salasanoja ei voi vaihtaa tässä wikissä',
+'resetpass_missing' => 'Ei syötettä.',
# Edit page toolbar
'bold_sample' => 'Lihavoitu teksti',
@@ -480,8 +569,11 @@ Taivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) — {{GRAMMAR:partitive
'anoneditwarning' => 'Et ole kirjautunut sisään. IP-osoitteesi kirjataan tämän sivun muokkaushistoriaan.',
'missingsummary' => 'Et ole antanut yhteenvetoa. Jos valitset Tallenna uudelleen, niin muokkauksesi tallennetaan ilman yhteenvetoa.',
'missingcommenttext' => 'Anna yhteenveto alle.',
+'missingcommentheader'=> 'Et ole antanut otsikkoa kommentillesi. Valitse <em>Tallenna</em>, jos et halua antaa otsikkoa.',
+'summary-preview' => 'Yhteenvedon esikatelu',
+'subject-preview' => 'Otsikon esikatselu',
'blockedtitle' => 'Pääsy estetty',
-'blockedtext' => 'Yritit muokata sivua tai luoda uuden sivun. $1 on estänyt pääsysi {{GRAMMAR:illative|{{SITENAME}}}} joko käyttäjänimesi tai IP-osoitteesi perusteella. Annettu syy estolle on: <br />\'\'$2\'\'<br />Jos olet sitä mieltä, että sinut on estetty syyttä, voit keskustella asiasta [[{{ns:project}}:Ylläpitäjät|ylläpitäjän]] kanssa. Huomaa, ettet voi lähettää sähköpostia {{GRAMMAR:genitive|{{SITENAME}}}} kautta, ellet ole asettanut olemassaolevaa sähköpostiosoitetta [[{{ns:special}}:Preferences|asetuksissa]]. Jos IP-osoitteesi on dynaaminen, eli se voi toisinaan vaihtua, olet saattanut saada estetyn osoitteen käyttöösi, ja esto vaikuttaa nyt sinuun. Jos tämä ongelma toistuu jatkuvasti, ota yhteyttä Internet-palveluntarjoajaasi tai {{GRAMMAR:genitive|{{SITENAME}}}} ylläpitäjään. Ilmoita IP-osoitteesi, joka on $3.',
+'blockedtext' => 'Yritit muokata sivua tai luoda uuden sivun. $1 on estänyt pääsysi {{GRAMMAR:illative|{{SITENAME}}}} joko käyttäjänimesi tai IP-osoitteesi perusteella. Annettu syy estolle on: <br />\'\'$2\'\'<br />Jos olet sitä mieltä, että sinut on estetty syyttä, voit keskustella asiasta [[Project:Ylläpitäjät|ylläpitäjän]] kanssa. Huomaa, ettet voi lähettää sähköpostia {{GRAMMAR:genitive|{{SITENAME}}}} kautta, ellet ole asettanut olemassaolevaa sähköpostiosoitetta [[Special:Preferences|asetuksissa]]. Jos IP-osoitteesi on dynaaminen, eli se voi toisinaan vaihtua, olet saattanut saada estetyn osoitteen käyttöösi, ja esto vaikuttaa nyt sinuun. Jos tämä ongelma toistuu jatkuvasti, ota yhteyttä Internet-palveluntarjoajaasi tai {{GRAMMAR:genitive|{{SITENAME}}}} ylläpitäjään. IP-osoitteesi on $3 ja estotunnus on #$5.',
'blockedoriginalsource' => 'Sivun â€$1†lähdekoodi:',
'blockededitsource' => 'Muokkauksesi sivuun â€$1â€:',
'whitelistedittitle' => 'Sisäänkirjautuminen vaaditaan muokkaamiseen',
@@ -500,7 +592,7 @@ Taivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) — {{GRAMMAR:partitive
'accmailtext' => 'käyttäjän \'\'\'$1\'\'\' salasana on lähetetty osoitteeseen \'\'\'$2\'\'\'.',
'newarticle' => '(uusi)',
'newarticletext' => 'Linkki toi sivulle, jota ei vielä ole. Voit luoda sivun kirjoittamalla alla olevaan tilaan. Jos et halua luoda sivua, käytä selaimen paluutoimintoa.',
-'anontalkpagetext' => '----\'\'Tämä on nimettömän käyttäjän keskustelusivu. Hän ei ole joko luonut itselleen käyttäjätunnusta tai ei käytä sitä. Siksi hänet tunnistetaan nyt numeerisella IP-osoitteella. Kyseinen IP-osoite voi olla useamman henkilön käytössä. Jos olet nimetön käyttäjä, ja sinusta tuntuu, että aiheettomia kommentteja on ohjattu sinulle, [[{{ns:special}}:Userlogin|luo itsellesi käyttäjätunnus tai kirjaudu sisään]] välttääksesi jatkossa sekaannukset muiden nimettömien käyttäjien kanssa.\'\'',
+'anontalkpagetext' => '----\'\'Tämä on nimettömän käyttäjän keskustelusivu. Hän ei ole joko luonut itselleen käyttäjätunnusta tai ei käytä sitä. Siksi hänet tunnistetaan nyt numeerisella IP-osoitteella. Kyseinen IP-osoite voi olla useamman henkilön käytössä. Jos olet nimetön käyttäjä, ja sinusta tuntuu, että aiheettomia kommentteja on ohjattu sinulle, [[Special:Userlogin|luo itsellesi käyttäjätunnus tai kirjaudu sisään]] välttääksesi jatkossa sekaannukset muiden nimettömien käyttäjien kanssa.\'\'',
'noarticletext' => '<big>\'\'\'{{GRAMMAR:inessive|{{SITENAME}}}} ei ole tämän nimistä sivua.\'\'\'</big>
* Voit kirjoittaa uuden sivun \'\'\'<span class="plainlinks">[{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} {{PAGENAME}}]</span>.\'\'\'
* Jos olet luonut sivun tällä nimellä, se on saatettu poistaa — katso [[Special:Log/delete|poistoloki]].',
@@ -535,7 +627,7 @@ Yritä uudelleen. Jos ongelma ei katoa, yritä kirjautua ulos ja takaisin sisäÃ
'nonunicodebrowser' => '\'\'\'Varoitus: Selaimesi ei ole Unicode-yhteensopiva. Ole hyvä ja vaihda selainta, ennen kuin muokkaat sivua.\'\'\'',
'editingold' => '<center><strong>Varoitus</strong>: Olet muokkaamassa vanhaa versiota tämän sivun tekstistä. Jos tallennat sen, kaikki tämän version jälkeen tehdyt muutokset katoavat.</center>',
'yourdiff' => 'Eroavaisuudet',
-'copyrightwarning' => '<strong>Muutoksesi astuvat voimaan välittömästi.</strong> Jos haluat harjoitella muokkaamista, ole hyvä ja käytä [[{{ns:project}}:Hiekkalaatikko|hiekkalaatikkoa]].<br /><br />Kaikki {{GRAMMAR:illative|{{SITENAME}}}} tehtävät tuotokset katsotaan julkaistuksi $2 -lisenssin mukaisesti ($1). Jos et halua, että kirjoitustasi muokataan armottomasti ja uudelleenkäytetään vapaasti, älä tallenna kirjoitustasi. Tallentamalla muutoksesi lupaat, että kirjoitit tekstisi itse, tai kopioit sen jostain vapaasta lähteestä. <strong>ÄLÄ KÄYTÄ TEKIJÄNOIKEUDEN ALAISTA MATERIAALIA ILMAN LUPAA!</strong>',
+'copyrightwarning' => '<strong>Muutoksesi astuvat voimaan välittömästi.</strong> Jos haluat harjoitella muokkaamista, ole hyvä ja käytä [[Project:Hiekkalaatikko|hiekkalaatikkoa]].<br /><br />Kaikki {{GRAMMAR:illative|{{SITENAME}}}} tehtävät tuotokset katsotaan julkaistuksi $2 -lisenssin mukaisesti ($1). Jos et halua, että kirjoitustasi muokataan armottomasti ja uudelleenkäytetään vapaasti, älä tallenna kirjoitustasi. Tallentamalla muutoksesi lupaat, että kirjoitit tekstisi itse, tai kopioit sen jostain vapaasta lähteestä. <strong>ÄLÄ KÄYTÄ TEKIJÄNOIKEUDEN ALAISTA MATERIAALIA ILMAN LUPAA!</strong>',
'copyrightwarning2' => '>Huomaa, että kuka tahansa voi muokata, muuttaa ja poistaa kaikkia sivustolle tekemiäsi lisäyksiä ja muutoksia. Muokkaamalla sivustoa luovutat sivuston käyttäjille tämän oikeuden ja takaat, että lisäämäsi aineisto on joko itse kirjoittamaasi tai peräisin jostain vapaasta lähteestä. Lisätietoja sivulla $1. <strong>TEKIJÄNOIKEUDEN ALAISEN MATERIAALIN KÄYTTÄMINEN ILMAN LUPAA ON EHDOTTOMASTI KIELLETTYÄ!</strong>',
'longpagewarning' => '<center>Tämän sivun tekstiosuus on $1 binäärikilotavua pitkä. Harkitse, voisiko sivun jakaa pienempiin osiin.</center>',
'longpageerror' => '<strong>Sivun koko on $1 binäärikilotavua. Sivua ei voida tallentaa, koska enimmäiskoko on $2 binäärikilotavua.</strong>',
@@ -543,12 +635,21 @@ Yritä uudelleen. Jos ongelma ei katoa, yritä kirjautua ulos ja takaisin sisäÃ
'protectedpagewarning'=> '<center><small>Tämä sivu on lukittu. Vain ylläpitäjät voivat muokata sitä.</small></center>',
'semiprotectedpagewarning' => 'Vain rekisteröityneet käyttäjät voivat muokata tätä sivua.',
'templatesused' => 'Tällä sivulla käytetyt mallineet:',
+'templatesusedpreview'=> 'Esikatselussa mukana olevat mallineet:',
+'templatesusedsection'=> 'Tässä osiossa mukana olevat mallineet:',
+'template-protected' => '(suojattu)',
+'template-semiprotected' => '(suojattu anonyymeiltä ja uusilta käyttäjiltä)',
'edittools' => '<!-- Tässä oleva teksi näytetään muokkauskentän alla. -->',
'nocreatetitle' => 'Sivujen luominen on rajoitettu',
'nocreatetext' => 'Et voi luoda uusia sivuja. Voit muokata olemassa olevia sivuja tai luoda [[Special:Userlogin|käyttäjätunnukssen]].',
+
+# "Undo" feature
+'undo-success' => 'Kumoaminen onnistui. Valitse <em>tallenna</em> toteuttaaksesi muutokset.',
+'undo-failure' => 'Muokkausta ei voitu kumota välissä olevien ristiriistaisten muutosten vuoksi. Kumoa muutokset käsin.',
+'undo-summary' => 'Kumottu muokkaus #$1, jonka teki [[Special:Contributions/$2|$2]] ([[User_talk:$2|keskustelu]])',
+
'cantcreateaccounttitle' => 'Tunnuksen luominen epäonnistui',
-'cantcreateaccounttext' => 'Tunnuksien luominen tästä IP-osoitteesta ($1) on estetty.
-Syynä tähän on luultavasti jatkuva häiriköinti yhteiskäyttökoneelta.',
+'cantcreateaccounttext' => 'Tunnuksien luominen tästä IP-osoitteesta ($1) on estetty. Syynä tähän on luultavasti jatkuva häiriköinti yhteiskäyttökoneelta.',
# History pages
#
@@ -560,7 +661,7 @@ Syynä tähän on luultavasti jatkuva häiriköinti yhteiskäyttökoneelta.',
'loadhist' => 'Ladataan sivuhistoriaa',
'currentrev' => 'Nykyinen versio',
'revisionasof' => 'Versio $1',
-'old-revision-navigation' => 'Versio hetkellä $1 – tehnyt $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'Versio hetkellä $1 – tehnyt $2',
'previousrevision' => '↠Vanhempi versio',
'nextrevision' => 'Uudempi versio →',
'currentrevisionlink' => 'Nykyinen versio',
@@ -605,11 +706,13 @@ Syynä tähän on luultavasti jatkuva häiriköinti yhteiskäyttökoneelta.',
'selectnewerversionfordiff' => 'Valitse uudempi versio vertailuun',
'selectolderversionfordiff' => 'Valitse vanhempi versio vertailuun',
'compareselectedversions' => 'Vertaile valittuja versioita',
+'editundo' => 'kumoa',
+'diff-multi' => '(Versioiden välissä {{PLURAL:$1|yksi muu muokkaus|$1 muuta muokkausta}}.)',
# Search results
#
'searchresults' => 'Hakutulokset',
-'searchresulttext' => 'Saadaksesi lisätietoa hakutoiminnoista tällä sivustolla lue [[{{ns:project}}:Hakutoiminnot|sivuston hakuohje]].',
+'searchresulttext' => 'Saadaksesi lisätietoa hakutoiminnoista tällä sivustolla lue [[Project:Hakutoiminnot|sivuston hakuohje]].',
'searchsubtitle' => 'Haku termeillä [[:$1]]',
'searchsubtitleinvalid'=> 'Haku termeillä $1',
'badquery' => 'Kelvoton hakumerkkijono',
@@ -720,6 +823,7 @@ Syynä tähän on luultavasti jatkuva häiriköinti yhteiskäyttökoneelta.',
'changes' => 'muutosta',
'recentchanges' => 'Tuoreet muutokset',
'recentchangestext' => 'Tällä sivulla voi seurata tuoreita {{GRAMMAR:illative|{{SITENAME}}}} tehtyjä muutoksia.',
+'recentchanges-feed-description' => 'Tällä sivulla voi seurata tuoreita {{GRAMMAR:illative|{{SITENAME}}}} tehtyjä muutoksia.',
'rcnote' => 'Alla on <b>$1</b> tuoreinta muutosta viimeisten <b>$2</b> päivän ajalta $3.',
'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',
@@ -745,27 +849,27 @@ Syynä tähän on luultavasti jatkuva häiriköinti yhteiskäyttökoneelta.',
# Upload
#
-'upload' => 'Tallenna tiedosto',
-'uploadbtn' => 'Tallenna tiedosto',
-'reupload' => 'Uusi tallennus',
-'reuploaddesc' => 'Paluu tallennuslomakkeelle.',
+'upload' => 'Lisää tiedosto',
+'uploadbtn' => 'Lähetä tiedosto',
+'reupload' => 'Lähetä uudelleen',
+'reuploaddesc' => 'Palaa lähetyslomakkeelle.',
'uploadnologin' => 'Et ole kirjautunut sisään',
-'uploadnologintext' => 'Sinun pitää olla [[Special:Userlogin|kirjautuneena sisään]], jotta voisit tallentaa tiedostoja.',
+'uploadnologintext' => 'Sinun pitää olla [[Special:Userlogin|kirjautuneena sisään]], jotta voisit lisätä tiedostoja.',
'upload_directory_read_only' => 'Palvelimella ei ole kirjoitusoikeuksia tallennushakemistoon â€<tt>$1</tt>â€.',
'uploaderror' => 'Tallennusvirhe',
-'uploadtext' => '\'\'\'SEIS!\'\'\' Ennen kuin tallennat tiedostoja {{GRAMMAR:illative|{{SITENAME}}}}, tutustu [[{{ns:project}}:Tiedostojen tallennus|sääntöihin]] ja noudata niitä.
-*\'\'Kirjoita tiedoston tietoihin tarkka tieto tiedoston lähteestä.\'\' Jos teit tiedoston itse, sano se. Jos löysit tiedoston Internetistä, varmista, että sitä saa käyttää {{GRAMMAR:inessive|{{SITENAME}}}} laita mukaan linkki kyseiselle sivulle.
+'uploadtext' => 'Ennen kuin lähetät tiedostoja {{GRAMMAR:illative|{{SITENAME}}}}, lue seuraava:
+*\'\'Kirjoita tiedoston tietoihin tarkka tieto tiedoston lähteestä.\'\'
*\'\'Kerro tiedoston tekijänoikeuksien tila.\'\'
-*\'\'Käytä järkevää tiedostonimeä.\'\' Nimeä tiedostosi mieluummin tyyliin â€Eiffel-torni Pariisissa, yökuva.jpg†kuin â€etpan1024c.jpgâ€. Näin vältät mahdollisesti jo olemassa olevan tiedoston korvaamisen omallasi. Voit etsiä aikaisemmin tallennettuja tiedostoja [[Special:Imagelist|tiedostoluettelosta]].
+*\'\'Käytä järkevää tiedostonimeä.\'\' Nimeä tiedostosi mieluummin tyyliin â€Eiffel-torni Pariisissa, yökuva.jpg†kuin â€etpan1024c.jpgâ€. Näin vältät mahdollisesti jo olemassa olevan tiedoston korvaamisen omallasi.
*Laita johonkin aiheeseen liittyvään sivuun linkki kyseiseen tiedostoon, tai kirjoita kuvaussivulle kuvaus tiedoston sisällöstä.
-*Jos haluat nähdä tai etsiä aiemmin tallennettuja tiedostoja, katso [[Special:Imagelist|tiedostoluettelo]]. Tallennukset ja poistot kirjataan [[Special:Log/upload|tallennuslokiin]].
+*Jos haluat nähdä tai etsiä aiemmin lisättyjä tiedostoja, katso [[Special:Imagelist|tiedostoluettelo]]. Tallennukset ja poistot kirjataan [[Special:Log/upload|tiedostolokiin]].
Suositellut kuvaformaatit ovat JPEG valokuville, PNG piirroksille ja kuvakkeille ja Ogg Vorbis äänille. Voit liittää kuvan sivulle käyttämällä seuraavan muotoista merkintää \'\'\'<nowiki>[[Kuva:tiedosto.jpg]]</nowiki>\'\'\' tai \'\'\'<nowiki>[[Kuva:tiedosto.png|kuvausteksti]]</nowiki>\'\'\' tai \'\'\'<nowiki>[[media:tiedosto.ogg]]</nowiki>\'\'\' äänille.
-Huomaa, että {{GRAMMAR:inessive|{{SITENAME}}}} muut voivat muokata tai poistaa tallentamasi tiedoston, jos he katsovat, että se ei palvele projektin tarpeita. Tallentamismahdollisuutesi voidaan estää, jos käytät järjestelmää väärin.',
-'uploadlog' => 'Tallennusloki',
-'uploadlogpage' => 'Tallennusloki',
-'uploadlogpagetext' => 'Alla on luettelo uusimmista tallennuksista. Kaikki ajat näytetään palvelimen aikavyöhykkeessä (UTC).',
+Huomaa, että {{GRAMMAR:inessive|{{SITENAME}}}} muut voivat muokata tai poistaa lähettämäsi tiedoston, jos he katsovat, että se ei palvele projektin tarpeita. Tallentamismahdollisuutesi voidaan estää, jos käytät järjestelmää väärin.',
+'uploadlog' => 'Tiedostoloki',
+'uploadlogpage' => 'Tiedostoloki',
+'uploadlogpagetext' => 'Alla on luettelo uusimmista tiedostonlisäyksistä. Kaikki ajat näytetään palvelimen aikavyöhykkeessä (UTC).',
'filename' => 'Tiedoston nimi',
'filedesc' => 'Yhteenveto',
'fileuploadsummary' => 'Yhteenveto:',
@@ -773,16 +877,16 @@ Huomaa, että {{GRAMMAR:inessive|{{SITENAME}}}} muut voivat muokata tai poistaa
'filesource' => 'Lähde',
'copyrightpage' => '{{ns:project}}:Tekijänoikeudet',
'copyrightpagename' => '{{SITENAME}} ja tekijänoikeudet',
-'uploadedfiles' => 'Tallennetut tiedostot',
+'uploadedfiles' => 'Lisätyt tiedostot',
'ignorewarning' => 'Tallenna tiedosto varoituksesta huolimatta.',
'ignorewarnings' => 'Ohita kaikki varoitukset',
'minlength' => 'Tiedoston nimessä pitää olla vähintään kolme merkkiä.',
-'illegalfilename' => 'Tiedoston nimessä \'\'\'$1\'\'\' on merkkejä, joita ei sallita sivujen nimissä. Vaihda tiedoston nimeä, ja yritä tallentamista uudelleen.',
+'illegalfilename' => 'Tiedoston nimessä \'\'\'$1\'\'\' on merkkejä, joita ei sallita sivujen nimissä. Vaihda tiedoston nimeä, ja yritä lähettämistä uudelleen.',
'badfilename' => 'Tiedoston nimi vaihdettiin: $1.',
'badfiletype' => 'â€<tt>.$1</tt>†ei ole suositeltava tiedostomuoto.',
-'largefile' => 'Tiedostojen ei tulisi olla yli $1 kilotavun kokoisia. Tiedoston, jonka yritit tallentaa, koko on $2.',
+'large-file' => 'Tiedostojen enimmäiskoko on $1. Lähettämäsi tiedoston koko on $2.',
'largefileserver' => 'Tämä tiedosto on suurempi kuin mitä palvelin sallii.',
-'emptyfile' => 'Tiedosto, jonka yritit tallentaa näyttää olevan tyhjä. Tarkista, että kirjoitit polun ja nimen oikein ja että se ei ole liian suuri kohdepalvelimelle.',
+'emptyfile' => 'Tiedosto, jota yritit lähettää, näyttää olevan tyhjä. Tarkista, että kirjoitit polun ja nimen oikein ja että se ei ole liian suuri kohdepalvelimelle.',
'fileexists' => 'Samanniminen tiedosto on jo olemassa. Katso tiedoston sivu $1, jos et ole varma, haluatko muuttaa sitä.',
'fileexists-forbidden'=> 'Samanniminen tiedosto on jo olemassa. Tallenna tiedosto jollakin toisella nimellä. Nykyinen tiedosto: [[{ns:image}:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => 'Samanniminen tiedosto on jo olemassa jaetussa mediavarastossa. Tallenna tiedosto jollakin toisella nimellä. Nykyinen tiedosto: [[Image:$1|thumb|center|$1]]',
@@ -790,16 +894,27 @@ Huomaa, että {{GRAMMAR:inessive|{{SITENAME}}}} muut voivat muokata tai poistaa
'fileuploaded' => 'Tiedosto \'\'\'$1\'\'\' on tallennettu onnistuneesti. Seuraa linkkiä ($2) kuvaussivulle, ja täytä tiedostoon liityvät tiedot, kuten mistä se on peräisin, milloin se on luotu, kuka sen loi ja mahdollisesti muita tietämiäsi tietoja. Jos tiedosto on kuva, voit lisätä sen sivulle näin: \'\'\'<nowiki>[[Kuva:$1|thumb|Kuvaus]]</nowiki>\'\'\'',
'uploadwarning' => 'Tallennusvaroitus',
'savefile' => 'Tallenna',
-'uploadedimage' => 'tallensi tiedoston [[$1]]',
-'uploaddisabled' => '{{GRAMMAR:genitive|{{SITENAME}}}} ei voi tallentaa tiedostoja.',
-'uploaddisabledtext' => 'Tiedostojen tallennus on poistetu käytöstä.',
+'uploadedimage' => 'lisäsi tiedoston [[$1]]',
+'uploaddisabled' => '{{GRAMMAR:genitive|{{SITENAME}}}} ei voi lisätä tiedostoja.',
+'uploaddisabledtext' => 'Tiedostojen lisäys on poistettu käytöstä.',
'uploadscripted' => 'Tämä tiedosto sisältää HTML-koodia tai skriptejä, jotka selain saattaa virheellisesti suorittaa.',
'uploadcorrupt' => 'Tiedosto on vioittunut tai sillä on väärä tiedostopääte. Tarkista tiedosto ja lähetä se uudelleen.',
'uploadvirus' => 'Tiedosto sisältää viruksen. Tarkemmat tiedot: $1',
'sourcefilename' => 'Lähdenimi',
'destfilename' => 'Kohdenimi',
'watchthisupload' => 'Tarkkaile tätä sivua',
-'filewasdeleted' => 'Tämän niminen tiedosto on tallennettu ja poistettu aikaisemmin. Tarkista $1 ennen jatkamista.',
+'filewasdeleted' => 'Tämän niminen tiedosto on lisätty ja poistettu aikaisemmin. Tarkista $1 ennen jatkamista.',
+
+'upload-proto-error' => 'Virheellinen protokolla',
+'upload-proto-error-text' => 'Etälähetys on mahdollista vain osoitteista, jotka alkavat merkkijonolla <code>http://</code> tai <code>ftp://</code>.',
+'upload-file-error' => 'Vakava virhe',
+'upload-file-error-text' => 'Väliaikaistiedoston luominen epäonnistui. Ota yhteyttä sivuston ylläpitäjään.',
+'upload-misc-error' => 'Virhe',
+'upload-misc-error-text' => 'Tiedoston etälähetys ei onnistunut. Varmista, että antamasi osoite on oikein ja toimiva. Jos virhe ei katoa, ota yhteyttä sivuston ylläpitäjään.',
+'upload-curl-error6' => 'Toimimaton osoite',
+'upload-curl-error6-text' => 'Antamaasi osoitteeseen ei saatu yhteyttä. Varmista, että osoite on oikein ja että sivusto on saavutettavissa.',
+'upload-curl-error28' => 'Etälähetyksen aikakatkaisu',
+'upload-curl-error28-text'=> 'Antamastasi osoitteesta ei saatu vastausta määräajassa. Varmista, että sivusto on saavutettavissa ja yritä uudelleen.',
'license' => 'Lisenssi',
'nolicense' => 'Ei lisenssiä',
@@ -811,7 +926,7 @@ Huomaa, että {{GRAMMAR:inessive|{{SITENAME}}}} muut voivat muokata tai poistaa
#
'imagelist' => 'Tiedostoluettelo',
'imagelisttext' => 'Alla on <strong>$1</strong> tiedostoa lajiteltuna <strong>$2</strong>.',
-'imagelistforuser' => 'Käyttäjän â€$1†tallentamat kuvat.',
+'imagelistforuser' => 'Käyttäjän â€$1†lisäämät kuvat.',
'getimagelist' => 'noudetaan tiedostoluetteloa',
'ilsubmit' => 'Hae',
'showlast' => 'Näytä viimeiset $1 tiedostoa lajiteltuna $2.',
@@ -833,12 +948,12 @@ Huomaa, että {{GRAMMAR:inessive|{{SITENAME}}}} muut voivat muokata tai poistaa
'sharedupload' => 'Tämä tiedosto on jaettu ja muut projektit saattavat käyttää sitä.',
'shareduploadwiki' => 'Katso $1 lisätietoja.',
'shareduploadwiki-linktext' => 'kuvaussivulta',
-'noimage' => 'Tämän nimistä tiedostoa ei ole olemassa. Voit $1 {{GRAMMAR:genitive|{{SITENAME}}}}',
-'noimage-linktext' => 'tallentaa tiedoston',
-'uploadnewversion-linktext' => 'Tallenna uusi versio tästä tiedostosta',
+'noimage' => 'Tämän nimistä tiedostoa ei ole olemassa. Voit $1 {{GRAMMAR:illative|{{SITENAME}}}}',
+'noimage-linktext' => 'lisätä tiedoston',
+'uploadnewversion-linktext' => 'Lisää uusi versio tästä tiedostosta',
'imagelist_date' => 'Päiväys',
'imagelist_name' => 'Nimi',
-'imagelist_user' => 'Tallentaja',
+'imagelist_user' => 'Lähettäjä',
'imagelist_size' => 'Koko (tavuja)',
'imagelist_description' => 'Kuvaus',
'imagelist_search_for'=> 'Nimihaku:',
@@ -867,12 +982,12 @@ Huomaa, että {{GRAMMAR:inessive|{{SITENAME}}}} muut voivat muokata tai poistaa
Sivuja on katsottu yhteensä \'\'\'$3\'\'\' kertaa ja muokattu \'\'\'$4\'\'\' kertaa. Keskimäärin yhtä sivua on muokattu \'\'\'$5\'\'\' kertaa, ja muokkausta kohden sivua on katsottu keskimäärin \'\'\'$6\'\'\' kertaa.
Ohjelmiston ylläpitotöitä on jonossa \'\'\'$7\'\'\' kappaletta.',
-'userstatstext' => 'Rekisteröityneitä käyttäjiä on \'\'\'$1\'\'\'. Näistä \'\'\'$2\'\'\' ($4) on ylläpitäjiä ($5).',
+'userstatstext' => 'Rekisteröityneitä käyttäjiä on \'\'\'$1\'\'\'. Näistä \'\'\'$2\'\'\' ($4%) on ylläpitäjiä ($5).',
'statistics-mostpopular' => 'Eniten katsellut sivut',
-'disambiguations' => 'Linkit tarkennusivuihin',
-'disambiguationspage' => '{{ns:project}}:Linkkejä_tarkennussivuihin',
-'disambiguationstext' => 'Seuraavat artikkelit linkittävät <i>tarkennussivuun</i>. Sen sijasta niiden pitäisi linkittää asianomaiseen aiheeseen.<br />Sivua kohdellaan tarkennussivuna jos siihen on linkki sivulta $1.<br />Linkkejä muihin nimiavaruuksiin <i>ei</i> ole listattu tässä.',
+'disambiguations' => 'Linkit täsmennyssivuihin',
+'disambiguationspage' => 'Project:Linkkejä_täsmennyssivuihin',
+'disambiguationstext' => 'Seuraavat artikkelit linkittävät <i>täsmennyssivuun</i>. Sen sijasta niiden pitäisi linkittää asianomaiseen aiheeseen.<br />Sivua kohdellaan täsmennyssivuna jos siihen on linkki sivulta $1.<br />Linkkejä muihin nimiavaruuksiin <i>ei</i> ole listattu tässä.',
'doubleredirects' => 'Kaksinkertaiset uudelleenohjaukset',
'doubleredirectstext' => '<b>Huomio:</b> Tässä listassa saattaa olla virheitä. Yleensä kyseessä on sivu, jossa ensimmäisen #REDIRECTin jälkeen on tekstiä.<br />\nJokaisella rivillä on linkit ensimmäiseen ja toiseen uudelleenohjaukseen sekä toisen uudelleenohjauksen kohteen ensimmäiseen riviin, eli yleensä â€oikeaan†kohteeseen, johon ensimmäisen uudelleenohjauksen pitäisi osoittaa.',
@@ -892,7 +1007,7 @@ Ohjelmiston ylläpitotöitä on jonossa \'\'\'$7\'\'\' kappaletta.',
'lonelypagestext' => 'Seuraaviin sivuhin ei ole linkkejä muualta wikistä.',
'uncategorizedpages' => 'Luokittelemattomat sivut',
'uncategorizedcategories' => 'Luokittelemattomat luokat',
-'uncategorizedimages' => 'Luokittelemattomat kuvat',
+'uncategorizedimages' => 'Luokittelemattomat tiedostot',
'unusedcategories' => 'Käyttämättömät luokat',
'unusedimages' => 'Käyttämättömät tiedostot',
'popularpages' => 'Suositut sivut',
@@ -904,7 +1019,7 @@ Ohjelmiston ylläpitotöitä on jonossa \'\'\'$7\'\'\' kappaletta.',
'mostimages' => 'Kuvat, joihin on eniten linkkejä',
'mostrevisions' => 'Sivut, joilla on eniten muutoksia',
'allpages' => 'Kaikki sivut',
-'prefixindex' => 'Etuliiteluettelo',
+'prefixindex' => 'Sivut otsikon alun mukaan',
'randompage' => 'Satunnainen sivu',
'shortpages' => 'Lyhyet sivut',
'longpages' => 'Pitkät sivut',
@@ -924,14 +1039,22 @@ Ohjelmiston ylläpitotöitä on jonossa \'\'\'$7\'\'\' kappaletta.',
'movethispage' => 'Siirrä tämä sivu',
'unusedimagestext' => 'Huomaa, että muut verkkosivut saattavat viitata tiedostoon suoran URL:n avulla, jolloin tiedosto saattaa olla tässä listassa, vaikka sitä käytetäänkin.',
'unusedcategoriestext'=> 'Nämä luokat ovat olemassa, mutta niitä ei käytetä.',
+
+# Book sources
'booksources' => 'Kirjalähteet',
+'booksources-search-legend' => 'Etsi kirjalähteitä',
+'booksources-isbn' => 'ISBN:',
+'booksources-go' => 'Etsi',
+'booksources-text' => 'Alla linkkejä ulkopuolisiin sivustoihin, joilla myydään uusia ja käytettyjä kirjoja. Sivuilla voi myös olla lisätietoa kirjoista.',
+
'categoriespagetext' => '{{GRAMMAR:inessive|{{SITENAME}}}} on seuraavat luokat:',
'data' => 'Data', // TODO: CHECK ME
'userrights' => 'Käyttöoikeuksien hallinta',
'groups' => 'Ryhmät',
-'booksourcetext' => 'Alla on lista linkeistä ulkopuolisiin sivustoihin, joilla myydään uusia ja käytettyjä kirjoja. Niillä voi myös olla lisätietoa kirjoista, joita etsit. {{SITENAME}} ei liity mitenkään näihin sivustoihin, eikä tätä listaa tule pitää suosituksena tai hyväksyntänä.',
+
'isbn' => 'ISBN',
'unwatchedpages' => 'Tarkkailemattomat sivut',
+'listinterwikis' => 'Ulkowikilinkit',
'listredirects' => 'Uudelleenohjaukset',
'randomredirect' => 'Satunnainen uudelleenohjaus',
@@ -939,12 +1062,13 @@ Ohjelmiston ylläpitotöitä on jonossa \'\'\'$7\'\'\' kappaletta.',
# No reason to overwrite
'alphaindexline' => '$1…$2',
'version' => 'Versio',
-'log' => 'Lokit',
+'log' => 'lokit',
'alllogstext' => 'Yhdistetty lokien näyttö. Voit rajoittaa listaa valitsemalla lokityypin, käyttäjän tai sivun johon muutos on kohdistunut.',
'logempty' => 'Ei tapahtumia lokissa.',
# Special:Allpages
'nextpage' => 'Seuraava sivu ($1)',
+'prevpage' => 'Edellinen sivu ($1)',
'allpagesfrom' => 'Näytä sivuja lähtien sivusta:',
'allarticles' => 'Kaikki sivut',
'allinnamespace' => 'Kaikki sivut nimiavaruudessa $1',
@@ -952,7 +1076,7 @@ Ohjelmiston ylläpitotöitä on jonossa \'\'\'$7\'\'\' kappaletta.',
'allpagesprev' => 'Edellinen',
'allpagesnext' => 'Seuraava',
'allpagessubmit' => 'Vaihda',
-'allpagesprefix' => 'Näytä sivut, jotka alkavat merkkijonolla',
+'allpagesprefix' => 'Näytä sivut, joiden otsikko alkaa',
'allpagesbadtitle' => 'Annettu otsikko oli kelvoton tai siinä oli wikien välinen etuliite.',
# Special:Listusers
@@ -961,7 +1085,7 @@ Ohjelmiston ylläpitotöitä on jonossa \'\'\'$7\'\'\' kappaletta.',
# Email this user
#
'mailnologin' => 'Lähettäjän osoite puuttuu',
-'mailnologintext' => 'Sinun pitää olla [[Special:Userlogin|kirjautuneena sisään]] ja [[Special:Preferences|asetuksissasi]] pitää olla toimiva sähköpostiosoite, jotta voit lähettää sähköpostia muille käyttäjille.',
+'mailnologintext' => 'Sinun pitää olla [[Special:Userlogin|kirjautuneena sisään]] ja [[Special:Preferences|asetuksissasi]] pitää olla toimiva ja <strong>varmennettu</strong> sähköpostiosoite, jotta voit lähettää sähköpostia muille käyttäjille.',
'emailuser' => 'Lähetä sähköpostia tälle käyttäjälle',
'emailpage' => 'Lähetä sähköpostia käyttäjälle',
'emailpagetext' => 'Jos tämä käyttäjä on antanut asetuksissaan kelvollisen sähköpostiosoitteen, alla olevalla lomakeella voi lähettää yhden viestin hänelle. Omissa asetuksissasi annettu sähköpostiosoite näkyy sähköpostin lähettäjän osoitteena, jotta vastaanottaja voi vastata viestiin.',
@@ -974,6 +1098,8 @@ Ohjelmiston ylläpitotöitä on jonossa \'\'\'$7\'\'\' kappaletta.',
'emailsubject' => 'Aihe',
'emailmessage' => 'Viesti',
'emailsend' => 'Lähetä',
+'emailccme' => 'Lähetä kopio viestistä minulle.',
+'emailccsubject' => 'Kopio lähettämästäsi viestistä osoitteeseen $1: $2',
'emailsent' => 'Sähköposti lähetetty',
'emailsenttext' => 'Sähköpostiviestisi on lähetetty.',
@@ -1014,9 +1140,15 @@ Ohjelmiston ylläpitotöitä on jonossa \'\'\'$7\'\'\' kappaletta.',
'wlnote' => 'Alla on <b>$1</b> muutosta viimeisen <b>$2</b> tunnin ajalta.', // TODO NOWIKIMARKUP
'wlshowlast' => 'Näytä viimeiset $1 tuntia tai $2 päivää$3',
'wlsaved' => 'Tämä on tallennettu versio tarkkailulistastasi.',
-'wlhideshowown' => '$1 omat muokkaukset.',
-'wlhideshowbots' => '$1 bottien muokkaukset.',
+'watchlist-show-bots' => 'Näytä bottien muokkaukset',
+'watchlist-hide-bots' => 'Piilota bottien muokkaukset',
+'watchlist-show-own' => 'Näytä omat muokkaukset',
+'watchlist-hide-own' => 'Piilota omat muokkaukset',
+'watchlist-show-minor'=> 'Näytä pienet muokkaukset',
+'watchlist-hide-minor'=> 'Piilota pienet muokkaukset',
'wldone' => 'Muutokset tehty.',
+'watching' => 'Lisätään tarkkailulistalle...',
+'unwatching' => 'Poistetaan tarkkailulistalta...',
'enotif_mailer' => '{{GRAMMAR:genitive|{{SITENAME}}}} sivu on muuttunut -ilmoitus',
'enotif_reset' => 'Merkitse kaikki sivut katsotuiksi',
@@ -1062,7 +1194,7 @@ Palaute ja lisäapu osoitteessa:
'historywarning' => 'Varoitus: Sivulla, jonka aiot poistaa on muokkaushistoria:',
'confirmdeletetext' => 'Olet poistamassa sivun tai tiedoston ja kaiken sen historian. Ymmärrä teon seuraukset ja tee poisto {{GRAMMAR:genitive|{{SITENAME}}}} käytäntöjen mukaisesti.',
'actioncomplete' => 'Toiminto suoritettu',
-'deletedtext' => '\'\'\'[[{{ns:special}}:Undelete/$1|$1]]\'\'\' on poistettu. Katso $2 nähdäksesi listan viimeaikaisista poistoista.',
+'deletedtext' => '\'\'\'[[Special:Undelete/$1|$1]]\'\'\' on poistettu. Katso $2 nähdäksesi listan viimeaikaisista poistoista.',
'deletedarticle' => 'poisti sivun $1',
'dellogpage' => 'Poistoloki',
'dellogpagetext' => 'Alla on loki viimeisimmistä poistoista.',
@@ -1075,9 +1207,9 @@ Palaute ja lisäapu osoitteessa:
'rollbacklink' => 'palauta',
'rollbackfailed' => 'Palautus epäonnistui',
'cantrollback' => 'Aiempaan versioon ei voi palauttaa, koska viimeisin kirjoittaja on sivun ainoa tekijä.',
-'alreadyrolled' => 'Käyttäjän [[{{ns:user}}:$2|$2]] ([[{{ns:user_talk}}:$2|keskustelu]]) tekemiä muutoksia sivuun $1 ei voi kumota, koska käyttäjä [[{{ns:user}}:$3|$3]] ([[{{ns:user_talk}}:$3|keskustelu]]) on tehnyt uudempia muutoksia.',
+'alreadyrolled' => 'Käyttäjän [[User:$2|$2]] ([[User_talk:$2|keskustelu]]) tekemiä muutoksia sivuun $1 ei voi kumota, koska käyttäjä [[User:$3|$3]] ([[User_talk:$3|keskustelu]]) on tehnyt uudempia muutoksia.',
'editcomment' => 'Muokkauksen yhteenveto oli: <i>$1</i>.', // TODO NOWIKIMARKUP
-'revertpage' => 'Käyttäjän [[{{ns:special}}:Contributions/$2|$2]] ([[{{ns:user_talk}}:$2|keskustelu]]) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän [[{{ns:user}}:$1|$1]] tekemään versioon.',
+'revertpage' => 'Käyttäjän [[Special:Contributions/$2|$2]] ([[User_talk:$2|keskustelu]]) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän [[User:$1|$1]] tekemään versioon.',
'sessionfailure' => 'Istuntosi kanssa on ongelma. Muutosta ei toteutettu varotoimena sessionkaappauksien takia. Käytä selaimen paluutoimintoa ja päivitä sivu, jolta tulit, ja koita uudelleen.',
'protectlogpage' => 'Suojausloki',
@@ -1116,6 +1248,7 @@ Palaute ja lisäapu osoitteessa:
'undeletehistory' => 'Jos palautat sivun, kaikki versiot lisätään sivun historiaan. Jos uusi sivu samalla nimellä on luotu poistamisen jälkeen, palautetut versiot lisätään sen historiaan, ja olemassa olevaa versiota ei korvata automaattisesti.',
'undeletehistorynoadmin' => 'Tämä sivu on poistettu. Syy sivun poistamiseen näkyy yhteenvedossa, jossa on myös tiedot, ketkä ovat muokanneet tätä sivua ennen poistamista. Sivujen varsinainen sisältö on vain ylläpitäjien luettavissa.',
'undeleterevision' => 'Poistettu versio hetkellä $1',
+'undeleterevision-missing' => 'Virheellinen tai puuttuva versio. Se on saatettu palauttaa tai poistaa arkistosta.',
'undeletebtn' => 'Palauta',
'undeletereset' => 'Tyhjennä',
'undeletecomment' => 'Kommentti:',
@@ -1128,7 +1261,7 @@ Palaute ja lisäapu osoitteessa:
[[Special:Log/delete|Poistolokista]] löydät listan viimeisimmistä poistoista ja palautuksista.',
-'namespace' => 'Nimiavaruus',
+'namespace' => 'Nimiavaruus:',
'invert' => 'Käännä nimiavaruusvalinta päinvastaiseksi',
# Contributions
@@ -1147,6 +1280,7 @@ Palaute ja lisäapu osoitteessa:
'sp-contributions-newer' => '↠$1 uudempaa',
'sp-contributions-older' => '$1 vanhempaa →',
'sp-contributions-newbies-sub' => 'Uusien tulokkaiden muokkaukset',
+'sp-contributions-blocklog' => 'estot',
# What links here
#
@@ -1169,13 +1303,14 @@ Palaute ja lisäapu osoitteessa:
'ipbreason' => 'Syy',
'ipbanononly' => 'Estä vain kirjautumattomat käyttäjät',
'ipbcreateaccount' => 'Estä tunnusten luonti',
+'ipbenableautoblock' => 'Estä viimeisin IP-osoite, josta käyttäjä on muokannut, sekä ne osoitteet, joista hän jatkossa yrittää muokata.',
'ipbsubmit' => 'Estä',
'ipbother' => 'Vapaamuotoinen kesto',
'ipboptions' => '2 tuntia:2 hours,1 päivä:1 day,3 päivää:3 days,1 viikko:1 week,2 viikkoa:2 weeks,1 kuukausi:1 month,3 kuukautta:3 months,6 kuukautta:6 months,1 vuosi:1 year,ikuisesti:infinite',
'ipbotheroption' => 'Muu kesto',
'badipaddress' => 'IP-osoite on väärin muotoiltu.',
'blockipsuccesssub' => 'Esto onnistui',
-'blockipsuccesstext' => 'Käyttäjä tai IP-osoite \'\'\'$1\'\'\' on estetty.<br />Nykyiset estot löytyvät [[{{ns:special}}:Ipblocklist|estolistalta]].',
+'blockipsuccesstext' => 'Käyttäjä tai IP-osoite \'\'\'$1\'\'\' on estetty.<br />Nykyiset estot löytyvät [[Special:Ipblocklist|estolistalta]].',
'unblockip' => 'Muokkauseston poisto',
'unblockiptext' => 'Tällä lomakkeella voit poistaa käyttäjän tai IP-osoitteen muokkauseston.',
'ipusubmit' => 'Poista esto',
@@ -1186,8 +1321,9 @@ Palaute ja lisäapu osoitteessa:
'infiniteblock' => 'ikuisesti',
'expiringblock' => 'vanhenee $1',
'anononlyblock' => 'vain kirjautumattomat',
+'noautoblockblock' => 'ei automaattista IP-osoitteiden estoa',
'createaccountblock' => 'tunnusten luonti estetty',
-'blocklink' => 'esto',
+'blocklink' => 'estä',
'unblocklink' => 'poista esto',
'contribslink' => 'muokkaukset',
'autoblocker' => 'Olet automaattisesti estetty, koska jaat IP-osoitteen käyttäjän $1 kanssa. Eston syy: $2.', // TODO: IS WIKIMARKUP?
@@ -1251,7 +1387,7 @@ Palaute ja lisäapu osoitteessa:
# Move page
#
'movepage' => 'Siirrä sivu',
-'movepagetext' => 'Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle. Vanhasta sivusta tulee uudelleenohjaussivu, joka osoittaa uuteen sivuun. Vanhaan sivuun suunnattuja linkkejä ei muuteta, joten muista tehdä tarkistukset kaksinkertaisten tai rikkinäisten uudellenohjausten varalta. \'\'\'Olet vastuussa siitä, että linkit osoittavat sinne, mihin niiden on tarkoituskin osoittaa.\'\'\'<br \>Huomaa, että sivua \'\'\'ei\'\'\' siirretä mikäli uusi otsikko on olemassaolevan sivun käytössä, paitsi milloin kyseessä on tyhjä sivu tai uudelleenohjaus, jolla ei ole muokkaushistoriaa. Tämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle. Jos sivu tarvitsee siirtää olemassa olevan sivun päälle, ota yhteyttä [[{{ns:special}}:Listusers|ylläpitäjään]].',
+'movepagetext' => 'Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle. Vanhasta sivusta tulee uudelleenohjaussivu, joka osoittaa uuteen sivuun. Vanhaan sivuun suunnattuja linkkejä ei muuteta, joten muista tehdä tarkistukset kaksinkertaisten tai rikkinäisten uudellenohjausten varalta. \'\'\'Olet vastuussa siitä, että linkit osoittavat sinne, mihin niiden on tarkoituskin osoittaa.\'\'\'<br \>Huomaa, että sivua \'\'\'ei\'\'\' siirretä mikäli uusi otsikko on olemassaolevan sivun käytössä, paitsi milloin kyseessä on tyhjä sivu tai uudelleenohjaus, jolla ei ole muokkaushistoriaa. Tämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle. Jos sivu tarvitsee siirtää olemassa olevan sivun päälle, ota yhteyttä [[Special:Listusers/sysop|ylläpitäjään]].',
'movepagetalktext' => 'Sivuun mahdollisesti kytketty keskustelusivu siirretään automaattisesti, \'\'\'paitsi jos\'\'\':
*Siirrät sivua nimiavaruudesta toiseen
*Kohdesivulla on olemassa keskustelusivu, joka ei ole tyhjä, tai
@@ -1262,6 +1398,7 @@ Näissä tapauksissa sivut täytyy siirtää tai yhdistää käsin.',
'movenologin' => 'Et ole kirjautunut sisään',
'movenologintext' => 'Sinun pitää olla rekisteröitynyt käyttäjä ja kirjautua sisään, jotta voisit siirtää sivun.',
'newtitle' => 'Uusi nimi sivulle',
+'move-watch' => 'Tarkkaile tätä sivua',
'movepagebtn' => 'Siirrä sivu',
'pagemovedsub' => 'Siirto onnistui',
'pagemovedtext' => 'Sivu \'\'\'[[$1]]\'\'\' siirrettiin nimelle \'\'\'[[$2]]\'\'\'.',
@@ -1287,7 +1424,7 @@ Näissä tapauksissa sivut täytyy siirtää tai yhdistää käsin.',
# Export
'export' => 'Sivujen vienti',
-'exporttext' => 'Voit viedä sivun tai sivujen tekstiä ja muokkaushistoriaa XML-muodossa. Tämä tieto voidaan tuoda johonkin toiseen wikiin, jossa käytetään MediaWiki-ohjelmistoa.<br \>Syötä sivujen otsikoita riveittäin alla olevaan laatikkoon. Valitse myös, haluatko kaikki versiot sivuista, vai ainoastaan nykyisen version.<br \>Jälkimmäisessä tapauksessa voit myös käyttää linkkiä. Esimerkiksi sivun {{Mediawiki:mainpage}} saa vietyä linkistä [[{{ns:special}}:Export/{{Mediawiki:mainpage}}]].',
+'exporttext' => 'Voit viedä sivun tai sivujen tekstiä ja muokkaushistoriaa XML-muodossa. Tämä tieto voidaan tuoda johonkin toiseen wikiin, jossa käytetään MediaWiki-ohjelmistoa.<br \>Syötä sivujen otsikoita riveittäin alla olevaan laatikkoon. Valitse myös, haluatko kaikki versiot sivuista, vai ainoastaan nykyisen version.<br \>Jälkimmäisessä tapauksessa voit myös käyttää linkkiä. Esimerkiksi sivun {{Mediawiki:mainpage}} saa vietyä linkistä [[{{ns:Special}}:Export/{{Mediawiki:mainpage}}]].',
'exportcuronly' => 'Liitä mukaan ainoastaan uusin versio, ei koko historiaa.',
'exportnohistory' => "----\nSivujen koko historian vienti on estetty suorituskykysyistä.",
'export-submit' => 'Vie',
@@ -1295,13 +1432,13 @@ Näissä tapauksissa sivut täytyy siirtää tai yhdistää käsin.',
# Namespace 8 related
-'allmessages' => 'Kaikki järjestelmäviestit',
+'allmessages' => 'Järjestelmäviestit',
'allmessagesname' => 'Nimi',
'allmessagesdefault' => 'Oletusarvo',
'allmessagescurrent' => 'Nykyinen arvo',
'allmessagestext' => 'Tämä on luettelo kaikista MediaWiki-nimiavaruudessa olevista viesteistä.',
-'allmessagesnotsupportedUI' => '{{ns:special}}:Allmessages-sivu ei tue täällä käyttöliittymäkieltäsi <b>$1</b>.',
-'allmessagesnotsupportedDB' => '{{ns:special}}:Allmessages-sivu ei ole käytössä, koska wgUseDatabaseMessages-asetus on pois päältä.',
+'allmessagesnotsupportedUI' => 'Tämä sivu ei tue käyttöliittymäkieltäsi <b>$1</b> tässä MediaWikissä.',
+'allmessagesnotsupportedDB' => 'Tämä sivu ei ole käytössä, koska <tt>$wgUseDatabaseMessages</tt>-asetus on pois päältä.',
'allmessagesfilter' => 'Viestiavainsuodatin:',
'allmessagesmodified' => 'Näytä vain muutetut',
@@ -1320,7 +1457,7 @@ Näissä tapauksissa sivut täytyy siirtää tai yhdistää käsin.',
'import-interwiki-history' => 'Kopioi sivun koko historia',
'import-interwiki-submit' => 'Tuo',
'import-interwiki-namespace' => 'Siirrä nimiavaruuteen:',
-'importtext' => 'Vie sivuja lähdewikistä käyttäen Special:Export-työkalua. Tallenna tiedot koneellesi ja tallenna ne täällä.',
+'importtext' => 'Vie sivuja lähdewikistä käyttäen [[Special:Export|vienti]]-työkalua. Tallenna tiedot koneellesi ja tallenna ne täällä.',
'importstart' => 'Tuodaan sivuja...',
'import-revision-count' => '$1 {{PLURAL:$1|versio|versiota}}',
'importnopages' => 'Ei tuotavia sivuja.',
@@ -1338,7 +1475,7 @@ Näissä tapauksissa sivut täytyy siirtää tai yhdistää käsin.',
# import log
'importlogpage' => 'Tuontiloki',
'importlogpagetext' => 'Loki toisista wikeistä tuoduista sivuista.',
-'import-logentry-upload' => 'toi sivun â€$1†lähettämällä tiedoston',
+'import-logentry-upload' => 'toi sivun â€[[$1]]†lähettämällä tiedoston',
'import-logentry-upload-detail' => '$1 versio(ta)',
'import-logentry-interwiki' => 'toi toisesta wikistä sivun â€$1â€',
'import-logentry-interwiki-detail' => '$1 versio(ta) sivusta $2',
@@ -1386,6 +1523,7 @@ Näissä tapauksissa sivut täytyy siirtää tai yhdistää käsin.',
'spamprotectionmatch' => 'Teksti, joka ei läpäissyt mainossuodatinta: $1',
'subcategorycount' => 'Tällä luokalla on {{PLURAL:$1|yksi alaluokka|$1 alaluokkaa}}.',
'categoryarticlecount'=> 'Tässä luokassa on {{PLURAL:$1|yksi sivu|$1 sivua}}.',
+'category-media-count'=> 'Tässä luokassa on {{PLURAL:$1|yksi tiedosto|$1 tiedostoa}}.',
'listingcontinuesabbrev' => ' jatkuu',
'spambot_username' => 'MediaWikin mainospoistaja',
'spam_reverting' => 'Palautettu viimeisimpään versioon, joka ei sisällä linkkejä kohteeseen $1.',
@@ -1417,13 +1555,14 @@ Näissä tapauksissa sivut täytyy siirtää tai yhdistää käsin.',
'rcpatroldisabledtext' => 'Tuoreiden muutosten tarkastustoiminto ei ole käytössä.',
'markedaspatrollederror' => 'Muutoksen merkitseminen tarkastetuksi epäonnistui.',
'markedaspatrollederrortext' => 'Tarkastetuksi merkittävää versiota ei ole määritelty.',
+'markedaspatrollederror-noautopatrol' => 'Et voi merkitä omia muutoksiasi tarkastetuiksi.',
-'Common.css' => '/* Tämä sivu sisältää koko sivustoa muuttavia tyylejä. */',
-'Monobook.css' => '/* Tämä sivu sisältää Monobook-ulkoasua muuttavia tyylejä. */',
+'common.css' => '/* Tämä sivu sisältää koko sivustoa muuttavia tyylejä. */',
+'monobook.css' => '/* Tämä sivu sisältää Monobook-ulkoasua muuttavia tyylejä. */',
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => "/* <pre> */
+'monobook.js' => "/* <pre> */
var ta = new Object();
ta['pt-userpage'] = new Array('.','Oma käyttäjäsivu');
ta['pt-anonuserpage'] = new Array('.','IP-osoitteesi käyttäjäsivu');
@@ -1434,7 +1573,7 @@ ta['pt-watchlist'] = new Array('l','Lista sivuista, joiden muokkauksia tarkkaile
ta['pt-mycontris'] = new Array('y','Lista omista muokkauksista');
ta['pt-login'] = new Array('o','Kirjaudu sisään tai luo tunnus');
ta['pt-anonlogin'] = new Array('o','Kirjaudu sisään tai luo tunnus');
-ta['pt-logout'] = new Array('','Kirjaudu ulos');
+ta['pt-logout'] = new Array('','Kirjaudu uls');
ta['ca-talk'] = new Array('t','Keskustele sisällöstä');
ta['ca-edit'] = new Array('e','Muokkaa tätä sivua');
ta['ca-addsection'] = new Array('+','Lisää kommentti tälle sivulle');
@@ -1461,7 +1600,7 @@ ta['feed-rss'] = new Array('','RSS-syöte tälle sivulle');
ta['feed-atom'] = new Array('','Atom-syöte tälle sivulle');
ta['t-contributions'] = new Array('','Näytä lista tämän käyttäjän muokkauksista');
ta['t-emailuser'] = new Array('','Lähetä sähköpostia tälle käyttäjälle');
-ta['t-upload'] = new Array('u','Tallenna kuvia tai muita mediatiedostoja');
+ta['t-upload'] = new Array('u','Lisää kuvia tai muita mediatiedostoja');
ta['t-specialpages'] = new Array('q','Näytä toimintosivut');
ta['t-print']=new Array('', 'Lataa sivun tulostamiseen sopivalla tyylisivulla. Voit aina käyttää suoraan selaimen tulosta-toimintoa.');
ta['t-permalink'] = new Array('', 'Ikuisesti toimiva linkki sivun tähän versioon, paitsi jos sivu poistetaan.');
@@ -1477,6 +1616,8 @@ ta['ca-nstab-help'] = new Array('c','Näytä ohjesivu');
ta['ca-nstab-category'] = new Array('c','Näytä luokkasivu');
/* </pre> */",
+'common.js' => '/* Tämän sivun koodi liitetään jokaiseen sivulataukseen */',
+
# image deletion
'deletedrevision' => 'Poistettiin vanha versio $1.',
@@ -1503,6 +1644,7 @@ ta['ca-nstab-category'] = new Array('c','Näytä luokkasivu');
'fileinfo' => '$1 KiB, MIME-tyyppi: <code>$2</code>',
+
# Metadata
'metadata' => 'Sisältökuvaukset',
'metadata-help' => 'Tämä tiedosto sisältää esimerkiksi kuvanlukijan, digikameran tai kuvankäsittelyohjelman lisäämiä lisätietoja. Kaikki tiedot eivät enää välttämättä vastaa todellisuutta, jos kuvaa on muokattu sen alkuperäisen luonnin jälkeen.
@@ -1646,6 +1788,8 @@ This file contains additional information, probably added from the digital camer
'exif-compression-1' => 'Pakkaamaton',
'exif-compression-6' => 'JPEG',
+'exif-unknowndate' => 'Tuntematon päiväys',
+
'exif-photometricinterpretation-2' => 'RGB',
'exif-photometricinterpretation-6' => 'YCbCr',
@@ -1804,11 +1948,15 @@ This file contains additional information, probably added from the digital camer
# E-mail address confirmation
'confirmemail' => 'Varmenna sähköpostiosoite',
-'confirmemail_noemail'=> 'Sinulla ei ole kelvollista sähköpostiosoitetta [[Special:Preferences|asetuksissasi]].',
+'confirmemail_noemail'=> 'Sinulla ei ole kelvollista sähköpostiosoitetta [[Special:Preferences|asetuksissasi]].',
'confirmemail_text' => 'Tämä wiki vaatii sähköpostiosoitteen varmentamisen, ennen kuin voit käyttää sähköpostitoimintoja. Lähetä alla olevasta painikkeesta varmennusviesti osoitteeseesi. Viesti sisältää linkin, jonka avaamalla varmennat sähköpostiosoitteesi.',
+'confirmemail_pending'=> '<div class="error">Varmennusviesti on jo lähetetty. Jos loit tunnuksen äskettäin, odota muutama minuutti viestin saapumista, ennen kuin yrität uudelleen.</div>',
'confirmemail_send' => 'Lähetä varmennusviesti',
'confirmemail_sent' => 'Varmennusviesti lähetetty.',
-'confirmemail_sendfailed' => 'Varmennusviestin lähettäminen epäonnistui. Tarkista, onko osoitteessa kiellettyjä merkkejä.',
+'confirmemail_oncreate' => 'Varmennusviesti lähetettiin sähköpostiosoitteeseesi. Varmennuskoodia ei tarvita sisäänkirjautumiseen, mutta se täytyy antaa, ennen kuin voit käyttää sähköpostitoimintoja tässä wikissä.',
+'confirmemail_sendfailed' => 'Varmennusviestin lähettäminen epäonnistui. Tarkista, onko osoitteessa kiellettyjä merkkejä.
+
+Postitusohjelma palautti: $1',
'confirmemail_invalid' => 'Varmennuskoodi ei kelpaa. Koodi on voinut vanhentua.',
'confirmemail_needlogin' => 'Sinun täytyy $1, jotta voisit varmistaa sähköpostiosoitteesi.',
'confirmemail_success' => 'Sähköpostiosoitteesi on nyt varmennettu. Voit kirjautua sisään.',
@@ -1843,7 +1991,7 @@ Jos tämä tunnus ei ole sinun, ÄLÄ seuraa linkkiä. Varmennuskoodi vanhenee $
# delete conflict
'deletedwhileediting' => '<center>\'\'\'Varoitus\'\'\': Tämä sivu on poistettu sen jälkeen, kun aloitit sen muokkaamisen!</center>',
-'confirmrecreate' => 'Käyttäjä \'\'\'[[{{ns:user}}:$1|$1]]\'\'\' ([[{{ns:user_talk}}:$1|keskustelu]]) poisti sivun sen jälkeen, kun aloit muokata sitä. Syy oli:
+'confirmrecreate' => 'Käyttäjä \'\'\'[[User:$1|$1]]\'\'\' ([[User_talk:$1|keskustelu]]) poisti sivun sen jälkeen, kun aloit muokata sitä. Syy oli:
: \'\'$2\'\'
Ole hyvä ja varmista, että haluat luoda sivun uudelleen.',
'recreate' => 'Luo uudelleen',
@@ -1859,7 +2007,6 @@ Ole hyvä ja varmista, että haluat luoda sivun uudelleen.',
'confirm_purge_button'=> 'Poista',
'youhavenewmessagesmulti' => 'Sinulla on uusia viestejä sivuilla $1',
-'newtalkseperator' => ',_',
'searchcontaining' => 'Etsi artikkeleita, jotka sisältävät â€$1â€.',
'searchnamed' => 'Etsi artikkeleita, joiden nimi on â€$1â€.',
@@ -1888,9 +2035,11 @@ Ole hyvä ja varmista, että haluat luoda sivun uudelleen.',
'table_pager_limit_submit' => 'Mene',
'table_pager_empty' => 'Ei tuloksia',
-
-# If creating a redirect page and summary is empty, then use this
-'autoredircomment' => 'Uudelleenohjaus sivulle [[$1]]',
+# Auto-summaries
+'autosumm-blank' => 'Ak: Sivu tyhjennettin',
+'autosumm-replace' => 'Ak: Sivun sisältö korvattiin sisällöllä â€$1â€',
+'autoredircomment' => 'Ak: Uudelleenohjaus sivulle [[$1]]',
+'autosumm-new' => 'Ak: Uusi sivu: $1',
# Page history in an feed (RSS / Atom)
'feed-invalid' => 'Virheellinen syötetyyppi.',
@@ -1903,6 +2052,12 @@ Kokeile [[Special:Search|hakua]] löytääksesi asiaan liittyviä sivuja.',
'sp-newimages-showfrom' => 'Näytä uudet kuvat alkaen $1',
+# Size units
+'size-bytes' => '$1 B',
+'size-kilobytes' => '$1 KiB',
+'size-megabytes' => '$1 MiB',
+'size-gigabytes' => '$1 GiB',
+
);
?>
diff --git a/languages/messages/MessagesFr.php b/languages/messages/MessagesFr.php
index 2d85a759..c5754f06 100644
--- a/languages/messages/MessagesFr.php
+++ b/languages/messages/MessagesFr.php
@@ -93,7 +93,6 @@ $messages = array(
'tog-externaldiff' => 'Utiliser un comparateur externe par défaut',
'tog-showjumplinks' => 'Activer les liens d’accessibilité rapide.',
'tog-uselivepreview' => 'Utiliser l’aperçu rapide (JavaScript) (Expérimental)',
-'tog-autopatrol' => 'Marquer mes modifications comme patrouillées',
'tog-forceeditsummary' => 'M’avertir lorsque je n’ai pas completé le contenu de la boîte de commentaires',
'tog-watchlisthideown' => 'Cacher mes propres modifications dans la liste de suivi',
'tog-watchlisthidebots' => 'Cacher dans la liste de suivi les modifications faites par les bots',
@@ -141,13 +140,14 @@ $messages = array(
# Bits of text used by many pages:
-'categories' => '{{PLURAL:$1|Catégorie|Catégories}}',
+'categories' => 'Catégories',
+'pagecategories' => '{{PLURAL:$1|Catégorie|Catégories}}',
'category_header' => 'Articles dans la catégorie « $1 ».',
'subcategories' => 'Sous-catégories',
'mainpage' => 'Accueil',
'mainpagetext' => '<big>\'\'\'MediaWiki a été installé avec succès.\'\'\'</big>',
-'mainpagedocfooter' => 'Consultez le [http://meta.wikipedia.org/wiki/Aide:Contenu Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel.',
+'mainpagedocfooter' => 'Consultez le [http://meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel.',
'portal' => 'Communauté',
'portal-url' => '{{ns:4}}:Accueil',
'about' => 'À propos',
@@ -238,6 +238,10 @@ $messages = array(
'ncategories' => '$1 catégories',
'nrevisions' => '$1 révisions',
'retrievedfrom' => 'Récupérée de « $1 »',
+'size-bytes' => '$1 O',
+'size-kilobytes' => '$1 KO',
+'size-megabytes' => '$1 MO',
+'size-gigabytes' => '$1 GO',
'youhavenewmessages' => 'Vous avez $1 ($2).',
'newmessageslink' => 'des nouveaux messages',
'newmessagesdifflink' => 'diff vers l’avant-dernière révision',
@@ -314,7 +318,8 @@ Fonction : $1<br />
Requête : $2',
'viewsource' => 'Voir le texte source',
'viewsourcefor' => 'pour $1',
-'protectedtext' => 'Cette page a été protégée pour empêcher sa modification. Vous pouvez consulter [[{{ns:4}}:Page protégée]] pour voir les différentes raisons possibles. Vous pouvez toutefois voir et copier son code source.',
+'viewsourcetext' => 'Vous pouvez toutefois voir et copier son code source:',
+'protectedtext' => 'Cette page a été protégée pour empêcher sa modification. Vous pouvez consulter [[{{ns:4}}:Page protégée]] pour voir les différentes raisons possibles.',
'protectedinterface' => 'Cette page fournit du texte d’interface pour le logiciel, et est protégée pour éviter les abus.',
'editinginterface' => '\'\'\'Attention :\'\'\' Vous éditez une page utilisée pour fournir le texte de l’interface du logiciel. Les modifications affecteront l’apparence de l’interface pour les autres utilisateurs.',
'sqlhidden' => '(requête SQL cachée)',
@@ -570,7 +575,7 @@ contenant tous les termes apparaissent dans les résultats).',
'powersearchtext' => 'Rechercher dans les espaces :<br />
$1<br />
$2 Inclure les page de redirections &nbsp; Rechercher $3 $9',
-'searchdisabled' => 'La recherche sur {{SITENAME]] a été désactivée. En attendant la réactivation, vous pouvez effectuer une recherche par le biais de Google. Attention, leur indexation du contenu {{SITENAME]] peut ne pas être à jour.',
+'searchdisabled' => 'La recherche sur {{SITENAME}} a été désactivée. En attendant la réactivation, vous pouvez effectuer une recherche par le biais de Google. Attention, leur indexation du contenu {{SITENAME}} peut ne pas être à jour.',
# Preferences page
#
@@ -928,8 +933,10 @@ Pour supprimer cette page de votre liste de suivi, cliquez sur « ne plus suivre
'wlnote' => 'Ci-dessous se trouvent les $1 dernières modifications depuis les <b>$2</b> dernières heures.',
'wlshowlast' => 'Montrer les dernières $1 heures $2 jours $3',
'wlsaved' => 'La liste de suivi n’est remise à jour qu’une fois par heure pour alléger la charge sur le serveur.',
-'wlhideshowown' => '$1 mes modifications',
-'wlhideshowbots' => '$1 les contributions de bots',
+'watchlist-show-bots' => 'Affichier les contributions de bots',
+'watchlist-hide-bots' => 'Masquer les contributions de bots',
+'watchlist-show-own' => 'Affichier mes modifications',
+'watchlist-hide-own' => 'Masquer mes modifications',
'enotif_mailer' => '{{SITENAME}} Notificateur par courriel',
'enotif_reset' => 'Marque toutes les pages comme visitées',
@@ -989,7 +996,7 @@ L’heure indiquée est celle du serveur (UTC).',
'rollbacklink' => 'révoquer',
'rollbackfailed' => 'La révocation a échoué',
'cantrollback' => 'Impossible de révoquer : il n’y a qu’un seul auteur à avoir modifié cet article',
-'alreadyrolled' => "Impossible de révoquer la dernière modification de l’article « [[$1]] » effectuée par [[User:$2|$2]] ([[User talk:$2|Discussion]]) ; quelqu’un d’autre a déjà modifié ou révoqué l’article. La dernière modification a été effectuée par [[User:$3|$3]] ([[User talk:$3|Discussion]]).",
+'alreadyrolled' => "Impossible de révoquer la dernière modification de l’article « [[:$1]] » effectuée par [[User:$2|$2]] ([[User talk:$2|Discussion]]) ; quelqu’un d’autre a déjà modifié ou révoqué l’article. La dernière modification a été effectuée par [[User:$3|$3]] ([[User talk:$3|Discussion]]).",
'editcomment' => "Le résumé de la modification était: <i>« $1 »</i>.",
'revertpage' => "Modifications de [[Special:Contributions/$2|$2]] ([[User_talk:$2|Discussion]]) révertées; retour à l'ancienne version de [[User:$1|$1]]",
'sessionfailure' => 'Il semble qu’il y ait eu un problème avec votre session d’identification; cette action a été annulée par précaution contre le piratage de session. Merci de cliquer sur « retour » et de recharger la page d’où vous venez, et de réessayer.',
@@ -1264,8 +1271,8 @@ Dans ce dernier cas, vous pouvez aussi utiliser un lien, comme [[{{ns:Special}}:
# stylesheets
-'Common.css' => '/** Le CSS placé ici sera appliqué à toutes les apparences. */',
-'Monobook.css' => '/* Le CSS placé ici affectera les utilisateurs du skin Monobook */',
+'common.css' => '/** Le CSS placé ici sera appliqué à toutes les apparences. */',
+'monobook.css' => '/* Le CSS placé ici affectera les utilisateurs du skin Monobook */',
# Metadata
@@ -1325,7 +1332,7 @@ Dans ce dernier cas, vous pouvez aussi utiliser un lien, comme [[{{ns:Special}}:
'markedaspatrollederrortext' => 'Vous devez spécifier une révision à marquer comme patrouillée.',
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* infobulles et touches d’accès */
+'monobook.js' => '/* infobulles et touches d’accès */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Ma page utilisateur\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'La page utilisateur de l’IP avec laquelle vous contribuez\');
@@ -1336,7 +1343,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'liste des pages dont vous suivez les mo
ta[\'pt-mycontris\'] = new Array(\'y\',\'Liste de mes contributions\');
ta[\'pt-login\'] = new Array(\'o\',\'Vous êtes invité à vous identifier, mais ce n’est pas obligatoire.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Vous êtes invité à vous identifier, mais ce n’est pas obligatoire.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Se déconnecter\');
+ta[\'pt-logout\'] = new Array(\'\',\'Se déconnecter\');
ta[\'ca-talk\'] = new Array(\'t\',\'Discussion à propos de l’article\');
ta[\'ca-edit\'] = new Array(\'e\',\'Vous pouvez modifier cette page. Merci d’utiliser le bouton de prévisualisation avant de sauvegarder.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Ajouter un commentaire à cette discussion.\');
diff --git a/languages/messages/MessagesFur.php b/languages/messages/MessagesFur.php
index a6d82390..e9ca3364 100644
--- a/languages/messages/MessagesFur.php
+++ b/languages/messages/MessagesFur.php
@@ -334,7 +334,7 @@ cheste vecje version, (rip) = torne a ripristinâ cheste vecje version.
'mimetype' => 'Gjenar MIME:',
'missingimage' => "<b>Figure mancjante</b><br /><i>$1</i>",
'monday' => "Lunis",
-'Monobook.css' => '/* modifiche chest file par personalizâ la skin monobook par dut il sît */',
+'monobook.css' => '/* modifiche chest file par personalizâ la skin monobook par dut il sît */',
'moredotdotdot' => 'Plui...',
'mostlinked' => 'Pagjinis a cui pontin il maiôr numar di leams',
'mostlinkedcategories' => 'Categoriis a cui pontin il maiôr numar di leams',
@@ -444,6 +444,7 @@ tu âs di cognossi lis conseguencis prime di lâ indevant.',
'othercontribs' => 'Basât sul lavôr di $1.',
'otherlanguages' => "Altris lenghis",
'others' => 'altris',
+'pagecategories' => "Categoriis",
'pagemovedsub' => 'Movude cun sucès',
'pagemovedtext' => "Pagjine \"[[$1]]\" movude in \"[[$2]]\".",
'passwordtooshort' => "La tô peraule clâf e je masse curte, e à di jessi lungje almancul $1 caratars.",
@@ -579,7 +580,7 @@ Chest al vûl dî une medie di '''$5''' cambiaments par pagjine, e '''$6''' viod
'skinpreview' => '(Anteprime)',
'sourcefilename' => 'Non dal file origjinâl',
'specialloguserlabel' => "Utent:",
-'speciallogtitlelabel' => "Titul: ",
+'speciallogtitlelabel' => "Titul:",
'specialpage' => "Pagjine speciâl",
'specialpages' => "Pagjinis speciâls",
'spheading' => 'Pagjinis speciâls par ducj i utents',
@@ -634,7 +635,7 @@ Chest al vûl dî une medie di '''$5''' cambiaments par pagjine, e '''$6''' viod
'tog-watchdefault' => 'Zonte in automatic lis pagjinis che o cambii inte liste di chês tignudis di voli',
'toolbox' => "imprescj",
'tooltip-compareselectedversions' => 'Viôt lis difarencis framieç lis dôs versions di cheste pagjine selezionadis. [alt-v]',
-'tooltip-diff' => 'Mostre i cambiaments che tu âs fat al test. [alt-d]',
+'tooltip-diff' => 'Mostre i cambiaments che tu âs fat al test. [alt-v]',
'tooltip-minoredit' => "Segne cheste come une piçul cambiament [alt-i]",
'tooltip-preview' => "Anteprime dai tiei cambiaments, doprile par plasê prime di salvâ! [alt-p]",
'tooltip-save' => "Salve i tiei cambiaments [alt-s]",
diff --git a/languages/messages/MessagesFy.php b/languages/messages/MessagesFy.php
index 4ca48abf..39b1d065 100644
--- a/languages/messages/MessagesFy.php
+++ b/languages/messages/MessagesFy.php
@@ -15,18 +15,25 @@ $skinNames = array(
'nostalgia' => 'Nostalgy',
);
-$dateFormats = array(
- 'mdy time' => 'H.i',
- 'mdy date' => 'M j, Y',
- 'mdy both' => 'H.i, M j, Y',
+$datePreferences = array(
+ 'default',
+ 'fy normal',
+ 'ISO 8601',
+);
+
+$defaultDateFormat = 'fy normal';
- 'dmy time' => 'H.i',
- 'dmy date' => 'j M Y',
- 'dmy both' => 'H.i, j M Y',
+$dateFormats = array(
+ 'fy normal time' => 'H.i',
+ 'fy normal date' => 'j M Y',
+ 'fy normal both' => 'j M Y, H.i',
+);
- 'ymd time' => 'H.i',
- 'ymd date' => 'Y M j',
- 'ymd both' => 'H.i, Y M j',
+$datePreferenceMigrationMap = array(
+ 'default',
+ 'fy normal',
+ 'fy normal',
+ 'fy normal',
);
$namespaceNames = array(
@@ -314,10 +321,10 @@ Oars kinne jo tebek mei de tebek-knop fan jo blêdzjer.",
dy't sich net oanmeld hat. Om't der gjin namme is wurd it Ynternet-adres brûkt om
oan te jaan wa. Mar faak is it sa dat sa'n adres net altid troch deselde brûkt wurdt.
As jo it idee hawwe dat jo as ûnbekinde brûker opmerkings foar in oar krije, dan kinne
-jo jo [[{{ns:special}}:Userlogin|oanmelde]], dat jo allinnich opmerkings foar josels krije.'' ",
+jo jo [[{{ns:special}}:Userlogin|oanmelde]], dat jo allinnich opmerkings foar josels krije.''",
"noarticletext" => "(Der stjit noch gjin tekst op dizze side.)",
"updated" => "(Bewurke)",
-"note" => "<strong>Opmerking:</strong> ",
+"note" => "<strong>Opmerking:</strong>",
"previewnote" => "Tink der om dat dizze side noch net fêstlein is!",
"previewconflict" => "Dizze side belanget allinich it earste bewurkingsfjild oan.",
"editing" => "Bewurkje \"$1\"",
@@ -694,7 +701,7 @@ Jou oan hokfoar siden jo net mear folgje wolle, en befêstigje dat ûnderoan de
"exblank" => "side wie leech",
"confirmdelete" => "Befestigje wiskjen",
"deletesub" => "(Wiskje \"$1\")",
-"historywarning" => "Waarskôging: De side dy't jo wiskje wolle hat skiednis: ",
+"historywarning" => "Waarskôging: De side dy't jo wiskje wolle hat skiednis:",
"confirmdeletetext" => "Jo binne dwaande mei it foar altyd wiskjen fan in side
of ôfbyld, tegearre mei alle skiednis, út de databank.
Befêstigje dat jo dat wier dwaan wolle. Befêstigje dat dat is wat jo witte wat it gefolch
@@ -718,11 +725,11 @@ Sjoch \"$2\" foar in list fan wat resint wiske is.",
"rollbacklink" => "feroaring tebeksette",
"rollbackfailed" => "Feroaring tebeksette net slagge",
"cantrollback" => "Disse feroaringt kin net tebek set, om't der mar ien skriuwer is.",
-"alreadyrolled" => "Kin de feroaring fan [[$1]]
+"alreadyrolled" => "Kin de feroaring fan [[:$1]]
troch [[Brûker:$2|$2]] ([[Brûker oerlis:$2|Oerlis]]) net tebeksette;
inoar hat de feroaring tebekset, of oars wat oan de side feroare.
-De lêste feroaring wie fan [[Brûker:$3|$3]] ([[Brûker oerlis:$3|Oerlis]]). ",
+De lêste feroaring wie fan [[Brûker:$3|$3]] ([[Brûker oerlis:$3|Oerlis]]).",
# only shown if there is an edit comment
"editcomment" => "De gearfetting wie: \"<i>$1</i>\".",
"revertpage" => "Tebek set ta de ferzje fan \"$1\"",
diff --git a/languages/messages/MessagesGa.php b/languages/messages/MessagesGa.php
index e0e7d72a..d314b525 100644
--- a/languages/messages/MessagesGa.php
+++ b/languages/messages/MessagesGa.php
@@ -178,6 +178,7 @@ $messages = array(
# FIXME
#
'categories' => 'Catagóirí',
+'pagecategories' => 'Catagóirí',
'category_header' => 'Ailt sa chatagóir "$1"',
"subcategories" => "Fo-chatagóirí",
@@ -1043,7 +1044,7 @@ Is in am an freastalaí (UTC) iad na hamanna anseo thíos.
"rollbacklink" => "athúsáid",
"rollbackfailed" => "Theip an athúsáid",
"cantrollback" => "Ní féidir an athrú a athúsáid; ba é údar an ailt an t-aon duine a rinne athrú dó.",
-"alreadyrolled" => "Ní féidir eagrán níos luaí an leathanaigh [[$1]]
+"alreadyrolled" => "Ní féidir eagrán níos luaí an leathanaigh [[:$1]]
le [[Úsáideoir:$2|$2]] ([[Plé úsáideora:$2|Plé]]) a athúsáid; d'athraigh duine eile é cheana fein, nó
d'athúsáid duine eile eagrán níos luaí cheana féin.
@@ -1304,7 +1305,7 @@ ní féidir uaslódála staire díreacha a dhéanamh faoi láthair.',
'accesskey-minoredit' => 'm', # Mionathrú
'accesskey-save' => 's', # Sábháil
'accesskey-preview' => 'r', # Reamhamharc
-'accesskey-diff' => 'd', # Difríocht
+'accesskey-diff' => 'v', # Difríocht
'accesskey-compareselectedversions' => 'l', # Leagain
# tooltip help for some actions, most are in Monobook.js
@@ -1314,13 +1315,13 @@ ní féidir uaslódála staire díreacha a dhéanamh faoi láthair.',
'tooltip-preview' => 'Réamhamharc ar do chuid athruithe; úsáid an gné seo roimh a shábhálaíonn tú! [alt-r]',
'tooltip-compareselectedversions' => 'Féach na difríochtaí idir an dhá leagain roghnaithe den leathanach seo. [alt-l]',
'tooltip-watch' => 'Cuir an leathanach seo ar do liosta faire [alt-f]',
-'tooltip-diff' => 'Taispeáin na difríochtaí áirithe a rinne tú don téacs [alt-d]',
+'tooltip-diff' => 'Taispeáin na difríochtaí áirithe a rinne tú don téacs [alt-v]',
# stylesheets
-'Monobook.css' => '/* athraigh an comhad seo chun an craiceann MonoBook a athrú don suíomh ar fad */',
-#'Monobook.js' => '/* athraigh an comhad seo chun rudaí js sa craiceann MonoBook a hathrú */',
+'monobook.css' => '/* athraigh an comhad seo chun an craiceann MonoBook a athrú don suíomh ar fad */',
+#'monobook.js' => '/* athraigh an comhad seo chun rudaí js sa craiceann MonoBook a hathrú */',
# Metadata
'nodublincore' => 'Míchumasaítear meitea-shonraí Dublin Core RDF ar an freastalaí seo.',
@@ -1373,7 +1374,7 @@ iarradh sábháil. Is dócha gur nasc chuig suíomh seachtrach ba chúis leis.',
'rcpatroldisabledtext' => "Tá an tréith Patról na n-Athruithe is Déanaí míchumasaithe faoi láthair.",
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* leideanna uirlisí agus cnaipí rochtana */
+'monobook.js' => '/* leideanna uirlisí agus cnaipí rochtana */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Mo leathanach úsáideora\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Leathanach úsáideora don IP ina dhéanann tú do chuid athruithe\');
@@ -1384,7 +1385,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Liosta de na leathanaigh a dhéanann tÃ
ta[\'pt-mycontris\'] = new Array(\'y\',\'Liosta de mo chuid dréachtaí\');
ta[\'pt-login\'] = new Array(\'o\',\'Moltar duit logáil isteach, ach níl sé riachtanach.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Moltar duit logáil isteach, ach níl sé riachtanach.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Logáil amach\');
+ta[\'pt-logout\'] = new Array(\'\',\'Logáil amach\');
ta[\'ca-talk\'] = new Array(\'t\',\'Plé maidir leis an leathanach ábhair\');
ta[\'ca-edit\'] = new Array(\'e\',\'Is féidir leat an leathanach seo a athrú. Más é do thoil é, bain úsáid as an cnaipe réamhamhairc roimh sábháil a dhéanamh.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Cuir trácht leis an plé seo..\');
diff --git a/languages/messages/MessagesGsw.php b/languages/messages/MessagesGsw.php
index 8896e23d..56cc5501 100644
--- a/languages/messages/MessagesGsw.php
+++ b/languages/messages/MessagesGsw.php
@@ -54,7 +54,8 @@ $messages = array(
'november' => 'Novämber',
'december' => 'Dezämber',
'may' => 'Mei',
-'categories' => '{{PLURAL:$1|Kategori|Kategorie}}',
+'categories' => 'Kategorie',
+'pagecategories' => '{{PLURAL:$1|Kategori|Kategorie}}',
'category_header' => 'Artikel in de Kategori "$1"',
'subcategories' => 'Unterkategorie',
'mainpage' => 'Houptsyte',
@@ -296,7 +297,7 @@ Für d Bestätigung muesch du em Link folge, wo dir isch gmailet worde. Du chasc
'media_tip' => 'Mediedateivoweis',
'hr_tip' => 'Horizontal Linie (sparsom vowende)',
'summary' => 'Zämefassig',
-'minoredit' => 'Numen es birebitzeli gänderet ',
+'minoredit' => 'Numen es birebitzeli gänderet',
'watchthis' => 'Dä Artikel beobachte',
'savearticle' => 'Syte spychere',
'showpreview' => 'Vorschau aaluege',
@@ -598,7 +599,7 @@ Bitte bis dir über d Konsequänze bewusst, u bis sicher, das du di a üsi [[Pro
Im $2 het’s e Lischte vo de letschte Löschige.',
'deletionlog' => 'Lösch-Logbuech',
'deletecomment' => 'Löschigsgrund',
-'alreadyrolled' => 'Cha d Änderig uf [[$1]] wo [[User:$2|$2]] ([[User talk:$2|Talk]]) gmacht het nit zruckneh will des öbber anderscht scho gmacht het.
+'alreadyrolled' => 'Cha d Änderig uf [[:$1]] wo [[User:$2|$2]] ([[User talk:$2|Talk]]) gmacht het nit zruckneh will des öbber anderscht scho gmacht het.
Di letschti Änderig het [[User:$3|$3]] ([[User talk:$3|Talk]]) gmacht.',
'revertpage' => 'Rückgängig gmacht zuer letschte Änderig vo $1',
@@ -682,14 +683,14 @@ I söttigne Fäll müessti d Diskussionssyten allefalls vo Hand kopiert wärde.'
'markaspatrolleddiff' => 'Als geprüft markiere',
'markaspatrolledtext' => 'Den Artikel als geprüft markiere',
'markedaspatrolledtext' => 'Die usgwählte Artikeländerung isch als geprüft markiert worre.',
-'Monobook.js' => ' var ta = new Object();
+'monobook.js' => ' var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Myni Benutzersyte\');
ta[\'pt-mytalk\'] = new Array(\'n\',\'Myni Diskussionssyte\');
ta[\'pt-preferences\'] = new Array(\'\',\'Myni Ystellige\');
ta[\'pt-watchlist\'] = new Array(\'l\',\'Lischte vo de beobachtete Syte.\');
ta[\'pt-mycontris\'] = new Array(\'y\',\'Lischte vo myne Byträg\');
ta[\'pt-login\'] = new Array(\'o\',\'Ylogge\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Uslogge\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Uslogge\');
ta[\'ca-article\'] = new Array(\'a\',\'Artikel aaluege\');
ta[\'ca-talk\'] = new Array(\'t\',\'Diskussion zum Artikelinhalt\');
ta[\'ca-edit\'] = new Array(\'e\',\'Syte bearbeite. Bitte vor em Spychere d Vorschou aaluege.\');
diff --git a/languages/messages/MessagesHe.php b/languages/messages/MessagesHe.php
index 84f05e04..3019f944 100644
--- a/languages/messages/MessagesHe.php
+++ b/languages/messages/MessagesHe.php
@@ -14,23 +14,24 @@ $defaultUserOptionOverrides = array(
# Swap sidebar to right side by default
'quickbar' => 2,
);
+
$linkTrail = '/^([a-z×-ת]+)(.*)$/sDu';
-$fallback8bitEncoding = "windows-1255";
+$fallback8bitEncoding = 'windows-1255';
$skinNames = array(
- "standard" => "רגיל",
- "nostalgia" => "נוסטלגי",
- "cologneblue" => "×ž×™× ×›×—×•×œ×™×",
- "davinci" => "דה־וינצ'י",
- "simple" => "פשוט",
- "mono" => "מונו",
- "monobook" => "מונובוק",
- "myskin" => "הרקע שלי",
- "chick" => "צ'יק"
+ 'standard' => 'רגיל',
+ 'nostalgia' => 'נוסטלגי',
+ 'cologneblue' => '×ž×™× ×›×—×•×œ×™×',
+ 'davinci' => "דה־וינצ'י",
+ 'simple' => 'פשוט',
+ 'mono' => 'מונו',
+ 'monobook' => 'מונובוק',
+ 'myskin' => 'הרקע שלי',
+ 'chick' => "צ'יק"
);
$quickbarSettings = array(
- "לל×", "קבוע משמ×ל", "קבוע מימין", "צף משמ×ל", "צף מימין"
+ 'לל×', 'קבוע משמ×ל', 'קבוע מימין', 'צף משמ×ל', 'צף מימין'
);
$dateFormats = array(
@@ -52,10 +53,10 @@ $dateFormats = array(
);
$bookstoreList = array(
- "מיתוס" => "http://www.mitos.co.il/",
- "iBooks" => "http://www.ibooks.co.il/",
- "Barnes & Noble" => "http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=\$1",
- "Amazon.com" => "http://www.amazon.com/exec/obidos/ISBN=\$1"
+ 'מיתוס' => 'http://www.mitos.co.il/',
+ 'iBooks' => 'http://www.ibooks.co.il/',
+ 'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
+ 'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
);
$magicWords = array(
@@ -161,285 +162,289 @@ $magicWords = array(
'formatnum' => array( 0, 'עיצוב מספר', 'FORMATNUM' ),
'padleft' => array( 0, 'ריפוד משמ×ל', 'PADLEFT' ),
'padright' => array( 0, 'ריפוד מימין', 'PADRIGHT' ),
+ 'special' => array( 0, 'מיוחד', 'special' ),
+ 'defaultsort' => array( 1, 'מיון רגיל:', 'DEFAULTSORT:' ),
);
$namespaceNames = array(
- NS_MEDIA => "מדיה",
- NS_SPECIAL => "מיוחד",
- NS_MAIN => "",
- NS_TALK => "שיחה",
- NS_USER => "משתמש",
- NS_USER_TALK => "שיחת_משתמש",
+ NS_MEDIA => 'מדיה',
+ NS_SPECIAL => 'מיוחד',
+ NS_MAIN => '',
+ NS_TALK => 'שיחה',
+ NS_USER => 'משתמש',
+ NS_USER_TALK => 'שיחת_משתמש',
# NS_PROJECT set by $wgMetaNamespace
- NS_PROJECT_TALK => "שיחת_$1",
- NS_IMAGE => "תמונה",
- NS_IMAGE_TALK => "שיחת_תמונה",
- NS_MEDIAWIKI => "מדיה_ויקי",
- NS_MEDIAWIKI_TALK => "שיחת_מדיה_ויקי",
- NS_TEMPLATE => "תבנית",
- NS_TEMPLATE_TALK => "שיחת_תבנית",
- NS_HELP => "עזרה",
- NS_HELP_TALK => "שיחת_עזרה",
- NS_CATEGORY => "קטגוריה",
- NS_CATEGORY_TALK => "שיחת_קטגוריה",
+ NS_PROJECT_TALK => 'שיחת_$1',
+ NS_IMAGE => 'תמונה',
+ NS_IMAGE_TALK => 'שיחת_תמונה',
+ NS_MEDIAWIKI => 'מדיה_ויקי',
+ NS_MEDIAWIKI_TALK => 'שיחת_מדיה_ויקי',
+ NS_TEMPLATE => 'תבנית',
+ NS_TEMPLATE_TALK => 'שיחת_תבנית',
+ NS_HELP => 'עזרה',
+ NS_HELP_TALK => 'שיחת_עזרה',
+ NS_CATEGORY => 'קטגוריה',
+ NS_CATEGORY_TALK => 'שיחת_קטגוריה',
);
-
$messages = array(
-
# User preference toggles
-"tog-underline" => "סמן ×§×™×©×•×¨×™× ×‘×§×• תחתי",
-"tog-highlightbroken" => 'סמן ×§×™×©×•×¨×™× ×œ×“×¤×™× ×©×œ× × ×›×ª×‘×• <a href="" class="new">כך</a> (×ו: כך<a href="" class="new">?</a>))',
-"tog-justify" => "ישר פסק×ות",
-"tog-hideminor" => "הסתר ×©×™× ×•×™×™× ×ž×©× ×™×™× ×‘×¨×©×™×ž×ª ×”×©×™× ×•×™×™× ×”×חרוני×",
-"tog-extendwatchlist" => "הרחב ×ת רשימת המעקב כך שתציג ×ת כל ×”×©×™× ×•×™×™× ×”×ž×ª××™×ž×™× (×חרת: ×ת השינוי ×”×חרון בכל דף בלבד)",
-"tog-usenewrc" => "רשימת ×©×™× ×•×™×™× ××—×¨×•× ×™× ×ž×©×•×¤×¨×ª (JavaScript)",
-"tog-numberheadings" => "מספר כותרות ×וטומטית",
-"tog-showtoolbar" => "הצג ×ת סרגל העריכה",
-"tog-editondblclick" => "ערוך ×“×¤×™× ×‘×œ×—×™×¦×” כפולה (JavaScript)",
-"tog-editsection" => "הפעל עריכת פסק×ות ב×מצעות ×§×™×©×•×¨×™× ×ž×”×¦×•×¨×” [עריכה]",
-"tog-editsectiononrightclick" => "הפעל עריכת פסק×ות על־ידי לחיצה ימנית<br />על כותרות הפסק×ות (JavaScript)",
-"tog-showtoc" => "הצג תוכן ×¢× ×™×™× ×™×<br />(עבור ×“×¤×™× ×¢× ×™×•×ª×¨ מ־3 כותרות)",
-"tog-rememberpassword" => "זכור ×ת הכניסה שלי במחשב ×–×”",
-"tog-editwidth" => "תיבת העריכה ברוחב מל×",
-"tog-watchcreations" => "עקוב ×חרי ×“×¤×™× ×©×™×¦×¨×ª×™",
-"tog-watchdefault" => "עקוב ×חרי ×“×¤×™× ×©×¢×¨×›×ª×™",
-"tog-minordefault" => "הגדר כל פעולת עריכה כמשנית ×× ×œ× ×¦×•×™×™×Ÿ ×חרת",
-"tog-previewontop" => "הצג תצוגה מקדימה לפני תיבת העריכה (×ו: ×חריה)",
-"tog-previewonfirst" => "הצג תצוגה מקדימה בעריכה ר×שונה",
-"tog-nocache" => "נטרל משיכת ×“×¤×™× ×ž×–×›×¨×•×Ÿ המטמון שבשרת",
-"tog-enotifwatchlistpages" => 'שלח לי דו×"ל ×›×שר נעשה שינוי ×‘×“×¤×™× ×”× ×¦×¤×™× ×¢×œÖ¾×™×“×™',
-"tog-enotifusertalkpages" => 'שלח לי דו×"ל ×›×שר נעשה שינוי בדף שיחת המשתמש שלי',
-"tog-enotifminoredits" => 'שלח לי דו×"ל ×’× ×¢×œ עריכות משניות של דפי×',
-"tog-enotifrevealaddr" => 'חשוף ×ת כתובת הדו×"ל שלי בהודעות דו×ר',
-"tog-shownumberswatching" => "הצג ×ת מספר ×”×ž×©×ª×ž×©×™× ×”×¦×•×¤×™× ×‘×“×£",
-"tog-fancysig" => "הצג חתימה מסוגננת",
-"tog-externaleditor" => "השתמש בעורך חיצוני כברירת מחדל",
-"tog-externaldiff" => "השתמש בתוכנת השוו×ת הגרס×ות החיצונית כברירת מחדל",
-"tog-showjumplinks" => '×פשר קישורי נגישות מסוג "קפוץ ×ל"',
-"tog-uselivepreview" => "השתמש בתצוגה מקדימה חיה (JavaScript) (ניסיוני)",
-"tog-autopatrol" => "סמן ×ת העריכות שלי כבדוקות",
-"tog-forceeditsummary" => "הזהר ×ותי כש×× ×™ מכניס תקציר עריכה ריק",
-"tog-watchlisthideown" => "הסתר עריכות שלי ברשימת המעקב",
-"tog-watchlisthidebots" => "הסתר ×‘×•×˜×™× ×‘×¨×©×™×ž×ª המעקב",
-
-"underline-always" => "תמיד",
-"underline-never" => "××£ פע×",
-"underline-default" => "ברירת מחדל של הדפדפן",
-
-"skinpreview" => "(תצוגה מקדימה)",
+'tog-underline' => 'סמן ×§×™×©×•×¨×™× ×‘×§×• תחתי',
+'tog-highlightbroken' => 'סמן ×§×™×©×•×¨×™× ×œ×“×¤×™× ×©×œ× × ×›×ª×‘×• <a href="" class="new">כך</a> (×ו: כך<a href="" class="internal">?</a>))',
+'tog-justify' => 'ישר פסק×ות',
+'tog-hideminor' => 'הסתר ×©×™× ×•×™×™× ×ž×©× ×™×™× ×‘×¨×©×™×ž×ª ×”×©×™× ×•×™×™× ×”×חרוני×',
+'tog-extendwatchlist' => 'הרחב ×ת רשימת המעקב כך שתציג ×ת כל ×”×©×™× ×•×™×™× ×”×ž×ª××™×ž×™× (×חרת: ×ת השינוי ×”×חרון בכל דף בלבד)',
+'tog-usenewrc' => 'רשימת ×©×™× ×•×™×™× ××—×¨×•× ×™× ×ž×©×•×¤×¨×ª (JavaScript)',
+'tog-numberheadings' => 'מספר כותרות ×וטומטית',
+'tog-showtoolbar' => 'הצג ×ת סרגל העריכה',
+'tog-editondblclick' => 'ערוך ×“×¤×™× ×‘×œ×—×™×¦×” כפולה (JavaScript)',
+'tog-editsection' => 'הפעל עריכת פסק×ות ב×מצעות ×§×™×©×•×¨×™× ×ž×”×¦×•×¨×” [עריכה]',
+'tog-editsectiononrightclick' => 'הפעל עריכת פסק×ות על־ידי לחיצה ימנית<br />על כותרות הפסק×ות (JavaScript)',
+'tog-showtoc' => 'הצג תוכן ×¢× ×™×™× ×™×<br />(עבור ×“×¤×™× ×¢× ×™×•×ª×¨ מ־3 כותרות)',
+'tog-rememberpassword' => 'זכור ×ת הכניסה שלי במחשב ×–×”',
+'tog-editwidth' => 'תיבת העריכה ברוחב מל×',
+'tog-watchcreations' => 'עקוב ×חרי ×“×¤×™× ×©×™×¦×¨×ª×™',
+'tog-watchdefault' => 'עקוב ×חרי ×“×¤×™× ×©×¢×¨×›×ª×™',
+'tog-watchmoves' => 'עקוב ×חרי ×“×¤×™× ×©×”×¢×‘×¨×ª×™',
+'tog-watchdeletion' => 'עקוב ×חרי ×“×¤×™× ×©×ž×—×§×ª×™',
+'tog-minordefault' => 'הגדר כל פעולת עריכה כמשנית ×× ×œ× ×¦×•×™×™×Ÿ ×חרת',
+'tog-previewontop' => 'הצג תצוגה מקדימה לפני תיבת העריכה (×ו: ×חריה)',
+'tog-previewonfirst' => 'הצג תצוגה מקדימה בעריכה ר×שונה',
+'tog-nocache' => 'נטרל משיכת ×“×¤×™× ×ž×–×›×¨×•×Ÿ המטמון שבשרת',
+'tog-enotifwatchlistpages' => 'שלח לי דו×"ל ×›×שר נעשה שינוי ×‘×“×¤×™× ×”× ×¦×¤×™× ×¢×œÖ¾×™×“×™',
+'tog-enotifusertalkpages' => 'שלח לי דו×"ל ×›×שר נעשה שינוי בדף שיחת המשתמש שלי',
+'tog-enotifminoredits' => 'שלח לי דו×"ל ×’× ×¢×œ עריכות משניות של דפי×',
+'tog-enotifrevealaddr' => 'חשוף ×ת כתובת הדו×"ל שלי בהודעות דו×ר',
+'tog-shownumberswatching' => 'הצג ×ת מספר ×”×ž×©×ª×ž×©×™× ×”×¦×•×¤×™× ×‘×“×£',
+'tog-fancysig' => 'הצג חתימה מסוגננת',
+'tog-externaleditor' => 'השתמש בעורך חיצוני כברירת מחדל',
+'tog-externaldiff' => 'השתמש בתוכנת השוו×ת הגרס×ות החיצונית כברירת מחדל',
+'tog-showjumplinks' => '×פשר קישורי נגישות מסוג "קפוץ ×ל"',
+'tog-uselivepreview' => 'השתמש בתצוגה מקדימה חיה (JavaScript) (ניסיוני)',
+'tog-forceeditsummary' => 'הזהר ×ותי כש×× ×™ מכניס תקציר עריכה ריק',
+'tog-watchlisthideown' => 'הסתר עריכות שלי ברשימת המעקב',
+'tog-watchlisthidebots' => 'הסתר ×‘×•×˜×™× ×‘×¨×©×™×ž×ª המעקב',
+'tog-watchlisthideminor' => 'הסתר עריכות משניות ברשימת המעקב',
+'tog-nolangconversion' => 'בטל המרת גרס×ות שפה',
+'tog-ccmeonemails' => 'שלח ×לי ×”×¢×ª×§×™× ×©×œ הודעות דו×ר ×לקטרוני ש×× ×™ שולח ×œ×ž×©×ª×ž×©×™× ×חרי×',
+
+'underline-always' => 'תמיד',
+'underline-never' => '××£ פע×',
+'underline-default' => 'ברירת מחדל של הדפדפן',
+
+'skinpreview' => '(תצוגה מקדימה)',
# Dates
-"sunday" => "ר×שון",
-"monday" => "שני",
-"tuesday" => "שלישי",
-"wednesday" => "רביעי",
-"thursday" => "חמישי",
-"friday" => "שישי",
-"saturday" => "שבת",
-"sun" => "ר×ש'",
-"mon" => "שני",
-"tue" => "שלי'",
-"wed" => "רבי'",
-"thu" => "חמי'",
-"fri" => "שיש'",
-"sat" => "שבת",
-"january" => "ינו×ר",
-"february" => "פברו×ר",
-"march" => "מרץ",
-"april" => "×פריל",
-"may_long" => "מ××™",
-"june" => "יוני",
-"july" => "יולי",
-"august" => "×וגוסט",
-"september" => "ספטמבר",
-"october" => "×וקטובר",
-"november" => "נובמבר",
-"december" => "דצמבר",
-"january-gen" => "בינו×ר",
-"february-gen" => "בפברו×ר",
-"march-gen" => "במרץ",
-"april-gen" => "ב×פריל",
-"may-gen" => "במ××™",
-"june-gen" => "ביוני",
-"july-gen" => "ביולי",
-"august-gen" => "ב×וגוסט",
-"september-gen" => "בספטמבר",
-"october-gen" => "ב×וקטובר",
-"november-gen" => "בנובמבר",
-"december-gen" => "בדצמבר",
-"jan" => "ינו'",
-"feb" => "פבר'",
-"mar" => "מרץ",
-"apr" => "×פר'",
-"may" => "מ××™",
-"jun" => "יוני",
-"jul" => "יולי",
-"aug" => "×וג'",
-"sep" => "ספט'",
-"oct" => "×וק'",
-"nov" => "נוב'",
-"dec" => "דצמ'",
+'sunday' => 'ר×שון',
+'monday' => 'שני',
+'tuesday' => 'שלישי',
+'wednesday' => 'רביעי',
+'thursday' => 'חמישי',
+'friday' => 'שישי',
+'saturday' => 'שבת',
+'sun' => "ר×ש'",
+'mon' => 'שני',
+'tue' => "שלי'",
+'wed' => "רבי'",
+'thu' => "חמי'",
+'fri' => "שיש'",
+'sat' => 'שבת',
+'january' => 'ינו×ר',
+'february' => 'פברו×ר',
+'march' => 'מרץ',
+'april' => '×פריל',
+'may_long' => 'מ××™',
+'june' => 'יוני',
+'july' => 'יולי',
+'august' => '×וגוסט',
+'september' => 'ספטמבר',
+'october' => '×וקטובר',
+'november' => 'נובמבר',
+'december' => 'דצמבר',
+'january-gen' => 'בינו×ר',
+'february-gen' => 'בפברו×ר',
+'march-gen' => 'במרץ',
+'april-gen' => 'ב×פריל',
+'may-gen' => 'במ××™',
+'june-gen' => 'ביוני',
+'july-gen' => 'ביולי',
+'august-gen' => 'ב×וגוסט',
+'september-gen' => 'בספטמבר',
+'october-gen' => 'ב×וקטובר',
+'november-gen' => 'בנובמבר',
+'december-gen' => 'בדצמבר',
+'jan' => "ינו'",
+'feb' => "פבר'",
+'mar' => 'מרץ',
+'apr' => "×פר'",
+'may' => 'מ××™',
+'jun' => 'יוני',
+'jul' => 'יולי',
+'aug' => "×וג'",
+'sep' => "ספט'",
+'oct' => "×וק'",
+'nov' => "נוב'",
+'dec' => "דצמ'",
# Bits of text used by many pages
-"categories" => "{{plural:$1|קטגוריה|קטגוריות}}",
-"category_header" => '×“×¤×™× ×‘×§×˜×’×•×¨×™×” "$1"',
-"subcategories" => "קטגוריות משנה",
+'categories' => 'קטגוריות',
+'pagecategories' => '{{plural:$1|קטגוריה|קטגוריות}}',
+'category_header' => '×“×¤×™× ×‘×§×˜×’×•×¨×™×” "$1"',
+'subcategories' => 'קטגוריות משנה',
+'category-media-header' => 'קבצי מדיה בקטגוריה "$1"',
-"mainpage" => "עמוד ר×שי",
-"mainpagetext" => "'''תוכנת מדיה־ויקי הותקנה בהצלחה.'''",
-"mainpagedocfooter" => "היעזרו ב[http://meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.
+'mainpage' => 'עמוד ר×שי',
+'mainpagetext' => "'''תוכנת מדיה־ויקי הותקנה בהצלחה.'''",
+'mainpagedocfooter' => 'היעזרו ב[http://meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.
== ×§×™×©×•×¨×™× ×©×™×ž×•×©×™×™× ==
* [http://www.mediawiki.org/wiki/Help:Configuration_settings רשימת ההגדרות]
* [http://www.mediawiki.org/wiki/Help:FAQ ש×לות נפוצות]
-* [http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרס×ות]",
-
-"portal" => "שער הקהילה",
-"portal-url" => "{{ns:project}}:שער הקהילה",
-"about" => "×ודות",
-"aboutsite" => "×ודות {{SITENAME}}",
-"aboutpage" => "{{ns:project}}:×ודות",
-"article" => "דף תוכן",
-"help" => "עזרה",
-"helppage" => "{{ns:project}}:עזרה",
-"bugreports" => "דיווח על ב××’×™×",
-"bugreportspage" => "{{ns:project}}:דיווח על ב××’×™×",
-"sitesupport" => "תרומות",
-"sitesupport-url" => "{{ns:project}}:תרומות",
-"faq" => "ש×לות ותשובות",
-"faqpage" => "{{ns:project}}:ש×לות ותשובות",
-"edithelp" => "עזרה לעריכה",
-"newwindow" => "(נפתח בחלון חדש)",
-"edithelppage" => "{{ns:project}}:×יך לערוך דף",
-"cancel" => "בטל / צ×",
-"qbfind" => "חיפוש",
-"qbbrowse" => "דפדוף",
-"qbedit" => "עריכה",
-"qbpageoptions" => "×פשרויות דף",
-"qbpageinfo" => "מידע על הדף",
-"qbmyoptions" => "×”×פשרויות שלי",
-"qbspecialpages" => "×“×¤×™× ×ž×™×•×—×“×™×",
-"moredotdotdot" => "עוד…",
-"mypage" => "הדף שלי",
-"mytalk" => "דף השיחה שלי",
-"anontalk" => "השיחה עבור IP זה",
-"navigation" => "ניווט",
+* [http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרס×ות]',
+
+'portal' => 'שער הקהילה',
+'portal-url' => '{{ns:project}}:שער הקהילה',
+'about' => '×ודות',
+'aboutsite' => '×ודות {{SITENAME}}',
+'aboutpage' => '{{ns:project}}:×ודות',
+'article' => 'דף תוכן',
+'help' => 'עזרה',
+'helppage' => '{{ns:project}}:עזרה',
+'bugreports' => 'דיווח על ב××’×™×',
+'bugreportspage' => '{{ns:project}}:דיווח על ב××’×™×',
+'sitesupport' => 'תרומות',
+'sitesupport-url' => '{{ns:project}}:תרומות',
+'faq' => 'ש×לות ותשובות',
+'faqpage' => '{{ns:project}}:ש×לות ותשובות',
+'edithelp' => 'עזרה לעריכה',
+'newwindow' => '(נפתח בחלון חדש)',
+'edithelppage' => '{{ns:project}}:×יך לערוך דף',
+'cancel' => 'בטל / צ×',
+'qbfind' => 'חיפוש',
+'qbbrowse' => 'דפדוף',
+'qbedit' => 'עריכה',
+'qbpageoptions' => '×פשרויות דף',
+'qbpageinfo' => 'מידע על הדף',
+'qbmyoptions' => '×”×פשרויות שלי',
+'qbspecialpages' => '×“×¤×™× ×ž×™×•×—×“×™×',
+'moredotdotdot' => 'עוד…',
+'mypage' => 'הדף שלי',
+'mytalk' => 'דף השיחה שלי',
+'anontalk' => 'השיחה עבור IP זה',
+'navigation' => 'ניווט',
# Metadata in edit box
-"metadata_help" => "Metadata (ר×ו [[{{ns:project}}:Metadata]] למידע נוסף):",
-
-"currentevents" => "×קטו×ליה",
-"currentevents-url" => "×קטו×ליה",
-
-"disclaimers" => "הבהרה משפטית",
-"disclaimerpage" => "{{ns:project}}:הבהרה משפטית",
-"privacy" => "מדיניות הפרטיות",
-"privacypage" => "{{ns:project}}:מדיניות הפרטיות",
-"errorpagetitle" => "שגי××”",
-"returnto" => "חזרו לדף $1.",
-"tagline" => "מתוך {{SITENAME}}",
-"help" => "עזרה",
-"search" => "חיפוש",
-"searchbutton" => "חיפוש",
-"go" => "עבור",
-"searcharticle" => "עבור",
-"history" => "היסטוריית הדף",
-"history_short" => "היסטוריה",
-"updatedmarker" => "עודכן מ××– ביקורך ×”×חרון",
-"info_short" => "מידע",
-"printableversion" => "גרסת הדפסה",
-"permalink" => "קישור קבוע",
-"print" => "גרסה להדפסה",
-"edit" => "עריכה",
-"editthispage" => "ערכו דף זה",
-"delete" => "מחק",
-"deletethispage" => "מחקו דף זה",
-"undelete_short" => "שחזר {{plural:$1|עריכה ×חת|$1 עריכות}}",
-"protect" => "הגן",
-"protectthispage" => "הגנו על דף זה",
-"unprotect" => "הסר הגנה",
-"unprotectthispage" => "הסירו הגנה מדף זה",
-"newpage" => "דף חדש",
-"talkpage" => "שוחחו על דף זה",
-"specialpage" => "דף מיוחד",
-"personaltools" => "×›×œ×™× ×ישיי×",
-"postcomment" => "הוסף הערה לדף השיחה",
-"articlepage" => "צפו בדף התוכן",
-"talk" => "שיחה",
-"views" => "צפיות",
-"toolbox" => "תיבת כלי×",
-"userpage" => "צפו בדף המשתמש",
-"projectpage" => "צפו בדף המיז×",
-"imagepage" => "צפו בדף התמונה",
-"mediawikipage" => "צפו בדף ההודעה",
-"templatepage" => "צפו בדף התבנית",
-"viewhelppage" => "צפו בדף העזרה",
-"categorypage" => "צפו בדף הקטגוריה",
-"viewtalkpage" => "צפו בדף השיחה",
-"otherlanguages" => "שפות ×חרות",
-"redirectedfrom" => "(הופנה מהדף $1)",
-"autoredircomment" => "הפניה לדף [[$1]]",
-"redirectpagesub" => "דף הפניה",
-"lastmodifiedat" => "שונה ל×חרונה ב־$2, $1.",
-"viewcount" => "דף ×–×” נצפה {{plural:$1|×¤×¢× ×חת|$1 פעמי×|פעמיי×}}.",
-"copyright" => "התוכן מוגש בכפוף ל־$1.<br /> בעלי זכויות ×”×™×•×¦×¨×™× ×ž×¤×•×¨×˜×™× ×‘×”×™×¡×˜×•×¨×™×™×ª ×”×©×™× ×•×™×™× ×©×œ הדף.",
-"protectedpage" => "דף מוגן",
-"jumpto" => "קפיצה ×ל:",
-"jumptonavigation" => "ניווט",
-"jumptosearch" => "חיפוש",
-
-"badaccess" => "שגי××” בהרש×ות",
-"badaccess-group0" => "××™× ×›× ×ž×•×¨×©×™× ×œ×‘×¦×¢ ×ת הפעולה שביקשת×.",
-"badaccess-group1" => "הפעולה ×©×‘×™×§×©×ª× ×œ×‘×¦×¢ מוגבלת ×œ×ž×©×ª×ž×©×™× ×‘×§×‘×•×¦×” $1.",
-"badaccess-group2" => "הפעולה ×©×‘×™×§×©×ª× ×œ×‘×¦×¢ מוגבלת ×œ×ž×©×ª×ž×©×™× ×‘×חת הקבוצות $1.",
-"badaccess-groups" => "הפעולה ×©×‘×™×§×©×ª× ×œ×‘×¦×¢ מוגבלת ×œ×ž×©×ª×ž×©×™× ×‘×חת הקבוצות $1.",
-
-"versionrequired" => "נדרשת גרסה $1 של מדיה־ויקי",
-"versionrequiredtext" => 'גרסה $1 של מדיה־ויקי נדרשת לשימוש בדף זה.
+'metadata_help' => 'Metadata (ר×ו [[{{ns:project}}:Metadata]] למידע נוסף):',
+
+'currentevents' => '×קטו×ליה',
+'currentevents-url' => '×קטו×ליה',
+
+'disclaimers' => 'הבהרה משפטית',
+'disclaimerpage' => '{{ns:project}}:הבהרה משפטית',
+'privacy' => 'מדיניות הפרטיות',
+'privacypage' => '{{ns:project}}:מדיניות הפרטיות',
+'errorpagetitle' => 'שגי××”',
+'returnto' => 'חזרו לדף $1.',
+'tagline' => 'מתוך {{SITENAME}}',
+'search' => 'חיפוש',
+'searchbutton' => 'חיפוש',
+'go' => 'עבור',
+'searcharticle' => 'עבור',
+'history' => 'היסטוריית הדף',
+'history_short' => 'היסטוריה',
+'updatedmarker' => 'עודכן מ××– ביקורך ×”×חרון',
+'info_short' => 'מידע',
+'printableversion' => 'גרסת הדפסה',
+'permalink' => 'קישור קבוע',
+'print' => 'גרסה להדפסה',
+'edit' => 'עריכה',
+'editthispage' => 'ערכו דף זה',
+'delete' => 'מחיקה',
+'deletethispage' => 'מחקו דף זה',
+'undelete_short' => 'שחזר {{plural:$1|עריכה ×חת|$1 עריכות}}',
+'protect' => '×”×’× ×”',
+'protectthispage' => 'הגנו על דף זה',
+'unprotect' => 'הסרת הגנה',
+'unprotectthispage' => 'הסירו הגנה מדף זה',
+'newpage' => 'דף חדש',
+'talkpage' => 'שוחחו על דף זה',
+'specialpage' => 'דף מיוחד',
+'personaltools' => '×›×œ×™× ×ישיי×',
+'postcomment' => 'הוסף הערה לדף השיחה',
+'articlepage' => 'צפיה בדף התוכן',
+'talk' => 'שיחה',
+'views' => 'צפיות',
+'toolbox' => 'תיבת כלי×',
+'userpage' => 'צפיה בדף המשתמש',
+'projectpage' => 'צפיה בדף המיז×',
+'imagepage' => 'צפיה בדף התמונה',
+'mediawikipage' => 'צפיה בדף ההודעה',
+'templatepage' => 'צפיה בדף התבנית',
+'viewhelppage' => 'צפיה בדף העזרה',
+'categorypage' => 'צפיה בדף הקטגוריה',
+'viewtalkpage' => 'צפיה בדף השיחה',
+'otherlanguages' => 'שפות ×חרות',
+'redirectedfrom' => '(הופנה מהדף $1)',
+'redirectpagesub' => 'דף הפניה',
+'lastmodifiedat' => 'שונה ל×חרונה ב־$2, $1.', # $1 date, $2 time
+'viewcount' => 'דף ×–×” נצפה {{plural:$1|×¤×¢× ×חת|$1 פעמי×|פעמיי×}}.',
+'copyright' => 'התוכן מוגש בכפוף ל־$1.<br /> בעלי זכויות ×”×™×•×¦×¨×™× ×ž×¤×•×¨×˜×™× ×‘×”×™×¡×˜×•×¨×™×™×ª ×”×©×™× ×•×™×™× ×©×œ הדף.',
+'protectedpage' => 'דף מוגן',
+'jumpto' => 'קפיצה ×ל:',
+'jumptonavigation' => 'ניווט',
+'jumptosearch' => 'חיפוש',
+
+'badaccess' => 'שגי××” בהרש×ות',
+'badaccess-group0' => '××™× ×›× ×ž×•×¨×©×™× ×œ×‘×¦×¢ ×ת הפעולה שביקשת×.',
+'badaccess-group1' => 'הפעולה ×©×‘×™×§×©×ª× ×œ×‘×¦×¢ מוגבלת ×œ×ž×©×ª×ž×©×™× ×‘×§×‘×•×¦×” $1.',
+'badaccess-group2' => 'הפעולה ×©×‘×™×§×©×ª× ×œ×‘×¦×¢ מוגבלת ×œ×ž×©×ª×ž×©×™× ×‘×חת הקבוצות $1.',
+'badaccess-groups' => 'הפעולה ×©×‘×™×§×©×ª× ×œ×‘×¦×¢ מוגבלת ×œ×ž×©×ª×ž×©×™× ×‘×חת הקבוצות $1.',
+
+'versionrequired' => 'נדרשת גרסה $1 של מדיה־ויקי',
+'versionrequiredtext' => 'גרסה $1 של מדיה־ויקי נדרשת לשימוש בדף זה.
למידע נוסף, ר×ו [[{{ns:special}}:Version]].',
-"ok" => "×ישור",
-"pagetitle" => "$1 – {{SITENAME}}",
-"retrievedfrom" => '<br /><span style="font-size: smaller;">מקור: $1</span>',
-"youhavenewmessages" => "יש ×œ×›× $1 ($2).",
-"newmessageslink" => "הודעות חדשות",
-"newmessagesdifflink" => "השוו××” לגרסה הקודמת",
-"editsection" => "עריכה",
-"editold" => "עריכה",
-"editsectionhint" => "עריכת פסקה: $1",
-"toc" => "תוכן ×¢× ×™×™× ×™×",
-"showtoc" => "הר××”",
-"hidetoc" => "הסתר",
-"thisisdeleted" => "הציגו ×ו שחזרו $1?",
-"viewdeleted" => "הציגו $1?",
-"restorelink" => "{{plural:$1|גרסה מחוקה ×חת|$1 גרס×ות מחוקות}}",
-"feedlinks" => "×”×–× ×”:",
-"feed-invalid" => "סוג הזנת המנוי שגוי.",
+'ok' => '×ישור',
+'pagetitle' => '$1 – {{SITENAME}}',
+'retrievedfrom' => '<br /><span style="font-size: smaller;">מקור: $1</span>',
+'youhavenewmessages' => 'יש ×œ×›× $1 ($2).',
+'newmessageslink' => 'הודעות חדשות',
+'newmessagesdifflink' => 'שינוי ×חרון',
+'editsection' => 'עריכה',
+'editold' => 'עריכה',
+'editsectionhint' => 'עריכת פסקה: $1',
+'toc' => 'תוכן ×¢× ×™×™× ×™×',
+'showtoc' => 'הר××”',
+'hidetoc' => 'הסתר',
+'thisisdeleted' => 'הציגו ×ו שחזרו $1?',
+'viewdeleted' => 'הציגו $1?',
+'restorelink' => '{{plural:$1|גרסה מחוקה ×חת|$1 גרס×ות מחוקות}}',
+'feedlinks' => '×”×–× ×”:',
+'feed-invalid' => 'סוג הזנת המנוי שגוי.',
# Short words for each namespace, by default used in the 'article' tab in monobook
-"nstab-main" => "דף תוכן",
-"nstab-user" => "דף משתמש",
-"nstab-media" => "מדיה",
-"nstab-special" => "מיוחד",
-"nstab-project" => "דף מיז×",
-"nstab-image" => "תמונה",
-"nstab-mediawiki" => "הודעה",
-"nstab-template" => "תבנית",
-"nstab-help" => "דף עזרה",
-"nstab-category" => "קטגוריה",
+'nstab-main' => 'דף תוכן',
+'nstab-user' => 'דף משתמש',
+'nstab-media' => 'מדיה',
+'nstab-special' => 'מיוחד',
+'nstab-project' => 'דף מיז×',
+'nstab-image' => 'תמונה',
+'nstab-mediawiki' => 'הודעה',
+'nstab-template' => 'תבנית',
+'nstab-help' => 'דף עזרה',
+'nstab-category' => 'קטגוריה',
# Main script and global functions
-"nosuchaction" => "×ין פעולה כזו",
-"nosuchactiontext" => "מערכת מדיה־ויקי ××™× ×” מכירה ×ת הפעולה המצויינת בכתובת ×”Ö¾URL של הדף.",
-"nosuchspecialpage" => "×ין דף מיוחד ×‘×©× ×–×”",
-"nospecialpagetext" => "ביקשת דף מיוחד ש×ינו מוכר למערכת מדיה־ויקי.",
+'nosuchaction' => '×ין פעולה כזו',
+'nosuchactiontext' => 'מערכת מדיה־ויקי ××™× ×” מכירה ×ת הפעולה המצויינת בכתובת ×”Ö¾URL של הדף.',
+'nosuchspecialpage' => '×ין דף מיוחד ×‘×©× ×–×”',
+'nospecialpagetext' => 'ביקשת דף מיוחד ש×ינו מוכר למערכת מדיה־ויקי.',
# General errors
-"error" => "שגי××”",
-"databaseerror" => "שגי×ת בסיס־נתוני×",
-"dberrortext" => '<p><b>×רעה שגי×ת תחביר בש×ילתה לבסיס הנתוני×</b>.</p>
+'error' => 'שגי××”',
+'databaseerror' => 'שגי×ת בסיס־נתוני×',
+'dberrortext' => '<p><b>×רעה שגי×ת תחביר בש×ילתה לבסיס הנתוני×</b>.</p>
<p>שגי××” זו יכולה להיות תוצ××” של ש×ילתת חיפוש בלתי חוקית, ×ו ×©×”×™× ×¢×œ×•×œ×” להעיד על ב××’ במערכת מדיה־ויקי.</p>
<table class="toccolours"
<tr>
@@ -458,7 +463,7 @@ $messages = array(
<td style="direction: ltr;">$3: $4</td>
</tr>
</table>',
-"dberrortextcl" => '<p><b>×רעה שגי×ת תחביר בש×ילתה לבסיס הנתוני×</b>.</p>
+'dberrortextcl' => '<p><b>×רעה שגי×ת תחביר בש×ילתה לבסיס הנתוני×</b>.</p>
<table class="toccolours"
<tr>
<th colspan="2" style="background-color: #F8F8F8; text-align: center;">מידע על השגי××”</th>
@@ -476,215 +481,228 @@ $messages = array(
<td style="direction: ltr;">$3: $4</td>
</tr>
</table>',
-"noconnect" => "ניסיון ההתחברות לבסיס ×”× ×ª×•× ×™× ×¢×œ $1 ×œ× ×”×¦×œ×™×—",
-"nodb" => "×œ× × ×™×ª×Ÿ לבחור ×ת בסיס ×”× ×ª×•× ×™× $1",
-"cachederror" => "להלן מוצג עותק גיבוי (Cache), שכנר××” ×יננו עדכני, של הדף המבוקש.",
-"laggedslavemode" => "×זהרה: הדף עשוי ×©×œ× ×œ×”×›×™×œ ×¢×“×›×•× ×™× ×חרוני×.",
-"readonly" => "בסיס ×”× ×ª×•× ×™× × ×¢×•×œ",
-"enterlockreason" => "הזינו סיבה לנעילת בסיס הנתוני×, כולל הערכה לגבי מועד שחרור הנעילה.",
-"readonlytext" => "בסיס × ×ª×•× ×™× ×–×” של ×”×תר נעול ברגע ×–×” לצורך הזנת × ×ª×•× ×™× ×•×©×™× ×•×™×™×. ככל הנר××” מדובר בתחזוקה שוטפת, של×חריה יחזור ×”×תר לפעולתו הרגילה.
+'noconnect' => 'ניסיון ההתחברות לבסיס ×”× ×ª×•× ×™× ×¢×œ $1 ×œ× ×”×¦×œ×™×—',
+'nodb' => '×œ× × ×™×ª×Ÿ לבחור ×ת בסיס ×”× ×ª×•× ×™× $1',
+'cachederror' => 'להלן מוצג עותק גיבוי (Cache), שכנר××” ×יננו עדכני, של הדף המבוקש.',
+'laggedslavemode' => '×זהרה: הדף עשוי ×©×œ× ×œ×”×›×™×œ ×¢×“×›×•× ×™× ×חרוני×.',
+'readonly' => 'בסיס ×”× ×ª×•× ×™× × ×¢×•×œ',
+'enterlockreason' => 'הזינו סיבה לנעילת בסיס הנתוני×, כולל הערכה לגבי מועד שחרור הנעילה.',
+'readonlytext' => 'בסיס × ×ª×•× ×™× ×–×” של ×”×תר נעול ברגע ×–×” לצורך הזנת × ×ª×•× ×™× ×•×©×™× ×•×™×™×. ככל הנר××” מדובר בתחזוקה שוטפת, של×חריה יחזור ×”×תר לפעולתו הרגילה.
-המפתח שנעל ×ת בסיס ×”× ×ª×•× ×™× ×¡×™×¤×§ ×ת ההסבר הב×: $1",
-"missingarticle" => 'בסיס ×”× ×ª×•× ×™× ×œ× ×ž×¦× ×ת הטקסט של הדף ×©×”×•× ×”×™×” ×מור למצו×, ×‘×©× "$1".
+המפתח שנעל ×ת בסיס ×”× ×ª×•× ×™× ×¡×™×¤×§ ×ת ההסבר הב×: $1',
+'missingarticle' => 'בסיס ×”× ×ª×•× ×™× ×œ× ×ž×¦× ×ת הטקסט של הדף ×©×”×•× ×”×™×” ×מור למצו×, ×‘×©× "$1".
הדבר × ×’×¨× ×‘×“×¨×š כלל ב×מצעות קישור ישן להשוו×ת גרס×ות ×ו גרסה קודמת של דף שנמחק.
×× ×–×” ×ינו המקרה, כנר××” שמצ×ת ב××’ בתוכנה.
×× × ×“×•×•×— על כך למפתח תוך שמירת פרטי כתובת ×”Ö¾URL.',
-"readonly_lag" => "בסיס ×”× ×ª×•× ×™× × × ×¢×œ ×וטומטית כדי ל×פשר לבסיסי ×”× ×ª×•× ×™× ×”×ž×©× ×™×™× ×œ×”×ª×¢×“×›×Ÿ מהבסיס הר×שי.",
-"internalerror" => "שגי××” פנימית",
-"filecopyerror" => 'העתקת "$1" ל־"$2" ×œ× ×”×¦×œ×™×—×”.',
-"filerenameerror" => 'שינוי ×”×©× ×©×œ "$1" ל-"$2" ×œ× ×”×¦×œ×™×—.',
-"filedeleteerror" => 'מחיקת "$1" ×œ× ×”×¦×œ×™×—×”.',
-"filenotfound" => 'הקובץ "$1" ×œ× × ×ž×¦×.',
-"unexpected" => 'ערך ×œ× ×¦×¤×•×™: "$1"="$2"',
-"formerror" => "שגי××”: ×œ× ×™×›×•×œ לשלוח טופס.",
-"badarticleerror" => "×œ× × ×™×ª×Ÿ לבצע פעולה זו בדף ×–×”.",
-"cannotdelete" => "מחיקת הדף ×ו התמונה ×œ× ×”×¦×œ×™×—×”. (יתכן ×©×”×•× × ×ž×—×§ כבר על־ידי מישהו ×חר.)",
-"badtitle" => "כותרת שגויה",
-"badtitletext" => "כותרת הדף המבוקש הייתה ל×־חוקית, ריקה, קישור ויקי פנימי, ×ו ×¤× ×™× ×©×¤×” שגוי.",
-"perfdisabled" => "שירות ×–×” הופסק זמנית בכדי ×œ× ×œ×¤×’×•×¢ בביצועי המערכת. ×¢×ž×›× ×”×¡×œ×™×—×”!",
-"perfdisabledsub" => "מוצג להלן עותק שמור של דף מ־$1:",
-"perfcached" => "המידע ×”×‘× ×”×•× ×¢×•×ª×§ שמור של המידע, ועשוי ×©×œ× ×œ×”×™×•×ª מעודכן.",
-"perfcachedts" => "המידע ×”×‘× ×”×•× ×¢×•×ª×§ שמור של המידע, שעודכן ל×חרונה ב־$1.",
-"wrong_wfQuery_params" => "×”×¤×¨×ž×˜×¨×™× ×©×”×•×–× ×• ל־wfQuery() ××™× × × ×›×•× ×™×:<br />
+'readonly_lag' => 'בסיס ×”× ×ª×•× ×™× × × ×¢×œ ×וטומטית כדי ל×פשר לבסיסי ×”× ×ª×•× ×™× ×”×ž×©× ×™×™× ×œ×”×ª×¢×“×›×Ÿ מהבסיס הר×שי.',
+'internalerror' => 'שגי××” פנימית',
+'filecopyerror' => 'העתקת "$1" ל־"$2" ×œ× ×”×¦×œ×™×—×”.',
+'filerenameerror' => 'שינוי ×”×©× ×©×œ "$1" ל-"$2" ×œ× ×”×¦×œ×™×—.',
+'filedeleteerror' => 'מחיקת "$1" ×œ× ×”×¦×œ×™×—×”.',
+'filenotfound' => 'הקובץ "$1" ×œ× × ×ž×¦×.',
+'unexpected' => 'ערך ×œ× ×¦×¤×•×™: "$1"="$2"',
+'formerror' => 'שגי××”: ×œ× ×™×›×•×œ לשלוח טופס.',
+'badarticleerror' => '×œ× × ×™×ª×Ÿ לבצע פעולה זו בדף ×–×”.',
+'cannotdelete' => 'מחיקת הדף ×ו התמונה ×œ× ×”×¦×œ×™×—×”. (יתכן ×©×”×•× × ×ž×—×§ כבר על־ידי מישהו ×חר.)',
+'badtitle' => 'כותרת שגויה',
+'badtitletext' => 'כותרת הדף המבוקש הייתה ל×־חוקית, ריקה, קישור ויקי פנימי, ×ו ×¤× ×™× ×©×¤×” שגוי.',
+'perfdisabled' => 'שירות ×–×” הופסק זמנית בכדי ×œ× ×œ×¤×’×•×¢ בביצועי המערכת. ×¢×ž×›× ×”×¡×œ×™×—×”!',
+'perfdisabledsub' => 'מוצג להלן עותק שמור של דף מ־$1:', # obsolete?
+'perfcached' => 'המידע ×”×‘× ×”×•× ×¢×•×ª×§ שמור של המידע, ועשוי ×©×œ× ×œ×”×™×•×ª מעודכן.',
+'perfcachedts' => 'המידע ×”×‘× ×”×•× ×¢×•×ª×§ שמור של המידע, שעודכן ל×חרונה ב־$1.',
+'querypage-no-updates' => '×”×¢×“×›×•× ×™× ×œ×“×£ ×–×” כרגע מופסקי×, והמידע ×œ× ×™×¢×•×“×›×Ÿ ב×ופן שוטף.',
+'wrong_wfQuery_params' => '×”×¤×¨×ž×˜×¨×™× ×©×”×•×–× ×• ל־wfQuery() ××™× × × ×›×•× ×™×:<br />
פונקציה: $1<br />
-ש×ילתה: $2",
-"viewsource" => "הצג מקור",
-"viewsourcefor" => "לדף $1",
-"protectedtext" => "דף ×–×” הינו '''דף מוגן''' ×•×œ× × ×™×ª×Ÿ לערוך ×ותו. ישנן מספר סיבות ×פשריות להגנה כזו.
-
-ב××¤×©×¨×•×ª×›× ×œ×¦×¤×•×ª בטקסט המקור של הדף, ו××£ להעתיקו:",
-"protectedinterface" => "דף ×–×” ×”×•× ×חד מסדרת ×“×¤×™× ×”×ž×¡×¤×§×™× ×”×•×“×¢×•×ª מערכת לתוכנה, ונעול לעריכה למפעילי מערכת בלבד כדי למנוע השחתות של ההודעות.",
-"editinginterface" => "'''×זהרה:''' דף ×–×” ×”×•× ×חד מסדרת ×“×¤×™× ×”×ž×¡×¤×§×™× ×”×•×“×¢×•×ª מערכת לתוכנה. ×©×™× ×•×™×™× ×‘×“×£ ×–×” ישנו ×ת הודעת המערכת לכל ×”×ž×©×ª×ž×©×™× ×”×חרי×.",
-"sqlhidden" => "(ש×ילתת ×”Ö¾SQL מוסתרת)",
+ש×ילתה: $2',
+'viewsource' => 'הצגת מקור',
+'viewsourcefor' => 'לדף $1',
+'protectedpagetext' => "דף ×–×” הינו '''דף מוגן''' ×•×œ× × ×™×ª×Ÿ לערוך ×ותו.",
+'viewsourcetext' => 'ב××¤×©×¨×•×ª×›× ×œ×¦×¤×•×ª בטקסט המקור של הדף, ו××£ להעתיקו:',
+'protectedinterface' => 'דף ×–×” ×”×•× ×חד מסדרת ×“×¤×™× ×”×ž×¡×¤×§×™× ×”×•×“×¢×•×ª מערכת לתוכנה, ונעול לעריכה למפעילי מערכת בלבד כדי למנוע השחתות של ההודעות.',
+'editinginterface' => "'''×זהרה:''' דף ×–×” ×”×•× ×חד מסדרת ×“×¤×™× ×”×ž×¡×¤×§×™× ×”×•×“×¢×•×ª מערכת לתוכנה. ×©×™× ×•×™×™× ×‘×“×£ ×–×” ישנו ×ת הודעת המערכת לכל ×”×ž×©×ª×ž×©×™× ×”×חרי×.",
+'sqlhidden' => '(ש×ילתת ×”Ö¾SQL מוסתרת)',
# Login and logout pages
-"logouttitle" => "יצי××” מהחשבון",
-"logouttext" => "יצ××ª× ×–×” עתה מהחשבון. ב××¤×©×¨×•×ª×›× ×œ×”×ž×©×™×š ולעשות שימוש ב{{grammar:תחילית|{{SITENAME}}}} ב×ופן ×נונימי, ×ו לשוב ולהיכנס ל×תר ×¢× ×©× ×ž×©×ª×ž×© ×–×”×” ×ו ×חר.",
-"welcomecreation" => "== ברוך הב×, $1! ==
-חשבונך נפתח. ×ל תשכח להת××™× ×ת הגדרות המשתמש שלך.",
-"loginpagetitle" => "כניסת משתמש",
-"yourname" => "×©× ×ž×©×ª×ž×©",
-"yourpassword" => "סיסמה",
-"yourpasswordagain" => "הקש סיסמה שנית",
-"remembermypassword" => "זכור ×ת הכניסה במחשב ×–×”",
-"yourdomainname" => "×”×ª×—×•× ×©×œ×š",
-"externaldberror" => 'הייתה שגי×ת הזדהות חיצונית לבסיס הנתוני×, ×ו ש×ינך רש××™ לעדכן ×ת חשבונך החיצוני.',
-"loginproblem" => "'''×ירעה שגי××” בכניסה ל×תר.'''<br />נסה שנית!",
-"alreadyloggedin" => "'''$1, כבר ביצעת כניסה ל×תר!'''<br />",
-
-"login" => "כניסה לחשבון",
-"loginprompt" => 'לפני הכניסה לחשבון ב{{grammar:תחילית|{{SITENAME}}}}, ×¢×œ×™×›× ×œ×•×•×“× ×›×™ ×”"עוגיות" (Cookies) מופעלות.',
-"userlogin" => "כניסה / הרשמה לחשבון",
-"logout" => "יצי××” מהחשבון",
-"userlogout" => "יצי××” מהחשבון",
-"notloggedin" => "×œ× ×‘×—×©×‘×•×Ÿ",
-"nologin" => "×ין ×œ×›× ×—×©×‘×•×Ÿ? $1.",
-"nologinlink" => "××ª× ×ž×•×–×ž× ×™× ×œ×”×¨×©×",
-"createaccount" => "צור משתמש חדש",
-"gotaccount" => "כבר נרשמת×? $1.",
-"gotaccountlink" => "הכנסו לחשבון",
-"createaccountmail" => 'ב×מצעות דו×"ל',
-"badretype" => "הסיסמ×ות שהזנת ×ינן מת×ימות.",
-"userexists" => "×©× ×”×ž×©×ª×ž×© ×©×‘×—×¨×ª× × ×ž×¦× ×‘×©×™×ž×•×©. ×× × ×‘×—×¨×• ×©× ×חר.",
-"youremail" => "דו×ר ×לקטרוני *:",
-"username" => "×©× ×ž×©×ª×ž×©:",
-"uid" => "מספר סידורי:",
-"yourrealname" => "×©× ×מיתי *:",
-"yourlanguage" => "שפת הממשק:",
-"yourvariant" => "שינוי",
-"yournick" => "כינוי (לחתימות):",
-"badsig" => "חתימה מסוגננת שגויה; ×× × ×‘×“×§×• ×ת תגיות ×”Ö¾HTML.",
-"email" => 'דו×"ל',
-"prefs-help-email-enotif" => 'כתובת זו משמשת ×’× ×œ×ž×©×œ×•×— ×¢×“×›×•× ×™× ×“×¨×š הדו×"ל (×× ××¤×©×¨×ª× ×–×ת).',
-"prefs-help-realname" => "* ×©× ×מיתי (×ופציונ×לי): ×× ×ª×‘×—×¨×• לספק ×©× ×–×”, ×”×•× ×™×©×ž×© לייחוס ×¢×‘×•×“×ª×›× ×ליכ×.",
-"loginerror" => "שגי××” בכניסה ל×תר",
-"prefs-help-email" => '* דו×ר ×לקטרוני (×ופציונ×לי): ×פשרו ל××—×¨×™× ×œ×©×œ×•×— ×œ×›× ×ž×¡×¨ דרך דף המשתמש ×©×œ×›× ×œ×œ× ×¦×•×¨×š לחשוף ×ת כתובתכ×.',
-"nocookiesnew" => "נוצר חשבון המשתמש שלכ×, ×ך ×œ× × ×›× ×¡×ª× ×›×ž×©×ª×ž×©×™× ×¨×©×•×ž×™× ×œ×ž×¢×¨×›×ª כיוון ×©× ×™×˜×¨×œ×ª× ×ת העוגיות, ש{{grammar:תחילית|{{SITENAME}}}} משתמש בהן לצורך כניסה למערכת. ×× × ×”×¤×¢×™×œ×• ×ותן מחדש, ול×חר מכן תוכלו להיכנס למערכת ×¢× ×©× ×”×ž×©×ª×ž×© והסיסמה ×”×—×“×©×™× ×©×œ×›×.",
-"nocookieslogin" => "×œ× ×”×¦×œ×—×ª× ×œ×”×™×›× ×¡ למערכת ×›×ž×©×ª×ž×©×™× ×¨×©×•×ž×™× ×›×™×•×•×Ÿ ×©× ×™×˜×¨×œ×ª× ×ת העוגיות, ש{{grammar:תחילית|{{SITENAME}}}} משתמש בהן לצורך כניסה למערכת. ×× × ×”×¤×¢×™×œ×• ×ותן מחדש, ול×חר מכן תוכלו להיכנס למערכת ×¢× ×©× ×”×ž×©×ª×ž×© והסיסמה שלכ×.",
-"noname" => "×œ× ×”×–× ×ª× ×©× ×ž×©×ª×ž×© חוקי",
-"loginsuccesstitle" => "הכניסה הושלמה בהצלחה",
-"loginsuccess" => '\'\'\'× ×›× ×¡×ª× ×œ{{grammar:תחילית|{{SITENAME}}}} ×‘×©× "$1".\'\'\'',
-"nosuchuser" => '×ין משתמש ×‘×©× "$1".
+'logouttitle' => 'יצי××” מהחשבון',
+'logouttext' => 'יצ××ª× ×–×” עתה מהחשבון. ב××¤×©×¨×•×ª×›× ×œ×”×ž×©×™×š ולעשות שימוש ב{{grammar:תחילית|{{SITENAME}}}} ב×ופן ×נונימי, ×ו לשוב ולהיכנס ל×תר ×¢× ×©× ×ž×©×ª×ž×© ×–×”×” ×ו ×חר.',
+'welcomecreation' => '== ברוך הב×, $1! ==
+חשבונך נפתח. ×ל תשכח להת××™× ×ת הגדרות המשתמש שלך.',
+'loginpagetitle' => 'כניסת משתמש',
+'yourname' => '×©× ×ž×©×ª×ž×©',
+'yourpassword' => 'סיסמה',
+'yourpasswordagain' => 'הקש סיסמה שנית',
+'remembermypassword' => 'זכור ×ת הכניסה במחשב ×–×”',
+'yourdomainname' => '×”×ª×—×•× ×©×œ×š',
+'externaldberror' => 'הייתה שגי×ת הזדהות חיצונית לבסיס הנתוני×, ×ו ש×ינך רש××™ לעדכן ×ת חשבונך החיצוני.',
+'loginproblem' => "'''×ירעה שגי××” בכניסה ל×תר.'''<br />נסה שנית!",
+'alreadyloggedin' => "'''$1, כבר ביצעת כניסה ל×תר!'''<br />",
+'login' => 'כניסה לחשבון',
+'loginprompt' => 'לפני הכניסה לחשבון ב{{grammar:תחילית|{{SITENAME}}}}, ×¢×œ×™×›× ×œ×•×•×“× ×›×™ ×”"עוגיות" (Cookies) מופעלות.',
+'userlogin' => 'כניסה / הרשמה לחשבון',
+'logout' => 'יצי××” מהחשבון',
+'userlogout' => 'יצי××” מהחשבון',
+'notloggedin' => '×œ× ×‘×—×©×‘×•×Ÿ',
+'nologin' => '×ין ×œ×›× ×—×©×‘×•×Ÿ? $1.',
+'nologinlink' => '××ª× ×ž×•×–×ž× ×™× ×œ×”×¨×©×',
+'createaccount' => 'צור משתמש חדש',
+'gotaccount' => 'כבר נרשמת×? $1.',
+'gotaccountlink' => 'הכנסו לחשבון',
+'createaccountmail' => 'ב×מצעות דו×"ל',
+'badretype' => 'הסיסמ×ות שהזנת ×ינן מת×ימות.',
+'userexists' => '×©× ×”×ž×©×ª×ž×© ×©×‘×—×¨×ª× × ×ž×¦× ×‘×©×™×ž×•×©. ×× × ×‘×—×¨×• ×©× ×חר.',
+'youremail' => 'דו×ר ×לקטרוני *:',
+'username' => '×©× ×ž×©×ª×ž×©:',
+'uid' => 'מספר סידורי:',
+'yourrealname' => '×©× ×מיתי *:',
+'yourlanguage' => 'שפת הממשק:',
+'yourvariant' => 'שינוי',
+'yournick' => 'כינוי (לחתימות):',
+'badsig' => 'חתימה מסוגננת שגויה; ×× × ×‘×“×§×• ×ת תגיות ×”Ö¾HTML.',
+'email' => 'דו×"ל',
+'prefs-help-email-enotif' => 'כתובת זו משמשת ×’× ×œ×ž×©×œ×•×— ×¢×“×›×•× ×™× ×“×¨×š הדו×"ל (×× ××¤×©×¨×ª× ×–×ת).',
+'prefs-help-realname' => '* ×©× ×מיתי (×ופציונ×לי): ×× ×ª×‘×—×¨×• לספק ×©× ×–×”, ×”×•× ×™×©×ž×© לייחוס ×¢×‘×•×“×ª×›× ×ליכ×.',
+'loginerror' => 'שגי××” בכניסה ל×תר',
+'prefs-help-email' => '* דו×ר ×לקטרוני (×ופציונ×לי): ×פשרו ל××—×¨×™× ×œ×©×œ×•×— ×œ×›× ×ž×¡×¨ דרך דף המשתמש ×©×œ×›× ×œ×œ× ×¦×•×¨×š לחשוף ×ת כתובתכ×.',
+'nocookiesnew' => 'נוצר חשבון המשתמש שלכ×, ×ך ×œ× × ×›× ×¡×ª× ×›×ž×©×ª×ž×©×™× ×¨×©×•×ž×™× ×œ×ž×¢×¨×›×ª כיוון ×©× ×™×˜×¨×œ×ª× ×ת העוגיות, ש{{grammar:תחילית|{{SITENAME}}}} משתמש בהן לצורך כניסה למערכת. ×× × ×”×¤×¢×™×œ×• ×ותן מחדש, ול×חר מכן תוכלו להיכנס למערכת ×¢× ×©× ×”×ž×©×ª×ž×© והסיסמה ×”×—×“×©×™× ×©×œ×›×.',
+'nocookieslogin' => '×œ× ×”×¦×œ×—×ª× ×œ×”×™×›× ×¡ למערכת ×›×ž×©×ª×ž×©×™× ×¨×©×•×ž×™× ×›×™×•×•×Ÿ ×©× ×™×˜×¨×œ×ª× ×ת העוגיות, ש{{grammar:תחילית|{{SITENAME}}}} משתמש בהן לצורך כניסה למערכת. ×× × ×”×¤×¢×™×œ×• ×ותן מחדש, ול×חר מכן תוכלו להיכנס למערכת ×¢× ×©× ×”×ž×©×ª×ž×© והסיסמה שלכ×.',
+'noname' => '×œ× ×”×–× ×ª× ×©× ×ž×©×ª×ž×© חוקי',
+'loginsuccesstitle' => 'הכניסה הושלמה בהצלחה',
+'loginsuccess' => '\'\'\'× ×›× ×¡×ª× ×œ{{grammar:תחילית|{{SITENAME}}}} ×‘×©× "$1".\'\'\'',
+'nosuchuser' => '×ין משתמש ×‘×©× "$1".
×× × ×•×“×ו שה×יות נכון, ×ו השתמשו בטופס שלהלן ליצירת חשבון משתמש חדש.',
-"nosuchusershort" => '×ין משתמש ×‘×©× "$1". ×× × ×•×“×ו שה×יות נכון.',
-"nouserspecified" => "×¢×œ×™×›× ×œ×¦×™×™×Ÿ ×©× ×ž×©×ª×ž×©.",
-"wrongpassword" => "הסיסמה ×©×”×§×œ×“×ª× ×©×’×•×™×”, ×× × × ×¡×• שנית.",
-"wrongpasswordempty" => "הסיסמה ×©×”×§×œ×“×ª× ×¨×™×§×”. ×× × × ×¡×• שנית.",
-"mailmypassword" => "שלחו לי סיסמה חדשה",
-"passwordremindertitle" => "תזכורת סיסמה מ{{grammar:תחילית|{{SITENAME}}}}",
-"passwordremindertext" => 'מישהו (ככל הנר××” ×ת×, מכתובת ×”Ö¾IP מספר $1) ביקש שנשלח ×œ×›× ×¡×™×¡×ž×” חדשה לכניסה לחשבון ב{{grammar:תחילית|{{SITENAME}}}} ($4). הסיסמה עבור המשתמש "$2" ×”×™× ×¢×ª×” "$3". ×¢×œ×™×›× ×œ×”×™×›× ×¡ ל×תר ולשנות ×ת ×¡×™×¡×ž×ª×›× ×‘×”×§×“× ×”×פשרי. ×× ×ž×™×©×”×• ×חר ביקש סיסמה חדשה זו ×ו ×× × ×–×›×¨×ª× ×‘×¡×™×¡×ž×ª×›× ×•××™× ×›× ×¨×•×¦×™× ×¢×•×“ לשנות ×ותה, ב××¤×©×¨×•×ª×›× ×œ×”×ª×¢×œ× ×ž×”×•×“×¢×” זו ולהמשיך להשתמש ×‘×¡×™×¡×ž×ª×›× ×”×™×©× ×”.',
-"noemail" => '×œ× ×¨×©×•×ž×” כתובת דו×ר ×לקטרוני עבור משתמש "$1".',
-"passwordsent" => 'סיסמה חדשה נשלחה לכתובת הדו×ר ×”×לקטרוני הרשומה עבור "$1".
+'nosuchusershort' => '×ין משתמש ×‘×©× "$1". ×× × ×•×“×ו שה×יות נכון.',
+'nouserspecified' => '×¢×œ×™×›× ×œ×¦×™×™×Ÿ ×©× ×ž×©×ª×ž×©.',
+'wrongpassword' => 'הסיסמה ×©×”×§×œ×“×ª× ×©×’×•×™×”, ×× × × ×¡×• שנית.',
+'wrongpasswordempty' => 'הסיסמה ×©×”×§×œ×“×ª× ×¨×™×§×”. ×× × × ×¡×• שנית.',
+'mailmypassword' => 'שלחו לי סיסמה חדשה',
+'passwordremindertitle' => 'תזכורת סיסמה מ{{grammar:תחילית|{{SITENAME}}}}',
+'passwordremindertext' => 'מישהו (ככל הנר××” ×ת×, מכתובת ×”Ö¾IP מספר $1) ביקש שנשלח ×œ×›× ×¡×™×¡×ž×” חדשה לכניסה לחשבון ב{{grammar:תחילית|{{SITENAME}}}} ($4). הסיסמה עבור המשתמש "$2" ×”×™× ×¢×ª×” "$3". ×¢×œ×™×›× ×œ×”×™×›× ×¡ ל×תר ולשנות ×ת ×¡×™×¡×ž×ª×›× ×‘×”×§×“× ×”×פשרי. ×× ×ž×™×©×”×• ×חר ביקש סיסמה חדשה זו ×ו ×× × ×–×›×¨×ª× ×‘×¡×™×¡×ž×ª×›× ×•××™× ×›× ×¨×•×¦×™× ×¢×•×“ לשנות ×ותה, ב××¤×©×¨×•×ª×›× ×œ×”×ª×¢×œ× ×ž×”×•×“×¢×” זו ולהמשיך להשתמש ×‘×¡×™×¡×ž×ª×›× ×”×™×©× ×”.',
+'noemail' => '×œ× ×¨×©×•×ž×” כתובת דו×ר ×לקטרוני עבור משתמש "$1".',
+'passwordsent' => 'סיסמה חדשה נשלחה לכתובת הדו×ר ×”×לקטרוני הרשומה עבור "$1".
×× × ×”×›× ×¡×• חזרה ל×תר ×חרי שתקבלו ×ותה.',
-"eauthentsent" => 'דו×"ל ×ישור נשלח לכתובת הדו×"ל שקבעת.
-
-לפני שדברי דו×"ל ××—×¨×™× × ×©×œ×—×™× ×œ×—×©×‘×•×Ÿ ×”×–×”, תצטרך לפעול לפי ההור×ות בדו×"ל כדי ×œ×•×•×“× ×©×”×“×•×"ל ×”×•× ×כן שלך.',
-"mailerror" => "שגי××” בשליחת דו×ר: $1",
-"acct_creation_throttle_hit" => "מצטערי×, יצרת כבר $1 חשבונות. ×ינך יכול ליצור חשבונות נוספי×.",
-"emailauthenticated" => 'כתובת הדו×"ל שלך ×ושרה על־ידי $1.',
-"emailnotauthenticated" => 'כתובת הדו×"ל שלך עדיין ×œ× ×ושרה. ××£ דו×"ל ×œ× ×™×™×©×œ×— מ××£ ×חת מהתכונות הב×ות.',
-"noemailprefs" => '×× × ×¦×™×™× ×• כתובת דו×"ל כדי שתכונות ×לה יעבדו.',
-"emailconfirmlink" => '×שר ×ת כתובת הדו×"ל שלך',
-"invalidemailaddress" => 'כתובת הדו×"ל ××™× ×” מתקבלת כיוון שנר××” ×©×”×™× ×‘×¤×•×¨×ž×˜ ×œ× × ×›×•×Ÿ. ×× × ×”×›× ×¡ כתובת נכונה ×ו ותר על השדה ×”×–×”.',
-"accountcreated" => "החשבון נוצר",
-"accountcreatedtext" => "חשבון המשתמש $1 נוצר.",
-
-# Edit page buttons
-"bold_sample" => "טקסט מודגש",
-"bold_tip" => "טקסט מודגש",
-"italic_sample" => "טקסט נטוי",
-"italic_tip" => "טקסט נטוי (×œ× ×ž×•×ž×œ×¥ בעברית",
-"link_sample" => "קישור",
-"link_tip" => "קישור פנימי",
-"extlink_sample" => "http://www.example.com כותרת הקישור לתצוגה",
-"extlink_tip" => "קישור חיצוני (כולל קידומת http מל××”",
-"headline_sample" => "כותרת",
-"headline_tip" => "כותרת – דרגה 2",
-"math_sample" => "formula",
-"math_tip" => "נוסחה מתמטית (LaTeX)",
-"nowiki_sample" => "טקסט ×œ× ×ž×¢×•×¦×‘",
-"nowiki_tip" => "טקסט ×œ× ×ž×¢×•×¦×‘ (×”×ª×¢×œ× ×ž×¡×™×ž× ×™ ויקי)",
-"image_sample" => "PictureFileName.jpg|left|thumb|250px|כיתוב תמונה",
-"image_tip" => "תמונה (שכבר הועלתה לשרת)",
-"media_sample" => "Example.ogg",
-"media_tip" => "קישור לקובץ מדיה",
-"sig_tip" => "חתימה + שעה",
-"hr_tip" => "קו ×ופקי (השתדלו להמנע משימוש בקו)",
+'blocked-mailpassword' => 'כתובת ×”Ö¾IP ×©×œ×›× ×—×¡×•×ž×” מעריכה, ולפיכך ××™× ×›× ×ž×•×¨×©×™× ×œ×”×©×ª×ž×© ב×פשרות שיחזור הסיסמה כדי למנוע ניצול לרעה של התכונה.',
+'eauthentsent' => 'דו×"ל ×ישור נשלח לכתובת הדו×"ל שקבעת. לפני שדברי דו×"ל ××—×¨×™× × ×©×œ×—×™× ×œ×—×©×‘×•×Ÿ ×”×–×”, תצטרך לפעול לפי ההור×ות בדו×"ל כדי ×œ×•×•×“× ×©×”×“×•×"ל ×”×•× ×כן שלך.',
+'throttled-mailpassword' => 'כבר נעשה שימוש ב×פשרות שיחזור הסיסמה ב־$1 השעות ×”×חרונות. כדי למנוע ניצול לרעה, רק דו×ר ×חד ×›×–×” יכול להישלח כל $1 שעות.',
+'mailerror' => 'שגי××” בשליחת דו×ר: $1',
+'acct_creation_throttle_hit' => 'מצטערי×, יצרת כבר $1 חשבונות. ×ינך יכול ליצור חשבונות נוספי×.',
+'emailauthenticated' => 'כתובת הדו×"ל שלך ×ושרה על־ידי $1.',
+'emailnotauthenticated' => 'כתובת הדו×"ל שלך עדיין ×œ× ×ושרה. ××£ דו×"ל ×œ× ×™×™×©×œ×— מ××£ ×חת מהתכונות הב×ות.',
+'noemailprefs' => '×× × ×¦×™×™× ×• כתובת דו×"ל כדי שתכונות ×לה יעבדו.',
+'emailconfirmlink' => '×שר ×ת כתובת הדו×"ל שלך',
+'invalidemailaddress' => 'כתובת הדו×"ל ××™× ×” מתקבלת כיוון שנר××” ×©×”×™× ×‘×¤×•×¨×ž×˜ ×œ× × ×›×•×Ÿ. ×× × ×”×›× ×¡ כתובת נכונה ×ו ותר על השדה ×”×–×”.',
+'accountcreated' => 'החשבון נוצר',
+'accountcreatedtext' => 'חשבון המשתמש $1 נוצר.',
+
+# Password reset dialog
+'resetpass' => '×יפוס סיסמת החשבון',
+'resetpass_announce' => '× ×›× ×¡×ª× ×‘×מצעות סיסמה זמנית שנשלחה ××œ×™×›× ×‘×“×•×"ל. כדי ×œ×¡×™×™× ×ת הכניסה, ×¢×œ×™×›× ×œ×§×‘×•×¢ ×›×ן סיסמה חדשה:',
+'resetpass_text' => '<!-- הוסיפו טקסט ×›×ן -->',
+'resetpass_header' => '×יפוס הסיסמה',
+'resetpass_submit' => 'הגדרת הסיסמה וכניסה',
+'resetpass_success' => '×¡×™×¡×ž×ª×›× ×©×•× ×ª×” בהצלחה! מכניס ××ª×›× ×œ×ž×¢×¨×›×ªâ€¦',
+'resetpass_bad_temporary' => 'סיסמה זמנית שגויה. ייתכן שכבר ×©×™× ×™×ª× ×‘×”×¦×œ×—×” ×ת סיסמתכ×; ×× ×œ×, ×× × ×‘×§×©×• סיסמה זמנית חדשה.',
+'resetpass_forbidden' => '×œ× × ×™×ª×Ÿ לשנות סיסמ×ות ב×תר ×–×”.',
+'resetpass_missing' => 'חסר מידע בטופס.',
+
+# Edit page toolbar
+'bold_sample' => 'טקסט מודגש',
+'bold_tip' => 'טקסט מודגש',
+'italic_sample' => 'טקסט נטוי',
+'italic_tip' => 'טקסט נטוי (×œ× ×ž×•×ž×œ×¥ בעברית)',
+'link_sample' => 'קישור',
+'link_tip' => 'קישור פנימי',
+'extlink_sample' => 'http://www.example.com כותרת הקישור לתצוגה',
+'extlink_tip' => 'קישור חיצוני (כולל קידומת http מל××”',
+'headline_sample' => 'כותרת',
+'headline_tip' => 'כותרת – דרגה 2',
+'math_sample' => 'formula',
+'math_tip' => 'נוסחה מתמטית (LaTeX)',
+'nowiki_sample' => 'טקסט ×œ× ×ž×¢×•×¦×‘',
+'nowiki_tip' => 'טקסט ×œ× ×ž×¢×•×¦×‘ (×”×ª×¢×œ× ×ž×¡×™×ž× ×™ ויקי)',
+'image_sample' => 'PictureFileName.jpg|left|thumb|250px|כיתוב תמונה',
+'image_tip' => 'תמונה (שכבר הועלתה לשרת)',
+'media_sample' => 'Example.ogg',
+'media_tip' => 'קישור לקובץ מדיה',
+'sig_tip' => 'חתימה + שעה',
+'hr_tip' => 'קו ×ופקי (השתדלו להמנע משימוש בקו)',
# Edit pages
-"summary" => "תקציר",
-"subject" => "נוש×/כותרת",
-"minoredit" => "זהו שינוי משני",
-"watchthis" => "עקוב ×חרי דף ×–×”",
-"savearticle" => "שמור דף",
-"preview" => "תצוגה מקדימה",
-"showpreview" => "הר××” תצוגה מקדימה",
-"showlivepreview" => "תצוגה מקדימה חיה",
-"showdiff" => "הצג שינויי×",
-"anoneditwarning" => "'''×זהרה:''' ××™× ×›× ×ž×—×•×‘×¨×™× ×œ×—×©×‘×•×Ÿ. כתובת ×”Ö¾IP ×©×œ×›× ×ª×™×¨×©× ×‘×”×™×¡×˜×•×¨×™×™×ª העריכות של הדף. ×× ×œ×“×¢×ª×›× ×–×•×”×™ פגיעה בפרטיותכ×, ×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]].",
-"missingsummary" => '\'\'\'תזכורת:\'\'\' ×œ× ×”×–× ×ª× ×ª×§×¦×™×¨ עריכה. ×× ×ª×œ×—×¦×• שוב על "שמור דף", ×¢×¨×™×›×ª×›× ×ª×™×©×ž×¨ בלעדיו.',
-"missingcommenttext" => "×× × ×”×§×œ×™×“×• ×ת ההערה למטה.",
-"blockedtitle" => "המשתמש חסו×",
-"blockedtext" => '<big>\'\'\'×©× ×”×ž×©×ª×ž×© ×ו כתובת ×”Ö¾IP ×©×œ×›× × ×—×¡×ž×•.\'\'\'</big>
+'summary' => 'תקציר',
+'subject' => 'נוש×/כותרת',
+'minoredit' => 'זהו שינוי משני',
+'watchthis' => 'מעקב ×חרי דף ×–×”',
+'savearticle' => 'שמור דף',
+'preview' => 'תצוגה מקדימה',
+'showpreview' => 'תצוגה מקדימה',
+'showlivepreview' => 'תצוגה מקדימה חיה',
+'showdiff' => 'הצג שינויי×',
+'anoneditwarning' => "'''×זהרה:''' ××™× ×›× ×ž×—×•×‘×¨×™× ×œ×—×©×‘×•×Ÿ. כתובת ×”Ö¾IP ×©×œ×›× ×ª×™×¨×©× ×‘×”×™×¡×˜×•×¨×™×™×ª העריכות של הדף. ×× ×œ×“×¢×ª×›× ×–×•×”×™ פגיעה בפרטיותכ×, ×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]].",
+'missingsummary' => '\'\'\'תזכורת:\'\'\' ×œ× ×”×–× ×ª× ×ª×§×¦×™×¨ עריכה. ×× ×ª×œ×—×¦×• שוב על "שמור דף", ×¢×¨×™×›×ª×›× ×ª×™×©×ž×¨ בלעדיו.',
+'missingcommenttext' => '×× × ×”×§×œ×™×“×• ×ת ההערה למטה.',
+'missingcommentheader' => '\'\'\'תזכורת:\'\'\' ×œ× ×”×–× ×ª× × ×•×©×/כותרת להערה זו. ×× ×ª×œ×—×¦×• שוב על "שמור דף", ×¢×¨×™×›×ª×›× ×ª×™×©×ž×¨ בלעדיו.',
+'summary-preview' => 'תצוגה מקדימה של התקציר',
+'subject-preview' => 'תצוגה מקדימה של הנוש×/הכותרת',
+'blockedtitle' => 'המשתמש חסו×',
+'blockedtext' => '<big>\'\'\'×©× ×”×ž×©×ª×ž×© ×ו כתובת ×”Ö¾IP ×©×œ×›× × ×—×¡×ž×•.\'\'\'</big>
החסימה בוצעה על־ידי $1. הסיבה שניתנה לכך ×”×™× \'\'\'$2\'\'\'.
ב××¤×©×¨×•×ª×›× ×œ×™×¦×•×¨ קשר ×¢× $1 ×ו ×¢× ×›×œ ×חד מ[[{{ns:project}}:מפעיל מערכת|מפעילי המערכת]] ×”××—×¨×™× ×›×“×™ לדון על החסימה.
××™× ×›× ×™×›×•×œ×™× ×œ×”×©×ª×ž×© בתכונת "שלחו דו×ר ×לקטרוני למשתמש ×–×”" ×× ×œ× ×¦×™×™× ×ª× ×›×ª×•×‘×ª דו×"ל תקפה ב[[{{ns:special}}:Preferences|העדפות המשתמש שלכ×]].
-כתובת ×”Ö¾IP ×©×œ×›× ×”×™× $3. ×× × ×¦×™×™× ×• עובדה זו בכל פנייה למפעילי המערכת.',
-"blockedoriginalsource" => "טקסט המקור של '''$1''' מוצג למטה:",
-"blockededitsource" => "הטקסט של '''העריכות שלך''' לדף '''$1''' מוצג למטה:",
-"whitelistedittitle" => "כניסה לחשבון נדרשת לעריכה",
-"whitelistedittext" => "×¢×œ×™×›× $1 כדי לערוך דפי×.",
-"whitelistreadtitle" => "כניסה לחשבון נדרשת לקרי××”",
-"whitelistreadtext" => "×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]] כדי ×œ×§×¨×•× ×“×¤×™×.",
-"whitelistacctitle" => "××™× ×›× ×ž×•×¨×©×™× ×œ×™×¦×•×¨ חשבון",
-"whitelistacctext" => "×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]] שיש לו ×ת ההרש××” ליצור חשבונות כדי ליצור חשבון.",
-"confirmedittitle" => '×”× ×›× ×—×™×™×‘×™× ×œ×מת ×ת כתובת הדו×"ל ×©×œ×›× ×›×“×™ לערוך',
-"confirmedittext" => '×¢×œ×™×›× ×œ×מת ×ת כתובת הדו×"ל ×©×œ×›× ×œ×¤× ×™ שתוכלו לערוך דפי×. ×× × ×”×’×“×™×¨×• ו×מתו ×ת כתובת הדו×"ל ×©×œ×›× ×‘×מצעות [[{{ns:special}}:Preferences|העדפות המשתמש]] לשכ×.',
-"loginreqtitle" => "כניסה לחשבון נדרשת",
-"loginreqlink" => "להיכנס לחשבון",
-"loginreqpagetext" => "×¢×œ×™×›× $1 כדי לצפות ×‘×“×¤×™× ×חרי×.",
-"accmailtitle" => "הסיסמה נשלחה",
-"accmailtext" => 'הסיסמה עבור "$1" נשלחה ×ל $2.',
-"newarticle" => "(חדש)",
-"newarticletext" => '×”×’×¢×ª× ×œ×“×£ שעדיין ×יננו קיי×. כדי ליצור דף חדש, כתבו ×ת התוכן ×©×œ×›× ×‘×ª×™×‘×ª הטקסט למטה.
-
-×× ×”×’×¢×ª× ×œ×›×ן בטעות, פשוט לחצו על מקש ×”Ö¾\'\'\'Back\'\'\' בדפדפן שלכ×.',
-"anontalkpagetext" => "----
+כתובת ×”Ö¾IP ×©×œ×›× ×”×™× $3, ומספר החסימה ×©×œ×›× ×”×•× #$5. ×× × ×¦×™×™× ×• ×חת מעובדות ×לה (×ו ×ת שתיהן) בכל פנייה למפעילי המערכת.',
+'blockedoriginalsource' => "טקסט המקור של '''$1''' מוצג למטה:",
+'blockededitsource' => "הטקסט של '''העריכות שלך''' לדף '''$1''' מוצג למטה:",
+'whitelistedittitle' => 'כניסה לחשבון נדרשת לעריכה',
+'whitelistedittext' => '×¢×œ×™×›× $1 כדי לערוך דפי×.',
+'whitelistreadtitle' => 'כניסה לחשבון נדרשת לקרי××”',
+'whitelistreadtext' => '×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]] כדי ×œ×§×¨×•× ×“×¤×™×.',
+'whitelistacctitle' => '××™× ×›× ×ž×•×¨×©×™× ×œ×™×¦×•×¨ חשבון',
+'whitelistacctext' => '×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]] שיש לו ×ת ההרש××” ליצור חשבונות כדי ליצור חשבון.',
+'confirmedittitle' => '×”× ×›× ×—×™×™×‘×™× ×œ×מת ×ת כתובת הדו×"ל ×©×œ×›× ×›×“×™ לערוך',
+'confirmedittext' => '×¢×œ×™×›× ×œ×מת ×ת כתובת הדו×"ל ×©×œ×›× ×œ×¤× ×™ שתוכלו לערוך דפי×. ×× × ×”×’×“×™×¨×• ו×מתו ×ת כתובת הדו×"ל ×©×œ×›× ×‘×מצעות [[{{ns:special}}:Preferences|העדפות המשתמש]] לשכ×.',
+'loginreqtitle' => 'כניסה לחשבון נדרשת',
+'loginreqlink' => 'להיכנס לחשבון',
+'loginreqpagetext' => '×¢×œ×™×›× $1 כדי לצפות ×‘×“×¤×™× ×חרי×.',
+'accmailtitle' => 'הסיסמה נשלחה',
+'accmailtext' => 'הסיסמה עבור "$1" נשלחה ×ל $2.',
+'newarticle' => '(חדש)',
+'newarticletext' => "×”×’×¢×ª× ×œ×“×£ שעדיין ×יננו קיי×. כדי ליצור דף חדש, כתבו ×ת התוכן ×©×œ×›× ×‘×ª×™×‘×ª הטקסט למטה.
+
+×× ×”×’×¢×ª× ×œ×›×ן בטעות, פשוט לחצו על מקש ×”Ö¾'''Back''' בדפדפן שלכ×.",
+'anontalkpagetext' => "----
'''זהו דף שיחה של משתמש ×נונימי שעדיין ×œ× ×™×¦×¨ חשבון במערכת, ×ו ×©×”×•× ×œ× ×ž×©×ª×ž×© בו. כיוון שכך, ×נו ×¦×¨×™×›×™× ×œ×”×©×ª×ž×© בכתובת ×”Ö¾IP כדי לזהותו. ייתכן שכתובת IP זו תייצג מספר משתמשי×. ×× ××ª× ×ž×©×ª×ž×©×™× ×× ×•× ×™×ž×™×™× ×•×ž×¨×’×™×©×™× ×©×§×™×‘×œ×ª× ×”×•×“×¢×•×ª בלתי רלוונטיות, ×× × [[{{ns:special}}:Userlogin|צרו חשבון ×ו הכנסו]] כדי להימנע מבלבול עתידי ×¢× ×ž×©×ª×ž×©×™× ×× ×•× ×™×ž×™×™× × ×•×¡×¤×™×.'''
----",
-"noarticletext" => "×ין עדיין טקסט בדף ×–×”. ב××¤×©×¨×•×ª×›× [[{{ns:special}}:Search/{{PAGENAME}}|לחפש ×ת {{PAGENAME}} ב×תר]], ×ו [{{fullurl:{{FULLPAGENAME}}|action=edit}} ליצור דף ×–×”].",
-"clearyourcache" => "'''הערה:''' ל×חר השמירה, ×¢×œ×™×›× ×œ× ×§×•×ª ×ת זכרון המטמון (Cache) של הדפדפן על־מנת להבחין בשינויי×.
+'noarticletext' => '×ין עדיין טקסט בדף ×–×”. ב××¤×©×¨×•×ª×›× [[{{ns:special}}:Search/{{PAGENAME}}|לחפש ×ת {{PAGENAME}} ב×תר]], ×ו [{{fullurl:{{FULLPAGENAME}}|action=edit}} ליצור דף ×–×”].',
+'clearyourcache' => "'''הערה:''' ל×חר השמירה, ×¢×œ×™×›× ×œ× ×§×•×ª ×ת זכרון המטמון (Cache) של הדפדפן על־מנת להבחין בשינויי×.
* ב'''מוזילה''', '''פיירפוקס''' ×ו '''ספ×רי''', לחצו על מקש ×”Ö¾Shift בעת ×œ×—×™×¦×ª×›× ×¢×œ '''העלה מחדש''' (Reload), ×ו הקישו Ctrl+Shift+R (×ו Cmd+Shift+R במקינטוש של ×פל).
* ב'''×ינטרנט ×קספלורר''', לחצו על מקש ×”Ö¾Ctrl בעת ×œ×—×™×¦×ª×›× ×¢×œ '''רענן''' (Refresh), ×ו הקישו על Ctrl+F5.
* ב־'''Konqueror''', פשוט לחצו על '''העלה מחדש''' (Reload), ×ו הקישו על F5.
* ב'''×ופרה''', ייתכן שתצטרכו להשתמש ב'''כלי×''' (Tools) > '''העדפות''' (Preferences) כדי לנקות לחלוטין ×ת זכרון המטמון.",
-"usercssjsyoucanpreview" => '\'\'\'עצה:\'\'\' השתמשו בלחצן "הר××” תצוגה מקדימה" כדי לבחון ×ת גליון ×”Ö¾CSS ×ו ×ת סקריפט ×”Ö¾JavaScript החדש ×©×œ×›× ×œ×¤× ×™ השמירה.',
-"usercsspreview" => "'''זכרו שזו רק תצוגה מקדימה של גליון ×”Ö¾CSS שלכ×, ×•×©×”×•× ×˜×¨× × ×©×ž×¨!'''",
-"userjspreview" => "'''זכרו שזו רק תצוגה מקדימה של סקריפט ×”Ö¾JavaScript שלכ×, ×•×©×”×•× ×˜×¨× × ×©×ž×¨!'''",
-"userinvalidcssjstitle" => '\'\'\'×זהרה\'\'\': הרקע "$1" ×ינו קיי×. זכרו שדפי CSS ו־JavaScript מות××ž×™× ×ישית ×ž×©×ª×ž×©×™× ×‘×›×•×ª×¨×ª ×¢× ×ותיות קטנות – למשל, {{ns:user}}:דוגמה/monobook.css ×•×œ× {{ns:user}}:דוגמה/Monobook.css. כמו כן, יש להקפיד על שימוש ב־/ ×•×œ× ×‘Ö¾\.',
-"updated" => "(מעודכן)",
-"note" => "'''הערה:'''",
-"previewnote" => "זכרו שזו רק תצוגה מקדימה, והדף עדיין ×œ× × ×©×ž×¨!",
-"session_fail_preview" => "'''מצטערי×! ×œ× × ×™×ª×Ÿ לבצע ×ת ×¢×¨×™×›×ª×›× ×¢×§×‘ ×ובדן קשר ×¢× ×”×©×¨×ª. ×× × × ×¡×• שנית. ×× ×–×” ×œ× ×¢×•×–×¨, ×× × ×¦×ו מהחשבון ונסו שנית.",
-"previewconflict" => "תצוגה מקדימה זו מציגה כיצד ייר××” הטקסט בחלון העריכה העליון, ×× ×ª×‘×—×¨×• לשמור ×ותו.",
-"session_fail_preview_html" => "'''מצטערי×! ×œ× × ×™×ª×Ÿ לבצע ×ת ×¢×¨×™×›×ª× ×¢×§×‘ ×ובדן קשר ×¢× ×”×©×¨×ª.'''
+'usercssjsyoucanpreview' => '\'\'\'עצה:\'\'\' השתמשו בלחצן "תצוגה מקדימה" כדי לבחון ×ת גליון ×”Ö¾CSS ×ו ×ת סקריפט ×”Ö¾JavaScript החדש ×©×œ×›× ×œ×¤× ×™ השמירה.',
+'usercsspreview' => "'''זכרו שזו רק תצוגה מקדימה של גליון ×”Ö¾CSS שלכ×, ×•×©×”×•× ×˜×¨× × ×©×ž×¨!'''",
+'userjspreview' => "'''זכרו שזו רק תצוגה מקדימה של סקריפט ×”Ö¾JavaScript שלכ×, ×•×©×”×•× ×˜×¨× × ×©×ž×¨!'''",
+'userinvalidcssjstitle' => '\'\'\'×זהרה\'\'\': הרקע "$1" ×ינו קיי×. זכרו שדפי CSS ו־JavaScript מות××ž×™× ×ישית ×ž×©×ª×ž×©×™× ×‘×›×•×ª×¨×ª ×¢× ×ותיות קטנות – למשל, {{ns:user}}:דוגמה/monobook.css ×•×œ× {{ns:user}}:דוגמה/Monobook.css. כמו כן, יש להקפיד על שימוש ב־/ ×•×œ× ×‘Ö¾\.',
+'updated' => '(מעודכן)',
+'note' => "'''הערה:'''",
+'previewnote' => 'זכרו שזו רק תצוגה מקדימה, והדף עדיין ×œ× × ×©×ž×¨!',
+'previewconflict' => 'תצוגה מקדימה זו מציגה כיצד ייר××” הטקסט בחלון העריכה העליון, ×× ×ª×‘×—×¨×• לשמור ×ותו.',
+'session_fail_preview' => "'''מצטערי×! ×œ× × ×™×ª×Ÿ לבצע ×ת ×¢×¨×™×›×ª×›× ×¢×§×‘ ×ובדן קשר ×¢× ×”×©×¨×ª. ×× × × ×¡×• שנית. ×× ×–×” ×œ× ×¢×•×–×¨, ×× × ×¦×ו מהחשבון ונסו שנית.",
+'session_fail_preview_html' => "'''מצטערי×! ×œ× × ×™×ª×Ÿ לבצע ×ת ×¢×¨×™×›×ª× ×¢×§×‘ ×ובדן קשר ×¢× ×”×©×¨×ª.'''
כיוון שב×תר ×–×” ×פשרות השימוש ב־HTML מ×ופשרת, התצוגה המקדימה מוסתרת כדי למנוע התקפות JavaScript.
'''×× ×–×”×• ניסיון עריכה לגיטימי, ×× × × ×¡×• שנית. ×× ×–×” ×œ× ×¢×•×–×¨, נסו לצ×ת מהחשבון ולהיכנס ×ליו שנית.'''",
-"importing" => "×ž×™×™×‘× ×ת $1",
-"editing" => "עורך ×ת $1",
-"editinguser" => "עורך ×ת המשתמש <b>$1</b>",
-"editingsection" => "עורך ×ת $1 (פסקה)",
-"editingcomment" => "עורך ×ת $1 (הערה)",
-"editconflict" => "התנגשות עריכה: $1",
-"explainconflict" => "משתמש ×חר שינה ×ת הדף מ××– ×©×”×ª×—×œ×ª× ×œ×¢×¨×•×š ×ותו.
+'importing' => '×ž×™×™×‘× ×ת $1',
+'editing' => 'עורך ×ת $1',
+'editinguser' => 'עורך ×ת המשתמש <b>$1</b>',
+'editingsection' => 'עורך ×ת $1 (פסקה)',
+'editingcomment' => 'עורך ×ת $1 (הערה)',
+'editconflict' => 'התנגשות עריכה: $1',
+'explainconflict' => "משתמש ×חר שינה ×ת הדף מ××– ×©×”×ª×—×œ×ª× ×œ×¢×¨×•×š ×ותו.
חלון העריכה העליון מכיל ×ת הטקסט בדף כפי ×©×”×•× ×¢×ª×”.
@@ -693,523 +711,560 @@ $messages = array(
×¢×œ×™×›× ×œ×ž×–×’ ×ת ×”×©×™× ×•×™×™× ×©×œ×›× ×œ×ª×•×š הטקסט הקיי×.
'''רק''' הטקסט בחלון העריכה העליון ישמר כשתשמרו ×ת הדף.",
-"yourtext" => "הטקסט שלך",
-"storedversion" => "גרסה שמורה",
-"nonunicodebrowser" => "'''×זהרה: הדפדפן שלך ×ינו תו×× ×œ×ª×§×Ÿ יוניקוד. בשל כך הוכנס לפעולה מעקף של הב××’, כדי ל×פשר לך לערוך ×“×¤×™× ×‘×‘×˜×—×”: ×ª×•×•×™× ×©××™× × ×‘Ö¾ASCII יוצגו בתיבת העריכה ×›×§×•×“×™× ×”×§×¡×“×¦×™×ž×œ×™×™×.",
-"editingold" => "'''זהירות: ××ª× ×¢×•×¨×›×™× ×’×¨×¡×” ×œ× ×¢×“×›× ×™×ª של דף ×–×”.
+'yourtext' => 'הטקסט שלך',
+'storedversion' => 'גרסה שמורה',
+'nonunicodebrowser' => "'''×זהרה: הדפדפן שלך ×ינו תו×× ×œ×ª×§×Ÿ יוניקוד. בשל כך הוכנס לפעולה מעקף של הב××’, כדי ל×פשר לך לערוך ×“×¤×™× ×‘×‘×˜×—×”: ×ª×•×•×™× ×©××™× × ×‘Ö¾ASCII יוצגו בתיבת העריכה ×›×§×•×“×™× ×”×§×¡×“×¦×™×ž×œ×™×™×.",
+'editingold' => "'''זהירות: ××ª× ×¢×•×¨×›×™× ×’×¨×¡×” ×œ× ×¢×“×›× ×™×ª של דף ×–×”.
×× ×ª×©×ž×¨×• ×ת הדף, כל ×”×©×™× ×•×™×™× ×©× ×¢×©×• מ××– גרסה זו ×™×בדו.'''",
-"yourdiff" => "הבדלי×",
-"copyrightwarning" => '<div id="editing-warn">\'\'\'שימו לב:\'\'\' ×ª×¨×•×ž×ª×›× ×œ{{grammar:תחילית|{{SITENAME}}}} ×ª×¤×•×¨×¡× ×ª×—×ª תנ××™ הרישיון $2 (ר×ו $1 ×œ×¤×¨×˜×™× × ×•×¡×¤×™×). ×× ××™× ×›× ×¨×•×¦×™× ×©×¢×‘×•×“×ª×›× ×ª×”×™×” זמינה לעריכה על־ידי ×חרי×, שתופץ לעיני כל, וש××—×¨×™× ×™×•×›×œ×• להעתיק ממנה בציון המקור – ×ל תפרסמו ×ותה פה. כמו־כן, ××ª× ×ž×‘×˜×™×—×™× ×œ× ×• ×›×™ ×›×ª×‘×ª× ×ת הטקסט ×”×–×” בעצמכ×, ×ו ×”×¢×ª×§×ª× ×ותו ממקור ש×ינו מוגן על־ידי זכויות יוצרי×. \'\'\'×ל תעשו שימוש בחומר המוגן בזכויות ×™×•×¦×¨×™× ×œ×œ× ×¨×©×•×ª!\'\'\'</div>',
-"copyrightwarning2" => '<div id="editing-warn">\'\'\'שימו לב:\'\'\' ×ª×•×¨×ž×™× ××—×¨×™× ×¢×©×•×™×™× ×œ×¢×¨×•×š ×ו ××£ להסיר ×ת ×ª×¨×•×ž×ª×›× ×œ{{grammar:תחילית|{{SITENAME}}}}. ×× ××™× ×›× ×¨×•×¦×™× ×©×¢×‘×•×“×ª×›× ×ª×”×™×” זמינה לעריכה על־ידי ××—×¨×™× â€“ ×ל תפרסמו ×ותה פה. כמו־כן, ××ª× ×ž×‘×˜×™×—×™× ×œ× ×• ×›×™ ×›×ª×‘×ª× ×ת הטקסט ×”×–×” בעצמכ×, ×ו ×”×¢×ª×§×ª× ×ותו ממקור ש×ינו מוגן על־ידי זכויות ×™×•×¦×¨×™× (ר×ו $1 ×œ×¤×¨×˜×™× × ×•×¡×¤×™×). \'\'\'×ל תעשו שימוש בחומר המוגן בזכויות ×™×•×¦×¨×™× ×œ×œ× ×¨×©×•×ª!\'\'\'</div>',
-"longpagewarning" => "'''×זהרה: גודל דף ×–×” ×”×•× $1 קילובייטי×. ×‘×“×¤×“×¤× ×™× ×ž×¡×•×™×ž×™× ×™×”×™×• בעיות בעריכת דף הגדול מ־32 קילובייטי×. ×× × ×©×™×§×œ×• לחלק דף ×–×” ×œ×“×¤×™× ×§×˜× ×™× ×™×•×ª×¨. ×× ×–×”×• דף שיחה, שיקלו ל×רכב ×ותו.'''",
-"longpageerror" => "'''שגי××”: הטקסט ×©×©×œ×—×ª× ×”×•× ×‘×ורך $1 קילובייטי×, ×ך ×סור לו להיות ×רוך יותר ×ž×”×ž×§×¡×™×ž×•× ×©×œ $2 קילובייטי×. ×œ× × ×™×ª×Ÿ לשומרו.'''",
-"readonlywarning" => "'''×זהרה: בסיס ×”× ×ª×•× ×™× × × ×¢×œ לצורך תחזוקה. בזמן ×–×” ××™ ×פשר לשמור ×ת הטקסט הערוך. בינתיי×, עד ×¡×™×•× ×”×ª×—×–×•×§×”, ××ª× ×™×›×•×œ×™× ×œ×”×©×ª×ž×© בעורך חיצוני. ×נו ×ž×ª× ×¦×œ×™× ×¢×œ התקלה.'''",
-"protectedpagewarning" => "'''×זהרה: דף ×–×” ×”×•× ×“×£ מוגן וניתן לעריכה על־ידי מפעילי מערכת בלבד. ×× × ×•×“×ו ש××ª× ×¤×•×¢×œ×™× ×¢×œÖ¾×¤×™ העקרונות לעריכת ×“×¤×™× ×לו.'''",
-"semiprotectedpagewarning" => "'''הערה:''' דף ×–×” ננעל כך שרק ×ž×©×ª×ž×©×™× ×¨×©×•×ž×™× ×™×›×•×œ×™× ×œ×¢×¨×•×š ×ותו.",
-"templatesused" => "תבניות המופיעות בדף זה:",
-"edittools" => "<!-- הטקסט הנכתב ×›×ן יוצג מתחת לטפסי עריכת ×“×¤×™× ×•×”×¢×œ×ת קבצי×, ולפיכך ניתן לכתוב להציג בו ×ª×•×•×™× ×§×©×™× ×œ×›×ª×™×‘×”, ×§×˜×¢×™× ×ž×•×›× ×™× ×©×œ טקסט ועוד. -->",
-"nocreatetitle" => "יצירת ×”×“×¤×™× ×”×•×’×‘×œ×”",
-"nocreatetext" => "×תר ×–×” מגביל ×ת ×”×פשרות ליצור ×“×¤×™× ×—×“×©×™×. ב××¤×©×¨×•×ª×›× ×œ×—×–×•×¨ ×חורה ולערוך דף קיי×, ×ו [[{{ns:special}}:Userlogin|להיכנס לחשבון]].",
-"cantcreateaccounttitle" => "×œ× × ×™×ª×Ÿ ליצור ×ת החשבון",
-"cantcreateaccounttext" => "×פשרות יצירת החשבונות מכתובת ×”Ö¾IP הזו (<b>$1</b>) נחסמה, כנר××” עקב השחתות מתמשכות מבית־הספר ×ו ספק ×”×ינטרנט שלך.",
+'yourdiff' => 'הבדלי×',
+'copyrightwarning' => '<div id="editing-warn">\'\'\'שימו לב:\'\'\' ×ª×¨×•×ž×ª×›× ×œ{{grammar:תחילית|{{SITENAME}}}} ×ª×¤×•×¨×¡× ×ª×—×ª תנ××™ הרישיון $2 (ר×ו $1 ×œ×¤×¨×˜×™× × ×•×¡×¤×™×). ×× ××™× ×›× ×¨×•×¦×™× ×©×¢×‘×•×“×ª×›× ×ª×”×™×” זמינה לעריכה על־ידי ×חרי×, שתופץ לעיני כל, וש××—×¨×™× ×™×•×›×œ×• להעתיק ממנה בציון המקור – ×ל תפרסמו ×ותה פה. כמו־כן, ××ª× ×ž×‘×˜×™×—×™× ×œ× ×• ×›×™ ×›×ª×‘×ª× ×ת הטקסט ×”×–×” בעצמכ×, ×ו ×”×¢×ª×§×ª× ×ותו ממקור ש×ינו מוגן על־ידי זכויות יוצרי×. \'\'\'×ל תעשו שימוש בחומר המוגן בזכויות ×™×•×¦×¨×™× ×œ×œ× ×¨×©×•×ª!\'\'\'</div>',
+'copyrightwarning2' => '<div id="editing-warn">\'\'\'שימו לב:\'\'\' ×ª×•×¨×ž×™× ××—×¨×™× ×¢×©×•×™×™× ×œ×¢×¨×•×š ×ו ××£ להסיר ×ת ×ª×¨×•×ž×ª×›× ×œ{{grammar:תחילית|{{SITENAME}}}}. ×× ××™× ×›× ×¨×•×¦×™× ×©×¢×‘×•×“×ª×›× ×ª×”×™×” זמינה לעריכה על־ידי ××—×¨×™× â€“ ×ל תפרסמו ×ותה פה. כמו־כן, ××ª× ×ž×‘×˜×™×—×™× ×œ× ×• ×›×™ ×›×ª×‘×ª× ×ת הטקסט ×”×–×” בעצמכ×, ×ו ×”×¢×ª×§×ª× ×ותו ממקור ש×ינו מוגן על־ידי זכויות ×™×•×¦×¨×™× (ר×ו $1 ×œ×¤×¨×˜×™× × ×•×¡×¤×™×). \'\'\'×ל תעשו שימוש בחומר המוגן בזכויות ×™×•×¦×¨×™× ×œ×œ× ×¨×©×•×ª!\'\'\'</div>',
+'longpagewarning' => "'''×זהרה: גודל דף ×–×” ×”×•× $1 קילובייטי×. ×‘×“×¤×“×¤× ×™× ×ž×¡×•×™×ž×™× ×™×”×™×• בעיות בעריכת דף הגדול מ־32 קילובייטי×. ×× × ×©×™×§×œ×• לחלק דף ×–×” ×œ×“×¤×™× ×§×˜× ×™× ×™×•×ª×¨. ×× ×–×”×• דף שיחה, שיקלו ל×רכב ×ותו.'''",
+'longpageerror' => "'''שגי××”: הטקסט ×©×©×œ×—×ª× ×”×•× ×‘×ורך $1 קילובייטי×, ×ך ×סור לו להיות ×רוך יותר ×ž×”×ž×§×¡×™×ž×•× ×©×œ $2 קילובייטי×. ×œ× × ×™×ª×Ÿ לשומרו.'''",
+'readonlywarning' => "'''×זהרה: בסיס ×”× ×ª×•× ×™× × × ×¢×œ לצורך תחזוקה. בזמן ×–×” ××™ ×פשר לשמור ×ת הטקסט הערוך. בינתיי×, עד ×¡×™×•× ×”×ª×—×–×•×§×”, ××ª× ×™×›×•×œ×™× ×œ×”×©×ª×ž×© בעורך חיצוני. ×נו ×ž×ª× ×¦×œ×™× ×¢×œ התקלה.'''",
+'protectedpagewarning' => "'''×זהרה: דף ×–×” ×”×•× ×“×£ מוגן וניתן לעריכה על־ידי מפעילי מערכת בלבד. ×× × ×•×“×ו ש××ª× ×¤×•×¢×œ×™× ×¢×œÖ¾×¤×™ העקרונות לעריכת ×“×¤×™× ×לו.'''",
+'semiprotectedpagewarning' => "'''הערה:''' דף ×–×” ננעל כך שרק ×ž×©×ª×ž×©×™× ×¨×©×•×ž×™× ×™×›×•×œ×™× ×œ×¢×¨×•×š ×ותו.",
+'templatesused' => 'תבניות המופיעות בדף זה:',
+'templatesusedpreview' => 'תבניות המופיעות בתצוגה המקדימה הזו:',
+'templatesusedsection' => 'תבניות המופיעות בפיסקה זו:',
+'template-protected' => '(מוגנת)',
+'template-semiprotected' => '(מוגנת חלקית)',
+'edittools' => '<!-- הטקסט הנכתב ×›×ן יוצג מתחת לטפסי עריכת ×“×¤×™× ×•×”×¢×œ×ת קבצי×, ולפיכך ניתן לכתוב להציג בו ×ª×•×•×™× ×§×©×™× ×œ×›×ª×™×‘×”, ×§×˜×¢×™× ×ž×•×›× ×™× ×©×œ טקסט ועוד. -->',
+'nocreatetitle' => 'יצירת ×”×“×¤×™× ×”×•×’×‘×œ×”',
+'nocreatetext' => '×תר ×–×” מגביל ×ת ×”×פשרות ליצור ×“×¤×™× ×—×“×©×™×. ב××¤×©×¨×•×ª×›× ×œ×—×–×•×¨ ×חורה ולערוך דף קיי×, ×ו [[{{ns:special}}:Userlogin|להיכנס לחשבון]].',
+
+# "Undo" feature
+'undo-success' => 'ניתן לבטל ×ת העריכה. ×× × ×‘×™×“×§×• ×ת השוו×ת הגרס×ות למטה כדי ×œ×•×•×“× ×©×–×” מה ש××ª× ×¨×•×¦×™× ×œ×¢×©×•×ª, ו××– שמרו ×ת ×”×©×™× ×•×™×™× ×œ×ž×˜×” כדי לבצע ×ת ביטול העריכה.',
+'undo-failure' => '×œ× × ×™×ª×Ÿ ×”×™×” לבטל ×ת העריכה עקב התנגשות ×¢× ×¢×¨×™×›×•×ª מ×וחרות יותר.',
+'undo-summary' => 'ביטול גרסה $1 על־ידי [[{{ns:special}}:Contributions/$2|$2]] ([[{{ns:user_talk}}:$2|שיחה]])',
+
+# Account creation failure
+'cantcreateaccounttitle' => '×œ× × ×™×ª×Ÿ ליצור ×ת החשבון',
+'cantcreateaccounttext' => '×פשרות יצירת החשבונות מכתובת ×”Ö¾IP הזו (<b>$1</b>) נחסמה, כנר××” עקב השחתות מתמשכות מבית־הספר ×ו ספק ×”×ינטרנט שלך.',
# History pages
-"revhistory" => "היסטוריית שינויי×",
-"viewpagelogs" => "הצג ×™×•×ž× ×™× ×¢×‘×•×¨ דף ×–×”",
-"nohistory" => "×ין היסטוריית ×©×™× ×•×™×™× ×¢×‘×•×¨ דף ×–×”.",
-"revnotfound" => "גרסה זו ×œ× × ×ž×¦××”",
-"revnotfoundtext" => "הגרסה הישנה של דף ×–×” ×œ× × ×ž×¦××”. ×× × ×‘×“×§×• ×ת כתובת הקישור שהוביל ××ª×›× ×”× ×”.",
-"loadhist" => "טוען ×ת היסטוריית ×”×©×™× ×•×™×™× ×©×œ הדף",
-"currentrev" => "גרסה נוכחית",
-"revisionasof" => "גרסה מת×ריך $1",
-"old-revision-navigation" => "גרסה מת×ריך $1; $5<br />($6) $3 | $2 | $4 ($7)",
-"previousrevision" => "→ הגרסה הקודמת",
-"nextrevision" => "הגרסה הב××” â†",
-"currentrevisionlink" => "הגרסה הנוכחית",
-"cur" => "נוכ",
-"next" => "הב×",
-"last" => "×חרון",
-"orig" => "מקור",
-"histlegend" => "השוו×ת גרס×ות: סמנו ×ת תיבות ×”×פשרויות של הגרס×ות המיועדות להשוו××”, והקישו על Enter ×ו על הכפתור שלמעלה ×ו למטה.<br />
-מקר×: (נוכ) = ×”×‘×“×œ×™× ×¢× ×”×’×¨×¡×” הנוכחית, (×חרון) = ×”×‘×“×œ×™× ×¢× ×”×’×¨×¡×” הקודמת, מ = שינוי משני",
-"deletedrev" => "[נמחק]",
-"histfirst" => "ר×שונות",
-"histlast" => "×חרונות",
-"rev-deleted-comment" => "(תקציר העריכה הוסתר)",
-"rev-deleted-user" => "(×©× ×”×ž×©×ª×ž×© הוסתר)",
-"rev-deleted-text-permission" => '<div class="mw-warning plainlinks">
+'revhistory' => 'היסטוריית שינויי×',
+'viewpagelogs' => 'הצג ×™×•×ž× ×™× ×¢×‘×•×¨ דף ×–×”',
+'nohistory' => '×ין היסטוריית ×©×™× ×•×™×™× ×¢×‘×•×¨ דף ×–×”.',
+'revnotfound' => 'גרסה זו ×œ× × ×ž×¦××”',
+'revnotfoundtext' => 'הגרסה הישנה של דף ×–×” ×œ× × ×ž×¦××”. ×× × ×‘×“×§×• ×ת כתובת הקישור שהוביל ××ª×›× ×”× ×”.',
+'loadhist' => 'טוען ×ת היסטוריית ×”×©×™× ×•×™×™× ×©×œ הדף',
+'currentrev' => 'גרסה נוכחית',
+'revisionasof' => 'גרסה מת×ריך $1',
+'revision-info' => 'גרסה מת×ריך $1 מ×ת $2',
+'previousrevision' => '→ הגרסה הקודמת',
+'nextrevision' => 'הגרסה הב××” â†',
+'currentrevisionlink' => 'הגרסה הנוכחית',
+'cur' => 'נוכ',
+'next' => 'הב×',
+'last' => '×חרון',
+'orig' => 'מקור',
+'histlegend' => 'השוו×ת גרס×ות: סמנו ×ת תיבות ×”×פשרויות של הגרס×ות המיועדות להשוו××”, והקישו על Enter ×ו על הכפתור שלמעלה ×ו למטה.<br />
+מקר×: (נוכ) = ×”×‘×“×œ×™× ×¢× ×”×’×¨×¡×” הנוכחית, (×חרון) = ×”×‘×“×œ×™× ×¢× ×”×’×¨×¡×” הקודמת, מ = שינוי משני',
+'deletedrev' => '[נמחק]',
+'histfirst' => 'ר×שונות',
+'histlast' => '×חרונות',
+'rev-deleted-comment' => '(תקציר העריכה הוסתר)',
+'rev-deleted-user' => '(×©× ×”×ž×©×ª×ž×© הוסתר)',
+'rev-deleted-text-permission' => '<div class="mw-warning plainlinks">
גרסת הדף הזו הוסרה מה××¨×›×™×•× ×™× ×”×¦×™×‘×•×¨×™×™×. ייתכן ×©×™×©× × ×¤×¨×˜×™× × ×•×¡×¤×™× ×¢×œ כך ב[{{fullurl:{{ns:special}}:Log/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].
</div>',
-"rev-deleted-text-view" => '<div class="mw-warning plainlinks">
+'rev-deleted-text-view' => '<div class="mw-warning plainlinks">
גרסת הדף הזו הוסרה מה××¨×›×™×•× ×™× ×”×¦×™×‘×•×¨×™×™×. כמפעיל מערכת, ב×פשרותך לצפות בגרסה; ייתכן ×©×™×©× × ×¤×¨×˜×™× × ×•×¡×¤×™× ×¢×œ כך ב[{{fullurl:{{ns:special}}:Log/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].
</div>',
-# "rev-delundel" => "מחק/שחזר",
-"rev-delundel" => "הצג/הסתר",
+'rev-delundel' => 'הצג/הסתר',
-"history-feed-title" => "היסטוריית גרס×ות",
-"history-feed-description" => "היסטוריית הגרס×ות של הדף ×”×–×” בוויקי",
-"history-feed-item-nocomment" => "$1 ב־$2", # user at time
-"history-feed-empty" => "הדף המבוקש ×œ× × ×ž×¦×.
+'history-feed-title' => 'היסטוריית גרס×ות',
+'history-feed-description' => 'היסטוריית הגרס×ות של הדף ×”×–×” בוויקי',
+'history-feed-item-nocomment' => '$1 ב־$2', # user at time
+'history-feed-empty' => 'הדף המבוקש ×œ× × ×ž×¦×.
ייתכן ×©×”×•× × ×ž×—×§ מהוויקי, ×ו ששמו שונה.
-נסו [[{{ns:special}}:Search|לחפש בוויקי]] ×חר ×“×¤×™× ×¨×œ×•×•× ×˜×™×™× ×—×“×©×™×.",
+נסו [[{{ns:special}}:Search|לחפש בוויקי]] ×חר ×“×¤×™× ×¨×œ×•×•× ×˜×™×™× ×—×“×©×™×.',
# Revision deletion
-"revisiondelete" => "מחיקת ושחזור גרס×ות",
-"revdelete-nooldid-title" => "×ין גרסת מטרה",
-"revdelete-nooldid-text" => "×œ× ×¦×™×™× ×ª× ×’×¨×¡×ª ×ו גרס×ות מטרה עליהן תבוצע פעולה זו.",
-"revdelete-selected" => "הגרס×ות שנבחרו של [[:$1]]:",
-"revdelete-text" => "גרס×ות מחוקות עדיין יופיעו בהיסטוריית הדף, ×ך התוכן שלהן ×œ× ×™×”×™×” זמין לציבור.
-
-מפעילי מערכת ××—×¨×™× ×‘×תר עדיין יוכלו לגשת לתוכן הנסתר ויוכלו לשחזר ×ותו שוב דרך הממשק ×”×–×”, ××œ× ×× ×›×Ÿ הגבלה נוספת הוטלה על־ידי מנהלי ×”×תר.",
-"revdelete-legend" => "הגדרת הגבלות הגרסה:",
-"revdelete-hide-text" => "הסתר ×ת תוכן הגרסה",
-"revdelete-hide-comment" => "הסתר ×ת תקציר העריכה",
-"revdelete-hide-user" => "הסתר ×ת ×©× ×”×ž×©×ª×ž×© ×ו כתובת ×”Ö¾IP של העורך",
-"revdelete-hide-restricted" => "החל הגבלות ×לו ×’× ×¢×œ מפעילי מערכת",
-"revdelete-log" => "הערה ביומן:",
-"revdelete-submit" => "החל לגרסה הנוכחית",
-"revdelete-logentry" => "שינה הצגת גרסה לדף [[$1]]",
+'revisiondelete' => 'מחיקת ושחזור גרס×ות',
+'revdelete-nooldid-title' => '×ין גרסת מטרה',
+'revdelete-nooldid-text' => '×œ× ×¦×™×™× ×ª× ×’×¨×¡×ª ×ו גרס×ות מטרה עליהן תבוצע פעולה זו.',
+'revdelete-selected' => 'הגרס×ות שנבחרו של [[:$1]]:',
+'revdelete-text' => 'גרס×ות מחוקות עדיין יופיעו בהיסטוריית הדף, ×ך התוכן שלהן ×œ× ×™×”×™×” זמין לציבור.
+
+מפעילי מערכת ××—×¨×™× ×‘×תר עדיין יוכלו לגשת לתוכן הנסתר ויוכלו לשחזר ×ותו שוב דרך הממשק ×”×–×”, ××œ× ×× ×›×Ÿ הגבלה נוספת הוטלה על־ידי מנהלי ×”×תר.',
+'revdelete-legend' => 'הגדרת הגבלות הגרסה:',
+'revdelete-hide-text' => 'הסתר ×ת תוכן הגרסה',
+'revdelete-hide-comment' => 'הסתר ×ת תקציר העריכה',
+'revdelete-hide-user' => 'הסתר ×ת ×©× ×”×ž×©×ª×ž×© ×ו כתובת ×”Ö¾IP של העורך',
+'revdelete-hide-restricted' => 'החל הגבלות ×לו ×’× ×¢×œ מפעילי מערכת',
+'revdelete-log' => 'הערה ביומן:',
+'revdelete-submit' => 'החל לגרסה הנוכחית',
+'revdelete-logentry' => 'שינה הצגת גרסה לדף [[$1]]',
# Diffs
-"difference" => "(×”×‘×“×œ×™× ×‘×™×Ÿ גרס×ות)",
-"loadingrev" => "טוען ×ת הגרסה להשוו××”",
-"lineno" => "שורה $1:",
-"editcurrent" => "ערוך גרסה נוכחית של הדף",
-"selectnewerversionfordiff" => "בחר גרסה חדשה יותר להשוו××”",
-"selectolderversionfordiff" => "בחר גרסה ישנה יותר להשוו××”",
-"compareselectedversions" => "השווה ×ת הגרס×ות שנבחרו",
+'difference' => '(×”×‘×“×œ×™× ×‘×™×Ÿ גרס×ות)',
+'loadingrev' => 'טוען ×ת הגרסה להשוו××”',
+'lineno' => 'שורה $1:',
+'editcurrent' => 'ערוך גרסה נוכחית של הדף',
+'selectnewerversionfordiff' => 'בחר גרסה חדשה יותר להשוו××”',
+'selectolderversionfordiff' => 'בחר גרסה ישנה יותר להשוו××”',
+'compareselectedversions' => 'השווה ×ת הגרס×ות שנבחרו',
+'editundo' => 'ביטול',
+'diff-multi' => '({{plural:$1|גרסה ×מצעית ×חת ×œ× ×ž×•×¦×’×ª|$1 גרס×ות ×מצעיות ×œ× ×ž×•×¦×’×•×ª}}.)',
# Search results
-"searchresults" => "תוצ×ות החיפוש",
-"searchresulttext" => "ר×ו ×’× [[{{ns:project}}:חיפוש|מידע נוסף על חיפוש ב{{grammar:תחילית|{{SITENAME}}}}]].",
-"searchsubtitle" => "לחיפוש המונח '''[[:$1]]'''",
-"searchsubtitleinvalid" => "לחיפוש המונח '''$1'''",
-"badquery" => "שגי××” בניסוח הש×ילתה.",
-"badquerytext" => '×œ× ×”×¦×œ×—× ×• לבצע ×ת הש×ילתה, ככל הנר××” כיוון ×©× ×™×¡×™×ª× ×œ×—×¤×© מילה בעלת פחות משלוש ×ותיות. חיפוש ×›×–×” עדיין ×ינו נתמך במערכת. ייתכן ×’× ×©×©×’×™×ª× ×‘×”×§×œ×“×ª הש×ליתה – לדוגמה, ×›×ª×‘×ª× "דג ×•×’× ×•×’× ×ž×©×§×œ".
+'searchresults' => 'תוצ×ות החיפוש',
+'searchresulttext' => 'ר×ו ×’× [[{{ns:project}}:חיפוש|מידע נוסף על חיפוש ב{{grammar:תחילית|{{SITENAME}}}}]].',
+'searchsubtitle' => "לחיפוש המונח '''[[:$1]]'''",
+'searchsubtitleinvalid' => "לחיפוש המונח '''$1'''",
+'badquery' => 'שגי××” בניסוח הש×ילתה.',
+'badquerytext' => '×œ× ×”×¦×œ×—× ×• לבצע ×ת הש×ילתה, ככל הנר××” כיוון ×©× ×™×¡×™×ª× ×œ×—×¤×© מילה בעלת פחות משלוש ×ותיות. חיפוש ×›×–×” עדיין ×ינו נתמך במערכת. ייתכן ×’× ×©×©×’×™×ª× ×‘×”×§×œ×“×ª הש×ליתה – לדוגמה, ×›×ª×‘×ª× "דג ×•×’× ×•×’× ×ž×©×§×œ".
ניתן לנסות ש×ילתה ×חרת.',
-"matchtotals" => 'לחיפוש "$1" נמצ×ו $2 ×“×¤×™× ×¢× ×›×•×ª×¨×•×ª תו×מות ו־$3 ×“×¤×™× ×¢× ×ª×•×›×Ÿ תו××',
-"noexactmatch" => '×ין דף שכותרתו "$1". ב××¤×©×¨×•×ª×›× [[:$1|ליצור ×ת הדף]].',
-"titlematches" => "כותרות ×“×¤×™× ×ª×•×מות",
-"notitlematches" => "×ין כותרות ×“×¤×™× ×ª×•×מות",
-"textmatches" => "×“×¤×™× ×¢× ×ª×•×›×Ÿ תו××",
-"notextmatches" => "×ין ×“×¤×™× ×¢× ×ª×•×›×Ÿ תו××",
-"prevn" => "$1 הקודמי×",
-"nextn" => "$1 הב××™×",
-"viewprevnext" => "צפו ב - ($1) ($2) ($3).",
-"showingresults" => "מציג עד <b>$1</b> תוצ×ות החל ממספר #<b>$2</b>:",
-"showingresultsnum" => "מציג <b>$3</b> תוצ×ות החל ממספר #<b>$2</b>:",
-"nonefound" => "×œ× × ×ž×¦×ו ×“×¤×™× ×¢× ×ª×•×›×Ÿ תו××. ×× × ×•×“×ו ×©×”×§×œ×“×ª× ×ת ש×ילתת החיפוש נכון. ×× ×כן ×”×§×œ×“×ª× ×ותה נכון, נסו לחפש × ×•×©× ×›×œ×œ×™ יותר.
-
-×—×™×¤×•×©×™× ×›×•×©×œ×™× ×ž×¡×•×’ ×–×” × ×’×¨×ž×™× ×‘×“×¨×š כלל בגלל ציון יותר ממילת חיפוש ×חת, שכן במקרה ×–×” ×ž×•×¤×™×¢×™× ×¨×§ ×“×¤×™× ×”×›×•×œ×œ×™× ×ת כל המילי×.",
-"powersearch" => "חפש",
-"powersearchtext" => "חפש במרחבי ש×:<br />$1<br />$2 הצג ×’× ×“×¤×™ הפנייה<br />חפש $3 $9",
-"searchdisabled" => "לצערנו, עקב עומס על המערכת, ×œ× × ×™×ª×Ÿ לחפש כעת בטקסט ×”×ž×œ× ×©×œ הדפי×. ב××¤×©×¨×•×ª×›× ×œ×”×©×ª×ž×© ×‘×™× ×ª×™×™× ×‘×’×•×’×œ, ×ך שימו לב שייתכן ×©×”×•× ×ינו מעודכן.",
-"blanknamespace" => "(ר×שי)",
+'matchtotals' => 'לחיפוש "$1" נמצ×ו $2 ×“×¤×™× ×¢× ×›×•×ª×¨×•×ª תו×מות ו־$3 ×“×¤×™× ×¢× ×ª×•×›×Ÿ תו××',
+'noexactmatch' => '×ין דף שכותרתו "$1". ב××¤×©×¨×•×ª×›× [[:$1|ליצור ×ת הדף]].',
+'titlematches' => 'כותרות ×“×¤×™× ×ª×•×מות',
+'notitlematches' => '×ין כותרות ×“×¤×™× ×ª×•×מות',
+'textmatches' => '×“×¤×™× ×¢× ×ª×•×›×Ÿ תו××',
+'notextmatches' => '×ין ×“×¤×™× ×¢× ×ª×•×›×Ÿ תו××',
+'prevn' => '$1 הקודמי×',
+'nextn' => '$1 הב××™×',
+'viewprevnext' => 'צפו ב - ($1) ($2) ($3).',
+'showingresults' => 'מציג עד <b>$1</b> תוצ×ות החל ממספר #<b>$2</b>:',
+'showingresultsnum' => 'מציג <b>$3</b> תוצ×ות החל ממספר #<b>$2</b>:',
+'nonefound' => '×œ× × ×ž×¦×ו ×“×¤×™× ×¢× ×ª×•×›×Ÿ תו××. ×× × ×•×“×ו ×©×”×§×œ×“×ª× ×ת ש×ילתת החיפוש נכון. ×× ×כן ×”×§×œ×“×ª× ×ותה נכון, נסו לחפש × ×•×©× ×›×œ×œ×™ יותר.
+
+×—×™×¤×•×©×™× ×›×•×©×œ×™× ×ž×¡×•×’ ×–×” × ×’×¨×ž×™× ×‘×“×¨×š כלל בגלל ציון יותר ממילת חיפוש ×חת, שכן במקרה ×–×” ×ž×•×¤×™×¢×™× ×¨×§ ×“×¤×™× ×”×›×•×œ×œ×™× ×ת כל המילי×.',
+'powersearch' => 'חפש',
+'powersearchtext' => 'חפש במרחבי ש×:<br />$1<br />$2 הצג ×’× ×“×¤×™ הפנייה<br />חפש $3 $9',
+'searchdisabled' => 'לצערנו, עקב עומס על המערכת, ×œ× × ×™×ª×Ÿ לחפש כעת בטקסט ×”×ž×œ× ×©×œ הדפי×. ב××¤×©×¨×•×ª×›× ×œ×”×©×ª×ž×© ×‘×™× ×ª×™×™× ×‘×’×•×’×œ, ×ך שימו לב שייתכן ×©×”×•× ×ינו מעודכן.',
+'blanknamespace' => '(ר×שי)',
# Preferences page
-"preferences" => "העדפות",
-"mypreferences" => "ההעדפות שלי",
-"prefsnologin" => "×œ× × ×¨×©×ž×ª ב×תר",
-"prefsnologintext" => "×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]] כדי לשנות העדפות משתמש.",
-"prefsreset" => "העדפותיך שוחזרו לברירת המחדל.",
-"qbsettings" => "הגדרות סרגל כלי×",
-"changepassword" => "שנה סיסמה",
-"skin" => "רקע",
-"math" => "נוסח×ות מתמטיות",
-"dateformat" => "מבנה ת×ריך",
-"datedefault" => "ברירת המחדל",
-"datetime" => "ת×ריך ושעה",
-"math_failure" => "עיבוד הנוסחה נכשל",
-"math_unknown_error" => "שגי××” ×œ× ×™×“×•×¢×”",
-"math_unknown_function" => "פונקציה ×œ× ×ž×•×›×¨×ª",
-"math_lexing_error" => "שגי×ת לקסינג",
-"math_syntax_error" => "שגי×ת תחביר",
-"math_image_error" => "ההמרה ל־PNG נכשלה; ×× × ×‘×“×§×• ×× ×”×ª×§× ×ª× × ×›×•×Ÿ ×ת latex, ×ת dvips, ×ת gs ו×ת convert.",
-"math_bad_tmpdir" => "התוכנה ×œ× ×”×¦×œ×™×—×” לכתוב ×ו ליצור ×ת הספרייה הזמנית של המתמטיקה",
-"math_bad_output" => "התוכנה ×œ× ×”×¦×œ×™×—×” לכתוב ×ו ליצור ×ת ספריית הפלט של המתמטיקה",
-"math_notexvc" => "קובץ בר־ביצוע של texvc ×ינו זמין; ×× × ×¨×ו ×ת קובץ ×”Ö¾README למידע על ההגדרות.",
-"prefs-personal" => "פרטי המשתמש",
-"prefs-rc" => "×©×™× ×•×™×™× ×חרוני×",
-"prefs-watchlist" => "רשימת המעקב",
-"prefs-watchlist-days" => "מספר ×”×™×ž×™× ×œ×ª×¦×•×’×” ברשימת המעקב:",
-"prefs-watchlist-edits" => "מספר העריכות לתצוגה ברשימת המעקב המורחבת:",
-"prefs-misc" => "שונות",
-"saveprefs" => "שמור העדפות",
-"resetprefs" => "שחזר ברירת מחדל",
-"oldpassword" => "סיסמה ישנה",
-"newpassword" => "סיסמה חדשה",
-"retypenew" => "הקלד סיסמה חדשה שנית",
-"textboxsize" => "עריכה",
-"rows" => "שורות",
-"columns" => "עמודות",
-"searchresultshead" => "חיפוש",
-"resultsperpage" => "מספר תוצ×ות בעמוד",
-"contextlines" => "שורות לכל תוצ××”",
-"contextchars" => "מספר תווי קונטקסט בשורה",
-"stubthreshold" => "סף להצגת ×“×¤×™× ×§×¦×¨×™× (קצרמרי×)",
-"recentchangescount" => "מספר ×©×™× ×•×™×™× ×©×™×•×¦×’×• בדף ×©×™× ×•×™×™× ×חרוני×",
-"savedprefs" => "העדפותיך נשמרו.",
-"timezonelegend" => "×זור זמן",
-"timezonetext" => "הפרש השעות בינך לבין השרת (UTC).",
-"localtime" => "זמן מקומי",
-"timezoneoffset" => "הפרש",
-"servertime" => "השעה הנוכחית בשרת ×”×™×",
-"guesstimezone" => "קבל מהדפדפן",
-"allowemail" => '×פשר קבלת דו×"ל ×ž×ž×©×ª×ž×©×™× ×חרי×',
-"defaultns" => "כברירת מחדל, חפש במרחבי ×”×©× ×לו:",
-"default" => "ברירת מחדל",
-"files" => "קבצי×",
+'preferences' => 'העדפות',
+'mypreferences' => 'ההעדפות שלי',
+'prefsnologin' => '×œ× × ×¨×©×ž×ª ב×תר',
+'prefsnologintext' => '×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]] כדי לשנות העדפות משתמש.',
+'prefsreset' => 'העדפותיך שוחזרו לברירת המחדל.',
+'qbsettings' => 'הגדרות סרגל כלי×',
+'changepassword' => 'שנה סיסמה',
+'skin' => 'רקע',
+'math' => 'נוסח×ות מתמטיות',
+'dateformat' => 'מבנה ת×ריך',
+'datedefault' => 'ברירת המחדל',
+'datetime' => 'ת×ריך ושעה',
+'math_failure' => 'עיבוד הנוסחה נכשל',
+'math_unknown_error' => 'שגי××” ×œ× ×™×“×•×¢×”',
+'math_unknown_function' => 'פונקציה ×œ× ×ž×•×›×¨×ª',
+'math_lexing_error' => 'שגי×ת לקסינג',
+'math_syntax_error' => 'שגי×ת תחביר',
+'math_image_error' => 'ההמרה ל־PNG נכשלה; ×× × ×‘×“×§×• ×× ×”×ª×§× ×ª× × ×›×•×Ÿ ×ת latex, ×ת dvips, ×ת gs ו×ת convert.',
+'math_bad_tmpdir' => 'התוכנה ×œ× ×”×¦×œ×™×—×” לכתוב ×ו ליצור ×ת הספרייה הזמנית של המתמטיקה',
+'math_bad_output' => 'התוכנה ×œ× ×”×¦×œ×™×—×” לכתוב ×ו ליצור ×ת ספריית הפלט של המתמטיקה',
+'math_notexvc' => 'קובץ בר־ביצוע של texvc ×ינו זמין; ×× × ×¨×ו ×ת קובץ ×”Ö¾README למידע על ההגדרות.',
+'prefs-personal' => 'פרטי המשתמש',
+'prefs-rc' => '×©×™× ×•×™×™× ×חרוני×',
+'prefs-watchlist' => 'רשימת המעקב',
+'prefs-watchlist-days' => 'מספר ×”×™×ž×™× ×œ×ª×¦×•×’×” ברשימת המעקב:',
+'prefs-watchlist-edits' => 'מספר העריכות לתצוגה ברשימת המעקב המורחבת:',
+'prefs-misc' => 'שונות',
+'saveprefs' => 'שמור העדפות',
+'resetprefs' => 'שחזר ברירת מחדל',
+'oldpassword' => 'סיסמה ישנה',
+'newpassword' => 'סיסמה חדשה',
+'retypenew' => 'הקלד סיסמה חדשה שנית',
+'textboxsize' => 'עריכה',
+'rows' => 'שורות',
+'columns' => 'עמודות',
+'searchresultshead' => 'חיפוש',
+'resultsperpage' => 'מספר תוצ×ות בעמוד',
+'contextlines' => 'שורות לכל תוצ××”',
+'contextchars' => 'מספר תווי קונטקסט בשורה',
+'stubthreshold' => 'סף להצגת ×“×¤×™× ×§×¦×¨×™× (קצרמרי×)',
+'recentchangescount' => 'מספר ×©×™× ×•×™×™× ×©×™×•×¦×’×• בדף ×©×™× ×•×™×™× ×חרוני×',
+'savedprefs' => 'העדפותיך נשמרו.',
+'timezonelegend' => '×זור זמן',
+'timezonetext' => 'הפרש השעות בינך לבין השרת (UTC).',
+'localtime' => 'זמן מקומי',
+'timezoneoffset' => 'הפרש',
+'servertime' => 'השעה הנוכחית בשרת ×”×™×',
+'guesstimezone' => 'קבל מהדפדפן',
+'allowemail' => '×פשר קבלת דו×"ל ×ž×ž×©×ª×ž×©×™× ×חרי×',
+'defaultns' => 'כברירת מחדל, חפש במרחבי ×”×©× ×לו:',
+'default' => 'ברירת מחדל',
+'files' => 'קבצי×',
# User rights
-"userrights-lookup-user" => "נהלו קבוצות משתמש",
-"userrights-user-editname" => "הכניסו ×©× ×ž×©×ª×ž×©:",
-"editusergroup" => "ערכו קבוצות משתמשי×",
-"userrights-editusergroup" => "ערכו קבוצות משתמש",
-"saveusergroups" => "שמור קבוצות משתמש",
-"userrights-groupsmember" => "חבר בקבוצות:",
-"userrights-groupsavailable" => "קבוצות זמינות:",
-"userrights-groupshelp" => "×× × ×‘×—×¨×• קבוצות ×©×‘×¨×¦×•× ×›× ×©×”×ž×©×ª×ž×© יתווסף ×ליהן ×ו יוסר מהן.
-קבוצות ×©×œ× × ×‘×—×¨×• ×œ× ×™×©×ª× ×•. ב××¤×©×¨×•×ª×›× ×œ×‘×˜×œ בחירה של קבוצה ב×מצעות לחיצה על הכפתור השמ×לי של העכבר ועל Ctrl מעליה.",
+'userrights-lookup-user' => 'נהלו קבוצות משתמש',
+'userrights-user-editname' => 'הכניסו ×©× ×ž×©×ª×ž×©:',
+'editusergroup' => 'ערכו קבוצות משתמשי×',
+'userrights-editusergroup' => 'ערכו קבוצות משתמש',
+'saveusergroups' => 'שמור קבוצות משתמש',
+'userrights-groupsmember' => 'חבר בקבוצות:',
+'userrights-groupsavailable' => 'קבוצות זמינות:',
+'userrights-groupshelp' => '×× × ×‘×—×¨×• קבוצות ×©×‘×¨×¦×•× ×›× ×©×”×ž×©×ª×ž×© יתווסף ×ליהן ×ו יוסר מהן.
+קבוצות ×©×œ× × ×‘×—×¨×• ×œ× ×™×©×ª× ×•. ב××¤×©×¨×•×ª×›× ×œ×‘×˜×œ בחירה של קבוצה ב×מצעות לחיצה על הכפתור השמ×לי של העכבר ועל Ctrl מעליה.',
# Groups
-"group" => "קבוצה:",
-"group-bot" => "בוטי×",
-"group-sysop" => "מפעילי מערכת",
-"group-bureaucrat" => "ביורוקרטי×",
-"group-all" => "(הכול)",
+'group' => 'קבוצה:',
+'group-bot' => 'בוטי×',
+'group-sysop' => 'מפעילי מערכת',
+'group-bureaucrat' => 'ביורוקרטי×',
+'group-all' => '(הכול)',
-"group-bot-member" => "בוט",
-"group-sysop-member" => "מפעיל מערכת",
-"group-bureaucrat-member" => "ביורוקרט",
+'group-bot-member' => 'בוט',
+'group-sysop-member' => 'מפעיל מערכת',
+'group-bureaucrat-member' => 'ביורוקרט',
-"grouppage-bot" => "{{ns:project}}:בוט",
-"grouppage-sysop" => "{{ns:project}}:מפעיל מערכת",
-"grouppage-bureaucrat" => "{{ns:project}}:ביורוקרט",
+'grouppage-bot' => '{{ns:project}}:בוט',
+'grouppage-sysop' => '{{ns:project}}:מפעיל מערכת',
+'grouppage-bureaucrat' => '{{ns:project}}:ביורוקרט',
# Recent changes
-"changes" => "שינויי×",
-"recentchanges" => "×©×™× ×•×™×™× ×חרוני×",
-"recentchangestext" => "עקבו ×חרי ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×‘×תר בדף ×–×”.",
-"rcnote" => "להלן <b>$1</b> ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×©×‘×•×¦×¢×• ב־$2 ×”×™×ž×™× ×”×חרוני×, עד הת×ריך <b>$3</b>:",
-"rcnotefrom" => "להלן <b>$1</b> ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×©×‘×•×¦×¢×• החל מת×ריך <b>$2</b>:",
-"rclistfrom" => "הצג ×©×™× ×•×™×™× ×—×“×©×™× ×”×—×œ מ־$1",
-"rcshowhideminor" => "$1 ×©×™× ×•×™×™× ×ž×©× ×™×™×",
-"rcshowhidebots" => "$1 בוטי×",
-"rcshowhideliu" => "$1 ×ž×©×ª×ž×©×™× ×¨×©×•×ž×™×",
-"rcshowhideanons" => "$1 ×ž×©×ª×ž×©×™× ×נונימיי×",
-"rcshowhidepatr" => "$1 עריכות בדוקות",
-"rcshowhidemine" => "$1 עריכות שלי",
-"rclinks" => "הצג $1 ×©×™× ×•×™×™× ××—×¨×•× ×™× ×‘-$2 ×”×™×ž×™× ×”×חרוני×.<br /> $3",
-"diff" => "הבדל",
-"hist" => "היסטוריה",
-"hide" => "הסתר",
-"show" => "הצג",
-"minoreditletter" => "מ",
-"newpageletter" => "×—",
-"boteditletter" => "ב",
-"sectionlink" => "â†",
-"number_of_watching_users_pageview" => "[$1 משתמש/×™× ×¦×•×¤×™×]",
-"rc_categories" => 'הגבל לקטגוריות (הפרד ×¢× "|")',
-"rc_categories_any" => "הכול",
+'changes' => 'שינויי×',
+'recentchanges' => '×©×™× ×•×™×™× ×חרוני×',
+'recentchangestext' => 'עקבו ×חרי ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×‘×תר בדף ×–×”.',
+'recentchanges-feed-description' => 'עקבו ×חרי ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×‘×תר בדף ×–×”.',
+'rcnote' => 'להלן <b>$1</b> ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×©×‘×•×¦×¢×• ב־$2 ×”×™×ž×™× ×”×חרוני×, עד הת×ריך <b>$3</b>:',
+'rcnotefrom' => 'להלן <b>$1</b> ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×©×‘×•×¦×¢×• החל מת×ריך <b>$2</b>:',
+'rclistfrom' => 'הצג ×©×™× ×•×™×™× ×—×“×©×™× ×”×—×œ מ־$1',
+'rcshowhideminor' => '$1 ×©×™× ×•×™×™× ×ž×©× ×™×™×',
+'rcshowhidebots' => '$1 בוטי×',
+'rcshowhideliu' => '$1 ×ž×©×ª×ž×©×™× ×¨×©×•×ž×™×',
+'rcshowhideanons' => '$1 ×ž×©×ª×ž×©×™× ×נונימיי×',
+'rcshowhidepatr' => '$1 עריכות בדוקות',
+'rcshowhidemine' => '$1 עריכות שלי',
+'rclinks' => 'הצג $1 ×©×™× ×•×™×™× ××—×¨×•× ×™× ×‘-$2 ×”×™×ž×™× ×”×חרוני×.<br /> $3',
+'diff' => 'הבדל',
+'hist' => 'היסטוריה',
+'hide' => 'הסתר',
+'show' => 'הצג',
+'minoreditletter' => 'מ',
+'newpageletter' => '×—',
+'boteditletter' => 'ב',
+'sectionlink' => 'â†',
+'number_of_watching_users_pageview' => '[$1 משתמש/×™× ×¦×•×¤×™×]',
+'rc_categories' => 'הגבל לקטגוריות (הפרד ×¢× "|")',
+'rc_categories_any' => 'הכול',
# Upload
-"upload" => "העל×ת קובץ לשרת",
-"uploadbtn" => "העלה קובץ",
-"reupload" => "העלה שנית",
-"reuploaddesc" => "חזרו לטופס העל×ת ×§×‘×¦×™× ×œ×©×¨×ª.",
-"uploadnologin" => "×œ× × ×›× ×¡×ª× ×œ×תר",
-"uploadnologintext" => "×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]] כדי להעלות קבצי×.",
-"upload_directory_read_only" => "תיקיית ההעל×ות ($1) ××™× ×” ניתנת לכתיבה על־ידי שרת ×”×ינטרנט, ולפיכך ×”×•× ×ינו יכול להעלות ×ת התמונה.",
-"uploaderror" => "שגי××” בהעל×ת הקובץ",
-"uploadtext" => "השתמשו בטופס להלן כדי להעלות תמונות. כדי לר×ות ×ו לחפש תמונות שהועלו בעבר ×× × ×¤× ×• ל[[{{ns:special}}:Imagelist|רשימת ×”×§×‘×¦×™× ×”×ž×•×¢×œ×™×]], וכמו כן, העל×ות מוצגות ב[[{{ns:special}}:Log/upload|יומן ההעל×ות]], ומחיקות ב[[{{ns:special}}:Log/delete|יומן המחיקות]].
+'upload' => 'העל×ת קובץ לשרת',
+'uploadbtn' => 'העלה קובץ',
+'reupload' => 'העלה שנית',
+'reuploaddesc' => 'חזרו לטופס העל×ת ×§×‘×¦×™× ×œ×©×¨×ª.',
+'uploadnologin' => '×œ× × ×›× ×¡×ª× ×œ×תר',
+'uploadnologintext' => '×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]] כדי להעלות קבצי×.',
+'upload_directory_read_only' => 'תיקיית ההעל×ות ($1) ××™× ×” ניתנת לכתיבה על־ידי שרת ×”×ינטרנט, ולפיכך ×”×•× ×ינו יכול להעלות ×ת התמונה.',
+'uploaderror' => 'שגי××” בהעל×ת הקובץ',
+'uploadtext' => "השתמשו בטופס להלן כדי להעלות תמונות. כדי לר×ות ×ו לחפש תמונות שהועלו בעבר ×× × ×¤× ×• ל[[{{ns:special}}:Imagelist|רשימת ×”×§×‘×¦×™× ×”×ž×•×¢×œ×™×]], וכמו כן, העל×ות מוצגות ב[[{{ns:special}}:Log/upload|יומן ההעל×ות]], ומחיקות ב[[{{ns:special}}:Log/delete|יומן המחיקות]].
כדי לכלול תמונה בדף, השתמשו בקישור בצורות '''<nowiki>[[{{ns:image}}:file.jpg]]</nowiki>''' לתמונות בפורמט JPG (המיועד לתצלומי×), '''<nowiki>[[{{ns:image}}:file.png]]</nowiki>''' לתמונות בפורמט PNG (ל×יורי×, ×©×¨×˜×•×˜×™× ×•×¡×ž×œ×™×). כדי לקשר ישירות לקובץ קול, השתמשו בקישור בצורה '''<nowiki>[[{{ns:media}}:file.jpg]]</nowiki>''' לקבצי קול בפורמט OGG.",
-"uploadlog" => "יומן העל×ות קבצי×",
-"uploadlogpage" => "יומן העל×ות",
-"uploadlogpagetext" => "להלן רשימה של העל×ות ×”×§×‘×¦×™× ×”×חרונות שבוצעו.",
-"filename" => "×©× ×”×§×•×‘×¥",
-"filedesc" => "תקציר",
-"fileuploadsummary" => "תי×ור:",
-"filestatus" => "מעמד זכויות יוצרי×",
-"filesource" => "מקור",
-"copyrightpage" => "{{ns:project}}:זכויות יוצרי×",
-"copyrightpagename" => "זכויות ×”×™×•×¦×¨×™× ×©×œ {{SITENAME}}",
-"uploadedfiles" => "×§×‘×¦×™× ×©×”×•×¢×œ×•",
-"ignorewarning" => "×”×ª×¢×œ× ×ž×”×זהרה ושמור ×ת הקובץ בכל ×–×ת.",
-"ignorewarnings" => "×”×ª×¢×œ× ×ž×›×œ ×”×זהרות",
-"minlength" => "שמות של קבצי תמונה ×¦×¨×™×›×™× ×œ×”×™×•×ª בני שלושה ×ª×•×•×™× ×œ×¤×—×•×ª.",
-"illegalfilename" => 'הקובץ "$1" מכיל ×ª×•×™× ×‘×œ×ª×™ חוקיי×. ×× × ×©× ×• ×ת שמו ונסו להעלותו שנית.',
-"badfilename" => '×©× ×”×ª×ž×•× ×” שונה ל־"$1".',
-"badfiletype" => '"$1" ×ינו פורמט מומלץ לשמירת תמונות.',
-"largefile" => "מומלץ שגודל הקובץ ×œ× ×™×—×¨×•×’ מ־$1 ×‘×™×™×˜×™× (גודל הקובץ ×©×”×¢×œ×™×ª× ×”×•× $2 בייטי×).",
-"largefileserver" => "גודל הקובץ ×©×”×¢×œ×™×ª× ×—×•×¨×’ ממגבלת השרת.",
-"emptyfile" => "הקובץ ×©×”×¢×œ×™×ª× ×¨×™×§. ייתכן שהסיבה לכך ×”×™× ×©×’×™×ת הקלדה ×‘×©× ×”×§×•×‘×¥. ×× × ×•×“×ו שזהו הקובץ שברצונך להעלות.",
-"fileexists" => 'קובץ ×‘×©× ×–×” כבר קיי×, ×× × ×‘×“×§×• ×ת $1 ×× ××™× ×›× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×”×—×œ×™×£ ×ותו.',
-"fileexists-forbidden" => "קובץ ×‘×©× ×–×” כבר קיי×; ×× × ×—×–×¨×• לדף ×”×§×•×“× ×•×”×¢×œ×• ×ת הקובץ תחת ×©× ×—×“×©.
-[[{{ns:image}}:$1|thumb|center|$1]]",
-"fileexists-shared-forbidden" => "קובץ ×‘×©× ×–×” כבר ×§×™×™× ×›×§×•×‘×¥ משותף; ×× × ×—×–×¨×• לדף ×”×§×•×“× ×•×”×¢×œ×• ×ת הקובץ תחת ×©× ×—×“×©.
-[[{{ns:image}}:$1|thumb|center|$1]]",
-"successfulupload" => "העל×ת הקובץ הושלמה בהצלחה",
-"fileuploaded" => "הקובץ $1 הועלה לשרת בהצלחה.
+'uploadlog' => 'יומן העל×ות קבצי×',
+'uploadlogpage' => 'יומן העל×ות',
+'uploadlogpagetext' => 'להלן רשימה של העל×ות ×”×§×‘×¦×™× ×”×חרונות שבוצעו.',
+'filename' => '×©× ×”×§×•×‘×¥',
+'filedesc' => 'תקציר',
+'fileuploadsummary' => 'תי×ור:',
+'filestatus' => 'מעמד זכויות יוצרי×',
+'filesource' => 'מקור',
+'copyrightpage' => '{{ns:project}}:זכויות יוצרי×',
+'copyrightpagename' => 'זכויות ×”×™×•×¦×¨×™× ×©×œ {{SITENAME}}',
+'uploadedfiles' => '×§×‘×¦×™× ×©×”×•×¢×œ×•',
+'ignorewarning' => '×”×ª×¢×œ× ×ž×”×זהרה ושמור ×ת הקובץ בכל ×–×ת.',
+'ignorewarnings' => '×”×ª×¢×œ× ×ž×›×œ ×”×זהרות',
+'minlength' => 'שמות של קבצי תמונה ×¦×¨×™×›×™× ×œ×”×™×•×ª בני שלושה ×ª×•×•×™× ×œ×¤×—×•×ª.',
+'illegalfilename' => 'הקובץ "$1" מכיל ×ª×•×™× ×‘×œ×ª×™ חוקיי×. ×× × ×©× ×• ×ת שמו ונסו להעלותו שנית.',
+'badfilename' => '×©× ×”×ª×ž×•× ×” שונה ל־"$1".',
+'badfiletype' => '"$1" ×ינו פורמט מומלץ לשמירת תמונות.',
+'large-file' => 'מומלץ ×©×”×§×‘×¦×™× ×œ× ×™×”×™×• ×’×“×•×œ×™× ×™×•×ª×¨ מ־$1 (גודל הקובץ ×©×”×¢×œ×™×ª× ×”×•× $2).',
+'largefileserver' => 'גודל הקובץ ×©×”×¢×œ×™×ª× ×—×•×¨×’ ממגבלת השרת.',
+'emptyfile' => 'הקובץ ×©×”×¢×œ×™×ª× ×¨×™×§. ייתכן שהסיבה לכך ×”×™× ×©×’×™×ת הקלדה ×‘×©× ×”×§×•×‘×¥. ×× × ×•×“×ו שזהו הקובץ שברצונך להעלות.',
+'fileexists' => 'קובץ ×‘×©× ×–×” כבר קיי×, ×× × ×‘×“×§×• ×ת $1 ×× ××™× ×›× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×”×—×œ×™×£ ×ותו.',
+'fileexists-forbidden' => 'קובץ ×‘×©× ×–×” כבר קיי×; ×× × ×—×–×¨×• לדף ×”×§×•×“× ×•×”×¢×œ×• ×ת הקובץ תחת ×©× ×—×“×©.
+[[{{ns:image}}:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'קובץ ×‘×©× ×–×” כבר ×§×™×™× ×›×§×•×‘×¥ משותף; ×× × ×—×–×¨×• לדף ×”×§×•×“× ×•×”×¢×œ×• ×ת הקובץ תחת ×©× ×—×“×©.
+[[{{ns:image}}:$1|thumb|center|$1]]',
+'successfulupload' => 'העל×ת הקובץ הושלמה בהצלחה',
+'fileuploaded' => "הקובץ $1 הועלה לשרת בהצלחה.
×× × ×”×©×ª×ž×©×• בקישור $2 כדי לעבור לדף תי×ור הקובץ ×•×œ×ž×œ× ×ת כל המידע ×ודות הקובץ, כגון מ×ין ×”×’×™×¢, מתי נוצר ועל־ידי מי, וכל פרט ×חר ש××ª× ×™×•×“×¢×™× ×¢×œ×™×•. ×× ×–×• תמונה, ב××¤×©×¨×•×ª×›× ×œ×”×›×œ×™×œ×” ×‘×“×¤×™× ×›×š: '''<nowiki>[[{{ns:image}}:$1|thumb|Description]]</nowiki>'''",
-"uploadwarning" => "×זהרת העל×ת קבצי×",
-"savefile" => "שמור קובץ",
-"uploadedimage" => 'העלה ×ת הקובץ "[[$1]]"',
-"uploaddisabled" => "העל×ת ×§×‘×¦×™× ×ž× ×•×˜×¨×œ×ª",
-"uploaddisabledtext" => "×פשרות העל×ת ×”×§×‘×¦×™× ×ž× ×•×˜×¨×œ×ª ב×תר ×–×”.",
-"uploadscripted" => "הקובץ כולל קוד סקריפט ×ו HTML שעשוי להתפרש ×ו להתבצע בטעות על־ידי הדפדפן.",
-"uploadcorrupt" => "קובץ ×–×” ×ינו תקין ×ו שהסיומת שלו ××™× × ×” מת×ימה. ×× × ×‘×“×§×• ×ת הקובץ והעלו ×ותו שוב.",
-"uploadvirus" => 'הקובץ מכיל וירוס! פרטי×: <div style="direction: ltr;">$1</div>',
-"sourcefilename" => "×©× ×”×§×•×‘×¥",
-"destfilename" => "שמור קובץ בש×",
-"watchthisupload" => "עקוב ×חרי דף ×–×”",
-"filewasdeleted" => "קובץ ×‘×©× ×–×” כבר הועלה בעבר, ול×חר מכן נמחק. ×× × ×‘×“×§×• ×ת הדף $1 לפני שתמשיכו להעלותו שנית.",
-
-"license" => "רישיון",
-"nolicense" => "×ין",
-"upload_source_url" => " (כתובת URL תקפה ונגישה)",
-"upload_source_file" => " (קובץ במחשב שלך)",
+'uploadwarning' => '×זהרת העל×ת קבצי×',
+'savefile' => 'שמור קובץ',
+'uploadedimage' => 'העלה ×ת הקובץ "[[$1]]"',
+'uploaddisabled' => 'העל×ת ×§×‘×¦×™× ×ž× ×•×˜×¨×œ×ª',
+'uploaddisabledtext' => '×פשרות העל×ת ×”×§×‘×¦×™× ×ž× ×•×˜×¨×œ×ª ב×תר ×–×”.',
+'uploadscripted' => 'הקובץ כולל קוד סקריפט ×ו HTML שעשוי להתפרש ×ו להתבצע בטעות על־ידי הדפדפן.',
+'uploadcorrupt' => 'קובץ ×–×” ×ינו תקין ×ו שהסיומת שלו ××™× × ×” מת×ימה. ×× × ×‘×“×§×• ×ת הקובץ והעלו ×ותו שוב.',
+'uploadvirus' => 'הקובץ מכיל וירוס! פרטי×: <div style="direction: ltr;">$1</div>',
+'sourcefilename' => '×©× ×”×§×•×‘×¥',
+'destfilename' => 'שמור קובץ בש×',
+'watchthisupload' => 'מעקב ×חרי דף ×–×”',
+'filewasdeleted' => 'קובץ ×‘×©× ×–×” כבר הועלה בעבר, ול×חר מכן נמחק. ×× × ×‘×“×§×• ×ת הדף $1 לפני שתמשיכו להעלותו שנית.',
+
+'upload-proto-error' => 'פרוטוקול שגוי',
+'upload-proto-error-text' => 'בהעל××” מרוחקת, יש להשתמש בכתובות URL המתחילות ×¢× <code>http://</code> ×ו <code>ftp://</code>.',
+'upload-file-error' => 'שגי××” פנימית',
+'upload-file-error-text' => 'שגי××” פנימית התרחשה בעת הניסיון ליצור קובץ זמני על השרת. ×× × ×¦×¨×• קשר ×¢× ×ž× ×”×œ מערכת.',
+'upload-misc-error' => 'שגי×ת העל××” בלתי ידועה',
+'upload-misc-error-text' => 'שגי×ת העל××” בלתי ידועה התרחשה במהלך ההעל××”. ×× × ×•×“×ו שכתובת ×”Ö¾URL תקינה וזמינה ונסו שנית. ×× ×”×‘×¢×™×” חוזרת על עצמה, ×× × ×¦×¨×• קשר ×¢× ×ž× ×”×œ המערכת.',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => '×œ× × ×™×ª×Ÿ להגיע ל־URL',
+'upload-curl-error6-text' => '×œ× × ×™×ª×Ÿ לכתובת ×”Ö¾URL שנכתבה. ×× × ×‘×“×§×• ×× ×›×ª×•×‘×ª זו נכונה ו×× ×”×תר זמין.',
+'upload-curl-error28' => '×”×¡×ª×™×™× ×–×ž×Ÿ ההמתנה להעל××”',
+'upload-curl-error28-text' => 'ל×תר לקח זמן רב מדי לענות. ×× × ×‘×“×§×• שה×תר זמין, המתינו מעט ונסו שנית. ייתכן שתרצו לנסות בזמן פחות עמוס.',
+
+'license' => 'רישיון',
+'nolicense' => '×ין',
+'upload_source_url' => ' (כתובת URL תקפה ונגישה)',
+'upload_source_file' => ' (קובץ במחשב שלך)',
# Image list
-"imagelist" => "רשימת תמונות",
-"imagelisttext" => "להלן רשימה של {{plural:$1|תמונה ×חת|$1 תמונות}}, ממוינות $2:",
-"imagelistforuser" => "מוצגות רק התמונות שהועלו על־ידי $1.",
-"getimagelist" => "מושך ×ת רשימת התמונות",
-"ilsubmit" => "חיפוש",
-"showlast" => "הצג $1 תמונות ×חרונות ממוינות $2",
-"byname" => "לפי ש×",
-"bydate" => "לפי ת×ריך",
-"bysize" => "לפי גודל",
-"imgdelete" => "מחק",
-"imgdesc" => "תי×ור",
-"imgfile" => "קובץ",
-"imglegend" => "מקר×: (תי×ור) הצג/ערוך תי×ור התמונה.",
-"imghistory" => "היסטורית קובץ תמונה",
-"revertimg" => "חזור",
-"deleteimg" => "מחק",
-"deleteimgcompletely" => "מחק ×ת כל גרס×ות התמונה",
-"imghistlegend" => "×ž×§×¨× (נוכ) = זו התמונה הנוכחית, (מחק) = מחק גרסה ישנה זו, (חזור) חזור לגרסה ישנה זו.<br />
+'imagelist' => 'רשימת תמונות',
+'imagelisttext' => 'להלן רשימה של {{plural:$1|תמונה ×חת|$1 תמונות}}, ממוינות $2:',
+'imagelistforuser' => 'מוצגות רק התמונות שהועלו על־ידי $1.',
+'getimagelist' => 'מושך ×ת רשימת התמונות',
+'ilsubmit' => 'חיפוש',
+'showlast' => 'הצג $1 תמונות ×חרונות ממוינות $2',
+'byname' => 'לפי ש×',
+'bydate' => 'לפי ת×ריך',
+'bysize' => 'לפי גודל',
+'imgdelete' => 'מחק',
+'imgdesc' => 'תי×ור',
+'imgfile' => 'קובץ',
+'imglegend' => 'מקר×: (תי×ור) הצג/ערוך תי×ור התמונה.',
+'imghistory' => 'היסטורית קובץ תמונה',
+'revertimg' => 'חזור',
+'deleteimg' => 'מחק',
+'deleteimgcompletely' => 'מחק ×ת כל גרס×ות התמונה',
+'imghistlegend' => "×ž×§×¨× (נוכ) = זו התמונה הנוכחית, (מחק) = מחק גרסה ישנה זו, (חזור) חזור לגרסה ישנה זו.<br />
'''לחצו על ת×ריך לר×ות ×ת התמונה שהועלתה בת×ריך ×–×”'''.",
-"imagelinks" => "קישורי תמונות",
-"linkstoimage" => "×”×“×¤×™× ×”×‘××™× ×ž×©×ª×ž×©×™× ×‘×ª×ž×•× ×” זו:",
-"nolinkstoimage" => "×ין ×“×¤×™× ×”×ž×©×ª×ž×©×™× ×‘×ª×ž×•× ×” זו.",
-"sharedupload" => "קובץ ×–×” ×”×•× ×§×•×‘×¥ משותף וניתן להשתמש בו ×’× ×‘××ª×¨×™× ×חרי×.",
-"shareduploadwiki" => "למידע נוסף, ר×ו ×ת $1.",
-"shareduploadwiki-linktext" => "דף תי×ור הקובץ",
-"noimage" => "×œ× × ×ž×¦× ×§×•×‘×¥ ×‘×©× ×–×”, ×ך יש ב××¤×©×¨×•×ª×›× $1 חלופי.",
-"noimage-linktext" => "להעלות קובץ",
-"uploadnewversion-linktext" => "העלו גרסה חדשה של קובץ זה",
-"imagelist_date" => "ת×ריך",
-"imagelist_name" => "ש×",
-"imagelist_user" => "משתמש",
-"imagelist_size" => "גודל (בתי×)",
-"imagelist_description" => "תי×ור",
-"imagelist_search_for" => "חיפוש תמונה בש×:",
+'imagelinks' => 'קישורי תמונות',
+'linkstoimage' => '×”×“×¤×™× ×”×‘××™× ×ž×©×ª×ž×©×™× ×‘×ª×ž×•× ×” זו:',
+'nolinkstoimage' => '×ין ×“×¤×™× ×”×ž×©×ª×ž×©×™× ×‘×ª×ž×•× ×” זו.',
+'sharedupload' => 'קובץ ×–×” ×”×•× ×§×•×‘×¥ משותף וניתן להשתמש בו ×’× ×‘××ª×¨×™× ×חרי×.',
+'shareduploadwiki' => 'למידע נוסף, ר×ו ×ת $1.',
+'shareduploadwiki-linktext' => 'דף תי×ור הקובץ',
+'noimage' => '×œ× × ×ž×¦× ×§×•×‘×¥ ×‘×©× ×–×”, ×ך יש ב××¤×©×¨×•×ª×›× $1 חלופי.',
+'noimage-linktext' => 'להעלות קובץ',
+'uploadnewversion-linktext' => 'העלו גרסה חדשה של קובץ זה',
+'imagelist_date' => 'ת×ריך',
+'imagelist_name' => 'ש×',
+'imagelist_user' => 'משתמש',
+'imagelist_size' => 'גודל (בתי×)',
+'imagelist_description' => 'תי×ור',
+'imagelist_search_for' => 'חיפוש תמונה בש×:',
# MIME search
-"mimesearch" => "חיפוש MIME",
-"mimetype" => "סוג MIME:",
-"download" => "הורדה",
+'mimesearch' => 'חיפוש MIME',
+'mimetype' => 'סוג MIME:',
+'download' => 'הורדה',
# Unwatched pages
-"unwatchedpages" => "×“×¤×™× ×©××™× × × ×¦×¤×™×",
+'unwatchedpages' => '×“×¤×™× ×©××™× × ×‘×ž×¢×§×‘',
# List redirects
-"listredirects" => "רשימת הפניות",
+'listredirects' => 'רשימת הפניות',
# Unused templates
-"unusedtemplates" => "תבניות ש×ינן בשימוש",
-"unusedtemplatestext" => "דף ×–×” מכיל רשימה של כל ×”×“×¤×™× ×‘×ž×¨×—×‘ ×”×©× ×©×œ התבניות ש××™× × × ×›×œ×œ×™× ×‘×“×£ ×חר. ×× × ×–×›×¨×• לבדוק ×ת ×”×§×™×©×•×¨×™× ×”××—×¨×™× ×œ×ª×‘× ×™×•×ª לפני שתמחקו ×ותן.",
-"unusedtemplateswlh" => "×§×™×©×•×¨×™× ×חרי×",
+'unusedtemplates' => 'תבניות ש×ינן בשימוש',
+'unusedtemplatestext' => 'דף ×–×” מכיל רשימה של כל ×”×“×¤×™× ×‘×ž×¨×—×‘ ×”×©× ×©×œ התבניות ש××™× × × ×›×œ×œ×™× ×‘×“×£ ×חר. ×× × ×–×›×¨×• לבדוק ×ת ×”×§×™×©×•×¨×™× ×”××—×¨×™× ×œ×ª×‘× ×™×•×ª לפני שתמחקו ×ותן.',
+'unusedtemplateswlh' => '×§×™×©×•×¨×™× ×חרי×',
# Random redirect
-"randomredirect" => "הפניה ×קר×ית",
+'randomredirect' => 'הפניה ×קר×ית',
# Statistics
-"statistics" => "סטטיסטיקות",
-"sitestats" => "סטטיסטיקות {{SITENAME}}",
-"userstats" => "סטטיסטיקות משתמשי×",
-"sitestatstext" => 'בבסיס ×”× ×ª×•× ×™× ×™×© בסך הכול \'\'\'$1\'\'\' דפי×. מספר ×–×” כולל ×“×¤×™× ×©××™× × ×“×¤×™ תוכן, כגון דפי שיחה, ×“×¤×™× ×ודות {{SITENAME}}, קצרמרי×, דפי תוכן ×œ×œ× ×§×™×©×•×¨×™× ×¤× ×™×ž×™×™×, הפניות, ×•×›×™×•×¦× ×‘×–×”. ×× ×œ× ×¡×•×¤×¨×™× ×ת ×”×“×¤×™× ×©××™× × ×“×¤×™ תוכן, נש××¨×™× \'\'\'$2\'\'\' ×“×¤×™× ×©×”× ×›×›×œ הנר××” דפי תוכן לכל דבר.
+'statistics' => 'סטטיסטיקות',
+'sitestats' => 'סטטיסטיקות {{SITENAME}}',
+'userstats' => 'סטטיסטיקות משתמשי×',
+'sitestatstext' => "בבסיס ×”× ×ª×•× ×™× ×™×© בסך הכול '''$1''' דפי×. מספר ×–×” כולל ×“×¤×™× ×©××™× × ×“×¤×™ תוכן, כגון דפי שיחה, ×“×¤×™× ×ודות {{SITENAME}}, קצרמרי×, דפי תוכן ×œ×œ× ×§×™×©×•×¨×™× ×¤× ×™×ž×™×™×, הפניות, ×•×›×™×•×¦× ×‘×–×”. ×× ×œ× ×¡×•×¤×¨×™× ×ת ×”×“×¤×™× ×©××™× × ×“×¤×™ תוכן, נש××¨×™× '''$2''' ×“×¤×™× ×©×”× ×›×›×œ הנר××” דפי תוכן לכל דבר.
-מ××– תחילת פעולתו של ×”×תר, היו ב×תר \'\'\'$3\'\'\' צפיות בדפי×, ובוצעו \'\'\'$4\'\'\' פעולות עריכה.
+מ××– תחילת פעולתו של ×”×תר, היו ב×תר '''$3''' צפיות בדפי×, ובוצעו '''$4''' פעולות עריכה.
-בסך הכול בוצעו בממוצע \'\'\'$5\'\'\' עריכות לדף, והיו \'\'\'$6\'\'\' צפיות לכל עריכה.
+בסך הכול בוצעו בממוצע '''$5''' עריכות לדף, והיו '''$6''' צפיות לכל עריכה.
-×ורך [http://meta.wikimedia.org/wiki/Help:Job_queue תור המשימות] ×”×•× \'\'\'$7\'\'\'.
+×ורך [http://meta.wikimedia.org/wiki/Help:Job_queue תור המשימות] ×”×•× '''$7'''.
-\'\'\'$8\'\'\' ×§×‘×¦×™× ×”×•×¢×œ×• ל×תר עד ×›×”.',
-"userstatstext" => "×™×©× × '''$1''' [[{{ns:special}}:Listusers|×ž×©×ª×ž×©×™× ×¨×©×•×ž×™×]] ב×תר, '''$2''' (×ו $4%) ×ž×ª×•×›× ×”× $5.",
-"statistics-mostpopular" => "×”×“×¤×™× ×”× ×¦×¤×™× ×‘×™×•×ª×¨",
+'''$8''' ×§×‘×¦×™× ×”×•×¢×œ×• ל×תר עד ×›×”.",
+'userstatstext' => "×™×©× × '''$1''' [[{{ns:special}}:Listusers|×ž×©×ª×ž×©×™× ×¨×©×•×ž×™×]] ב×תר, '''$2''' (×ו $4%) ×ž×ª×•×›× ×”× $5.",
+'statistics-mostpopular' => '×”×“×¤×™× ×”× ×¦×¤×™× ×‘×™×•×ª×¨',
-# Disambiguations Page
-"disambiguations" => "דפי פירושוני×",
-"disambiguationspage" => "{{ns:template}}:פירושוני×",
-"disambiguationstext" => "<p>×”×“×¤×™× ×©×œ×”×œ×Ÿ ×ž×§×©×¨×™× ×ל <b>דפי פירושוני×</b>. תפקיד ×“×¤×™× ×לה ×”×•× ×œ×”×¤× ×•×ª לדף ×”× ×•×©× ×”×¨×œ×•×•× ×˜×™.</p>
+'disambiguations' => 'דפי פירושוני×',
+'disambiguationspage' => '{{ns:template}}:פירושוני×',
+'disambiguationstext' => '<p>×”×“×¤×™× ×©×œ×”×œ×Ÿ ×ž×§×©×¨×™× ×ל <b>דפי פירושוני×</b>. תפקיד ×“×¤×™× ×לה ×”×•× ×œ×”×¤× ×•×ª לדף ×”× ×•×©× ×”×¨×œ×•×•× ×˜×™.</p>
<p>×נו ×ž×ª×™×™×—×¡×™× ×œ×“×£ כדף ×¤×™×¨×•×©×•× ×™× ×× ×”×•× ×ž×§×•×©×¨ לדף $1.</p>
-<p>×§×™×©×•×¨×™× ×”×ž×’×™×¢×™× ×œ×“×£ ממרחבי ×©× ××—×¨×™× <b>××™× ×</b> ×ž×•×¦×’×™× ×›×ן.</p>",
+<p>×§×™×©×•×¨×™× ×”×ž×’×™×¢×™× ×œ×“×£ ממרחבי ×©× ××—×¨×™× <b>××™× ×</b> ×ž×•×¦×’×™× ×›×ן.</p>',
-# Double redirects page
-"doubleredirects" => "הפניות כפולות",
-"doubleredirectstext" => "<p><b>שימו לב</b>: רשימה זו עלולה לכלול ×“×¤×™× ×©× ×ž×¦×ו בטעות – כלומר, ×“×¤×™× ×©×™×© ×‘×”× ×˜×§×¡×˜ נוסף הכולל ×§×™×©×•×¨×™× ×ž×ª×—×ª ל־#REDIRECT הר×שון.</p>
+'doubleredirects' => 'הפניות כפולות',
+'doubleredirectstext' => '<p><b>שימו לב</b>: רשימה זו עלולה לכלול ×“×¤×™× ×©× ×ž×¦×ו בטעות – כלומר, ×“×¤×™× ×©×™×© ×‘×”× ×˜×§×¡×˜ נוסף הכולל ×§×™×©×•×¨×™× ×ž×ª×—×ª ל־#REDIRECT הר×שון.</p>
-<p>כל שורה מכילה קישור להפניות הר×שונה והשנייה, וכן ×ת שורת הטקסט הר×שונה של ההפניה השנייה, שלרוב × ×ž×¦× ×‘×” היעד ×”×מיתי של ההפניה, ×ליו ×מורה ההפניה הר×שונה להצביע.</p>",
+<p>כל שורה מכילה קישור להפניות הר×שונה והשנייה, וכן ×ת שורת הטקסט הר×שונה של ההפניה השנייה, שלרוב × ×ž×¦× ×‘×” היעד ×”×מיתי של ההפניה, ×ליו ×מורה ההפניה הר×שונה להצביע.</p>',
-# Broken redirects page
-"brokenredirects" => "הפניות ×œ× ×ª×§×™× ×•×ª",
-"brokenredirectstext" => "ההפניות שלהלן מפנות ×œ×“×¤×™× ×©××™× × ×§×™×™×ž×™×:",
+'brokenredirects' => 'הפניות ×œ× ×ª×§×™× ×•×ª',
+'brokenredirectstext' => 'ההפניות שלהלן מפנות ×œ×“×¤×™× ×©××™× × ×§×™×™×ž×™×:',
# Miscellaneous special pages
-"nbytes" => "{{plural:$1|בית ×חד|$1 בתי×}}",
-"ncategories" => "{{plural:$1|קטגוריה ×חת|$1 קטגוריות}}",
-"nlinks" => "{{plural:$1|קישור ×חד|$1 קישורי×}}",
-"nmembers" => "{{plural:$1|דף ×חד|$1 דפי×}}",
-"nrevisions" => "{{plural:$1|גרסה ×חת|$1 גרס×ות}}",
-"nviews" => "{{plural:$1|צפיה ×חת|$1 צפיות}}",
-
-"lonelypages" => "×“×¤×™× ×™×ª×•×ž×™×",
-"lonelypagestext" => "×œ×“×¤×™× ×”×‘××™× ×ין ×§×™×©×•×¨×™× ×ž×“×¤×™× ××—×¨×™× ×‘×תר ×–×”.",
-"uncategorizedpages" => "×“×¤×™× ×—×¡×¨×™ קטגוריה",
-"uncategorizedcategories" => "קטגוריות חסרות קטגוריה",
-"uncategorizedimages" => "תמונות חסרות קטגוריה",
-"unusedcategories" => "קטגוריות ש×ינן בשימוש",
-"unusedimages" => "תמונות ש×ינן בשימוש",
-"popularpages" => "×“×¤×™× ×¤×•×¤×•×œ×¨×™×™×",
-"wantedcategories" => "קטגוריות מבוקשות",
-"wantedpages" => "×“×¤×™× ×ž×‘×•×§×©×™×",
-"mostlinked" => "×”×“×¤×™× ×”×ž×§×•×©×¨×™× ×‘×™×•×ª×¨",
-"mostlinkedcategories" => "הקטגוריות המקושרות ביותר",
-"mostcategories" => "×”×“×¤×™× ×ž×¨×•×‘×™Ö¾×”×§×˜×’×•×¨×™×•×ª ביותר",
-"mostimages" => "התמונות המקושרות ביותר",
-"mostrevisions" => "×”×“×¤×™× ×‘×¢×œ×™ מספר העריכות הגבוה ביותר",
-"allpages" => "כל הדפי×",
-"prefixindex" => "רשימת ×”×“×¤×™× ×”×ž×ª×—×™×œ×™× ×‘â€¦",
-"randompage" => "דף ×קר××™",
-"shortpages" => "×“×¤×™× ×§×¦×¨×™×",
-"longpages" => "×“×¤×™× ×רוכי×",
-"deadendpages" => "×“×¤×™× ×œ×œ× ×§×™×©×•×¨×™×",
-"deadendpagestext" => "×”×“×¤×™× ×”×‘××™× ××™× × ×ž×§×©×¨×™× ×œ×“×¤×™× ××—×¨×™× ×‘×תר.",
-"listusers" => "רשימת משתמשי×",
-"specialpages" => "×“×¤×™× ×ž×™×•×—×“×™×",
-"spheading" => "×“×¤×™× ×ž×™×•×—×“×™×",
-"restrictedpheading" => "×“×¤×™× ×ž×™×•×—×“×™× ×ž×•×’×‘×œ×™×",
-"recentchangeslinked" => "×©×™× ×•×™×™× ×‘×“×¤×™× ×”×ž×§×•×©×¨×™×",
-"rclsub" => '(×œ×“×¤×™× ×”×ž×§×•×©×¨×™× ×ž×”×“×£ "$1")',
-"newpages" => "×“×¤×™× ×—×“×©×™×",
-"newpages-username" => "×©× ×ž×©×ª×ž×©:",
-"ancientpages" => "×“×¤×™× ×ž×•×–× ×—×™×",
-"intl" => "×§×™×©×•×¨×™× ×‘×™× ×œ×©×•× ×™×™×",
-"move" => "העבר",
-"movethispage" => "העבר דף זה",
-"unusedimagestext" => "רשימת ×”×§×‘×¦×™× ×©××™× × ×‘×©×™×ž×•×© ב×תר. יש ×œ×ž×¦×•× ×ž×§×•× ×¢×‘×•×¨ ×”×§×‘×¦×™× ×ו לסמן ××•×ª× ×œ×ž×—×™×§×”.",
-"unusedcategoriestext" => "למרות שהקטגוריות הב×ות קיימות, ×ין ×©×•× ×“×£ בו נעשה בהן שימוש.",
-
-"booksources" => "מש×בי ספרות חיצוניי×",
-"categoriespagetext" => "×לו הקטגוריות הקיימות ב×תר.",
-"data" => "נתוני×",
-"userrights" => "ניהול הרש×ות משתמש",
-"groups" => "קבוצות משתמשי×",
-
-"booksourcetext" => "להלן רשימת ×§×™×©×•×¨×™× ×œ××ª×¨×™× ××—×¨×™× ×”×ž×•×›×¨×™× ×¡×¤×¨×™× ×—×“×©×™× ×•×™×“Ö¾×©× ×™×™×”, ×•×©×‘×”× ×¢×©×•×™ להיות מידע נוסף לגבי ×¡×¤×¨×™× ×©××ª× ×ž×—×¤×©×™×. ל×תר ×ין קשר ×œ×¢×§×¡×™× ×לו, ו×ין לר×ות ברשימה זו המלצה, ×¤×¨×¡×•× ×ו עידוד לעשות שימוש ב××ª×¨×™× ×לו ספציפית.",
-"isbn" => "ISBN",
-"alphaindexline" => "$1 עד $2",
-"version" => "גרסת התוכנה",
-"log" => "יומני×",
-"alllogstext" => "תצוגה משולבת של יומני העל×ת קבצי×, מחיקות והגנות על דפי×, חסימת ×ž×©×ª×ž×©×™× ×•×ž×™× ×•×™ מפעילי מערכת.
-
-ניתן ×œ×¦×ž×¦× ×ת התצוגה על־ידי בחירת סוג היומן, ×©× ×”×ž×©×ª×ž×© ×ו ×”×“×¤×™× ×”×ž×•×©×¤×¢×™×.",
-"logempty" => "×ין ×¤×¨×™×˜×™× ×ª×•××ž×™× ×‘×™×•×ž×Ÿ.",
+'nbytes' => '{{plural:$1|בית ×חד|$1 בתי×}}',
+'ncategories' => '{{plural:$1|קטגוריה ×חת|$1 קטגוריות}}',
+'nlinks' => '{{plural:$1|קישור ×חד|$1 קישורי×}}',
+'nmembers' => '{{plural:$1|דף ×חד|$1 דפי×}}',
+'nrevisions' => '{{plural:$1|גרסה ×חת|$1 גרס×ות}}',
+'nviews' => '{{plural:$1|צפיה ×חת|$1 צפיות}}',
+'lonelypages' => '×“×¤×™× ×™×ª×•×ž×™×',
+'lonelypagestext' => '×œ×“×¤×™× ×”×‘××™× ×ין ×§×™×©×•×¨×™× ×ž×“×¤×™× ××—×¨×™× ×‘×תר ×–×”.',
+'uncategorizedpages' => '×“×¤×™× ×—×¡×¨×™ קטגוריה',
+'uncategorizedcategories' => 'קטגוריות חסרות קטגוריה',
+'uncategorizedimages' => 'תמונות חסרות קטגוריה',
+'unusedcategories' => 'קטגוריות ש×ינן בשימוש',
+'unusedimages' => 'תמונות ש×ינן בשימוש',
+'popularpages' => '×“×¤×™× ×¤×•×¤×•×œ×¨×™×™×',
+'wantedcategories' => 'קטגוריות מבוקשות',
+'wantedpages' => '×“×¤×™× ×ž×‘×•×§×©×™×',
+'mostlinked' => '×”×“×¤×™× ×”×ž×§×•×©×¨×™× ×‘×™×•×ª×¨',
+'mostlinkedcategories' => 'הקטגוריות המקושרות ביותר',
+'mostcategories' => '×”×“×¤×™× ×ž×¨×•×‘×™Ö¾×”×§×˜×’×•×¨×™×•×ª ביותר',
+'mostimages' => 'התמונות המקושרות ביותר',
+'mostrevisions' => '×”×“×¤×™× ×‘×¢×œ×™ מספר העריכות הגבוה ביותר',
+'allpages' => 'כל הדפי×',
+'prefixindex' => 'רשימת ×”×“×¤×™× ×”×ž×ª×—×™×œ×™× ×‘â€¦',
+'randompage' => 'דף ×קר××™',
+'shortpages' => '×“×¤×™× ×§×¦×¨×™×',
+'longpages' => '×“×¤×™× ×רוכי×',
+'deadendpages' => '×“×¤×™× ×œ×œ× ×§×™×©×•×¨×™×',
+'deadendpagestext' => '×”×“×¤×™× ×”×‘××™× ××™× × ×ž×§×©×¨×™× ×œ×“×¤×™× ××—×¨×™× ×‘×תר.',
+'listusers' => 'רשימת משתמשי×',
+'specialpages' => '×“×¤×™× ×ž×™×•×—×“×™×',
+'spheading' => '×“×¤×™× ×ž×™×•×—×“×™×',
+'restrictedpheading' => '×“×¤×™× ×ž×™×•×—×“×™× ×ž×•×’×‘×œ×™×',
+'recentchangeslinked' => '×©×™× ×•×™×™× ×‘×“×¤×™× ×”×ž×§×•×©×¨×™×',
+'rclsub' => '(×œ×“×¤×™× ×”×ž×§×•×©×¨×™× ×ž×”×“×£ "$1")',
+'newpages' => '×“×¤×™× ×—×“×©×™×',
+'newpages-username' => '×©× ×ž×©×ª×ž×©:',
+'ancientpages' => '×“×¤×™× ×ž×•×–× ×—×™×',
+'intl' => '×§×™×©×•×¨×™× ×‘×™× ×œ×©×•× ×™×™×',
+'move' => 'העברה',
+'movethispage' => 'העבר דף זה',
+'unusedimagestext' => 'רשימת ×”×§×‘×¦×™× ×©××™× × ×‘×©×™×ž×•×© ב×תר. יש ×œ×ž×¦×•× ×ž×§×•× ×¢×‘×•×¨ ×”×§×‘×¦×™× ×ו לסמן ××•×ª× ×œ×ž×—×™×§×”.',
+'unusedcategoriestext' => 'למרות שהקטגוריות הב×ות קיימות, ×ין ×©×•× ×“×£ בו נעשה בהן שימוש.',
+
+# Book sources
+'booksources' => 'מש×בי ספרות חיצוניי×',
+'booksources-search-legend' => 'חיפוש מש×בי ספרות חיצוניי×',
+'booksources-isbn' => 'ISBN:',
+'booksources-go' => 'עבור',
+'booksources-text' => 'להלן רשימת ×§×™×©×•×¨×™× ×œ××ª×¨×™× ××—×¨×™× ×”×ž×•×›×¨×™× ×¡×¤×¨×™× ×—×“×©×™× ×•×™×“Ö¾×©× ×™×™×”, ×•×©×‘×”× ×¢×©×•×™ להיות מידע נוסף לגבי ×¡×¤×¨×™× ×©××ª× ×ž×—×¤×©×™×:',
+
+'categoriespagetext' => '×לו הקטגוריות הקיימות ב×תר.',
+'data' => 'נתוני×',
+'userrights' => 'ניהול הרש×ות משתמש',
+'groups' => 'קבוצות משתמשי×',
+'isbn' => 'ISBN',
+'alphaindexline' => '$1 עד $2',
+'version' => 'גרסת התוכנה',
+'log' => 'יומני×',
+'alllogstext' => 'תצוגה משולבת של יומני העל×ת קבצי×, מחיקות והגנות על דפי×, חסימת ×ž×©×ª×ž×©×™× ×•×ž×™× ×•×™ מפעילי מערכת.
+
+ניתן ×œ×¦×ž×¦× ×ת התצוגה על־ידי בחירת סוג היומן, ×©× ×”×ž×©×ª×ž×© ×ו ×”×“×¤×™× ×”×ž×•×©×¤×¢×™×.',
+'logempty' => '×ין ×¤×¨×™×˜×™× ×ª×•××ž×™× ×‘×™×•×ž×Ÿ.',
# Special:Allpages
-"nextpage" => "הדף ×”×‘× ($1)",
-"allpagesfrom" => "הצג ×“×¤×™× ×”×—×œ מ:",
-"allarticles" => "כל הדפי×",
-"allinnamespace" => "כל ×”×“×¤×™× (מרחב ×©× $1)",
-"allnotinnamespace" => "כל ×”×“×¤×™× (×©×œ× ×‘×ž×¨×—×‘ ×”×©× $1)",
-"allpagesprev" => "הקוד×",
-"allpagesnext" => "הב×",
-"allpagessubmit" => "עבור",
-"allpagesprefix" => "×”×“×¤×™× ×©×©×ž× ×ž×ª×—×™×œ ב…:",
-"allpagesbadtitle" => "כותרת הדף המבוקש הייתה ל×־חוקית, ריקה, קישור ויקי פנימי, ×ו ×¤× ×™× ×©×¤×” שגוי. ייתכן ×©×”×™× ×›×•×œ×œ×ª תו ×חד ×ו יותר ×”××¡×•×¨×™× ×œ×©×™×ž×•×© בכותרות.",
+'nextpage' => 'הדף ×”×‘× ($1)',
+'prevpage' => 'הדף ×”×§×•×“× ($1)',
+'allpagesfrom' => 'הצג ×“×¤×™× ×”×—×œ מ:',
+'allarticles' => 'כל הדפי×',
+'allinnamespace' => 'כל ×”×“×¤×™× (מרחב ×©× $1)',
+'allnotinnamespace' => 'כל ×”×“×¤×™× (×©×œ× ×‘×ž×¨×—×‘ ×”×©× $1)',
+'allpagesprev' => 'הקוד×',
+'allpagesnext' => 'הב×',
+'allpagessubmit' => 'עבור',
+'allpagesprefix' => '×”×“×¤×™× ×©×©×ž× ×ž×ª×—×™×œ ב…:',
+'allpagesbadtitle' => 'כותרת הדף המבוקש הייתה ל×־חוקית, ריקה, קישור ויקי פנימי, ×ו ×¤× ×™× ×©×¤×” שגוי. ייתכן ×©×”×™× ×›×•×œ×œ×ª תו ×חד ×ו יותר ×”××¡×•×¨×™× ×œ×©×™×ž×•×© בכותרות.',
# Special:Listusers
-"listusersfrom" => "הצג ×ž×©×ª×ž×©×™× ×”×—×œ מ:",
-
-# Email this user
-"mailnologin" => "×ין כתובת לשליחה",
-"mailnologintext" => "×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]] ולהגדיר ×œ×¢×¦×ž×›× ×›×ª×•×‘×ª דו×ר ×לקטרוני תקינה ב[[{{ns:special}}:Preferences|העדפות המשתמש]] ×©×œ×›× ×›×“×™ לשלוח דו×ר למשתמש ×חר.",
-"emailuser" => "שלחו דו×ר ×לקטרוני למשתמש ×–×”",
-"emailpage" => "שלחו דו×ר למשתמש",
-"emailpagetext" => "×× ×”×ž×©×ª×ž×© הזין כתובת דו×ר ×לקטרוני חוקית בהעדפותיו ×”×ישיות, הטופס שלהלן ישלח ×ליו הודעת דו×ר ×חת. כתובת הדו×ר ×”×לקטרוני ×©×”×–× ×ª× ×‘×”×¢×“×¤×•×ª×™×›× ×”×ישיות תופיע ככתובת ממנה נשלחה ההודעה כדי שהמשתמש יוכל לענות.",
-"usermailererror" => "×וביקט הדו×ר החזיר שגי××”:",
-"defemailsubject" => 'דו×"ל {{SITENAME}}',
-"noemailtitle" => "×ין כתובת דו×ר ×לקטרוני",
-"noemailtext" => "משתמש ×–×” ×œ× ×”×–×™×Ÿ כתובת דו×ר ×לקטרוני חוקית ×ו בחר ×©×œ× ×œ×§×‘×œ דו×ר ×לקטרוני ×ž×ž×©×ª×ž×©×™× ×חרי×.",
-"emailfrom" => "מ×ת",
-"emailto" => "×ל",
-"emailsubject" => "נוש×",
-"emailmessage" => "הודעה",
-"emailsend" => "שלח",
-"emailsent" => "הדו×ר נשלח",
-"emailsenttext" => "הודעת הדו×ר ×”×לקטרוני שלך נשלחה.",
+'listusersfrom' => 'הצג ×ž×©×ª×ž×©×™× ×”×—×œ מ:',
+
+# E-mail user
+'mailnologin' => '×ין כתובת לשליחה',
+'mailnologintext' => '×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]] ולהגדיר ×œ×¢×¦×ž×›× ×›×ª×•×‘×ª דו×ר ×לקטרוני תקינה ב[[{{ns:special}}:Preferences|העדפות המשתמש]] ×©×œ×›× ×›×“×™ לשלוח דו×ר למשתמש ×חר.',
+'emailuser' => 'שלחו דו×ר ×לקטרוני למשתמש ×–×”',
+'emailpage' => 'שלחו דו×ר למשתמש',
+'emailpagetext' => '×× ×”×ž×©×ª×ž×© הזין כתובת דו×ר ×לקטרוני חוקית בהעדפותיו ×”×ישיות, הטופס שלהלן ישלח ×ליו הודעת דו×ר ×חת. כתובת הדו×ר ×”×לקטרוני ×©×”×–× ×ª× ×‘×”×¢×“×¤×•×ª×™×›× ×”×ישיות תופיע ככתובת ממנה נשלחה ההודעה כדי שהמשתמש יוכל לענות.',
+'usermailererror' => '×וביקט הדו×ר החזיר שגי××”:',
+'defemailsubject' => 'דו×"ל {{SITENAME}}',
+'noemailtitle' => '×ין כתובת דו×ר ×לקטרוני',
+'noemailtext' => 'משתמש ×–×” ×œ× ×”×–×™×Ÿ כתובת דו×ר ×לקטרוני חוקית ×ו בחר ×©×œ× ×œ×§×‘×œ דו×ר ×לקטרוני ×ž×ž×©×ª×ž×©×™× ×חרי×.',
+'emailfrom' => 'מ×ת',
+'emailto' => '×ל',
+'emailsubject' => 'נוש×',
+'emailmessage' => 'הודעה',
+'emailsend' => 'שלח',
+'emailccme' => 'שלח ×לי בדו×ר ×”×לקטרוני העתק של הודעתי.',
+'emailccsubject' => 'העתק של הודעתך למשתמש $1: $2',
+'emailsent' => 'הדו×ר נשלח',
+'emailsenttext' => 'הודעת הדו×ר ×”×לקטרוני שלך נשלחה.',
# Watchlist
-"watchlist" => "רשימת המעקב שלי",
-"watchlistfor" => "(עבור '''$1''')",
-"nowatchlist" => "×ין ×“×¤×™× ×‘×¨×©×™×ž×ª המעקב.",
-"watchlistanontext" => "×¢×œ×™×›× $1 כדי לצפות ×ו לערוך ×¤×¨×™×˜×™× ×‘×¨×©×™×ž×ª המעקב.",
-"watchlistcount" => "'''יש ×œ×›× $1 ×¤×¨×™×˜×™× ×‘×¨×©×™×ž×ª המעקב, כולל דפי שיחה.'''",
-"clearwatchlist" => "ניקוי רשימת המעקב",
-"watchlistcleartext" => "×”×× ××ª× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×”×¡×™×¨×?",
-"watchlistclearbutton" => "נקה ×ת רשימת המעקב",
-"watchlistcleardone" => "רשימת המעקב רוקנה. {{plural:$1|פריט ×חד הוסר|$1 ×¤×¨×™×˜×™× ×”×•×¡×¨×•}} ממנה.",
-"watchnologin" => "×œ× × ×›× ×¡×ª× ×œ×תר",
-"watchnologintext" => "×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]] כדי לערוך ×ת רשימת המעקב.",
-"addedwatch" => "הדף נוסף לרשימת המעקב",
-"addedwatchtext" => 'הדף "[[:$1]]" נוסף ל[[{{ns:special}}:Watchlist|רשימת המעקב]]. ×©×™× ×•×™×™× ×©×™×™×¢×¨×›×• בעתיד, בדף ×–×” ובדף השיחה שלו, יוצגו ברשימת המעקב.
+'watchlist' => 'רשימת המעקב שלי',
+'watchlistfor' => "(עבור '''$1''')",
+'nowatchlist' => '×ין ×“×¤×™× ×‘×¨×©×™×ž×ª המעקב.',
+'watchlistanontext' => '×¢×œ×™×›× $1 כדי לצפות ×ו לערוך ×¤×¨×™×˜×™× ×‘×¨×©×™×ž×ª המעקב.',
+'watchlistcount' => "'''יש ×œ×›× $1 ×¤×¨×™×˜×™× ×‘×¨×©×™×ž×ª המעקב, כולל דפי שיחה.'''",
+'clearwatchlist' => 'ניקוי רשימת המעקב',
+'watchlistcleartext' => '×”×× ××ª× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×”×¡×™×¨×?',
+'watchlistclearbutton' => 'נקה ×ת רשימת המעקב',
+'watchlistcleardone' => 'רשימת המעקב רוקנה. {{plural:$1|פריט ×חד הוסר|$1 ×¤×¨×™×˜×™× ×”×•×¡×¨×•}} ממנה.',
+'watchnologin' => '×œ× × ×›× ×¡×ª× ×œ×תר',
+'watchnologintext' => '×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]] כדי לערוך ×ת רשימת המעקב.',
+'addedwatch' => 'הדף נוסף לרשימת המעקב',
+'addedwatchtext' => 'הדף "[[:$1]]" נוסף ל[[{{ns:special}}:Watchlist|רשימת המעקב]]. ×©×™× ×•×™×™× ×©×™×™×¢×¨×›×• בעתיד, בדף ×–×” ובדף השיחה שלו, יוצגו ברשימת המעקב.
בנוסף, הדף יופיע בכתב מודגש ב[[{{ns:special}}:Recentchanges|רשימת ×”×©×™× ×•×™×™× ×”×חרוני×]], כדי להקל ×¢×œ×™×›× ×ת המעקב ×חריו.
-×× ×ª×¨×¦×• להסיר ×ת הדף מרשימת המעקב, לחצו על הלשונית "הפסק לעקוב" שלמעלה.',
-"removedwatch" => "הדף הוסר מרשימת המעקב",
-"removedwatchtext" => 'הדף "[[:$1]]" הוסר מ[[{{ns:special}}:Watchlist|רשימת המעקב]].',
-"watch" => "עקוב",
-"watchthispage" => "עקבו ×חר דף ×–×”",
-"unwatch" => "הפסק לעקוב",
-"unwatchthispage" => "הפסיקו לעקוב ×חר דף ×–×”",
-"notanarticle" => "זהו ×ינו דף תוכן",
-"watchnochange" => "××£ ×חד ×ž×”×“×¤×™× ×‘×¨×©×™×ž×ª המעקב ×œ× ×¢×•×“×›×Ÿ בפרק הזמן המצוין למעלה.",
-"watchdetails" => "* ברשימת המעקב יש {{plural:$1|דף ×חד|$1 דפי×}} (×œ× ×›×•×œ×œ דפי שיחה).
+×× ×ª×¨×¦×• להסיר ×ת הדף מרשימת המעקב, לחצו על הלשונית "הפסקת מעקב" שלמעלה.',
+'removedwatch' => 'הדף הוסר מרשימת המעקב',
+'removedwatchtext' => 'הדף "[[:$1]]" הוסר מ[[{{ns:special}}:Watchlist|רשימת המעקב]].',
+'watch' => 'מעקב',
+'watchthispage' => 'עקוב ×חר דף ×–×”',
+'unwatch' => 'הפסקת מעקב',
+'unwatchthispage' => 'הפסק לעקוב ×חר דף ×–×”',
+'notanarticle' => 'זהו ×ינו דף תוכן',
+'watchnochange' => '××£ ×חד ×ž×”×“×¤×™× ×‘×¨×©×™×ž×ª המעקב ×œ× ×¢×•×“×›×Ÿ בפרק הזמן המצוין למעלה.',
+'watchdetails' => '* ברשימת המעקב יש {{plural:$1|דף ×חד|$1 דפי×}} (×œ× ×›×•×œ×œ דפי שיחה).
* [[{{ns:special}}:Watchlist/edit|הצגה ועריכה של רשימת המעקב במלו××”]].
-* [[{{ns:special}}:Watchlist/clear|הסרת כל הדפי×]].",
-"wlheader-enotif" => '* הודעות דו×"ל מ×ופשרות.',
-"wlheader-showupdated" => "* ×“×¤×™× ×©×”×©×ª× ×• מ××– ×‘×™×§×•×¨×›× ×”×חרון ×‘×”× ×ž×•×¦×’×™× ×‘'''הדגשה'''.",
-"watchmethod-recent" => "בודק ×ת ×”×“×¤×™× ×©×‘×¨×©×™×ž×ª המעקב ×œ×©×™× ×•×™×™× ×חרוני×.",
-"watchmethod-list" => "בודק ×ת העריכות ×”×חרונות ×‘×“×¤×™× ×©×‘×¨×©×™×ž×ª המעקב",
-"removechecked" => "הסר ×“×¤×™× ×ž×¡×•×ž× ×™× ×ž×¨×©×™×ž×ª המעקב",
-"watchlistcontains" => "רשימת המעקב כוללת $1 דפי×.",
-"watcheditlist" => 'להלן רשימה מסודרת של ×”×“×¤×™× ×‘×¨×©×™×ž×ª המעקב. בחרו ×ת ×”×“×¤×™× ×©××ª× ×¨×•×¦×™× ×œ×”×¡×™×¨ מהרשימה ולחצו על "הסר ×“×¤×™× ×ž×¡×•×ž× ×™×" בתחתית הדף (הסרת דף ×’× ×ž×¡×™×¨×” ×ת דף השיחה שלו, ×•×›×™×•×¦× ×‘×–×”).',
-"removingchecked" => "מסיר ×ת ×”×“×¤×™× ×”×ž×¡×•×ž× ×™× ×ž×¨×©×™×ž×ª המעקב…",
-"couldntremove" => "×œ× × ×™×ª×Ÿ להסיר ×ת $1…",
-"iteminvalidname" => "בעיה ×¢× $1, ×©× ×©×’×•×™â€¦",
-"wlnote" => "להלן $1 ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×‘Ö¾'''$2''' השעות ×”×חרונות.",
-"wlshowlast" => "(הצג $1 שעות ×חרונות | $2 ×™×ž×™× ××—×¨×•× ×™× | $3)",
-"wlsaved" => "זוהי גרסה שמורה של רשימת המעקב.",
-"wlhideshowown" => "$1 עריכות שלי",
-"wlhideshowbots" => "$1 בוטי×",
-"wldone" => "בוצע.",
-
-"enotif_mailer" => "הודעות {{SITENAME}}",
-"enotif_reset" => "סמן ×ת כל ×”×“×¤×™× ×›×ילו נצפו",
-"enotif_newpagetext" => "זהו דף חדש.",
-"changed" => "שונה",
-"created" => "נוצר",
-"enotif_subject" => 'הדף $PAGETITLE ב{{grammar:תחילית|{{SITENAME}}}} $CHANGEDORCREATED על־ידי $PAGEEDITOR',
-"enotif_lastvisited" => "ר×ו $1 לכל ×”×©×™× ×•×™×™× ×ž××– ×‘×™×§×•×¨×›× ×”×חרון.",
-"enotif_body" => 'לכבוד $WATCHINGUSERNAME,
+* [[{{ns:special}}:Watchlist/clear|הסרת כל הדפי×]].',
+'wlheader-enotif' => '* הודעות דו×"ל מ×ופשרות.',
+'wlheader-showupdated' => "* ×“×¤×™× ×©×”×©×ª× ×• מ××– ×‘×™×§×•×¨×›× ×”×חרון ×‘×”× ×ž×•×¦×’×™× ×‘'''הדגשה'''.",
+'watchmethod-recent' => 'בודק ×ת ×”×“×¤×™× ×©×‘×¨×©×™×ž×ª המעקב ×œ×©×™× ×•×™×™× ×חרוני×.',
+'watchmethod-list' => 'בודק ×ת העריכות ×”×חרונות ×‘×“×¤×™× ×©×‘×¨×©×™×ž×ª המעקב',
+'removechecked' => 'הסר ×“×¤×™× ×ž×¡×•×ž× ×™× ×ž×¨×©×™×ž×ª המעקב',
+'watchlistcontains' => 'רשימת המעקב כוללת $1 דפי×.',
+'watcheditlist' => 'להלן רשימה מסודרת של ×”×“×¤×™× ×‘×¨×©×™×ž×ª המעקב. בחרו ×ת ×”×“×¤×™× ×©××ª× ×¨×•×¦×™× ×œ×”×¡×™×¨ מהרשימה ולחצו על "הסר ×“×¤×™× ×ž×¡×•×ž× ×™×" בתחתית הדף (הסרת דף ×’× ×ž×¡×™×¨×” ×ת דף השיחה שלו, ×•×›×™×•×¦× ×‘×–×”).',
+'removingchecked' => 'מסיר ×ת ×”×“×¤×™× ×”×ž×¡×•×ž× ×™× ×ž×¨×©×™×ž×ª המעקב…',
+'couldntremove' => '×œ× × ×™×ª×Ÿ להסיר ×ת $1…',
+'iteminvalidname' => 'בעיה ×¢× $1, ×©× ×©×’×•×™â€¦',
+'wlnote' => "להלן $1 ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×‘Ö¾'''$2''' השעות ×”×חרונות.",
+'wlshowlast' => '(הצג $1 שעות ×חרונות | $2 ×™×ž×™× ××—×¨×•× ×™× | $3)',
+'wlsaved' => 'זוהי גרסה שמורה של רשימת המעקב.',
+'watchlist-show-bots' => 'הצג בוטי×',
+'watchlist-hide-bots' => 'הסתר בוטי×',
+'watchlist-show-own' => 'הצג עריכות שלי',
+'watchlist-hide-own' => 'הסתר עריכות שלי',
+'watchlist-show-minor' => 'הצג עריכות משניות',
+'watchlist-hide-minor' => 'הסתר עריכות משניות',
+'wldone' => 'בוצע.',
+
+# Displayed when you click the "watch" button and it's in the process of watching
+'watching' => 'מוסיף לרשימת המעקב…',
+'unwatching' => 'מסיר מרשימת המעקב…',
+
+'enotif_mailer' => 'הודעות {{SITENAME}}',
+'enotif_reset' => 'סמן ×ת כל ×”×“×¤×™× ×›×ילו נצפו',
+'enotif_newpagetext' => 'זהו דף חדש.',
+'changed' => 'שונה',
+'created' => 'נוצר',
+'enotif_subject' => 'הדף $PAGETITLE ב{{grammar:תחילית|{{SITENAME}}}} $CHANGEDORCREATED על־ידי $PAGEEDITOR',
+'enotif_lastvisited' => 'ר×ו $1 לכל ×”×©×™× ×•×™×™× ×ž××– ×‘×™×§×•×¨×›× ×”×חרון.',
+'enotif_body' => 'לכבוד $WATCHINGUSERNAME,
הדף $PAGETITLE ב{{grammar:תחילית|{{SITENAME}}}} $CHANGEDORCREATED ב־$PAGEEDITDATE על־ידי $PAGEEDITOR, ר×ו $PAGETITLE_URL לגרסה הנוכחית.
@@ -1233,219 +1288,223 @@ $NEWPAGE
{{fullurl:{{ns:project}}:עזרה}}',
# Delete/protect/revert
-"deletepage" => "מחיקת דף",
-"confirm" => "×ישור",
-"excontent" => 'תוכן היה: "$1"',
-"excontentauthor" => "תוכן ×”×™×”: '$1' ×•×”×ª×•×¨× ×”×™×—×™×“ ×”×™×” [[{{ns:special}}:Contributions/$2|$2]]",
-"exbeforeblank" => 'תוכן לפני שהורק היה: "$1"',
-"exblank" => "הדף היה ריק",
-"confirmdelete" => "×ישור מחיקת הדף",
-"deletesub" => '(מוחק ×ת "$1")',
-"historywarning" => "×זהרה – לדף ש××ª× ×¢×•×ž×“×™× ×œ×ž×—×•×§ יש היסטוריית שינויי×:",
-"confirmdeletetext" => "××ª× ×¢×•×ž×“×™× ×œ×ž×—×•×§ דף ×ו תמונה, יחד ×¢× ×›×œ ההיסטוריה שלה×, מבסיס הנתוני×.
-
-×× × ×שרו שזה ×כן מה ש××ª× ×ž×ª×›×•×•× ×™× ×œ×¢×©×•×ª, ש××ª× ×ž×‘×™× ×™× ×ת התוצ×ות של מעשה ×›×–×”, ושהמעשה מבוצע בהת×× ×œ× ×”×œ×™ ×”×תר.",
-"actioncomplete" => "הפעולה בוצעה",
-"deletedtext" => '"[[:$1]]" נמחק. ר×ו $2 לרשימת המחיקות ×”×חרונות.',
-"deletedarticle" => 'מחק ×ת "[[$1]]"',
-"dellogpage" => "יומן מחיקות",
-"dellogpagetext" => "להלן רשימה של המחיקות ×”×חרונות שבוצעו.",
-"deletionlog" => "יומן מחיקות",
-"reverted" => "שוחזר לגרסה קודמת",
-"deletecomment" => "סיבת המחיקה",
-"imagereverted" => "השיחזור לגרסה הקודמת ×”×•×©×œ× ×‘×”×¦×œ×—×”.",
-"rollback" => "שיחזור עריכות",
-"rollback_short" => "שיחזור",
-"rollbacklink" => "שיחזור",
-"rollbackfailed" => "השיחזור נכשל",
-"cantrollback" => "×œ× × ×™×ª×Ÿ לשחזר ×ת העריכה – ×”×ª×•×¨× ×”×חרון ×”×•× ×”×™×—×™×“ שכתב דף ×–×”; ×¢× ×–×ת, ניתן למחוק ×ת הדף.",
-"alreadyrolled" => "×œ× × ×™×ª×Ÿ לשחזר ×ת עריכת הדף [[$1]] על־ידי [[{{ns:user}}:$2|$2]] ([[{{ns:user_talk}}:$2|שיחה]]); מישהו ×חר כבר ערך ×ו שיחזר דף ×–×”.
-
-העריכה ×”×חרונה היתה של [[{{ns:user}}:$3|$3]] ([[{{ns:user_talk}}:$3|שיחה]]).",
-"editcomment" => 'תקציר העריכה היה: "\'\'\'$1\'\'\'".', # only shown if there is an edit comment
-"revertpage" => "שוחזר מעריכה של [[{{ns:special}}:Contributions/$2|$2]] ([[{{ns:user_talk}}:$2|שיחה]]) לעריכה ×”×חרונה של [[{{ns:user}}:$1|$1]]",
-"sessionfailure" => "נר××” שיש בעיה ×‘×—×™×‘×•×¨×›× ×œ×תר. ×¤×¢×•×œ×ª×›× ×‘×•×˜×œ×” ×›×מצעי זהירות כנגד התחזות לתקשורת ממחשבכ×. ×× × ×—×™×–×¨×• לדף ×”×§×•×“× ×•× ×¡×• שנית.",
-"protectlogpage" => "יומן הגנות",
-"protectlogtext" => "להלן רשימה של הגנות וביטולי הגנות על דפי×.",
-"protectedarticle" => "הגן על [[$1]]",
-"unprotectedarticle" => "ביטל ×ת ×”×”×’× ×” על [[$1]]",
-"protectsub" => '(מגן על "$1")',
-"confirmprotecttext" => "×”×× ××ª× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×”×’×Ÿ על דף ×–×”?",
-"confirmprotect" => "מ×שר ×ת ×”×”×’× ×”",
-"protectmoveonly" => "הגן מפני העברת הדף בלבד",
-"protectcomment" => "הסיבה להגנה",
-"unprotectsub" => '(מבטל ×ת ×”×”×’× ×” על "$1")',
-"confirmunprotecttext" => "×”×× ××ª× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×‘×˜×œ ×ת ×”×”×’× ×” על דף ×–×”?",
-"confirmunprotect" => "מ×שר ×ת ביטול ×”×”×’× ×”",
-"unprotectcomment" => "הסיבה להסרת ההגנה",
-"protect-unchain" => "×פשר שינוי הרש×ות העברה",
-"protect-text" => "ב××¤×©×¨×•×ª×›× ×œ×¨×ות ולשנות ×›×ן ×ת רמת ×”×”×’× ×” של הדף [[:$1]]. ×× × ×•×“×ו ש××ª× ×¤×•×¢×œ×™× ×‘×”×ª×× ×‘×”×ª×× ×œ× ×”×œ×™ ×”×תר.",
-"protect-viewtext" => "לחשבון שלך ×ין הרש××” לשנות ×ת רמת ×”×”×’× ×” של הדף. להלן ההגדרות הנוכחיות עבור הדף [[:$1]]:",
-"protect-default" => "(ברירת מחדל)",
-"protect-level-autoconfirmed" => "×ž×©×ª×ž×©×™× ×¨×©×•×ž×™× ×‘×œ×‘×“",
-"protect-level-sysop" => "מפעילי מערכת בלבד",
+'deletepage' => 'מחיקת דף',
+'confirm' => '×ישור',
+'excontent' => 'תוכן היה: "$1"',
+'excontentauthor' => "תוכן ×”×™×”: '$1' ×•×”×ª×•×¨× ×”×™×—×™×“ ×”×™×” [[{{ns:special}}:Contributions/$2|$2]]",
+'exbeforeblank' => 'תוכן לפני שהורק היה: "$1"',
+'exblank' => 'הדף היה ריק',
+'confirmdelete' => '×ישור מחיקת הדף',
+'deletesub' => '(מוחק ×ת "$1")',
+'historywarning' => '×זהרה – לדף ש××ª× ×¢×•×ž×“×™× ×œ×ž×—×•×§ יש היסטוריית שינויי×:',
+'confirmdeletetext' => '××ª× ×¢×•×ž×“×™× ×œ×ž×—×•×§ דף ×ו תמונה, יחד ×¢× ×›×œ ההיסטוריה שלה×, מבסיס הנתוני×.
+
+×× × ×שרו שזה ×כן מה ש××ª× ×ž×ª×›×•×•× ×™× ×œ×¢×©×•×ª, ש××ª× ×ž×‘×™× ×™× ×ת התוצ×ות של מעשה ×›×–×”, ושהמעשה מבוצע בהת×× ×œ× ×”×œ×™ ×”×תר.',
+'actioncomplete' => 'הפעולה בוצעה',
+'deletedtext' => '"[[:$1]]" נמחק. ר×ו $2 לרשימת המחיקות ×”×חרונות.',
+'deletedarticle' => 'מחק ×ת "[[$1]]"',
+'dellogpage' => 'יומן מחיקות',
+'dellogpagetext' => 'להלן רשימה של המחיקות ×”×חרונות שבוצעו.',
+'deletionlog' => 'יומן מחיקות',
+'reverted' => 'שוחזר לגרסה קודמת',
+'deletecomment' => 'סיבת המחיקה',
+'imagereverted' => 'השיחזור לגרסה הקודמת ×”×•×©×œ× ×‘×”×¦×œ×—×”.',
+'rollback' => 'שיחזור עריכות',
+'rollback_short' => 'שיחזור',
+'rollbacklink' => 'שיחזור',
+'rollbackfailed' => 'השיחזור נכשל',
+'cantrollback' => '×œ× × ×™×ª×Ÿ לשחזר ×ת העריכה – ×”×ª×•×¨× ×”×חרון ×”×•× ×”×™×—×™×“ שכתב דף ×–×”; ×¢× ×–×ת, ניתן למחוק ×ת הדף.',
+'alreadyrolled' => '×œ× × ×™×ª×Ÿ לשחזר ×ת עריכת הדף [[:$1]] על־ידי [[{{ns:user}}:$2|$2]] ([[{{ns:user_talk}}:$2|שיחה]]); מישהו ×חר כבר ערך ×ו שיחזר דף ×–×”.
+
+העריכה ×”×חרונה היתה של [[{{ns:user}}:$3|$3]] ([[{{ns:user_talk}}:$3|שיחה]]).',
+'editcomment' => 'תקציר העריכה היה: "\'\'\'$1\'\'\'".', # only shown if there is an edit comment
+'revertpage' => 'שוחזר מעריכה של [[{{ns:special}}:Contributions/$2|$2]] ([[{{ns:user_talk}}:$2|שיחה]]) לעריכה ×”×חרונה של [[{{ns:user}}:$1|$1]]',
+'sessionfailure' => 'נר××” שיש בעיה ×‘×—×™×‘×•×¨×›× ×œ×תר. ×¤×¢×•×œ×ª×›× ×‘×•×˜×œ×” ×›×מצעי זהירות כנגד התחזות לתקשורת ממחשבכ×. ×× × ×—×™×–×¨×• לדף ×”×§×•×“× ×•× ×¡×• שנית.',
+'protectlogpage' => 'יומן הגנות',
+'protectlogtext' => 'להלן רשימה של הגנות וביטולי הגנות על דפי×.',
+'protectedarticle' => 'הגן על [[$1]]',
+'unprotectedarticle' => 'ביטל ×ת ×”×”×’× ×” על [[$1]]',
+'protectsub' => '(מגן על "$1")',
+'confirmprotecttext' => '×”×× ××ª× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×”×’×Ÿ על דף ×–×”?',
+'confirmprotect' => 'מ×שר ×ת ×”×”×’× ×”',
+'protectmoveonly' => 'הגן מפני העברת הדף בלבד',
+'protectcomment' => 'הסיבה להגנה',
+'unprotectsub' => '(מבטל ×ת ×”×”×’× ×” על "$1")',
+'confirmunprotecttext' => '×”×× ××ª× ×‘×˜×•×—×™× ×©×‘×¨×¦×•× ×›× ×œ×‘×˜×œ ×ת ×”×”×’× ×” על דף ×–×”?',
+'confirmunprotect' => 'מ×שר ×ת ביטול ×”×”×’× ×”',
+'unprotectcomment' => 'הסיבה להסרת ההגנה',
+'protect-unchain' => '×פשר שינוי הרש×ות העברה',
+'protect-text' => 'ב××¤×©×¨×•×ª×›× ×œ×¨×ות ולשנות ×›×ן ×ת רמת ×”×”×’× ×” של הדף [[:$1]]. ×× × ×•×“×ו ש××ª× ×¤×•×¢×œ×™× ×‘×”×ª×× ×‘×”×ª×× ×œ× ×”×œ×™ ×”×תר.',
+'protect-viewtext' => 'לחשבון שלך ×ין הרש××” לשנות ×ת רמת ×”×”×’× ×” של הדף. להלן ההגדרות הנוכחיות עבור הדף [[:$1]]:',
+'protect-default' => '(ברירת מחדל)',
+'protect-level-autoconfirmed' => '×ž×©×ª×ž×©×™× ×¨×©×•×ž×™× ×‘×œ×‘×“',
+'protect-level-sysop' => 'מפעילי מערכת בלבד',
# Restrictions (nouns)
-"restriction-edit" => "עריכה",
-"restriction-move" => "העברה",
+'restriction-edit' => 'עריכה',
+'restriction-move' => 'העברה',
# Undelete
-"undelete" => "צפו ×‘×“×¤×™× ×ž×—×•×§×™×",
-"undeletepage" => "צפו ושחזרו ×“×¤×™× ×ž×—×•×§×™×",
-"viewdeletedpage" => "צפו ×‘×“×¤×™× ×ž×—×•×§×™×",
-"undeletepagetext" => "×”×“×¤×™× ×©×œ×”×œ×Ÿ נמחקו, ×ך ×”× ×¢×“×™×™×Ÿ ב×רכיון וניתן לשחזר ×ות×. ×”×רכיון מנוקה מעת לעת.",
-"undeleteextrahelp" => 'לשיחזור הדף כולו, ×ל תסמנו ××£ תיבת סימון ולחצו על "שיחזור". לשיחזור של גרס×ות מסוימות בלבד, סמנו ×ת תיבות הסימון של הגרס×ות הללו, ולחצו על "שיחזור". לחיצה על "×יפוס" תנקה ×ת התקציר, ו×ת כל תיבות הסימון.',
-"undeletearticle" => "שחזרו דף מחוק",
-"undeleterevisions" => "$1 גרס×ות נשמרו ב×רכיון",
-"undeletehistory" => "×× ×ª×©×—×–×¨×• ×ת הדף, כל הגרס×ות תשוחזרנה להיסטוריית ×”×©×™× ×•×™×™× ×©×œ×•.
-
-×× ×›×‘×¨ יש דף חדש ב×ותו הש×, הגרס×ות ×•×”×©×™× ×•×™×™× ×™×•×¤×™×¢×• רק בדף ההיסטוריה שלו, והגרסה הנוכחית של הדף ×œ× ×ª×•×—×œ×£ ×וטומטית.",
-"undeletehistorynoadmin" => "דף ×–×” נמחק. הסיבה למחיקה מוצגת בתקציר מטה, ביחד ×¢× ×¤×¨×˜×™× ×¢×œ ×”×ž×©×ª×ž×©×™× ×©×¢×¨×›×• ×ת הדף לפני מחיקתו. הטקסט של גרס×ות ×לו זמין רק למפעילי מערכת.",
-"undeleterevision" => "נמחקו גרס×ות החל מ־$1.",
-"undeletebtn" => "שיחזור",
-"undeletereset" => "×יפוס",
-"undeletecomment" => "תקציר:",
-"undeletedarticle" => "שיחזר ×ת [[:$1]]",
-"undeletedrevisions" => "שיחזר $1 גרס×ות",
-"undeletedrevisions-files" => "שיחזר $1 גרס×ות ו־$2 קבצי×",
-"undeletedfiles" => "שיחזר $1 קבצי×",
-"cannotundelete" => "השיחזור נכשל; ייתכן שמישהו ×חר כבר שיחזר ×ת הדף.",
-"undeletedpage" => "'''הדף $1 שוחזר בהצלחה.'''
+'undelete' => 'צפיה ×‘×“×¤×™× ×ž×—×•×§×™×',
+'undeletepage' => 'צפיה ושיחזור ×“×¤×™× ×ž×—×•×§×™×',
+'viewdeletedpage' => 'צפיה ×‘×“×¤×™× ×ž×—×•×§×™×',
+'undeletepagetext' => '×”×“×¤×™× ×©×œ×”×œ×Ÿ נמחקו, ×ך ×”× ×¢×“×™×™×Ÿ ב×רכיון וניתן לשחזר ×ות×. ×”×רכיון מנוקה מעת לעת.',
+'undeleteextrahelp' => 'לשיחזור הדף כולו, ×ל תסמנו ××£ תיבת סימון ולחצו על "שיחזור". לשיחזור של גרס×ות מסוימות בלבד, סמנו ×ת תיבות הסימון של הגרס×ות הללו, ולחצו על "שיחזור". לחיצה על "×יפוס" תנקה ×ת התקציר, ו×ת כל תיבות הסימון.',
+'undeletearticle' => 'שחזרו דף מחוק',
+'undeleterevisions' => '$1 גרס×ות נשמרו ב×רכיון',
+'undeletehistory' => '×× ×ª×©×—×–×¨×• ×ת הדף, כל הגרס×ות תשוחזרנה להיסטוריית ×”×©×™× ×•×™×™× ×©×œ×•.
+
+×× ×›×‘×¨ יש דף חדש ב×ותו הש×, הגרס×ות ×•×”×©×™× ×•×™×™× ×™×•×¤×™×¢×• רק בדף ההיסטוריה שלו, והגרסה הנוכחית של הדף ×œ× ×ª×•×—×œ×£ ×וטומטית.',
+'undeletehistorynoadmin' => 'דף ×–×” נמחק. הסיבה למחיקה מוצגת בתקציר מטה, ביחד ×¢× ×¤×¨×˜×™× ×¢×œ ×”×ž×©×ª×ž×©×™× ×©×¢×¨×›×• ×ת הדף לפני מחיקתו. הטקסט של גרס×ות ×לו זמין רק למפעילי מערכת.',
+'undeleterevision' => 'נמחקו גרס×ות החל מ־$1.',
+'undeleterevision-missing' => 'הגרסה שגויה ×ו חסרה. ייתכן שמדובר בקישור שבור, ×ו שהגרסה שוחזרה ×ו הוסרה מה×רכיון.',
+'undeletebtn' => 'שיחזור',
+'undeletereset' => '×יפוס',
+'undeletecomment' => 'תקציר:',
+'undeletedarticle' => 'שיחזר ×ת [[:$1]]',
+'undeletedrevisions' => 'שיחזר $1 גרס×ות',
+'undeletedrevisions-files' => 'שיחזר $1 גרס×ות ו־$2 קבצי×',
+'undeletedfiles' => 'שיחזר $1 קבצי×',
+'cannotundelete' => 'השיחזור נכשל; ייתכן שמישהו ×חר כבר שיחזר ×ת הדף.',
+'undeletedpage' => "'''הדף $1 שוחזר בהצלחה.'''
ר×ו ×ת [[{{ns:special}}:Log/delete|יומן המחיקות]] לרשימה של מחיקות ×•×©×™×—×–×•×¨×™× ×חרוני×.",
# Namespace form on various pages
-"namespace" => "מרחב ש×:",
-"invert" => "×œ×œ× ×ž×¨×—×‘ ×–×”",
+'namespace' => 'מרחב ש×:',
+'invert' => '×œ×œ× ×ž×¨×—×‘ ×–×”',
# Contributions
-"contributions" => "תרומות המשתמש",
-"mycontris" => "התרומות שלי",
-"contribsub" => "עבור $1",
-"nocontribs" => "×œ× × ×ž×¦×ו ×©×™× ×•×™×™× ×”×ž×ª××™×ž×™× ×œ×§×¨×™×˜×¨×™×•× ×™× ×לו.",
-"ucnote" => "להלן '''$1''' ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×©×‘×™×¦×¢ משתמש ×–×” ב־'''$2''' ×”×™×ž×™× ×”×חרוני×:",
-"uclinks" => "צפה ב־$1 ×”×©×™× ×•×™×™× ×”×חרוני×; צפה ב־$2 ×”×™×ž×™× ×”×חרוני×",
-"uctop" => "(×חרון)" ,
-"newbies" => "×ž×©×ª×ž×©×™× ×—×“×©×™×",
-
-"sp-newimages-showfrom" => "הצג תמונות חדשות החל מ־$1",
-
-"sp-contributions-newest" => "חדשות ביותר",
-"sp-contributions-oldest" => "ישנות ביותר",
-"sp-contributions-newer" => "$1 החדשות",
-"sp-contributions-older" => "$1 הישנות",
-"sp-contributions-newbies-sub" => "עבור ×ž×©×ª×ž×©×™× ×—×“×©×™×",
+'contributions' => 'תרומות המשתמש',
+'mycontris' => 'התרומות שלי',
+'contribsub' => 'עבור $1',
+'nocontribs' => '×œ× × ×ž×¦×ו ×©×™× ×•×™×™× ×”×ž×ª××™×ž×™× ×œ×§×¨×™×˜×¨×™×•× ×™× ×לו.',
+'ucnote' => "להלן '''$1''' ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×©×‘×™×¦×¢ משתמש ×–×” ב־'''$2''' ×”×™×ž×™× ×”×חרוני×:",
+'uclinks' => 'צפה ב־$1 ×”×©×™× ×•×™×™× ×”×חרוני×; צפה ב־$2 ×”×™×ž×™× ×”×חרוני×',
+'uctop' => '(×חרון)',
+'newbies' => '×ž×©×ª×ž×©×™× ×—×“×©×™×',
+
+'sp-contributions-newest' => 'חדשות ביותר',
+'sp-contributions-oldest' => 'ישנות ביותר',
+'sp-contributions-newer' => '$1 החדשות',
+'sp-contributions-older' => '$1 הישנות',
+'sp-contributions-newbies-sub' => 'עבור ×ž×©×ª×ž×©×™× ×—×“×©×™×',
+'sp-contributions-blocklog' => 'יומן חסימות',
+
+'sp-newimages-showfrom' => 'הצג תמונות חדשות החל מ־$1',
# What links here
-"whatlinkshere" => "×“×¤×™× ×”×ž×§×•×©×¨×™× ×œ×›×ן",
-"notargettitle" => "×ין דף מטרה",
-"notargettext" => "×œ× ×¦×™×™× ×ª× ×“×£ מטרה ×ו משתמש לגביו תבוצע פעולה זו.",
-"linklistsub" => "(רשימת קישורי×)",
-"linkshere" => "×”×“×¤×™× ×©×œ×”×œ×Ÿ ×ž×§×•×©×¨×™× ×œ×“×£ '''[[:$1]]''':",
-"nolinkshere" => "×ין ×“×¤×™× ×”×ž×§×•×©×¨×™× ×œ×“×£ '''[[:$1]]'''.",
-"isredirect" => "דף הפניה",
-"istemplate" => "הכללה",
-
-# Block/unblock IP
-"blockip" => "חסימת משתמש",
-"blockiptext" => "השתמשו בטופס שלהלן כדי ×œ×—×¡×•× ×ת הרש×ות הכתיבה ממשתמש ×ו כתובת IP ספציפיי×.
+'whatlinkshere' => '×“×¤×™× ×”×ž×§×•×©×¨×™× ×œ×›×ן',
+'notargettitle' => '×ין דף מטרה',
+'notargettext' => '×œ× ×¦×™×™× ×ª× ×“×£ מטרה ×ו משתמש לגביו תבוצע פעולה זו.',
+'linklistsub' => '(רשימת קישורי×)',
+'linkshere' => "×”×“×¤×™× ×©×œ×”×œ×Ÿ ×ž×§×•×©×¨×™× ×œ×“×£ '''[[:$1]]''':",
+'nolinkshere' => "×ין ×“×¤×™× ×”×ž×§×•×©×¨×™× ×œ×“×£ '''[[:$1]]'''.",
+'isredirect' => 'דף הפניה',
+'istemplate' => 'הכללה',
+
+# Block/unblock
+'blockip' => 'חסימת משתמש',
+'blockiptext' => 'השתמשו בטופס שלהלן כדי ×œ×—×¡×•× ×ת הרש×ות הכתיבה ממשתמש ×ו כתובת IP ספציפיי×.
חסימות ×›×לה צריכות להתבצע ×ך ורק כדי למנוע ונדליז×, ובהת×× ×œ× ×”×œ×™ ×”×תר.
-×× × ×¤×¨×˜×• ×ת הסיבה הספציפית לחסימה להלן (לדוגמה, ציון ×“×¤×™× ×¡×¤×¦×™×¤×™×™× ××•×ª× ×”×©×—×™×ª המשתמש).",
-"ipaddress" => "כתובת IP",
-"ipadressorusername" => "כתובת IP ×ו ×©× ×ž×©×ª×ž×©",
-"ipbexpiry" => "פקיעה",
-"ipbreason" => "סיבה",
-"ipbanononly" => "×—×¡×•× ×ž×©×ª×ž×©×™× ×× ×•× ×™×ž×™×™× ×‘×œ×‘×“",
-"ipbcreateaccount" => "×—×¡×•× ×™×¦×™×¨×ª חשבונות",
-"ipbsubmit" => "×—×¡×•× ×ž×©×ª×ž×© ×–×”",
-"ipbother" => "זמן ×חר",
-"ipboptions" => "שעתיי×:2 hours,יו×:1 day,שלושה ימי×:3 days,שבוע:1 week,שבועיי×:2 weeks,חודש:1 month,שלושה חודשי×:3 months,חצי שנה:6 months,שנה:1 year,לצמיתות:infinite",
-"ipbotheroption" => "×חר",
-"badipaddress" => "משתמש ×ו כתובת IP שגויי×.",
-"blockipsuccesssub" => "החסימה הושלמה בהצלחה",
-"blockipsuccesstext" => "המשתמש [[{{ns:special}}:Contributions/$1|$1]] נחס×.
-
-ר×ו ×ת [[{{ns:special}}:Ipblocklist|רשימת ×”×ž×©×ª×ž×©×™× ×”×—×¡×•×ž×™×]] כדי לצפות בחסימות.",
-"unblockip" => "שחרר משתמש",
-"unblockiptext" => "השתמשו בטופס שלהלן כדי להחזיר ×ת הרש×ות הכתיבה למשתמש ×ו כתובת IP חסומי×.",
-"ipusubmit" => "שחרר משתמש זה",
-"unblocked" => 'המשתמש "[[משתמש:$1|$1]]" שוחרר מחסימתו.',
-"ipblocklist" => "רשימת ×ž×©×ª×ž×©×™× ×—×¡×•×ž×™×",
-"blocklistline" => '$1 $2 ×—×¡× ×ת $3 ($4)',
-"infiniteblock" => "לצמיתות",
-"expiringblock" => "פוקע $1",
-"anononlyblock" => "×ž×©×ª×ž×©×™× ×× ×•× ×™×ž×™×™× ×‘×œ×‘×“",
-"createaccountblock" => "יצירת חשבונות נחסמה",
-"ipblocklistempty" => "רשימת ×”×ž×©×ª×ž×©×™× ×”×—×¡×•×ž×™× ×¨×™×§×”.",
-"blocklink" => "חסו×",
-"unblocklink" => "שחרר חסימה",
-"contribslink" => "תרומות",
-"autoblocker" => 'נחסמת ב×ופן ×וטומטי ×ž×©×•× ×©×תה חולק ×ת כתובת ×”Ö¾IP שלך ×¢× [[{{ns:user}}:$1|$1]]. הנימוק שניתן לחסימת [[{{ns:user}}:$1|$1]] הו×: "$2".',
-"blocklogpage" => "יומן חסימות",
-"blocklogentry" => "×—×¡× ×ת [[$1]] למשך $2",
-"blocklogtext" => 'זהו יומן פעולות החסימה והשחרור של משתמשי×. כתובות IP הנחסמות ב×ופן ×וטומטי ×ינן מופיעות.
+×× × ×¤×¨×˜×• ×ת הסיבה הספציפית לחסימה להלן (לדוגמה, ציון ×“×¤×™× ×¡×¤×¦×™×¤×™×™× ××•×ª× ×”×©×—×™×ª המשתמש).',
+'ipaddress' => 'כתובת IP',
+'ipadressorusername' => 'כתובת IP ×ו ×©× ×ž×©×ª×ž×©',
+'ipbexpiry' => 'פקיעה',
+'ipbreason' => 'סיבה',
+'ipbanononly' => '×—×¡×•× ×ž×©×ª×ž×©×™× ×× ×•× ×™×ž×™×™× ×‘×œ×‘×“',
+'ipbcreateaccount' => '×—×¡×•× ×™×¦×™×¨×ª חשבונות',
+'ipbenableautoblock' => 'עבור חסימת משתמש רשו×: ×—×¡×•× ×’× ×ת כתובת ×”Ö¾IP שלו',
+'ipbsubmit' => '×—×¡×•× ×ž×©×ª×ž×© ×–×”',
+'ipbother' => 'זמן ×חר',
+'ipboptions' => 'שעתיי×:2 hours,יו×:1 day,שלושה ימי×:3 days,שבוע:1 week,שבועיי×:2 weeks,חודש:1 month,שלושה חודשי×:3 months,חצי שנה:6 months,שנה:1 year,לצמיתות:infinite',
+'ipbotheroption' => '×חר',
+'badipaddress' => 'משתמש ×ו כתובת IP שגויי×.',
+'blockipsuccesssub' => 'החסימה הושלמה בהצלחה',
+'blockipsuccesstext' => 'המשתמש [[{{ns:special}}:Contributions/$1|$1]] נחס×.
+
+ר×ו ×ת [[{{ns:special}}:Ipblocklist|רשימת ×”×ž×©×ª×ž×©×™× ×”×—×¡×•×ž×™×]] כדי לצפות בחסימות.',
+'unblockip' => 'שחרר משתמש',
+'unblockiptext' => 'השתמשו בטופס שלהלן כדי להחזיר ×ת הרש×ות הכתיבה למשתמש ×ו כתובת IP חסומי×.',
+'ipusubmit' => 'שחרר משתמש זה',
+'unblocked' => 'המשתמש "[[משתמש:$1|$1]]" שוחרר מחסימתו.',
+'ipblocklist' => 'רשימת ×ž×©×ª×ž×©×™× ×—×¡×•×ž×™×',
+'blocklistline' => '$1 $2 ×—×¡× ×ת $3 ($4)',
+'infiniteblock' => 'לצמיתות',
+'expiringblock' => 'פוקע $1',
+'anononlyblock' => '×ž×©×ª×ž×©×™× ×× ×•× ×™×ž×™×™× ×‘×œ×‘×“',
+'noautoblockblock' => 'חסימה ×וטומטית נוטרלה',
+'createaccountblock' => 'יצירת חשבונות נחסמה',
+'ipblocklistempty' => 'רשימת ×”×ž×©×ª×ž×©×™× ×”×—×¡×•×ž×™× ×¨×™×§×”.',
+'blocklink' => 'חסו×',
+'unblocklink' => 'שחרר חסימה',
+'contribslink' => 'תרומות',
+'autoblocker' => 'נחסמת ב×ופן ×וטומטי ×ž×©×•× ×©×תה חולק ×ת כתובת ×”Ö¾IP שלך ×¢× [[{{ns:user}}:$1|$1]]. הנימוק שניתן לחסימת [[{{ns:user}}:$1|$1]] הו×: "$2".',
+'blocklogpage' => 'יומן חסימות',
+'blocklogentry' => '×—×¡× ×ת [[$1]] למשך $2',
+'blocklogtext' => 'זהו יומן פעולות החסימה והשחרור של משתמשי×. כתובות IP הנחסמות ב×ופן ×וטומטי ×ינן מופיעות.
ר×ו ×’× ×ת [[{{ns:special}}:Ipblocklist|רשימת ×”×ž×©×ª×ž×©×™× ×”×—×¡×•×ž×™×]] הנוכחית.',
-"unblocklogentry" => "שיחרר ×ת [[$1]]",
-"range_block_disabled" => "היכולת ×œ×—×¡×•× ×˜×•×•×— כתובות ××™× × ×” פעילה.",
-"ipb_expiry_invalid" => "זמן פקיעת חסימה בלתי חוקי",
-"ipb_already_blocked" => 'המשתמש "$1" כבר נחס×',
-"ip_range_invalid" => "טווח IP שגוי.",
-"ipb_cant_unblock" => "שגי××”: חסימה מספר $1 ×œ× × ×ž×¦××”. ייתכן ×©×”×™× ×›×‘×¨ שוחררה.",
-"proxyblocker" => "×—×•×¡× ×¤×¨×•×§×¡×™",
-"proxyblockreason" => "כתובת ×”Ö¾IP ×©×œ×›× × ×—×¡×ž×” ×ž×©×•× ×©×”×™× ×›×ª×•×‘×ª פרוקסי פתוחה. ×× × ×¦×¨×• קשר ×¢× ×¡×¤×§ ×”×ינטרנט ×©×œ×›× ×•×”×•×“×™×¢×• לו על בעיית ×”×בטחה החמורה הזו.",
-"proxyblocksuccess" => "בוצע.",
-"sorbs" => "SORBS DNSBL",
-"sorbsreason" => "כתובת ×”Ö¾IP ×©×œ×›× ×¨×©×•×ž×” ככתובת פרוקסי פתוחה ב[http://www.sorbs.net SORBS] DNSBL.",
-"sorbs_create_account_reason" => "כתובת ×”Ö¾IP ×©×œ×›× ×¨×©×•×ž×” ככתובת פרוקסי פתוחה ב[http://www.sorbs.net SORBS] DNSBL. ××™× ×›× ×™×›×•×œ×™× ×œ×™×¦×•×¨ חשבון.",
+'unblocklogentry' => 'שיחרר ×ת [[$1]]',
+'range_block_disabled' => 'היכולת ×œ×—×¡×•× ×˜×•×•×— כתובות ××™× × ×” פעילה.',
+'ipb_expiry_invalid' => 'זמן פקיעת חסימה בלתי חוקי',
+'ipb_already_blocked' => 'המשתמש "$1" כבר נחס×',
+'ip_range_invalid' => 'טווח IP שגוי.',
+'proxyblocker' => '×—×•×¡× ×¤×¨×•×§×¡×™',
+'ipb_cant_unblock' => 'שגי××”: חסימה מספר $1 ×œ× × ×ž×¦××”. ייתכן ×©×”×™× ×›×‘×¨ שוחררה.',
+'proxyblockreason' => 'כתובת ×”Ö¾IP ×©×œ×›× × ×—×¡×ž×” ×ž×©×•× ×©×”×™× ×›×ª×•×‘×ª פרוקסי פתוחה. ×× × ×¦×¨×• קשר ×¢× ×¡×¤×§ ×”×ינטרנט ×©×œ×›× ×•×”×•×“×™×¢×• לו על בעיית ×”×בטחה החמורה הזו.',
+'proxyblocksuccess' => 'בוצע.',
+'sorbs' => 'SORBS',
+'sorbsreason' => 'כתובת ×”Ö¾IP ×©×œ×›× ×¨×©×•×ž×” ככתובת פרוקסי פתוחה ב־DNSBL ש×תר ×–×” משתמש בו.',
+'sorbs_create_account_reason' => 'כתובת ×”Ö¾IP ×©×œ×›× ×¨×©×•×ž×” ככתובת פרוקסי פתוחה ב־DNSBL ש×תר ×–×” משתמש בו. ××™× ×›× ×™×›×•×œ×™× ×œ×™×¦×•×¨ חשבון.',
# Developer tools
-"lockdb" => "נעל בסיס־נתוני×",
-"unlockdb" => "שחרר ×‘×¡×™×¡Ö¾× ×ª×•× ×™× ×ž× ×¢×™×œ×”",
-"lockdbtext" => "נעילת בסיס ×”× ×ª×•× ×™× ×ª×ž× ×¢ ×ž×ž×©×ª×ž×©×™× ×ת ×”×פשרות לערוך דפי×, לשנות ×ת העדפותיה×, לערוך ×ת רשימות המעקב שלה×, ופעולות ×חרות הדורשות ביצוע ×©×™× ×•×™×™× ×‘×‘×¡×™×¡ הנתוני×.
-
-×× × ×שרו שזה מה ש××ª× ×ž×ª×›×•×•× ×™× ×œ×¢×©×•×ª, ושתשחררו ×ת בסיס ×”× ×ª×•× ×™× ×ž× ×¢×™×œ×” ×›×שר פעולת התחזוקה תסתיי×.",
-"unlockdbtext" => "שחרור בסיס ×”× ×ª×•× ×™× ×ž× ×¢×™×œ×” יחזיר ×œ×ž×©×ª×ž×©×™× ×ת היכולת לערוך דפי×, לשנות ×ת העדפותיה×, לערוך ×ת רשימות המעקב שלה×, ולבצע פעולות ×חרות הדורשות ביצוע ×©×™× ×•×™×™× ×‘×‘×¡×™×¡ הנתוני×
-×× × ×שרו שזה מה ×©×‘×›×•×•× ×ª×›× ×œ×¢×©×•×ª.",
-"lockconfirm" => "כן, ×× ×™ ב×מת רוצה לנעול ×ת בסיס הנתוני×.",
-"unlockconfirm" => "כן, ×× ×™ ב×מת רוצה לשחרר ×ת בסיס ×”× ×ª×•× ×™× ×ž× ×¢×™×œ×”.",
-"lockbtn" => "נעל ×ת בסיס הנתוני×",
-"unlockbtn" => "שחרר ×ת בסיס ×”× ×ª×•× ×™× ×ž× ×¢×™×œ×”",
-"locknoconfirm" => "×œ× ×¡×™×ž× ×ª× ×ת תיבת ×”×ישור.",
-"lockdbsuccesssub" => "נעילת בסיס ×”× ×ª×•× ×™× ×”×•×©×œ×ž×” בהצלחה",
-"unlockdbsuccesssub" => "שוחררה הנעילה מבסיס הנתוני×",
-"lockdbsuccesstext" => "בסיס ×”× ×ª×•× ×™× × × ×¢×œ.
-
-זכרו [[{{ns:special}}:Unlockdb|לשחרר ×ת הנעילה]] ל×חר שפעולת התחזוקה הסתיימה.",
-"unlockdbsuccesstext" => "שוחררה הנעילה של בסיס הנתוני×",
-"lockfilenotwritable" => "קובץ נעילת מסד ×”× ×ª×•× ×™× ×ינו ניתן לכתיבה. כדי ש×פשר ×™×”×™×” לנעול ×ת מסד ×”× ×ª×•× ×™× ×ו לבטל ×ת נעילתו, שרת ×”×ינטרנט צריך לקבל הרש×ות לכתוב ×ליו.",
-"databasenotlocked" => "מסד ×”× ×ª×•× ×™× ×ינו נעול.",
+'lockdb' => 'נעל בסיס־נתוני×',
+'unlockdb' => 'שחרר ×‘×¡×™×¡Ö¾× ×ª×•× ×™× ×ž× ×¢×™×œ×”',
+'lockdbtext' => 'נעילת בסיס ×”× ×ª×•× ×™× ×ª×ž× ×¢ ×ž×ž×©×ª×ž×©×™× ×ת ×”×פשרות לערוך דפי×, לשנות ×ת העדפותיה×, לערוך ×ת רשימות המעקב שלה×, ופעולות ×חרות הדורשות ביצוע ×©×™× ×•×™×™× ×‘×‘×¡×™×¡ הנתוני×.
+
+×× × ×שרו שזה מה ש××ª× ×ž×ª×›×•×•× ×™× ×œ×¢×©×•×ª, ושתשחררו ×ת בסיס ×”× ×ª×•× ×™× ×ž× ×¢×™×œ×” ×›×שר פעולת התחזוקה תסתיי×.',
+'unlockdbtext' => 'שחרור בסיס ×”× ×ª×•× ×™× ×ž× ×¢×™×œ×” יחזיר ×œ×ž×©×ª×ž×©×™× ×ת היכולת לערוך דפי×, לשנות ×ת העדפותיה×, לערוך ×ת רשימות המעקב שלה×, ולבצע פעולות ×חרות הדורשות ביצוע ×©×™× ×•×™×™× ×‘×‘×¡×™×¡ הנתוני×
+×× × ×שרו שזה מה ×©×‘×›×•×•× ×ª×›× ×œ×¢×©×•×ª.',
+'lockconfirm' => 'כן, ×× ×™ ב×מת רוצה לנעול ×ת בסיס הנתוני×.',
+'unlockconfirm' => 'כן, ×× ×™ ב×מת רוצה לשחרר ×ת בסיס ×”× ×ª×•× ×™× ×ž× ×¢×™×œ×”.',
+'lockbtn' => 'נעל ×ת בסיס הנתוני×',
+'unlockbtn' => 'שחרר ×ת בסיס ×”× ×ª×•× ×™× ×ž× ×¢×™×œ×”',
+'locknoconfirm' => '×œ× ×¡×™×ž× ×ª× ×ת תיבת ×”×ישור.',
+'lockdbsuccesssub' => 'נעילת בסיס ×”× ×ª×•× ×™× ×”×•×©×œ×ž×” בהצלחה',
+'unlockdbsuccesssub' => 'שוחררה הנעילה מבסיס הנתוני×',
+'lockdbsuccesstext' => 'בסיס ×”× ×ª×•× ×™× × × ×¢×œ.
+
+זכרו [[{{ns:special}}:Unlockdb|לשחרר ×ת הנעילה]] ל×חר שפעולת התחזוקה הסתיימה.',
+'unlockdbsuccesstext' => 'שוחררה הנעילה של בסיס הנתוני×',
+'lockfilenotwritable' => 'קובץ נעילת מסד ×”× ×ª×•× ×™× ×ינו ניתן לכתיבה. כדי ש×פשר ×™×”×™×” לנעול ×ת מסד ×”× ×ª×•× ×™× ×ו לבטל ×ת נעילתו, שרת ×”×ינטרנט צריך לקבל הרש×ות לכתוב ×ליו.',
+'databasenotlocked' => 'מסד ×”× ×ª×•× ×™× ×ינו נעול.',
# Make sysop
-"makesysoptitle" => "הפוך משתמש למפעיל מערכת",
-"makesysoptext" => "דף ×–×” משמש ×‘×™×•×¨×•×§×¨×˜×™× ×œ×”×¤×™×›×ª משתמש רגיל למפעיל מערכת. ×× × ×”×§×™×©×• ×ת ×©× ×”×ž×©×ª×ž×© בתיבת הטקסט ולחצו על הכפתור על מנת להפוך ×ת המשתמש למפעיל מערכת.",
-"makesysopname" => "×©× ×”×ž×©×ª×ž×©:",
-"makesysopsubmit" => "הפוך משתמש זה למפעיל מערכת",
-"makesysopok" => '\'\'\'המשתמש "$1" ×”×•× ×¢×›×©×™×• מפעיל מערכת.\'\'\'',
-"makesysopfail" => '\'\'\'×œ× × ×™×ª×Ÿ ×”×™×” למנות ×ת המשתמש "$1" למפעיל מערכת.\'\'\' (×”×× ×”×§×œ×“×ª× × ×›×•× ×” ×ת ×©× ×”×ž×©×ª×ž×©?)',
-"setbureaucratflag" => "הפוך משתמש זה לביורוקרט.",
-"rightslog" => "יומן תפקידי×",
-"rightslogtext" => "זהו יומן ×”×©×™× ×•×™×™× ×‘×ª×¤×§×™×“×™ המשתמשי×.",
-"rightslogentry" => 'שינה ×ת ההרש×ות של "$1" מההרש×ות $2 להרש×ות $3',
-"rights" => "הרש×ות:",
-"set_user_rights" => "קבע הרש×ות משתמש",
-"user_rights_set" => '\'\'\'הרש×ות המשתמש "$1" עודכנו.\'\'\'',
-"set_rights_fail" => '\'\'\'שינוי הרש×ות המשתמש "$1" נכשל.\'\'\' (×”×× ×”×§×œ×“×ª× × ×›×•× ×” ×ת ×©× ×”×ž×©×ª×ž×©?)',
-"makesysop" => "הפוך משתמש למפעיל מערכת",
-"already_sysop" => "משתמש ×–×” ×”×•× ×›×‘×¨ מפעיל מערכת",
-"already_bureaucrat" => "משתמש ×–×” ×”×•× ×›×‘×¨ ביורוקרט",
-"rightsnone" => "(×œ×œ× ×”×¨×©×ות)",
+'makesysoptitle' => 'הפוך משתמש למפעיל מערכת',
+'makesysoptext' => 'דף ×–×” משמש ×‘×™×•×¨×•×§×¨×˜×™× ×œ×”×¤×™×›×ª משתמש רגיל למפעיל מערכת. ×× × ×”×§×™×©×• ×ת ×©× ×”×ž×©×ª×ž×© בתיבת הטקסט ולחצו על הכפתור על מנת להפוך ×ת המשתמש למפעיל מערכת.',
+'makesysopname' => '×©× ×”×ž×©×ª×ž×©:',
+'makesysopsubmit' => 'הפוך משתמש זה למפעיל מערכת',
+'makesysopok' => '\'\'\'המשתמש "$1" ×”×•× ×¢×›×©×™×• מפעיל מערכת.\'\'\'',
+'makesysopfail' => '\'\'\'×œ× × ×™×ª×Ÿ ×”×™×” למנות ×ת המשתמש "$1" למפעיל מערכת.\'\'\' (×”×× ×”×§×œ×“×ª× × ×›×•× ×” ×ת ×©× ×”×ž×©×ª×ž×©?)',
+'setbureaucratflag' => 'הפוך משתמש זה לביורוקרט.',
+'rightslog' => 'יומן תפקידי×',
+'rightslogtext' => 'זהו יומן ×”×©×™× ×•×™×™× ×‘×ª×¤×§×™×“×™ המשתמשי×.',
+'rightslogentry' => 'שינה ×ת ההרש×ות של "$1" מההרש×ות $2 להרש×ות $3',
+'rights' => 'הרש×ות:',
+'set_user_rights' => 'קבע הרש×ות משתמש',
+'user_rights_set' => '\'\'\'הרש×ות המשתמש "$1" עודכנו.\'\'\'',
+'set_rights_fail' => '\'\'\'שינוי הרש×ות המשתמש "$1" נכשל.\'\'\' (×”×× ×”×§×œ×“×ª× × ×›×•× ×” ×ת ×©× ×”×ž×©×ª×ž×©?)',
+'makesysop' => 'הפוך משתמש למפעיל מערכת',
+'already_sysop' => 'משתמש ×–×” ×”×•× ×›×‘×¨ מפעיל מערכת',
+'already_bureaucrat' => 'משתמש ×–×” ×”×•× ×›×‘×¨ ביורוקרט',
+'rightsnone' => '(×œ×œ× ×”×¨×©×ות)',
# Move page
-"movepage" => "העברת דף",
-"movepagetext" => "שימוש בטופס שלהלן ישנה ×ת שמו של דף, ויעביר ×ת כל ההיסטוריה שלו ×œ×©× ×—×“×©.
+'movepage' => 'העברת דף',
+'movepagetext' => "שימוש בטופס שלהלן ישנה ×ת שמו של דף, ויעביר ×ת כל ההיסטוריה שלו ×œ×©× ×—×“×©.
×”×©× ×”×™×©×Ÿ יהפוך לדף הפניה ×ל הדף ×¢× ×”×©× ×”×—×“×©.
@@ -1456,181 +1515,184 @@ $NEWPAGE
שימו לב: הדף '''ל×''' יועבר ×× ×›×‘×¨ יש דף תחת ×”×©× ×”×—×“×©, ××œ× ×× ×”×“×£ ×”×–×” ריק, ×ו ×©×”×•× ×”×¤× ×™×”, ו×ין לו היסטוריה של שינויי×. משמעות הדבר, ש×פשר לשנות חזרה ×ת שמו של דף ×œ×©× ×”×ž×§×•×¨×™, ×× × ×¢×©×ª×” טעות, ×•×œ× ×™×™×ž×—×§ דף ×§×™×™× ×‘×ž×¢×¨×›×ª.
'''×זהרה:''' שינוי ×–×” עשוי להיות שינוי דרסטי ובלתי צפוי לדף פופל×רי; ×× × ×•×“×ו ש××ª× ×ž×‘×™× ×™× ×ת השלכות המעשה לפני ש××ª× ×ž×ž×©×™×›×™×.",
-"movepagetalktext" => "דף השיחה של דף ×–×” יועבר ×וטומטית, ××œ× ××:
+'movepagetalktext' => 'דף השיחה של דף ×–×” יועבר ×וטומטית, ××œ× ××:
* ×§×™×™× ×“×£ שיחה ש×ינו ריק תחת ×”×©× ×”×—×“×© ×ליו מועבר הדף.
* ×”×•×¨×“×ª× ×ת הסימון בתיבה שלהלן.
-×‘×ž×§×¨×™× ×לו, תצטרכו להעביר ×ו לשלב ×ת ×”×“×¤×™× ×‘×ופן ידני, ×× ×ª×¨×¦×•.",
-"movearticle" => "העבר דף",
-"movenologin" => "×œ× × ×›× ×¡×ª× ×œ×תר",
-"movenologintext" => "×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]] כדי להעביר דפי×.",
-"newtitle" => "×œ×©× ×”×—×“×©",
-"movepagebtn" => "העבר דף",
-"pagemovedsub" => "ההעברה הושלמה בהצלחה",
-"pagemovedtext" => 'הדף "[[$1]]" הועבר ×œ×©× "[[$2]]".',
-"articleexists" => "×§×™×™× ×›×‘×¨ דף ×¢× ×ותו ש×, ×ו ×©×”×©× ×©×‘×—×¨×ª× ×ינו חוקי.
-×× × ×‘×—×¨×• ×©× ×חר.",
-"talkexists" => "הדף עצמו הועבר בהצלחה, ×בל דף השיחה ×œ× ×”×•×¢×‘×¨ כיוון ×©×§×™×™× ×›×‘×¨ דף שיחה ×‘×ž×™×§×•× ×”×—×“×©. ×× × ×ž×–×’×• ××•×ª× ×™×“× ×™×ª.",
-"movedto" => "הועבר ל",
-"movetalk" => "העבר ×’× ×ת דף השיחה.",
-"talkpagemoved" => "דף השיחה המשוייך הועבר ×’× ×›×Ÿ.",
-"talkpagenotmoved" => "דף השיחה המשוייך '''ל×''' הועבר.",
-"1movedto2" => "[[$1]] הועבר ×œ×©× [[$2]]",
-"1movedto2_redir" => "[[$1]] הועבר ×œ×©× [[$2]] ×‘×ž×§×•× ×”×¤× ×™×”",
-"movelogpage" => "יומן העברות",
-"movelogpagetext" => "להלן רשימה של העברות דפי×.",
-"movereason" => "סיבה",
-"revertmove" => "החזר",
-"delete_and_move" => "מחק והעבר",
-"delete_and_move_text" => '== בקשת מחיקה ==
+×‘×ž×§×¨×™× ×לו, תצטרכו להעביר ×ו לשלב ×ת ×”×“×¤×™× ×‘×ופן ידני, ×× ×ª×¨×¦×•.',
+'movearticle' => 'העבר דף',
+'movenologin' => '×œ× × ×›× ×¡×ª× ×œ×תר',
+'movenologintext' => '×¢×œ×™×›× [[{{ns:special}}:Userlogin|להיכנס לחשבון]] כדי להעביר דפי×.',
+'newtitle' => '×œ×©× ×”×—×“×©',
+'move-watch' => 'מעקב ×חרי דף ×–×”',
+'movepagebtn' => 'העבר דף',
+'pagemovedsub' => 'ההעברה הושלמה בהצלחה',
+'pagemovedtext' => 'הדף "[[$1]]" הועבר ×œ×©× "[[$2]]".',
+'articleexists' => '×§×™×™× ×›×‘×¨ דף ×¢× ×ותו ש×, ×ו ×©×”×©× ×©×‘×—×¨×ª× ×ינו חוקי.
+×× × ×‘×—×¨×• ×©× ×חר.',
+'talkexists' => 'הדף עצמו הועבר בהצלחה, ×בל דף השיחה ×œ× ×”×•×¢×‘×¨ כיוון ×©×§×™×™× ×›×‘×¨ דף שיחה ×‘×ž×™×§×•× ×”×—×“×©. ×× × ×ž×–×’×• ××•×ª× ×™×“× ×™×ª.',
+'movedto' => 'הועבר ל',
+'movetalk' => 'העבר ×’× ×ת דף השיחה.',
+'talkpagemoved' => 'דף השיחה המשוייך הועבר ×’× ×›×Ÿ.',
+'talkpagenotmoved' => "דף השיחה המשוייך '''ל×''' הועבר.",
+'1movedto2' => '[[$1]] הועבר ×œ×©× [[$2]]',
+'1movedto2_redir' => '[[$1]] הועבר ×œ×©× [[$2]] ×‘×ž×§×•× ×”×¤× ×™×”',
+'movelogpage' => 'יומן העברות',
+'movelogpagetext' => 'להלן רשימה של העברות דפי×.',
+'movereason' => 'סיבה',
+'revertmove' => 'החזר',
+'delete_and_move' => 'מחק והעבר',
+'delete_and_move_text' => '== בקשת מחיקה ==
דף היעד "[[$1]]" כבר קיי×. ×”×× ×‘×¨×¦×•× ×›× ×œ×ž×—×•×§ ×ותו כדי ל×פשר ×ת ההעברה?',
-"delete_and_move_confirm" => "כן, מחק ×ת הדף",
-"delete_and_move_reason" => "מחיקה על מנת ל×פשר העברה",
-"selfmove" => "כותרות המקור והיעד זהות; ×œ× × ×™×ª×Ÿ להעביר דף לעצמו.",
-"immobile_namespace" => "כותרת המקור ×ו היעד ×”×™× ×¡×•×’ מיוחד של דף; ×œ× × ×™×ª×Ÿ להעביר ×“×¤×™× ×œ×ª×•×š ×ו מתוך מרחב ×©× ×–×”.",
+'delete_and_move_confirm' => 'כן, מחק ×ת הדף',
+'delete_and_move_reason' => 'מחיקה על מנת ל×פשר העברה',
+'selfmove' => 'כותרות המקור והיעד זהות; ×œ× × ×™×ª×Ÿ להעביר דף לעצמו.',
+'immobile_namespace' => 'כותרת המקור ×ו היעד ×”×™× ×¡×•×’ מיוחד של דף; ×œ× × ×™×ª×Ÿ להעביר ×“×¤×™× ×œ×ª×•×š ×ו מתוך מרחב ×©× ×–×”.',
# Export
-"export" => "×™×™×¦×•× ×“×¤×™×",
-"exporttext" => "ב××¤×©×¨×•×ª×›× ×œ×™×™×¦× ×ת התוכן ו×ת היסטוריית העריכה של דף ×חד ×ו של מספר דפי×, בתבנית של קובץ XML, שניתן ×œ×™×™×‘× ×ותו ×œ×ž×™×–× ×•×™×§×™ ×חר המשתמש בתוכנת מדיה־ויקי ב×מצעות הדף [[{{ns:special}}:Import]].
+'export' => '×™×™×¦×•× ×“×¤×™×',
+'exporttext' => 'ב××¤×©×¨×•×ª×›× ×œ×™×™×¦× ×ת התוכן ו×ת היסטוריית העריכה של דף ×חד ×ו של מספר דפי×, בתבנית של קובץ XML, שניתן ×œ×™×™×‘× ×ותו ×œ×ž×™×–× ×•×™×§×™ ×חר המשתמש בתוכנת מדיה־ויקי ב×מצעות הדף [[{{ns:special}}:Import]].
כדי ×œ×™×™×¦× ×“×¤×™×, הקישו ×ת ×©×ž×•×ª×™×”× ×‘×ª×™×‘×ª הטקסט שלהלן, כל ×©× ×‘×©×•×¨×” נפרדת, ובחרו ×”×× ×œ×™×™×¦× ×’× ×ת הגרסה הנוכחית ×•×’× ×ת היסטוריית ×”×©×™× ×•×™×™× ×©×œ הדפי×, ×ו רק ×ת הגרסה הנוכחית ×¢× ×ž×™×“×¢ על העריכה ×”×חרונה.
-בנוסף, ניתן להשתמש בקישור, כגון [[{{ns:special}}:Export/{{int:mainpage}}]] לדף {{int:mainpage}} ×œ×œ× ×”×™×¡×˜×•×¨×™×™×ª ×”×©×™× ×•×™×™× ×©×œ×•.",
-"exportcuronly" => "כלול רק ×ת הגרסה הנוכחית, ×œ×œ× ×›×œ ההיסטוריה",
-"exportnohistory" => "----
+בנוסף, ניתן להשתמש בקישור, כגון [[{{ns:special}}:Export/{{int:mainpage}}]] לדף {{int:mainpage}} ×œ×œ× ×”×™×¡×˜×•×¨×™×™×ª ×”×©×™× ×•×™×™× ×©×œ×•.',
+'exportcuronly' => 'כלול רק ×ת הגרסה הנוכחית, ×œ×œ× ×›×œ ההיסטוריה',
+'exportnohistory' => "----
'''הערה:''' ×™×™×¦×•× ×”×”×™×¡×˜×•×¨×™×” המל××” של ×“×¤×™× ×“×¨×š טופס ×–×” הופסקה עקב בעיות ביצוע.",
-"export-submit" => "ייצו×",
+'export-submit' => 'ייצו×',
# Namespace 8 related
-"allmessages" => "הודעות המערכת",
-"allmessagesname" => "ש×",
-"allmessagesdefault" => "טקסט ברירת מחדל",
-"allmessagescurrent" => "טקסט נוכחי",
-"allmessagestext" => "זוהי רשימת כל הודעות המערכת שבמרחב ×”×©× {{ns:mediawiki}}, ×”×ž×©×ž×©×™× ×ת ממשק ×”×תר.
-
-מפעילי המערכת ×™×›×•×œ×™× ×œ×¢×¨×•×š ×ת ההודעות בלחיצה על ×©× ×”×”×•×“×¢×”.",
-"allmessagesnotsupportedUI" => "שפת הממשק הנוכחית שלכ×, '''$1''', ××™× ×” נתמכת על־ידי הדף ב×תר ×–×”.",
-"allmessagesnotsupportedDB" => "×œ× × ×™×ª×Ÿ להשתמש בדף ×–×” כיוון ש־wgUseDatabseMessages מבוטל.",
-"allmessagesfilter" => "מסנן שמות ההודעות:",
-"allmessagesmodified" => "רק הודעות ששונו",
+'allmessages' => 'הודעות המערכת',
+'allmessagesname' => 'ש×',
+'allmessagesdefault' => 'טקסט ברירת מחדל',
+'allmessagescurrent' => 'טקסט נוכחי',
+'allmessagestext' => 'זוהי רשימת כל הודעות המערכת שבמרחב ×”×©× {{ns:mediawiki}}, ×”×ž×©×ž×©×™× ×ת ממשק ×”×תר.
+
+מפעילי המערכת ×™×›×•×œ×™× ×œ×¢×¨×•×š ×ת ההודעות בלחיצה על ×©× ×”×”×•×“×¢×”.',
+'allmessagesnotsupportedUI' => "שפת הממשק הנוכחית שלכ×, '''$1''', ××™× ×” נתמכת על־ידי הדף ב×תר ×–×”.",
+'allmessagesnotsupportedDB' => '×œ× × ×™×ª×Ÿ להשתמש בדף ×–×” כיוון ש־wgUseDatabseMessages מבוטל.',
+'allmessagesfilter' => 'מסנן שמות ההודעות:',
+'allmessagesmodified' => 'רק הודעות ששונו',
# Thumbnails
-"thumbnail-more" => "הגדל",
-"missingimage" => "'''תמונה חסרה'''
+'thumbnail-more' => 'הגדל',
+'missingimage' => "'''תמונה חסרה'''
'''$1''",
-"filemissing" => "קובץ חסר",
-"thumbnail_error" => "שגי××” ביצירת תמונה ממוזערת: $1",
+'filemissing' => 'קובץ חסר',
+'thumbnail_error' => 'שגי××” ביצירת תמונה ממוזערת: $1',
# Special:Import
-"import" => "×™×™×‘×•× ×“×¤×™×",
-"importinterwiki" => "×™×™×‘×•× ×‘×™×ŸÖ¾×תרי",
-"import-interwiki-text" => "×× × ×‘×—×¨×• ×תר ויקי ו×ת כותרת הדף לייבו×.
+'import' => '×™×™×‘×•× ×“×¤×™×',
+'importinterwiki' => '×™×™×‘×•× ×‘×™×ŸÖ¾×תרי',
+'import-interwiki-text' => '×× × ×‘×—×¨×• ×תר ויקי ו×ת כותרת הדף לייבו×.
ת×ריכי ועורכי הגרס×ות יישמרו בעת הייבו×.
-כל פעולות ×”×™×™×‘×•× ×”×‘×™×ŸÖ¾×תרי נשמרות ביומן הייבו×.",
-"import-interwiki-history" => "העתק ×ת כל היסטוריית העריכות של דף ×–×”",
-"import-interwiki-submit" => "ייבו×",
-"import-interwiki-namespace" => "העבר ×ת ×”×“×¤×™× ×œ×ª×•×š מרחב הש×:",
-"importtext" => "×× × ×™×™×¦×ו ×ת הקובץ מ×תר המקור תוך שימוש בעזר הייצו×, שמרו ×ותו לדיסק הקשיח ×©×œ×›× ×•×”×¢×œ×• ×ותו לכ×ן.",
-"importstart" => "×ž×™×™×‘× ×“×¤×™×…",
-"import-revision-count" => "{{plural:$1|גרסה ×חת|$1 גרס×ות}}",
-"importnopages" => "×ין ×“×¤×™× ×œ×™×™×‘×•×.",
-"importfailed" => "×”×™×™×‘×•× × ×›×©×œ: $1",
-"importunknownsource" => "סוג ×™×™×‘×•× ×‘×œ×ª×™ ידוע",
-"importcantopen" => "פתיחת קובץ ×”×™×™×‘×•× × ×›×©×œ×”",
-"importbadinterwiki" => "קישור ×ינטרוויקי שגוי",
-"importnotext" => "ריק ×ו חסר טקסט",
-"importsuccess" => "×”×™×™×‘×•× ×”×•×©×œ× ×‘×”×¦×œ×—×”!",
-"importhistoryconflict" => "ישנה התנגשות ×¢× ×”×”×™×¡×˜×•×¨×™×” הקיימת של הדף (ייתכן שהדף ×™×•×‘× ×‘×¢×‘×¨)",
-"importnosources" => "×ין מקורות ×œ×™×™×‘×•× ×‘×™×ŸÖ¾×תרי, ×•×™×™×‘×•× ×™×©×™×¨ של דף ×¢× ×”×™×¡×˜×•×¨×™×” ×ינו מ×ופשר כעת.",
-"importnofile" => "×œ× ×”×•×¢×œ×” קובץ ייבו×.",
-"importuploaderror" => "העל×ת קובץ ×™×™×‘×•× × ×›×©×œ×”; ייתכן שהקובץ גדול מגודל ההעל××” המותר.",
+כל פעולות ×”×™×™×‘×•× ×”×‘×™×ŸÖ¾×תרי נשמרות ביומן הייבו×.',
+'import-interwiki-history' => 'העתק ×ת כל היסטוריית העריכות של דף ×–×”',
+'import-interwiki-submit' => 'ייבו×',
+'import-interwiki-namespace' => 'העבר ×ת ×”×“×¤×™× ×œ×ª×•×š מרחב הש×:',
+'importtext' => '×× × ×™×™×¦×ו ×ת הקובץ מ×תר המקור תוך שימוש בעזר הייצו×, שמרו ×ותו לדיסק הקשיח ×©×œ×›× ×•×”×¢×œ×• ×ותו לכ×ן.',
+'importstart' => '×ž×™×™×‘× ×“×¤×™×…',
+'import-revision-count' => '{{plural:$1|גרסה ×חת|$1 גרס×ות}}',
+'importnopages' => '×ין ×“×¤×™× ×œ×™×™×‘×•×.',
+'importfailed' => '×”×™×™×‘×•× × ×›×©×œ: $1',
+'importunknownsource' => 'סוג ×™×™×‘×•× ×‘×œ×ª×™ ידוע',
+'importcantopen' => 'פתיחת קובץ ×”×™×™×‘×•× × ×›×©×œ×”',
+'importbadinterwiki' => 'קישור ×ינטרוויקי שגוי',
+'importnotext' => 'ריק ×ו חסר טקסט',
+'importsuccess' => '×”×™×™×‘×•× ×”×•×©×œ× ×‘×”×¦×œ×—×”!',
+'importhistoryconflict' => 'ישנה התנגשות ×¢× ×”×”×™×¡×˜×•×¨×™×” הקיימת של הדף (ייתכן שהדף ×™×•×‘× ×‘×¢×‘×¨)',
+'importnosources' => '×ין מקורות ×œ×™×™×‘×•× ×‘×™×ŸÖ¾×תרי, ×•×™×™×‘×•× ×™×©×™×¨ של דף ×¢× ×”×™×¡×˜×•×¨×™×” ×ינו מ×ופשר כעת.',
+'importnofile' => '×œ× ×”×•×¢×œ×” קובץ ייבו×.',
+'importuploaderror' => 'העל×ת קובץ ×™×™×‘×•× × ×›×©×œ×”; ייתכן שהקובץ גדול מגודל ההעל××” המותר.',
# Import log
-"importlogpage" => "יומן ייבו×",
-"importlogpagetext" => "×™×™×‘×•× ×ž× ×”×œ×™ של ×“×¤×™× ×›×•×œ×œ היסטוריית העריכות ×©×œ×”× ×ž×תרי ויקי ×חרי×.",
-"import-logentry-upload" => "×™×™×‘× ×ת $1 על־ידי העל×ת קובץ",
-"import-logentry-upload-detail" => "$1 גרס×ות",
-"import-logentry-interwiki" => "×™×™×‘× ×ת $1 ×‘×™×™×‘×•× ×‘×™×ŸÖ¾×תרי",
-"import-logentry-interwiki-detail" => "$1 גרס×ות מה×תר $2",
+'importlogpage' => 'יומן ייבו×',
+'importlogpagetext' => '×™×™×‘×•× ×ž× ×”×œ×™ של ×“×¤×™× ×›×•×œ×œ היסטוריית העריכות ×©×œ×”× ×ž×תרי ויקי ×חרי×.',
+'import-logentry-upload' => '×™×™×‘× ×ת [[$1]] על־ידי העל×ת קובץ',
+'import-logentry-upload-detail' => '$1 גרס×ות',
+'import-logentry-interwiki' => '×™×™×‘× ×ת $1 ×‘×™×™×‘×•× ×‘×™×ŸÖ¾×תרי',
+'import-logentry-interwiki-detail' => '$1 גרס×ות מה×תר $2',
# Keyboard access keys for power users
-"accesskey-search" => "f",
-"accesskey-minoredit" => "i",
-"accesskey-save" => "s",
-"accesskey-preview" => "p",
-"accesskey-diff" => "v",
-"accesskey-compareselectedversions" => "v",
-"accesskey-watch" => "w",
+'accesskey-search' => 'f',
+'accesskey-minoredit' => 'i',
+'accesskey-save' => 's',
+'accesskey-preview' => 'p',
+'accesskey-diff' => 'v',
+'accesskey-compareselectedversions' => 'v',
+'accesskey-watch' => 'w',
# Tooltip help for some actions, most are in Monobook.js
-"tooltip-search" => "חיפוש ב{{grammar:תחילית|{{SITENAME}}}} [Alt+F]",
-"tooltip-minoredit" => "סימון עריכה זו כמשנית [Alt+I]",
-"tooltip-save" => "שמירת ×ת ×”×©×™× ×•×™×™× ×©×‘×™×¦×¢×ª× [Alt+S]",
-"tooltip-preview" => "צפו בתצוגה מקדימה, ×× × ×”×©×ª×ž×©×• ב×פשרות זו לפני השמירה! [Alt+P]",
-"tooltip-diff" => "צפו ×‘×©×™× ×•×™×™× ×©×¢×¨×›×ª× ×‘×˜×§×¡×˜ [Alt+V]",
-"tooltip-compareselectedversions" => "צפו בהשוו××” של שתי גרס×ות של דף ×–×” [Alt+V]",
-"tooltip-watch" => "הוסיפו דף זה לרשימת המעקב [Alt+W]",
+'tooltip-search' => 'חיפוש ב{{grammar:תחילית|{{SITENAME}}}} [Alt+F]',
+'tooltip-minoredit' => 'סימון עריכה זו כמשנית [Alt+I]',
+'tooltip-save' => 'שמירת ×ת ×”×©×™× ×•×™×™× ×©×‘×™×¦×¢×ª× [Alt+S]',
+'tooltip-preview' => 'תצוגה מקדימה, ×× × ×”×©×ª×ž×©×• ב×פשרות זו לפני השמירה! [Alt+P]',
+'tooltip-diff' => 'צפו ×‘×©×™× ×•×™×™× ×©×¢×¨×›×ª× ×‘×˜×§×¡×˜ [Alt+V]',
+'tooltip-compareselectedversions' => 'צפו בהשוו××” של שתי גרס×ות של דף ×–×” [Alt+V]',
+'tooltip-watch' => 'הוסיפו דף זה לרשימת המעקב [Alt+W]',
# Stylesheets
-"Common.css" => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על כל ×”×¨×§×¢×™× */',
-"Monobook.css" => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על הרקע Monobook בלבד */',
+'common.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על כל ×”×¨×§×¢×™× */',
+'monobook.css' => '/* הסגנונות ×”× ×›×ª×‘×™× ×›×ן ישפיעו על הרקע Monobook בלבד */',
# Metadata
-"nodublincore" => "Dublin Core RDF metadata מנוטרל בשרת זה.",
-"nocreativecommons" => "Creative Commons RDF metadata מנוטרל בשרת זה.",
-"notacceptable" => "×”×תר ×œ× ×™×›×•×œ לספק מידע בפורמט שתוכנת הלקוח יכולה לקרו×.",
+'nodublincore' => 'Dublin Core RDF metadata מנוטרל בשרת זה.',
+'nocreativecommons' => 'Creative Commons RDF metadata מנוטרל בשרת זה.',
+'notacceptable' => '×”×תר ×œ× ×™×›×•×œ לספק מידע בפורמט שתוכנת הלקוח יכולה לקרו×.',
# Attribution
-"anonymous" => "משתמש(×™×) ×נונימי(×™×) של {{SITENAME}}",
-"siteuser" => "משתמש {{SITENAME}} $1",
-"lastmodifiedatby" => "דף ×–×” שונה ל×חרונה בת×ריך $2, $1 על־ידי $3.",
-"and" => "וג×",
-"othercontribs" => "מבוסס על העבודה של $1.",
-"others" => "×חרי×",
-"siteusers" => "משתמש(י) {{SITENAME}} $1",
-"creditspage" => "×§×¨×“×™×˜×™× ×‘×“×£",
-"nocredits" => "×ין ×§×¨×“×™×˜×™× ×–×ž×™× ×™× ×‘×“×£ ×–×”.",
+'anonymous' => 'משתמש(×™×) ×נונימי(×™×) של {{SITENAME}}',
+'siteuser' => 'משתמש {{SITENAME}} $1',
+'lastmodifiedatby' => 'דף ×–×” שונה ל×חרונה בת×ריך $2, $1 על־ידי $3.', # $1 date, $2 time, $3 user
+'and' => 'וג×',
+'othercontribs' => 'מבוסס על העבודה של $1.',
+'others' => '×חרי×',
+'siteusers' => 'משתמש(י) {{SITENAME}} $1',
+'creditspage' => '×§×¨×“×™×˜×™× ×‘×“×£',
+'nocredits' => '×ין ×§×¨×“×™×˜×™× ×–×ž×™× ×™× ×‘×“×£ ×–×”.',
# Spam protection
-"spamprotectiontitle" => "מנגנון מסנן הספ××",
-"spamprotectiontext" => "הדף ×ותו רצית לשמור × ×—×¡× ×¢×œÖ¾×™×“×™ מסנן הספ××. הסיבה לכך ×”×™× ×œ×¨×•×‘ קישור ל×תר חיצוני.",
-"spamprotectionmatch" => "הטקסט ×”×‘× ×”×•× ×©×’×¨× ×œ×”×¤×¢×œ×ª סינון הספ××: $1",
-"subcategorycount" => "{{plural:$1|ישנה קטגוריית משנה ×חת|ישנן $1 קטגוריות משנה}} בקטגוריה זו.",
-"categoryarticlecount" => "{{plural:$1|ישנו דף ×חד|×™×©× × $1 דפי×}} בקטגוריה זו.",
-"listingcontinuesabbrev" => " (המשך)",
-"spambot_username" => "MediaWiki spam cleanup",
-"spam_reverting" => "שיחזור לגרסה ×חרונה ×©×œ× ×›×•×œ×œ×ª ×§×™×©×•×¨×™× ×œÖ¾$1",
-"spam_blanking" => "כל הגרס×ות כוללות ×§×™×©×•×¨×™× ×œÖ¾$1, מרוקן ×ת הדף",
+'spamprotectiontitle' => 'מנגנון מסנן הספ××',
+'spamprotectiontext' => 'הדף ×ותו רצית לשמור × ×—×¡× ×¢×œÖ¾×™×“×™ מסנן הספ××. הסיבה לכך ×”×™× ×œ×¨×•×‘ קישור ל×תר חיצוני.',
+'spamprotectionmatch' => 'הטקסט ×”×‘× ×”×•× ×©×’×¨× ×œ×”×¤×¢×œ×ª סינון הספ××: $1',
+'subcategorycount' => '{{plural:$1|ישנה קטגוריית משנה ×חת|ישנן $1 קטגוריות משנה}} בקטגוריה זו.',
+'categoryarticlecount' => '{{plural:$1|ישנו דף ×חד|×™×©× × $1 דפי×}} בקטגוריה זו.',
+'category-media-count' => '{{plural:$1|ישנו קובץ ×חד|×™×©× × $1 קבצי×}} בקטגוריה זו',
+'listingcontinuesabbrev' => ' (המשך)',
+'spambot_username' => 'MediaWiki spam cleanup',
+'spam_reverting' => 'שיחזור לגרסה ×חרונה ×©×œ× ×›×•×œ×œ×ª ×§×™×©×•×¨×™× ×œÖ¾$1',
+'spam_blanking' => 'כל הגרס×ות כוללות ×§×™×©×•×¨×™× ×œÖ¾$1, מרוקן ×ת הדף',
# Info page
-"infosubtitle" => "מידע על הדף",
-"numedits" => "מספר עריכות (דף תוכן): $1",
-"numtalkedits" => "מספר עריכות (דף שיחה): $1",
-"numwatchers" => "מספר ×¦×•×¤×™× ×‘×“×£: $1",
-"numauthors" => "מספר ×›×•×ª×‘×™× × ×¤×¨×“×™× (דף תוכן): $1",
-"numtalkauthors" => "מספר ×›×•×ª×‘×™× × ×¤×¨×“×™× (דף שיחה): $1",
+'infosubtitle' => 'מידע על הדף',
+'numedits' => 'מספר עריכות (דף תוכן): $1',
+'numtalkedits' => 'מספר עריכות (דף שיחה): $1',
+'numwatchers' => 'מספר ×¦×•×¤×™× ×‘×“×£: $1',
+'numauthors' => 'מספר ×›×•×ª×‘×™× × ×¤×¨×“×™× (דף תוכן): $1',
+'numtalkauthors' => 'מספר ×›×•×ª×‘×™× × ×¤×¨×“×™× (דף שיחה): $1',
# Math options
-"mw_math_png" => "תמיד הצג כ־PNG",
-"mw_math_simple" => "HTML ×× ×¤×©×•×˜ מ×וד, ×חרת PNG",
-"mw_math_html" => "HTML ×× ×פשר, ×חרת PNG",
-"mw_math_source" => "הש×ר כקוד TeX (לדפדפני טקסט)",
-"mw_math_modern" => "מומלץ ×œ×“×¤×“×¤× ×™× ×¢×“×›× ×™×™×",
-"mw_math_mathml" => "MathML ×× ×פשר (ניסיוני)",
+'mw_math_png' => 'תמיד הצג כ־PNG',
+'mw_math_simple' => 'HTML ×× ×¤×©×•×˜ מ×וד, ×חרת PNG',
+'mw_math_html' => 'HTML ×× ×פשר, ×חרת PNG',
+'mw_math_source' => 'הש×ר כקוד TeX (לדפדפני טקסט)',
+'mw_math_modern' => 'מומלץ ×œ×“×¤×“×¤× ×™× ×¢×“×›× ×™×™×',
+'mw_math_mathml' => 'MathML ×× ×פשר (ניסיוני)',
# Patrolling
-"markaspatrolleddiff" => "סמן שינוי כבדוק",
-"markaspatrolledtext" => "סמן דף זה כבדוק",
-"markedaspatrolled" => "השינוי נבדק",
-"markedaspatrolledtext" => "השינוי שנבחר נבדק.",
-"rcpatroldisabled" => "בדיקת ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×ž×‘×•×˜×œ×ª",
-"rcpatroldisabledtext" => "תכונת סימון שינוי כבדוק ×‘×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×”×™× ×›×¨×’×¢ מנוטרלת.",
-"markedaspatrollederror" => "×œ× ×™×›×•×œ לסמן כבדוק",
-"markedaspatrollederrortext" => "×¢×œ×™×›× ×œ×¦×™×™×Ÿ גרסה שתציינו כבדוקה.",
+'markaspatrolleddiff' => 'סמן שינוי כבדוק',
+'markaspatrolledtext' => 'סמן דף זה כבדוק',
+'markedaspatrolled' => 'השינוי נבדק',
+'markedaspatrolledtext' => 'השינוי שנבחר נבדק.',
+'rcpatroldisabled' => 'בדיקת ×”×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×ž×‘×•×˜×œ×ª',
+'rcpatroldisabledtext' => 'תכונת סימון שינוי כבדוק ×‘×©×™× ×•×™×™× ×”××—×¨×•× ×™× ×”×™× ×›×¨×’×¢ מנוטרלת.',
+'markedaspatrollederror' => '×œ× ×™×›×•×œ לסמן כבדוק',
+'markedaspatrollederrortext' => '×¢×œ×™×›× ×œ×¦×™×™×Ÿ גרסה שתציינו כבדוקה.',
+'markedaspatrollederror-noautopatrol' => '××™× ×›× ×ž×•×¨×©×™× ×œ×¡×ž×Ÿ ×ת ×”×©×™× ×•×™×™× ×©×œ ×¢×¦×ž×›× ×›×‘×“×•×§×™×.',
# Monobook.js: tooltips and access keys for monobook
-"Monobook.js" => '/* ערכו קובץ ×–×” כדי להריץ ×¡×§×¨×™×¤×˜×™× ×‘Ö¾JavaScript ברקע Monobook ב×תר כולו */
+'monobook.js' => '/* ערכו קובץ ×–×” כדי להריץ ×¡×§×¨×™×¤×˜×™× ×‘Ö¾JavaScript ברקע Monobook ב×תר כולו */
/* חלונות ×§×•×¤×¦×™× ×•×ž×§×©×™× ×—×ž×™× */
var ta = new Object();
ta["pt-userpage"] = [".", "דף המשתמש שלי"];
@@ -1642,9 +1704,9 @@ ta["pt-watchlist"] = ["l", "רשימת ×”×“×¤×™× ×©×תה עוקב ××
ta["pt-mycontris"] = ["y", "רשימת התרומות שלי"];
ta["pt-login"] = ["o", "מומלץ להירש×, ×ך ×ין חובה לעשות כן"];
ta["pt-anonlogin"] = ["o", "מומלץ להירש×, ×ך ×ין חובה לעשות כן"];
-ta["pt-logout"] = ["o", "יצי××” מהחשבון"];
+ta["pt-logout"] = ["", "יצי××” מהחשבון"];
ta["ca-talk"] = ["t", "שוחחו על דף זה"];
-ta["ca-edit"] = ["e", "ב××¤×©×¨×•×ª×›× ×œ×¢×¨×•×š דף ×–×”. ×× × ×”×©×ª×ž×©×• בלחצן \\"הר××” תצוגה מקדימה\\" לפני השמירה."];
+ta["ca-edit"] = ["e", "ב××¤×©×¨×•×ª×›× ×œ×¢×¨×•×š דף ×–×”. ×× × ×”×©×ª×ž×©×• בלחצן \"תצוגה מקדימה\" לפני השמירה."];
ta["ca-addsection"] = ["+", "הוספת הערה לשיחה זו"];
ta["ca-viewsource"] = ["e", "זהו דף מוגן, ×ך ב×פשרותך לצפות במקורו"];
ta["ca-history"] = ["h", "גרס×ות קודמות של דף ×–×”."];
@@ -1682,364 +1744,377 @@ ta["ca-nstab-template"] = ["c", "צפו בתבנית"];
ta["ca-nstab-help"] = ["c", "צפו בדף העזרה"];
ta["ca-nstab-category"] = ["c", "צפו בדף הקטגוריה"];',
+# Common.js: contains nothing but a placeholder comment
+'common.js' => '/* כל סקריפט JavaScript שנכתב ×›×ן ירוץ עבור כל ×”×ž×©×ª×ž×©×™× ×‘×›×œ טעינת עמוד */',
+
# Image deletion
-"deletedrevision" => "מחק גרסה ישנה $1.",
+'deletedrevision' => 'מחק גרסה ישנה $1.',
# Browsing diffs
-"previousdiff" => "→ עבור להשוו×ת הגרס×ות הקודמת",
-"nextdiff" => "עבור להשוו×ת הגרס×ות הב××” â†",
-
-"imagemaxsize" => "הגבל תמונות בדפי תי×ור תמונה ל:",
-"thumbsize" => "הקטן לגודל של:",
-"showbigimage" => "הורד גרסת רזולוציה גבוהה ($1x$2, גודל: $3 קילובייטי×)",
-
-"newimages" => "גלריית תמונות חדשות",
-"showhidebots" => "($1 בוטי×)",
-"noimages" => "×ין תמונות.",
-
-# Short names for language variants used for language conversion links.
-# To disable showing a particular link, set it to 'disable', e.g.
-# "variantname-zh-sg" => "disable",
-"variantname-zh-cn" => "cn",
-"variantname-zh-tw" => "tw",
-"variantname-zh-hk" => "hk",
-"variantname-zh-sg" => "sg",
-"variantname-zh" => "zh",
+'previousdiff' => '→ עבור להשוו×ת הגרס×ות הקודמת',
+'nextdiff' => 'עבור להשוו×ת הגרס×ות הב××” â†',
+
+'imagemaxsize' => 'הגבל תמונות בדפי תי×ור תמונה ל:',
+'thumbsize' => 'הקטן לגודל של:',
+'showbigimage' => 'הורד גרסת רזולוציה גבוהה ($1x$2, גודל: $3 קילובייטי×)',
+
+'newimages' => 'גלריית תמונות חדשות',
+'showhidebots' => '($1 בוטי×)',
+'noimages' => '×ין תמונות.',
+
+/*
+Short names for language variants used for language conversion links.
+To disable showing a particular link, set it to 'disable', e.g.
+'variantname-zh-sg' => 'disable',
+Variants for Chinese language
+*/
+'variantname-zh-cn' => 'cn',
+'variantname-zh-tw' => 'tw',
+'variantname-zh-hk' => 'hk',
+'variantname-zh-sg' => 'sg',
+'variantname-zh' => 'zh',
+
# Variants for Serbian language
-"variantname-sr-ec" => "sr-ec",
-"variantname-sr-el" => "sr-el",
-"variantname-sr-jc" => "sr-jc",
-"variantname-sr-jl" => "sr-jl",
-"variantname-sr" => "sr",
+'variantname-sr-ec' => 'sr-ec',
+'variantname-sr-el' => 'sr-el',
+'variantname-sr-jc' => 'sr-jc',
+'variantname-sr-jl' => 'sr-jl',
+'variantname-sr' => 'sr',
+
# Variants for Kazakh language
-"variantname-kk-tr" => "kk-tr",
-"variantname-kk-kz" => "kk-kz",
-"variantname-kk-cn" => "kk-cn",
-"variantname-kk" => "kk",
+'variantname-kk-tr' => 'kk-tr',
+'variantname-kk-kz' => 'kk-kz',
+'variantname-kk-cn' => 'kk-cn',
+'variantname-kk' => 'kk',
-# labels for User: and Title: on Special:Log pages
-"specialloguserlabel" => "משתמש:",
-"speciallogtitlelabel" => "כותרת:",
+# Labels for User: and Title: on Special:Log pages
+'specialloguserlabel' => 'משתמש:',
+'speciallogtitlelabel' => 'כותרת:',
-"passwordtooshort" => "×¡×™×¡×ž×ª×›× ×§×¦×¨×” מדי. עליה להיות מורכבת מ־$1 ×ª×•×•×™× ×œ×¤×—×•×ª.",
+'passwordtooshort' => '×¡×™×¡×ž×ª×›× ×§×¦×¨×” מדי. עליה להיות מורכבת מ־$1 ×ª×•×•×™× ×œ×¤×—×•×ª.',
# Media Warning
-"mediawarning" => "'''×זהרה:''' קובץ ×–×” עלול להכיל קוד זדוני, שהרצתו עלולה לסכן ×ת המערכת שלכ×.<hr />",
+'mediawarning' => "'''×זהרה:''' קובץ ×–×” עלול להכיל קוד זדוני, שהרצתו עלולה לסכן ×ת המערכת שלכ×.<hr />",
-"fileinfo" => "$1 קילובייטי×, סוג MIME: <code>$2</code>",
+'fileinfo' => '$1 קילובייטי×, סוג MIME: <code>$2</code>',
# Metadata
-"metadata" => "מידע נוסף על התמונה",
-"metadata-help" => "קובץ ×–×” מכיל מידע נוסף, שיש להניח שהגיע ממצלמה דיגיטלית ×ו מסורק בו התמונה נוצרה ×ו עברה דיגיטציה. ×× ×”×§×•×‘×¥ שונה ממצבו הר×שוני, כמה ×ž×”× ×ª×•× ×™× ×œ×”×œ×Ÿ ×¢×œ×•×œ×™× ×©×œ× ×œ×©×§×£ ב×ופן ×ž×œ× ×ת מצב התמונה החדש.",
-"metadata-expand" => "הצג ×¤×¨×˜×™× ×ž×•×¨×—×‘×™×",
-"metadata-collapse" => "הסתר ×¤×¨×˜×™× ×ž×•×¨×—×‘×™×",
-"metadata-fields" => "שדות המידע הנוסף של EXIF ×”×לה ××™× × ×¤×¨×˜×™× ×ž×•×¨×—×‘×™× ×•×™×•×¦×’×• תמיד, לעומת הש×ר:
+'metadata' => 'מידע נוסף על התמונה',
+'metadata-help' => 'קובץ ×–×” מכיל מידע נוסף, שיש להניח שהגיע ממצלמה דיגיטלית ×ו מסורק בו התמונה נוצרה ×ו עברה דיגיטציה. ×× ×”×§×•×‘×¥ שונה ממצבו הר×שוני, כמה ×ž×”× ×ª×•× ×™× ×œ×”×œ×Ÿ ×¢×œ×•×œ×™× ×©×œ× ×œ×©×§×£ ב×ופן ×ž×œ× ×ת מצב התמונה החדש.',
+'metadata-expand' => 'הצג ×¤×¨×˜×™× ×ž×•×¨×—×‘×™×',
+'metadata-collapse' => 'הסתר ×¤×¨×˜×™× ×ž×•×¨×—×‘×™×',
+'metadata-fields' => 'שדות המידע הנוסף של EXIF ×”×לה ××™× × ×¤×¨×˜×™× ×ž×•×¨×—×‘×™× ×•×™×•×¦×’×• תמיד, לעומת הש×ר:
* make
* model
* datetimeoriginal
* exposuretime
* fnumber
-* focallength",
-
-# Exif tags
-"exif-imagewidth" => "רוחב",
-"exif-imagelength" => "גובה",
-"exif-bitspersample" => "×‘×™×˜×™× ×œ×¨×›×™×‘",
-"exif-compression" => "תבנית דחיסה",
-"exif-photometricinterpretation" => "הרכב פיקסלי×",
-"exif-orientation" => "כיווניות",
-"exif-samplesperpixel" => "מספר רכיבי×",
-"exif-planarconfiguration" => "סידור מידע",
-"exif-ycbcrsubsampling" => "הפחתת יחס Y ל־C",
-"exif-ycbcrpositioning" => "×ž×™×§×•× Y ו־C",
-"exif-xresolution" => "רזולוציה ×ופקית",
-"exif-yresolution" => "רזולוציה ×נכית",
-"exif-resolutionunit" => "יחידות מידה של רזולוציות X ו־Y",
-"exif-stripoffsets" => "×ž×™×§×•× ×ž×™×“×¢ התמונה",
-"exif-rowsperstrip" => "מספר השורות לרצועה",
-"exif-stripbytecounts" => "×‘×™×™×˜×™× ×œ×¨×¦×•×¢×” דחוסה",
-"exif-jpeginterchangeformat" => "יחס ל־JPEG SOI",
-"exif-jpeginterchangeformatlength" => "×‘×™×™×˜×™× ×©×œ מידע JPEG",
-"exif-transferfunction" => "פונקציית העברה",
-"exif-whitepoint" => "נקודה לבנה צבעונית",
-"exif-primarychromaticities" => "צבעוניות ה־Primarity",
-"exif-ycbcrcoefficients" => "מקדמי פעולת הטרנספורמציה של מרחב הצבע",
-"exif-referenceblackwhite" => "זוג ערכי התייחסות לשחור ולבן",
-"exif-datetime" => "ת×ריך ושעת שינוי הקובץ",
-"exif-imagedescription" => "כותרת התמונה",
-"exif-make" => "יצרן המצלמה",
-"exif-model" => "×“×’× ×”×ž×¦×œ×ž×”",
-"exif-software" => "תוכנה בשימוש",
-"exif-artist" => "מחבר",
-"exif-copyright" => "בעל זכויות היוצרי×",
-"exif-exifversion" => "גרסת Exif",
-"exif-flashpixversion" => "גרסת Flashpix נתמכת",
-"exif-colorspace" => "מרחב הצבע",
-"exif-componentsconfiguration" => "משמעות כל רכיב",
-"exif-compressedbitsperpixel" => "שיטת דחיסת התמונה",
-"exif-pixelydimension" => "רוחב התמונה הנכון",
-"exif-pixelxdimension" => "גובה התמונה הנכון",
-"exif-makernote" => "הערות היצרן",
-"exif-usercomment" => "הערות המשתמש",
-"exif-relatedsoundfile" => "קובץ שמע מקושר",
-"exif-datetimeoriginal" => "ת×ריך ושעת יצירת הקובץ",
-"exif-datetimedigitized" => "ת×ריך ושעת הפיכת הקובץ לדיגיטלי",
-"exif-subsectime" => "תת־השניות של שינוי הקובץ",
-"exif-subsectimeoriginal" => "תת־השניות של יצירת הקובץ",
-"exif-subsectimedigitized" => "תת־השניות של הפיכת הקובץ לדיגיטלי",
-"exif-exposuretime" => "זמן חשיפה",
-"exif-exposuretime-format" => "$1 שניות ($2)",
-"exif-fnumber" => "מספר F",
-"exif-fnumber-format" => "f/$1",
-"exif-exposureprogram" => "תוכנת החשיפה",
-"exif-spectralsensitivity" => "רגישות הספקטרו×",
-"exif-isospeedratings" => "דירוג מהירות ה־ISO",
-"exif-oecf" => "×ž×§×“× ×”×ž×¨×” ×ופטו־×לקטרוני",
-"exif-shutterspeedvalue" => "מהירות צמצ×",
-"exif-aperturevalue" => "פתח",
-"exif-brightnessvalue" => "בהירות",
-"exif-exposurebiasvalue" => "נטיית החשיפה",
-"exif-maxaperturevalue" => "גודל הפתח המקסימ×לי",
-"exif-subjectdistance" => "× ×•×©× ×”×ž×¨×—×§",
-"exif-meteringmode" => "שיטת מדידה",
-"exif-lightsource" => "מקור ×ור",
-"exif-flash" => "פלש",
-"exif-focallength" => "×ורך מוקדי העדשות",
-"exif-focallength-format" => '$1 מ"מ',
-"exif-subjectarea" => "× ×•×©× ×”×זור",
-"exif-flashenergy" => "×נרגיית הפלש",
-"exif-spatialfrequencyresponse" => "תדירות התגובה המרחבית",
-"exif-focalplanexresolution" => "משטח הפוקוס ברזולוציה ×”×ופקית",
-"exif-focalplaneyresolution" => "משטח הפוקוס ברזולוציה ×”×נכית",
-"exif-focalplaneresolutionunit" => "יחידת המידה של משטח הפוקוס ברזולוציה",
-"exif-subjectlocation" => "× ×•×©× ×”×ž×™×§×•×",
-"exif-exposureindex" => "מדד החשיפה",
-"exif-sensingmethod" => "שיטת חישה",
-"exif-filesource" => "מקור הקובץ",
-"exif-scenetype" => "סוג הסצנה",
-"exif-cfapattern" => "תבנית CFA",
-"exif-customrendered" => "עיבוד תמונה מות××",
-"exif-exposuremode" => "מצב החשיפה",
-"exif-whitebalance" => "×יזון צבע לבן",
-"exif-digitalzoomratio" => "יחס ×”×–×•× ×”×“×™×’×™×˜×œ×™",
-"exif-focallengthin35mmfilm" => '×ורך מוקדי העדשות בסרט ×¦×™×œ×•× ×©×œ 35 מ"מ',
-"exif-scenecapturetype" => "×ופן ×¦×™×œ×•× ×”×¡×¦× ×”",
-"exif-gaincontrol" => "בקרת הסצנה",
-"exif-contrast" => "ניגוד",
-"exif-saturation" => "רוויה",
-"exif-sharpness" => "חדות",
-"exif-devicesettingdescription" => "תי×ור הגדרות ההתקן",
-"exif-subjectdistancerange" => "טווח × ×•×©× ×”×ž×¨×—×§",
-"exif-imageuniqueid" => "מזהה תמונה ייחודי",
-"exif-gpsversionid" => "גרסת תגי GPS",
-"exif-gpslatituderef" => "קו־רוחב צפוני ×ו דרומי",
-"exif-gpslatitude" => "קו־רוחב",
-"exif-gpslongituderef" => "קו־×ורך מזרחי ×ו מערבי",
-"exif-gpslongitude" => "קו־×ורך",
-"exif-gpsaltituderef" => "התייחסות גובה",
-"exif-gpsaltitude" => "גובה",
-"exif-gpstimestamp" => "זמן GPS (שעון ×טומי)",
-"exif-gpssatellites" => "×œ×•×•×™×™× ×™× ×©×©×ž×©×• למדידה",
-"exif-gpsstatus" => "מעמד המקלט",
-"exif-gpsmeasuremode" => "מצב מדידה",
-"exif-gpsdop" => "דיוק מדידה",
-"exif-gpsspeedref" => "יחידת מהירות",
-"exif-gpsspeed" => "יחידת מהירות של מקלט GPS",
-"exif-gpstrackref" => "התייחסות מהירות התנועה",
-"exif-gpstrack" => "מהירות התנועה",
-"exif-gpsimgdirectionref" => "התייחסות כיוון התמונה",
-"exif-gpsimgdirection" => "כיוון התמונה",
-"exif-gpsmapdatum" => "מידע סקר מדידת ×”×רץ שנעשה בו שימוש",
-"exif-gpsdestlatituderef" => "התייחסות קו־הרוחב של היעד",
-"exif-gpsdestlatitude" => "קו־הרוחב של היעד",
-"exif-gpsdestlongituderef" => "התייחסות קו־ה×ורך של היעד",
-"exif-gpsdestlongitude" => "קו־ה×ורך של היעד",
-"exif-gpsdestbearingref" => "התייחסות כיוון היעד",
-"exif-gpsdestbearing" => "כיוון היעד",
-"exif-gpsdestdistanceref" => "התייחסות מרחק ליעד",
-"exif-gpsdestdistance" => "מרחק ליעד",
-"exif-gpsprocessingmethod" => "×©× ×©×™×˜×ª העיבוד של ×”Ö¾GPS",
-"exif-gpsareainformation" => "×©× ×זור ×”Ö¾GPS",
-"exif-gpsdatestamp" => "ת×ריך ×”Ö¾GPS",
-"exif-gpsdifferential" => "תיקון דיפרנצי×לי של ×”Ö¾GPS",
-
-# Exif attributes
-
-"exif-compression-1" => "×œ× ×“×—×•×¡",
-"exif-compression-6" => "JPEG",
-
-"exif-photometricinterpretation-2" => "RGB",
-"exif-photometricinterpretation-6" => "YCbCr",
-
-"exif-orientation-1" => "רגילה", # 0th row: top; 0th column: left
-"exif-orientation-2" => "הפוך ×ופקית", # 0th row: top; 0th column: right
-"exif-orientation-3" => "מסובב 180°", # 0th row: bottom; 0th column: right
-"exif-orientation-4" => "הפוך ×נכית", # 0th row: bottom; 0th column: left
-"exif-orientation-5" => "מסובב 90° נגד כיוון השעון והפוך ×נכית", # 0th row: left; 0th column: top
-"exif-orientation-6" => "מסובב 90° ×¢× ×›×™×•×•×Ÿ השעון", # 0th row: right; 0th column: top
-"exif-orientation-7" => "מסובב 90° ×¢× ×›×™×•×•×Ÿ השעון והפוך ×נכית", # 0th row: right; 0th column: bottom
-"exif-orientation-8" => "מסובב 90° נגד כיוון השעון", # 0th row: left; 0th column: bottom
-
-"exif-planarconfiguration-1" => "פורמט חסון",
-"exif-planarconfiguration-2" => "פורמט שטוח",
-
-"exif-xyresolution-i" => "$1 dpi",
-"exif-xyresolution-c" => "$1 dpc",
-
-"exif-colorspace-1" => "sRGB",
-"exif-colorspace-ffff.h" => "FFFF.H",
-
-"exif-componentsconfiguration-0" => "×ינו קיי×",
-"exif-componentsconfiguration-1" => "Y",
-"exif-componentsconfiguration-2" => "Cb",
-"exif-componentsconfiguration-3" => "Cr",
-"exif-componentsconfiguration-4" => "R",
-"exif-componentsconfiguration-5" => "G",
-"exif-componentsconfiguration-6" => "B",
-
-"exif-exposureprogram-0" => "×œ× ×”×•×’×“×¨×”",
-"exif-exposureprogram-1" => "ידנית",
-"exif-exposureprogram-2" => "תוכנה רגילה",
-"exif-exposureprogram-3" => "עדיפות פתח",
-"exif-exposureprogram-4" => "עדיפות צמצ×",
-"exif-exposureprogram-5" => "תוכנה יוצרת (מטה לכיוון עומק השדה)",
-"exif-exposureprogram-6" => "תוכנה פועלת (מטה לכיוון מהירות ×¦×ž×¦× ×’×‘×•×”×”)",
-"exif-exposureprogram-7" => "מצב דיוקן (לתמונות ×¦×™×œ×•× ×ž×§×¨×•×‘ כשהרקע ×œ× ×‘×¤×•×§×•×¡)",
-"exif-exposureprogram-8" => "מצב נוף (לתמונות נוף כשהרקע בפוקוס)",
-
-"exif-subjectdistance-value" => "$1 מטרי×",
-
-"exif-meteringmode-0" => "×œ× ×™×“×•×¢",
-"exif-meteringmode-1" => "ממוצע",
-"exif-meteringmode-2" => "מרכז משקל ממוצע",
-"exif-meteringmode-3" => "נקודה",
-"exif-meteringmode-4" => "רב־נקודה",
-"exif-meteringmode-5" => "תבנית",
-"exif-meteringmode-6" => "חלקי",
-"exif-meteringmode-255" => "×חר",
-
-"exif-lightsource-0" => "×œ× ×™×“×•×¢",
-"exif-lightsource-1" => "×ור יו×",
-"exif-lightsource-2" => "פלו×ורסצנטי",
-"exif-lightsource-3" => "טונגסטן (×ור מתלהט)",
-"exif-lightsource-4" => "פלש",
-"exif-lightsource-9" => "מזג ×וויר טוב",
-"exif-lightsource-10" => "מזג ×וויר מעונן",
-"exif-lightsource-11" => "צל",
-"exif-lightsource-12" => "×ור ×™×•× ×¤×œ×•×ורסצנטי (D 5700 – 7100K)",
-"exif-lightsource-13" => "×ור ×™×•× ×œ×‘×Ÿ פלו×ורסצנטי (N 4600 – 5400K)",
-"exif-lightsource-14" => "×ור ×™×•× ×§×¨×™×¨ לבן פלו×ורסצנטי (W 3900 – 4500K)",
-"exif-lightsource-15" => "פלו×ורסצנטי לבן (WW 3200 – 3700K)",
-"exif-lightsource-17" => "×ור רגיל A",
-"exif-lightsource-18" => "×ור רגיל B",
-"exif-lightsource-19" => "×ור רגיל C",
-"exif-lightsource-20" => "D55",
-"exif-lightsource-21" => "D65",
-"exif-lightsource-22" => "D75",
-"exif-lightsource-23" => "D50",
-"exif-lightsource-24" => "טונגסטן ×ולפן ISO",
-"exif-lightsource-255" => "מקור ×ור ×חר",
-
-"exif-focalplaneresolutionunit-2" => "×ינצ'×™×",
-
-"exif-sensingmethod-1" => "×œ× ×ž×•×’×“×¨×ª",
-"exif-sensingmethod-2" => "חיישן ×זור בצבע ×¢× ×©×‘×‘ ×חד",
-"exif-sensingmethod-3" => "חיישן ×זור בצבע ×¢× ×©× ×™ שבבי×",
-"exif-sensingmethod-4" => "חיישן ×זור בצבע ×¢× ×©×œ×•×©×” שבבי×",
-"exif-sensingmethod-5" => "חיישן ×זור ×¢× ×¦×‘×¢ רציף",
-"exif-sensingmethod-7" => "חיישן טריליני×רי",
-"exif-sensingmethod-8" => "חיישן ×¢× ×¦×‘×¢ רציף ליני×רי",
-
-"exif-filesource-3" => "DSC",
-
-"exif-scenetype-1" => "תמונה שצולמה ישירות",
-
-"exif-customrendered-0" => "תהליך רגיל",
-"exif-customrendered-1" => "תהליך מות××",
-
-"exif-exposuremode-0" => "חשיפה ×וטומטית",
-"exif-exposuremode-1" => "חשיפה ידנית",
-"exif-exposuremode-2" => "מסגרת ×וטומטית",
-
-"exif-whitebalance-0" => "×יזון צבע לבן ×וטומטי",
-"exif-whitebalance-1" => "×יזון צבע לבן ידני",
-
-"exif-scenecapturetype-0" => "רגיל",
-"exif-scenecapturetype-1" => "נוף",
-"exif-scenecapturetype-2" => "דיוקן",
-"exif-scenecapturetype-3" => "סצנה לילית",
-
-"exif-gaincontrol-0" => "לל×",
-"exif-gaincontrol-1" => "תוספת נמוכה למעלה",
-"exif-gaincontrol-2" => "תוספת גבוהה למעלה",
-"exif-gaincontrol-3" => "תוספת נמוכה למטה",
-"exif-gaincontrol-4" => "תוספת גבוהה למטה",
-
-"exif-contrast-0" => "רגיל",
-"exif-contrast-1" => "רך",
-"exif-contrast-2" => "קשה",
-
-"exif-saturation-0" => "רגילה",
-"exif-saturation-1" => "רוויה נמוכה",
-"exif-saturation-2" => "רוויה גבוהה",
-
-"exif-sharpness-0" => "רגילה",
-"exif-sharpness-1" => "רכה",
-"exif-sharpness-2" => "קשה",
-
-"exif-subjectdistancerange-0" => "×œ× ×™×“×•×¢",
-"exif-subjectdistancerange-1" => "מ×קרו",
-"exif-subjectdistancerange-2" => "תצוגה קרובה",
-"exif-subjectdistancerange-3" => "תצוגה רחוקה",
+* focallength',
+
+# EXIF tags
+'exif-imagewidth' => 'רוחב',
+'exif-imagelength' => 'גובה',
+'exif-bitspersample' => '×‘×™×˜×™× ×œ×¨×›×™×‘',
+'exif-compression' => 'תבנית דחיסה',
+'exif-photometricinterpretation' => 'הרכב פיקסלי×',
+'exif-orientation' => 'כיווניות',
+'exif-samplesperpixel' => 'מספר רכיבי×',
+'exif-planarconfiguration' => 'סידור מידע',
+'exif-ycbcrsubsampling' => 'הפחתת יחס Y ל־C',
+'exif-ycbcrpositioning' => '×ž×™×§×•× Y ו־C',
+'exif-xresolution' => 'רזולוציה ×ופקית',
+'exif-yresolution' => 'רזולוציה ×נכית',
+'exif-resolutionunit' => 'יחידות מידה של רזולוציות X ו־Y',
+'exif-stripoffsets' => '×ž×™×§×•× ×ž×™×“×¢ התמונה',
+'exif-rowsperstrip' => 'מספר השורות לרצועה',
+'exif-stripbytecounts' => '×‘×™×™×˜×™× ×œ×¨×¦×•×¢×” דחוסה',
+'exif-jpeginterchangeformat' => 'יחס ל־JPEG SOI',
+'exif-jpeginterchangeformatlength' => '×‘×™×™×˜×™× ×©×œ מידע JPEG',
+'exif-transferfunction' => 'פונקציית העברה',
+'exif-whitepoint' => 'נקודה לבנה צבעונית',
+'exif-primarychromaticities' => 'צבעוניות ה־Primarity',
+'exif-ycbcrcoefficients' => 'מקדמי פעולת הטרנספורמציה של מרחב הצבע',
+'exif-referenceblackwhite' => 'זוג ערכי התייחסות לשחור ולבן',
+'exif-datetime' => 'ת×ריך ושעת שינוי הקובץ',
+'exif-imagedescription' => 'כותרת התמונה',
+'exif-make' => 'יצרן המצלמה',
+'exif-model' => '×“×’× ×”×ž×¦×œ×ž×”',
+'exif-software' => 'תוכנה בשימוש',
+'exif-artist' => 'מחבר',
+'exif-copyright' => 'בעל זכויות היוצרי×',
+'exif-exifversion' => 'גרסת Exif',
+'exif-flashpixversion' => 'גרסת Flashpix נתמכת',
+'exif-colorspace' => 'מרחב הצבע',
+'exif-componentsconfiguration' => 'משמעות כל רכיב',
+'exif-compressedbitsperpixel' => 'שיטת דחיסת התמונה',
+'exif-pixelydimension' => 'רוחב התמונה הנכון',
+'exif-pixelxdimension' => 'גובה התמונה הנכון',
+'exif-makernote' => 'הערות היצרן',
+'exif-usercomment' => 'הערות המשתמש',
+'exif-relatedsoundfile' => 'קובץ שמע מקושר',
+'exif-datetimeoriginal' => 'ת×ריך ושעת יצירת הקובץ',
+'exif-datetimedigitized' => 'ת×ריך ושעת הפיכת הקובץ לדיגיטלי',
+'exif-subsectime' => 'תת־השניות של שינוי הקובץ',
+'exif-subsectimeoriginal' => 'תת־השניות של יצירת הקובץ',
+'exif-subsectimedigitized' => 'תת־השניות של הפיכת הקובץ לדיגיטלי',
+'exif-exposuretime' => 'זמן חשיפה',
+'exif-exposuretime-format' => '$1 שניות ($2)',
+'exif-fnumber' => 'מספר F',
+'exif-fnumber-format' => 'f/$1',
+'exif-exposureprogram' => 'תוכנת החשיפה',
+'exif-spectralsensitivity' => 'רגישות הספקטרו×',
+'exif-isospeedratings' => 'דירוג מהירות ה־ISO',
+'exif-oecf' => '×ž×§×“× ×”×ž×¨×” ×ופטו־×לקטרוני',
+'exif-shutterspeedvalue' => 'מהירות צמצ×',
+'exif-aperturevalue' => 'פתח',
+'exif-brightnessvalue' => 'בהירות',
+'exif-exposurebiasvalue' => 'נטיית החשיפה',
+'exif-maxaperturevalue' => 'גודל הפתח המקסימ×לי',
+'exif-subjectdistance' => '× ×•×©× ×”×ž×¨×—×§',
+'exif-meteringmode' => 'שיטת מדידה',
+'exif-lightsource' => 'מקור ×ור',
+'exif-flash' => 'פלש',
+'exif-focallength' => '×ורך מוקדי העדשות',
+'exif-focallength-format' => '$1 מ"מ',
+'exif-subjectarea' => '× ×•×©× ×”×זור',
+'exif-flashenergy' => '×נרגיית הפלש',
+'exif-spatialfrequencyresponse' => 'תדירות התגובה המרחבית',
+'exif-focalplanexresolution' => 'משטח הפוקוס ברזולוציה ×”×ופקית',
+'exif-focalplaneyresolution' => 'משטח הפוקוס ברזולוציה ×”×נכית',
+'exif-focalplaneresolutionunit' => 'יחידת המידה של משטח הפוקוס ברזולוציה',
+'exif-subjectlocation' => '× ×•×©× ×”×ž×™×§×•×',
+'exif-exposureindex' => 'מדד החשיפה',
+'exif-sensingmethod' => 'שיטת חישה',
+'exif-filesource' => 'מקור הקובץ',
+'exif-scenetype' => 'סוג הסצנה',
+'exif-cfapattern' => 'תבנית CFA',
+'exif-customrendered' => 'עיבוד תמונה מות××',
+'exif-exposuremode' => 'מצב החשיפה',
+'exif-whitebalance' => '×יזון צבע לבן',
+'exif-digitalzoomratio' => 'יחס ×”×–×•× ×”×“×™×’×™×˜×œ×™',
+'exif-focallengthin35mmfilm' => '×ורך מוקדי העדשות בסרט ×¦×™×œ×•× ×©×œ 35 מ"מ',
+'exif-scenecapturetype' => '×ופן ×¦×™×œ×•× ×”×¡×¦× ×”',
+'exif-gaincontrol' => 'בקרת הסצנה',
+'exif-contrast' => 'ניגוד',
+'exif-saturation' => 'רוויה',
+'exif-sharpness' => 'חדות',
+'exif-devicesettingdescription' => 'תי×ור הגדרות ההתקן',
+'exif-subjectdistancerange' => 'טווח × ×•×©× ×”×ž×¨×—×§',
+'exif-imageuniqueid' => 'מזהה תמונה ייחודי',
+'exif-gpsversionid' => 'גרסת תגי GPS',
+'exif-gpslatituderef' => 'קו־רוחב צפוני ×ו דרומי',
+'exif-gpslatitude' => 'קו־רוחב',
+'exif-gpslongituderef' => 'קו־×ורך מזרחי ×ו מערבי',
+'exif-gpslongitude' => 'קו־×ורך',
+'exif-gpsaltituderef' => 'התייחסות גובה',
+'exif-gpsaltitude' => 'גובה',
+'exif-gpstimestamp' => 'זמן GPS (שעון ×טומי)',
+'exif-gpssatellites' => '×œ×•×•×™×™× ×™× ×©×©×ž×©×• למדידה',
+'exif-gpsstatus' => 'מעמד המקלט',
+'exif-gpsmeasuremode' => 'מצב מדידה',
+'exif-gpsdop' => 'דיוק מדידה',
+'exif-gpsspeedref' => 'יחידת מהירות',
+'exif-gpsspeed' => 'יחידת מהירות של מקלט GPS',
+'exif-gpstrackref' => 'התייחסות מהירות התנועה',
+'exif-gpstrack' => 'מהירות התנועה',
+'exif-gpsimgdirectionref' => 'התייחסות כיוון התמונה',
+'exif-gpsimgdirection' => 'כיוון התמונה',
+'exif-gpsmapdatum' => 'מידע סקר מדידת ×”×רץ שנעשה בו שימוש',
+'exif-gpsdestlatituderef' => 'התייחסות קו־הרוחב של היעד',
+'exif-gpsdestlatitude' => 'קו־הרוחב של היעד',
+'exif-gpsdestlongituderef' => 'התייחסות קו־ה×ורך של היעד',
+'exif-gpsdestlongitude' => 'קו־ה×ורך של היעד',
+'exif-gpsdestbearingref' => 'התייחסות כיוון היעד',
+'exif-gpsdestbearing' => 'כיוון היעד',
+'exif-gpsdestdistanceref' => 'התייחסות מרחק ליעד',
+'exif-gpsdestdistance' => 'מרחק ליעד',
+'exif-gpsprocessingmethod' => '×©× ×©×™×˜×ª העיבוד של ×”Ö¾GPS',
+'exif-gpsareainformation' => '×©× ×זור ×”Ö¾GPS',
+'exif-gpsdatestamp' => 'ת×ריך ×”Ö¾GPS',
+'exif-gpsdifferential' => 'תיקון דיפרנצי×לי של ×”Ö¾GPS',
+
+# EXIF attributes
+'exif-compression-1' => '×œ× ×“×—×•×¡',
+'exif-compression-6' => 'JPEG',
+
+'exif-photometricinterpretation-2' => 'RGB',
+'exif-photometricinterpretation-6' => 'YCbCr',
+
+'exif-unknowndate' => 'ת×ריך בלתי ידוע',
+
+'exif-orientation-1' => 'רגילה', # 0th row: top; 0th column: left
+'exif-orientation-2' => 'הפוך ×ופקית', # 0th row: top; 0th column: right
+'exif-orientation-3' => 'מסובב 180°', # 0th row: bottom; 0th column: right
+'exif-orientation-4' => 'הפוך ×נכית', # 0th row: bottom; 0th column: left
+'exif-orientation-5' => 'מסובב 90° נגד כיוון השעון והפוך ×נכית', # 0th row: left; 0th column: top
+'exif-orientation-6' => 'מסובב 90° ×¢× ×›×™×•×•×Ÿ השעון', # 0th row: right; 0th column: top
+'exif-orientation-7' => 'מסובב 90° ×¢× ×›×™×•×•×Ÿ השעון והפוך ×נכית', # 0th row: right; 0th column: bottom
+'exif-orientation-8' => 'מסובב 90° נגד כיוון השעון', # 0th row: left; 0th column: bottom
+
+'exif-planarconfiguration-1' => 'פורמט חסון',
+'exif-planarconfiguration-2' => 'פורמט שטוח',
+
+'exif-xyresolution-i' => '$1 dpi',
+'exif-xyresolution-c' => '$1 dpc',
+
+'exif-colorspace-1' => 'sRGB',
+'exif-colorspace-ffff.h' => 'FFFF.H',
+
+'exif-componentsconfiguration-0' => '×ינו קיי×',
+'exif-componentsconfiguration-1' => 'Y',
+'exif-componentsconfiguration-2' => 'Cb',
+'exif-componentsconfiguration-3' => 'Cr',
+'exif-componentsconfiguration-4' => 'R',
+'exif-componentsconfiguration-5' => 'G',
+'exif-componentsconfiguration-6' => 'B',
+
+'exif-exposureprogram-0' => '×œ× ×”×•×’×“×¨×”',
+'exif-exposureprogram-1' => 'ידנית',
+'exif-exposureprogram-2' => 'תוכנה רגילה',
+'exif-exposureprogram-3' => 'עדיפות פתח',
+'exif-exposureprogram-4' => 'עדיפות צמצ×',
+'exif-exposureprogram-5' => 'תוכנה יוצרת (מטה לכיוון עומק השדה)',
+'exif-exposureprogram-6' => 'תוכנה פועלת (מטה לכיוון מהירות ×¦×ž×¦× ×’×‘×•×”×”)',
+'exif-exposureprogram-7' => 'מצב דיוקן (לתמונות ×¦×™×œ×•× ×ž×§×¨×•×‘ כשהרקע ×œ× ×‘×¤×•×§×•×¡)',
+'exif-exposureprogram-8' => 'מצב נוף (לתמונות נוף כשהרקע בפוקוס)',
+
+'exif-subjectdistance-value' => '$1 מטרי×',
+
+'exif-meteringmode-0' => '×œ× ×™×“×•×¢',
+'exif-meteringmode-1' => 'ממוצע',
+'exif-meteringmode-2' => 'מרכז משקל ממוצע',
+'exif-meteringmode-3' => 'נקודה',
+'exif-meteringmode-4' => 'רב־נקודה',
+'exif-meteringmode-5' => 'תבנית',
+'exif-meteringmode-6' => 'חלקי',
+'exif-meteringmode-255' => '×חר',
+
+'exif-lightsource-0' => '×œ× ×™×“×•×¢',
+'exif-lightsource-1' => '×ור יו×',
+'exif-lightsource-2' => 'פלו×ורסצנטי',
+'exif-lightsource-3' => 'טונגסטן (×ור מתלהט)',
+'exif-lightsource-4' => 'פלש',
+'exif-lightsource-9' => 'מזג ×וויר טוב',
+'exif-lightsource-10' => 'מזג ×וויר מעונן',
+'exif-lightsource-11' => 'צל',
+'exif-lightsource-12' => '×ור ×™×•× ×¤×œ×•×ורסצנטי (D 5700 – 7100K)',
+'exif-lightsource-13' => '×ור ×™×•× ×œ×‘×Ÿ פלו×ורסצנטי (N 4600 – 5400K)',
+'exif-lightsource-14' => '×ור ×™×•× ×§×¨×™×¨ לבן פלו×ורסצנטי (W 3900 – 4500K)',
+'exif-lightsource-15' => 'פלו×ורסצנטי לבן (WW 3200 – 3700K)',
+'exif-lightsource-17' => '×ור רגיל A',
+'exif-lightsource-18' => '×ור רגיל B',
+'exif-lightsource-19' => '×ור רגיל C',
+'exif-lightsource-20' => 'D55',
+'exif-lightsource-21' => 'D65',
+'exif-lightsource-22' => 'D75',
+'exif-lightsource-23' => 'D50',
+'exif-lightsource-24' => 'טונגסטן ×ולפן ISO',
+'exif-lightsource-255' => 'מקור ×ור ×חר',
+
+'exif-focalplaneresolutionunit-2' => "×ינצ'×™×",
+
+'exif-sensingmethod-1' => '×œ× ×ž×•×’×“×¨×ª',
+'exif-sensingmethod-2' => 'חיישן ×זור בצבע ×¢× ×©×‘×‘ ×חד',
+'exif-sensingmethod-3' => 'חיישן ×זור בצבע ×¢× ×©× ×™ שבבי×',
+'exif-sensingmethod-4' => 'חיישן ×זור בצבע ×¢× ×©×œ×•×©×” שבבי×',
+'exif-sensingmethod-5' => 'חיישן ×זור ×¢× ×¦×‘×¢ רציף',
+'exif-sensingmethod-7' => 'חיישן טריליני×רי',
+'exif-sensingmethod-8' => 'חיישן ×¢× ×¦×‘×¢ רציף ליני×רי',
+
+'exif-filesource-3' => 'DSC',
+
+'exif-scenetype-1' => 'תמונה שצולמה ישירות',
+
+'exif-customrendered-0' => 'תהליך רגיל',
+'exif-customrendered-1' => 'תהליך מות××',
+
+'exif-exposuremode-0' => 'חשיפה ×וטומטית',
+'exif-exposuremode-1' => 'חשיפה ידנית',
+'exif-exposuremode-2' => 'מסגרת ×וטומטית',
+
+'exif-whitebalance-0' => '×יזון צבע לבן ×וטומטי',
+'exif-whitebalance-1' => '×יזון צבע לבן ידני',
+
+'exif-scenecapturetype-0' => 'רגיל',
+'exif-scenecapturetype-1' => 'נוף',
+'exif-scenecapturetype-2' => 'דיוקן',
+'exif-scenecapturetype-3' => 'סצנה לילית',
+
+'exif-gaincontrol-0' => 'לל×',
+'exif-gaincontrol-1' => 'תוספת נמוכה למעלה',
+'exif-gaincontrol-2' => 'תוספת גבוהה למעלה',
+'exif-gaincontrol-3' => 'תוספת נמוכה למטה',
+'exif-gaincontrol-4' => 'תוספת גבוהה למטה',
+
+'exif-contrast-0' => 'רגיל',
+'exif-contrast-1' => 'רך',
+'exif-contrast-2' => 'קשה',
+
+'exif-saturation-0' => 'רגילה',
+'exif-saturation-1' => 'רוויה נמוכה',
+'exif-saturation-2' => 'רוויה גבוהה',
+
+'exif-sharpness-0' => 'רגילה',
+'exif-sharpness-1' => 'רכה',
+'exif-sharpness-2' => 'קשה',
+
+'exif-subjectdistancerange-0' => '×œ× ×™×“×•×¢',
+'exif-subjectdistancerange-1' => 'מ×קרו',
+'exif-subjectdistancerange-2' => 'תצוגה קרובה',
+'exif-subjectdistancerange-3' => 'תצוגה רחוקה',
# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
-"exif-gpslatitude-n" => "קו־רוחב צפוני",
-"exif-gpslatitude-s" => "קו־רוחב דרומי",
+'exif-gpslatitude-n' => 'קו־רוחב צפוני',
+'exif-gpslatitude-s' => 'קו־רוחב דרומי',
# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
-"exif-gpslongitude-e" => "קו־×ורך מזרחי",
-"exif-gpslongitude-w" => "קו־×ורך מערבי",
+'exif-gpslongitude-e' => 'קו־×ורך מזרחי',
+'exif-gpslongitude-w' => 'קו־×ורך מערבי',
-"exif-gpsstatus-a" => "מדידה בתהליך",
-"exif-gpsstatus-v" => "מדידה בו־זמנית",
+'exif-gpsstatus-a' => 'מדידה בתהליך',
+'exif-gpsstatus-v' => 'מדידה בו־זמנית',
-"exif-gpsmeasuremode-2" => "מדידה בשני ממדי×",
-"exif-gpsmeasuremode-3" => "מדידה בשלושה ממדי×",
+'exif-gpsmeasuremode-2' => 'מדידה בשני ממדי×',
+'exif-gpsmeasuremode-3' => 'מדידה בשלושה ממדי×',
# Pseudotags used for GPSSpeedRef and GPSDestDistanceRef
-"exif-gpsspeed-k" => "×§×™×œ×•×ž×˜×¨×™× ×‘×©×¢×”",
-"exif-gpsspeed-m" => "×ž×™×™×œ×™× ×‘×©×¢×”",
-"exif-gpsspeed-n" => "×ž×™×™×œ×™× ×™×ž×™×™× ×‘×©×¢×”",
+'exif-gpsspeed-k' => '×§×™×œ×•×ž×˜×¨×™× ×‘×©×¢×”',
+'exif-gpsspeed-m' => '×ž×™×™×œ×™× ×‘×©×¢×”',
+'exif-gpsspeed-n' => '×ž×™×™×œ×™× ×™×ž×™×™× ×‘×©×¢×”',
# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
-"exif-gpsdirection-t" => "כיוון ×מיתי",
-"exif-gpsdirection-m" => "כיוון מגנטי",
+'exif-gpsdirection-t' => 'כיוון ×מיתי',
+'exif-gpsdirection-m' => 'כיוון מגנטי',
# External editor support
-"edit-externally" => "ערכו קובץ ×–×” ב×מצעות ×™×™×©×•× ×—×™×¦×•× ×™",
-"edit-externally-help" => "ר×ו ×ת [http://meta.wikimedia.org/wiki/Help:External_editors הור×ות ההתקנה] למידע נוסף.",
+'edit-externally' => 'ערכו קובץ ×–×” ב×מצעות ×™×™×©×•× ×—×™×¦×•× ×™',
+'edit-externally-help' => 'ר×ו ×ת [http://meta.wikimedia.org/wiki/Help:External_editors הור×ות ההתקנה] למידע נוסף.',
-# "All" in various places, this might be different for inflected languages
-"recentchangesall" => "הכול",
-"imagelistall" => "הכול",
-"watchlistall1" => "הכול",
-"watchlistall2" => "הכול",
-"namespacesall" => "הכול",
+# 'all' in various places, this might be different for inflected languages
+'recentchangesall' => 'הכול',
+'imagelistall' => 'הכול',
+'watchlistall1' => 'הכול',
+'watchlistall2' => 'הכול',
+'namespacesall' => 'הכול',
# E-mail address confirmation
-"confirmemail" => '×מתו כתובת דו×"ל',
-"confirmemail_noemail" => '×ין ×œ×›× ×›×ª×•×‘×ª דו×"ל תקפה המוגדרת ב[[{{ns:special}}:Preferences|העדפות המשתמש]] שלכ×.',
-"confirmemail_text" => '×תר ×–×” דורש שת×מתו ×ת כתובת הדו×"ל ×©×œ×›× ×œ×¤× ×™ שתשתמשו בשירותי הדו×"ל. לחצו על הכפתור למטה כדי לשלוח דו×"ל ×¢× ×§×•×“ ×ישור לכתובת הדו×"ל שהזנת×. טענו ×ת הקישור בדפדפן ×©×œ×›× ×›×“×™ ל×שר שכתובת הדו×"ל תקפה.',
-"confirmemail_send" => "שלח קוד ×ישור",
-"confirmemail_sent" => 'הדו×"ל ×¢× ×§×•×“ ×”×ישור נשלח.',
-"confirmemail_sendfailed" => 'שליחת הדו×"ל ×¢× ×§×•×“ ×”×ישור ×œ× ×”×¦×œ×™×—×”. בדקו ש×ין ×ª×•×•×™× ×©×’×•×™×™× ×‘×›×ª×•×‘×ª.',
-"confirmemail_invalid" => "קוד ×”×ישור שגוי. ייתכן שפג תוקפו.",
-"confirmemail_needlogin" => '×¢×œ×™×›× ×œ×‘×¦×¢ $1 כדי ל×מת ×ת כתובת הדו×"ל שלכ×.',
-"confirmemail_success" => 'כתובת הדו×"ל ×©×œ×›× ×ושרה. כעת ב××¤×©×¨×•×ª×›× ×œ×”×™×›× ×¡ לחשבון ×©×œ×›× ×•×œ×™×”× ×•×ª מה×תר.',
-"confirmemail_loggedin" => 'כתובת הדו×"ל ×©×œ×›× ×ושרה כעת.',
-"confirmemail_error" => "שגי××” בשמירת קוד ×”×ישור.",
-"confirmemail_subject" => 'קוד ×ישור דו×"ל מ{{grammar:תחילית|{{SITENAME}}}}',
-"confirmemail_body" => 'מישהו, כנר××” ××ª× (מכתובת ×”Ö¾IP הזו: $1), ×¨×©× ×ת החשבון "$2" ×¢× ×›×ª×•×‘×ª הדו×"ל הזו ב{{grammar:תחילית|{{SITENAME}}}}.
+'confirmemail' => '×מתו כתובת דו×"ל',
+'confirmemail_noemail' => '×ין ×œ×›× ×›×ª×•×‘×ª דו×"ל תקפה המוגדרת ב[[{{ns:special}}:Preferences|העדפות המשתמש]] שלכ×.',
+'confirmemail_text' => '×תר ×–×” דורש שת×מתו ×ת כתובת הדו×"ל ×©×œ×›× ×œ×¤× ×™ שתשתמשו בשירותי הדו×"ל. לחצו על הכפתור למטה כדי לשלוח דו×"ל ×¢× ×§×•×“ ×ישור לכתובת הדו×"ל שהזנת×. טענו ×ת הקישור בדפדפן ×©×œ×›× ×›×“×™ ל×שר שכתובת הדו×"ל תקפה.',
+'confirmemail_pending' => '<div class="error">קוד ×ישור דו×"ל כבר נשלח ×ליכ×; ×× ×™×¦×¨×ª× ×ת החשבון ל×חרונה, ייתכן שתרצו לחכות מספר דקות עד שיגיע לפני שתנסו לבקש קוד חדש.</div>',
+'confirmemail_send' => 'שלח קוד ×ישור',
+'confirmemail_sent' => 'הדו×"ל ×¢× ×§×•×“ ×”×ישור נשלח.',
+'confirmemail_oncreate' => 'קוד ×ישור דו×"ל נשלח לכתובת הדו×"ל שלכ×. הקוד ×”×–×” ×ינו נדרש לכניסה, ×ך תצטרכו לספקו כדי להשתמש בכל תכונה מבוססת דו×"ל ב×תר ×–×”.',
+'confirmemail_sendfailed' => 'שליחת הדו×"ל ×¢× ×§×•×“ ×”×ישור ×œ× ×”×¦×œ×™×—×”. ×× × ×‘×“×§×• ש×ין ×ª×•×•×™× ×©×’×•×™×™× ×‘×›×ª×•×‘×ª.
+
+תוכנת הדו×ר החזירה ×ת ההודעה הב××”: $1',
+'confirmemail_invalid' => 'קוד ×”×ישור שגוי. ייתכן שפג תוקפו.',
+'confirmemail_needlogin' => '×¢×œ×™×›× ×œ×‘×¦×¢ $1 כדי ל×מת ×ת כתובת הדו×"ל שלכ×.',
+'confirmemail_success' => 'כתובת הדו×"ל ×©×œ×›× ×ושרה. כעת ב××¤×©×¨×•×ª×›× ×œ×”×™×›× ×¡ לחשבון ×©×œ×›× ×•×œ×™×”× ×•×ª מה×תר.',
+'confirmemail_loggedin' => 'כתובת הדו×"ל ×©×œ×›× ×ושרה כעת.',
+'confirmemail_error' => 'שגי××” בשמירת קוד ×”×ישור.',
+'confirmemail_subject' => 'קוד ×ישור דו×"ל מ{{grammar:תחילית|{{SITENAME}}}}',
+'confirmemail_body' => 'מישהו, כנר××” ××ª× (מכתובת ×”Ö¾IP הזו: $1), ×¨×©× ×ת החשבון "$2" ×¢× ×›×ª×•×‘×ª הדו×"ל הזו ב{{grammar:תחילית|{{SITENAME}}}}.
כדי ×œ×•×•×“× ×©×—×©×‘×•×Ÿ ×–×” ב×מת שייך ×œ×›× ×•×œ×”×¤×¢×™×œ ×ת שירותי הדו×"ל ב×תר, ×× × ×¤×ª×—×• ×ת הכתובת הב××” בדפדפן שלכ×:
@@ -2048,71 +2123,84 @@ $3
×× *ל×* ××ª× ×‘×™×§×©×ª× ×§×•×“ ×ישור ×–×”, ×ל תפתחו ×ת הקישור. קוד ×”×ישור יפקע ב־$4.',
# Inputbox extension, may be useful in other contexts as well
-"tryexact" => "מצ×ו הת×מה מדויקת",
-"searchfulltext" => "חפשו בכל הדף",
-"createarticle" => "צרו דף",
+'tryexact' => 'מצ×ו הת×מה מדויקת',
+'searchfulltext' => 'חפשו בכל הדף',
+'createarticle' => 'צרו דף',
# Scary transclusion
-"scarytranscludedisabled" => "[הכללת תבניות בין ××ª×¨×™× ×ž× ×•×˜×¨×œ×ª]",
-"scarytranscludefailed" => "[מצטערי×, קבלת התבנית נכשלה בגלל $1]",
-"scarytranscludetoolong" => "[מצטערי×, כתובת ×”Ö¾URL ×רוכה מדי]",
+'scarytranscludedisabled' => '[הכללת תבניות בין ××ª×¨×™× ×ž× ×•×˜×¨×œ×ª]',
+'scarytranscludefailed' => '[מצטערי×, קבלת התבנית נכשלה בגלל $1]',
+'scarytranscludetoolong' => '[מצטערי×, כתובת ×”Ö¾URL ×רוכה מדי]',
# Trackbacks
-"trackbackbox" => '<div id="mw_trackbacks">
+'trackbackbox' => '<div id="mw_trackbacks">
×˜×¨×§×‘×§×™× ×œ×“×£ ×–×”:<br />
$1
</div>',
-"trackbackremove" => " ([$1 מחיקה])",
-"trackbacklink" => "טרקבק",
-"trackbackdeleteok" => "הטרקבק נמחק בהצלחה.",
+'trackbackremove' => ' ([$1 מחיקה])',
+'trackbacklink' => 'טרקבק',
+'trackbackdeleteok' => 'הטרקבק נמחק בהצלחה.',
# Delete conflict
-"deletedwhileediting" => "×זהרה: דף ×–×” נמחק ל×חר ×©×”×ª×—×œ×ª× ×œ×¢×¨×•×š!",
-"confirmrecreate" => "המשתמש [[{{ns:user}}:$1|$1]] ([[{{ns:user_talk}}:$1|שיחה]]) מחק ×ת הדף ל×חר שהתחלת לערוך ×ותו, מסיבה זו:
+'deletedwhileediting' => '×זהרה: דף ×–×” נמחק ל×חר ×©×”×ª×—×œ×ª× ×œ×¢×¨×•×š!',
+'confirmrecreate' => "המשתמש [[{{ns:user}}:$1|$1]] ([[{{ns:user_talk}}:$1|שיחה]]) מחק ×ת הדף ל×חר שהתחלת לערוך ×ותו, מסיבה זו:
:'''$2'''
×× × ×שרו ש××ª× ×כן ×¨×•×¦×™× ×œ×™×¦×•×¨ מחדש ×ת הדף.",
-"recreate" => "צור מחדש",
-"tooltip-recreate" => "צור מחדש ×ת הדף למרות ×©×”×•× × ×ž×—×§",
+'recreate' => 'צור מחדש',
+'tooltip-recreate' => 'צור מחדש ×ת הדף למרות ×©×”×•× × ×ž×—×§',
-"unit-pixel" => "px",
+'unit-pixel' => 'px',
# HTML dump
-"redirectingto" => "מפנה ל־[[$1]]…",
+'redirectingto' => 'מפנה ל־[[$1]]…',
# action=purge
-"confirm_purge" => "לנקות ×ת המטמון של דף ×–×”?
+'confirm_purge' => 'לנקות ×ת המטמון של דף ×–×”?
-$1",
-"confirm_purge_button" => "×ישור",
+$1',
+'confirm_purge_button' => '×ישור',
-"youhavenewmessagesmulti" => "יש לך הודעות חדשות ב־$1",
-"newtalkseperator" => ",_",
-"searchcontaining" => "חפש ×“×¤×™× ×”×ž×›×™×œ×™× ×ת הטקסט '''$1'''.",
-"searchnamed" => "חפש ×“×¤×™× ×‘×©× '''$1'''.",
-"articletitles" => "חפש ×“×¤×™× ×”×ž×ª×—×™×œ×™× ×¢× '''$1'''",
-"hideresults" => "הסתר תוצ×ות",
+'youhavenewmessagesmulti' => 'יש לך הודעות חדשות ב־$1',
+
+'searchcontaining' => "חפש ×“×¤×™× ×”×ž×›×™×œ×™× ×ת הטקסט '''$1'''.",
+'searchnamed' => "חפש ×“×¤×™× ×‘×©× '''$1'''.",
+'articletitles' => "חפש ×“×¤×™× ×”×ž×ª×—×™×œ×™× ×¢× '''$1'''",
+'hideresults' => 'הסתר תוצ×ות',
# DISPLAYTITLE
-"displaytitle" => "(קשרו לדף ×–×” ×‘×©× [[$1]])",
+'displaytitle' => '(קשרו לדף ×–×” ×‘×©× [[$1]])',
-"loginlanguagelabel" => "שפה: $1",
+'loginlanguagelabel' => 'שפה: $1',
# Multipage image navigation
-"imgmultipageprev" => "&rarr; לדף הקוד×",
-"imgmultipagenext" => "לדף ×”×‘× &larr;",
-"imgmultigo" => "עבור!",
-"imgmultigotopre" => "עבור לדף",
+'imgmultipageprev' => '&rarr; לדף הקוד×',
+'imgmultipagenext' => 'לדף ×”×‘× &larr;',
+'imgmultigo' => 'עבור!',
+'imgmultigotopre' => 'עבור לדף',
# Table pager
-"ascending_abbrev" => "עולה",
-"descending_abbrev" => "יורד",
-"table_pager_next" => "הדף הב×",
-"table_pager_prev" => "הדף הקוד×",
-"table_pager_first" => "הדף הר×שון",
-"table_pager_last" => "הדף ×”×חרון",
-"table_pager_limit" => "הצג $1 ×¤×¨×™×˜×™× ×‘×“×£",
-"table_pager_limit_submit" => "עבור",
-"table_pager_empty" => "×œ×œ× ×ª×•×¦×ות",
+'ascending_abbrev' => 'עולה',
+'descending_abbrev' => 'יורד',
+'table_pager_next' => 'הדף הב×',
+'table_pager_prev' => 'הדף הקוד×',
+'table_pager_first' => 'הדף הר×שון',
+'table_pager_last' => 'הדף ×”×חרון',
+'table_pager_limit' => 'הצג $1 ×¤×¨×™×˜×™× ×‘×“×£',
+'table_pager_limit_submit' => 'עבור',
+'table_pager_empty' => '×œ×œ× ×ª×•×¦×ות',
+
+# Auto-summaries
+'autosumm-blank' => 'מסיר ×ת כל התוכן מדף ×–×”',
+'autosumm-replace' => "מחליף ×ת הדף ×¢× '$1'",
+'autoredircomment' => 'הפניה לדף [[$1]]', # This should be changed to the new naming convention, but existed beforehand
+'autosumm-new' => 'דף חדש: $1',
+
+# Size units
+'size-bytes' => '$1 בייטי×',
+'size-kilobytes' => '$1 קילו־בייטי×',
+'size-megabytes' => '$1 מגה־בייטי×',
+'size-gigabytes' => "$1 ×’'יגה־בייטי×",
+
);
?>
diff --git a/languages/messages/MessagesHi.php b/languages/messages/MessagesHi.php
index 68980046..6e2630be 100644
--- a/languages/messages/MessagesHi.php
+++ b/languages/messages/MessagesHi.php
@@ -81,16 +81,15 @@ $messages = array(
"mypage" => "मेरा पृषà¥à¤ ",
"mytalk" => "मेरी बातें",
"returnto" => "लौटें $1.",
-"help" => "सहायता ",
-"search" => "खोज ",
-"searchbutton" => "खोज ",
+"search" => "खोज",
+"searchbutton" => "खोज",
"go" => "जायें",
'searcharticle' => "जायें",
"editthispage" => "इस पृषà¥à¤  को बदलें",
"deletethispage" => "इस पृषà¥à¤  को हटायें",
"protectthispage" => "इस पृषà¥à¤  को सà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करें",
"unprotectthispage" => "इस पृषà¥à¤  को असà¥à¤°à¤•à¥à¤·à¤¿à¤¤ करें",
-"newpage" => "नया पृषà¥à¤  ",
+"newpage" => "नया पृषà¥à¤ ",
"talkpage" => "इस पृषà¥à¤  के बारे में बात करें",
"articlepage" => "लेख देखें",
"userpage" => "सदसà¥à¤¯ पृषà¥à¤  देखें",
@@ -118,7 +117,7 @@ $messages = array(
Don't forget to personalize your {{SITENAME}} preferences.",
"yourname" => "आपका नाम",
-"yourpassword" => "आपका पासवरà¥à¤¡ ",
+"yourpassword" => "आपका पासवरà¥à¤¡",
"yourpasswordagain" => "पासवरà¥à¤¡ दà¥à¤¬à¤¾à¤°à¤¾ लिखें",
## ....... more messages .....
diff --git a/languages/messages/MessagesHr.php b/languages/messages/MessagesHr.php
index d9417363..b4371781 100644
--- a/languages/messages/MessagesHr.php
+++ b/languages/messages/MessagesHr.php
@@ -124,7 +124,8 @@ $messages = array(
'oct' => 'lis',
'nov' => 'stu',
'dec' => 'pro',
-'categories' => '{{PLURAL:$1|Kategorija|Kategorije}}',
+'categories' => 'Kategorije',
+'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorije}}',
'category_header' => 'ÄŒlanci u kategoriji "$1"',
'subcategories' => 'Potkategorije',
'mainpage' => 'Glavna stranica',
@@ -933,7 +934,7 @@ Sva vremena su prema poslužiteljevom vremenu (UTC).
'rollbacklink' => 'ukloni',
'rollbackfailed' => 'Uklanjanje neuspješno',
'cantrollback' => 'Ne mogu ukloniti posljednju promjenu, postoji samo jedna promjena.',
-'alreadyrolled' => 'Ne mogu ukloniti posljednju promjenu Älanka [[$1]] koju je napravio suradnik [[User:$2|$2]]
+'alreadyrolled' => 'Ne mogu ukloniti posljednju promjenu Älanka [[:$1]] koju je napravio suradnik [[User:$2|$2]]
([[User talk:$2|Talk]]); netko je već promijenio stranicu ili uklonio promjenu.
Posljednju promjenu napravio je suradnik [[User:$3|$3]] ([[User talk:$3|Talk]]).',
@@ -1166,10 +1167,10 @@ U potonjem sluÄaju možete koristiti i poveznicu, npr. [[{{ns:Special}}:Export/
'tooltip-minoredit' => 'OznaÄi kao manju promjenu [alt-i]',
'tooltip-save' => 'SaÄuvaj promjene [alt-s]',
'tooltip-preview' => 'Prikaži kako će izgledati, molimo koristite prije snimanja! [alt-p]',
-'tooltip-diff' => 'Prikaži promjene uÄinjene u tekstu. [alt-d]',
+'tooltip-diff' => 'Prikaži promjene uÄinjene u tekstu. [alt-v]',
'tooltip-compareselectedversions'=> 'Prikaži usporedbu izabranih inaÄica ove stranice. [alt-v]',
'tooltip-watch' => 'Dodaj na popis praćenja [alt-w]',
-'Monobook.css' => '/** Ovdje idu izmjene monobook stylesheeta */',
+'monobook.css' => '/** Ovdje idu izmjene monobook stylesheeta */',
'nodublincore' => 'Dublin Core RDF metapodaci su iskljuÄeni na ovom serveru.',
'nocreativecommons' => 'Creative Commons RDF metapodaci su iskljuÄeni na ovom serveru.',
'notacceptable' => 'Wiki server ne može dobaviti podatke u obliku kojega vaÅ¡ klijent može proÄitati.',
@@ -1211,7 +1212,7 @@ U potonjem sluÄaju možete koristiti i poveznicu, npr. [[{{ns:Special}}:Export/
'rcpatroldisabledtext' => 'Naredba "Nadziri nedavne promjene" trenutno je iskljuÄena.',
'markedaspatrollederror'=> 'Ne mogu oznaÄiti za pregledano',
'markedaspatrollederrortext'=> 'Morate odabrati inaÄicu koju treba oznaÄiti za pregledanu.',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Moja suradniÄka stranica\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'SuradniÄka stranica za IP adresu pod kojom ureÄ‘ujete\');
@@ -1222,7 +1223,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Popis stranica koje pratite.\');
ta[\'pt-mycontris\'] = new Array(\'y\',\'Popis mojih doprinosa\');
ta[\'pt-login\'] = new Array(\'o\',\'Predlažemo vam da se prijavite, ali nije obvezno.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Predlažemo vam da se prijavite, ali nije obvezno.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Odjavi se\');
+ta[\'pt-logout\'] = new Array(\'\',\'Odjavi se\');
ta[\'ca-talk\'] = new Array(\'t\',\'Razgovor o stranici\');
ta[\'ca-edit\'] = new Array(\'e\',\'Možete uređivati ovu stranicu. Koristite Pregled kako će izgledati prije nego što snimite.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Dodaj komentar ovom razgovoru.\');
diff --git a/languages/messages/MessagesHsb.php b/languages/messages/MessagesHsb.php
new file mode 100644
index 00000000..6aec6e83
--- /dev/null
+++ b/languages/messages/MessagesHsb.php
@@ -0,0 +1,1575 @@
+<?php
+/**
+ * Upper Sorbian (Hornjoserbsce)
+ *
+ * @package MediaWiki
+ * @subpackage Language
+ */
+
+$fallback = 'de';
+
+$namespaceNames = array(
+ NS_MEDIA => 'Media',
+ NS_SPECIAL => 'Specialnje',
+ NS_MAIN => '',
+ NS_TALK => 'Diskusija',
+ NS_USER => 'Wužiwar',
+ NS_USER_TALK => 'Diskusija_z_wužiwarjom',
+ # NS_PROJECT set by $wgMetaNamespace
+ NS_PROJECT_TALK => '$1_diskusija',
+ NS_IMAGE => 'Wobraz',
+ NS_IMAGE_TALK => 'Diskusija_k_wobrazej',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'MediaWiki_diskusija',
+ NS_TEMPLATE => 'Předłoha',
+ NS_TEMPLATE_TALK => 'Diskusija_k_předłoze',
+ NS_HELP => 'Pomoc',
+ NS_HELP_TALK => 'Pomoc_diskusija',
+ NS_CATEGORY => 'Kategorija',
+ NS_CATEGORY_TALK => 'Diskusija_ke_kategoriji'
+);
+
+
+$messages = array(
+
+'1movedto2' => 'je [[$1]] pod titul [[$2]] přesunył(a)',
+'1movedto2_redir' => 'je [[$1]] pod titul [[$2]] přesunył(a) a při tym daleposrědkowanje přepisał(a).',
+'common.css' => '/* CSS w tutej dataji budźe so na wšěch stronow wuskutkować. */',
+'monobook.css' => '/* CSS wobdźěłać, zo by so skin „monobook†za wÅ¡Ä›Äh wužiwarjow tutoho skina primÄ›riÅ‚ */',
+'monobook.js' => '/* tooltips and access keys */
+ var ta = new Object();
+ ta[\'pt-userpage\'] = new Array(\'.\',\'Moja wužiwarska strona\');
+ ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Wužiwarska strona za IP-adresu, z kotrejž tuchwilu dźěłaće\');
+ ta[\'pt-mytalk\'] = new Array(\'n\',\'Moja diskusijna strona\');
+ ta[\'pt-anontalk\'] = new Array(\'n\',\'Diskusija wo změnach z tuteje ip-adresy\');
+ ta[\'pt-preferences\'] = new Array(\'\',\'Moje nastajenja\');
+ ta[\'pt-watchlist\'] = new Array(\'l\',\'Lisćina stronow, kotrež wobkedźbujeće\');
+ ta[\'pt-mycontris\'] = new Array(\'y\',\'Lisćina mojich přinoškow\');
+ ta[\'pt-login\'] = new Array(\'o\',\'Móžeće so woměrje přizjewić, ale to zawjazowace njeje.\');
+ ta[\'pt-anonlogin\'] = new Array(\'o\',\'Móžeće so woměrje přizjewić, ale to zawjazowace njeje.\');
+ ta[\'pt-logout\'] = new Array(\'\',\'So wotzjewić\');
+ ta[\'ca-talk\'] = new Array(\'t\',\'Diskusija wo stronje\');
+ ta[\'ca-edit\'] = new Array(\'e\',\'Móžeće stronu wobdźěłać. ProÅ¡u wužijće tłóÄku pÅ™ehladka do skÅ‚adowanja.\');
+ ta[\'ca-addsection\'] = new Array(\'+\',\'Nowy wotrězk k diskusiji dodać.\');
+ ta[\'ca-viewsource\'] = new Array(\'e\',\'Tuta strona je škitana. Móžeće jeje žórło wobhladać.\');
+ ta[\'ca-history\'] = new Array(\'h\',\'Stawizny tuteje strony\');
+ ta[\'ca-protect\'] = new Array(\'=\',\'Stronu škitać\');
+ ta[\'ca-delete\'] = new Array(\'d\',\'Stronu wušmórnyć\');
+ ta[\'ca-undelete\'] = new Array(\'d\',\'ZmÄ›ny wobnowić, kotrež buchu do wuÅ¡mórnjenja sÄinjene\');
+ ta[\'ca-move\'] = new Array(\'m\',\'Stronu přesunyć\');
+ ta[\'ca-watch\'] = new Array(\'w\',\'Stronu wobkedźbowankam přidać\');
+ ta[\'ca-unwatch\'] = new Array(\'w\',\'Stronu z wobkedźbowankow wotstronić\');
+ ta[\'search\'] = new Array(\'f\',\'W cyłym wiki pytać\');
+ ta[\'p-logo\'] = new Array(\'\',\'HÅ‚owna strona\');
+ ta[\'n-mainpage\'] = new Array(\'z\',\'Hłownu stronu pokazać\');
+ ta[\'n-portal\'] = new Array(\'\',\'Wo projekće, Å¡to móžeće Äinić, hdźe móžeće informacije namakać\');
+ ta[\'n-currentevents\'] = new Array(\'\',\'Pozadkowe informacije wo aktualnych podawkach pytać\');
+ ta[\'n-recentchanges\'] = new Array(\'r\',\'Lisćina aktualnych změnow w tutym wiki.\');
+ ta[\'n-randompage\'] = new Array(\'x\',\'Připadnu strony wopytać\');
+ ta[\'n-help\'] = new Array(\'\',\'Pomocna strona\');
+ ta[\'n-sitesupport\'] = new Array(\'\',\'Projekt podpěrować\');
+ ta[\'t-whatlinkshere\'] = new Array(\'j\',\'Lisćina wšěch stronow, kotrež sem pokazuja\');
+ ta[\'t-recentchangeslinked\'] = new Array(\'k\',\'Aktualne změny w stronach, na kotrež tuta stronu pokaza\');
+ ta[\'feed-rss\'] = new Array(\'\',\'RSS-feed za tutu stronu\');
+ ta[\'feed-atom\'] = new Array(\'\',\'Atom-feed za tutu stronu\');
+ ta[\'t-contributions\'] = new Array(\'\',\'Přinoški tutoho wužiwarja wobhladać\');
+ ta[\'t-emailuser\'] = new Array(\'\',\'Tutomu wužiwarjej email pósłać\');
+ ta[\'t-upload\'] = new Array(\'u\',\'Wobrazy abo dataje nahrawać\');
+ ta[\'t-specialpages\'] = new Array(\'q\',\'Lisćina wšěch specialnych stronow\');
+ ta[\'ca-nstab-main\'] = new Array(\'c\',\'Stronu wobhladać\');
+ ta[\'ca-nstab-user\'] = new Array(\'c\',\'Wužiwarsku stronu wobhladać\');
+ ta[\'ca-nstab-media\'] = new Array(\'c\',\'Datajowu stronu wobhladać\');
+ ta[\'ca-nstab-special\'] = new Array(\'\',\'To je specialna strona, njemóžeće stronu samu wobdźěłać.\');
+ ta[\'ca-nstab-project\'] = new Array(\'a\',\'Projektowu stronu wobhladać\');
+ ta[\'ca-nstab-image\'] = new Array(\'c\',\'Wobrazowu stronu wobhladać\');
+ ta[\'ca-nstab-mediawiki\'] = new Array(\'c\',\'Systemowu zdźělenku wobhladać\');
+ ta[\'ca-nstab-template\'] = new Array(\'c\',\'Předłohu wobhladać\');
+ ta[\'ca-nstab-help\'] = new Array(\'c\',\'Pomocnu stronu wobhladać\');
+ ta[\'ca-nstab-category\'] = new Array(\'c\',\'Kategorijnu stronu wobhladać\');',
+'about' => 'Wo',
+'aboutpage' => 'Wo {{GRAMMAR:lokatiw|{{SITENAME}}}}',
+'aboutsite' => 'Wo {{GRAMMAR:lokatiw|{{SITENAME}}}}',
+'accmailtext' => 'Hesło za „$1†bu na adresu $2 pósłane.',
+'accmailtitle' => 'Hesło bu pósłane.',
+'accountcreated' => 'Wužiwarske konto bu załožene',
+'accountcreatedtext' => 'Wužiwarske konto za $1 bu załožene.',
+'acct_creation_throttle_hit'=> 'Wodajće, maće hižo $1 wužiwarskich kontow załoženych. Njemóžeće dalše załožić.',
+'actioncomplete' => 'DokónÄene',
+'addedwatch' => 'Strona bu wobkedźbowankam přidata.',
+'addedwatchtext' => 'Strona „[[:$1]]†bu [[Special:Watchlist|wobkedźbowankam]] pÅ™idata. PÅ™ichodne zmÄ›ny k tutej stronje a z njej zwjazanej diskusijnej stronje budu tam naliÄene, a titul strony budźe so <b>tuÄne</b> w [[Special:Recentchanges|lisćinje aktualnych zmÄ›now]] jewić.
+
+Jelizo chceće stronu ze swojich wobkedźbowankow lisćiny pozdźiÅ¡o wotstronić, klikńće na „Njewobkedźbowaćâ€.',
+'allarticles' => 'WÅ¡Ä› nastawki',
+'allinnamespace' => 'WÅ¡Ä› strony (mjenowy rum $1)',
+'alllogstext' => 'Kombinowany pohlad protokolow nahraća, wotstronjenja, škita, blokowanja a zrjadowanja wužiwarskich prawow. Móžeće pohlad wobmjezować, wuběrajo typ protokola, wužiwarske mjeno abo potrjechenu stronu.',
+'allmessages' => 'Systemowe powěsće',
+'allmessagescurrent' => 'Tuchwilny tekst',
+'allmessagesdefault' => 'Standardny tekst',
+'allmessagesfilter' => 'Filter za jednotliwe powěsće:',
+'allmessagesmodified' => 'Jenož změnjene pokazać',
+'allmessagesname' => 'Mjeno',
+'allmessagesnotsupportedDB'=> 'Strona <b>„Special:Allmessagesâ€</b> njemóže so wužiwać, dokelž je datowa banka wotpinata.',
+'allmessagesnotsupportedUI'=> 'WaÅ¡e rÄ›Äne nastajenje <b>„$1â€</b> so w tutym wiki wot strony „Special:Allmessages†njepodpÄ›ruje.',
+'allmessagestext' => 'To je lisćina wšěch systemowych powěsćow, kotrež w mjenowym rumje MediaWiki k dispoziciji steja.',
+'allnotinnamespace' => 'WÅ¡Ä› strony (nic w mjenowym rumje $1)',
+'allowemail' => 'Přijeće emailow wot druhich wužiwarjow zmóžnić',
+'allpages' => 'WÅ¡Ä› nastawki',
+'allpagesbadtitle' => 'Mjeno strony, kotrež sće zapodaÅ‚(a), njebÄ› pÅ‚aćiwe. MÄ›jeÅ¡e pak rÄ›Äny, pak interwiki-prefiks abo wobsahowaÅ¡e jedne abo wjace znamjow, kiž so w titulach wužiwać njesmÄ›dźa.',
+'allpagesfrom' => 'Strony pokazać, zapoÄinajo z:',
+'allpagesnext' => 'Přichodne',
+'allpagesprefix' => 'Strony pokazać z prefiksom:',
+'allpagesprev' => 'Předchadne',
+'allpagessubmit' => 'Pokazać',
+'alphaindexline' => '$1 do $2',
+'already_bureaucrat' => 'Tutón wužiwar je hižo běrokrat.',
+'already_sysop' => 'Tutón wužiwar je hižo administrator.',
+'alreadyloggedin' => '<strong>Wužiwar $1, sće hižo přizjewjeny!</strong><br />',
+'alreadyrolled' => 'Njemóžno poslednu změnu [[:$1]] wužiwarja [[User:$2|$2]] ([[User talk:$2|diskusija]]) cofnyć; něchtó druhi je tutu stronu hižo změnił abo změnu cofnył.
+
+Poslednja změna běše wot wužiwarja [[User:$3|$3]] ([[User talk:$3|diskusija]]).',
+'ancientpages' => 'Najstarše nastawki',
+'and' => 'a',
+'anoneditwarning' => '<b>Kedźbu:</b> Njejsće přizjewjeny(a). Změny budu z Wašej IP-adresu składowane.',
+'anontalk' => 'Z tutej IP diskutować',
+'anontalkpagetext' => '----
+<i>To je diskusijna strona za anonymneho wužiwarja, kiž hišće konto załožił njeje abo je njewužiwa. Dyrbimy tohodla numerisku IP-adresu wužiwać, zo bychmy jeho/ju identifikowali. Tajka adresa hodźi so wot wjacorych wužiwarjow zhromadnje wužiwać. Sće-li anonymny wužiwar a měniće, zo buchu irelewantne komentary k wam pósłane, [[Special:Userlogin|załožće konto abo přizjewće so]], zo byšće přichodnu šmjatańcu wobešoł/wobešła.</i>',
+'anonymous' => 'Anonymny wužiwar/anonymni wužiwarjo {{GRAMMAR:genitiw|{{SITENAME}}}}',
+'apr' => 'apr',
+'april' => 'apryl',
+'april-gen' => 'apryla',
+'article' => 'Nastawk',
+'articleexists' => 'Strona z tutym titulom hižo eksistuje abo mjeno, kotrež sće wubrał, płaćiwe njeje. Prošu wubjerće druhe mjeno.',
+'articlepage' => 'Nastawk',
+'articletitles' => 'Nastawki, kotrež z <i>$1</i> zapoÄnu',
+'aug' => 'awg',
+'august' => 'awgust',
+'august-gen' => 'awgusta',
+'autoblocker' => 'Awtomatiske blokowanje, dokelž WaÅ¡a IP adresa bu tuchwilu wot wužiwarja „[[User:$1|$1]]†wužiwana. PÅ™iÄina, podata pÅ™ez blokowaceho administratora je: „<b>$2</b>â€.',
+'autoredircomment' => 'PosrÄ›dkuju k stronje „[[$1]]â€',
+'badaccess' => 'Nimaće wotpowědne dowolnosće',
+'badarticleerror' => 'Tuta akcija njeda so na tutej stronje wuwjesć.',
+'badfilename' => 'Mjeno dataje bu na „$1†změnjene.',
+'badfiletype' => '„.$1†poruÄowany format za dataje njeje.',
+'badipaddress' => 'Njepłaćiwa IP-adresa',
+'badquery' => 'Špatnje formulowane pytanske wotprašenje',
+'badquerytext' => 'Njemóžachmy waÅ¡e wotpraÅ¡enje pÅ™edźěłować. PÅ™iÄina za to je najskerje, zo sće spytaÅ‚ za sÅ‚owom pytać, kotrež je krótÅ¡e haÄ tÅ™i pismiki, Å¡tož so hišće njepodpÄ›ruje. Snadź sće tež wuraz wopak napisaÅ‚, na pÅ™ikÅ‚ad „ryba a a Å¡upiznyâ€. ProÅ¡u spytajće hišće raz.',
+'badretype' => 'Hesle, kotrejž sće zapisał(a), so njekryjetej.',
+'badsig' => 'Njepłaćiwa signatura, prošu HTML přepruwować.',
+'badtitle' => 'WopaÄny titul',
+'badtitletext' => 'Požadany titul strony běše njepłaćiwe, prózdne abo njekorektny titul z inter-language abo inter-wiki. Snano jewi so w nim znamjo, kiž so w titulach wužiwać njehodźi.',
+'blanknamespace' => '(Nastawki)',
+'blockededitsource' => 'Tekst <b>Wašich změnow</b> strony <b>$1</b> so tu pokazuje:',
+'blockedoriginalsource' => 'To je žórłowy tekst strony <b>$1</b>:',
+'blockedtext' => 'Waše wužiwarske mjeno abo Waša IP-adresa bu přez $1 blokowane(-a).
+Podata pÅ™iÄina je:<br /><i>$2</i><br />Wy móhÅ‚(a) $1 kontaktować abo jednoho z druhich [[Project:Administratorojo|administratorow]], zo byÅ¡tej blokowanje diskutowaÅ‚oj.
+
+Wobkedźbujće zo njebyšće móhł funkciju „Tutomu wužiwarjej email pósłać†wužiwać chibazo maće emailowu adresu registrowanu w swojich [[Special:Preferences|wužiwarskich nastajenjach]].
+
+Waša IP-adresa je $3. Prošu zapodajće tutu adresu do swojich wotprašowanjow, kotrež přewjedźeće.',
+'blockedtitle' => 'Wužiwar je blokowany',
+'blockip' => 'Wužiwarja blokować',
+'blockipsuccesssub' => 'Blokowanje wuspěšne',
+'blockipsuccesstext' => 'Wužiwar „[[Special:Contributions/$1|$1]]†bu blokowany.
+
+Hlej [[Special:Ipblocklist|Lisćinu blokowanjow]], zo byšće blokowanja přepruwował.',
+'blockiptext' => 'Wužijće formular deleka, zo byšće pisanski pÅ™istup za podatu IP-adresu abo wužiwarske mjeno blokowaÅ‚(a). To měło so jenož Äinić, zo by so wandalizmej zadźěwaÅ‚o a woptpowÄ›dujo [[Project:Policy|prawidÅ‚am]]. Zapisajće deleka pÅ™iÄinu (na pÅ™. citujo wosebite strony, kotrež bÄ›chu wopor wandalizma).',
+'blocklink' => 'blokować',
+'blocklistline' => '$1, $2 blokowaše wužiwarja „$3†($4)',
+'blocklogentry' => 'je wužiwarja „[[$1]]†blokowaÅ‚(a) z Äasom spadnjenja $2',
+'blocklogpage' => 'Protokol blokowanja',
+'blocklogtext' => 'Je to protokol blokowanjow a dopušćenjow wužiwarjow. Awtomatisce blokowane IP-adresy so njenaliÄuja. Hlej [[Special:Ipblocklist|lisćinu blokowanych IP-adresow]] za pÅ™ehlad tuchwilnych blokowanjow.',
+'bold_sample' => 'TuÄny tekst',
+'bold_tip' => 'TuÄny tekst',
+'booksources' => 'Pytanje po ISBN',
+'booksourcetext' => 'Deleka je lisćina pokazow k druhim sydłam, kotrež nowe a wužite knihi předawaja a kotrež móža dalše informacije wo knihach, za kotrymiž pytaće, měć.',
+'brokenredirects' => 'Skóncowane daleposrědkowanja',
+'brokenredirectstext' => 'Naslědne daleposrědkowanja na njeeksistowace strony pokazuja:',
+'bugreports' => 'Bug reports',
+'bugreportspage' => 'Project:Bug reports',
+'bydate' => 'datumje',
+'byname' => 'mjenje',
+'bysize' => 'wulkosći',
+'cachederror' => 'Naslědne je kopija z pufrowaka a njemóhło hižo aktualne być.',
+'cancel' => 'Přetorhnyć',
+'cannotdelete' => 'Njeje móžno podatu stronu abo dataju wuÅ¡mórnyć. (Po zdaću je to hižo nÄ›chtó druhi ÄiniÅ‚.)',
+'cannotundelete' => 'Wobnowjenje zwrěšćiło; něchtó druhi je stronu prjedy wobnowił.',
+'cantrollback' => 'Njemóžno změnu cofnyć; strona nima druhich awtorow.',
+'categories' => 'Kategorije',
+'categoriespagetext' => 'Slědowace kategorije w tutym wiki ekstistuja.',
+'category_header' => 'Nastawki w kategoriji „$1â€',
+'categoryarticlecount' => 'W tutej kategoriji je {{PLURAL:$1|jedyn nastawk|$1 nastawkow}}.',
+'categorypage' => 'Kategoriju pokazać',
+'changed' => 'změnjena',
+'changepassword' => 'Hesło změnić',
+'changes' => 'změny',
+'clearwatchlist' => 'Wobkedźbowanki wuprózdnić',
+'clearyourcache' => '<b>Kedźbu:</b> Po skÅ‚adowanju dyrbiće snano pufrowak swojeho browsera wuprózdnić, <b>Mozilla/Firefox/Safari:</b> tłóÄće na <i>Umsch</i> kliknjo na <i>Znowa</i> abo tłóÄce <i>Strg-Umsch-R</i> (<i>Cmd-Shift-R</i> na Apple Mac); <b>IE:</b> tłóÄće <i>Strg</i> kliknjo na symbol <i>Aktualisieren</i> abo tłóÄće <i>Strg-F5</i>; <b>Konqueror:</b>: Klikńće jenož na tłóÄatko <i>Erneut laden</i> abo tÅ‚oÄće <i>F5</i>; Wužiwarjo <b>Opery</b> móža swój pufrowak dospoÅ‚nje w <i>Tools→Preferences</i> wuprózdnić.',
+'columns' => 'Stołpiki:',
+'compareselectedversions'=> 'Wubranej wersiji přirunać',
+'confirm' => 'Wobkrućić',
+'confirm_purge' => 'Pufrowak strony wuprózdnić? $1',
+'confirm_purge_button' => 'OK',
+'confirmdelete' => 'Wušmórnjenje wobkrućić',
+'confirmdeletetext' => 'Sće so rozsudźiÅ‚(a) stronu abo dataju hromadźe ze jeje stawiznami z datoweje banki wotstronić. ProÅ¡u wobkruÄće, zo to zwotpohladom Äiniće, zo rozumiće sćěwki a zo Äiniće to po [[{{MSG:MediaWiki:Policy-url}}|prawidÅ‚ami]] {{GRAMMAR:genitiw|{{SITENAME}}}}.',
+'confirmedittext' => 'WaÅ¡a emailowa adresa dyrbi so wobkrućić, prjedy haÄ móžeće strony wobdźěłować. ProÅ¡u zapodajće a wobkrućće swoju emailowu adresu pÅ™ez swoje [[Special:Preferences|nastajenja]].',
+'confirmedittitle' => 'Waša emailowa adresa dyrbi so wobkrućić, zo byšće strony wobdźěłować móhł(a).',
+'confirmemail' => 'Emailowu adresu potwjerdźić',
+'confirmemail_body' => 'Něchtó, najskerje Wy z IP-adresu $1, je wužiwarske konto "$2" z tutej emailowej adresu we {{GRAMMAR:lokatiw|{{SITENAME}}}} załožił.
+
+Zo by so wobkrućiÅ‚o, zo tute konto woprawdźe Wam sÅ‚uÅ¡a a zo bychu emailowe funkcije na {{{GRAMMAR:lokatiw|{{SITENAME}}}} zaktiwizowali, woÄińće tutón wotkaz w swojim browserje:
+$3
+
+Jeli to Wy *njejsće*, njeslědujće wotkaz. Tutón wobkrućenski kode spadnje dnja $4.',
+'confirmemail_error' => 'Zmylk při wobkrućenju Wašeje emailoweje adresy.',
+'confirmemail_invalid' => 'Njepłaćiwy wobkrućenski kode. Kode móhł spadnjeny być.',
+'confirmemail_loggedin' => 'Waša emailowa adresa bu nětko wobkrućena.',
+'confirmemail_needlogin'=> 'Dyrbiće so $1, zo byšće emailowu adresu wobkruÄić móhÅ‚(a).',
+'confirmemail_send' => 'Wobkrućenski kode pósłać',
+'confirmemail_sendfailed'=> 'Njebě móžno wobkrućenski email słać. Přepruwujće adresu za njepłaćiwymi znamješkami.',
+'confirmemail_sent' => 'Wobkrućenski email pósłany.',
+'confirmemail_subject' => '{{SITENAME}} – wobkrućenje emailoweje adresy',
+'confirmemail_success' => 'Waša emailowa adresa bu wobkrućena. Móžeće so nětko přizjewić.',
+'confirmemail_text' => 'Tutón wiki sej žada, zo swoju emailowu adresu wobruÄće, prjedy haÄ emailowe funkcije wužiwaće. Zaktiwizujće tłóÄku deleka, zo by so wobkrućenski email k waÅ¡ej adresy sÅ‚aÅ‚. Tutón email zapÅ™ijmje pokaz, kotryž kode wobsahuje; zaÄitajće pokaz do swojeho browsera, zo byšće wobkrućiÅ‚, zo emailowa adresa je pÅ‚aćiwa.',
+'confirmprotect' => 'Škit wobkrućić',
+'confirmprotecttext' => 'Chceće tutu stronu woprawdźe škitać?',
+'confirmrecreate' => 'Wužiwar [[User:$1|$1]] ([[User talk:$1|talk]]) je stronu wuÅ¡mórnyÅ‚ po tym zo sÄe zapoÄaÅ‚(a) ju wobdźěłać z pÅ™iÄinu:
+: <i>$2</i>
+ProÅ¡u wobkruÄće, zo chceće ju woprawdźe zaso zaÅ‚ožić.',
+'confirmunprotect' => 'Zběhnjenje škita wobkrućić',
+'confirmunprotecttext' => 'Chceće škit za tutu stronu woprawdźe zběhnyć?',
+'contextchars' => 'Kontekst na rjadku:',
+'contextlines' => 'Rjadki na wuslědk:',
+'contribslink' => 'přinoški',
+'contribsub' => 'Za wužiwarja $1',
+'contributions' => 'Wužiwarske přinoški',
+'copyright' => 'Wobsah steji pod {{GRAMMAR:lokatiw|$1}} k dispoziciji.',
+'copyrightpage' => 'Project:Awtorske prawa',
+'copyrightpagename' => '{{SITENAME}} awtorske prawa',
+'copyrightwarning' => 'Prošu wobkedźbujće, zo wšě přinoški za {{GRAMMAR:akuzatiw|{{SITENAME}}}} maja za pod $2 dopušćene (hlej $1 za dalše informacije). Jelizo nochceće, zo waš přinošk so po dobrozdaću wobdźěłuje a rozšěrja, njeskładujće jón.
+
+Lubiće nam tež, zo sće jón sam napisał(a) abo ze zjawneje domeny abo z podobneho swobodneho žórła kopěrował(a).
+
+<strong>NJEZAÅOŽĆE PŘINOÅ KI Z COPYRIGHTOM BJEZ DOWOLENJA!</strong>',
+'copyrightwarning2' => 'Prošu wobkedźbujće, zo wšě přinoški za {{GRAMMAR:akuzatiw|{{SITENAME}}}} móhli so wot druhich wužiwarjow wobdźěłować, měnjeć abo wotstronjeć. Jelizo nochceće, zo waš přinošk so po dobrozdaću wobdźěłuje, njeskładujće jón.
+
+Lubiće nam tež, zo sće jón sam napisał(a) abo ze zjawneje domeny abo z podobneho swobodneho žórła kopěrował(a) (hlej $1 za detaile).
+
+<strong>NJEZAÅOŽĆE PŘINOÅ KI Z COPYRIGHTOM BJEZ DOWOLENJA!</strong>',
+'couldntremove' => 'Njemóžu poziciju \'$1\' wotstronić...',
+'createaccount' => 'Wužiwarske konto załožić',
+'createaccountmail' => 'z emailom',
+'createarticle' => 'Nastawk załožić',
+'created' => 'załožena',
+'creditspage' => 'Dźakprajenje awtoram',
+'cur' => 'akt',
+'currentevents' => 'Aktualne podawki',
+'currentevents-url' => 'Aktualne podawki',
+'currentrev' => 'Aktualna wersija',
+'currentrevisionlink' => 'Aktualnu wersiju pokazać',
+'data' => 'Daty',
+'databaseerror' => 'Zmylk w datowej bance',
+'datedefault' => 'Standard',
+'dateformat' => 'Format datuma',
+'datetime' => 'Datum a Äas',
+'dberrortext' => 'Syntaktiski zmylk při wotprašowanju datoweje banki.
+To móhło bug w programje być. Poslednje spytane wotprašenje w datowej bance běše:
+<blockquote><tt>$1</tt></blockquote>
+z funkcije „<tt>$2</tt>â€.
+MySQL wróći zmylk „<tt>$3: $4</tt>â€.',
+'dberrortextcl' => 'Syntaktiski zmylk je we wotprašowanju datoweje banki wustupił.
+Poslednje wotprašenje w datowej bance běše:
+„$1â€
+z funkcije „$2â€.
+MySQL wróći zmylk „$3: $4â€.',
+'deadendpages' => 'Nastawki bjez wotkazow',
+'dec' => 'dec',
+'december' => 'december',
+'december-gen' => 'decembra',
+'default' => 'Standard',
+'defaultns' => 'W tutych mjenowych rumach awtomatisce pytać:',
+'defemailsubject' => '{{SITENAME}} email',
+'delete' => 'Wušmórnyć',
+'delete_and_move' => 'wotstronić a přesunyć',
+'delete_and_move_confirm'=> 'Haj, nastawk wušmórnyć.',
+'delete_and_move_reason'=> 'Strona bu wušmórnjena, zo by so přesunjenje zmóžniło',
+'delete_and_move_text' => '==Wotstronjenje trěbne==
+
+Cilowy nastawk „[[$1]]†hižo eksistuje. Chceće jón wušmórnyć, zo by so přesunjenje zmóžniło?',
+'deletecomment' => 'PÅ™iÄina wuÅ¡mórnjenja',
+'deletedarticle' => 'Strona „[[$1]]†bu wušmórnjena.',
+'deletedrev' => '[wušmórnjena]',
+'deletedrevision' => 'Stara wersija $1 wušmórnjena',
+'deletedtext' => '„$1†bu wotstronjene. Hlej $2 za zapis tuchwilnych wotstronjenjow.',
+'deletedwhileediting' => '<b>Kedźbu:</b> Strona bu wuÅ¡mórnjena po tym zo sće zapoÄaÅ‚(a) ju wobdźěłać!',
+'deleteimg' => 'wotstr',
+'deleteimgcompletely' => 'Wšě wersije tuteje dataje wotstronić',
+'deletepage' => 'Stronu wušmórnyć',
+'deletesub' => '(„$1†so wušmórnje)',
+'deletethispage' => 'Stronu wušmórnyć',
+'deletionlog' => 'Protokol wušmórnjenjow',
+'dellogpage' => 'Protokol wušmórnjenjow',
+'dellogpagetext' => 'Deleka je lisćina najaktualnišich wušmórnjenjow.',
+'destfilename' => 'Mjeno ciloweje dataje',
+'diff' => 'rozdźěl',
+'difference' => '(Rozdźěl mjez wersijomaj)',
+'disambiguations' => 'Rozjasnjenja wjacezmyslnosće',
+'disambiguationspage' => 'Template: ??? Rozjasnjenje wjacezmyslnosće ***',
+'disambiguationstext' => 'Naslědne strony pokazuja na <i> stronu disambiguacije</i>. Dyrbjeli město toho na přihódny nastawk pokazać.
+
+Strona so jako disambiguacija wobhlada, jelizo pokaz wot $1 ma.
+
+Pokazy z druhich mjenowych rumow tu naliÄene <i>njejsu</i>.',
+'disclaimerpage' => 'Project:Licencne postajenja',
+'disclaimers' => 'Licencne postajenja',
+'displaytitle' => '(Wotkaz na tutu stronu jako [[$1]])',
+'doubleredirects' => 'Dwójne daleposrědkowanja',
+'doubleredirectstext' => 'Kóžda rjadka wotkazy k prěnjemu a druhemu daleposrědkowanju wobsahuje, runje tak prěnja linka teksta druheho sposrědkowanja, kotraž z wašnjom „woprawdźitu†cilowu stronu podawa, na kotruž prěnje sposrědkowanje dyrbjało pokazać.',
+'download' => 'Sćahnyć',
+'eauthentsent' => 'Wobkrućenski email bu k mjenowanej adresy pósÅ‚any. Prjedy haÄ so druhi email ke kontu sćele, dyrbiće instrukcije w emailu sćěhować, zo byšće wobkrućiÅ‚(a), zo je to woprawdźe WaÅ¡e konto.',
+'edit' => 'Wobdźěłać',
+'edit-externally' => 'Tutu dataju z eksternym programom wobdźěłać',
+'edit-externally-help' => 'Hlej [http://meta.wikimedia.org/wiki/Help:External_editors pokiwy za instalaciju] za wjace informacijow.',
+'editcomment' => 'Komentar zmÄ›ny běše: „<i>$1</i>â€.',
+'editconflict' => 'Wobdźěłowanski konflikt: $1',
+'editcurrent' => 'Tuchwilnu wersiju tuteje strony wobdźěłać',
+'edithelp' => 'Pomoc za wobdźěłanje',
+'edithelppage' => 'Pomoc:Wobdźěłanje',
+'editing' => 'Wobdźěłanje strony $1',
+'editingcomment' => 'Wobdźěłanje strony $1 (komentar)',
+'editinginterface' => '<b>Kedźbu:</b> Wobdźěłaće stronu, kotraž wobsahuje tekt za rÄ›Äny zwjerch. ZmÄ›njenja wuskutkuja so na wÅ¡Ä›ch druhich wužiwarjow tutoho rÄ›Äneho zwjercha.',
+'editingold' => '<strong>KEDŹBU: Wobdźěłujeće staršu wersiju tuteje strony. Jelizo ju składujeće, budźe jako najnowša wersija składowana.</strong>',
+'editingsection' => 'Wobdźěłanje strony $1 (wotrězk)',
+'editold' => 'wobdźěłać',
+'editsection' => 'wobdźěłać',
+'editsectionhint' => 'Wotrězk wobdźěłać: $1',
+'editthispage' => 'Stronu wobdźěłać',
+'edittools' => '<!-- Tutón tekst so pod wobdźělowanskimi a nahrawanskimi woknješkami pokazuje. -->',
+'editusergroup' => 'Wužiwarske skupiny wobdźěłać',
+'email' => 'Email',
+'emailauthenticated' => 'Waša emailowa adresa bu $1 wobkrućena.',
+'emailconfirmlink' => 'Wobkrućće swoju emailowu adresu',
+'emailfrom' => 'Wot',
+'emailmessage' => 'Powěsć',
+'emailnotauthenticated' => 'Waša emailowa adresa hišće <strong>wobkrućena njeje</strong>. Žadyn email za jednu z naslědnych funkcijow pósłany njebudźe.',
+'emailpage' => 'Wužiwarjej email pósłać',
+'emailpagetext' => 'Jelizo tutón wužiwar je płaćiwu emailowu adresu do swojich nastajenjow zapisał, móžeće z formularom deleka email słać. Emailowa adresa, kotruž sće do swojich wužiwarskich nastajenjow zapisał, budźe so jako adresa "Wot" emaila jewić, zo by přijimowar móhł wotmołwić.',
+'emailsend' => 'Wotesłać',
+'emailsent' => 'Email bu pósłany',
+'emailsenttext' => 'Emailowa powěsć bu pósłana.',
+'emailsubject' => 'Předmjet',
+'emailto' => 'Komu',
+'emailuser' => 'Tutomu wužiwarjej email pósłać',
+'emptyfile' => 'Dataja, kotruž sće nahraÅ‚, zda so prózdna być. MóhÅ‚o to dla tipowanskeho zmylka w mjenje dataje być. ProÅ¡u pruwujće haÄ chceće tutu dataju woprawdźe nahrawać.',
+'enotif_body' => 'Luby(a) $WATCHINGUSERNAME,<br />
+
+strona {{SITENAME}} „$PAGETITLE†bu dnja $PAGEEDITDATE wot $PAGEEDITOR $CHANGEDORCREATED,
+hlej $PAGETITLE_URL za aktualnu wersiju.
+
+$NEWPAGE
+
+Zjeće wobdźěłaćerja běše: $PAGESUMMARY $PAGEMINOREDIT
+
+Wobdźěłarja kontaktować:
+mail $PAGEEDITOR_EMAIL
+wiki $PAGEEDITOR_WIKI
+
+Njebudu žane druhe zdźělenki w padźe dalšich změnow, chibazo wopytaće tutu stronu.
+Wy móhł(a) tež zdźělenske opcije za wšě ze swojich wobkedźbowanych stronow ze swojich wobkedźbowankow wróćo stajić.
+
+Waš přećelny zdźělenski system {{GRAMMAR:genitiw|{{SITENAME}}}}
+
+--
+Zo byšće nastajenja Wašich wobkedźbowankow změnił(a), wopytajće
+{{fullurl:Special:Watchlist/edit}}',
+'enotif_lastvisited' => 'Změny po Wašim poslednim wopyće: $1',
+'enotif_mailer' => '{{SITENAME}} Emailowe zdźělenje',
+'enotif_newpagetext' => 'To je nowa strona.',
+'enotif_reset' => 'Wšě strony jako widźane markěrować',
+'enotif_subject' => '{{SITENAME}} Strona „$PAGETITLE†bu přez $PAGEEDITOR $CHANGEDORCREATED.',
+'enterlockreason' => 'Podajće pÅ™iÄinu zawrjenja a pÅ™ibližny Äas, hdy so zawrjenje zbÄ›hnje',
+'error' => 'Zmylk',
+'errorpagetitle' => 'Zmylk',
+'exbeforeblank' => 'Wobsah do wuprózdnjenja běše: \'$1\'',
+'exblank' => 'Strona běše prózdna',
+'excontent' => 'Wobsah běše: \'$1\'',
+'excontentauthor' => 'Wobsah běše: \'$1\' (jeniÄki wobdźěłowar běše \'$2\')',
+'exif-aperturevalue' => 'Zasłona',
+'exif-artist' => 'Awtor',
+'exif-bitspersample' => 'Bajtow na barbowu komponentu',
+'exif-brightnessvalue' => 'Swětłosć',
+'exif-cfapattern' => 'CFA-muster',
+'exif-colorspace' => 'Barbowy rum',
+'exif-componentsconfiguration'=> 'Woznam kóždeje komponenty',
+'exif-componentsconfiguration-0'=> 'Njeeksistuje',
+'exif-compressedbitsperpixel'=> 'Modus wobrazoweje kompresije',
+'exif-compression' => 'Metoda kompresije',
+'exif-compression-1' => 'Njekomprimowane',
+'exif-compression-6' => 'JPEG',
+'exif-contrast' => 'Kontrast',
+'exif-contrast-0' => 'Normalny',
+'exif-contrast-1' => 'Mjechki',
+'exif-contrast-2' => 'Twjerdy',
+'exif-copyright' => 'Mějićel awtorskich prawow',
+'exif-customrendered' => 'Wot wužiwarja definowane předźěłanje wobrazow',
+'exif-customrendered-0' => 'Normalne wobdźěłanje',
+'exif-customrendered-1' => 'Wužiwarske wobdźěłanje',
+'exif-datetime' => 'Datum a Äas datajoweje zmÄ›ny',
+'exif-datetimedigitized'=> 'Datum a Äas digitalizacije',
+'exif-datetimeoriginal' => 'Datum a Äas zaÅ‚oženja datow',
+'exif-devicesettingdescription'=> 'Nastajenja nastroja',
+'exif-digitalzoomratio' => 'Digitalny zoom',
+'exif-exifversion' => 'Exif wersija',
+'exif-exposurebiasvalue'=> 'Naswětlenska směrnica',
+'exif-exposureindex' => 'Naswětlenski indeks',
+'exif-exposuremode' => 'Naswětlenski modus',
+'exif-exposuremode-0' => 'Awtomatiske naswětlenje',
+'exif-exposuremode-1' => 'Manuelne naswětlenje',
+'exif-exposuremode-2' => 'Rjad naswětlenjow (Bracketing)',
+'exif-exposureprogram' => 'Program naswětlenja',
+'exif-exposureprogram-0'=> 'Njeznaty',
+'exif-exposureprogram-1'=> 'Manualny',
+'exif-exposureprogram-2'=> 'Standardny program',
+'exif-exposureprogram-3'=> 'Priorita zasłony',
+'exif-exposureprogram-4'=> 'Priorita zawěrki',
+'exif-exposureprogram-5'=> 'Kreatiwny program (na hłubokostnu wótrosć wusměrjeny)',
+'exif-exposureprogram-6'=> 'Akcijny program (na krótÅ¡i Äas zawÄ›rki wusmÄ›rjeny)',
+'exif-exposureprogram-7'=> 'Portretowy modus (za fotografije z bliskosće z njewótrym pozadkom)',
+'exif-exposureprogram-8'=> 'Krajinsky modus (za krajinske fotografije z wótrym pozadkom)',
+'exif-exposuretime' => 'Čas naswětlenja',
+'exif-exposuretime-format'=> '$1 sek. ($2)',
+'exif-filesource' => 'Žórło dataje',
+'exif-flash' => 'BÅ‚ysk',
+'exif-flashenergy' => 'Sylnosć błyska',
+'exif-flashpixversion' => 'Podpěrowana wersija Flashpix',
+'exif-fnumber' => 'Zasłona',
+'exif-fnumber-format' => 'f/$1',
+'exif-focallength' => 'Wohnišćowa zdalenosć ÄóÄka',
+'exif-focallength-format'=> '$1 mm',
+'exif-focallengthin35mmfilm'=> 'Wohnišćowa zdalenosć za film 35 mm pÅ™eliÄene',
+'exif-focalplaneresolutionunit'=> 'Jednotka rozpušćenja sensora',
+'exif-focalplaneresolutionunit-2'=> 'Cól',
+'exif-focalplanexresolution'=> 'Wodorune rozpušćenje sensora',
+'exif-focalplaneyresolution'=> 'Padorune rozpušćenje sensora',
+'exif-gaincontrol' => 'Wodźenje sceny',
+'exif-gaincontrol-0' => 'Žane powjetšenje',
+'exif-gaincontrol-1' => 'Snadne powjetšenje',
+'exif-gaincontrol-2' => 'Wysoke powjetšenje',
+'exif-gaincontrol-3' => 'Snadne pomjeńšenje',
+'exif-gaincontrol-4' => 'Wulke pomjeńšenje',
+'exif-gpsaltitude' => 'Wysokosć',
+'exif-gpsaltituderef' => 'Referenca wysokosće',
+'exif-gpsareainformation'=> 'Mjeno wobwoda GPS',
+'exif-gpsdatestamp' => 'Datum GPS',
+'exif-gpsdestbearing' => 'Wusměrjenje',
+'exif-gpsdestbearingref'=> 'Referenca za wusměrjenje',
+'exif-gpsdestdistance' => 'Zdalenosć k cilej',
+'exif-gpsdestdistanceref'=> 'Referenca za zdalenosć k cilej',
+'exif-gpsdestlatitude' => 'Šěrina',
+'exif-gpsdestlatituderef'=> 'Referenca za šěrinu',
+'exif-gpsdestlongitude' => 'Šěrina',
+'exif-gpsdestlongituderef'=> 'Referenca dołhosće',
+'exif-gpsdifferential' => 'Diferencialna korektura GPS',
+'exif-gpsdirection-m' => 'Magnetiski směr',
+'exif-gpsdirection-t' => 'Woprawdźity směr',
+'exif-gpsdop' => 'Měrjenska dokładnosć',
+'exif-gpsimgdirection' => 'Wobrazowy směr',
+'exif-gpsimgdirectionref'=> 'Referenca za wusměrjenje wobraza',
+'exif-gpslatitude' => 'Geografiska šěrina',
+'exif-gpslatitude-n' => 'Sewjerna šěrina',
+'exif-gpslatitude-s' => 'Južna šěrina',
+'exif-gpslatituderef' => 'Sewjerna abo južna šěrina',
+'exif-gpslongitude' => 'Geografiska dołhosć',
+'exif-gpslongitude-e' => 'Wuchodna dalokosć',
+'exif-gpslongitude-w' => 'Zapadna dalokosć',
+'exif-gpslongituderef' => 'Wuchodna abo zapadna dołhosć',
+'exif-gpsmapdatum' => 'Wužiwane geodetiske daty',
+'exif-gpsmeasuremode' => 'Měrjenska metoda',
+'exif-gpsmeasuremode-2' => 'dwudimensionalne měrjenje',
+'exif-gpsmeasuremode-3' => 'třidimensionalne měrjenje',
+'exif-gpsprocessingmethod'=> 'Metoda wobdźěłanja GPS',
+'exif-gpssatellites' => 'Satelity wužiwane za měrjenje',
+'exif-gpsspeed' => 'Spěšnosć přijimaka GPS',
+'exif-gpsspeed-n' => 'Suki',
+'exif-gpsspeedref' => 'Jednotka spěšnosće',
+'exif-gpsstatus' => 'Status přijimaka',
+'exif-gpsstatus-a' => 'Měrjenje hišće běži...',
+'exif-gpstimestamp' => 'GPS-Äas (atomowy Äasnik)',
+'exif-gpstrack' => 'Pohibowy směr',
+'exif-gpstrackref' => 'Referenca za pohibowy směr',
+'exif-gpsversionid' => 'Wersija znamki GPS',
+'exif-imagedescription' => 'Titul wobraza',
+'exif-imagelength' => 'Wysokosć',
+'exif-imageuniqueid' => 'ID wobraza',
+'exif-imagewidth' => 'Šěrokosć',
+'exif-isospeedratings' => 'Cutliwosć film a abo sensora',
+'exif-jpeginterchangeformat'=> 'Offset k JPEG SOI',
+'exif-jpeginterchangeformatlength'=> 'Bajty JPEG datow',
+'exif-lightsource' => 'Žórło swěcy',
+'exif-lightsource-0' => 'Njeznate',
+'exif-lightsource-1' => 'Dnjowe swětło',
+'exif-lightsource-10' => 'PomróÄene',
+'exif-lightsource-11' => 'Sćin',
+'exif-lightsource-12' => 'Fluorescentne dnjowe swětło (D 5700 – 7100K)',
+'exif-lightsource-13' => 'Dźeń, běłe, fluorescentne (N 4600 – 5400K)',
+'exif-lightsource-14' => 'Chłódne, běłe, fluorescentne (W 3900 – 4500K)',
+'exif-lightsource-15' => 'Běły, fluorescěrowacy (WW 3200 – 3700K)',
+'exif-lightsource-17' => 'Normalne swětło A',
+'exif-lightsource-18' => 'Normalne swětło B',
+'exif-lightsource-19' => 'Normalne swětło C',
+'exif-lightsource-2' => 'Fluorescentne',
+'exif-lightsource-24' => 'ISO studijowa wolframowa žehlawka',
+'exif-lightsource-255' => 'Hinaše swětłowe žórło',
+'exif-lightsource-3' => 'Žehlawka',
+'exif-lightsource-4' => 'BÅ‚ysk',
+'exif-lightsource-9' => 'Rjane wjedro',
+'exif-make' => 'Zhotowjer kamery',
+'exif-makernote' => 'Přispomnjenja zhotowjerja',
+'exif-maxaperturevalue' => 'Najwjetša objektiwowa wotwěra',
+'exif-meteringmode' => 'Měrjenska metoda',
+'exif-meteringmode-0' => 'Njeznata',
+'exif-meteringmode-1' => 'Přerězk',
+'exif-meteringmode-2' => 'Dosrjedźny přerězk',
+'exif-meteringmode-255' => 'Druha',
+'exif-meteringmode-3' => 'Dypkowa',
+'exif-meteringmode-4' => 'wjeledypkowa',
+'exif-meteringmode-5' => 'Muster',
+'exif-meteringmode-6' => 'Na dźěl wobraza wusměrjena',
+'exif-model' => 'Model kamery',
+'exif-oecf' => 'Optoelektroniski pÅ™eliÄowanski faktor',
+'exif-orientation' => 'Wusměrjenje kamery',
+'exif-orientation-1' => 'Normalnje',
+'exif-orientation-2' => 'Horicontalnje kiwknjeny',
+'exif-orientation-3' => 'Wo 180° zwjertnjeny',
+'exif-orientation-4' => 'Wertikalnje kiwknjeny',
+'exif-orientation-5' => 'Wo 90° pÅ™ećiwo smÄ›rej Äasnika zwjertnjeny a wertikalnje kiwknjeny',
+'exif-orientation-6' => 'Wo 90° po smÄ›rje Äasnika zwjertnjeny',
+'exif-orientation-7' => 'Wo 90° po smÄ›rje Äasnika zwjertnjeny a wertikalnje kiwknjeny',
+'exif-orientation-8' => 'Wo 90° pÅ™ećiwo smÄ›rej Äasnika zwjertnjeny',
+'exif-photometricinterpretation'=> 'Zestajenje pikselow',
+'exif-photometricinterpretation-2'=> 'RGB',
+'exif-photometricinterpretation-6'=> 'YCbCr',
+'exif-pixelxdimension' => 'Płaćiwa wysokosć wobraza',
+'exif-pixelydimension' => 'Płaćiwa šěrokosć wobraza',
+'exif-planarconfiguration'=> 'Porjad datow',
+'exif-planarconfiguration-1'=> 'Å kropawy format',
+'exif-planarconfiguration-2'=> 'PÅ‚ony format',
+'exif-primarychromaticities'=> 'Barbowa kwalita primarnych barbow',
+'exif-referenceblackwhite'=> 'Por Äorneje a běłeje referencneju hódnotow',
+'exif-relatedsoundfile' => 'Zwjazana zynkowa dataja',
+'exif-resolutionunit' => 'Jednotka rozeznaća X a Y',
+'exif-rowsperstrip' => 'LiÄba rjadkow na pask',
+'exif-samplesperpixel' => 'LiÄba komponentow',
+'exif-saturation' => 'Nasyćenosć',
+'exif-saturation-0' => 'Normalna nasyćenosć',
+'exif-saturation-1' => 'Niska nasyćenosć',
+'exif-saturation-2' => 'Wysoka nasyćenosć',
+'exif-scenecapturetype' => 'Typ zapopadnjenja sceny',
+'exif-scenecapturetype-0'=> 'Standard',
+'exif-scenecapturetype-1'=> 'Krajina',
+'exif-scenecapturetype-2'=> 'Portret',
+'exif-scenecapturetype-3'=> 'Nócne foto',
+'exif-scenetype' => 'Typ sceny',
+'exif-scenetype-1' => 'Direktnje zapopadnjeny wobraz',
+'exif-sensingmethod' => 'Měrjenska metoda',
+'exif-sensingmethod-1' => 'Njedefinowany',
+'exif-sensingmethod-2' => 'JednoÄipowy barbowy pÅ™estrjenjowy sensor',
+'exif-sensingmethod-3' => 'DwuÄipowy barbowy pÅ™estrjenjowy sensor',
+'exif-sensingmethod-4' => 'TÅ™iÄipowy barbowy pÅ™estrjenjowy sensor',
+'exif-sensingmethod-5' => 'Sekwencielny barbowy přestrjenjowy sensor',
+'exif-sensingmethod-7' => 'Trilinearny sensor',
+'exif-sensingmethod-8' => 'Barbowy sekwencielny linearny sensor',
+'exif-sharpness' => 'Wótrosć',
+'exif-sharpness-0' => 'Normalny',
+'exif-sharpness-1' => 'Mjechki',
+'exif-sharpness-2' => 'Twjerdy',
+'exif-shutterspeedvalue'=> 'Čas naswětlenja',
+'exif-software' => 'Software',
+'exif-spatialfrequencyresponse'=> 'Rumnostna frekwencowa charakteristika',
+'exif-spectralsensitivity'=> 'Spektralna cutliwosć',
+'exif-stripbytecounts' => 'Bajtow na komprimowany pask',
+'exif-stripoffsets' => 'Městno wobrazowych datow',
+'exif-subjectarea' => 'Wobkruh',
+'exif-subjectdistance' => 'Zdalenosć k objektej',
+'exif-subjectdistance-value'=> '$1 m',
+'exif-subjectdistancerange'=> 'Zdalenosć objekta',
+'exif-subjectdistancerange-0'=> 'Njeznaty',
+'exif-subjectdistancerange-1'=> 'Makro',
+'exif-subjectdistancerange-2'=> 'Foto zbliska',
+'exif-subjectdistancerange-3'=> 'Foto znazdala',
+'exif-subjectlocation' => 'Městno objekta',
+'exif-subsectime' => 'Dźěl sekundow DateTime',
+'exif-subsectimedigitized'=> 'Dźěl sekundow DateTimeDigitized',
+'exif-subsectimeoriginal'=> 'Dźěl sekundow DateTimeOriginal',
+'exif-transferfunction' => 'Přenošowanska funkcija',
+'exif-usercomment' => 'Přispomjenja wužiwarja',
+'exif-whitebalance' => 'Balansa běłeje barby',
+'exif-whitebalance-0' => 'Automatiske wubalansowanje běłeho',
+'exif-whitebalance-1' => 'Manuelne wubalansowanje běłeho',
+'exif-whitepoint' => 'Barbowa kwalita běłeho dypka',
+'exif-xresolution' => 'Wodorune rozpušćenje',
+'exif-ycbcrcoefficients'=> 'Matriksowe koeficienty za transformaciju barboweho ruma',
+'exif-ycbcrpositioning' => 'Wusměrjenje Y a C',
+'exif-ycbcrsubsampling' => 'Poměr wottasanja Y k C',
+'exif-yresolution' => 'Padorune rozpušćenje',
+'expiringblock' => 'haÄ do $1',
+'explainconflict' => 'NÄ›chtó druhi je tutu stronu zmÄ›niÅ‚ w samsnym Äasu, hdyž sće spytaÅ‚(a) ju wobdźěłać. Hornje tekstowe polo wobsahuje tekst strony kaž wón tuchwilu eksistuje. WaÅ¡e zmÄ›ny so w delnim tekstowym polu jewja. Dyrbiće swoje zmÄ›ny do eksistowaceho teksta zasunyć. <b>Jenož</b> tekst w hornim tekstowym polu budźe so skÅ‚adować jelizo na „SkÅ‚adować†kliknjeće.<br />',
+'export' => 'Strony eksportować',
+'export-submit' => 'Eksportować',
+'exportcuronly' => 'Jenož aktualnu wersiju zapřijeć, nic dospołne stawizny',
+'exportnohistory' => '----
+<b>Kedźbu:</b> Eksport cyłych stawiznow přez tutón formular je wukonliwosće serwera dla znjemóžnjeny.',
+'exporttext' => 'Móžeće tekst a stawizny wěsteje strony abo skupiny stronow, kotrež su w XML zawite, eksportować. To da so potom do druheho wiki, kotryž ze software MediaWiki dźěła, z pomocu strony Special:Import importować.
+
+Zo bychu so strony z nastawkami eksportowali, zapisajće titule stron do tekstoweho pola deleka, jedyn titul na linku, a wubjerće haÄ chceće tuchwilnu wersiju kaž tež stare wersije z linkami stawiznow strony abo jenož aktualnu wersiju z informacijemi wo poslednjej zmÄ›nje eksportować.
+
+W poslednim padźe móžeće tež wotkaz wužiwać, na pÅ™. „[[Special:Export/{{int:Mainpage}}]]†za stronu „{{int:Mainpage}}â€.',
+'externaldberror' => 'Běše pak eksterny zmylk awtentifikacije datoweje banki, pak njesměće swoje eksterne konto aktualizować.',
+'extlink_sample' => 'http://www.beispiel.de Titul wotkaza',
+'extlink_tip' => 'Eksterny wotkaz (prošu dopomńće so na prefiks http://)',
+'faq' => 'FAQ',
+'faqpage' => 'Project:FAQ',
+'feb' => 'feb',
+'february' => 'februar',
+'february-gen' => 'februara',
+'feed-invalid' => 'Njepłaćiwy typ abonementa.',
+'feedlinks' => 'Newsfeed:',
+'filecopyerror' => 'Njebě móžno dataju „$1†k „$2†kopěrować.',
+'filedeleteerror' => 'Njebě móžno dataju „$1†wušmórnyć.',
+'filedesc' => 'Zjeće',
+'fileexists' => 'Dataja z tutym mjenom hižo eksistuje, proÅ¡u pruwujće $1 jelizo njejsće wÄ›sty(a) haÄ chceće ju zmÄ›nić.',
+'fileexists-forbidden' => 'Dataja z tutym mjenom hižo ekstituje, prošu dźiće wróćo a nahrawajće ju z druhim mjenom. [[Image:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden'=> 'Dataja z tutym mjenom hižo ekstituje, prošu dźiće wróćo a nahrawajće ju z druhim mjenom. [[Image:$1|thumb|center|$1]]',
+'fileinfo' => '$1KB, družina MIME: <code>$2</code>',
+'filemissing' => 'Dataja pobrachuje',
+'filename' => 'Mjeno dataje',
+'filenotfound' => 'Njebě móžno dataju „$1†namakać.',
+'filerenameerror' => 'Njebě móžno dataju „$1†do „$2†přemjenować.',
+'files' => 'Dataje',
+'filesource' => 'Žórło',
+'filestatus' => 'Licenca',
+'fileuploaded' => 'Dataja „$1†bu z wuspěchom nahrata. Prošu slědujće tutón wotkaz: $2 k stronje wopisanja a zapisajće informacije wo dataji, na př. zwotkel pochadźa, hdy a wot koho bu załožena a štožkuli hišće wo njej wěsće. Jelizo je to wobraz, móžeće jón takle zasunyć: <tt><nowiki>[[Image:$1|thumb|wopisanje]]</nowiki></tt>',
+'fileuploadsummary' => 'Zjeće:',
+'filewasdeleted' => 'Dataja z tutym mjenom bu prjedy hižo nahrata a mjeztym wuÅ¡mórnjena. ProÅ¡u pÅ™epruwujće $1 prjedy haÄ ju znowa skÅ‚adujće.',
+'formerror' => 'Zmylk: njeje móžno formular wotesłać',
+'fri' => 'Pja',
+'friday' => 'Pjatk',
+'getimagelist' => 'Lisćinu datajow nabyć',
+'go' => 'Nastawk',
+'gotaccount' => 'Maće hižo wužiwarske konto? $1.',
+'gotaccountlink' => 'Přizjewić',
+'group' => 'Skupina:',
+'group-all' => '(wšě)',
+'group-bot-member' => 'bot',
+'group-bureaucrat' => 'Běrokraća',
+'group-bureaucrat-member'=> 'běrokrat',
+'group-sysop' => 'Administratorojo',
+'group-sysop-member' => 'administrator',
+'grouppage-bot' => 'Project:Bots',
+'grouppage-bureaucrat' => 'Project:Běrokraća',
+'grouppage-sysop' => 'Project:Administratorojo',
+'groups' => 'Skupiny wužiwarjow',
+'guesstimezone' => 'Z browsera zasunyć',
+'headline_sample' => 'Nadpismo',
+'headline_tip' => 'Nadpismo runiny 2',
+'help' => 'Pomoc',
+'helppage' => 'Project:Pomoc',
+'hide' => 'schować',
+'hideresults' => 'Wuslědki schować',
+'hidetoc' => 'schować',
+'hist' => 'wersije',
+'histfirst' => 'Tuchwilnu',
+'histlast' => 'Najstaršu',
+'histlegend' => 'Diff wubrać: WubÄ›rće opciske pola za pÅ™irunanje a tłóÄće na enter abo tłóÄku deleka.
+
+Legenda: (akt) = rozdźěl k tuchwilnej wersiji, (posl) = rozdźěl k předchadnej wersiji, D = drobna změna.',
+'history' => 'Stawizny strony',
+'history-feed-description'=> 'Stawizny wersijow za tutu stronu we wiki',
+'history-feed-empty' => 'Strona, kotruž sće požadał(a), njeekstistuje. Je móžne, zo bě wušmórnjena abo so pod druhi titul zasunyła. Móžeće [[Special:Search|tu]] za stronam z podobnym titulom pytać.',
+'history-feed-item-nocomment'=> '$1 w $2 hodź.',
+'history-feed-title' => 'Stawizny wersijow',
+'history_short' => 'Stawizny',
+'historywarning' => 'KEDŹBU: Strona, kotruž chceće wušmórnyć, ma stawizny:',
+'hr_tip' => 'Wodoruna linija (zrědka wužiwać)',
+'ignorewarning' => 'Warnowanje ignorować a dataju najebać toho składować.',
+'ignorewarnings' => 'Warnowanja ignorować',
+'illegalfilename' => 'Mjeno dataje „$1†znamješka, kotrež njejsu w stronowych titulach dopušćene, wobsahuje. Prošu přemjenujće dataju a spytajće hišće raz ju nahrać.',
+'ilsubmit' => 'Pytam',
+'image_sample' => 'Přikład.jpg',
+'image_tip' => 'Zasadźeny wobraz',
+'imagelinks' => 'Wotkazy',
+'imagelist' => 'Lisćina datajow',
+'imagelistall' => 'wšě',
+'imagelistforuser' => 'Jenož dataje kiž buchu přez $1 nahrate.',
+'imagelisttext' => 'Deleka je lisćina <b>$1</b> datajow po <b>$2</b> sortěrowanych.',
+'imagemaxsize' => 'Wobrazy na stronach wobrazoweho wopisanja wobmjezować na:',
+'imagepage' => 'Wobrazowu stronu pokazać',
+'imagereverted' => 'K staršej wersiji nawróćene.',
+'imgdelete' => 'Wušmórnyć',
+'imgdesc' => 'wopisanje',
+'imghistlegend' => 'Legenda: (akt) = to je aktualna dataja, (wotstr) = tutu staru wersiju wotstronić, (nawróć) = nawróć so k tutej starej wersiji.
+
+<i>Klikńće na datum zo byšće werziju widźał(a) kiž bu na tutym dnju nahrata</i>.',
+'imghistory' => 'Stawizny dataje',
+'imglegend' => 'Legenda: (wop) = Wopisanje dataje pokazać/wobdźěłać.',
+'immobile_namespace' => 'Cilowy titul je wosebity typ; strony njedadźa so do druheho mjenoweho ruma přesunyć.',
+'import' => 'Strony importować',
+'import-interwiki-history'=> 'Wšě wersije ze stawiznow tuteje strony kopěrować',
+'import-interwiki-namespace'=> 'Strony importować do mjenoweho ruma:',
+'import-interwiki-submit'=> 'Importować',
+'import-interwiki-text' => 'Wuběrće wiki a stronu k importowanju. Daty wersijow a mjena awtorow so wobchowaju. Wšě transwiki-importy so w [[Special:Log/import|protokolu importow]] jewja.',
+'import-logentry-interwiki'=> 'z druheho wiki importowany $1',
+'import-logentry-interwiki-detail'=> '$1 wersijow z $2',
+'import-logentry-upload'=> 'strona „[[$1]]†bu přez nahrawanje importowana',
+'import-logentry-upload-detail'=> '$1 wersijow',
+'import-revision-count' => '$1 wersijow',
+'importbadinterwiki' => 'WopaÄny interwiki-wotkaz',
+'importcantopen' => 'Njemóžno importowu dataju woÄinić',
+'importfailed' => 'Importowanje njeporadźiło: $1',
+'importhistoryconflict' => 'Napřećiwne stawizny eksistuja (snano bu strona hižo prjedy importowana)',
+'importing' => 'Importuju $1',
+'importinterwiki' => 'Transwiki import',
+'importlogpage' => 'Protokol importow',
+'importlogpagetext' => 'To je lisćina stronow ze stawiznami z druhich wiki.',
+'importnofile' => 'Žana importowanska dataja wubrana.',
+'importnopages' => 'Žane strony k importowanju',
+'importnosources' => 'Žane importowanske žórła za transwiki wubrane a direktne nahraća stawiznow su znjemóžnjene.',
+'importnotext' => 'Prózdny abo žadyn tekst',
+'importstart' => 'Importuju…',
+'importsuccess' => 'Importowanje poradźiło!',
+'importtext' => 'ProÅ¡u eksportujće dataju ze žórÅ‚oweho wiki wužiwajo stronu Special:Export, skÅ‚adujće ju na swoju krutu taÄel a nahrajće ju sem.',
+'importunknownsource' => 'Njeznate importowe žórło',
+'importuploaderror' => 'Nahraće importowanskeje dataje njeje so poradźiÅ‚o; snano dataja je wjetÅ¡a haÄ dowolena nahrawanska wulkosć.',
+'infiniteblock' => 'na přeco',
+'info_short' => 'Informacija',
+'infosubtitle' => 'Informacije za stronu',
+'internalerror' => 'Interny zmylk',
+'intl' => 'Interwiki-wotkazy',
+'invalidemailaddress' => 'Emailowa adresa njemóže so akceptować, dokelž zda so, zo ma njepłaćiwy format. Prošu zapisajće prawje formatowanu adresu abo wuprózdńće polo.',
+'invert' => 'Wuběr zwobroćić',
+'ip_range_invalid' => 'Njepłaciwy IP-wobkruh.',
+'ipaddress' => 'IP-adresa',
+'ipadressorusername' => 'IP-adresa abo wužiwarske mjeno',
+'ipb_expiry_invalid' => 'Čas spadnjenja je njepłaćiwy.',
+'ipbanononly' => 'Jenož anonymnych wužiwarjow blokować',
+'ipbcreateaccount' => 'Stworjenju nowych kontow zadźěwać',
+'ipbexpiry' => 'Spadnjenje',
+'ipblocklist' => 'Lisćina blokowanych IP-adresow a wužiwarskich mjenow',
+'ipblocklistempty' => 'Lisćina blokowanjow je prózdna.',
+'ipboptions' => '1 hodźinu:1 hodźinu,2 hodźinje:2 hodźinje,1 dźeń:1 dźeń,3 dny:3 dny,1 tydźeń:1 tydźeń,2 njedźeli:2 njedźeli,1 měsać:1 měsac,3 měsacy:3 měsacy,6 měsacow:6 měsacow,1 lěto:1 lěto,na přeco:na přeco',
+'ipbother' => 'Druha doba',
+'ipbotheroption' => 'druha doba (jendźelsce)',
+'ipbreason' => 'PÅ™iÄina',
+'ipbsubmit' => 'Wužiwarja blokować',
+'ipusubmit' => 'Blokowanje adresy zběhnyć',
+'isbn' => 'ISBN',
+'isredirect' => 'Daleposrědkowanje',
+'istemplate' => 'Zapřijeće předłohi',
+'italic_sample' => 'Kursiwny tekst',
+'italic_tip' => 'Kursiwny tekst',
+'iteminvalidname' => 'Problem ze stronu „$1“, njepłaćiwe mjeno...',
+'jan' => 'jan',
+'january' => 'januar',
+'january-gen' => 'januara',
+'jul' => 'jul',
+'july' => 'julij',
+'july-gen' => 'julija',
+'jumpto' => 'Dźi do:',
+'jumptonavigation' => 'Nawigacija',
+'jumptosearch' => 'Pytaj',
+'jun' => 'jun',
+'june' => 'junij',
+'june-gen' => 'junija',
+'laggedslavemode' => 'Kedźbu: Je móžno, zo strona žane zaktualizowanja njewobsahuje.',
+'largefile' => 'PoruÄa so, zo wobrazy wulkosć $1 bajtow njepÅ™ekroÄuja, tuta dataja je $2 bajtow wulka.',
+'largefileserver' => 'Tuta dataja je wjetÅ¡a haÄ serwer za nahrawanje dowoli.',
+'last' => 'posl',
+'lastmodifiedat' => 'Tuta strona bu posledni raz dnja $1 $2 změnjena.',
+'license' => 'Licenca',
+'lineno' => 'Linka $1:',
+'link_sample' => 'Titul wotkaza',
+'link_tip' => 'Interny wotkaz',
+'linklistsub' => '(Lisćina wotkazow)',
+'linkshere' => 'Naslědne strony sem pokazuja:',
+'linkstoimage' => 'Naslědne strony na tutu dataju pokazuja:',
+'listingcontinuesabbrev'=> 'pokr.',
+'listredirects' => 'Lisćina daleposrědkowanjow',
+'listusers' => 'Zapis wužiwarjow',
+'listusersfrom' => 'ZapoÄinajo z:',
+'loadhist' => 'Stawizny strony zaÄitać',
+'loadingrev' => 'zaÄitanje wersijow za diff',
+'localtime' => 'Lokalny Äas',
+'lockbtn' => 'Datowu banku zawrěć',
+'lockconfirm' => 'Haj, chcu woprawdźe datowu banku zawrěć.',
+'lockdb' => 'Datowu banku zawrěć',
+'lockdbsuccesssub' => 'Zawrjenje datoweje banki poradźiło',
+'lockdbsuccesstext' => 'Datowa banka bu zawrjena.
+
+Pomyslće sej zawrjenje wotstronić, po tym zo su porjedźenske dźěła dokónÄene.',
+'lockdbtext' => 'Zawrjenje datoweje banki znjezmóžni wÅ¡Ä›m wužiwarjam strony wobdźěłać, jich nastajenja zmÄ›nić, jich wobkedźbowanki wobdźěłać a hinaÅ¡e dźěła Äinić, kotrež sej zmÄ›ny w datowej bance žadaja. ProÅ¡u wobkrućće, zo chceće datowu banku woprawdźe zawrěć a zo chceće zawrjenje zaso zbÄ›hnyć, hdyž budu porjedźenske dźěła skónÄene.',
+'locknoconfirm' => 'Njejsće kašćik potwjerdźenja nakřižował(a).',
+'log' => 'WÅ¡Ä› protokole',
+'logempty' => 'Žane so hodźace zapiski.',
+'login' => 'Přizjewić',
+'loginerror' => 'Zmylk při přizjewjenju',
+'loginlanguagelabel' => 'RÄ›Ä: $1',
+'loginpagetitle' => 'Přizjewjenje',
+'loginproblem' => '<b>Běše problem z přizjewjenjom.</b>
+
+Prošu spytajće hišće raz!',
+'loginprompt' => 'Zo byšće so pola {{GRAMMAR:genitiw|{{SITENAME}}}} přizjewić móhł(a), dyrbja placki (cookies) zmóžnjene być.',
+'loginreqlink' => 'přizjewić',
+'loginreqpagetext' => 'Dyrbiće so $1, zo byšće strony Äitać móhÅ‚(a).',
+'loginreqtitle' => 'Přizjewjene trěbne',
+'loginsuccess' => '<b>Sće nětko jako „$1†we {{GRAMMAR:lokatiw|{{SITENAME}}}} přizjewjeny(a).</b>',
+'loginsuccesstitle' => 'Přizjewjenje wuspěšne',
+'logout' => 'Wotzjewić',
+'logouttext' => '<strong>Sće nětko wotzjewjeny(a).</strong>
+
+Móžeće {{GRAMMAR:akuzatiw|{{SITENAME}}}} anonymnje dale wužiwać abo so ze samsnym abo druhim wužiwarskim mjenom zaso přizjewić. Wobkedźbujće zo so někotre strony dale jewja kaž bysće hišće přizjewjeny doniž pufrowak wašeho browsera njewuprózdnjeće.',
+'logouttitle' => 'Wotzjewjenje wužiwarja',
+'lonelypages' => 'Wosyroćene strony',
+'longpageerror' => '<strong>ZMYLK: Tekst, kotryž sće spytał(a) składować wobsaha $1 kB, maksimalna wulkosć pak je $2 kB. Njeje móžno jón składować.</strong>',
+'longpages' => 'Dołhe nastawki',
+'longpagewarning' => '<strong>KEDŹBU: Strona wobsahuje $1 kB; někotre browsery maja problemy, strony wobdźěłać, kotrež wobsahuja 32 kB abo wjace. Prošu rozwažće, stronu do mjeńšich wotrězkow rozdźělić.</strong>',
+'mailerror' => 'Zmylk při słanju emaila: $1',
+'mailmypassword' => 'Pósćelće mi nowe hesło',
+'mailnologin' => 'Njejsće přizjewjeny(a).',
+'mailnologintext' => 'Dyrbiće [[Special:Userlogin||přizjewjeny(a)]] być a płaćiwu emailowu adresu w swojich [[Special:Preferences|nastajenjach]] měć, zo byšće druhim wužiwarjam email pósłać móhł(a).',
+'mainpage' => 'HÅ‚owna strona',
+'mainpagedocfooter' => 'Prošu hlej [http://meta.wikimedia.org/wiki/Help:Contents dokumentaciju] za informacije wo wobchadźenju z MediaWiki-software.
+
+== Za nowaÄkow ==
+
+* [http://www.mediawiki.org/wiki/Help:Configuration_settings Wo nastajenjach]
+* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]
+* [http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]',
+'mainpagetext' => '<big><b>MediaWiki bu wuspěšnje instalowany.</b></big>',
+'makesysop' => 'Wužiwarja k administratorej Äinić',
+'makesysopfail' => '<b>Wužiwar „$1†njeda so k sysopej Äinić. (Sće mjeno prawje zapisaÅ‚(a)?)</b>',
+'makesysopname' => 'Mjeno wužiwarja:',
+'makesysopok' => '<b>Wužiwar „$1†je nětko administrator.</b>',
+'makesysopsubmit' => 'Wužiwarja k administratorej Äinić',
+'makesysoptext' => 'Tutón formular so wot bÄ›rokratow wužiwa, zo bychu so jednori wužiwarjo do administratorow pÅ™emÄ›nili. Zadodajće wužiwarske mjeno do wotpowÄ›dneho pola a klikńće na tÅ‚oÄatko, zo byšće wužiwarja k administratorej ÄiniÅ‚(a).',
+'makesysoptitle' => 'Wužiwarja k administratorej Äinić',
+'mar' => 'měr',
+'march' => 'měrc',
+'march-gen' => 'měrca',
+'markaspatrolleddiff' => 'Nastawk jako dohladowany woznamjenić',
+'markaspatrolledtext' => 'Tutu změnu nastawka jako dohladowanu woznamjenić',
+'markedaspatrolled' => 'Jako dohladowany woznamjenjeny',
+'markedaspatrollederror'=> 'Njemóžno jako dohladowane woznamjenić',
+'markedaspatrollederrortext'=> 'Dyrbiće wersiju wubrać, kotruž cheće jako dohladowanu woznamjenić.',
+'markedaspatrolledtext' => 'Wubrana wersija bu jako dohladana woznamjenjena.',
+'matchtotals' => 'Wotprašenje „$1†namaka ((PLURAL:$2|jedyn titul|$2 titulow}} a tekst z {{PLURAL:$3|jedneje strony|$3 stron}}.',
+'math' => 'Math',
+'math_bad_output' => 'Njebě móžno do wudawanskeho zapisa pisać abo jón załožić',
+'math_bad_tmpdir' => 'Njebě móžno do zapisa math temp pisać abo jón załožić',
+'math_failure' => 'Analyzowanje njeporadźiło',
+'math_image_error' => 'PNG-konwertowanje njeporadźiÅ‚o; pÅ™epruwujće, haÄ su latex, dvips, gs korektnje instalowane a konwertujće',
+'math_lexing_error' => 'lexing-zmylk',
+'math_notexvc' => 'Wuwjedźomny texvc pobrachuje; prošu hlej math/README za konfiguraciju.',
+'math_sample' => 'Zasuńće jow formulu',
+'math_syntax_error' => 'syntaktiski zmylk',
+'math_tip' => 'Matematiska formula (LaTeX)',
+'math_unknown_error' => 'njeznaty zmylk',
+'math_unknown_function' => 'njeznata funkcija',
+'may' => 'meje',
+'may-gen' => 'meje',
+'may_long' => 'meja',
+'media_sample' => 'Přikład.ogg',
+'media_tip' => 'Wotkaz k mediowej dataji',
+'mediawarning' => '<b>KEDŹBU:</b> Tuta dataja móhła zły kode wobsahować, kotrehož wuwjedźenje móhło Waš system wobškodźić.',
+'mediawikipage' => 'Powěsć pokazać',
+'metadata' => 'Metadaty',
+'metadata-collapse' => 'Rozšěrjene detaile schować',
+'metadata-expand' => 'Rozšěrjene detaile pokazać',
+'metadata-help' => 'W tutej dataji su dalÅ¡e informacije zapÅ™ijate, kotrež pochadźa z digitalneje kamery abo z scannera kiž su so k zaÅ‚oženju dataje trebali. Bu-li dataja porno originalnemu stawej zmÄ›njena, je móžno, zo nÄ›kotre detaile z nÄ›tÄiÅ¡eho stawa wotchila.',
+'metadata_help' => 'metadaty (hlej [[Project:Metadata]] za rozjasnjenje):',
+'mimesearch' => 'Pytaj po družinje MIME',
+'mimetype' => 'Družina MIME:',
+'minlength' => 'Mjena datajow dyrbja znajmjeńša tři pismiki měć.',
+'minoredit' => 'Drobna změna',
+'minoreditletter' => 'D',
+'missingarticle' => 'Datowa banka tekst stronu z mjenom „$1†namakała njeje, byrnjež ju poprawom namakać dyrbjała.
+
+To so zwjetša přez zestarjeny diff abo zestarjeny pokaz stawiznow k stronje, kotraž bu wušmórnjena, zawinuje.
+
+Jeli tomu tak njeje, sće snadź bug w softwarje namakał(a).
+Prošu zdźělće to administratorej podawajo URL.',
+'missingcommenttext' => 'Prošu zapodajće zjeće.',
+'missingimage' => '<b>Pobrachowacy wobraz</b>
+
+<i>$1</i>',
+'missingsummary' => '<b>Kedźbu:</b> Njejsće žane zjeće zapodaÅ‚(a). TłóÄo druhi raz na „SkÅ‚adować†so WaÅ¡e zmÄ›ny bjez komentara skÅ‚aduja.',
+'mon' => 'Pón',
+'monday' => 'Póndźela',
+'moredotdotdot' => 'Wjace...',
+'mostcategories' => 'Z najwjace kategorijemi zwjazane strony',
+'mostimages' => 'Z najwjace stronami zwjazane dataje',
+'mostlinked' => 'Z najwjace stronami zwjazane strony',
+'mostlinkedcategories' => 'Z najwjace stronami zwjazane kategorije',
+'mostrevisions' => 'Nastawki z najwjace wersijemi',
+'move' => 'Přesunyć',
+'movearticle' => 'Stronu přesunyć',
+'movedto' => 'přesunjena pod nadpis',
+'movelogpage' => 'Protokol přesunjenjow',
+'movelogpagetext' => 'Deleka je lisćina wšěch přesunjenych stronow.',
+'movenologin' => 'Njejsće přizjewjeny(a)',
+'movenologintext' => 'Dyrbiće zregistrowany wužiwar a [[Special:Userlogin|přizjewjeny(a)]] być, zo byšće stronu přesunyć móhł(a).',
+'movepage' => 'Stronu přesunyć',
+'movepagebtn' => 'Stronu přesunyć',
+'movepagetalktext' => 'Přizamknjena diskusijna strona, jelizo eksistuje, přesunje so awtomatisce hromadźe z njej, <b>chibazo:</b>
+*Njeprózdna diskusijna strona pod nowym mjenom hižo eksistuje abo
+*wotstronjeće hóÄku z kašćika deleka.
+
+W tutych padach dyrbiće stronu, jeli požadane, manuelnje přesunyć abo zaměšeć.',
+'movepagetext' => 'Wužiwanje formulara deleka budźe stronu přemjenować, suwajo jeje cyłe stawizny pod nowe mjeno. Stary titul budźe daleposrědkowanje k nowemu titulej. Wotkazy k titulej stareje strony njebudu so měnjeć; njezabudźće, zo byšće za dwójnymi abo poškodźenymi daleposrědkowanjemi přepruwował(a). Sće zamołwity(a) zawěsćić, zo wotkazy na stronu pokazuja, na kotruž dyrbja dowjesć.
+
+Wobkedźbujće, zo strona so <b>nje</b> pÅ™esunje, jeli je hižo strona pod nowym titulom, chibazo wona je prózdna abo dalesposrÄ›dkowanje a nima zaÅ¡Å‚e stawizny. To woznamjenja, zo móžeće stronu tam wróćo pÅ™emjenować, hdźež bu runje pÅ™emjenowana, jelizo Äiniće zmylk a njemóžeće wobstejacu stronu wuÅ¡mórnyć.
+
+<b>KEDŹBU!</b> Móže to drastiske a njewoÄakowana zmÄ›na za woblubowanu stronu być; proÅ¡u sće sej wÄ›sty(a), zo sćěwki z toho rozumiće, prjedy haÄ pokroÄujeće.',
+'movereason' => 'PÅ™iÄina',
+'movetalk' => 'Diskusijnu stronu tohorunja přesunyć',
+'movethispage' => 'Stronu přesunyć',
+'mw_math_html' => 'HTML jeli móžno, hewak PNG',
+'mw_math_mathml' => 'MathML jeli móžno (eksperimentalnje)',
+'mw_math_modern' => 'Za moderne browsery doporuÄene',
+'mw_math_png' => 'Přeco jako PNG zwobraznić',
+'mw_math_simple' => 'HTML jeli jara jednory, hewak PNG',
+'mw_math_source' => 'Jako TeX wostajić (za tekstowe browsery)',
+'mycontris' => 'Moje přinoški',
+'mypage' => 'Moja strona',
+'mypreferences' => 'moje nastajenja',
+'mytalk' => 'Moja diskusija',
+'namespace' => 'Mjenowy rum:',
+'namespacesall' => 'wšě',
+'navigation' => 'Nawigacija',
+'nbytes' => '$1 {{PLURAL:$1|bajt|bajtow}}',
+'ncategories' => '$1 {{PLURAL:$1|1 kategorija|kategoriji|kategorije|kategorijow}}',
+'newarticle' => '(Nowy nastawk)',
+'newarticletext' => 'Sće wotkazej k stronje slÄ›dowaÅ‚, kotraž hišće njeeksistuje. Zo byšće stronu zaÅ‚ožiÅ‚(a), wupjelńće tekstowe polo deleka (hlej [[Project:Help|stronu pomocy]] za wjace informacijow). Sće-li zmylnje tu, klikńće na tłóÄku <b>Wróćo</b> swojeho browsera.',
+'newbies' => 'NowaÄcy',
+'newimages' => 'Nowe dataje',
+'newmessagesdifflink' => 'rozdźěl k předposlednjej wersiji',
+'newmessageslink' => 'nowe powěsće',
+'newpage' => 'Nowa strona',
+'newpageletter' => 'N',
+'newpages' => 'Nowe nastawki',
+'newpassword' => 'Nowe hesło:',
+'newtitle' => 'Pod nowy titul',
+'newwindow' => '(woÄinja so w nowym woknjeÅ¡ku)',
+'next' => 'přich',
+'nextdiff' => 'Přichodna wersija →',
+'nextn' => 'přichodne $1',
+'nextpage' => 'Přichodna strona ($1)',
+'nextrevision' => 'Nowša wersija→',
+'nlinks' => '$1 {{PLURAL:$1|wotkaz|wotkazej|wotkazy|wotkazow}}',
+'nmembers' => '{{PLURAL:$1|jedyn ÄÅ‚on|$1 ÄÅ‚onow}}',
+'noarticletext' => 'Tuchwilu tuta strona žadyn tekst njewobsahuje, móžeće jeje titul w druhich stronach [[Special:Search/{{PAGENAME}}|pytać]] abo [{{fullurl:{{FULLPAGENAME}}|action=edit}} stronu załožić].',
+'noconnect' => 'Wodajće! Wiki ma techniske problemy a njemóže ze serwerom datoweje banki zwjazać.
+
+$1',
+'nocontribs' => 'Žane změny, kotrež podatym kriterijam wotpowěduja.',
+'nocookieslogin' => '{{SITENAME}} wužiwa placki (cookies), zo bychu so wužiwarjo přizjewili. Sće placki znjemóžnił(a). Prošu zmóžńće je a spytajće hišće raz.',
+'nocookiesnew' => 'Wužiwarske konto bu załožene, ale njejsće přizjewjeny(a). {{SITENAME}} wužiwa placki (cookies), zo bychu so wužiwarjo přizjewili. Sće placki znjemóžnił(a). Prošu zmóžńće je, potom přizjewće so ze swojim nowym wužiwarskim mjenom a hesłom.',
+'nocreatetext' => 'Móžnosć załoženja nowych stron je w tutym wiki wobmjezowana. Móžeće wobstejace strony wobdźěłać abo [[Special:Userlogin|so přizjewić abo nowe konto załožić]].',
+'nocreatetitle' => 'Załoženje stron je wobmjezowane',
+'nocreativecommons' => 'Creative Commons RDF metadaty su za tutón serwer znjemóžnjene.',
+'nocredits' => 'Žane informacije wo dźakprajenju za tutu stronu njejsu.',
+'nodb' => 'Datowa banka $1 njeda so wubrać',
+'nodublincore' => 'Dublin Core RDF metadaty su za tutón serwer znjemóžnjene.',
+'noemail' => 'Za wužiwarja „$1†žana emailowa adresa podata njeje.',
+'noemailprefs' => '<strong>Njejsće emailowu adres podał(a). Naslědne funkcije fungować njebudu.</strong>',
+'noemailtext' => 'Tutón wužiwar njeje płaćiwu emailowu adresu podał abo je wubrał, zo nochce email wot druhich wužiwarjow dóstać.',
+'noemailtitle' => 'Žana emailowa adresa podata',
+'noexactmatch' => '<b>Nastawk „$1†njeeksistuje. Móžeće [[:$1|jón załožić]].</b>',
+'nohistory' => 'Njeje žanych staršich wersijow za tutu stronu.',
+'noimage' => 'Žana dataja z tutym mjenom njeeksistuje. Móžeće $1.',
+'noimage-linktext' => 'ju nahrać',
+'noimages' => 'Žane dataje.',
+'nolicense' => 'žadyn wuběr',
+'nolinkshere' => 'Žane strony sem njepokazuja.',
+'nolinkstoimage' => 'Žane strony, kotrež na tutu dataju pokazuja.',
+'nologin' => 'Nimaće žane konto? $1.',
+'nologinlink' => 'Wužiwarske konto załožić',
+'noname' => 'Njejsće płaćiwe wužiwarske mjeno podał(a).',
+'nonefound' => '<b>Kedźbu:</b> Pytanja bjez wuspÄ›cha so Äasto z pytanjom za wÅ¡Ä›dnymi sÅ‚owami kaž „měć†a „z†zawinuja, kotrež so njeindicÄ›ruja abo pÅ™ez podaće wjace haÄ jednoho pytanskeho wuraza (jenož strony, kotrež wÅ¡Ä› pytanske wurazy wobsahuja, so w lisćinje wuslÄ›dkow zjewja).',
+'nonunicodebrowser' => '<strong>KEDŹBU: Waš browser z Unikodu kompatibelny njeje. Prošu wužiwajće druhi browser.</strong>',
+'nospecialpagetext' => 'Sće sej njepłaćiwu specialnu stronu požadał(a), lisćina płaćiwych stronow hodźi so pod [[Special:Specialpages]] namakać.',
+'nosuchaction' => 'Žana tajka akcija',
+'nosuchactiontext' => 'Akcija podata přez URL so přez wiki njepřipóznawa.',
+'nosuchspecialpage' => 'Tuta specialna strona njeeksistuje',
+'nosuchuser' => 'Wužiwarja z mjenom „$1†njeje. Přepruwujće pisanje abo załožiće nowe wužiwarske konto.',
+'nosuchusershort' => 'Wužiwarja z mjenom „$1†njeje. Přepruwujće swoje pisanje.',
+'notacceptable' => 'Wiki-serwer njemóže daty we formaće, kotryž waÅ¡ klient móže Äitać, dodać.',
+'notanarticle' => 'Njeje strona z wobsahom',
+'notargettext' => 'Njejsće cilowu stronu abo wužiwarja podał(a), zo byšće tutu funkciju zmóžnił.',
+'notargettitle' => 'Žadyn cil',
+'note' => '<strong>Kedźbu:</strong>',
+'notextmatches' => 'Žana přezjednota z tekstami stron',
+'notitlematches' => 'Žana přezjednota z titulemi stron',
+'notloggedin' => 'Njepřizjewjeny(a)',
+'nouserspecified' => 'Dyrbiće wužiwarske mjeno zapodać',
+'nov' => 'now',
+'november' => 'nowember',
+'november-gen' => 'nowembra',
+'nowatchlist' => 'Nimaće žane strony w swojich wobkedźbowankach.',
+'nowiki_sample' => 'Zasuńće tu njeformatowany tekst',
+'nowiki_tip' => 'Wiki-formatowanje ignorować',
+'nrevisions' => '$1 {{PLURAL:$1|wobdźěłanje|wobdźěłani|wobdźěłanja|wobdźěłanjow}}',
+'nstab-category' => 'Kategorija',
+'nstab-help' => 'Pomoc',
+'nstab-image' => 'Dataja',
+'nstab-main' => 'Nastawk',
+'nstab-media' => 'Medije',
+'nstab-mediawiki' => 'Powěsć',
+'nstab-project' => 'Projektowa strona',
+'nstab-special' => 'Specialnje',
+'nstab-template' => 'Předłoha',
+'nstab-user' => 'Wužiwarska strona',
+'numauthors' => 'LiÄba rozdźělnych awtorow (nastawk): $1',
+'number_of_watching_users_pageview'=> '[$1 wobkedźbowacych wužiwarjow]',
+'numedits' => 'LiÄba zmÄ›now (nastawk): $1',
+'numtalkauthors' => 'LiÄba rozdźělnych awtorow (diskusijna strona): $1',
+'numtalkedits' => 'LiÄba zmÄ›now (diskusijna strona): $1',
+'numwatchers' => 'LiÄba wobkedźbowarjow: $1',
+'nviews' => '$1 {{PLURAL:$1|wotprašenje|$1 wotprašowanjow}}',
+'oct' => 'okt',
+'october' => 'oktober',
+'october-gen' => 'oktobra',
+'ok' => 'W porjadku',
+'revision-info' => 'Wersija wot $1; $2',
+'oldpassword' => 'Stare hesło:',
+'orig' => 'prěnja',
+'othercontribs' => 'Na zakładźe dźěła wužiwarja $1.',
+'otherlanguages' => 'W druhich rÄ›Äach',
+'others' => 'druhich',
+'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorije}}',
+'pagemovedsub' => 'Přesunjenje poradźiło',
+'pagemovedtext' => 'Strona „[[$1]]†bu pod titul „[[$2]]†přesunjena.',
+'pagetitle' => '$1 - {{SITENAME}}',
+'passwordremindertext' => 'Něchtó (najskerje Wy, z IP-Adresu $1) je wo nowe hesło za přizjewjenje pola {{GRAMMAR:genitiw|{{SITENAME}}}} prosył. Hesło za wužiwarja "$2" je nětko "$3".
+Wy měł(a) so nětko přizjewić a swoje hesło změnić.
+
+Je-li nÄ›chto druhi haÄ Wy wo nowe hesÅ‚o prosyÅ‚, abo sće so zaso na njo dopomniÅ‚(a),
+móžeće tutu powÄ›sć ignorować a ze starym hesÅ‚om pokroÄować.',
+'passwordremindertitle' => 'Skedźbnjenje na hesło z {{GRAMMAR:genitiw|{{SITENAME}}}}',
+'passwordsent' => 'Nowe hesło bu k emailowej adresy wužiwarja „$1†pósłane. Prošu přizjewće so, tak chětře kaž je dóstanjeće.',
+'passwordtooshort' => 'Waše hesło je překrótke. Dyrbi znajmjeńša $1 znamješkow měć.',
+'perfcached' => 'Naslědne daty pochadźeja z pufrowaka a njejsu snadź hižo aktualne.',
+'perfcachedts' => 'Naslědne daty pochadźeja z pufrowaka a buchu $1 posledni raz zaktualizowane.',
+'perfdisabled' => 'Wodajće! Tuta funkcija bu nachwilnje znjemóžnjena, dokelž datowu banku tak spomaluje, zo hižo nichtó wiki wužiwać njemóže.',
+'perfdisabledsub' => 'Tu je składowana kopija z $1:',
+'permalink' => 'Permanentny link',
+'personaltools' => 'Wosobinske graty',
+'popularpages' => 'ÄŒasto wopytowane strony',
+'portal' => 'Portal {{GRAMMAR:genitiw|{{SITENAME}}}}',
+'portal-url' => 'Project:Portal',
+'postcomment' => 'Komentar dodawać',
+'powersearch' => 'Pytać',
+'powersearchtext' => 'W mjenowych rumach pytać:<br />$1<br />$2 DaleposrÄ›dkowanja naliÄeć<br />Za $3 $9 pytać',
+'preferences' => 'Nastajenja',
+'prefixindex' => 'WÅ¡Ä› nastawki (z prefiksom)',
+'prefs-help-email' => '* Email (opcionalnje): Zmóžnja druhim was přez wašu wužiwarsku abo diskusijnu stronu kontaktować, bjeztoho zo dyrbiće swoju identitu wotkryć. Sće-li swoje hesło zabył(a), budźe móžno, Wam nowe hesło připósłać.',
+'prefs-help-email-enotif'=> 'Tuta adresa so wužiwa, zo bychu so wam emailowe zdźělenki słali, jelizo sće tute opcije zmóžnił(a).',
+'prefs-help-realname' => '* Woprawdźite mjeno (opcionalnje): jelizo chceće je wotkryć, budźe so wužiwać, zo by so prawo za waše dźěło dało.',
+'prefs-misc' => 'WÅ¡elake nastajenja',
+'prefs-personal' => 'Wužiwarske daty',
+'prefs-rc' => 'Aktualne změny',
+'prefs-watchlist' => 'Wobkedźbowanki',
+'prefs-watchlist-days' => 'LiÄba dnjow, kotrež maja so we wobkedźbowankach pokazać:',
+'prefs-watchlist-edits' => 'LiÄba zmÄ›now, kotrež maja so we wobkedźbowankach pokazać:',
+'prefsnologin' => 'Njepřizjewjeny(a)',
+'prefsnologintext' => 'Dyrbiće [[Special:Userlogin|přizjewjeny(a)]] być, zo bychu so wužiwarske nastajenja stajili.',
+'prefsreset' => 'Nastajenja su ze składa wróćo stajili.',
+'preview' => 'Přehlad',
+'previewconflict' => 'Tutón přehlad tekst w hornim tekstowym polu wotbłyšćuje kaž so zjewi, jelizo jón składujeće.',
+'previewnote' => '<strong>Kedźbu, to je jenož přehlad, změny hišće składowane njejsu!</strong>',
+'previousdiff' => '↠Předchadna wersija',
+'previousrevision' => 'â†StarÅ¡a wersija',
+'prevn' => 'předchadne $1',
+'print' => 'Ćišćeć',
+'printableversion' => 'Ćišćomna wersija',
+'privacy' => 'Å kit datow',
+'privacypage' => 'Project:Å kit datow',
+'projectpage' => 'Projektowu stronu pokazać',
+'protect' => 'Škitać',
+'protect-default' => '(standard)',
+'protect-level-autoconfirmed'=> 'jenož přizjewjeni wužiwarjo',
+'protect-level-sysop' => 'jenož administratorojo',
+'protect-text' => 'Tu móžeće status za škit strony <b>$1</b> widźeć a změnić. Prošu mějće so po prawidłami za škitane strony!',
+'protect-unchain' => 'Jenož škit před přesuwanjom změnić',
+'protect-viewtext' => 'Nimaće trěbne prawa za změnjenje škitoweho statusa. Tu je aktualny škitowy status za stronu <strong>$1</strong>:',
+'protectcomment' => 'PÅ™iÄina za Å¡kitanje:',
+'protectedarticle' => 'Strona „[[$1]]†bu škitana',
+'protectedinterface' => 'Tuta strona wobsahuje tekst za rÄ›Äny zwjerch a je Å¡kitana zo by so znjewužiwanju zadźěwaÅ‚o.',
+'protectedpage' => 'Å kitana strona',
+'protectedpagewarning' => '<strong>KEDŹBU: Strona bu Å¡kitana, zo bychu ju jenož wužiwarjo z prawami sysopa wobdźěłać móhli. PÅ™eswÄ›dÄće so, zo maće so po smÄ›rnicami za Å¡kitane strony.</strong>',
+'protectedtext' => 'Tuta strona je za wobdźěłowanje zawrjena.
+
+Móžeće pak žórłowy tekst strony wobhladać a kopěrować:',
+'protectlogpage' => 'Protokol Å¡kita',
+'protectlogtext' => 'To je lisćina škitanych stronow.',
+'protectmoveonly' => 'Jenož před přesuwanjom škitać',
+'protectsub' => '(Stronu „$1†škitać)',
+'protectthispage' => 'Stronu škitać',
+'proxyblocker' => 'Awtomatiske blokowanje wotewrjenych proxy-serwerow',
+'proxyblockreason' => 'Waša IP-adresa bu zablokowana, dokelž je wona wotewrjeny proksy. Prošu skontaktujće swojeho providera abo syćoweho administratora a informujće jeho wo tutym chutnym problemom wěstosće.',
+'proxyblocksuccess' => 'Hotowo.',
+'qbbrowse' => 'Přepytować',
+'qbedit' => 'Wobdźěłać',
+'qbfind' => 'Namakać',
+'qbmyoptions' => 'Moje strony',
+'qbpageinfo' => 'Kontekst',
+'qbpageoptions' => 'Tuta strona',
+'qbsettings' => 'Gratowa wobkroma',
+'qbspecialpages' => 'Specialne strony',
+'randompage' => 'Připadny nastawk',
+'randomredirect' => 'Připadne daleposrědkowanje',
+'range_block_disabled' => 'Dowolenje sysopa, cyłe wobkruhi IP-adresow blokować, je znjemóžnjene.',
+'rc_categories' => 'Jenož kategorije (dźělene z "|")',
+'rc_categories_any' => 'wšě',
+'rclinks' => 'Poslednje $1 změnow poslednych $2 dnjow pokazać<br />$3',
+'rclistfrom' => 'Nowe zmÄ›ny pokazać, zapoÄinajo z $1',
+'rclsub' => '(k stronam, na kotrež strona „$1†pokazuje)',
+'rcnote' => 'Deleka su poslednje <strong>$1</strong> změny poslednich <strong>$2</strong> dnjow, staw wot $3.',
+'rcnotefrom' => 'Deleka so zmÄ›ny wot <b>$2</b> pokazuja (haÄ k <b>$1</b>).',
+'rcpatroldisabled' => 'Dohladowanje najaktualnišich změnow znjemóžnjene',
+'rcpatroldisabledtext' => 'Funkcija dohladowanja najaktualnišich změnow je tuchwilu znjemóžnjena.',
+'rcshowhideanons' => 'Změny anonymnych wužiwarjow $1',
+'rcshowhidebots' => 'Změny awtomatiskich programow (bots) $1',
+'rcshowhideliu' => 'Změny přizjewjenych wužiwarjow $1',
+'rcshowhidemine' => 'Swójske přinoški $1',
+'rcshowhideminor' => 'Drobne změny $1',
+'rcshowhidepatr' => 'Dohladowane změny $1',
+'readonly' => 'Datowa banka je zawrjena',
+'readonly_lag' => 'Datowa banka bu awtomatisce zawrjena, mjeztym zo pospytuja wotwisne serwery datowych bankow hłowny serwer docpěć',
+'readonlytext' => 'Datowa banka je tuchwilu za nowe zapiski a změnjenja zawrjena, najskerje za hladanske dźěła. Po tym wšo budźe zaso normalne.
+
+Administrator, kiž je ju zawrjeł, je tute rozjasnjenje dał: $1',
+'readonlywarning' => '<strong>KEDŹBU: Datowa banka bu hižo za hladanje zawrjena, tohodla njemóžeće swoje wobdźěłowanja nětko składować. Móžeće tekst do tekstoweje dataje přesunyć a jón za pozdźišo składować.</strong>',
+'recentchanges' => 'Aktualne změny',
+'recentchangesall' => 'wšě',
+'recentchangescount' => 'LiÄba titulow w aktualnych zmÄ›nach:',
+'recentchangeslinked' => 'Změny zwjazanych stron',
+'recentchangestext' => 'Na tutej stronje móžeće najaktualniše změny w {{GRAMMAR:lokatiw|{{SITENAME}}}} wobkedźbować.',
+'recreate' => 'Wobnowić',
+'redirectedfrom' => '(Ze strony „$1†sposrědkowane)',
+'redirectingto' => 'Posrědkuju k stronje [[$1]]',
+'redirectpagesub' => 'Daleposrědkowanje',
+'remembermypassword' => 'Sej za dalše posedźenja spomjatkować',
+'removechecked' => 'Markěrowane strony z wobkedźbowankow wotstronić',
+'removedwatch' => 'Strona bu z wobkedźbowankow wotstronjena',
+'removedwatchtext' => 'Strona „[[:$1]]†bu z wobkedźbowankow wotstronjena.',
+'removingchecked' => 'Strony so z wobkedźbowankow wotstronjeja...',
+'resetprefs' => 'Wróćo stajić',
+'restorelink' => '{{PLURAL:$1|jednoho wušmórnjeneho wobdźěłanja|$1 wušmórnjenych wobdźěłanjow}}',
+'restrictedpheading' => 'Specialne strony za administratorow',
+'restriction-edit' => 'wobdźěłać',
+'restriction-move' => 'přesunyć',
+'resultsperpage' => 'Wuslědki po stronje:',
+'retrievedfrom' => 'Z {{GRAMMAR:genitiw|"$1"}}',
+'returnto' => 'Wróćo k stronje $1.',
+'retypenew' => 'Nowe hesło znowa zapodać:',
+'reupload' => 'Znowa nahrawać',
+'reuploaddesc' => 'Wróćo k nahrawanskemu formularej.',
+'rev-deleted-comment' => '(komentar wotstronjeny)',
+'rev-deleted-text-permission'=> '<div class="mw-warning plainlinks">Tuta wersija bu wuÅ¡mórnjena a njeda so wjace Äitać. PÅ™ićinu móžeće w [{{fullurl:Special:Log/delete|page={{PAGENAMEE}}}} protokolu wuÅ¡mórnjenjow] zhonić.</div>',
+'rev-deleted-text-view' => '<div class="mw-warning plainlinks">Tuta wersija bu wuÅ¡mórnjena a njeda so wjace Äitać. Jako administrator móžeće ju pak dale Äitać. PÅ™ićinu móžeće w [{{fullurl:Special:Log/delete|page={{PAGENAMEE}}}} protokolu wuÅ¡mórnjenjow] zhonić.</div>',
+'rev-deleted-user' => '(wužiwarske mjeno wotstronjene)',
+'rev-delundel' => 'pokazać/schować',
+'revdelete-hide-comment'=> 'Zjeće schować',
+'revdelete-hide-restricted'=> 'Tute wobmjezowanja na administratorow kaž tež na druhich wužiwarjow nałožować',
+'revdelete-hide-text' => 'Tekst tuteje wersije schować',
+'revdelete-hide-user' => 'Wužiwarske mjeno/IP-adresu schować',
+'revdelete-legend' => 'Wobmjezowanja za wersije zrjadować:',
+'revdelete-log' => 'Komentar w protokolu:',
+'revdelete-logentry' => 'Widźomnosć wersije změnjena za [[$1]]',
+'revdelete-selected' => 'Wubrana wersija strony [[:$1]]:',
+'revdelete-submit' => 'Na wubranu wersiju nałožować',
+'revdelete-text' => 'WuÅ¡mórnjene wersije so w stawiznach dale jewja, jich wobsah pak za wužiwarjow Äitajomne njeje.
+
+Druzy administratorojo w tutym wiki móža schowany tekst dale Äitać a jón wobnowić, chibazo su tež jich prawa wobmjezowane.',
+'reverted' => 'Na staršu wersiju cofnjene',
+'revertimg' => 'Cofnyć',
+'revertmove' => 'wróćo přesunyć',
+'revertpage' => 'Změny wužiwarja [[User:$2|$2]] ([[Special:Contributions/$2|přinoški]]) cofnjene, nawróćene k poslednjej wersiji wužiwarja [[User:$1|$1]]',
+'revhistory' => 'Stawizny',
+'revisionasof' => 'Wersija z $1',
+'revisiondelete' => 'Wersije wušmórnyć/wobnowić',
+'revnotfound' => 'Njebě móžno, požadanu wersiju namakać',
+'revnotfoundtext' => 'Stara wersija strony, kotruž sće požadał(a), njeda so namakać. Prošu přepruwujće URL, kiž sće wužiwał(a).',
+'rights' => 'Prawa:',
+'rightslog' => 'Protokol zrjadowanja wužiwarskich prawow',
+'rightslogentry' => 'Skupinowe ÄÅ‚onstwo za $1 z $2 na $3 zmÄ›njene',
+'rightslogtext' => 'To je protokol změnow wužiwarskich prawow.',
+'rightsnone' => '(niÄo)',
+'rollback' => 'Změny cofnyć',
+'rollback_short' => 'Cofnyć',
+'rollbackfailed' => 'Cofnjenje njeporadźiło',
+'rollbacklink' => 'Cofnyć',
+'rows' => 'Rjadki:',
+'sat' => 'Sob',
+'saturday' => 'Sobota',
+'savearticle' => 'Składować',
+'savedprefs' => 'Waše nastajenja buchu składowane.',
+'savefile' => 'Dataju składować',
+'saveprefs' => 'Składować',
+'saveusergroups' => 'Wužiwarske skupiny składować',
+'scarytranscludedisabled'=> '[Zapřijeće interwiki je znjemóžnjene]',
+'scarytranscludefailed' => '[Zapřijeće předłohi za stronu $1 njebě mózno]',
+'scarytranscludetoolong'=> '[Nažel běše URL předołhi]',
+'search' => 'Pytać',
+'searcharticle' => 'Nastawk',
+'searchbutton' => 'Pytać',
+'searchcontaining' => 'Za nastawkami pytać, w kotrychž so <i>$1</i> jewi.',
+'searchdisabled' => 'Pytanje w {{GRAMMAR:lokatiw|{{SITENAME}}}} je znjemóžnjene. Móžeće mjeztym z Google pytać. Wobkedźbujće, zo móža wuslědki z wobsaha {{GRAMMAR:genitiw|{{SITENAME}}}} zestarjene być.',
+'searchfulltext' => 'Dospołny tekst pytać',
+'searchnamed' => 'Za nastawkami pytać, w kotrychž titulach so <i>$1</i> jewi.',
+'searchresults' => 'Pytanske wuslědki',
+'searchresultshead' => 'Pytać',
+'searchresulttext' => 'Za wjace informacijow wo přepytowanju {{GRAMMAR:genitiw|{{SITENAME}}}}, hlej [[Project:Searching|Pytanje w {{GRAMMAR:lokatiw|{{SITENAME}}}}]].',
+'searchsubtitle' => 'Sće naprašowanje za „[[:$1]]“ stajił(a).',
+'searchsubtitleinvalid' => 'Sće naprašowanje za „$1“ stajił(a).',
+'selectnewerversionfordiff'=> 'Nowšu wersiju za přirunanje wubrać',
+'selectolderversionfordiff'=> 'Staršu wersiju za přirunanje wubrać',
+'selfmove' => 'Žórłowy a cilowy titul stej samsnej; strona njehodźi so na sebje samu přesunyć.',
+'semiprotectedpagewarning'=> '<b>Kedźbu:</b> Strona bu škitana, zo bychu ju jenož přizjewjeni wužiwarjo wobdžełać móhli.',
+'sep' => 'sep',
+'september' => 'september',
+'september-gen' => 'septembra',
+'servertime' => 'ÄŒas serwera',
+'session_fail_preview' => '<strong>Zda so, zo je problem z Wašim přizjewjenjom; tuta akcija bu wěstosće dla přećiwo zadobywanju do posedźenja znjemóžnjena. Prošu spytajće hišće raz. Wostanje-li tutón problem, spytajće so wotzjewić a so zaso přizjewić.</strong>',
+'session_fail_preview_html'=> '<strong>Bohužel njemóžemy waše změny składować dokelž su Waše přizjewjenske daty zhubjene.</strong>
+
+<i>Dokelž w tutym wiki je raw HTML zmóžnjene, je přehlad schowany jako wěstotna naprawa přećiwo JavaScript-nadběham.</i>
+
+<strong>Je-li to legitimny pospyt změnjenja, spytajće hišće raz. Wostanje-li tutón problem, spytajće so wotzjewić a so zaso přizjewić.</strong>',
+'sessionfailure' => 'Zda so, zo je problem z WaÅ¡im pÅ™izjewjenjom; tuta akcija bu wÄ›stosće dla pÅ™ećiwo zadobywanju do posedźenja znjemóžniÅ‚a. ProÅ¡u klikńće na "Wróćo" a zaÄitajće stronu, z kotrejež pÅ™iÅ„dźeće, znowa; potom spytajće hišće raz.',
+'set_rights_fail' => '<b>Prawa za wužiwarja „$1†njedadźa so nastajić. (Sće mjeno prawje zapisał(a)?)</b>',
+'set_user_rights' => 'Wužiwarske prawa zrjadować',
+'setbureaucratflag' => 'Wužiwarja k bÄ›rokratej Äinić',
+'sharedupload' => 'Tuta dataja je zhromadne nahraće a móhła so přez druhe projekty wužiwać.',
+'shareduploadwiki' => 'Za dalše informacije hlej $1.',
+'shareduploadwiki-linktext'=> 'stronu datajoweho wopisanja',
+'shortpages' => 'Krótke nastawki',
+'show' => 'pokazać',
+'showbigimage' => 'Wersiju z wysokim rozpušćenjom sćahnyć ($1x$2, $3 KB)',
+'showdiff' => 'Změny pokazać',
+'showhidebots' => '($1 bots)',
+'showingresults' => 'HaÄ do <b>$1</b> wuslÄ›dkow so deleka pokazuje, zapoÄinajo z #<b>$2</b>.',
+'showingresultsnum' => '<b>$3</b> wuslÄ›dkow so deleka pokazuje, zapoÄinajo z #<b>$2</b>.',
+'showlast' => 'Poslednje $1 datajow sortěrowanych po $2 pokazać.',
+'showlivepreview' => 'Live-přehlad',
+'showpreview' => 'Přehlad pokazać',
+'showtoc' => 'pokazać',
+'sig_tip' => 'WaÅ¡a signatura z Äasowym koÅ‚kom',
+'sitestats' => 'Statistika {{GRAMMAR:genitiw|{{SITENAME}}}}',
+'sitestatstext' => 'Je dohromady <b>$1</b> stron w datowej bance. To zapřija tež diskusijne strony, strony wo {{GRAMMAR:lokatiw|{{SITENAME}}}}, krótke nastawki, daleposrědkowanja a druhe, kotrež najskerje nastawki njejsu.
+
+Zwostanje <b>$2</b> stronow, kotrež najskerje su legitimne strony z wobsahom.
+
+Dohromady bu <b>$8</b> datajow nahratych.
+
+Běše tam dohromady <b>$3</b> wobhladanjow stron a <b>$4</b> změnow stron, wot toho, zo bu wiki připrawjeny. Běše přerěznje <b>$5</b> změnow na stronu a <b>$6</b> wobhladanjow na změnu.
+
+DoÅ‚hosć [http://meta.wikimedia.org/wiki/Help:Job_queue „Job queueâ€]je <b>$7</b>.',
+'sitesupport' => 'Projekt podpěrować',
+'sitesupport-url' => 'Project:Darić',
+'siteuser' => 'wužiwar {{GRAMMAR:genitiw|{{SITENAME}}}} $1',
+'siteusers' => 'wužiwar(jo) {{GRAMMAR:genitiw|{{SITENAME}}}} $1',
+'skin' => 'Skin',
+'skinpreview' => '(Přehlad)',
+'sorbs' => 'SORBS DNSbl',
+'sorbs_create_account_reason'=> 'Waša IP-adresa je zapisana jako wotewrjeny proksy na [http://www.sorbs.net SORBS] DNSBL. Njemóžeće konto załožić.',
+'sorbsreason' => 'Waša IP-adresa je zapisana jako wotewrjeny proksy na [http://www.sorbs.net SORBS] DNSBL.',
+'sourcefilename' => 'Mjeno žórłoweje dataje',
+'sp-contributions-newbies-sub'=> 'Za nowaÄkow',
+'sp-contributions-newer'=> 'Nowše $1',
+'sp-contributions-newest'=> 'Najnowše',
+'sp-contributions-older'=> 'Starše $1',
+'sp-contributions-oldest'=> 'Najstarše',
+'sp-newimages-showfrom' => 'Nowe dataja pokazać, zapoÄinajo z $1',
+'spam_blanking' => 'WÅ¡Ä› wersije wobsahowachu wotkazy na $1, wuÄisćene.',
+'spam_reverting' => 'Wobnowjejo poslednju wersiju bjez wotkazow na $1',
+'spambot_username' => 'MediaWiki Äisćenje wot spama',
+'spamprotectionmatch' => 'Naslědny tekst je naš spamowy filter zahibał: $1',
+'spamprotectiontext' => 'Strona, kotruž sće spytał(a) składować, bu přez spamowy filter blokowana. Bu to najskerje přez wotkaz k eksternemu sydłu zawinowane.',
+'spamprotectiontitle' => 'Filter za škit přećiwo spamej',
+'speciallogtitlelabel' => 'Titul:',
+'specialloguserlabel' => 'Wužiwar:',
+'specialpage' => 'Specialna strona',
+'specialpages' => 'Specialne strony',
+'spheading' => 'Specialne strony za wšěch wužiwarjow',
+'sqlhidden' => '(SQL wotprašenje schowane)',
+'statistics' => 'Statistika',
+'storedversion' => 'Składowana wersija',
+'stubthreshold' => 'Próh za pjenk:',
+'subcategories' => 'Podkategorije',
+'subcategorycount' => 'W tutej kategoriji {{PLURAL:$1|je jedna podkategorija|stej $1 podkategoriji|su rest podkategorije}}',
+'subject' => 'Tema/Nadpismo',
+'successfulupload' => 'Dataja bu wuspěšnje nahrata',
+'summary' => 'Zjeće',
+'sun' => 'Njedź',
+'sunday' => 'Njedźela',
+'tagline' => 'Z {{GRAMMAR:genitiw|{{SITENAME}}}}',
+'talk' => 'Diskusija',
+'talkexists' => 'Strona sama bu z wuspěchom přesunjena, ale diskusijna strona njeda so přesunyć, dokelž pod nowym titulom hižo eksistuje. Prošu změšće jeju manuelnje.',
+'talkpage' => 'Diskusija',
+'talkpagemoved' => 'Wotpowědna diskusijna strona bu tohorunja přesunjena.',
+'talkpagenotmoved' => 'Wotpowědna diskusijna strona <strong>njebu</strong> přesunjena.',
+'templatepage' => 'Předłohu pokazać',
+'templatesused' => 'Na tutej stronje wužiwane předłohi:',
+'textboxsize' => 'Wobdźěłowanje',
+'textmatches' => 'Přezjednota z tekstami stron',
+'thisisdeleted' => '$1 pokazać abo wobnowić?',
+'thu' => 'Å tw',
+'thumbnail-more' => 'powjetšić',
+'thumbnail_error' => 'Zmylk při wudźěłanju předhladoweho wobraza: $1',
+'thumbsize' => 'Wulkosć přehlada wobrazow:',
+'thursday' => 'Štwórtk',
+'timezonelegend' => 'ÄŒasowe pasmo',
+'timezoneoffset' => 'Wurunanje¹',
+'timezonetext' => 'Zapisajće liÄbu hodźin, wo kotrež WaÅ¡ lokalny Äas so wot Äasa serwera (UTC) wotchila.',
+'titlematches' => 'Přezjednota z titulemi nastawkow',
+'toc' => 'Wobsah',
+'tog-autopatrol' => 'Moje wobdźěłanja jako dohladowane woznamjenjeć',
+'tog-editondblclick' => 'Strony z dwójnym kliknjenjom wobdźěłować (trjeba JavaScript)',
+'tog-editsection' => 'Wobdźěłowanje jednotliwych wotrězkow přez wosebite wotkazy zmóžnić',
+'tog-editsectiononrightclick'=> 'Wobdźěłowanje jednotliwych wotrězkow přez kliknjenje z prawej tastu<br />na nadpisma wotrězkow zmóžnić (JavaScript)',
+'tog-editwidth' => 'Wobdźěłanski kašćik ma połnu šěrokosć',
+'tog-enotifminoredits' => 'Email tež dla drobnych změnow pósłać',
+'tog-enotifrevealaddr' => 'Moju emailowu adresu w emailowych zdźělenkach wotkryć',
+'tog-enotifusertalkpages'=> 'Email pósłać, hdyž so moja diskusijna strona změni',
+'tog-enotifwatchlistpages'=> 'Email wo změnach wobkedźbowanych stron pósłać',
+'tog-extendwatchlist' => 'Rozšěrjena lisćina wobkedźbowankow',
+'tog-externaldiff' => 'Eksterny diff-program jako standard wužiwać',
+'tog-externaleditor' => 'Eksterny editor jako standard wužiwać',
+'tog-fancysig' => 'Hrube signatury (bjez awtomatiskeho wotkaza)',
+'tog-forceeditsummary' => 'Mje warnować, zabudu-li zjeće',
+'tog-hideminor' => 'Drobne změny w poslednich změnach schować',
+'tog-highlightbroken' => 'Wotkazy na prózdne nastawki <a href="" class="new">tak</a> (alternative: like this<a href="" class="internal">?</a>)zběhnyć',
+'tog-justify' => 'Wotstawki w blokowej sadźbje',
+'tog-minordefault' => 'Wšě změny jako drobne woznamjenić',
+'tog-nocache' => 'Pufrowanje strony znjemóžnić',
+'tog-numberheadings' => 'Nadpisma awtomatisce ÄisÅ‚ować',
+'tog-previewonfirst' => 'Do składowanja přeco přehladku pokazać',
+'tog-previewontop' => 'Přehladku nad wobdźěłanskim kašćikom pokazać',
+'tog-rememberpassword' => 'Hesło za dalše posedźenja składować',
+'tog-showjumplinks' => 'Wotkazy typa „dźi do†zmóžnić',
+'tog-shownumberswatching'=> 'LiÄbu wobkedźbowacych wužiwarjow pokazać',
+'tog-showtoc' => 'Zapis wobsaha pokazać (za strony z wjace haÄ 3 nadpismami)',
+'tog-showtoolbar' => 'Wobdźěłowansku wobkromu pokazać (trjeba JavaScript)',
+'tog-underline' => 'Wotkazy podšmórnyć:',
+'tog-uselivepreview' => 'Live-přehladku wužiwać (JavaScript) (eksperimentalnje)',
+'tog-usenewrc' => 'Rozšěrjena lisćina aktualnych změnow (trjeba JavaScript)',
+'tog-watchcreations' => 'Strony, kotrež załožu, wobkedźbowankam přidać',
+'tog-watchdefault' => 'Strony, kotrež wobdźěłam, wobkedźbowankam přidać',
+'tog-watchlisthidebots' => 'Změny awtomatiskich programow (botow) na wobkedźbowanskach schować',
+'tog-watchlisthideown' => 'Moje změny na wobkedźbowankach schować',
+'toolbox' => 'Graty',
+'tooltip-compareselectedversions'=> 'Rozdźěle mjez wubranymaj wersijomaj tuteje strony pokazać. [alt-v]',
+'tooltip-diff' => 'Waše změny tuteje strony pokazać. [alt-v]',
+'tooltip-minoredit' => 'To jako drobnu změnu woznamjenić [alt-i]',
+'tooltip-preview' => 'Wobhladajće swoje zmÄ›ny, proÅ¡u Äińće to do skÅ‚adowanja! [alt-p]',
+'tooltip-recreate' => 'Stronu znowa załožić, byrnjež bu wumšmórnjena',
+'tooltip-save' => 'Změny składować [alt-s]',
+'tooltip-search' => '{{GRAMMAR:akuzatiw|{{SITENAME}}}} přepytać [alt-f]',
+'tooltip-watch' => 'Tutu stronu wobkedźbowankam přidać [alt-w]',
+'trackbackbox' => '<div id="mw_trackbacks">Trackbacks za tutón nastawk:<br />
+$1</div>',
+'trackbackdeleteok' => 'Trackback bu wuspěšnje wušmórnjeny.',
+'trackbacklink' => 'Trackback',
+'trackbackremove' => '([$1 wušmórnyć])',
+'tryexact' => 'Dokładne pytanje spytać',
+'tue' => 'Wut',
+'tuesday' => 'Wutora',
+'uclinks' => 'Poslednje $1 přinoškow pokazać; poslednje $2 dnjow pokazać.',
+'ucnote' => 'Deleka su poslednje <b>$1</b> změnow wužiwarja z poslednich <b>$2</b> dnjow.',
+'uctop' => '(aktualnje)',
+'uid' => 'ID wužiwarja:',
+'unblocked' => 'Wužiwar [[User:$1|$1]] bu dopušćeny',
+'unblockip' => 'Blokowanje zběhnyć',
+'unblockiptext' => 'Wužijće formular deleka, zo byšće blokowanje IP-adresy abo wužiwarskeho mjena zběhnył(a).',
+'unblocklink' => 'blokowanje zběhnyć',
+'unblocklogentry' => 'blokowanje wužiwarja $1 bu zběhnjene',
+'uncategorizedcategories'=> 'Njeklasifikowane kategorije',
+'uncategorizedimages' => 'Njeklasifikowane dataje',
+'uncategorizedpages' => 'Njeklasifikowane strony',
+'undelete' => 'Wušmórnjenu stronu wobnowić',
+'undelete_short' => '{{PLURAL:$1|jednu wersiju|$1 wersijow}} wobnowić',
+'undeletearticle' => 'Wušmórnjenu stronu wobnowić',
+'undeletebtn' => 'Wobnowić',
+'undeletecomment' => 'PÅ™iÄina:',
+'undeletedarticle' => 'Strona „$1†bu wuspěšnje wobnowjena.',
+'undeletedfiles' => '$1 dataje/datajow wobnowjenych',
+'undeletedpage' => '<big><b>Strona $1 bu z wuspěchom wobnowjena.</b></big>
+
+Hlej [[Special:Log/delete|protokol]] za lisćinu aktualnych wušmórnjenjow a wobnowjenjow.',
+'undeletedrevisions' => '$1 wersijow wobnowjenych.',
+'undeletedrevisions-files'=> '$1 rewizijow a $2 dataje/datajow wobnowjenych',
+'undeleteextrahelp' => 'Zo byšće stronu z wÅ¡Ä›mi wersijemi wobnowiÅ‚(a) zapodajće proÅ¡u pÅ™iÄinu a klikńće na <b>Wobnowić</b>. Chceće-li jenož jednotliwe wersije wobnowić, wubÄ›rće proÅ¡u jich markÄ›rowanske pola, zapodajće pÅ™iÄinu a klikńće na <b>Wobnowić</b>. Kliknjenje na <b>Cofnyć</b> wuprózdni komentarowe polo a wÅ¡Ä› markÄ›rowanske pola.',
+'undeletehistory' => 'Jeli stronu wobnowjeće, zapřijmnu so wšě wersije zaso do stawiznow. Jelizo bu po wušmórnjenju nowa strona ze samsnym mjenom załožena, budu so wobnowjene wersije w prjedawšich stawiznach jewić a tuchwilna wersija aktualneje strony njebudźe so awtomatisce narunować.',
+'undeletehistorynoadmin'=> 'Tuta strona bu wuÅ¡mórnjena. PÅ™iÄina za wuÅ¡mórnjenje je deleka zapodata kaž tež detaile k poslednjemu wužiwarjej, kotryž je stronu pÅ™ed wuÅ¡mórnjenjom wobdźěłaÅ‚. Tuchwilny wobsah strony je jenož administratoram pÅ™istupny.',
+'undeletepage' => 'Wušmórnjene strony wobnowić',
+'undeletepagetext' => 'Tute strony buchu wušmórnjene, su pak hišće w datowej bance składowane a móža so wobnowić.',
+'undeletereset' => 'Cofnyć',
+'undeleterevision' => 'Wušmórnjena wersija z dnja $1',
+'undeleterevisions' => '$1 wersijow archiwowanych',
+'underline-always' => 'Přeco',
+'underline-default' => 'Přednastajenje browsera',
+'underline-never' => 'Ženje',
+'unexpected' => 'NjewoÄakowana hódnota: "$1"="$2".',
+'unit-pixel' => 'px',
+'unlockbtn' => 'Zawrjenje datoweje banki zběhnyć',
+'unlockconfirm' => 'Haj, chcu woprawdźe zawrjenje datoweje banki zběhnyć.',
+'unlockdb' => 'Škit datoweje banki zběhnyć',
+'unlockdbsuccesssub' => 'Škit datoweje banki zběhnjeny',
+'unlockdbsuccesstext' => 'Zawrjenje datoweje banki bu zběhnjene.',
+'unlockdbtext' => 'ZbÄ›hnjenje Å¡kita datoweje banki zaso wÅ¡Ä›m wužiwarjam zmóžni strony wobdźěłać, jich nastajenja zmÄ›nić, jich wobkedźbowanki wobdźěłać a hinaÅ¡e dźěła Äinić, kotrež sej zmÄ›ny w datowej bance žadaja. ProÅ¡u wobkrućće, zo chceće Å¡kit datoweje banki woprawdźe zbÄ›hnyć.',
+'unprotect' => 'Škit zběhnyć',
+'unprotectcomment' => 'PÅ™iÄina za zbÄ›hnjenje Å¡kita',
+'unprotectedarticle' => 'Škit strony „[[$1]]†bu zběhnjeny',
+'unprotectsub' => '(Škit za stronu „$1†so zběhnje)',
+'unprotectthispage' => 'Škit za tutu stronu zběhnyć',
+'unusedcategories' => 'Njewužiwane kategorije',
+'unusedcategoriestext' => 'SlÄ›dowace strony kategorijow eksistuja haÄrunjež žadyn druhi nastawk abo kategorija je wužiwa.',
+'unusedimages' => 'Njewužiwane dataje',
+'unusedimagestext' => '<p>ProÅ¡u wobkedźbujće, zo móža druhe web-sydÅ‚a z wobrazom z direktnym URL zwjazane a móža tu naliÄene być, haÄrunjež su w aktiwnym wužiwanjom.</p>',
+'unusedtemplates' => 'Njewužiwane předłohi',
+'unusedtemplatestext' => 'Na tutej stronje widźiće wÅ¡Ä› pÅ™edÅ‚ohi, kiž so wot druhich stron njewužiwaju. PÅ™epruwujće wotkazy k druhim pÅ™edÅ‚oham, prjedy haÄ je wotstronjeće.',
+'unusedtemplateswlh' => 'Druhe wotkazy',
+'unwatch' => 'Njewobkedźbować',
+'unwatchedpages' => 'Njewobkedźbowane strony',
+'unwatchthispage' => 'Wobkedźbowanje skónÄić',
+'updated' => '(Zaktualizowany)',
+'updatedmarker' => 'Změny z mojeho poslednjeho wopyta',
+'upload' => 'Dataju nahrawać',
+'upload_directory_read_only'=> 'Nahrawanski zapis ($1) njehodźi so přez webserwer popisować.',
+'uploadbtn' => 'Dataju nahrawać',
+'uploadcorrupt' => 'Dataja je wobškodźena abo ma njekorektny sufiks. Prošu přepruwujće dataju a wotsćelće ju hišće raz.',
+'uploaddisabled' => 'Wodajće, nahrawanje bu znjemóžnjene.',
+'uploaddisabledtext' => 'Nahrawanje datajow bu w tutym wiki znjemóžnjene.',
+'uploadedfiles' => 'Nahrate dataje',
+'uploadedimage' => 'je dataju „[[$1]]†nahrał(a)',
+'uploaderror' => 'Zmylk při nahrawanju',
+'uploadlog' => 'Protokol nahrawanjow',
+'uploadlogpage' => 'Protokol_nahrawanjow',
+'uploadlogpagetext' => 'Deleka je lisćina naposledk nahratych datajow.',
+'uploadnewversion-linktext'=> 'nowu wersiju tuteje dataje nahrać',
+'uploadnologin' => 'Njepřizjewjeny(a)',
+'uploadnologintext' => 'Dyrbiće [[Special:Userlogin|přizjwjeny(a)]] być, zo byšće dataje nahrawać móhł(a).',
+'uploadscripted' => 'Tuta dataja wobsahuje HTML- abo skriptowy kode, kotryž móhł so zmylnje přez web-browser wuwjesć.',
+'uploadtext' => 'Wužijće formular deleka, zo byšće nowe dataje nahrał(a); zo byšće prjedy nahrate wobrazy wobhladał(a) abo pytał(a) dźiće k [[Special:Imagelist|lisćinje nahratych datajow]]; detaile k nahrawanjam a wušmórnjenjam namakaće tež w [[Special:Log/upload|protokolu nahrawanjow]].
+
+Zo by so wobraz do strony zapřijał, wužijće jón we formje
+* <b><nowiki>[[Image:Dataja.jpg]]</nowiki></b>
+* <b><nowiki>[[Image:Dataja.png|alt tekst]]</nowiki></b>
+abo zo by so direktnje z dataju zwjazało
+* <b><nowiki>[[Media:Dataja.ogg]]</nowiki></b>',
+'uploadvirus' => 'Dataja wirus wobsahuje! Drobnosće: $1',
+'uploadwarning' => 'Warnowanje',
+'user_rights_set' => '<b>Prawa za wužiwarja „$1†zaktualizowane</b>',
+'usercssjsyoucanpreview'=> '<strong>Pokiw:</strong> Wužijće tłóÄku \'PÅ™ehlad pokazać\', zo byšće swój nowy CSS/JS do skÅ‚adowanja testowaÅ‚(a).',
+'usercsspreview' => '<b>Pomylsće sej, zo swój wužiwarski CSS jenož wobhladujeće, je hišće njeskładowany!</b>',
+'userexists' => 'Wužiwarske mjeno, kotrež sće zapisał, so hižo wužiwa. Prošu wubjerće druhe mjeno.',
+'userinvalidcssjstitle' => '<b>Kedźbu:</b> Skin z mjenom "$1" njeeksistuje. ProÅ¡u mysliće na to, zo dyrbja wosobinske .css a .js strony z maÅ‚ym pismikom zapoÄeć, na pÅ™. User:Foo/monobook.css mÄ›sto User:Foo/Monobook.css.',
+'userjspreview' => '<b>Pomylsće sej, zo swój wužiwarski JavaScript jenož testujeće/wobhladujeće, je hišće njeskładowany!</b>',
+'userlogin' => 'Załožće konto abo přizjewće so',
+'userlogout' => 'Wotzjewić',
+'usermailererror' => 'Emailowy objekt wróći zmylk:',
+'username' => 'Wužiwarske mjeno:',
+'userpage' => 'Wužiwarsku stronu pokazać',
+'userrights' => 'Zrjadowanje wužiwarskich prawow',
+'userrights-editusergroup'=> 'Wužiwarske skupiny wobdźěłać',
+'userrights-groupsavailable'=> 'K dispoziciji stejace skupiny:',
+'userrights-groupshelp' => 'Wubjerće skupiny, z kotrychž chceće wužiwarja wotstronić abo do kotrychž chceće wužiwarja přidać. Njewubrane skupiny so njezměnja. Móžeće wubranje za skupinu zběhnyć wužiwajo STRG + Lěwe kliknjenje',
+'userrights-groupsmember'=> 'Sobustaw skupiny:',
+'userrights-lookup-user'=> 'Wužiwarske skupiny zrjadować',
+'userrights-user-editname'=> 'Wužiwarske mjeno:',
+'userstats' => 'Statistika wužiwarjow',
+'userstatstext' => 'Je <b>$1</b> [[Special:Listusers|wužiwarjow]] zregistrowanych, <b>$2</b> (abo <b>$4%</b>) z nich su $5.',
+'version' => 'Wersija',
+'versionrequired' => 'Wersija $1 softwary MediaWiki trěbna',
+'versionrequiredtext' => 'Wersija $1 softwary MediaWiki je trěbna, zo by so tuta strona wužiwać móhła. Hlej [[Special:Version]]',
+'viewcount' => 'Tuta strona bu $1 króć pokazana.',
+'viewdeleted' => '$1 pokazać?',
+'viewdeletedpage' => 'Wušmórnjene strony wobhladać',
+'viewhelppage' => 'Pomocnu stronu pokazać',
+'viewpagelogs' => 'Protokole zu tutu stronu pokazać',
+'viewprevnext' => '($1) ($2) ($3) wobhladać.',
+'views' => 'Pohlady',
+'viewsource' => 'Žórło wobhladać',
+'viewsourcefor' => 'za $1',
+'viewtalkpage' => 'Diskusiju pokazać',
+'wantedcategories' => 'Požadane kategorije',
+'wantedpages' => 'Požadane strony',
+'watch' => 'Wobkedźbować',
+'watchdetails' => '* $1 wobkedźbowanych stron nimo diskusijnych stron
+* [[Special:Watchlist/edit|Wobkedźbowanki pokazać a wobdźěłać]]
+* [[Special:Watchlist/clear|Wobkedźbowanki wuprózdnić]]',
+'watcheditlist' => 'Deleka je alfabetiska lisćina Wašich wobkedźbowanych stron.
+
+Markěrujće kašćiki stron, kotrež chceće ze swojich wobkedźbowankow wotstronić. Wotstronjenje wobsahoweje strony tež přisłušnu diskusijnu stronu wotstronja a nawopak.',
+'watchlist' => 'Wobkedźbowanki',
+'watchlistall1' => 'wšě',
+'watchlistall2' => 'wšě',
+'watchlistanontext' => 'Dyrbiće so $1, zo byšće swoje wobkedźbowanki wobhladać abo wobdźěłać móhł(a).',
+'watchlistclearbutton' => 'Wobkedźbowanki wuprózdnić',
+'watchlistcleardone' => 'Waše wobkedźbowanki z dohromady {{PLURAL:$1|jednej stronu|$1 stronami}} buchu wuprózdnjene.',
+'watchlistcleartext' => 'Sće sej wěsty(a), zo chceće swoje wobkedźbowanki wuprózdnić?',
+'watchlistcontains' => 'Maće $1 stron w swojich wobkedźbowankach.',
+'watchlistcount' => '<b>Maće {{PLURAL:$1|1 stronu|$1 stron}} we wobkedźbowankach hromadu z přisłušnymi diskusijnymi stronami.</b>',
+'watchlistfor' => '(za wužiwarja <b>$1</b>)',
+'watchmethod-list' => 'Wobkedźbowanki za aktualnymi změnami přepruwować',
+'watchmethod-recent' => 'Aktualne změny za wobkedźbowane strony přepruwować',
+'watchnochange' => 'Žana z Wašich wobkedźbowanych stron njebu w pokazowanej dobje wobdźěłowana.',
+'watchnologin' => 'Njejsće přizjewjeny(a).',
+'watchnologintext' => 'Dyrbiće [[Special:Userlogin|přizjewjeny(a)]] być, zo byšće swoje wobkedźbowanki změnić móhł(a).',
+'watchthis' => 'Tutu stronu wobkedźbować',
+'watchthispage' => 'Stronu wobkedźbować',
+'watchthisupload' => 'Stronu wobkedźbować',
+'wed' => 'Srj',
+'wednesday' => 'Srjeda',
+'welcomecreation' => '== Witajće, $1! ==
+
+Waše konto bu připrawjene. Njezabudźće, swoje nastajenja za {{GRAMMAR:akuzatiw|{{SITENAME}}}} změnić.',
+'whatlinkshere' => 'Å to pokazuje sem',
+'whitelistacctext' => 'Zo byšće směł(a) konta w tutym wiki załožić, dyrbiće so [[Special:Userlogin|tu přizjewić]] a trěbne dowolenja měć.',
+'whitelistacctitle' => 'Njesměće konto załožować',
+'whitelistedittext' => 'Dyrbiće so $1, zo byšće strony wobdźěłować móhł(a).',
+'whitelistedittitle' => 'Přizjewjenje za wobdźěłanje trěbne',
+'whitelistreadtext' => 'Dyrbiće so [[Special:Userlogin|tu pÅ™izjewić]], zo byšće strony Äitać móhÅ‚(a).',
+'whitelistreadtitle' => 'PÅ™izjewjenje za Äitanje trÄ›bne',
+'wldone' => 'Akcija bu wuspěšnje wuwjedźena.',
+'wlheader-enotif' => '* Emailowe zdźělenje je zmóžnjene.',
+'wlheader-showupdated' => '* Strony, kotrež buchu po WaÅ¡im poslednim wopyće zmÄ›njene so <b>tuÄne</b> jewja.',
+'wlhideshowbots' => 'změny awtomatiskich programow (botow) $1',
+'wlhideshowown' => 'moje změny $1',
+'wlnote' => 'Deleka je poslednje $1 změnow za poslednje <b>$2</b> hodź.',
+'wlsaved' => 'To je składowana wersija Wašich wobkedźbowankow.',
+'wlshowlast' => 'Poslednje $1 hodź. - $2 dnjow - $3 pokazać',
+'wrong_wfQuery_params' => 'Njeprawe parametry za wfQuery()
+
+Funkcija: $1
+
+Wotprašenje: $2',
+'wrongpassword' => 'Hesło, kotrež sće zapisał(a), je wopak (abo pobrachuje). Prošu spytajće hišće raz.',
+'wrongpasswordempty' => 'Hesło, kotrež sće zapisał(a), běše prózdne. Prošu spytajće hišće raz.',
+'youhavenewmessages' => 'Maće $1 ($2).',
+'youhavenewmessagesmulti'=> 'Maće nowe powěsće: $1',
+'yourdiff' => 'Rozdźěle',
+'yourdomainname' => 'Waša domena',
+'youremail' => 'Email *',
+'yourlanguage' => 'RÄ›Ä:',
+'yourname' => 'Wužiwarske mjeno',
+'yournick' => 'Přimjeno:',
+'yourpassword' => 'Hesło',
+'yourpasswordagain' => 'Hesło znowa zapodać',
+'yourrealname' => 'Woprawdźite mjeno *',
+'yourtext' => 'Waš tekst',
+'yourvariant' => 'Warianta',
+
+);
+
+?>
diff --git a/languages/messages/MessagesHu.php b/languages/messages/MessagesHu.php
index 78a68552..628395b0 100644
--- a/languages/messages/MessagesHu.php
+++ b/languages/messages/MessagesHu.php
@@ -112,7 +112,8 @@ $messages = array(
'jul' => 'Júl',
'aug' => 'aug',
'oct' => 'Okt',
-'categories' => '{{PLURAL:$1|Kategória|Kategóriák}}',
+'categories' => 'Kategóriák',
+'pagecategories' => '{{PLURAL:$1|Kategória|Kategóriák}}',
'category_header' => '„$1†kategóriába tartozó szócikkek',
'subcategories' => 'Alkategóriák',
'mainpage' => 'Kezdőlap',
@@ -776,7 +777,7 @@ Minden időpont a server órája ([[UTC]]) szerinti.
'deletionlog' => 'törlési napló',
'deletecomment' => 'A törlés oka',
'cantrollback' => 'Nem lehet visszaállítani: az utolsó szerkesztést végző felhasználó az egyetlen, aki a lapot szerkesztette.',
-'alreadyrolled' => '[[$1]] utolsó, [[User:$2|$2]] ([[User talk:$2|vita]]) általi szerkesztését nem lehet visszavonni: időközben valakimár visszavonta, vagy szerkesztette a lapot.
+'alreadyrolled' => '[[:$1]] utolsó, [[User:$2|$2]] ([[User talk:$2|vita]]) általi szerkesztését nem lehet visszavonni: időközben valakimár visszavonta, vagy szerkesztette a lapot.
Az utolsó szerkesztést [[User:$3|$3]] ([[User talk:$3|vita]]) végezte.',
'editcomment' => 'A változtatás összefoglalója "<i>$1</i>" volt.',
@@ -923,7 +924,7 @@ Az utóbbi esetben közvetlen linket is használhatsz, például a [[Special:Exp
'tooltip-minoredit' => 'Szerkesztés megjelölése apróként [alt-i]',
'tooltip-save' => 'A változtatásaid elmentése [alt-s]',
'tooltip-preview' => 'Mielőtt elmentenéd a lapot, ellenőrizd, biztosan úgy néz-e ki, ahogy szeretnéd! [alt-p]',
-'tooltip-diff' => 'Nézd meg, milyen változtatásokat végeztél eddig a szövegen [alt-d]',
+'tooltip-diff' => 'Nézd meg, milyen változtatásokat végeztél eddig a szövegen [alt-v]',
'tooltip-compareselectedversions'=> 'A két kiválasztott változat közötti eltérések megjelenítése [alt-v]',
'anonymous' => 'Névtelen {{SITENAME}}-felhasználó(k)',
'lastmodifiedatby' => 'Ezt a lapot utoljára $3 módosította $2, $1 időpontban.',
@@ -945,7 +946,7 @@ Az utóbbi esetben közvetlen linket is használhatsz, például a [[Special:Exp
'markedaspatrolledtext' => 'A kiválasztott változatot ellenőrzöttnek jelölted.',
'rcpatroldisabled' => 'A Friss Változtatások Ellenőrzése kikapcsolva',
'rcpatroldisabledtext' => 'A Friss Változtatások Ellenőrzése jelenleg nincs engedélyezve.',
-'Monobook.js' => '/* Tooltipek és gyorsbillentyűk */
+'monobook.js' => '/* Tooltipek és gyorsbillentyűk */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'A felhasználói lapod\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Az általad használt IP címhez tartozó felhasználói lap\');
@@ -956,7 +957,7 @@ Az utóbbi esetben közvetlen linket is használhatsz, például a [[Special:Exp
ta[\'pt-mycontris\'] = new Array(\'y\',\'A közreműködéseid listája\');
ta[\'pt-login\'] = new Array(\'o\',\'Bejelentkezni javasolt, de nem kötelező.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Bejelentkezni javasolt, de nem kötelező.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Kijelentkezés\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Kijelentkezés\');
ta[\'ca-talk\'] = new Array(\'t\',\'Az oldal tartalmának megvitatása\');
ta[\'ca-edit\'] = new Array(\'e\',\'Te is szerkesztheted ezt az oldalt. Mielőtt elmentenéd, használd az előnézetet.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Újabb fejezet nyitása a vitában.\');
diff --git a/languages/messages/MessagesIa.php b/languages/messages/MessagesIa.php
index 69c5af92..c3be51ff 100644
--- a/languages/messages/MessagesIa.php
+++ b/languages/messages/MessagesIa.php
@@ -261,10 +261,10 @@ Le motivo presentate es iste:<br />''$2''<p>Tu pote contactar $1 o un del altere
Pro crear un nove pagina, comencia a scriber in le cassa infra.
(Vide le [[{{ns:project}}:Adjuta|pagina de adjuta]] pro plus information.)
Si tu es hic per error, simplemente clicca le button '''Retornar''' de tu navigator.",
-"anontalkpagetext" => "---- ''Iste es le pagina de discussion pro un usator anonyme qui ancora non ha create un conto o qui non lo usa. Consequentemente nos debe usar le [[adresse de IP]] numeric pro identificar le/la. Un tal adresse de IP pote esser usate in commun per varie personas. Si tu es un usator anonyme e senti que commentarios irrelevante ha essite dirigite a te, per favor [[Special:Userlogin|crea un conto o aperi un session]] pro evitar futur confusiones con altere usatores anonyme.'' ",
+"anontalkpagetext" => "---- ''Iste es le pagina de discussion pro un usator anonyme qui ancora non ha create un conto o qui non lo usa. Consequentemente nos debe usar le [[adresse de IP]] numeric pro identificar le/la. Un tal adresse de IP pote esser usate in commun per varie personas. Si tu es un usator anonyme e senti que commentarios irrelevante ha essite dirigite a te, per favor [[Special:Userlogin|crea un conto o aperi un session]] pro evitar futur confusiones con altere usatores anonyme.''",
"noarticletext" => "(Actualmente il non ha texto in iste pagina)",
"updated" => "(Actualisate)",
-"note" => "<strong>Nota:</strong> ",
+"note" => "<strong>Nota:</strong>",
"previewnote" => "Rememora te que isto es solmente un previsualisation, tu modificationes ancora non ha essite salvate!",
"previewconflict" => "Iste previsualisation reflecte le apparentia final del texto in le area de redaction superior
si tu opta pro salvar lo.",
@@ -337,7 +337,7 @@ error syntactic in le consulta, per exemplo,
Reformula tu consulta.",
"matchtotals" => "Le consulta \"$1\" coincide con le titulos de $2 articulos
e le texto de $3 articulos.",
-"noexactmatch" => "Non existe un pagina con iste titulo exacte, io recurre al recerca de texto integral. ",
+"noexactmatch" => "Non existe un pagina con iste titulo exacte, io recurre al recerca de texto integral.",
"titlematches" => "Coincidentias con titulos de articulos",
"notitlematches" => "Necun coincidentia",
"textmatches" => "Coincidentias con textos de articulos",
@@ -371,7 +371,7 @@ pro definir tu preferentias.",
"math" => "Exhibition de formulas",
"math_failure" => "Impossibile analysar",
"math_unknown_error" => "error incognite",
-"math_unknown_function" => "function incognite ",
+"math_unknown_function" => "function incognite",
"math_lexing_error" => "error lexic",
"math_syntax_error" => "error syntactic",
"saveprefs" => "Salvar preferentias",
diff --git a/languages/messages/MessagesId.php b/languages/messages/MessagesId.php
index 83c81a1f..f283694e 100644
--- a/languages/messages/MessagesId.php
+++ b/languages/messages/MessagesId.php
@@ -14,8 +14,12 @@ $skinNames = array(
);
$bookstoreList = array(
- 'Gramedia Cyberstore (via Google)' => 'http://www.google.com/search?q=%22ISBN+:+$1%22+%22product_detail%22+site:www.gramediacyberstore.com+OR+site:www.gramediaonline.com+OR+site:www.kompas.com&hl=id',
+ 'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN',
+ 'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1',
+ 'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
'Bhinneka.com bookstore' => 'http://www.bhinneka.com/Buku/Engine/search.asp?fisbn=$1',
+ 'Gramedia Cyberstore (via Google)' => 'http://www.google.com/search?q=%22ISBN+:+$1%22+%22product_detail%22+site:www.gramediacyberstore.com+OR+site:www.gramediaonline.com+OR+site:www.kompas.com&hl=id',
+ 'PriceSCAN' => 'http://www.pricescan.com/books/bookDetail.asp?isbn=$1',
);
$namespaceNames = array(
NS_MEDIA => 'Media',
@@ -70,8 +74,10 @@ $messages = array(
'tog-showtoc' => 'Perlihatkan daftar isi (untuk halaman yang mempunyai lebih dari 3 sub-bagian)',
'tog-rememberpassword' => 'Ingat kata sandi pada setiap sesi',
'tog-editwidth' => 'Kotak sunting berukuran maksimum',
-'tog-watchcreations' => 'Tambahkan halaman yang baru dibuat ke daftar pantauan',
-'tog-watchdefault' => 'Tambahkan halaman yang disunting ke dalam daftar pantauan',
+'tog-watchcreations' => 'Tambahkan halaman yang saya buat ke daftar pantauan',
+'tog-watchdefault' => 'Tambahkan halaman yang saya sunting ke dalam daftar pantauan',
+'tog-watchmoves' => 'Tambahkan halaman yang saya pindahkan ke dalam daftar pantauan',
+'tog-watchdeletion' => 'Tambahkan halaman yang saya hapus ke daftar pantauan',
'tog-minordefault' => 'Tandai semua suntingan sebagai suntingan kecil secara baku',
'tog-previewontop' => 'Perlihatkan pratayang sebelum kotak sunting dan tidak sesudahnya',
'tog-previewonfirst' => 'Perlihatkan pratayang pada suntingan pertama',
@@ -86,10 +92,12 @@ $messages = array(
'tog-externaldiff' => 'Gunakan perangkat lunak luar untuk melihat perbedaan suntingan',
'tog-showjumplinks' => 'Aktifkan pranala pembantu "langsung ke"',
'tog-uselivepreview' => 'Gunakan pratayang langsung (JavaScript) (eksperimental)',
-'tog-autopatrol' => 'Tandai suntingan yang saya lakukan telah dipatroli/diperiksa',
'tog-forceeditsummary' => 'Ingatkan saya bila kotak ringkasan suntingan masih kosong',
-'tog-watchlisthideown' => 'Sembunyikan suntingan saya di daftar pantauan',
-'tog-watchlisthidebots' => 'Sembunyikan suntingan bot di daftar pantauan',
+'tog-watchlisthideown' => 'Sembunyikan suntingan saya dari daftar pantauan',
+'tog-watchlisthidebots' => 'Sembunyikan suntingan bot dari daftar pantauan',
+'tog-watchlisthideminor' => 'Sembunyikan suntingan kecil dari daftar pantauan',
+'tog-nolangconversion' => 'Matikan konversi varian',
+'tog-ccmeonemails' => 'Kirimkan saya salinan surat-e yang saya kirimkan ke orang lain',
'underline-always' => 'Selalu',
'underline-never' => 'Tidak',
@@ -151,9 +159,11 @@ $messages = array(
# Bits of text used by many pages:
#
-'categories' => '{{PLURAL:$1|Kategori|Kategori}}',
+'categories' => 'Kategori',
+'pagecategories' => 'Kategori', # no need for plural
"category_header" => "Artikel dalam kategori \"$1\"",
"subcategories" => "Subkategori",
+'category-media-header' => 'Media dalam kategori "$1"',
"mainpage" => "Halaman Utama",
"mainpagetext" => "Perangkat lunak wiki berhasil dipasang.",
@@ -226,7 +236,7 @@ $messages = array(
"editthispage" => "Sunting halaman ini",
'delete' => 'Hapus',
"deletethispage" => "Hapus halaman ini",
-'undelete_short' => 'Batal hapus {{PLURAL:$1|satu suntingan|$1 suntingan}}',
+'undelete_short' => 'Batal hapus $1 suntingan', # no need for plural
'protect' => 'Lindungi',
"protectthispage" => "Lindungi halaman ini",
'unprotect' => 'Ubah perlindungan',
@@ -250,7 +260,6 @@ $messages = array(
"viewtalkpage" => "Lihat diskusi",
"otherlanguages" => "Bahasa lain",
"redirectedfrom" => "(Dialihkan dari $1)",
-'autoredircomment' => 'Alihkan ke [[$1]]',
'redirectpagesub' => 'Halaman peralihan',
"lastmodifiedat" => "Halaman ini terakhir diubah pada $2, $1.",
"viewcount" => "Halaman ini telah diakses sebanyak $1 kali.<br />",
@@ -276,7 +285,7 @@ $messages = array(
"retrievedfrom" => "Diperoleh dari \"$1\"",
'youhavenewmessages' => 'Anda mempunyai $1 ($2).',
"newmessageslink" => "pesan baru",
-'newmessagesdifflink' => 'lihat perbedaan dari revisi sebelumnya',
+'newmessagesdifflink' => 'perubahan terakhir',
"editsection" => "sunting",
"editold" => "sunting",
'editsectionhint' => 'Sunting bagian: $1',
@@ -288,6 +297,8 @@ $messages = array(
'restorelink' => '$1 suntingan yang telah dihapus', # no need for plural
'feedlinks' => 'Asupan:',
'feed-invalid' => 'Tipe permintaan asupan tidak tepat.',
+'feed-atom' => 'Atom',
+'feed-rss' => 'RSS',
# Short words for each namespace, by default used in the 'article' tab in monobook
'nstab-main' => 'Artikel',
@@ -342,12 +353,12 @@ Jika ini bukan sebabnya, Anda mungkin menemukan bug dalam perangkat lunak. Silak
"perfdisabledsub" => "Ini adalah salinan tersimpan dari $1:",
"perfcached" => "Data berikut ini diambil dari <em>cache</em> dan mungkin bukan data mutakhir:",
'perfcachedts' => 'Data berikut ini diambil dari <em>cache</em>, dan terakhir diperbarui pada $1.',
+'querypage-no-updates' => 'Pemutakhiran dari halaman ini sedang dimatikan. Data yang ada di sini saat ini tidak akan dimuat ulang.',
"wrong_wfQuery_params" => "Parameter salah ke wfQuery()<br />Fungsi: $1<br />Permintaan: $2",
"viewsource" => "Lihat sumber",
'viewsourcefor' => 'dari $1',
-'protectedtext' => 'Halaman ini telah dikunci untuk menghindari penyuntingan.
-
-Anda dapat melihat atau menyalin sumber halaman ini:',
+'protectedpagetext' => 'Halaman ini telah dikunci untuk menghindari penyuntingan.',
+'viewsourcetext' => 'Anda dapat melihat atau menyalin sumber halaman ini:',
'protectedinterface' => 'Halaman ini berisi teks antarmuka untuk digunakan oleh perangkat lunak dan telah dikunci untuk menghindari kesalahan.',
'editinginterface' => "'''Peringatan:''' Anda menyunting halaman yang digunakan untuk menyediakan teks antarmuka dengan perangkat lunak. Perubahan teks ini akan mempengaruhi tampilan pada pengguna lain.",
'sqlhidden' => '(Permintaan SQL disembunyikan)',
@@ -414,7 +425,9 @@ Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi {{SITENAME}} Anda.",
"noemail" => "Tidak ada alamat surat-e yang tercatat untuk pengguna \"$1\".",
"passwordsent" => "Kata sandi baru telah dikirimkan ke surat-e yang didaftarkan untuk \"$1\". Silakan masuk log kembali setelah menerima surat-e tersebut.",
+'blocked-mailpassword' => 'Alamat IP Anda diblokir dari penyuntingan dan karenanya tidak diizinkan menggunakan fungsi pengingat kata sandi untuk mencegah penyalahgunaan.',
'eauthentsent' => 'Sebuah surat elektronik untuk konfirmasi telah dikirim ke alamat surat elektronik Anda. Anda harus mengikuti instruksi di dalam surat elektronik tersebut untuk melakukan konfirmasi bahwa alamat tersebut adalah benar kepunyaan Anda. {{SITENAME}} tidak akan mengaktifkan fitur surat elektronik jika langkah ini belum dilakukan.',
+'throttled-mailpassword' => 'Suatu pengingat kata sandi telah dikirimkan dalam $1 jam terakhir. Untuk menghindari penyalahgunaan, hanya satu kata sandi yang akan dikirimkan setiap $1 jam.',
"mailerror" => "Kesalahan dalam mengirimkan surat-e: $1",
'acct_creation_throttle_hit' => 'Maaf, Anda telah membuat $1 akun. Anda tidak dapat membuat akun lagi.',
'emailauthenticated' => 'Alamat surat-e Anda telah dikonfirmasi pada $1.',
@@ -425,6 +438,17 @@ Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi {{SITENAME}} Anda.",
'accountcreated' => 'Akun dibuat',
'accountcreatedtext' => 'Akun pengguna untuk $1 telah dibuat.',
+# Password reset dialog
+'resetpass' => 'Atur ulang kata sandi akun',
+'resetpass_announce' => 'Anda telah masuk log dengan kode sementara yang dikirim melalui surat-e. Untuk melanjutkan, Anda harus memasukkan kata sandi baru di sini:',
+'resetpass_text' => "<!-- Tambahkan teks di sini -->",
+'resetpass_header' => 'Atur ulang kata sandi',
+'resetpass_submit' => 'Atur kata sandi dan masuk log',
+'resetpass_success' => 'Kata sandi Anda telah berhasil diubah! Sekarang memproses masuk log Anda...',
+'resetpass_bad_temporary' => 'Kata sandi sementara salah. Anda mungkin pernah berhasil mengganti kata sandi Anda atau telah meminta kata sandi baru.',
+'resetpass_forbidden' => 'Kata sandi tidak dapat diubah di wiki ini',
+'resetpass_missing' => 'Data formulir tak dikenali.',
+
# Edit page toolbar
"bold_sample" => "Teks ini akan dicetak tebal",
"bold_tip" => "Cetak tebal",
@@ -450,7 +474,7 @@ Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi {{SITENAME}} Anda.",
# Edit pages
#
"summary" => "Ringkasan",
-"subject" => "Subyek/judul",
+"subject" => "Subjek/judul",
"minoredit" => "Ini adalah suntingan kecil.",
"watchthis" => "Pantau artikel ini",
"savearticle" => "Simpan halaman",
@@ -461,6 +485,9 @@ Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi {{SITENAME}} Anda.",
'anoneditwarning' => 'Anda tidak terdaftar masuk. Alamat IP Anda akan tercatat dalam sejarah (versi terdahulu) halaman ini.',
'missingsummary' => "'''Peringatan:''' Anda tidak memasukkan ringkasan penyuntingan. Jika Anda kembali menekan tombol Simpan, suntingan Anda akan disimpan tanpa ringkasan penyuntingan.",
'missingcommenttext' => 'Harap masukkan komentar di bawah ini.',
+'missingcommentheader' => "'''Peringatan:''' Anda belum memberikan subjek atau judul untuk komentar Anda. Jika Anda kembali menekan Simpan, suntingan Anda akan disimpan tanpa komentar tersebut.",
+'summary-preview' => 'Pratayang ringkasan',
+'subject-preview' => 'Pratayang subyek/tajuk',
"blockedtitle" => "Pengguna diblokir",
'blockedtext' => "<big>'''Nama pengguna atau alamat IP Anda telah diblokir.'''</big>
@@ -470,7 +497,7 @@ Anda dapat menghubungi $1 atau [[{{ns:project}}:Pengurus|pengurus lainnya]] untu
Anda tidak dapat menggunakan fitur 'Kirim surat-e pengguna ini' kecuali Anda telah memasukkan alamat surat-e yang sah di [[{{ns:project}}:Preferences|preferensi]] Anda.
-Alamat IP Anda adalah $3. Sertakan alamat IP ini pada setiap pertanyaan yang Anda buat",
+Alamat IP Anda adalah $3, dan ID pemblokiran adalah $5. Tolong sertakan salah satu atau kedua informasi ini pada setiap pertanyaan yang Anda buat",
'blockedoriginalsource' => "Isi sumber '''$1''' ditunjukkan berikut ini:",
'blockededitsource' => "Teks '''suntingan Anda''' terhadap '''$1''' ditunjukkan berikut ini:",
"whitelistedittitle" => "Perlu masuk log untuk menyunting",
@@ -487,7 +514,7 @@ Alamat IP Anda adalah $3. Sertakan alamat IP ini pada setiap pertanyaan yang And
"accmailtitle" => "Kata sandi telah terkirim.",
"accmailtext" => "Kata sandi untuk '$1' telah dikirimkan ke $2.",
"newarticle" => "(Baru)",
-"newarticletext" => "Anda mengikuti pranala ke halaman yang belum ada. Untuk membuat halaman tersebut, ketiklah isi halaman di kotak di bawah ini (lihat [[{{ns:help}}:Isi|halaman bantuan]] untuk informasi lebih lanjut). Jika Anda tanpa sengaja sampai ke halaman ini, klik tombol '''back''' di penjelajah web anda.",
+"newarticletext" => "Anda mengikuti pranala ke halaman yang belum tersedia. Untuk membuat halaman tersebut, ketiklah isi halaman di kotak di bawah ini (lihat [[{{ns:help}}:Isi|halaman bantuan]] untuk informasi lebih lanjut). Jika Anda tanpa sengaja sampai ke halaman ini, klik tombol '''back''' di penjelajah web anda.",
"anontalkpagetext" => "---- ''Ini adalah halaman diskusi seorang pengguna anonim yang belum membuat akun atau tidak menggunakannya. Karena ia tidak membuat akun, kami terpaksa harus memakai alamat IP-nya untuk mengenalinya. Alamat IP seperti ini dapat dipakai oleh beberapa pengguna yang berbeda. Jika Anda adalah seorang pengguna anonim dan merasa mendapatkan komentar-komentar miring, silakan [[{{ns:special}}:Userlogin|membuat akun atau masuk log]] untuk menghindari kerancuan dengan pengguna anonim lain di lain waktu.''",
'noarticletext' => 'Saat ini tidak ada teks dalam halaman ini. Anda dapat [[{{ns:special}}:Search/{{PAGENAME}}|melakukan pencarian untuk judul halaman ini]] di halaman-halaman lain atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} sunting halaman ini].',
@@ -527,9 +554,20 @@ Alamat IP Anda adalah $3. Sertakan alamat IP ini pada setiap pertanyaan yang And
"protectedpagewarning" => "<strong>PERINGATAN: Halaman ini telah dikunci sehingga hanya pemakai dengan hak akses pengurus saja yang dapat menyuntingnya.</strong>",
'semiprotectedpagewarning' => "'''Catatan:''' Halaman ini sedang dilindungi, sehingga hanya pengguna terdaftar yang bisa menyuntingnya.",
'templatesused' => 'Templat yang digunakan di halaman ini:',
+'templatesusedpreview' => 'Templat yang digunakan di pratayang ini:',
+'templatesusedsection' => 'Templat yang digunakan di bagian ini:',
+'template-protected' => '(dilindungi)',
+'template-semiprotected' => '(semi-perlindungan)',
'edittools' => '<!-- Teks di sini akan dimunculkan dibawah isian suntingan dan pemuatan.-->',
'nocreatetitle' => 'Pembuatan halaman baru dibatasi',
'nocreatetext' => 'Situs ini membatasi kemampuan membuat halaman baru. Anda dapat kembali dan menyunting halaman yang telah ada, atau silakan [[{{ns:special}}:Userlogin|masuk log atau mendaftar]]',
+
+# "Undo" feature
+'undo-success' => 'Suntingan ini telah dibatalkan. Tolong konfirmasi dan simpan perubahan di bawah.',
+'undo-failure' => 'Suntingan ini tidak dapat dibatalkan karena konflik penyuntingan antara.',
+'undo-summary' => 'Pembatalan revisi $1 by [[Special:Contributions/$2]] ([[User talk:$2]])',
+
+# Account creation failure
'cantcreateaccounttitle' => 'Akun tak dapat dibuat',
'cantcreateaccounttext' => 'Pembuatan akun dari alamat IP ini (<b>$1</b>) diblokir.
Hal ini mungkin disebabkan adanya vandalisme berulang yang berasal dari sekolah atau penyedia jasa Internet Anda.',
@@ -544,7 +582,7 @@ Hal ini mungkin disebabkan adanya vandalisme berulang yang berasal dari sekolah
"loadhist" => "Memuat halaman sejarah",
"currentrev" => "Revisi sekarang",
"revisionasof" => "Revisi per $1",
-'old-revision-navigation' => 'Revisi per $1; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'Revisi per $1; $2',
'previousrevision' => '↠Revisi sebelumnya',
'nextrevision' => 'Revisi selanjutnya →',
'currentrevisionlink' => 'Revisi sekarang',
@@ -594,6 +632,8 @@ Pengurus lain akan dapat mengakses isi tersebunyi dan dapat membatalkan penghapu
'selectnewerversionfordiff' => 'Pilih sebuah versi yang lebih baru untuk perbandingan',
'selectolderversionfordiff' => 'Pilih sebuah versi yang lebih lama untuk perbandingan',
'compareselectedversions' => 'Bandingkan versi terpilih',
+'editundo' => 'batalkan',
+'diff-multi' => "({{plural:$1|Satu|$1}} revisi antara tak ditampilkan.)",
# Search results
#
@@ -709,6 +749,7 @@ Pengurus lain akan dapat mengakses isi tersebunyi dan dapat membatalkan penghapu
"recentchanges" => "Perubahan terbaru",
'recentchangestext' => 'Temukan perubahan terbaru dalam wiki di halaman ini.,',
+'recentchanges-feed-description' => 'Temukan perubahan terbaru dalam wiki di asupan ini.',
'rcnote' => "Di bawah ini adalah <strong>$1</strong> perubahan terbaru dalam <strong>$2</strong> hari terakhir sampai $3.",
"rcnotefrom" => "Di bawah ini adalah perubahan sejak <strong>$2</strong> (ditampilkan sampai <strong>$1</strong> perubahan).",
"rclistfrom" => "Perlihatkan perubahan terbaru sejak $1",
@@ -755,7 +796,7 @@ Untuk menampilkan atau menyertakan berkas atau gambar pada suatu halaman, gunaka
'fileuploadsummary' => 'Ringkasan:',
"filestatus" => "Status hak cipta",
"filesource" => "Sumber",
-"copyrightpage" => "Project:Hak cipta",
+"copyrightpage" => "{{NS:PROJECT}}:Hak cipta",
"copyrightpagename" => "Hak cipta {{SITENAME}}",
"uploadedfiles" => "Berkas yang telah dimuat",
'ignorewarning' => 'Abaikan peringatan dan langsung simpan berkas.',
@@ -764,7 +805,7 @@ Untuk menampilkan atau menyertakan berkas atau gambar pada suatu halaman, gunaka
'illegalfilename' => 'Nama berkas "$1" mengandung aksara yang tidak diperbolehkan ada dalam judul halaman. Silakan ubah nama berkas tersebut dan cobalah memuatkannya kembali.',
"badfilename" => "Nama berkas telah diubah menjadi \"$1\".",
"badfiletype" => "\".$1\" adalah format berkas yang tidak diizinkan.",
-'largefile' => 'Ukuran berkas disarankan untuk tidak melebihi $1 bita; berkas ini berukuran $2 bita',
+'large-file' => 'Ukuran berkas disarankan untuk tidak melebihi $1 bita; berkas ini berukuran $2 bita.',
'largefileserver' => 'Berkas ini lebih besar dari pada yang diizinkan server.',
'emptyfile' => 'Berkas yang Anda muatkan kelihatannya kosong. Hal ini mungkin disebabkan karena adanya kesalahan ketik pada nama berkas. Silakan pastikan apakah Anda benar-benar ingin memuatkan berkas ini.',
'fileexists' => 'Berkas dengan nama tersebut telah ada, harap periksa $1 jika Anda tidak yakin untuk mengubahnya.',
@@ -785,6 +826,17 @@ Untuk menampilkan atau menyertakan berkas atau gambar pada suatu halaman, gunaka
'watchthisupload' => 'Pantau halaman ini',
'filewasdeleted' => 'Suatu berkas dengan nama ini pernah dimuat dan selanjutnya dihapus. Harap cek $1 sebelum memuat lagi berkas tersebut.',
+'upload-proto-error' => 'Protokol tak tepat',
+'upload-proto-error-text' => 'Pemuatan jarak jauh membutuhkan URL yang diawali dengan <code>http://</code> atau <code>ftp://</code>.',
+'upload-file-error' => 'Kesalahan internal',
+'upload-file-error-text' => 'Suatu kesalahan internal terjadi sewaktu mencoba membuat berkas temporer di server. Silakan kontak administrator sistem.',
+'upload-misc-error' => 'Kesalahan pemuatan yang tak dikenal',
+'upload-misc-error-text' => 'Suatu kesalahan yang tak dikenal terjadi sewaktu pemuatan. Harap pastikan bahwa URL tersebut valid dan dapat diakses dan silakan coba lagi. Jika masalah ini tetap terjadi, kontak administrator sistem.',
+'upload-curl-error6' => "URL tidak dapat dihubungi",
+'upload-curl-error6-text' => 'URL yang diberikan tak dapat dihubungi. Harap periksa ulang bahwa URL tersebut tepat dan situs itu sedang aktif.',
+'upload-curl-error28' => 'Pemuatan lewat waktu',
+'upload-curl-error28-text' => 'Situs yang dituju terlalu lambat merespon. Tolong cek apakah situs tersebut aktif, tunggu sebentar, dan coba lagi. Mungkin Anda perlu mencobanya di saat yang lebih longgar.',
+
'license' => 'Jenis lisensi',
'nolicense' => 'Belum dipilih',
'upload_source_url' => ' (suatu URL valid yang dapat diakses publik)',
@@ -793,7 +845,7 @@ Untuk menampilkan atau menyertakan berkas atau gambar pada suatu halaman, gunaka
# Image list
#
"imagelist" => "Daftar berkas",
-'imagelisttext' => "Di bawah ini adalah daftar '''$1''' {{plural:$1|berkas|berkas}} diurutkan $2.",
+'imagelisttext' => "Di bawah ini adalah daftar '''$1''' berkas diurutkan $2.", # no need for plural
'imagelistforuser' => "Hanya berkas yang dimuat oleh $1.",
"getimagelist" => "mengambil daftar berkas",
"ilsubmit" => "Cari",
@@ -836,6 +888,9 @@ Untuk menampilkan atau menyertakan berkas atau gambar pada suatu halaman, gunaka
#
'unwatchedpages' => 'Halaman yang tak dipantau',
+# List interwikis
+'listinterwikis' => 'Daftar interwiki',
+
# List redirects
'listredirects' => 'Daftar pengalihan',
@@ -898,7 +953,6 @@ Ada sejumlah '''$3''' penampilan halaman, dan sejumlah '''$4''' penyuntingan sej
'mostimages' => 'Berkas yang tersering digunakan',
'mostrevisions' => 'Artikel dengan perubahan terbanyak',
"allpages" => "Semua halaman",
-'nextpage' => 'Halaman selanjutnya ($1)',
'prefixindex' => 'Indeks awalan',
"randompage" => "Halaman sembarang",
"shortpages" => "Halaman pendek",
@@ -920,15 +974,21 @@ Ada sejumlah '''$3''' penampilan halaman, dan sejumlah '''$4''' penyuntingan sej
"unusedimagestext" => "<p>Perhatikan bahwa situs web lain mungkin dapat berpaut ke sebuah berkas secara langsung, dan berkas-berkas seperti itu mungkin terdapat dalam daftar ini meskipun masih digunakan oleh situs web lain.",
'unusedcategoriestext' => 'Kategori berikut ada walaupun tidak ada artikel atau kategori lain yang menggunakannya.',
-"booksources" => "Sumber buku",
+
+# Book sources
+'booksources' => 'Sumber buku',
+'booksources-summary' => '',
+'booksources-search-legend' => 'Cari di sumber buku',
+'booksources-isbn' => 'ISBN:',
+'booksources-go' => 'Cari',
+'booksources-text' => 'Di bawah ini adalah daftar pranala ke situs lain yang menjual buku baru dan bekas, dan mungkin juga mempunyai informasi lebih lanjut mengenai buku yang sedang Anda cari:',
+
'categoriespagetext' => 'Kategori-kategori berikut ada dalam wiki.',
'data' => 'Data',
'userrights' => 'Manajemen hak pengguna',
'groups' => 'Grup pengguna',
-"booksourcetext" => "Di bawah ini adalah daftar pranala ke situs lain yang menjual buku baru dan bekas, dan mungkin juga mempunyai informasi lebih lanjut mengenai buku yang sedang Anda cari. {{SITENAME}} tidak berkepentingan dengan situs-situs web di atas, dan daftar ini seharusnya tidak dianggap sebagai sebuah dukungan.",
-"isbn" => "ISBN",
-
+"isbn" => "ISBN",
"alphaindexline" => "$1 ke $2",
"version" => "Versi",
'log' => 'Log',
@@ -937,7 +997,8 @@ Ada sejumlah '''$3''' penampilan halaman, dan sejumlah '''$4''' penyuntingan sej
# Special:Allpages
-'nextpage' => 'Halaman berikutnya ($1)',
+'nextpage' => 'Halaman selanjutnya ($1)',
+'prevpage' => 'Halaman sebelumnya ($1)',
'allpagesfrom' => 'Tampilkan halaman dimulai dengan:',
'allarticles' => 'Semua artikel',
'allinnamespace' => 'Semua halaman (ruang nama $1)',
@@ -960,7 +1021,7 @@ Ada sejumlah '''$3''' penampilan halaman, dan sejumlah '''$4''' penyuntingan sej
"emailpage" => "Kirimi pengguna ini surat-e",
"emailpagetext" => "Jika pengguna ini memasukkan alamat surat-e yang sah dalam preferensinya, formulir dibawah ini akan mengirimkan sebuah surat-e. Alamat surat-e yg terdapat pada preferensi Anda akan muncul sebagai alamat \"Dari\" dalam surat-e tersebut, sehingga penerima dapat membalas surat-e tersebut.",
-"usermailererror" => "Kesalahan obyek surat:",
+"usermailererror" => "Kesalahan objek surat:",
"defemailsubject" => "Surat-e {{SITENAME}}",
"noemailtitle" => "Tidak ada alamat surat-e",
@@ -971,6 +1032,8 @@ Ada sejumlah '''$3''' penampilan halaman, dan sejumlah '''$4''' penyuntingan sej
"emailsubject" => "Perihal",
"emailmessage" => "Pesan",
"emailsend" => "Kirim",
+'emailccme' => 'Kirimi saya salinan pesan saya.',
+'emailccsubject'=> 'Salinan pesan Anda untuk $1: $2',
"emailsent" => "Surat-e terkirim",
"emailsenttext" => "Surat-e Anda telah dikirimkan.",
@@ -1012,9 +1075,16 @@ Ada sejumlah '''$3''' penampilan halaman, dan sejumlah '''$4''' penyuntingan sej
"wlnote" => "Di bawah ini adalah daftar $1 perubahan terakhir dalam <strong>$2</strong> jam terakhir.",
"wlshowlast" => "Tampilkan $1 jam $2 hari $3 terakhir",
"wlsaved" => "Ini adalah versi tersimpan dari daftar pantauan Anda.",
-'wlhideshowown' => '$1 suntingan saya',
-'wlhideshowbots' => '$1 suntingan bot',
+'watchlist-show-bots' => 'Tampilkan suntingan bot',
+'watchlist-hide-bots' => 'Sembunyikan suntingan bot',
+'watchlist-show-own' => 'Tampilkan suntingan saya',
+'watchlist-hide-own' => 'Sembunyikan suntingan saya',
+'watchlist-show-minor' => 'Tampilkan suntingan kecil',
+'watchlist-hide-minor' => 'Sembunyikan suntingan kecil',
'wldone' => 'Selesai.',
+# Displayed when you click the "watch" button and it's in the process of watching
+'watching' => 'Memantau...',
+'unwatching' => 'Menghilangkan pemantauan...',
'enotif_mailer' => 'Pengirim Notifikasi {{SITENAME}}',
'enotif_reset' => 'Tandai semua halaman sebagai telah dikunjungi',
@@ -1052,7 +1122,7 @@ Masukan dan bantuan lanjutan:
"deletepage" => "Hapus halaman",
"confirm" => "Konfirmasikan",
"excontent" => "isi sebelumnya: '$1'",
-'excontentauthor' => "isinya hanya berupa: '$1' (dan satu-satunya penyumbang adalah '$2')",
+'excontentauthor' => "isinya hanya berupa: '$1' (dan satu-satunya penyumbang adalah '[[Special:Contributions/$2|$2]]')",
"exbeforeblank" => "isi sebelum dikosongkan: '$1'",
"exblank" => "halaman kosong",
"confirmdelete" => "Konfirmasi penghapusan",
@@ -1073,12 +1143,12 @@ Masukan dan bantuan lanjutan:
"rollbacklink" => "kembalikan",
"rollbackfailed" => "Pengembalian gagal dilakukan",
"cantrollback" => "Tidak dapat mengembalikan suntingan; pengguna terakhir adalah satu-satunya penulis artikel ini.",
-"alreadyrolled" => "Tidak dapat melakukan pengembalian ke suntingan terakhir [[$1]] oleh [[{{ns:user}}:$2|$2]] ([[{{ns:user_talk}}:$2|Bicara]]); orang lain telah menyunting atau melakukan pengembalian terhadap artikel tersebut. Suntingan terakhir oleh [[{{ns:user}}:$3|$3]] ([[{{ns:user_talk}}:$3|Bicara]]).",
+"alreadyrolled" => "Tidak dapat melakukan pengembalian ke suntingan terakhir [[:$1]] oleh [[{{ns:user}}:$2|$2]] ([[{{ns:user_talk}}:$2|Bicara]]); orang lain telah menyunting atau melakukan pengembalian terhadap artikel tersebut. Suntingan terakhir oleh [[{{ns:user}}:$3|$3]] ([[{{ns:user_talk}}:$3|Bicara]]).",
"editcomment" => "Komentar penyuntingan adalah: \"<em>$1</em>\".",
'revertpage' => "Suntingan [[{{ns:special}}:Contributions/$2|$2]] ([[{{ns:user_talk}}:$2|Bicara]]) dikembalikan ke versi terakhir oleh [[{{ns:user}}:$1|$1]]",
'sessionfailure' => 'Sepertinya ada masalah dengan sesi log anda; log anda telah dibatalkan untuk mencegah pembajakan. Silahkan tekan tombol "back" dan muat kembali halaman sebelum anda masuk, lalu coba lagi.',
"protectlogpage" => "Log perlindungan",
-"protectlogtext" => "Di bawah ini adalah daftar log perlindungan dan penghilangan perlindungan halaman.",
+"protectlogtext" => "Di bawah ini adalah log perlindungan dan penghilangan perlindungan halaman.",
"protectedarticle" => "melindungi [[$1]]",
"unprotectedarticle" => "menghilangkan perlindungan [[$1]]",
"protectsub" =>"(Melindungi \"$1\")",
@@ -1108,9 +1178,10 @@ Masukan dan bantuan lanjutan:
"undeletepagetext" => "Halaman-halaman berikut ini telah dihapus tapi masih ada di dalam arsip dan dapat dikembalikan. Arsip tersebut mungkin akan dibersihkan secara berkala.",
'undeleteextrahelp' => "Untuk mengembalikan keseruhan halaman, biarkan seluruh ''check box'' tidak terpilih dan klik '''''Restore'''''. Untuk melakukan pengembalian seletif, cek kotak revisi yang diinginkan dan klik '''''Restore'''''. Menekan tombol '''''Reset''''' akan mengosongkan isian komentar dan semua ''cek box''",
"undeletearticle" => "Kembalikan halaman yang telah dihapus",
-"undeleterevisions" => "$1 revisi diarsipkan",
"undeletehistory" => "Jika Anda mengembalikan halaman tersebut, semua revisi akan dikembalikan ke dalam sejarah. Jika sebuah halaman baru dengan nama yang sama telah dibuat sejak penghapusan, revisi yang telah dikembalikan akan kelihatan dalam sejarah dahulu, dan revisi terkini halaman tersebut tidak akan ditimpa secara otomatis.",
'undeletehistorynoadmin' => 'Artikel ini telah dihapus. Alasan penghapusan diberikan pada ringkasan di bawah ini, berikut detil pengguna yang telah melakukan penyuntingan pada halaman ini sebelum dihapus. Isi terakhir dari revisi yang telah dihapus ini hanya tersedia untuk pengurus.',
+"undeleterevisions" => "$1 revisi diarsipkan",
+'undeleterevision-missing' => "Revisi salah atau tak ditemukan. Anda mungkin mengikuti pranala yang salah, atau revisi tersebut telah dipulihkan atau dibuang dari arsip.",
"undeleterevision" => "Revisi yang telah dihapus per $1",
'undeletebtn' => "Kembalikan!",
'undeletereset' => 'Reset',
@@ -1130,26 +1201,28 @@ Lihat [[{{ns:special}}:Log/delete|log penghapusan]] untuk data penghapusan dan p
# Contributions
#
-"contributions" => "Sumbangan pengguna",
-"mycontris" => "Sumbangan saya",
-"contribsub" => "Untuk $1",
-"nocontribs" => "Tidak ada perubahan yang cocok dengan kriteria-kriteria ini.",
-"ucnote" => "Di bawah ini adalah <strong>$1</strong> perubahan terakhir pengguna dalam <strong>$2</strong> hari terakhir.",
-"uclinks" => "Tampilkan $1 perubahan terbaru; tampilkan $2 hari terakhir",
-"uctop" => " (atas)" ,
-'newbies' => 'pengguna baru',
-
-'sp-newimages-showfrom' => 'Tampilkan berkas baru dimulai dari $1',
+'contributions' => 'Sumbangan pengguna',
+'mycontris' => 'Sumbangan saya',
+'contribsub' => "Untuk $1",
+'nocontribs' => 'Tidak ada perubahan yang sesuai dengan kriteria tersebut.',
+'ucnote' => "Berikut adalah <b>$1</b> suntingan terakhir pengguna ini dalam <b>$2</b> hari terakhir.",
+'uclinks' => "Menampilkan $1 perubahan terakhir; menampilkan $2 hari terakhir.",
+'uctop' => ' (atas)' ,
+'newbies' => 'pengguna baru',
'sp-contributions-newest' => 'Terbaru',
'sp-contributions-oldest' => 'Terlama',
-'sp-contributions-newer' => 'Lebih baru $1',
-'sp-contributions-older' => 'Lebih lama $1',
+'sp-contributions-newer' => '$1 terbaru',
+'sp-contributions-older' => '$1 terlama',
'sp-contributions-newbies-sub' => 'Untuk pengguna baru',
+'sp-contributions-blocklog' => 'Log pemblokiran',
+
+'sp-newimages-showfrom' => 'Tampilkan berkas baru dimulai dari $1',
# What links here
#
"whatlinkshere" => "Pranala ke halaman ini",
+'whatlinkshere-barrow' => '&lt;',
"notargettitle" => "Tidak ada sasaran",
"notargettext" => "Anda tidak menentukan halaman atau pengguna tujuan fungsi ini.",
"linklistsub" => "(Daftar pranala)",
@@ -1161,13 +1234,14 @@ Lihat [[{{ns:special}}:Log/delete|log penghapusan]] untuk data penghapusan dan p
# Block/unblock IP
#
"blockip" => "Blokir IP",
-"blockiptext" => "Gunakan formulir di bawah untuk memblokir kemampuan menulis sebuah alamat IP atau pengguna tertentu. Ini perlu dilakukan untuk mencegah vandalisme, dan sejalan dengan [[{{ns:project}}:Kebijakan|kebijakan {{SITENAME}}]]. Masukkan alasan Anda di bawah (contohnya mengambil halaman tertentu yang telah dirusak).",
+"blockiptext" => "Gunakan formulir di bawah untuk memblokir kemampuan menulis sebuah alamat IP atau pengguna tertentu. Ini perlu dilakukan untuk mencegah vandalisme, dan sejalan dengan [[{{ns:project}}:Kebijakan|kebijakan {{SITENAME}}]]. Masukkan alasan Anda di bawah (contohnya mengambil halaman tertentu yang telah dirusak). Untuk daftar pengguna dan alamat yang diblokir, lihat [[{{ns:special}}:Ipblocklist|halaman ini]].",
"ipaddress" => "Alamat IP",
'ipadressorusername' => 'Alamat IP atau nama pengguna',
"ipbexpiry" => "Kadaluwarsa",
"ipbreason" => "Alasan",
'ipbanononly' => 'Hanya blokir pengguna anonim',
'ipbcreateaccount' => 'Cegah pembuatan akun',
+'ipbenableautoblock' => 'Blokir alamat IP terakhir yang digunakan pengguna ini secara otomatis, dan semua alamat berikutnya yang mereka coba gunakan untuk menyunting.',
"ipbsubmit" => "Kirimkan",
'ipbother' => 'Waktu lain',
'ipboptions' => '2 jam:2 hours,1 hari:1 day,3 hari:3 days,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 tahun:1 year,selamanya:infinite',
@@ -1184,6 +1258,7 @@ Lihat [[{{ns:special}}:Log/delete|log penghapusan]] untuk data penghapusan dan p
'infiniteblock' => 'tak terbatas',
'expiringblock' => 'kadaluwarsa $1',
'anononlyblock' => 'hanya anon',
+'noautoblockblock' => 'pemblokiran otomatis dimatikan',
'createaccountblock' => 'pembuatan akun diblokir',
'ipblocklistempty' => 'Daftar pemblokiran kosong.',
"blocklink" => "blokir",
@@ -1263,6 +1338,7 @@ Dalam kasus tersebut, apabila diinginkan, Anda dapat memindahkan atau menggabung
"movenologin" => "Belum masuk log",
"movenologintext" => "Anda harus menjadi pengguna terdaftar dan telah [[{{ns:special}}:Userlogin|masuk log]] untuk memindahkan halaman.",
"newtitle" => "Ke judul baru",
+'move-watch' => 'Pantau halaman ini',
"movepagebtn" => "Pindahkan halaman",
"pagemovedsub" => "Pemindahan berhasil",
"pagemovedtext" => "<div class=\"plainlinks\">Halaman \"[{{fullurl:<includeonly></includeonly>$1|redirect=no}} $1]\" dipindahkan ke \"[[$2]]\". Jangan lupa untuk memperbaiki [[{{ns:special}}:Whatlinkshere/$1|pengalihan ganda]] yang mungkin terjadi.</div>",
@@ -1344,8 +1420,8 @@ Jika Anda hanya ingin mengimpor versi sekarang, Anda juga dapat melakukan hal in
# import log
'importlogpage' => 'Log impor',
-'importlogpagetext' => 'Di bawah ini adalah log import administratif dari halaman-halaman berikut riwayat suntingannya dari wiki lain.',
-'import-logentry-upload' => 'mengimpor $1 melalui pemuatan berkas',
+'importlogpagetext' => 'Di bawah ini adalah log impor administratif dari halaman-halaman, berikut riwayat suntingannya dari wiki lain.',
+'import-logentry-upload' => 'mengimpor [[$1]] melalui pemuatan berkas',
'import-logentry-upload-detail' => '$1 versi terdahulu',
'import-logentry-interwiki' => 'men-transwiki $1',
'import-logentry-interwiki-detail' => '$1 versi terdahulu dari $2',
@@ -1370,8 +1446,8 @@ Jika Anda hanya ingin mengimpor versi sekarang, Anda juga dapat melakukan hal in
# stylesheets
-'Common.css' => '/** CSS yang berada di sini akan diterapkan untuk semua kulit */',
-'Monobook.css' => '/* CSS yang berada di sini akan mempengaruhi semua pengguna yang menggunakan kulit Monobook */',
+'common.css' => '/** CSS yang berada di sini akan diterapkan untuk semua kulit */',
+'monobook.css' => '/* CSS yang berada di sini akan mempengaruhi semua pengguna yang menggunakan kulit Monobook */',
# Metadata
"nodublincore" => "Metadata Dublin Core RDF dimatikan di server ini.",
@@ -1395,8 +1471,9 @@ Jika Anda hanya ingin mengimpor versi sekarang, Anda juga dapat melakukan hal in
'spamprotectiontitle' => 'Filter pencegah spam',
'spamprotectiontext' => 'Halaman yang ingin Anda simpan diblokir oleh filter spam. Ini mungkin disebabkan oleh pranala ke situs luar.',
'spamprotectionmatch' => 'Teks berikut ini memancing filter spam kami: $1',
-'subcategorycount' => "Ada $1 subkategori dalam kategori ini.", # no need for plural
-'categoryarticlecount' => "Ada $1 artikel dalam kategori ini.", # no need for plural
+'subcategorycount' => "Ada $1 subkategori dalam kategori ini.",
+'categoryarticlecount' => "Ada $1 artikel dalam kategori ini.",
+'category-media-count' => "Ada $1 berkas dalam kategori ini.",
'listingcontinuesabbrev' => " samb.",
'spambot_username' => 'Pembersihan span MediaWiki',
'spam_reverting' => 'Mengembalikan ke versi terakhir yang tak memiliki pranala ke $1',
@@ -1427,9 +1504,10 @@ Jika Anda hanya ingin mengimpor versi sekarang, Anda juga dapat melakukan hal in
'rcpatroldisabledtext' => "Fitur patroli perubahan terbaru sedang dimatikan.",
'markedaspatrollederror' => "Tidak dapat menandai telah dipatroli",
'markedaspatrollederrortext' => "Anda harus menentukan satu revisi untuk ditandai sebagai yang dipatroli.",
+'markedaspatrollederror-noautopatrol' => 'Anda tidak diizinkan menandai suntingan Anda sendiri dipatroli.',
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* bantuan peralatan dan kunci akses */
+'monobook.js' => '/* bantuan peralatan dan kunci akses */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Halaman pengguna saya\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Halaman pengguna IP Anda\');
@@ -1440,7 +1518,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Daftar halaman yang Anda pantau.\');
ta[\'pt-mycontris\'] = new Array(\'y\',\'Daftar sumbangan saya\');
ta[\'pt-login\'] = new Array(\'o\',\'Anda disarankan untuk masuk log, meskipun hal itu tidak diwajibkan.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Anda disarankan untuk masuk log, meskipun hal itu tidak diwajibkan.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Keluar log\');
+ta[\'pt-logout\'] = new Array(\'\',\'Keluar log\');
ta[\'ca-talk\'] = new Array(\'t\',\'Diskusi tentang artikel\');
ta[\'ca-edit\'] = new Array(\'e\',\'Anda dapat menyunting halaman ini. Silakan gunakan tombol pratayang sebelum menyimpan.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Tambahkan komentar ke diskusi ini.\');
@@ -1480,6 +1558,9 @@ ta[\'ca-nstab-template\'] = new Array(\'c\',\'Lihat templat\');
ta[\'ca-nstab-help\'] = new Array(\'c\',\'Lihat halaman bantuan\');
ta[\'ca-nstab-category\'] = new Array(\'c\',\'Lihat halaman kategori\');',
+# Common.js: contains nothing but a placeholder comment
+'common.js' => '/* Semua JavaScript yang ada di sini akan dimuat untuk semua pengguna pada semua halaman. */',
+
# image deletion
'deletedrevision' => 'Revisi lama yang dihapus $1.',
@@ -1494,6 +1575,7 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'Lihat halaman kategori\');',
'newimages' => 'Galeri berkas baru',
'showhidebots' => '($1 bot)',
'noimages' => 'Tidak ada yang dilihat.',
+'sp-newimages-showfrom' => 'Tampilkan berkas baru dimulai dari $1',
# short names for language variants used for language conversion links.
# to disable showing a particular link, set it to 'disable', e.g.
@@ -1597,19 +1679,19 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'Lihat halaman kategori\');',
'exif-brightnessvalue' =>'Brightness',
'exif-exposurebiasvalue' =>'Bias pajanan',
'exif-maxaperturevalue' =>'Maximum land aperture',
-'exif-subjectdistance' =>'Jarak subyek',
+'exif-subjectdistance' =>'Jarak subjek',
'exif-meteringmode' =>'Metering mode',
'exif-lightsource' =>'Sumber cahaya',
'exif-flash' =>'Flash',
'exif-focallength' =>'Lens focal length',
'exif-focallength-format' =>'$1 mm',
-'exif-subjectarea' =>'Wilayah subyek',
+'exif-subjectarea' =>'Wilayah subjek',
'exif-flashenergy' =>'Flash energy',
'exif-spatialfrequencyresponse' =>'Respons frekuensi spasial',
'exif-focalplanexresolution' =>'Resolusi focal plane X',
'exif-focalplaneyresolution' =>'Resolusi focal plane Y',
'exif-focalplaneresolutionunit' =>'Unit resolusi focal plane',
-'exif-subjectlocation' =>'Lokasi subyek',
+'exif-subjectlocation' =>'Lokasi subjek',
'exif-exposureindex' =>'Indeks pajanan',
'exif-sensingmethod' =>'Metode sensing',
'exif-filesource' =>'Sumber berkas',
@@ -1626,7 +1708,7 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'Lihat halaman kategori\');',
'exif-saturation' =>'Saturasi',
'exif-sharpness' =>'Ketajaman',
'exif-devicesettingdescription' =>'Deskripsi pengaturan alat',
-'exif-subjectdistancerange' =>'Jarak subyek',
+'exif-subjectdistancerange' =>'Jarak subjek',
'exif-imageuniqueid' =>'ID unik gambar',
'exif-gpsversionid' =>'Versi tag GPS',
'exif-gpslatituderef' =>'Lintang Utara atau Selatan',
@@ -1665,6 +1747,8 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'Lihat halaman kategori\');',
'exif-compression-1' => 'Tak terkompresi',
'exif-compression-6' => 'JPEG',
+'exif-unknowndate' => 'Tanggal tak diketahui',
+
'exif-photometricinterpretation-2' => 'RGB',
'exif-photometricinterpretation-6' => 'YCbCr',
@@ -1827,9 +1911,11 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'Lihat halaman kategori\');',
'confirmemail' => 'Konfirmasi alamat surat-e',
'confirmemail_noemail' => 'Anda tidak memberikan alamat surat-e yang sah di [[Special:Preferences|preferensi pengguna]] Anda.',
'confirmemail_text' => "{{ns:project}} mengharuskan Anda untuk melakukan konfirmasi atas alamat surat elektronik Anda sebelum fitur-fitur surat elektronik dapat digunakan. Tekan tombol di bawah ini untuk mengirimi Anda sebuah surat elektronik yang berisi kode konfirmasi yang berupa sebuah alamat internet. Salin alamat tersebut ke penjelajah web Anda dan buka alamat tersebut untuk melakukan konfirmasi sehingga menginformasikan {{ns:project}} bahwa alamat surat elektronik Anda valid.",
+'confirmemail_pending' => '<div class="error">Suatu kode konfirmasi telah dikirimkan kepada Anda; jika Anda baru saja membuat akun Anda, silakan tunggu beberapa menit untuk surat tersebut tiba sebelum mencoba untuk meminta satu kode baru.</div>',
'confirmemail_send' => 'Kirim kode konfirmasi',
'confirmemail_sent' => 'Surat elektronik berisi kode konfirmasi telah dikirim.',
-'confirmemail_sendfailed' => 'Surat-e konfirmasi tidak berhasil dikirim. Harap cek kemungkinan karakter ilegal pada alamat surat-e.',
+'confirmemail_oncreate' => 'Suatu kode konfirmasi telah dikirimkan ke alamat surat-e Anda. Kode ini tidak dibutuhkan untuk masuk log, tapi dibutuhkan sebelum menggunakan semua fitur yang menggunakan surat-e di wiki ini.',
+'confirmemail_sendfailed' => 'Surat-e konfirmasi tidak berhasil dikirim. Harap cek kemungkinan karakter ilegal pada alamat surat-e. Pengirim menginformasikan: $1',
'confirmemail_invalid' => 'Kode konfirmasi salah. Kode tersebut mungkin sudah kadaluwarsa.',
'confirmemail_needlogin' => 'Anda harus melakukan $1 untuk mengkonfirmasikan alamat surat-e Anda.',
'confirmemail_success' => 'Alamat surat-e Anda telah dikonfirmasi. Sekarang Anda dapat masuk log dan mulai menggunakan wiki.',
@@ -1886,7 +1972,7 @@ $1",
'confirm_purge_button' => 'OK',
'youhavenewmessagesmulti' => "Anda mendapat pesan-pesan baru $1",
-'newtalkseperator' => ',_',
+
'searchcontaining' => "Mencari artikel yang mengandung ''$1''.",
'searchnamed' => "Mencari artikel yang berjudul ''$1''.",
'articletitles' => "Artikel yang diawali ''$1''",
@@ -1914,6 +2000,12 @@ $1",
'table_pager_limit_submit' => 'Cari',
'table_pager_empty' => 'Tidak ditemukan',
+# Auto-summaries
+'autosumm-blank' => 'Menghapus semua isi dari halaman',
+'autosumm-replace' => 'Mengganti halaman dengan \'$1\'',
+'autoredircomment' => 'Alihkan ke [[$1]]',
+'autosumm-new' => 'Halaman baru: $1',
+
);
?>
diff --git a/languages/messages/MessagesIs.php b/languages/messages/MessagesIs.php
index bb9ec927..2aec09a8 100644
--- a/languages/messages/MessagesIs.php
+++ b/languages/messages/MessagesIs.php
@@ -88,12 +88,12 @@ $messages = array(
'1movedto2' => "$1 færð á $2",
'1movedto2_redir' => "$1 færð á $2 yfir tilvísun",
-'Monobook.css' => "
+'monobook.css' => "
/* Stórir stafir í ýmsu */
#p-personal ul { text-transform: inherit; } /* notandanfn, spjall, stillingar */
.portlet h5 { text-transform: inherit;} /* flakk, leit, verkfæri... */
#p-cactions li a {text-transform: inherit;} /* notandasíða, spjall... */",
-'Monobook.js' => "/* tooltips and access keys */
+'monobook.js' => "/* tooltips and access keys */
var ta = new Object();
ta['pt-userpage'] = new Array('.','Notendasíðan mín');
ta['pt-anonuserpage'] = new Array('.','Notendasíðan fyrir IP töluna þína');
@@ -104,7 +104,7 @@ ta['pt-watchlist'] = new Array('l','Vaktlistinn.');
ta['pt-mycontris'] = new Array('y','Listi yfir framlög þín');
ta['pt-login'] = new Array('o','Þú ert hvattur/hvött til að innskrá þig, það er hinsvegar ekki nauðsynlegt.');
ta['pt-anonlogin'] = new Array('o','Þú ert hvattur/hvött til að innskrá þig, það er hinsvegar ekki nauðsynlegt.');
-ta['pt-logout'] = new Array('o','Útskráning');
+ta['pt-logout'] = new Array('','Útskráning');
ta['ca-talk'] = new Array('t','Spallsíða þessarar síðu');
ta['ca-edit'] = new Array('e','Þú getur breytt síðu þessari, vinsamlegast notaðu „forskoða“ hnappinn áður en þú vistar');
ta['ca-addsection'] = new Array('+','Viðbótarumræða.');
@@ -464,6 +464,7 @@ mjög rótækar breytingar á vinsælum síðum og valdið titringi hjá öðrum
'october' => "október",
'oldpassword' => "Gamla lykilorðið",
'otherlanguages' => "à öðrum tungumálum",
+'pagecategories' => "Flokkar",
'pagemovedsub' => "Færsla tókst",
'pagemovedtext' => "Síðan „[[$1]]“ var færð yfir á „[[$2]]“.",
'pagetitle' => "$1 - {{SITENAME}}",
diff --git a/languages/messages/MessagesIt.php b/languages/messages/MessagesIt.php
index 1432a340..105f5516 100644
--- a/languages/messages/MessagesIt.php
+++ b/languages/messages/MessagesIt.php
@@ -64,6 +64,8 @@ $messages = array(
"tog-editwidth" => "Aumenta al massimo la larghezza della casella di modifica",
"tog-watchcreations" => "Aggiungi le pagine create agli osservati speciali",
"tog-watchdefault" => "Aggiungi le pagine modificate agli osservati speciali",
+"tog-watchmoves" => "Aggiungi le pagine spostate agli osservati speciali",
+"tog-watchdeletion" => "Aggiungi le pagine cancellate agli osservati speciali",
"tog-minordefault" => "Indica per default tutte le modifiche come 'minori'",
"tog-previewontop" => "Mostra l'anteprima sopra la casella di modifica",
"tog-previewonfirst" => "Mostra l'anteprima per la prima modifica",
@@ -78,11 +80,12 @@ $messages = array(
"tog-externaldiff" => "Usa per default un programma di diff esterno",
"tog-showjumplinks" => "Attiva i collegamenti accessibili 'vai a'",
"tog-uselivepreview" => "Attiva la funzione ''Live preview'' (richiede JavaScript; sperimentale)",
-"tog-autopatrol" => "Segnala le mie modifiche come già 'verificate'",
"tog-forceeditsummary" => "Chiedi conferma se l'oggetto della modifica è vuoto",
"tog-watchlisthideown" => "Nascondi le mie modifiche negli osservati speciali",
"tog-watchlisthidebots" => "Nascondi le modifiche dei bot negli osservati speciali",
-'wldone' => 'Fatto.',
+"tog-watchlisthideminor" => "Nascondi le modifiche minori negli osservati speciali",
+"tog-nolangconversion" => "Disattiva la conversione tra varianti linguistiche",
+"tog-ccmeonemails" => "Inviami una copia dei messaggi spediti agli altri utenti",
"underline-always" => "Sempre",
"underline-never" => "Mai",
@@ -98,6 +101,13 @@ $messages = array(
'thursday' => 'giovedì',
'friday' => 'venerdì',
'saturday' => 'sabato',
+'sun' => 'dom',
+'mon' => 'lun',
+'tue' => 'mar',
+'wed' => 'mer',
+'thu' => 'gio',
+'fri' => 'ven',
+'sat' => 'sab',
'january' => 'gennaio',
'february' => 'febbraio',
'march' => 'marzo',
@@ -110,6 +120,18 @@ $messages = array(
'october' => 'ottobre',
'november' => 'novembre',
'december' => 'dicembre',
+'january-gen' => 'gennaio',
+'february-gen' => 'febbraio',
+'march-gen' => 'marzo',
+'april-gen' => 'aprile',
+'may-gen' => 'maggio',
+'june-gen' => 'giugno',
+'july-gen' => 'luglio',
+'august-gen' => 'agosto',
+'september-gen' => 'settembre',
+'october-gen' => 'ottobre',
+'november-gen' => 'novembre',
+'december-gen' => 'dicembre',
'jan' => 'gen',
'feb' => 'feb',
'mar' => 'mar',
@@ -125,9 +147,11 @@ $messages = array(
# Bits of text used by many pages:
#
-"categories" => "{{PLURAL:$1|Categoria|Categorie}}",
+"categories" => "Categorie",
+"pagecategories" => "{{PLURAL:$1|Categoria|Categorie}}",
"category_header" => 'Pagine nella categoria "$1"',
"subcategories" => "Sottocategorie",
+"category-media-header" => "File nella categoria \"$1\"",
"mainpage" => "Pagina principale",
"mainpagetext" => "<big>'''Installazione di MediaWiki completata correttamente.'''</big>",
@@ -214,10 +238,14 @@ I seguenti collegamenti sono in lingua inglese:
"talk" => "Discussione",
"views" => "Visite",
"toolbox" => "Strumenti",
-"userpage" => "Vedi la pagina utente",
-"projectpage" => "Vedi la pagina di servizio",
-"imagepage" => "Vedi la pagina di descrizione dell'immagine",
-"viewtalkpage" => "Vedi la pagina di discussione",
+"userpage" => "Visualizza la pagina utente",
+"projectpage" => "Visualizza la pagina di servizio",
+"imagepage" => "Visualizza la pagina di descrizione dell'immagine",
+"mediawikipage" => "Visualizza il messaggio",
+"templatepage" => "Visualizza il template",
+"viewhelppage" => "Visualizza la pagina di aiuto",
+"categorypage" => "Visualizza la categoria",
+"viewtalkpage" => "Visualizza la pagina di discussione",
"otherlanguages" => "Altre lingue",
"redirectedfrom" => "(Redirect da $1)",
"autoredircomment" => "Redirect alla pagina [[$1]]",
@@ -231,6 +259,10 @@ I seguenti collegamenti sono in lingua inglese:
"jumptosearch" => "ricerca",
"badaccess" => "Permessi non sufficienti",
+"badaccess-group0" => "Non si dispone dei permessi necessari per eseguire l'azione richiesta.",
+"badaccess-group1" => "La funzione richiesta è riservata agli utenti che appartengono al gruppo $1.",
+"badaccess-group2" => "La funzione richiesta è riservata agli utenti che appartengono ai gruppi $1.",
+"badaccess-groups" => "La funzione richiesta è riservata agli utenti che appartengono a uno dei seguenti gruppi: $1.",
"versionrequired" => "Versione $1 di MediaWiki richiesta",
"versionrequiredtext" => "Per usare questa pagina è necessario disporre della versione $1 del software MediaWiki. Vedi [[Special:Version]]",
@@ -315,16 +347,17 @@ Si prega di segnalare l'accaduto a un amministratore specificando la URL in ques
"badtitle" => "Titolo non corretto",
"badtitletext" => "Il titolo della pagina richiesta è vuoto, errato o con caratteri non ammessi oppure deriva da un errore nei collegamenti tra siti wiki diversi o versioni in lingue diverse dello stesso sito.",
"perfdisabled" => "Siamo spiacenti, questa funzionalità è temporaneamente disabilitata perché il suo uso rallenta il database fino a rendere il sito inutilizzabile per tutti gli utenti.",
+"perfdisabledsub" => "I dati presentati di seguito risalgono al $1:", # obsolete?
"perfcached" => "I dati che seguono sono estratti da una copia ''cache'' del database, non aggiornati in tempo reale.",
"perfcachedts" => "I dati che seguono sono estratti da una copia ''cache'' del database. Ultimo aggiornamento: $1.",
+"querypage-no-updates" => "Gli aggiornamenti della pagina sono temporaneamente sospesi. I dati in essa contenuti non verranno aggiornati.",
"wrong_wfQuery_params" => "Errore nei parametri inviati alla funzione wfQuery()<br />
Funzione: $1<br />
Query: $2",
"viewsource" => "Vedi sorgente",
"viewsourcefor" => "di $1",
-"protectedtext" => "Questa pagina è stata protetta per impedirne la modifica.
-
-È possibile visualizzare e copiare il codice sorgente di questa pagina:",
+"protectedpagetext" => "Questa pagina è stata protetta per impedirne la modifica.",
+"viewsourcetext" => "È possibile visualizzare e copiare il codice sorgente di questa pagina:",
"protectedinterface" => "Questa pagina contiene un elemento che fa parte dell'interfaccia utente del software; è quindi protetta per evitare possibili abusi.",
"editinginterface" => "'''Attenzione:''' Il testo di questa pagina fa parte dell'interfaccia utente del sito. Tutte le modifiche apportate a questa pagina si riflettono sui messaggi visualizzati per tutti gli utenti.",
"sqlhidden" => "(la query SQL è stata nascosta)",
@@ -398,8 +431,10 @@ Se non sei stato tu a fare la richiesta, oppure hai ritrovato la password e non
"noemail" => "Nessun indirizzo e-mail registrato per l'utente \"$1\".",
"passwordsent" => "Una nuova password è stata inviata all'indirizzo e-mail registrato per l'utente \"$1\".
Per favore, effettua un accesso non appena la ricevi.",
+"blocked-mailpassword" => "Per prevenire abusi, non è consentito usare la funzione \"Invia nuova password\" da un indirizzo IP bloccato.",
"eauthentsent" => "Un messaggio e-mail di conferma è stato spedito all'indirizzo indicato.
Per abilitare l'invio di messaggi e-mail per questo accesso è necessario seguire le istruzioni che vi sono indicate, in modo da confermare che si è i legittimi proprietari dell'indirizzo",
+"throttled-mailpassword" => "Una nuova password è già stata inviata da meno di $1 ore. Per prevenire abusi, la funzione \"Invia nuova password\" può essere usata solo una volta ogni $1 ore.",
"mailerror" => "Errore nell'invio del messaggio: $1",
"acct_creation_throttle_hit" => "Siamo spiacenti, ma hai già creato $1 account. Non puoi crearne altri.",
"emailauthenticated" => "L'indirizzo e-mail è stato confermato il $1.",
@@ -410,6 +445,18 @@ Per abilitare l'invio di messaggi e-mail per questo accesso è necessario seguir
"accountcreated" => "Accesso creato",
"accountcreatedtext" => "È stato creato un accesso per l'utente $1.",
+# Password reset dialog
+"resetpass" => "Reimposta la password",
+"resetpass_announce" => "L'accesso è stato effettuato con un codice temporaneo, inviato via e-mail. Per completare l'accesso è necessario impostare una nuova password:",
+"resetpass_text" => "<!-- Aggiungere il testo qui -->",
+"resetpass_header" => "Reimposta password",
+"resetpass_submit" => "Imposta la password e accedi al sito",
+"resetpass_success" => "La password è stata modificata. Accesso in corso...",
+"resetpass_bad_temporary" => "Password temporanea non valida. La password potrebbe essere stata già cambiata, oppure potrebbe essere stata richiesta una nuova password temporanea.",
+"resetpass_forbidden" => "Non è possibile modificare le password su questo sito",
+"resetpass_missing" => "Dati mancanti nel modulo.",
+
+
# Edit page toolbar
'bold_sample'=>'Grassetto',
'bold_tip'=>'Grassetto',
@@ -437,7 +484,7 @@ Per abilitare l'invio di messaggi e-mail per questo accesso è necessario seguir
"summary" => "Oggetto",
"subject" => "Argomento (intestazione)",
"minoredit" => "Questa è una modifica minore",
-"watchthis" => "Tieni d'occhio questa pagina",
+"watchthis" => "Aggiungi agli osservati speciali",
"savearticle" => "Salva la pagina",
"preview" => "Anteprima",
"showpreview" => "Visualizza anteprima",
@@ -446,13 +493,16 @@ Per abilitare l'invio di messaggi e-mail per questo accesso è necessario seguir
"anoneditwarning" => "'''Attenzione:''' Accesso non effettuato. Nella cronologia della pagina verrà registrato l'indirizzo IP.",
"missingsummary" => "'''Attenzione:''' Non è stato specificato l'oggetto della modifica. Premendo di nuovo 'Salva la pagina' la modifica verrà salvata con l'oggetto vuoto.",
"missingcommenttext" => "Inserire un commento qui sotto.",
+"missingcommentheader" => "'''Attenzione:''' Non è stata specificata l'intestazione di questo commento. Premendo di nuovo '''Salva la pagina''' la modifica verrà salvata senza intestazione.",
+"summary-preview" => "Anteprima oggetto",
+"subject-preview" => "Anteprima oggetto/intestazione",
"blockedtitle" => "Utente bloccato.",
"blockedtext" => "Questo nome utente o indirizzo IP sono stati bloccati da $1.
-La motivazione del blocco è la seguente:<br />:''$2''<br />Se lo desideri, puoi contattare $1 o un altro [[Project:administrators|amministratore]] per discutere del blocco.
+La motivazione del blocco è la seguente:<br />:''$2''<br />Se lo si desidera, è possibile contattare $1 o un altro [[{{ns:Project}}:Administrators|amministratore]] per discutere del blocco.
-Si noti che la funzione 'Scrivi all'utente' non è attiva se non è stato registrato un indirizzo e-mail valido nelle proprie [[Special:Preferences|preferenze]].
+Si noti che la funzione 'Scrivi all'utente' non è attiva se non è stato registrato un indirizzo e-mail valido nelle proprie [[{{ns:Special}}:Preferences|preferenze]].
-Specificare l'indirizzo IP coinvolto ($3) in qualsiasi richiesta di chiarimenti.",
+Si prega di specificare l'indirizzo IP coinvolto ($3) o il numero del blocco (ID #$5) in qualsiasi richiesta di chiarimenti.",
"blockedoriginalsource" => "Di seguito viene mostrato il codice sorgente della pagina '''$1''':",
"blockededitsource" => "Di seguito vengono mostrate le '''modifiche apportate''' alla pagina '''$1''':",
"whitelistedittitle" => "Accesso necessario per la modifica delle pagine",
@@ -486,6 +536,12 @@ Se il collegamento è stato seguito per errore, è sufficiente fare clic sul pul
"previewnote" => "Questa è solo una anteprima; le modifiche alla pagina NON sono ancora state salvate!",
"session_fail_preview" => "<strong>Siamo spiacenti, non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione. Se il problema persiste, si può provare a scollegarsi ed effettuare un nuovo accesso.</strong>",
"previewconflict" => "L'anteprima corrisponde al testo presente nella casella di modifica superiore e rappresenta la pagina come apparirà se si sceglie di premere 'Salva la pagina' in questo momento.",
+"session_fail_preview_html" => "<strong>Siamo spiacenti, non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.</strong>
+
+''Poiché in questo sito è abilitato l'uso di HTML senza limitazioni, l'anteprima non viene visualizzata; si tratta di una misura di sicurezza contro gli attacchi JavaScript.''
+
+<strong>Se il problema persiste, si può provare a scollegarsi ed effettuare un nuovo accesso.</strong>",
+
"importing" => "Importazione di $1",
"editing" => "Modifica di $1",
'editinguser' => "Modifica di $1",
@@ -512,14 +568,28 @@ Con l'invio del testo dichiari inoltre, sotto la tua responsabilità, che il tes
"readonlywarning" => "<strong>ATTENZIONE: Il database è stato bloccato per manutenzione, è quindi impossibile salvare le modifiche in questo momento. Per non perderle, è possibile copiare quanto inserito finora nella casella di modifica, incollarlo in un programma di elaborazione testi e salvarlo in attesa dello sblocco del database.</strong>",
"protectedpagewarning" => "<strong>ATTENZIONE: Questa pagina è stata bloccata in modo che solo gli utenti con privilegi di amministratore possano modificarla.</strong>",
"semiprotectedpagewarning" => "'''Nota:''' Questa pagina è stata bloccata in modo che solo gli utenti registrati possano modificarla.",
-"templatesused" => "Template utilizzati da questa pagina:",
-#"edittools" => "<!-- Testo che appare al di sotto del modulo di modifica e di upload. -->"
+"templatesused" => "Template utilizzati in questa pagina:",
+"templatesusedpreview" => "Template utilizzati in questa anteprima:",
+"templatesusedsection" => "Template utilizzati in questa sezione:",
+"template-protected" => "(protetto)",
+"template-semiprotected" => "(semiprotetto)",
+"edittools" => "<!-- Testo che appare al di sotto del modulo di modifica e di upload. -->",
"nocreatetitle" => "Creazione delle pagine limitata",
"nocreatetext" => "Questo sito ha limitato la possibilità di creare nuove pagine ai soli utenti registrati. È possibile tornare indietro e modificare una pagina esistente, oppure [[Special:Userlogin|entrare o creare un nuovo accesso]].",
+# "Undo" feature
+"undo-success" => "Questa modifica può essere annullata. Verificare il confronto presentato di seguito per accertarsi che il contenuto corrisponda a quanto desiderato e quindi salvare le modifiche per completare la procedura di annullamento.",
+"undo-failure" => "Impossibile annullare la modifica a causa di un conflitto con modifiche intermedie.",
+"undo-summary" => "Annullata la modifica $1 di [[{{ns:Special}}:Contributions/$2]] ([[{{ns:User_talk}}:$2]])",
+
+#Account creation failure
+"cantcreateaccounttitle" => "Impossibile registrare un utente",
+"cantcreateaccounttext" => "La registrazione di nuovi utenti da questo indirizzo IP (<b>$1</b>) è stata bloccata. È possibile che questo indirizzo sia stato usato in passato per compiere vandalismi, causandone il blocco.",
+
# History pages
#
"revhistory" => "Cronologia delle versioni di questa pagina.",
+"viewpagelogs" => "Visualizza i log relativi a questa pagina.",
"nohistory" => "Cronologia delle versioni di questa pagina non reperibile.",
"revnotfound" => "Versione non trovata",
"revnotfoundtext" => "La versione richiesta della pagina non è stata trovata.
@@ -527,6 +597,7 @@ Verificare la URL usata per accedere a questa pagina.",
"loadhist" => "Caricamento cronologia di questa pagina",
"currentrev" => "Versione corrente",
"revisionasof" => "Versione del $1",
+"revision-info" => "Versione del $1, autore: $2",
"previousrevision" => "↠Versione meno recente",
"nextrevision" => "Versione più recente →",
"currentrevisionlink" => "Versione corrente",
@@ -561,6 +632,8 @@ Consultare il [{{fullurl:Special:Log/delete|page={{PAGENAMEE}}}} log di cancella
# Revision deletion
#
"revisiondelete" => "Cancella o ripristina versioni",
+"revdelete-nooldid-title" => "Versione non specificata",
+"revdelete-nooldid-text" => "Non è stata specificata alcuna versione della pagina su cui eseguire questa funzione.",
"revdelete-selected" => "Versioni selezionate di [[:$1]]:",
"revdelete-text" => "Le versioni cancellate restano visibili nella cronologia della pagina, mentre il testo contenuto non è accessibile al pubblico.
@@ -583,12 +656,16 @@ Gli altri amministratori del sito potranno accedere comunque ai contenuti nascos
"selectnewerversionfordiff" => "Seleziona una versione più recente per il confronto",
"selectolderversionfordiff" => "Seleziona una versione meno recente per il confronto",
"compareselectedversions" => "Confronta le versioni selezionate",
+"editundo" => "annulla",
+"diff-multi" => "({{plural:$1|Una revisione intermedia non mostrata|$1 revisioni intermedie non mostrate}}.)",
+
# Search results
#
"searchresults" => "Risultati della ricerca",
"searchresulttext" => "Per maggiori informazioni sulla ricerca interna di {{SITENAME}}, vedi [[Project:Ricerca|Ricerca in {{SITENAME}}]].",
-"searchsubtitle" => "Richiesta \"[[:$1]]\"",
+"searchsubtitle" => "Ricerca di '''[[:$1]]'''",
+"searchsubtitleinvalid" => "Ricerca di '''$1'''",
"badquery" => "Richiesta mal posta",
"badquerytext" => "Impossibile elaborare la richiesta. Questo potrebbe dipendere dall'aver cercato una parola più corta di 4 caratteri, il che al momento è impossibile, oppure da una errore nella forma della richiesta, ad esempio \"pesce and and azzurro\". Per favore, riprova.",
"matchtotals" => "La ricerca di \"$1\" ha trovato $2 riscontri nel titolo e $3 riscontri nel testo.",
@@ -612,6 +689,7 @@ Gli altri amministratori del sito potranno accedere comunque ai contenuti nascos
# Preferences page
#
"preferences" => "Preferenze",
+'mypreferences' => 'le mie preferenze',
"prefsnologin" => "Accesso non effettuato",
"prefsnologintext" => "Per poter personalizzare le preferenze è necessario effettuare l'[[Special:Userlogin|accesso]].",
"prefsreset" => "Le preferenze sono state ripristinate ai valori predefiniti.",
@@ -693,7 +771,8 @@ Gli altri amministratori del sito potranno accedere comunque ai contenuti nascos
#
"changes" => "modifiche",
"recentchanges" => "Ultime modifiche",
-"recentchangestext" => "Questa pagina presenta le ultime modifiche apportate ai contenuti del sito.",
+"recentchangestext" => "Questa pagina presenta le modifiche più recenti ai contenuti del sito.",
+"recentchanges-feed-description" => "Questo feed riporta le modifiche più recenti ai contenuti del sito.",
"rcnote" => "Di seguito sono elencate le <strong>$1</strong> modifiche più recenti apportate negli ultimi <strong>$2</strong> giorni, aggiornate a $3.",
"rcnotefrom" => "Di seguito sono elencate le modifiche apportate a partire da <b>$2</b> (fino a <b>$1</b>).",
"rclistfrom" => "Mostra le modifiche apportate a partire da $1",
@@ -710,6 +789,7 @@ Gli altri amministratori del sito potranno accedere comunque ai contenuti nascos
"show" => "mostra",
"minoreditletter" => "m",
"newpageletter" => "N",
+"boteditletter" => "b",
"sectionlink" => "→",
"number_of_watching_users_pageview" => "[osservata da $1 utenti]",
"rc_categories" => "Limita alle categorie (separate da \"|\")",
@@ -750,7 +830,7 @@ per collegare direttamente gli altri tipi di file.",
"illegalfilename" => "Il nome \"$1\" contiene dei caratteri non ammessi nei titoli delle pagine. Dare al file un nome diverso e provare a caricarlo di nuovo.",
"badfilename" => "Il nome del file è stato convertito in \"$1\".",
"badfiletype" => "\".$1\" non è tra i tipi di file raccomandati per le immagini.",
-"largefile" => "Si raccomanda di non superare le dimensioni di $1 byte per ciascun file; questo file è grande $2 byte.",
+"large-file" => "Si raccomanda di non superare le dimensioni di $1 per ciascun file; questo file è grande $2.",
"largefileserver" => "Il file supera le dimensioni consentite dalla configurazione del server.",
"emptyfile" => "Il file appena caricato sembra essere vuoto. Ciò potrebbe essere dovuto ad un errore nel nome del file. Verificare che si intenda realmente caricare questo file.",
"fileexists" => "Un file con questo nome esiste già. Verificare prima $1 se non si è sicuri di volerlo sovrascrivere.",
@@ -769,10 +849,25 @@ Seguire il collegamento: $2 per modificare la pagina di descrizione del file app
"uploadvirus" => "Questo file contiene un virus! Dettagli: $1",
"sourcefilename" => "Nome del file di origine",
"destfilename" => "Nome del file di destinazione",
+"watchthisupload" => "Aggiungi agli osservati speciali",
"filewasdeleted" => "Un file con questo nome è stato già caricato e cancellato in passato. Verificare $1 prima di caricarlo di nuovo.",
+"upload-proto-error" => "Protocollo errato",
+"upload-proto-error-text" => "Per l'upload remoto è necessario specificare URL che iniziano con <code>http://</code> oppure <code>ftp://</code>.",
+"upload-file-error" => "Errore interno",
+"upload-file-error-text" => "Si è verificato un errore interno durante la creazione di un file temporaneo sul server. Contattare un amministratore di sistema.",
+"upload-misc-error" => "Errore non identificato per l'upload",
+"upload-misc-error-text" => "Si è verificato un errore non identificato durante il caricamento del file. Verificare che la URL sia corretta e accessibile e provare di nuovo. Se il problema persiste, contattare un amministratore di sistema.",
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+"upload-curl-error6" => "URL non raggiungibile",
+"upload-curl-error6-text" => "Impossibile raggiungere la URL specificata. Verificare che la URL sia scritta correttamente e che il sito in questione sia attivo.",
+"upload-curl-error28" => "Tempo scaduto per l'upload",
+"upload-curl-error28-text" => "Il sito remoto ha impiegato troppo tempo a rispondere. Verificare che il sito sia attivo, attendere qualche minuto e provare di nuovo, eventualmente in un momento di minore traffico.",
+
"license" => "Licenza d'uso",
"nolicense" => "Nessuna licenza indicata",
+"upload_source_url" => " (una URL corretta e accessibile)",
+"upload_source_file" => " (un file sul proprio computer)",
# Image list
#
@@ -787,6 +882,7 @@ Seguire il collegamento: $2 per modificare la pagina di descrizione del file app
"bysize" => "dimensione",
"imgdelete" => "canc",
"imgdesc" => "desc",
+"imgfile" => "file",
"imglegend" => "Legenda: (desc) = visualizza e modifica la descrizione del file.",
"imghistory" => "Cronologia del file",
"revertimg" => "ripr",
@@ -803,6 +899,12 @@ Seguire il collegamento: $2 per modificare la pagina di descrizione del file app
"noimage" => "Un file con questo nome non esiste; $1?",
"noimage-linktext" => "caricarlo ora",
"uploadnewversion-linktext" => "Carica una nuova versione di questo file",
+"imagelist_date" => "Data",
+"imagelist_name" => "Nome",
+"imagelist_user" => "Utente",
+"imagelist_size" => "Dimensione in byte",
+"imagelist_description" => "Description",
+"imagelist_search_for" => "Ricerca immagini per nome:",
# Mime search
#
@@ -814,6 +916,9 @@ Seguire il collegamento: $2 per modificare la pagina di descrizione del file app
#
"unwatchedpages" => "Pagine non osservate",
+# List interwikis
+"listinterwikis" => "Elenco dei collegamenti inter-wiki",
+
# List redirects
"listredirects" => "Elenco dei redirect",
@@ -838,7 +943,8 @@ Sono stati inoltre caricati '''$8''' file.
Dall'installazione del sito sino a questo momento sono state visitate '''$3''' pagine ed eseguite '''$4''' modifiche, pari a una media di '''$5''' modifiche per pagina e '''$6''' richieste di lettura per ciascuna modifica.
La [http://meta.wikimedia.org/wiki/Help:Job_queue coda] contiene '''$7''' processi.",
-"userstatstext" => "In questo momento vi sono '''$1''' utenti registrati, dei quali '''$2''' (pari al '''$4%''') sono amministratori (vedi $3).",
+"userstatstext" => "In questo momento vi sono '''$1''' utenti registrati, dei quali '''$2''' (pari al '''$4%''') sono $5.",
+"statistics-mostpopular" => "Pagine più visitate",
"disambiguations" => "Pagine di disambigua",
"disambiguationspage" => "Template:Disambigua",
@@ -859,6 +965,7 @@ La [http://meta.wikimedia.org/wiki/Help:Job_queue coda] contiene '''$7''' proces
"nviews" => "$1 {{PLURAL:$1|visita|visite}}",
"lonelypages" => "Pagine orfane",
+"lonelypagestext" => "Le pagine indicate di seguito sono prive di collegamenti che provengono da altre pagine del sito.",
"uncategorizedpages" => "Pagine prive di categorie",
"uncategorizedcategories" => "Categorie prive di categorie",
"uncategorizedimages" => "Immagini prive di categorie",
@@ -878,6 +985,7 @@ La [http://meta.wikimedia.org/wiki/Help:Job_queue coda] contiene '''$7''' proces
"shortpages" => "Pagine più corte",
"longpages" => "Pagine più lunghe",
"deadendpages" => "Pagine senza uscita",
+"deadendpagestext" => "Le pagine indicate di seguito sono prive di collegamenti verso altre pagine del sito.",
"listusers" => "Elenco degli utenti",
"specialpages" => "Pagine speciali",
"spheading" => "Pagine speciali non riservate",
@@ -885,6 +993,7 @@ La [http://meta.wikimedia.org/wiki/Help:Job_queue coda] contiene '''$7''' proces
"recentchangeslinked" => "Modifiche correlate",
"rclsub" => "(alle pagine collegate a \"$1\")",
"newpages" => "Pagine più recenti",
+"newpages-username" => "Nome utente:",
"ancientpages" => "Pagine meno recenti",
"intl" => "Collegamenti tra lingue diverse",
"move" => "Sposta",
@@ -892,13 +1001,18 @@ La [http://meta.wikimedia.org/wiki/Help:Job_queue coda] contiene '''$7''' proces
"unusedimagestext" => "<p>Si noti che è possibile realizzare collegamenti ai file da altri siti, usando direttamente la URL; questi potrebbero quindi essere utilizzati anche se compaiono nell'elenco.</p>",
"unusedcategoriestext" => "Le pagine delle categorie indicate di seguito sono state create ma non contengono nessuna pagina né sottocategoria.",
+#Book sources
"booksources" => "Fonti librarie",
+"booksources-search-legend" => "Ricerca di fonti librarie",
+"booksources-isbn" => "Codice ISBN:",
+"booksources-go" => "Vai",
+"booksources-text" => "Di seguito viene presentato un elenco di collegamenti verso siti esterni che vendono libri nuovi e usati, attraverso i quali è possibile ottenere maggiori informazioni sul testo cercato.",
+
"categoriespagetext" => "Elenco completo delle categorie presenti sul sito.",
"data" => "Dati",
"userrights" => "Gestione dei permessi relativi agli utenti",
"groups" => "Gruppi di utenti",
-"booksourcetext" => "Di seguito viene presentata una lista di siti che vendono libri nuovi e usati, attraverso i quali è possibile ottenere maggiori informazioni sul libro che si sta cercando.",
"isbn" => 'ISBN',
"alphaindexline" => "da $1 a $2",
"version" => "Versione",
@@ -908,6 +1022,7 @@ La [http://meta.wikimedia.org/wiki/Help:Job_queue coda] contiene '''$7''' proces
# Special:Allpages
"nextpage" => "Pagina successiva ($1)",
+"prevpage" => "Pagina precedente ($1)",
"allpagesfrom" => "Mostra le pagine a partire da:",
"allarticles" => "Tutte le voci",
"allinnamespace" => "Tutte le pagine del namespace $1",
@@ -916,6 +1031,11 @@ La [http://meta.wikimedia.org/wiki/Help:Job_queue coda] contiene '''$7''' proces
"allpagesnext" => "Successive",
"allpagessubmit" => "Vai",
"allpagesprefix" => "Mostra le pagine che iniziano con:",
+"allpagesbadtitle" => "Il titolo indicato per la pagina non è valido o contiene prefissi interlingua o interwiki. Potrebbe inoltre contenere uno o più caratteri il cui uso non è ammesso nei titoli.",
+
+# Special:Listusers
+"listusersfrom" => "Mostra gli utenti a partire da:",
+
# Email this user
#
@@ -933,6 +1053,8 @@ La [http://meta.wikimedia.org/wiki/Help:Job_queue coda] contiene '''$7''' proces
"emailsubject" => "Oggetto",
"emailmessage" => "Messaggio",
"emailsend" => "Invia",
+"emailccme" => "Invia in copia al mio indirizzo.",
+"emailccsubject"=> "Copia del messaggio inviato a $1: $2",
"emailsent" => "Messaggio inviato",
"emailsenttext" => "Il messaggio e-mail è stato inviato.",
@@ -977,8 +1099,16 @@ Se in un secondo tempo si desidera eliminare la pagina dalla lista degli osserva
"wlnote" => "Di seguito sono elencate le ultime $1 modifiche, apportate nelle ultime <b>$2</b> ore.",
"wlshowlast" => "Mostra le ultime $1 ore $2 giorni $3",
"wlsaved" => "Questa è una versione salvata della lista personale delle pagine osservate.",
-"wlhideshowown" => "$1 le mie modifiche",
-"wlhideshowbots" => "$1 modifiche dei bot",
+"watchlist-show-bots" => "Mostra le modifiche dei bot",
+"watchlist-hide-bots" => "Nascondi le modifiche dei bot",
+"watchlist-show-own" => "Mostra le mie modifiche",
+"watchlist-hide-own" => "Nascondi le mie modifiche",
+"watchlist-show-minor" => "Mostra le modifiche minori",
+"watchlist-hide-minor" => "Nascondi le modifiche minori",
+"wldone" => "Fatto.",
+# Displayed when you click the "watch" button and it's in the process of watching
+"watching" => "Aggiunta agli osservati speciali...",
+"unwatching" => "Eliminazione dagli osservati speciali...",
"enotif_mailer" => "Sistema di notifica via e-mail di {{SITENAME}}",
"enotif_reset" => "Segna tutte le pagine come già visitate",
@@ -1036,7 +1166,7 @@ Per dare il tuo feedback e ricevere ulteriore assistenza:
"rollbacklink" => "rollback",
"rollbackfailed" => "Rollback non riuscito",
"cantrollback" => "Impossibile annullare le modifiche; l'utente che le ha effettuate è l'unico ad aver contribuito alla pagina.",
-"alreadyrolled" => "Non è possibile annullare le modifiche apportate alla pagina [[$1]] da parte di [[User:$2|$2]] ([[User talk:$2|discussione]]); un altro utente ha già modificato la pagina oppure ha effettuato il rollback.
+"alreadyrolled" => "Non è possibile annullare le modifiche apportate alla pagina [[:$1]] da parte di [[User:$2|$2]] ([[User talk:$2|discussione]]); un altro utente ha già modificato la pagina oppure ha effettuato il rollback.
La modifica più recente alla pagina è stata apportata da [[User:$3|$3]] ([[User talk:$3|discussione]]).",
"editcomment" => "Il commento alla modifica era: \"<i>$1</i>\".",
@@ -1074,6 +1204,7 @@ La modifica più recente alla pagina è stata apportata da [[User:$3|$3]] ([[Use
"undeleteextrahelp" => "Per recuperare l'intera pagina, lasciare tutte le caselle deselezionate e fare clic su '''''Ripristina'''''. Per effettuare un ripristino selettivo, selezionare le caselle corrispondenti alle revisioni da ripristinare e fare clic su '''''Ripristina'''''. Facendo clic su '''''Reset''''' verranno deselezionate tutte le caselle e svuotato lo spazio per il commento.",
"undeletearticle" => "Recupera una pagina cancellata",
"undeleterevisions" => "$1 revisioni in archivio",
+"undeleterevision-missing" => "Revisione errata o mancante. Il collegamento è errato oppure la revisione è stata già ripristinata o eliminata dall'archivio.",
"undeletehistory" => "Recuperando questa pagina, tutte le sue revisioni verranno inserite di nuovo nella relativa cronologia. Se dopo la cancellazione è stata creata una nuova pagina con lo stesso titolo, le revisioni recuperate saranno inserite nella cronologia e la versione attualmente online della pagina non verrà modificata.",
"undeletehistorynoadmin" => "La pagina è stata cancellata. Il motivo della cancellazione è indicato di seguito, assieme ai dati degli utenti che avevano modificato la pagina prima della cancellazione. Il testo contenuto nelle revisioni cancellate è disponibile solo agli amministratori.",
"undeleterevision" => "Revisione cancellata, inserita il $1",
@@ -1111,6 +1242,7 @@ Consultare il [[Special:Log/delete|log delle cancellazioni]] per vedere le cance
"sp-contributions-newer" => "$1 più recenti",
"sp-contributions-older" => "$1 meno recenti",
"sp-contributions-newbies-sub" => "Per i nuovi utenti",
+"sp-contributions-blocklog" => "Blocchi",
# What links here
#
@@ -1118,8 +1250,8 @@ Consultare il [[Special:Log/delete|log delle cancellazioni]] per vedere le cance
"notargettitle" => "Dati mancanti",
"notargettext" => "Non è stata indicata una pagina o un utente in relazione al quale eseguire l'operazione richiesta.",
"linklistsub" => "(Lista dei collegamenti)",
-"linkshere" => "Le seguenti pagine contengono dei collegamenti a questa:",
-"nolinkshere" => "Nessuna pagina contiene collegamenti che puntano a questa.",
+"linkshere" => "Le seguenti pagine contengono dei collegamenti a '''[[:$1]]''':",
+"nolinkshere" => "Nessuna pagina contiene collegamenti che puntano a '''[[:$1]]'''.",
"isredirect" => "redirect",
"istemplate" => "inclusione",
@@ -1131,6 +1263,9 @@ Consultare il [[Special:Log/delete|log delle cancellazioni]] per vedere le cance
"ipadressorusername" => "Indirizzo IP o nome utente",
"ipbexpiry" => "Scadenza del blocco",
"ipbreason" => "Motivo del blocco",
+"ipbanononly" => "Blocca solo utenti anonimi",
+"ipbcreateaccount" => "Impedisci la creazione di altri account",
+"ipbenableautoblock" => "Blocca automaticamente l'ultimo indirizzo IP usato dall'utente e i successivi con cui vengono tentate modifiche",
"ipbsubmit" => "Blocca l'utente",
"ipbother" => "Durata non in elenco",
"ipboptions" => "2 ore:2 hours,1 giorno:1 day,3 giorni:3 days,1 settimana:1 week,2 settimane:2 weeks,1 mese:1 month,3 mesi:3 months,6 mesi:6 months,1 anno:1 year,infinito:infinite",
@@ -1142,10 +1277,14 @@ Consultare il [[Special:Log/delete|log delle cancellazioni]] per vedere le cance
"unblockip" => " Sblocca utente",
"unblockiptext" => "Usare il modulo sottostante per restituire l'accesso in scrittura ad un utente o indirizzo IP bloccato.",
"ipusubmit" => "Sblocca l'utente",
+"unblocked" => "L'utente [[User:$1|$1]] è stato sbloccato",
"ipblocklist" => "Lista degli utenti e indirizzi IP bloccati",
"blocklistline" => "$1, $2 ha bloccato $3 ($4)",
"infiniteblock" => "senza scadenza",
"expiringblock" => "fino al $1",
+"anononlyblock" => "solo utenti anonimi",
+"noautoblockblock" => "blocco automatico disattivato",
+"createaccountblock" => "creazione account bloccata",
"ipblocklistempty" => "La lista dei blocchi è vuota.",
"blocklink" => "blocca",
"unblocklink" => "sblocca",
@@ -1157,8 +1296,10 @@ Consultare il [[Special:Log/delete|log delle cancellazioni]] per vedere le cance
"unblocklogentry" => "ha sbloccato $1",
"range_block_disabled" => "La possibilità di bloccare intervalli di indirizzi IP non è attiva al momento.",
"ipb_expiry_invalid" => "Durata o scadenza del blocco non valida.",
+"ipb_already_blocked" => "L'utente \"$1\" è già bloccato",
"ip_range_invalid" => "Intervallo di indirizzi IP non valido.",
"proxyblocker" => "Blocco dei proxy aperti",
+"ipb_cant_unblock" => "Errore: Impossibile trovare il blocco con ID $1. Il blocco potrebbe essere già stato rimosso.",
"proxyblockreason" => "Questo indirizzo IP è stato bloccato perché è risulta essere un proxy aperto. Si prega di contattare il proprio fornitore di accesso a Internet o il supporto tecnico e informarli di questo grave problema di sicurezza.",
"proxyblocksuccess" => "Blocco eseguito.",
"sorbs" => "SORBS DNSBL",
@@ -1181,6 +1322,8 @@ Consultare il [[Special:Log/delete|log delle cancellazioni]] per vedere le cance
"lockdbsuccesstext" => "Il database è stato bloccato.
<br />Ricorda di rimuovere il blocco dopo aver terminato le operazioni di manutenzione.",
"unlockdbsuccesstext" => " Il database è stato sbloccato.",
+"lockfilenotwritable" => "Impossibile scrivere sul file di ''lock'' del database. L'accesso in scrittura a tale file da parte del server web è necessario per bloccare e sbloccare il database.",
+"databasenotlocked" => "Il database non è bloccato.",
# Make sysop
"makesysoptitle" => "Rendi amministratore un utente",
@@ -1221,6 +1364,7 @@ In questi casi, se lo si ritiene opportuno, occorre spostare o aggiungere manual
"movenologin" => "Accesso non effettuato",
"movenologintext" => "Lo spostamento delle pagine è consentito solo agli utenti registrati che hanno eseguito l'[[Special:Userlogin|accesso]] al sito.",
"newtitle" => "Nuovo titolo:",
+"move-watch" => "Aggiungi agli osservati speciali",
"movepagebtn" => "Sposta la pagina",
"pagemovedsub" => "Spostamento effettuato con successo",
"pagemovedtext" => "La pagina \"[[$1]]\" è stata spostata al titolo \"[[$2]]\".",
@@ -1285,6 +1429,7 @@ Le date di pubblicazione e i nomi degli autori delle varie versioni saranno cons
Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log/import|log di importazione]].",
"import-interwiki-history" => "Copia l'intera cronologia di questa pagina",
"import-interwiki-submit" => "Importa",
+"import-interwiki-namespace" => "Trasferisci le pagine nel namespace:",
"importtext" => "Si prega di esportare il file dal sito wiki di origine con la funzione Special:Export, salvarlo sul proprio disco e poi caricarlo qui.",
"importstart" => "Importazione delle pagine in corso...",
"import-revision-count" => "{{PLURAL:$1|una revisione importata|$1 revisioni importate}}",
@@ -1303,7 +1448,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
# import log
"importlogpage" => "Importazioni",
"importlogpagetext" => "Registro delle importazioni d'ufficio di pagine provenienti da altre wiki, complete di cronologia.",
-"import-logentry-upload" => "ha importato $1 tramite upload",
+"import-logentry-upload" => "ha importato [[$1]] tramite upload",
"import-logentry-upload-detail" => "{{PLURAL:$1|una revisione importata|$1 revisioni importate}}",
"import-logentry-interwiki" => "ha trasferito da altra wiki la pagina $1",
"import-logentry-interwiki-detail" => "{{PLURAL:$1|una revisione importata|$1 revisioni importate}} da $2",
@@ -1313,7 +1458,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
"accesskey-minoredit" => "i",
"accesskey-save" => "s",
"accesskey-preview" => "p",
-"accesskey-diff" => "d",
+"accesskey-diff" => "v",
"accesskey-compareselectedversions" => "v",
"accesskey-watch" => "w",
@@ -1322,13 +1467,13 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
"tooltip-minoredit" => "Segnala come modifica minore [alt-i]",
"tooltip-save" => "Salva le modifiche [alt-s]",
"tooltip-preview" => "Anteprima delle modifiche (consigliata, prima di salvare!) [alt-p]",
-"tooltip-diff" => "Guarda le modifiche apportate al testo. [alt-d]",
+"tooltip-diff" => "Guarda le modifiche apportate al testo. [alt-v]",
"tooltip-compareselectedversions" => "Guarda le differenze tra le due versioni selezionate di questa pagina. [alt-v]",
"tooltip-watch" => "Aggiungi questa pagina alla lista degli osservati speciali [alt-w]",
# stylesheets
"Common.css" => "/* Gli stili CSS inseriti qui si applicano a tutte le skin */",
-"Monobook.css" => "/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Monobook */",
+"monobook.css" => "/* Gli stili CSS inseriti qui si applicano agli utenti che usano la skin Monobook */",
# Metadata
"nodublincore" => "Metadati Dublin Core RDF non attivi su questo server.",
@@ -1352,6 +1497,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
"spamprotectionmatch" => "Il filtro anti-spam è stato attivato dal seguente testo: $1",
"subcategorycount" => "Questa categoria contiene {{PLURAL:$1|una sottocategoria|$1 sottocategorie}}.",
"categoryarticlecount" => "Questa categoria contiene {{PLURAL:$1|una pagina|$1 pagine}}.",
+"category-media-count" => "Questa categoria contiene {{PLURAL:$1|un file|$1 file}}.",
"listingcontinuesabbrev" => " cont.",
"spambot_username" => "MediaWiki - sistema di rimozione spam",
"spam_reverting" => "Ripristinata l'ultima versione priva di collegamenti a $1",
@@ -1382,9 +1528,10 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
"rcpatroldisabledtext" => "La funzione di verifica delle ultime modifiche al momento non è attiva.",
"markedaspatrollederror" => "Impossibile contrassegnare la voce come verificata",
"markedaspatrollederrortext" => "Occorre specificare una revisione da contrassegnare come verificata.",
+"markedaspatrollederror-noautopatrol" => "Non si dispone dei permessi necessari per segnare le proprie modifiche come verificate.",
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'La tua pagina utente\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'La pagina utente di questo indirizzo IP\');
@@ -1395,7 +1542,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
ta[\'pt-mycontris\'] = new Array(\'y\',\'L\\\'elenco dei tuoi contributi\');
ta[\'pt-login\'] = new Array(\'o\',\'La registrazione è consigliata, anche se non obbligatoria\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'La registrazione è consigliata, anche se non obbligatoria\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Uscita (logout)\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Uscita (logout)\');
ta[\'ca-talk\'] = new Array(\'t\',\'Vedi le discussioni relative a questa pagina\');
ta[\'ca-edit\'] = new Array(\'e\',\'Puoi modificare questa pagina. Per favore usa il pulsante di anteprima prima di salvare\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Aggiungi un commento a questa discussione\');
@@ -1436,6 +1583,9 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
ta[\'ca-nstab-help\'] = new Array(\'c\',\'Vedi la pagina di aiuto\');
ta[\'ca-nstab-category\'] = new Array(\'c\',\'Vedi la pagina della categoria\');',
+# Common.js: contains nothing but a placeholder comment
+"common.js" => "/* Questo codice JavaScript viene caricato da ciascuna pagina, per tutti gli utenti. */",
+
# image deletion
"deletedrevision" => "Revisione precedente, cancellata: $1.",
@@ -1615,6 +1765,8 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
"exif-compression-1" => "Nessuno",
"exif-compression-6" => "JPEG",
+"exif-unknowndate" => "Data sconosciuta",
+
"exif-photometricinterpretation-2" => "RGB",
"exif-photometricinterpretation-6" => "YCbCr",
@@ -1772,10 +1924,22 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
# E-mail address confirmation
"confirmemail" => "Conferma indirizzo e-mail",
+"confirmemail_noemail" => "Non è stato indicato un indirizzo e-mail valido nelle proprie [[Special:Preferences|preferenze]].",
"confirmemail_text" => "Questo sito richiede la verifica dell'indirizzo e-mail prima di poter usare le funzioni connesse all'email. Premere il pulsante qui sotto per inviare una richiesta di conferma al proprio indirizzo; nel messaggio è presente un collegamento che contiene un codice. Visitare il collegamento con il proprio browser per confermare che l'indirizzo e-mail è valido.",
+"confirmemail_pending" => "<div class=\"error\">
+Il codice di conferma è già stato spedito via posta elettronica; se l'account è stato
+creato di recente, si prega di attendere l'arrivo del codice per qualche minuto prima
+di tentare di richiederne uno nuovo.
+</div>",
"confirmemail_send" => "Invia un codice di conferma via e-mail.",
"confirmemail_sent" => "Messaggio e-mail di conferma inviato.",
-"confirmemail_sendfailed" => "Impossibile inviare il messaggio e-mail di conferma. Verificare che l'indirizzo non contenga caratteri non validi.",
+"confirmemail_oncreate" => "Un codice di conferma è stato spedito all'indirizzo
+di posta elettronica indicato. Il codice non è necessario per accedere al sito,
+ma è necessario fornirlo per poter abilitare tutte le funzioni del sito che fanno
+uso della posta elettronica.",
+"confirmemail_sendfailed" => "Impossibile inviare il messaggio e-mail di conferma. Verificare che l'indirizzo non contenga caratteri non validi.
+
+Messaggio di errore del mailer: $1",
"confirmemail_invalid" => "Codice di conferma non valido. Il codice potrebbe essere scaduto.",
"confirmemail_needlogin" => "È necessario $1 per confermare il proprio indirizzo e-mail.",
"confirmemail_success" => "L'indirizzo e-mail è confermato. Ora è possibile eseguire l'accesso e fare pieno uso del sito.",
@@ -1817,6 +1981,8 @@ Per favore, conferma che desideri veramente ricreare questa pagina.",
"recreate" => "Ricrea",
"tooltip-recreate" => "Ricrea la pagina anche se è stata cancellata",
+"unit-pixel" => "px",
+
# HTML dump
"redirectingto" => "Reindirizzamento a [[$1]]...",
@@ -1825,6 +1991,7 @@ Per favore, conferma che desideri veramente ricreare questa pagina.",
"confirm_purge_button" => "Conferma",
"youhavenewmessagesmulti" => "Hai nuovi messaggi su $1",
+
"searchcontaining" => "Ricerca delle voci che contengono ''$1''.",
"searchnamed" => "Ricerca delle voci con titolo ''$1''.",
"articletitles" => "Ricerca delle voci che iniziano con ''$1''",
@@ -1833,7 +2000,36 @@ Per favore, conferma che desideri veramente ricreare questa pagina.",
# DISPLAYTITLE
"displaytitle" => "(Per i collegamenti a questa pagina, usare [[$1]])",
-);
+"loginlanguagelabel" => "Lingua: $1",
+
+# Multipage image navigation
+"imgmultipageprev" => "↠pagina precedente",
+"imgmultipagenext" => "pagina seguente →",
+"imgmultigo" => "Vai",
+"imgmultigotopre" => "Vai alla pagina",
+
+# Table pager
+"ascending_abbrev" => "cresc",
+"descending_abbrev" => "decresc",
+"table_pager_next" => "Pagina successiva",
+"table_pager_prev" => "Pagina precedente",
+"table_pager_first" => "Prima pagina",
+"table_pager_last" => "Ultima pagina",
+"table_pager_limit" => "Mostra $1 file per pagina",
+"table_pager_limit_submit" => "Vai",
+"table_pager_empty" => "Nessun risultato",
+
+# Auto-summaries
+"autosumm-blank" => "Pagina svuotata completamente",
+"autosumm-replace" => "Pagina sostituita con '$1'",
+"autosumm-new" => "Nuova pagina: $1",
+
+# Size units
+"size-bytes" => "$1 byte",
+"size-kilobytes" => "$1 KB",
+"size-megabytes" => "$1 MB",
+"size-gigabytes" => "$1 GB",
+);
?>
diff --git a/languages/messages/MessagesJa.php b/languages/messages/MessagesJa.php
index a78714b3..ddc47a30 100644
--- a/languages/messages/MessagesJa.php
+++ b/languages/messages/MessagesJa.php
@@ -50,7 +50,6 @@ $namespaceNames = array(
NS_CATEGORY_TALK => "Categoryâ€ãƒŽãƒ¼ãƒˆ" /* Category_talk */
);
-
$messages = array(
'tog-underline' => 'リンクã®ä¸‹ç·š:',
'tog-highlightbroken' => '未作æˆã®ãƒšãƒ¼ã‚¸ã¸ã®ãƒªãƒ³ã‚¯ã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆã™ã‚‹',
@@ -68,6 +67,8 @@ $messages = array(
'tog-editwidth' => 'テキストボックスを横幅ã„ã£ã±ã„ã«è¡¨ç¤ºã™ã‚‹',
'tog-watchcreations' => '自分ã§ä½œæˆã—ãŸãƒšãƒ¼ã‚¸ã‚’ウォッãƒãƒªã‚¹ãƒˆã«è¿½åŠ ã™ã‚‹',
'tog-watchdefault' => '編集ã—ãŸãƒšãƒ¼ã‚¸ã‚’ウォッãƒãƒªã‚¹ãƒˆã«è¿½åŠ ã™ã‚‹',
+'tog-watchmoves' => '自分ãŒç§»å‹•ã—ãŸãƒšãƒ¼ã‚¸ã‚’ウォッãƒãƒªã‚¹ãƒˆã«è¿½åŠ ã™ã‚‹',
+'tog-watchdeletion' => '自分ãŒå‰Šé™¤ã—ãŸãƒšãƒ¼ã‚¸ã‚’ウォッãƒãƒªã‚¹ãƒˆã«è¿½åŠ ã™ã‚‹',
'tog-minordefault' => '細部ã®ç·¨é›†ã‚’デフォルトã§ãƒã‚§ãƒƒã‚¯ã™ã‚‹',
'tog-previewontop' => 'プレビューをテキストボックスã®å‰ã«é…ç½®ã™ã‚‹',
'tog-previewonfirst' => '編集開始時ã«ã‚‚プレビューを表示ã™ã‚‹',
@@ -82,13 +83,16 @@ $messages = array(
'tog-externaldiff' => '差分表示ã«å¤–部アプリケーションを使ã†',
'tog-showjumplinks' => 'アクセシビリティã®ãŸã‚ã® "{{int:jumpto}}" リンクを有効ã«ã™ã‚‹',
'tog-uselivepreview' => 'ライブプレビューを使用ã™ã‚‹ (JavaScript, 試験中ã®æ©Ÿèƒ½)',
-'tog-autopatrol' => '自分ã®ç·¨é›†ã‚’パトロール済ã¿ã«ã™ã‚‹',
'tog-forceeditsummary' => 'è¦ç´„欄ãŒç©ºæ¬„ã®å ´åˆã«è­¦å‘Šã™ã‚‹',
'tog-watchlisthideown' => '自分ã®ç·¨é›†ã‚’表示ã—ãªã„',
'tog-watchlisthidebots' => 'ボットã«ã‚ˆã‚‹ç·¨é›†ã‚’表示ã—ãªã„',
+'tog-watchlisthideminor'=> '細部ã®ç·¨é›†ã‚’表示ã—ãªã„',
+'tog-nolangconversion' => '字形変æ›ã‚’無効ã«ã™ã‚‹',
+'tog-ccmeonemails' => '他ユーザーã«é€ä¿¡ã—ãŸãƒ¡ãƒ¼ãƒ«ã®æŽ§ãˆã‚’自分ã«ã‚‚é€ã‚‹',
+
'underline-always' => '常ã«ä»˜ã‘ã‚‹',
'underline-never' => '常ã«ä»˜ã‘ãªã„',
-'underline-default' => 'ブラウザã«å¾“ã†',
+'underline-default' => 'WWWブラウザã«å¾“ã†',
'skinpreview' => '(プレビュー)',
'sunday' => '日曜日',
'monday' => '月曜日',
@@ -104,6 +108,8 @@ $messages = array(
'thu' => '木',
'fri' => '金',
'sat' => '土',
+
+#long
'january' => '1月',
'february' => '2月',
'march' => '3月',
@@ -116,6 +122,22 @@ $messages = array(
'october' => '10月',
'november' => '11月',
'december' => '12月',
+
+#genitive
+'january-gen' => '1月',
+'february-gen' => '2月',
+'march-gen' => '3月',
+'april-gen' => '4月',
+'may-gen' => '5月',
+'june-gen' => '6月',
+'july-gen' => '7月',
+'august-gen' => '8月',
+'september-gen' => '9月',
+'october-gen' => '10月',
+'november-gen' => '11月',
+'december-gen' => '12月',
+
+#short
'jan' => '1月',
'feb' => '2月',
'mar' => '3月',
@@ -128,9 +150,13 @@ $messages = array(
'oct' => '10月',
'nov' => '11月',
'dec' => '12月',
+
'categories' => 'カテゴリ',
-'category_header' => 'カテゴリ: “$1â€',
+'pagecategories' => 'カテゴリ',
+'category_header' => 'カテゴリ “$1†ã«ã‚るページ',
'subcategories' => 'サブカテゴリ',
+'category-media-header' => 'カテゴリ “$1†ã«ã‚るメディア',
+
'mainpage' => 'メインページ',
'mainpagetext' => 'MediaWikiãŒæ­£å¸¸ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¾ã—ãŸã€‚',
'mainpagedocfooter' => '[http://meta.wikimedia.org/wiki/MediaWiki_localisation インターフェースã®å¤‰æ›´æ–¹æ³•]ã‚„ã€ãã®ã»ã‹ã®ä½¿ã„方・設定ã«é–¢ã—ã¦ã¯[http://meta.wikimedia.org/wiki/Help:Contents ユーザーズガイド]ã‚’å‚ç…§ã—ã¦ãã ã•ã„。',
@@ -146,6 +172,7 @@ $messages = array(
'bugreportspage' => 'Project:ãƒã‚°ã®å ±å‘Š',
'sitesupport' => '寄付',
'sitesupport-url' => 'Project:Site support',
+'faq' => 'FAQ',
'faqpage' => 'Project:FAQ',
'edithelp' => '編集ã®ä»•æ–¹',
'newwindow' => '(新ã—ã„ウィンドウãŒé–‹ãã¾ã™ï¼‰',
@@ -212,7 +239,6 @@ $messages = array(
'viewtalkpage' => 'ノートを表示',
'otherlanguages' => 'ä»–ã®è¨€èªž',
'redirectedfrom' => '($1 ã‹ã‚‰è»¢é€ï¼‰',
-'autoredircomment' => '[[$1]]ã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ',
'redirectpagesub' => 'リダイレクトページ',
'lastmodifiedat' => '最終更新 $2, $1。',
'viewcount' => 'ã“ã®ãƒšãƒ¼ã‚¸ã¯ $1 回アクセスã•ã‚Œã¾ã—ãŸã€‚',
@@ -231,8 +257,11 @@ $messages = array(
'versionrequired' => 'MediaWiki ãƒãƒ¼ã‚¸ãƒ§ãƒ³ $1 ãŒå¿…è¦',
'versionrequiredtext' => 'ã“ã®ãƒšãƒ¼ã‚¸ã®åˆ©ç”¨ã«ã¯ MediaWiki Version $1 ãŒå¿…è¦ã§ã™ã€‚[[Special:Version|{{int:version}}]]を確èªã—ã¦ãã ã•ã„。',
+'ok' => 'OK',
+'pagetitle' => '$1 - {{SITENAME}}',
+
'retrievedfrom' => ' "$1" より作æˆ',
-'youhavenewmessages' => '$1ãŒå±Šã„ã¦ã„ã¾ã™ã€‚($2)',
+'youhavenewmessages' => 'ã‚ãªãŸå®›ã®$1ãŒå±Šã„ã¦ã„ã¾ã™ã€‚($2)',
'newmessageslink' => 'æ–°ã—ã„メッセージ',
'newmessagesdifflink' => '差分',
'editsection' => '編集',
@@ -244,6 +273,7 @@ $messages = array(
'thisisdeleted' => '$1 ã‚’å‚ç…§ã¾ãŸã¯å¾©å¸°ã™ã‚‹ã€‚',
'viewdeleted' => '$1ã®å‰Šé™¤è¨˜éŒ²ã¨å±¥æ­´ã‚’確èªã™ã‚‹',
'restorelink' => '削除ã•ã‚ŒãŸ $1 編集',
+'feedlinks' => 'フィード:',
'feed-invalid' => 'フィード形å¼ã®æŒ‡å®šãŒé–“é•ã£ã¦ã„ã¾ã™ã€‚',
'nstab-main' => '本文',
'nstab-user' => '利用者ページ',
@@ -274,13 +304,14 @@ The last attempted database query was:
"$1"
from within function "$2".
MySQL returned error "$3: $4"',
+'sqlhidden' => '(SQLクエリーéžè¡¨ç¤ºï¼‰',
'noconnect' => '申ã—訳ã‚ã‚Šã¾ã›ã‚“。何らã‹ã®å•é¡Œã«ã‚ˆã‚Šãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。<br />$1',
'nodb' => 'データベース $1 ã‚’é¸æŠžã§ãã¾ã›ã‚“。',
'cachederror' => 'ã‚ãªãŸãŒã‚¢ã‚¯ã‚»ã‚¹ã—ãŸãƒšãƒ¼ã‚¸ã®ã‚³ãƒ”ーをä¿å­˜ã—ãŸã‚‚ã®ã‚’表示ã—ã¦ã„ã¾ã™ã€‚ã¾ãŸã€ã‚³ãƒ”ーã¯æ›´æ–°ã•ã‚Œã¾ã›ã‚“。',
'laggedslavemode' => '警告: ページã«æœ€æ–°ã®ç·¨é›†ãŒå映ã•ã‚Œã¦ã„ãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚å映ã•ã‚Œã‚‹ã¾ã§ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。',
'readonly' => 'データベースã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™',
'enterlockreason' => 'ロックã™ã‚‹ç†ç”±ã‚’入力ã—ã¦ãã ã•ã„。ロックãŒè§£é™¤ã•ã‚Œã‚‹ã®ãŒã„ã¤ã«ãªã‚‹ã‹ã®è¦‹ç©ã‚‚ã‚Šã«ã¤ã„ã¦ã‚‚è¿°ã¹ã¦ãã ã•ã„。',
-'readonlytext' => 'データベースã¯ç¾åœ¨ã€æ–°ã—ã„ページã®è¿½åŠ ã‚„編集をå—ã‘付ã‘ãªã„「ロック状態ã€ã«ãªã£ã¦ã„ã¾ã™ã€‚ã“ã‚Œã¯ãŠãらã定期的ãªãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã®ãŸã‚ã§ã€ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹çµ‚了後ã¯æ­£å¸¸ãªçŠ¶æ…‹ã«å¾©å¸°ã—ã¾ã™ã€‚データベースをロックã—ãŸã‚µãƒ¼ãƒç®¡ç†è€…ã¯æ¬¡ã®ã‚ˆã†ãªèª¬æ˜Žã‚’ã—ã¦ã„ã¾ã™:
+'readonlytext' => 'データベースã¯ç¾åœ¨ã€æ–°ã—ã„ページã®è¿½åŠ ã‚„編集をå—ã‘付ã‘ãªã„「ロック状態ã€ã«ãªã£ã¦ã„ã¾ã™ã€‚ã“ã‚Œã¯ãŠãらã定期的ãªãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã®ãŸã‚ã§ã€ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹çµ‚了後ã¯æ­£å¸¸ãªçŠ¶æ…‹ã«å¾©å¸°ã—ã¾ã™ã€‚データベースをロックã—ãŸã‚µãƒ¼ãƒãƒ¼ç®¡ç†è€…ã¯æ¬¡ã®ã‚ˆã†ãªèª¬æ˜Žã‚’ã—ã¦ã„ã¾ã™:
$1
@@ -288,11 +319,8 @@ $1
The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal. The administrator who locked it offered this explanation:
$1',
-'missingarticle' => '<p>"$1" ã¨ã„ã†é¡Œã®ãƒšãƒ¼ã‚¸ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ã™ã§ã«å‰Šé™¤ã•ã‚ŒãŸç‰ˆã‚’å‚ç…§ã—よã†ã¨ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã“ã‚ŒãŒã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒã‚°ã ã¨æ€ã‚れる場åˆã¯ã€URIã¨å…±ã«ã‚µãƒ¼ãƒç®¡ç†è€…ã«å ±å‘Šã—ã¦ä¸‹ã„。</p>
-<p>The database did not find the text of a page that it should have found, named "$1". This is usually caused by following an outdated diff or history link to a page that has been deleted. If this is not the case, you may have found a bug in the software. Please report this to an administrator, making note of the URL.</p>',
-'readonly_lag' => 'データベースã¯ã‚¹ãƒ¬ãƒ¼ãƒ–・サーãƒãŒãƒžã‚¹ã‚¿ãƒ»ã‚µãƒ¼ãƒã«åŒæœŸã™ã‚‹ã¾ã§è‡ªå‹•çš„ã«ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。
-
-The database has been automatically locked while the slave database servers catch up to the master.',
+'missingarticle' => '<p>"$1" ã¨ã„ã†é¡Œã®ãƒšãƒ¼ã‚¸ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ã™ã§ã«å‰Šé™¤ã•ã‚ŒãŸç‰ˆã‚’å‚ç…§ã—よã†ã¨ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã“ã‚ŒãŒã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒã‚°ã ã¨æ€ã‚れる場åˆã¯ã€URIã¨å…±ã«ã‚µãƒ¼ãƒãƒ¼ç®¡ç†è€…ã«å ±å‘Šã—ã¦ä¸‹ã„。</p>',
+'readonly_lag' => 'データベースã¯ã‚¹ãƒ¬ãƒ¼ãƒ–・サーãƒãƒ¼ãŒãƒžã‚¹ã‚¿ãƒ»ã‚µãƒ¼ãƒãƒ¼ã«åŒæœŸã™ã‚‹ã¾ã§è‡ªå‹•çš„ã«ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。',
'internalerror' => '内部処ç†ã‚¨ãƒ©ãƒ¼',
'filecopyerror' => 'ファイル "$1" ã‹ã‚‰ "$2" ã¸ã®ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸã€‚',
'filerenameerror' => 'ファイルåã‚’ "$1" ã‹ã‚‰ "$2" ã¸å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
@@ -308,14 +336,14 @@ The database has been automatically locked while the slave database servers catc
'perfdisabledsub' => 'ã“ã“ã«ã¯ $1 ã®ã‚³ãƒ”ーを表示ã—ã¦ã„ã¾ã™ã€‚',
'perfcached' => '以下ã®ãƒ‡ãƒ¼ã‚¿ã¯ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã§ã‚ã‚Šã€ã—ã°ã‚‰ãæ›´æ–°ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
'perfcachedts' => '以下ã®ãƒ‡ãƒ¼ã‚¿ã¯ $1 ã«æœ€çµ‚æ›´æ–°ã•ã‚ŒãŸã‚­ãƒ£ãƒƒã‚·ãƒ¥ã§ã™ã€‚',
+'querypage-no-updates' => 'ページã®æ›´æ–°ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚以下ã®ãƒ‡ãƒ¼ã‚¿ã®æ›´æ–°ã¯ç¾åœ¨è¡Œã‚ã‚Œã¦ã„ã¾ã›ã‚“。',
'wrong_wfQuery_params' => 'wfQuery()ã¸èª¤ã£ãŸå¼•æ•°ãŒæ¸¡ã•ã‚Œã¾ã—ãŸã€‚<br />
関数: $1<br />
クエリ: $2',
'viewsource' => 'ソースを表示',
'viewsourcefor' => '$1 ã®ã‚½ãƒ¼ã‚¹',
-'protectedtext' => 'ã“ã®ãƒšãƒ¼ã‚¸ã¯ç·¨é›†ã§ããªã„よã†ã«ä¿è­·ã•ã‚Œã¦ã„ã¾ã™ã€‚ã“ã‚Œã«ã¯ã„ãã¤ã‹ç†ç”±ãŒã‚ã‚Šã¾ã™ã€‚詳ã—ãã¯[[Project:ä¿è­·ã•ã‚ŒãŸãƒšãƒ¼ã‚¸]]ã‚’ã”覧ãã ã•ã„。
-
-下ã«ã‚½ãƒ¼ã‚¹ã‚’表示ã—ã¦ã„ã¾ã™:',
+'protectedpagetext' => 'ã“ã®ãƒšãƒ¼ã‚¸ã¯ç·¨é›†ã§ããªã„よã†ã«ä¿è­·ã•ã‚Œã¦ã„ã¾ã™ã€‚',
+'viewsourcetext' => '以下ã«ã‚½ãƒ¼ã‚¹ã‚’表示ã—ã¦ã„ã¾ã™:',
'protectedinterface' => 'ã“ã®ãƒšãƒ¼ã‚¸ã¯ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã«ä½¿ç”¨ã•ã‚Œã‚‹ãƒ†ã‚­ã‚¹ãƒˆãŒä¿å­˜ã•ã‚ŒãŠã‚Šã€å•é¡Œå›žé¿ã®ãŸã‚ã«ä¿è­·ã•ã‚Œã¦ã„ã¾ã™ã€‚',
'editinginterface' => '\'\'\'警告:\'\'\' ã‚ãªãŸã¯ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã«ä½¿ç”¨ã•ã‚Œã¦ã„るテキストを編集ã—ã¦ã„ã¾ã™ã€‚ã“ã®ãƒšãƒ¼ã‚¸ã®å¤‰æ›´ã¯ã™ã¹ã¦ã®åˆ©ç”¨è€…ã«å½±éŸ¿ã—ã¾ã™ã€‚',
'logouttitle' => 'ログアウト',
@@ -338,7 +366,7 @@ The database has been automatically locked while the slave database servers catc
'logout' => 'ログアウト',
'userlogout' => 'ログアウト',
'notloggedin' => 'ログインã—ã¦ã„ã¾ã›ã‚“',
-'nologin' => 'アカウントã¯ãŠæŒã¡ã§ã™ã‹ï¼Ÿ $1',
+'nologin' => 'アカウントã¯ãŠæŒã¡ã§ã™ã‹? $1',
'nologinlink' => 'アカウントを作æˆ',
'createaccount' => 'アカウント作æˆ',
'gotaccount' => 'ã™ã§ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’ãŠæŒã¡ã®å ´åˆ: $1',
@@ -370,14 +398,16 @@ The database has been automatically locked while the slave database servers catc
'wrongpassword' => 'パスワードãŒé–“é•ã£ã¦ã„ã¾ã™ã€‚å†åº¦å…¥åŠ›ã—ã¦ãã ã•ã„。',
'wrongpasswordempty' => 'パスワードを空ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。å†åº¦å…¥åŠ›ã—ã¦ãã ã•ã„。',
'mailmypassword' => 'æ–°ã—ã„パスワードをメールã§é€ã‚‹',
-'passwordremindertitle' => 'Password reminder from {{SITENAME}}({{SITENAME}}ã‹ã‚‰ãƒ‘スワードã®ãŠçŸ¥ã‚‰ã›ï¼‰',
+'passwordremindertitle' => '{{SITENAME}} パスワードå†é€é€šçŸ¥',
'passwordremindertext' => 'ã©ãªãŸã‹ï¼ˆ$1 ã®IPアドレスã®ä½¿ç”¨è€…)ãŒ{{SITENAME}} ($4) ã®ãƒ­ã‚°ã‚¤ãƒ³ç”¨ãƒ‘スワードã®å†ç™ºè¡Œã‚’ä¾é ¼ã—ã¾ã—ãŸã€‚
利用者 "$2" ã®ãƒ‘スワードを "$3" ã«å¤‰æ›´ã—ã¾ã—ãŸã€‚
ログインã—ã¦åˆ¥ã®ãƒ‘スワードã«å¤‰æ›´ã—ã¦ãã ã•ã„。',
'noemail' => '利用者 "$1" ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
'passwordsent' => 'æ–°ã—ã„パスワードを "$1" ã•ã‚“ã®ç™»éŒ²æ¸ˆã¿ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã«é€ä¿¡ã—ã¾ã—ãŸã€‚メールをå—ã‘å–ã£ãŸã‚‰ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ãã ã•ã„。',
+'blocked-mailpassword' => 'ã‚ãªãŸã®ä½¿ç”¨ã—ã¦ã„ã‚‹IPアドレスã‹ã‚‰ã®ç·¨é›†ã¯ãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚悪用防止ã®ãŸã‚ã€ãƒ‘スワードã®å†ç™ºè¡Œã¯ç„¡åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚',
'eauthentsent' => '指定ã•ã‚ŒãŸãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã‚¢ãƒ‰ãƒ¬ã‚¹ç¢ºèªã®ãŸã‚ã®ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã—ãŸã€‚ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒæœ¬å½“ã«ã‚ãªãŸã®ã‚‚ã®ã§ã‚ã‚‹ã‹ç¢ºèªã™ã‚‹ãŸã‚ã€ã‚ãªãŸãŒãƒ¡ãƒ¼ãƒ«ã®å†…容ã«å¾“ã‚ãªã„é™ã‚Šã€ãã®ä»–ã®ãƒ¡ãƒ¼ãƒ«ã¯ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå®›ã«ã¯é€ä¿¡ã•ã‚Œã¾ã›ã‚“。',
+'throttled-mailpassword'=> 'æ–°ã—ã„パスワード㯠$1 時間以内ã«é€ä¿¡æ¸ˆã¿ã§ã™ã€‚悪用防止ã®ãŸã‚ã€ãƒ‘スワード㯠$1 時間間隔ã§å†ç™ºè¡Œå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚',
'mailerror' => 'メールã®é€ä¿¡ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: $1',
'acct_creation_throttle_hit'=> 'ã‚ãªãŸã¯æ—¢ã« $1 アカウントを作æˆã—ã¦ã„ã¾ã™ã€‚ã“れ以上作æˆã§ãã¾ã›ã‚“。',
'emailauthenticated' => 'ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ $1 ã«ç¢ºèªã•ã‚Œã¦ã„ã¾ã™ã€‚',
@@ -389,6 +419,19 @@ The database has been automatically locked while the slave database servers catc
'accountcreatedtext' => '利用者 $1 ãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚',
'cantcreateaccounttitle'=> 'アカウントを作æˆã§ãã¾ã›ã‚“',
'cantcreateaccounttext' => 'ã“ã®IPアドレス (<b>$1</b>) ã‹ã‚‰ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆä½œæˆã¯ãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚',
+
+# Password reset dialog
+'resetpass' => 'パスワードã®å†è¨­å®š',
+'resetpass_announce' => 'メールã§é€ä¿¡ã—ãŸè‡¨æ™‚パスワードã§ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„ã¾ã™ã€‚ログインを完了ã™ã‚‹ã«ã¯ã€æ–°ã—ã„パスワードを設定ã—ãªãŠã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
+'resetpass_text' => "<!-- ã“ã“ã«ãƒ†ã‚­ã‚¹ãƒˆã‚’挿入 -->",
+'resetpass_header' => 'パスワードを設定ã—ãªãŠã™',
+'resetpass_submit' => 'å†è¨­å®šã—ã¦ãƒ­ã‚°ã‚¤ãƒ³',
+'resetpass_success' => 'ã‚ãªãŸã®ãƒ‘スワードã¯å¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚ログインã—ã¦ã„ã¾ã™...',
+'resetpass_bad_temporary' => '無効ãªè‡¨æ™‚パスワードã§ã™ã€‚パスワードã¯æ—¢ã«å†è¨­å®šã•ã‚Œã¦ã„ã‚‹ã‹ã€å†ã³ãƒ‘スワード通知メールãŒé€ä¿¡ã•ã‚Œã¦ã„ã¾ã™ã€‚',
+'resetpass_forbidden' => 'ã“ã®ã‚¦ã‚£ã‚­ã§ã¯ã€ãƒ‘スワードã®å¤‰æ›´ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
+'resetpass_missing' => 'データãŒã‚»ãƒƒãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。',
+
+# Edit page toolbar
'bold_sample' => 'å¼·ã„強調(太字)',
'bold_tip' => 'å¼·ã„強調(太字)',
'italic_sample' => 'å¼±ã„強調(斜体)',
@@ -403,6 +446,7 @@ The database has been automatically locked while the slave database servers catc
'math_tip' => 'æ•°å¼ (LaTeX)',
'nowiki_sample' => 'ãã®ã¾ã¾è¡¨ç¤ºã•ã›ãŸã„文字を入力',
'nowiki_tip' => '入力文字をãã®ã¾ã¾è¡¨ç¤º',
+'image_sample' => 'Example.jpg',
'image_tip' => '埋ã‚è¾¼ã¿ç”»åƒï¼ˆ[[{{ns:image}}:~]]ã«ç›´ã—ã¦ãã ã•ã„)',
'media_sample' => 'Example.mp3',
'media_tip' => 'メディアファイル(音声)ã¸ã®ãƒªãƒ³ã‚¯',
@@ -420,11 +464,16 @@ The database has been automatically locked while the slave database servers catc
'anoneditwarning' => 'ã‚ãªãŸã¯ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„ã¾ã›ã‚“。ã‚ãªãŸã®IPアドレスã¯ã“ã®é …ç›®ã®å±¥æ­´ã«è¨˜éŒ²ã•ã‚Œã¾ã™ã€‚',
'missingsummary' => '\'\'\'注æ„:\'\'\' è¦ç´„欄ãŒç©ºæ¬„ã§ã™ã€‚投稿ボタンをもã†ä¸€åº¦æŠ¼ã™ã¨ã€è¦ç´„ãªã—ã®ã¾ã¾æŠ•ç¨¿ã•ã‚Œã¾ã™ã€‚',
'missingcommenttext' => '以下ã«ã‚³ãƒ¡ãƒ³ãƒˆã‚’入力ã—ã¦ãã ã•ã„。',
+'missingcommentheader' => '\'\'\'注æ„:\'\'\' é¡Œå・見出ã—ãŒç©ºæ¬„ã§ã™ã€‚投稿ボタンをもã†ä¸€åº¦æŠ¼ã™ã¨ã€è¦ç´„ãªã—ã®ã¾ã¾æŠ•ç¨¿ã•ã‚Œã¾ã™ã€‚',
+'summary-preview' => 'è¦ç´„ã®ãƒ—レビュー',
+'subject-preview' => 'é¡Œå・見出ã—ã®ãƒ—レビュー',
'blockedtitle' => '投稿ブロック',
'blockedtext' => 'ã”使用ã®åˆ©ç”¨è€…åã¾ãŸã¯IPアドレス㯠$1 ã«ã‚ˆã£ã¦æŠ•ç¨¿ã‚’ブロックã•ã‚Œã¦ã„ã¾ã™ã€‚ãã®ç†ç”±ã¯æ¬¡ã®é€šã‚Šã§ã™ã€‚
:$2
-$1 ã¾ãŸã¯ä»–ã®[[{{int:grouppage-sysop}}|{{int:group-sysop}}]]ã«ã“ã®ä»¶ã«ã¤ã„ã¦ãƒ¡ãƒ¼ãƒ«ã§å•ã„åˆã‚ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãŸã ã—ã€[[Special:Preferences|オプション]]ã«æ­£ã—ã„メールアドレスãŒç™»éŒ²ã•ã‚Œã¦ã„ãªã„å ´åˆã€ã€Œ{{int:emailuser}}ã€æ©Ÿèƒ½ãŒä½¿ãˆãªã„ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。ã‚ãªãŸã®IPアドレスã¯ã€Œ$3ã€ã§ã™ã€‚å•ã„åˆã‚ã›ã‚’è¡Œã†éš›ã«ã¯ã€ã“ã®IPアドレスを必ãšæ›¸ã„ã¦ãã ã•ã„。',
+$1 ã¾ãŸã¯ä»–ã®[[{{int:grouppage-sysop}}|{{int:group-sysop}}]]ã«ã“ã®ä»¶ã«ã¤ã„ã¦ãƒ¡ãƒ¼ãƒ«ã§å•ã„åˆã‚ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãŸã ã—ã€[[Special:Preferences|オプション]]ã«æ­£ã—ã„メールアドレスãŒç™»éŒ²ã•ã‚Œã¦ã„ãªã„å ´åˆã€ã€Œ{{int:emailuser}}ã€æ©Ÿèƒ½ãŒä½¿ãˆãªã„ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。
+
+ã‚ãªãŸã®IPアドレスã¯ã€Œ$3ã€ã€ãƒ–ロックID㯠&#x23;$5 ã§ã™ã€‚å•ã„åˆã‚ã›ã‚’è¡Œã†éš›ã«ã¯ã€ã“ã®æƒ…報を必ãšæ›¸ã„ã¦ãã ã•ã„。',
'blockedoriginalsource' => '以下㫠\'\'\'$1\'\'\' ã®ã‚½ãƒ¼ã‚¹ã‚’示ã—ã¾ã™:',
'blockededitsource' => '\'\'\'$1\'\'\' ã¸ã® \'\'\'ã‚ãªãŸã®ç·¨é›†\'\'\' を以下ã«ç¤ºã—ã¾ã™:',
'whitelistedittitle' => '編集ã«ã¯ãƒ­ã‚°ã‚¤ãƒ³ãŒå¿…è¦',
@@ -452,7 +501,7 @@ $1 ã¾ãŸã¯ä»–ã®[[{{int:grouppage-sysop}}|{{int:group-sysop}}]]ã«ã“ã®ä»¶ã«
'userinvalidcssjstitle' => '\'\'\'警告:\'\'\' "$1" ã¨ã„ã†å¤–装ã¯ã‚ã‚Šã¾ã›ã‚“。.css 㨠.js ページを編集ã™ã‚‹å†ã«ã¯ã‚¿ã‚¤ãƒˆãƒ«ã‚’å°æ–‡å­—ã«ã™ã‚‹ã“ã¨ã‚’忘れãªã„ã§ãã ã•ã„。例ãˆã° {{ns:user}}:Hoge/Monobook.css ã§ã¯ãªã {{ns:user}}:Hoge/monobook.css ã¨ãªã‚Šã¾ã™ã€‚',
'updated' => '(更新)',
'note' => '<strong>ãŠçŸ¥ã‚‰ã›:</strong>',
-'previewnote' => 'ã“ã‚Œã¯ãƒ—レビューã§ã™ã€‚ã¾ã ä¿å­˜ã•ã‚Œã¦ã„ã¾ã›ã‚“ï¼',
+'previewnote' => 'ã“ã‚Œã¯ãƒ—レビューã§ã™ã€‚ã¾ã ä¿å­˜ã•ã‚Œã¦ã„ã¾ã›ã‚“!',
'session_fail_preview' => '<strong>セッションãŒåˆ‡æ–­ã•ã‚ŒãŸãŸã‚編集をä¿å­˜ã§ãã¾ã›ã‚“。もã†ä¸€åº¦ã‚„ã‚ŠãªãŠã—ã¦ãã ã•ã„。ãã‚Œã§ã‚‚失敗ã™ã‚‹å ´åˆã€ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ã¦ã‹ã‚‰ãƒ­ã‚°ã‚¤ãƒ³ã—ç›´ã—ã¦ãã ã•ã„。</strong>',
'previewconflict' => 'ã“ã®ãƒ—レビューã¯ã€ä¸Šã®æ–‡ç« ç·¨é›†ã‚¨ãƒªã‚¢ã®æ–‡ç« ã‚’ä¿å­˜ã—ãŸå ´åˆã«ã©ã†è¦‹ãˆã‚‹ã‚ˆã†ã«ãªã‚‹ã‹ã‚’示ã™ã‚‚ã®ã§ã™ã€‚',
'session_fail_preview_html'=> '<strong>セッションデータãŒè¦‹ã¤ã‹ã‚‰ãªã„ãŸã‚ã€ã‚ãªãŸã®ç·¨é›†ã‚’ä¿å­˜ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚</strong>
@@ -475,28 +524,39 @@ $1 ã¾ãŸã¯ä»–ã®[[{{int:grouppage-sysop}}|{{int:group-sysop}}]]ã«ã“ã®ä»¶ã«
'copyrightwarning' => '\'\'\'■投稿ã™ã‚‹å‰ã«ä»¥ä¸‹ã‚’確èªã—ã¦ãã ã•ã„â– \'\'\'
* {{SITENAME}}ã«æŠ•ç¨¿ã•ã‚ŒãŸæ–‡æ›¸ã¯ã€ã™ã¹ã¦$2(詳細ã¯$1ã‚’å‚照)ã«ã‚ˆã£ã¦å…¬é–‹ã•ã‚Œã‚‹ã“ã¨ã«åŒæ„ã—ã¦ãã ã•ã„。
* ã‚ãªãŸã®æ–‡ç« ãŒä»–人ã«ã‚ˆã£ã¦è‡ªç”±ã«ç·¨é›†ã€é…布ã•ã‚Œã‚‹ã“ã¨ã‚’望ã¾ãªã„å ´åˆã¯ã€æŠ•ç¨¿ã‚’控ãˆã¦ãã ã•ã„。
-* ã‚ãªãŸã®æŠ•ç¨¿ã™ã‚‹æ–‡ç« ã¯ã‚ãªãŸè‡ªèº«ã«ã‚ˆã£ã¦æ›¸ã‹ã‚ŒãŸã‚‚ã®ã§ã‚ã‚‹ã‹ã€ãƒ‘ブリック・ドメインã‹ãã‚Œã«é¡žã™ã‚‹è‡ªç”±ãªãƒªã‚½ãƒ¼ã‚¹ã‹ã‚‰ã®è¤‡è£½ã§ã‚ã‚‹ã“ã¨ã‚’ç´„æŸã—ã¦ãã ã•ã„。\'\'\'ã‚ãªãŸãŒè‘—作権をä¿æŒã—ã¦ã„ãªã„作å“を許諾ãªã—ã«æŠ•ç¨¿ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“ï¼\'\'\'',
+* ã‚ãªãŸã®æŠ•ç¨¿ã™ã‚‹æ–‡ç« ã¯ã‚ãªãŸè‡ªèº«ã«ã‚ˆã£ã¦æ›¸ã‹ã‚ŒãŸã‚‚ã®ã§ã‚ã‚‹ã‹ã€ãƒ‘ブリック・ドメインã‹ãã‚Œã«é¡žã™ã‚‹è‡ªç”±ãªãƒªã‚½ãƒ¼ã‚¹ã‹ã‚‰ã®è¤‡è£½ã§ã‚ã‚‹ã“ã¨ã‚’ç´„æŸã—ã¦ãã ã•ã„。\'\'\'ã‚ãªãŸãŒè‘—作権をä¿æŒã—ã¦ã„ãªã„作å“を許諾ãªã—ã«æŠ•ç¨¿ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“!\'\'\'',
'copyrightwarning2' => '\'\'\'■投稿ã™ã‚‹å‰ã«ä»¥ä¸‹ã‚’確èªã—ã¦ãã ã•ã„â– \'\'\'
* ã‚ãªãŸã®æ–‡ç« ãŒä»–人ã«ã‚ˆã£ã¦è‡ªç”±ã«ç·¨é›†ã€é…布ã•ã‚Œã‚‹ã“ã¨ã‚’望ã¾ãªã„å ´åˆã¯ã€æŠ•ç¨¿ã‚’控ãˆã¦ãã ã•ã„。
-* ã‚ãªãŸã®æŠ•ç¨¿ã™ã‚‹æ–‡ç« ã¯ã‚ãªãŸè‡ªèº«ã«ã‚ˆã£ã¦æ›¸ã‹ã‚ŒãŸã‚‚ã®ã§ã‚ã‚‹ã‹ã€ãƒ‘ブリック・ドメインã‹ãã‚Œã«é¡žã™ã‚‹è‡ªç”±ãªãƒªã‚½ãƒ¼ã‚¹ã‹ã‚‰ã®è¤‡è£½ã§ã‚ã‚‹ã“ã¨ã‚’ç´„æŸã—ã¦ãã ã•ã„(詳細ã¯$1ã‚’å‚照)。\'\'\'ã‚ãªãŸãŒè‘—作権をä¿æŒã—ã¦ã„ãªã„作å“を許諾ãªã—ã«æŠ•ç¨¿ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“ï¼\'\'\'',
+* ã‚ãªãŸã®æŠ•ç¨¿ã™ã‚‹æ–‡ç« ã¯ã‚ãªãŸè‡ªèº«ã«ã‚ˆã£ã¦æ›¸ã‹ã‚ŒãŸã‚‚ã®ã§ã‚ã‚‹ã‹ã€ãƒ‘ブリック・ドメインã‹ãã‚Œã«é¡žã™ã‚‹è‡ªç”±ãªãƒªã‚½ãƒ¼ã‚¹ã‹ã‚‰ã®è¤‡è£½ã§ã‚ã‚‹ã“ã¨ã‚’ç´„æŸã—ã¦ãã ã•ã„(詳細ã¯$1ã‚’å‚照)。\'\'\'ã‚ãªãŸãŒè‘—作権をä¿æŒã—ã¦ã„ãªã„作å“を許諾ãªã—ã«æŠ•ç¨¿ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“!\'\'\'',
'longpagewarning' => '\'\'\'警告:\'\'\' ã“ã®ãƒšãƒ¼ã‚¸ã®ã‚µã‚¤ã‚ºã¯ $1 キロãƒã‚¤ãƒˆã§ã™ã€‚一部ã®å¤ã„ブラウザã§ã¯ 32 キロãƒã‚¤ãƒˆä»¥ä¸Šã®ãƒšãƒ¼ã‚¸ã‚’編集ã™ã‚‹ã¨å•é¡ŒãŒèµ·ãã‚‹ã‚‚ã®ãŒã‚ã‚Šã¾ã™ã€‚ページを節ã«åˆ†ã‘ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。',
'longpageerror' => '<strong>エラー: ã‚ãªãŸãŒæŠ•ç¨¿ã—ãŸãƒ†ã‚­ã‚¹ãƒˆã¯ $1 キロãƒã‚¤ãƒˆã®é•·ã•ãŒã‚ã‚Šã¾ã™ã€‚ã“ã‚Œã¯æŠ•ç¨¿ã§ãる最大ã®é•·ã•ã§ã‚ã‚‹ $2 キロãƒã‚¤ãƒˆã‚’超ãˆã¦ã„ã¾ã™ã€‚ã“ã®ç·¨é›†ã‚’ä¿å­˜ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。</strong>',
'readonlywarning' => '<strong>警告: データベースãŒãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã®ãŸã‚ã«ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚ç¾åœ¨ã¯ç·¨é›†çµæžœã‚’ä¿å­˜ã§ãã¾ã›ã‚“。文章をカットアンドペーストã—ã¦ãƒ­ãƒ¼ã‚«ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—ã¦ä¿å­˜ã—ã€å¾Œã»ã©ä¿å­˜ã‚’ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。</strong>',
'protectedpagewarning' => '\'\'\'警告:\'\'\' ã“ã®ãƒšãƒ¼ã‚¸ã¯ä¿è­·ã•ã‚Œã¦ã„ã¾ã™ã€‚{{int:group-sysop}}ã—ã‹ç·¨é›†ã§ãã¾ã›ã‚“。詳ã—ãã¯[[Project:ä¿è­·ã®æ–¹é‡|ä¿è­·ã®æ–¹é‡]]ã‚’å‚ç…§ã—ã¦ãã ã•ã„。',
'semiprotectedpagewarning'=> '\'\'\'ãŠçŸ¥ã‚‰ã›:\'\'\' ã“ã®ãƒšãƒ¼ã‚¸ã¯ç™»éŒ²åˆ©ç”¨è€…ã®ã¿ãŒç·¨é›†ã§ãるよã†ä¿è­·ã•ã‚Œã¦ã„ã¾ã™ã€‚',
'templatesused' => 'ã“ã®ãƒšãƒ¼ã‚¸ã§ä½¿ã‚ã‚Œã¦ã„るテンプレート:',
+'templatesusedpreview' => 'ã“ã®ãƒ—レビューã§ä½¿ã‚ã‚Œã¦ã„るテンプレート:',
+'templatesusedsection' => 'ã“ã®ç¯€ã§ä½¿ã‚ã‚Œã¦ã„るテンプレート:',
+'template-protected' => '(ä¿è­·ï¼‰',
+'template-semiprotected'=> '(åŠä¿è­·ï¼‰',
'edittools' => '<!-- ã“ã“ã«æ›¸ã„ãŸãƒ†ã‚­ã‚¹ãƒˆã¯ç·¨é›†åŠã³ã‚¢ãƒƒãƒ—ロードã®ãƒ•ã‚©ãƒ¼ãƒ ã®ä¸‹ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ -->',
'nocreatetitle' => 'ページを作æˆã§ãã¾ã›ã‚“',
'nocreatetext' => 'ã“ã®ã‚µã‚¤ãƒˆã§ã¯ãƒšãƒ¼ã‚¸ã®æ–°è¦ä½œæˆã‚’制é™ã—ã¦ã„ã¾ã™ã€‚å…ƒã®ãƒšãƒ¼ã‚¸ã«æˆ»ã£ã¦æ—¢å­˜ã®ãƒšãƒ¼ã‚¸ã‚’編集ã™ã‚‹ã‹ã€[[Special:Userlogin|ログイン]]ã—ã¦ãã ã•ã„。',
+
+# "Undo" feature
+'undo-success' => '編集ã®å–り消ã—ã«æˆåŠŸã—ã¾ã—ãŸã€‚ä¿å­˜ãƒœã‚¿ãƒ³ã‚’押ã™ã¨å¤‰æ›´ãŒç¢ºå®šã•ã‚Œã¾ã™ã€‚',
+'undo-failure' => '中間ã®ç‰ˆã§ã®ç·¨é›†ã¨ç«¶åˆã—ãŸãŸã‚ã€è‡ªå‹•å–り消ã—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚',
+'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|会話]]) ã®ç·¨é›† ( $1 版 ) ã‚’å–り消ã—',
+
+# History pages
'revhistory' => '変更履歴',
'viewpagelogs' => 'ã“ã®ãƒšãƒ¼ã‚¸ã«é–¢ã™ã‚‹ãƒ­ã‚°ã‚’見る',
'nohistory' => 'ã“ã®ãƒšãƒ¼ã‚¸ã«ã¯å¤‰æ›´å±¥æ­´ãŒã‚ã‚Šã¾ã›ã‚“。',
'revnotfound' => 'è¦æ±‚ã•ã‚ŒãŸç‰ˆãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。',
-'revnotfoundtext' => 'è¦æ±‚ã•ã‚ŒãŸã“ã®ãƒšãƒ¼ã‚¸ã®æ—§ç‰ˆã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ã“ã®ãƒšãƒ¼ã‚¸ã«ã‚¢ã‚¯ã‚»ã‚¹ã—㟠URL ã‚’ã‚‚ã†ä¸€åº¦ç¢ºèªã—ã¦ãã ã•ã„。',
+'revnotfoundtext' => 'è¦æ±‚ã•ã‚ŒãŸã“ã®ãƒšãƒ¼ã‚¸ã®æ—§ç‰ˆã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ã“ã®ãƒšãƒ¼ã‚¸ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ãŸURLã‚’ã‚‚ã†ä¸€åº¦ç¢ºèªã—ã¦ãã ã•ã„。',
'loadhist' => '変更履歴ã®èª­ã¿è¾¼ã¿ä¸­',
'currentrev' => '最新版',
'revisionasof' => '$1ã®ç‰ˆ',
-'old-revision-navigation'=> '$1; $5 ã«ã‚ˆã‚‹ç‰ˆ<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => '$1; $2 ã«ã‚ˆã‚‹ç‰ˆ',
'previousrevision' => 'â†å‰ã®ç‰ˆ',
'nextrevision' => '次ã®ç‰ˆâ†’',
'currentrevisionlink' => '最新版を表示',
@@ -524,10 +584,11 @@ $1 ã¾ãŸã¯ä»–ã®[[{{int:grouppage-sysop}}|{{int:group-sysop}}]]ã«ã“ã®ä»¶ã«
# Revision deletion
'revisiondelete' => '版ã®å‰Šé™¤ã¨å¾©å¸°',
'revdelete-nooldid-title' => '対象版ãŒã‚ã‚Šã¾ã›ã‚“',
+'revdelete-nooldid-text'=> 'æ“作ã®å®Œäº†ã«å¿…è¦ãªç‰ˆãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。',
'revdelete-selected' => '[[:$1]]ã®ã€ä»¥ä¸‹ã®é¸æŠžã•ã‚ŒãŸç‰ˆã«å¯¾ã™ã‚‹æ“作:',
'revdelete-text' => '版ã®å‰Šé™¤ã§ã¯ãƒšãƒ¼ã‚¸ã®å±¥æ­´ã«ãã®ç‰ˆã¯è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ã—ã‹ã—ãã®ç‰ˆã«å«ã¾ã‚Œã‚‹ãƒ†ã‚­ã‚¹ãƒˆã«ã¯ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããªã‚Šã¾ã™ã€‚
-サーãƒç®¡ç†è€…ã«ã“れ以上ã®åˆ¶é™ã‚’ã‹ã‘られãªã„é™ã‚Šã€ä»–ã®{{int:group-sysop}}ã¯éš ã‚ŒãŸç‰ˆã‚’読んã ã‚Šã€å…ƒã«æˆ»ã—ãŸã‚Šã§ãã¾ã™ã€‚',
+サーãƒãƒ¼ç®¡ç†è€…ã«ã“れ以上ã®åˆ¶é™ã‚’ã‹ã‘られãªã„é™ã‚Šã€ä»–ã®{{int:group-sysop}}ã¯éš ã‚ŒãŸç‰ˆã‚’読んã ã‚Šã€å…ƒã«æˆ»ã—ãŸã‚Šã§ãã¾ã™ã€‚',
'revdelete-legend' => '版ã®å‰Šé™¤ã®é©ç”¨',
'revdelete-hide-text' => '版ã®ãƒ†ã‚­ã‚¹ãƒˆã‚’éš ã™',
'revdelete-hide-comment'=> '編集ã®è¦ç´„ã‚’éš ã™',
@@ -536,6 +597,8 @@ $1 ã¾ãŸã¯ä»–ã®[[{{int:grouppage-sysop}}|{{int:group-sysop}}]]ã«ã“ã®ä»¶ã«
'revdelete-log' => 'è¦ç´„:',
'revdelete-submit' => '隠蔽ã®è¨­å®šã‚’é©ç”¨',
'revdelete-logentry' => '[[$1]]ã®ç‰ˆã®å‰Šé™¤æƒ…報をæ“作ã—ã¾ã—ãŸ',
+
+# Diffs
'difference' => '版間ã§ã®å·®åˆ†',
'loadingrev' => '差分をã¨ã‚‹ãŸã‚ã«å¤ã„版を読ã¿è¾¼ã‚“ã§ã„ã¾ã™',
'lineno' => '$1 行',
@@ -543,6 +606,9 @@ $1 ã¾ãŸã¯ä»–ã®[[{{int:grouppage-sysop}}|{{int:group-sysop}}]]ã«ã“ã®ä»¶ã«
'selectnewerversionfordiff'=> '比較ã™ã‚‹æ–°ã—ã„版をé¸æŠž',
'selectolderversionfordiff'=> '比較ã™ã‚‹å¤ã„版をé¸æŠž',
'compareselectedversions'=> 'é¸æŠžã—ãŸç‰ˆåŒå£«ã‚’比較',
+'editundo' => 'å–り消ã—',
+'diff-multi' => '(間㮠$1 版分ãŒéžè¡¨ç¤ºã§ã™ï¼‰',
+
'searchresults' => '検索çµæžœ',
'searchresulttext' => '{{SITENAME}}ã®æ¤œç´¢ã«é–¢ã™ã‚‹è©³ã—ã„情報ã¯ã€[[{{ns:project}}:検索]]ã‚’ã”覧ãã ã•ã„。',
'searchsubtitle' => 'å•ã„åˆã‚ã›: "[[$1]]"',
@@ -615,7 +681,7 @@ $2リダイレクトをå«ã‚ã‚‹ &nbsp; &nbsp; &nbsp; $3 $9',
'timezonetext' => 'UTCã¨ã‚ãªãŸã®åœ°åŸŸã®æ¨™æº–時間ã¨ã®å·®ã‚’入力ã—ã¦ãã ã•ã„(日本国内ã¯9:00)。',
'localtime' => 'ã‚ãªãŸã®ç¾åœ¨æ™‚刻',
'timezoneoffset' => '時差¹',
-'servertime' => 'サーãƒã®ç¾åœ¨æ™‚刻',
+'servertime' => 'サーãƒãƒ¼ã®ç¾åœ¨æ™‚刻',
'guesstimezone' => '自動設定',
'allowemail' => 'ä»–ã®åˆ©ç”¨è€…ã‹ã‚‰ã®ãƒ¡ãƒ¼ãƒ«ã®å—ã‘å–りを許å¯ã™ã‚‹',
'defaultns' => '標準ã§æ¤œç´¢ã™ã‚‹åå‰ç©ºé–“:',
@@ -643,7 +709,8 @@ $2リダイレクトをå«ã‚ã‚‹ &nbsp; &nbsp; &nbsp; $3 $9',
'changes' => 'æ›´æ–°',
'recentchanges' => '最近更新ã—ãŸãƒšãƒ¼ã‚¸',
'recentchangestext' => '最近付ã‘加ãˆã‚‰ã‚ŒãŸå¤‰æ›´ã¯ã“ã®ãƒšãƒ¼ã‚¸ã§ç¢ºèªã§ãã¾ã™ã€‚',
-'rcnote' => '以下㯠$3 ã¾ã§ã® <strong>$2</strong> 日間ã«ç·¨é›†ã•ã‚ŒãŸ <strong>$1</strong> ページã§ã™ï¼ˆ<strong>{{int:newpageletter}}</strong>=æ–°è¦é …ç›®ã€<strong>{{int:minoreditletter}}</strong>=細部ã®ç·¨é›†ã€æ—¥æ™‚ã¯ã‚ªãƒ—ションã§æœªè¨­å®šãªã‚‰UTC)',
+'recentchanges-feed-description' => '最近付ã‘加ãˆã‚‰ã‚ŒãŸå¤‰æ›´ã¯ã“ã®ãƒ•ã‚£ãƒ¼ãƒ‰ã§ç¢ºèªã§ãã¾ã™ã€‚',
+'rcnote' => '以下㯠$3 ã¾ã§ã® <strong>$2</strong> 日間ã«ç·¨é›†ã•ã‚ŒãŸ <strong>$1</strong> ページã§ã™ï¼ˆ<strong>{{int:newpageletter}}</strong>=æ–°è¦é …ç›®ã€<strong>{{int:minoreditletter}}</strong>=細部ã®ç·¨é›†ã€<strong>{{int:boteditletter}}</strong>=ボットã®ç·¨é›†ã€æ—¥æ™‚ã¯ã‚ªãƒ—ションã§æœªè¨­å®šãªã‚‰UTC)',
'rcnotefrom' => '以下㯠<b>$2</b> ã¾ã§ã®æ›´æ–°ã§ã™ã€‚(最大 <b>$1</b> 件)',
'rclistfrom' => '$1以後ç¾åœ¨ã¾ã§ã®æ›´æ–°ã‚’表示',
'rcshowhideminor' => '細部ã®ç·¨é›†ã‚’$1',
@@ -658,6 +725,9 @@ $2リダイレクトをå«ã‚ã‚‹ &nbsp; &nbsp; &nbsp; $3 $9',
'hide' => 'éš ã™',
'show' => '表示',
'minoreditletter' => 'M',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
+'sectionlink' => '→',
'number_of_watching_users_pageview'=> '[$1人ãŒã‚¦ã‚©ãƒƒãƒã—ã¦ã„ã¾ã™]',
'rc_categories' => 'カテゴリを制é™ï¼ˆ"|" ã§åŒºåˆ‡ã‚‹ï¼‰',
'rc_categories_any' => 'ã™ã¹ã¦',
@@ -667,7 +737,7 @@ $2リダイレクトをå«ã‚ã‚‹ &nbsp; &nbsp; &nbsp; $3 $9',
'reuploaddesc' => 'アップロードã®ãƒ•ã‚©ãƒ¼ãƒ ã¸æˆ»ã‚‹',
'uploadnologin' => 'ログインã—ã¦ã„ã¾ã›ã‚“',
'uploadnologintext' => 'ファイルをアップロードã™ã‚‹ã«ã¯[[Special:Userlogin|ログイン]]ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
-'upload_directory_read_only'=> 'アップロード先ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª ($1) ã«ã‚¦ã‚§ãƒ–サーãƒãŒæ›¸ãè¾¼ã‚ã¾ã›ã‚“。',
+'upload_directory_read_only'=> 'アップロード先ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª ($1) ã«ã‚¦ã‚§ãƒ–サーãƒãƒ¼ãŒæ›¸ãè¾¼ã‚ã¾ã›ã‚“。',
'uploaderror' => 'アップロード エラー',
'uploadtext' => 'ファイルを新ã—ãアップロードã™ã‚‹å ´åˆã«ã¯ã€ä»¥ä¸‹ã®ãƒ•ã‚©ãƒ¼ãƒ ã‚’利用ã—ã¦ãã ã•ã„。
* éŽåŽ»ã«ã‚¢ãƒƒãƒ—ロードã•ã‚ŒãŸç”»åƒã¯[[Special:Imagelist|{{int:imagelist}}]]ã§é–²è¦§ã—ãŸã‚ŠæŽ¢ã—ãŸã‚Šã§ãã¾ã™ã€‚
@@ -696,7 +766,7 @@ $2リダイレクトをå«ã‚ã‚‹ &nbsp; &nbsp; &nbsp; $3 $9',
'illegalfilename' => 'ファイルå "$1" ã«ãƒšãƒ¼ã‚¸ãƒ»ã‚¿ã‚¤ãƒˆãƒ«ã¨ã—ã¦ä½¿ãˆãªã„文字ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ファイルåを変更ã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ã‚¢ãƒƒãƒ—ロードã—ã¦ãã ã•ã„。',
'badfilename' => 'ファイルå㯠"$1" ã¸å¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚',
'badfiletype' => '".$1" ã¯æŽ¨å¥¨ã•ã‚Œã¦ã„るファイルフォーマットã§ã¯ã‚ã‚Šã¾ã›ã‚“。',
-'largefile' => 'ファイルサイズ㯠$1 ãƒã‚¤ãƒˆä»¥ä¸‹ã«æŠ‘ãˆã‚‹ã“ã¨ãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ã€‚ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ $2 ãƒã‚¤ãƒˆã§ã™ã€‚',
+'large-file' => 'ファイルサイズ㯠$1 ãƒã‚¤ãƒˆä»¥ä¸‹ã«æŠ‘ãˆã‚‹ã“ã¨ãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã™ã€‚ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ $2 ãƒã‚¤ãƒˆã§ã™ã€‚',
'largefileserver' => 'ファイルãŒå¤§ãã™ãŽã¾ã™ã€‚サーãƒãƒ¼è¨­å®šã§è¨±ã•ã‚Œã¦ã„る最大値を超éŽã—ã¾ã—ãŸã€‚',
'emptyfile' => 'ã‚ãªãŸãŒã‚¢ãƒƒãƒ—ロードã—よã†ã¨ã—ã¦ã„るファイルã¯å†…容ãŒç©ºã§ã‚ã‚‹ã‹ã€ã‚‚ã—ãã¯ãƒ•ã‚¡ã‚¤ãƒ«åã®æŒ‡å®šãŒé–“é•ã£ã¦ã„ã¾ã™ã€‚ã‚‚ã†ä¸€åº¦ã€ãƒ•ã‚¡ã‚¤ãƒ«åãŒæ­£ã—ã„ã‹ã€ã‚ã‚‹ã„ã¯ã‚¢ãƒƒãƒ—ロードã—よã†ã¨ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã§ã‚ã‚‹ã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„。',
'fileexists' => 'ã“ã®åå‰ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ—¢ã«å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚$1ã¨ç½®ãæ›ãˆã‚‹ã‹ã©ã†ã‹ãŠç¢ºã‹ã‚ãã ã•ã„。',
@@ -722,7 +792,21 @@ $2リダイレクトをå«ã‚ã‚‹ &nbsp; &nbsp; &nbsp; $3 $9',
'destfilename' => '掲載ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«å',
'watchthisupload' => 'ç”»åƒã‚’ウォッãƒ',
'filewasdeleted' => 'アップロードã—よã†ã¨ã—ã¦ã„るファイルåã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒä»¥å‰å‰Šé™¤ã•ã‚Œã¦ã„ã¾ã™ã€‚å†ã³ã‚¢ãƒƒãƒ—ロードã™ã‚‹å‰ã« $1 を確èªã—ã¦ãã ã•ã„。',
+
+'upload-proto-error' => 'ä¸æ­£ãªãƒ—ロトコル',
+'upload-proto-error-text' => 'アップロード元ã®URL㯠<code>http://</code> ã‹ <code>ftp://</code> ã§å§‹ã¾ã£ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
+'upload-file-error' => '内部エラー',
+'upload-file-error-text'=> 'サーãƒãƒ¼ã®å†…部エラーã®ãŸã‚ã€ä¸€æ™‚ファイルã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚システムã®ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。',
+'upload-misc-error' => 'ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼',
+'upload-misc-error-text'=> 'アップロード時ã«ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸã€‚指定ã—ãŸURLãŒã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ã§æœ‰åŠ¹ãªã‚‚ã®ã§ã‚ã‚‹ã‹ã‚’å†åº¦ç¢ºèªã—ã¦ãã ã•ã„。ãã‚Œã§ã‚‚ã“ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹å ´åˆã¯ã€ã‚·ã‚¹ãƒ†ãƒ ã®ç®¡ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。',
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'URLã«åˆ°é”ä¸èƒ½',
+'upload-curl-error6-text' => '指定ã—ãŸURLã«åˆ°é”ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚URLãŒæ­£ã—ã„ã‚‚ã®ã§ã‚ã‚‹ã‹ã€æŒ‡å®šã—ãŸã‚µã‚¤ãƒˆãŒç¾åœ¨ä½¿ç”¨å¯èƒ½ã‹ã‚’å†åº¦ç¢ºèªã—ã¦ãã ã•ã„。',
+'upload-curl-error28' => 'タイムアウト',
+'upload-curl-error28-text' => '相手サイトã‹ã‚‰ã®å¿œç­”ãŒã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚指定ã—ãŸã‚µã‚¤ãƒˆãŒç¾åœ¨ä½¿ç”¨å¯èƒ½ã‹ã‚’確èªã—ãŸä¸Šã§ã€ã—ã°ã‚‰ãå¾…ã£ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。ã¾ãŸã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆãŒæ··é›‘ã—ã¦ã„ãªã„時間帯ã«å®Ÿè¡Œã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚',
+
'license' => 'ライセンス',
+'nolicense' => 'ライセンス情報をé¸æŠžã—ã¦ãã ã•ã„:',
'upload_source_url' => '(インターãƒãƒƒãƒˆä¸Šã®URL)',
'upload_source_file' => '(ã‚ãªãŸã®ã‚³ãƒ³ãƒ”ューター上ã®ãƒ•ã‚¡ã‚¤ãƒ«ï¼‰',
@@ -783,7 +867,8 @@ $2リダイレクトをå«ã‚ã‚‹ &nbsp; &nbsp; &nbsp; $3 $9',
ページã®ç·é–²è¦§å›žæ•°ã¯\'\'\'$3\'\'\'回ã§ã™ã€‚ã¾ãŸã€\'\'\'$4\'\'\'回ã®ç·¨é›†ãŒè¡Œã‚ã‚Œã¾ã—ãŸã€‚å¹³å‡ã™ã‚‹ã¨ã€1ページã‚ãŸã‚Š\'\'\'$5\'\'\'回ã®ç·¨é›†ãŒè¡Œã‚ã‚Œã€1編集ã‚ãŸã‚Š\'\'\'$6\'\'\'回閲覧ã•ã‚Œã¦ã„ã¾ã™ã€‚
[http://meta.wikimedia.org/wiki/Help:Job_queue job queue] ã®é•·ã•ã¯ \'\'\'$7\'\'\' ã§ã™ã€‚',
-'userstatstext' => '登録済ã¿ã®åˆ©ç”¨è€…ã¯\'\'\'$1\'\'\'人ã§ã€å†…\'\'\'$2\'\'\'人 (\'\'\'$4%\'\'\') ãŒ{{int:group-sysop}}権é™ã‚’æŒã£ã¦ã„ã¾ã™ã€‚($3ã‚’å‚ç…§)',
+'statistics-mostpopular'=> '最も閲覧ã•ã‚Œã¦ã„るページ',
+'userstatstext' => '登録済ã¿ã®åˆ©ç”¨è€…ã¯\'\'\'$1\'\'\'人ã§ã€å†…\'\'\'$2\'\'\'人 (\'\'\'$4%\'\'\') ãŒ$5権é™ã‚’æŒã£ã¦ã„ã¾ã™ã€‚($3ã‚’å‚ç…§)',
'disambiguations' => '曖昧ã•å›žé¿ãƒšãƒ¼ã‚¸',
'disambiguationspage' => 'Template:aimai',
'disambiguationstext' => '以下ã®ãƒšãƒ¼ã‚¸ã¯<b>曖昧ã•å›žé¿ãƒšãƒ¼ã‚¸</b>ã¸ãƒªãƒ³ã‚¯ã—ã¦ã„ã¾ã™ã€‚ã“れらã®ãƒšãƒ¼ã‚¸ã¯ã‚ˆã‚Šé©ã—ãŸä¸»é¡Œã®ãƒšãƒ¼ã‚¸ã¸ãƒªãƒ³ã‚¯ã•ã‚Œã‚‹ã¹ãã§ã™ã€‚<br />
@@ -799,6 +884,7 @@ $1 ã«ãƒªãƒ³ã‚¯ã—ã¦ã„るページã¯æ›–昧ã•å›žé¿ãƒšãƒ¼ã‚¸ã¨è¦‹ãªã•ã‚Œã
'nrevisions' => '$1 ã®ç‰ˆ',
'nviews' => '$1 回表示',
'lonelypages' => '孤立ã—ã¦ã„るページ',
+'lonelypagestext' => '以下ã®ãƒšãƒ¼ã‚¸ã¯ã€ã©ã“ã‹ã‚‰ã‚‚リンクã•ã‚Œã¦ã„ãªã„孤立ã—ãŸãƒšãƒ¼ã‚¸ã§ã™ã€‚',
'uncategorizedpages' => 'カテゴリ未導入ã®ãƒšãƒ¼ã‚¸',
'uncategorizedcategories'=> 'カテゴリ未導入ã®ã‚«ãƒ†ã‚´ãƒª',
'uncategorizedimages' => 'カテゴリ未導入ã®ç”»åƒ',
@@ -818,6 +904,7 @@ $1 ã«ãƒªãƒ³ã‚¯ã—ã¦ã„るページã¯æ›–昧ã•å›žé¿ãƒšãƒ¼ã‚¸ã¨è¦‹ãªã•ã‚Œã
'shortpages' => '短ã„ページ',
'longpages' => 'é•·ã„ページ',
'deadendpages' => '有効ãªãƒšãƒ¼ã‚¸ã¸ã®ãƒªãƒ³ã‚¯ãŒãªã„ページ',
+'deadendpagestext' => '以下ã®ãƒšãƒ¼ã‚¸ã¯ã€ã“ã®ã‚¦ã‚£ã‚­ã®ä»–ã®ãƒšãƒ¼ã‚¸ã«ãƒªãƒ³ã‚¯ã—ã¦ã„ãªã„ページã§ã™ã€‚',
'listusers' => '登録利用者ã®ä¸€è¦§',
'specialpages' => '特別ページ',
'spheading' => '特別ページ',
@@ -832,19 +919,29 @@ $1 ã«ãƒªãƒ³ã‚¯ã—ã¦ã„るページã¯æ›–昧ã•å›žé¿ãƒšãƒ¼ã‚¸ã¨è¦‹ãªã•ã‚Œã
'movethispage' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’移動',
'unusedimagestext' => '<p>ä»–ã®ã‚¦ã‚§ãƒ–サイトãŒURLを直接用ã„ã¦ç”»åƒã«ãƒªãƒ³ã‚¯ã—ã¦ã„ã‚‹å ´åˆã‚‚ã‚ã‚Šã¾ã™ã€‚以下ã®ç”»åƒä¸€è¦§ã«ã¯ã€ãã®ã‚ˆã†ãªå½¢ã§åˆ©ç”¨ã•ã‚Œã¦ã„ã‚‹ç”»åƒãŒå«ã¾ã‚Œã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚</p>',
'unusedcategoriestext' => '以下ã®ã‚«ãƒ†ã‚´ãƒªãƒšãƒ¼ã‚¸ã¯ã©ã®é …目・カテゴリã‹ã‚‰ã‚‚使ã‚ã‚Œã¦ã„ã¾ã›ã‚“。',
-'booksources' => '文献資料',
+
'categoriespagetext' => '{{SITENAME}}ã«ã¯ä»¥ä¸‹ã®ã‚«ãƒ†ã‚´ãƒªãŒå­˜åœ¨ã—ã¾ã™ã€‚',
+'data' => 'データ',
'userrights' => '利用者権é™ã®ç®¡ç†',
'groups' => 'ユーザーグループ',
-'booksourcetext' => '以下ã®ãƒªã‚¹ãƒˆã¯ã€æ–°æœ¬ã€å¤æœ¬ãªã©ã‚’販売ã—ã¦ã„る外部サイトã¸ã®ãƒªãƒ³ã‚¯ã§ã™ã€‚ã‚ãªãŸãŒãŠæŽ¢ã—ã®æœ¬ã«ã¤ã„ã¦ã€æ›´ã«è©³ã—ã„情報ãŒæä¾›ã•ã‚Œã¦ã„ã‚‹å ´åˆã‚‚ã‚ã‚Šã¾ã™ã€‚',
+'isbn' => 'ISBN',
'alphaindexline' => '$1―$2',
'version' => 'ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±',
'log' => 'ログ',
'alllogstext' => 'アップロードã€å‰Šé™¤ã€ä¿è­·ã€æŠ•ç¨¿ãƒ–ロックã€æ¨©é™å¤‰æ›´ã®ãƒ­ã‚°ãŒã¾ã¨ã‚ã¦è¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™ã€‚ログã®ç¨®é¡žã€å®Ÿè¡Œã—ãŸåˆ©ç”¨è€…ã€å½±éŸ¿ã‚’å—ã‘ãŸãƒšãƒ¼ã‚¸ï¼ˆåˆ©ç”¨è€…)ã«ã‚ˆã‚‹çµžã‚Šè¾¼ã¿ãŒã§ãã¾ã™ã€‚',
'logempty' => 'æ¡ä»¶ã«ãƒžãƒƒãƒã™ã‚‹è¨˜éŒ²ã¯ã‚ã‚Šã¾ã›ã‚“。',
+# Book sources
+'booksources' => '文献資料',
+'booksources-search-legend' => '文献資料を検索',
+'booksources-isbn' => 'ISBN:',
+'booksources-go' => '検索',
+'booksources-text' => '以下ã®ãƒªã‚¹ãƒˆã¯ã€æ–°æœ¬ã€å¤æœ¬ãªã©ã‚’販売ã—ã¦ã„る外部サイトã¸ã®ãƒªãƒ³ã‚¯ã§ã™ã€‚ã‚ãªãŸãŒãŠæŽ¢ã—ã®æœ¬ã«ã¤ã„ã¦ã€æ›´ã«è©³ã—ã„情報ãŒæä¾›ã•ã‚Œã¦ã„ã‚‹å ´åˆã‚‚ã‚ã‚Šã¾ã™ã€‚',
+
+
# Special:Allpages
'nextpage' => '次ã®ãƒšãƒ¼ã‚¸ï¼ˆ$1)',
+'prevpage' => 'å‰ã®ãƒšãƒ¼ã‚¸ï¼ˆ$1)',
'allpagesfrom' => '表示開始ページ:',
'allarticles' => '全ページ',
'allinnamespace' => '全ページ ($1 åå‰ç©ºé–“)',
@@ -853,6 +950,7 @@ $1 ã«ãƒªãƒ³ã‚¯ã—ã¦ã„るページã¯æ›–昧ã•å›žé¿ãƒšãƒ¼ã‚¸ã¨è¦‹ãªã•ã‚Œã
'allpagesnext' => '次ã¸',
'allpagessubmit' => '表示',
'allpagesprefix' => '次ã®æ–‡å­—列ã‹ã‚‰å§‹ã¾ã‚‹ãƒšãƒ¼ã‚¸ã‚’表示:',
+'allpagesbadtitle' => '指定ã—ãŸã‚¿ã‚¤ãƒˆãƒ«ã¯ç„¡åŠ¹ã‹ã€æ­£ã—ããªã„ inter-language ã¾ãŸã¯ inter-wiki ã®ã‚¿ã‚¤ãƒˆãƒ«ã§ã™ã€‚ページタイトルã«ä½¿ç”¨ã§ããªã„文字ãŒå«ã¾ã‚Œã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚',
# Special:Listusers
'listusersfrom' => 'ã“ã®æ–‡å­—ã‹ã‚‰è¡¨ç¤º:',
@@ -873,6 +971,8 @@ $1 ã«ãƒªãƒ³ã‚¯ã—ã¦ã„るページã¯æ›–昧ã•å›žé¿ãƒšãƒ¼ã‚¸ã¨è¦‹ãªã•ã‚Œã
'emailsubject' => 'é¡Œå',
'emailmessage' => '本文',
'emailsend' => 'メールé€ä¿¡',
+'emailccme' => '自分宛ã«æŽ§ãˆã‚’é€ä¿¡ã™ã‚‹',
+'emailccsubject' => '$1å®›ã¦ã‚¦ã‚£ã‚­ãƒ¡ãƒ¼ãƒ«ã®æŽ§ãˆ: $2',
'emailsent' => 'メールをé€ã‚Šã¾ã—ãŸ',
'emailsenttext' => 'メールã¯ç„¡äº‹é€ä¿¡ã•ã‚Œã¾ã—ãŸã€‚',
@@ -880,10 +980,10 @@ $1 ã«ãƒªãƒ³ã‚¯ã—ã¦ã„るページã¯æ›–昧ã•å›žé¿ãƒšãƒ¼ã‚¸ã¨è¦‹ãªã•ã‚Œã
'watchlist' => 'ウォッãƒãƒªã‚¹ãƒˆ',
'watchlistfor' => '\'\'\'$1\'\'\'',
'nowatchlist' => 'ã‚ãªãŸã®ã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆã¯ç©ºã§ã™ã€‚',
-'watchlistanontext' => 'ウォッãƒãƒªã‚¹ãƒˆã«ã‚るページを読んã ã‚Šç·¨é›†ã™ã‚‹ã«ã¯$1ã—ã¦ãã ã•ã„。',
+'watchlistanontext' => 'ウォッãƒãƒªã‚¹ãƒˆã‚’確èªã‚ã‚‹ã„ã¯ç·¨é›†ã™ã‚‹ã«ã¯ $1 ã—ã¦ãã ã•ã„。',
'watchlistcount' => '\'\'\'ã‚ãªãŸã®ã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆã«ã¯ãƒŽãƒ¼ãƒˆã‚‚å«ã‚㦠$1 ページ登録ã•ã‚Œã¦ã„ã¾ã™ã€‚\'\'\'',
'clearwatchlist' => 'ウォッãƒãƒªã‚¹ãƒˆã‚’消去ã™ã‚‹',
-'watchlistcleartext' => 'ã“れらを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ',
+'watchlistcleartext' => 'ã“れらを削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹?',
'watchlistclearbutton' => 'ウォッãƒãƒªã‚¹ãƒˆã‚’消去',
'watchlistcleardone' => 'ã‚ãªãŸã®ã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆã‚’消去ã—ã¾ã—ãŸã€‚$1 項目を消去ã—ã¾ã—ãŸã€‚',
'watchnologin' => 'ログインã—ã¦ã„ã¾ã›ã‚“',
@@ -920,9 +1020,18 @@ $1 ã«ãƒªãƒ³ã‚¯ã—ã¦ã„るページã¯æ›–昧ã•å›žé¿ãƒšãƒ¼ã‚¸ã¨è¦‹ãªã•ã‚Œã
'wlnote' => '以下ã¯æœ€è¿‘ <strong>$2</strong> 時間ã«ç·¨é›†ã•ã‚ŒãŸ <strong>$1</strong> ページã§ã™ã€‚',
'wlshowlast' => '最近㮠[$1時間] [$2日間] [$3] ã®ã‚‚ã®ã‚’表示ã™ã‚‹',
'wlsaved' => 'ç¾åœ¨ã€ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã•ã‚ŒãŸã‚¦ã‚©ãƒƒãƒãƒªã‚¹ãƒˆã®ã¿ã®è¡¨ç¤ºã¨ãªã£ã¦ã„ã¾ã™ã€‚',
-'wlhideshowown' => '自分ã®ç·¨é›†ã‚’$1',
-'wlhideshowbots' => 'ボットã®ç·¨é›†ã‚’$1',
+'watchlist-show-bots' => 'ボットã®ç·¨é›†ã‚’表示',
+'watchlist-hide-bots' => 'ボットã®ç·¨é›†ã‚’éš ã™',
+'watchlist-show-own' => '自分ã®ç·¨é›†ã‚’表示',
+'watchlist-hide-own' => '自分ã®ç·¨é›†ã‚’éš ã™',
+'watchlist-show-minor' => '細部ã®ç·¨é›†ã‚’表示',
+'watchlist-hide-minor' => '細部ã®ç·¨é›†ã‚’éš ã™',
'wldone' => '終了ã—ã¾ã—ãŸã€‚',
+# Displayed when you click the "watch" button and it's in the process of watching
+'watching' => 'ウォッãƒãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¦ã„ã¾ã™...',
+'unwatching' => 'ウォッãƒãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¦ã„ã¾ã™...',
+
+'enotif_mailer' => '{{SITENAME}} 通知メール',
'enotif_reset' => 'ã™ã¹ã¦ã®ãƒšãƒ¼ã‚¸ã‚’訪å•æ¸ˆã¿ã«ã™ã‚‹',
'enotif_newpagetext' => '(æ–°è¦ãƒšãƒ¼ã‚¸)',
'changed' => '変更',
@@ -980,7 +1089,7 @@ $NEWPAGE
'rollbacklink' => 'å·®ã—戻ã—',
'rollbackfailed' => 'å·®ã—戻ã—ã«å¤±æ•—ã—ã¾ã—ãŸ',
'cantrollback' => '投稿者ãŒãŸã ä¸€äººã§ã‚ã‚‹ãŸã‚ã€ç·¨é›†ã‚’å·®ã—戻ã›ã¾ã›ã‚“。',
-'alreadyrolled' => 'ページ [[$1]] ã® [[User:$2|$2]] ([[User_talk:$2|会話]] | [[Special:Contributions/$2|履歴]]) ã«ã‚ˆã‚‹ç·¨é›†ã®å·®ã—戻ã—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚誰ã‹ä»–ã®åˆ©ç”¨è€…ãŒç·¨é›†ã‚’è¡Œã£ãŸã‹å·®ã—戻ã—ã•ã‚ŒãŸã®ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
+'alreadyrolled' => 'ページ [[:$1]] ã® [[User:$2|$2]] ([[User_talk:$2|会話]] | [[Special:Contributions/$2|履歴]]) ã«ã‚ˆã‚‹ç·¨é›†ã®å·®ã—戻ã—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚誰ã‹ä»–ã®åˆ©ç”¨è€…ãŒç·¨é›†ã‚’è¡Œã£ãŸã‹å·®ã—戻ã—ã•ã‚ŒãŸã®ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
ã“ã®ãƒšãƒ¼ã‚¸ã®æœ€å¾Œã®ç·¨é›†ã¯ [[User:$3|$3]] ([[User_talk:$3|会話]] | [[Special:Contributions/$3|履歴]]) ã«ã‚ˆã‚‹ã‚‚ã®ã§ã™ã€‚',
'editcomment' => '編集内容ã®è¦ç´„: <i>$1</i>',
@@ -1019,6 +1128,7 @@ $NEWPAGE
'undeletehistory' => 'ページã®å¾©å¸°ã‚’è¡Œã†ã¨ã€é€šå¸¸ã¯å±¥æ­´ã«ã‚ã‚‹å…¨ã¦ã®ç·¨é›†ãŒå¾©å¸°ã—ã¾ã™ã€‚特定版ã®å¾©å¸°ã‚’è¡Œã†å ´åˆã¯ã€{{int:undeletebtn}}ボタンを押ã™å‰ã«å¾©å¸°å¯¾è±¡ç‰ˆã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’é¸æŠžã—ã¦ãã ã•ã„。',
'undeletehistorynoadmin'=> 'éŽåŽ»ã«ã“ã®ãƒšãƒ¼ã‚¸ã®å…¨ã¦ã‚‚ã—ãã¯ä¸€éƒ¨ãŒå‰Šé™¤ã•ã‚Œã¦ã„ã¾ã™ã€‚以下ã«ç¤ºã™ã®ã¯å‰Šé™¤è¨˜éŒ²ã¨å‰Šé™¤ã•ã‚ŒãŸç‰ˆã®å±¥æ­´ã§ã™ã€‚削除ã•ã‚ŒãŸå„版ã®å†…容ã¯{{int:group-sysop}}ã®ã¿ãŒé–²è¦§ã§ãã¾ã™ã€‚',
'undeleterevision' => '削除ã•ã‚ŒãŸ $1 ã®ç‰ˆ',
+'undeleterevision-missing' => '無効ã€ã‚ã‚‹ã„ã¯èª¤ã£ãŸç‰ˆã§ã™ã€‚当該版ã¯æ—¢ã«å¾©å¸°ã•ã‚ŒãŸã‹ã€ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã‹ã‚‰å‰Šé™¤ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚',
'undeletebtn' => '復帰',
'undeletereset' => 'リセット',
'undeletecomment' => 'コメント:',
@@ -1046,12 +1156,13 @@ $NEWPAGE
'sp-contributions-newer'=> 'å‰ $1',
'sp-contributions-older'=> '次 $1',
'sp-contributions-newbies-sub'=> 'æ–°è¦åˆ©ç”¨è€…',
+'sp-contributions-blocklog' => '投稿ブロック記録',
'whatlinkshere' => 'リンク元',
'notargettitle' => '対象ã¨ãªã‚‹ãƒšãƒ¼ã‚¸ãŒå­˜åœ¨ã—ã¾ã›ã‚“',
'notargettext' => '対象ã¨ãªã‚‹ãƒšãƒ¼ã‚¸åˆã¯åˆ©ç”¨è€…ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“',
'linklistsub' => 'リンクã®ä¸€è¦§',
-'linkshere' => '指定ã—ãŸãƒšãƒ¼ã‚¸ã¯ä»¥ä¸‹ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„ã¾ã™',
-'nolinkshere' => '指定ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã«ãƒªãƒ³ã‚¯ã—ã¦ã„るページã¯ã‚ã‚Šã¾ã›ã‚“。',
+'linkshere' => '[[:$1]] ã¯ä»¥ä¸‹ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„ã¾ã™',
+'nolinkshere' => '[[:$1]] ã«ãƒªãƒ³ã‚¯ã—ã¦ã„るページã¯ã‚ã‚Šã¾ã›ã‚“。',
'isredirect' => 'リダイレクトページ',
'istemplate' => 'テンプレート呼出',
@@ -1068,6 +1179,7 @@ $NEWPAGE
'ipbotheroption' => 'ãã®ä»–',
'ipbanononly' => '匿å利用者ã®ã¿ãƒ–ロック',
'ipbcreateaccount' => 'アカウント作æˆã‚’ブロック',
+'ipbenableautoblock' => 'ã“ã®åˆ©ç”¨è€…ãŒæœ€å¾Œã«ä½¿ç”¨ã—ãŸIPアドレスを自動的ã«ãƒ–ロック(ブロック後ã«ä½¿ç”¨ã—ãŸIPアドレスもå«ã‚€ï¼‰',
'badipaddress' => 'IPアドレスãŒç•°å¸¸ã§ã™ã€‚',
'blockipsuccesssub' => 'ブロックã«æˆåŠŸã—ã¾ã—ãŸã€‚',
'blockipsuccesstext' => '利用者ã¾ãŸã¯IPアドレス "$1" ã®æŠ•ç¨¿ã‚’ブロックã—ã¾ã—ãŸã€‚<br />
@@ -1081,6 +1193,7 @@ $NEWPAGE
'infiniteblock' => '無期é™',
'expiringblock' => '$1 ã«è§£é™¤',
'anononlyblock' => '匿åã®ã¿',
+'noautoblockblock' => '自動ブロックãªã—',
'createaccountblock' => 'アカウント作æˆã®ãƒ–ロック',
'ipblocklistempty' => '{{int:ipblocklist}}ã¯ã‚ã‚Šã¾ã›ã‚“。',
'blocklink' => 'ブロック',
@@ -1094,14 +1207,16 @@ $NEWPAGE
'range_block_disabled' => '広域ブロックã¯ç„¡åŠ¹ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚',
'ipb_expiry_invalid' => 'ä¸æ­£ãªæœŸé–“ã§ã™ã€‚',
'ip_range_invalid' => 'ä¸æ­£ãªIPアドレス範囲ã§ã™ã€‚',
+'proxyblocker' => 'プロクシブロッカー',
'ipb_already_blocked' => '"$1" ã¯æ—¢ã«ãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚',
'ipb_cant_unblock' => 'エラー: ブロックã•ã‚ŒãŸ ID $1 ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。ãŠãらãæ—¢ã«ãƒ–ロック解除ã•ã‚Œã¦ã„ã¾ã™ã€‚',
'proxyblockreason' => 'Your IP address has been blocked because it is an open proxy. Please contact your Internet service provider or tech support and inform them of this serious security problem.
:ã‚ãªãŸã®ä½¿ç”¨ã—ã¦ã„ã‚‹IPアドレスã¯ã‚ªãƒ¼ãƒ—ン・プロクシã§ã‚ã‚‹ãŸã‚投稿ブロックã•ã‚Œã¦ã„ã¾ã™ã€‚ã‚ãªãŸã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆãƒ»ã‚µãƒ¼ãƒ“ス・プロãƒã‚¤ãƒ€ã€ã‚‚ã—ãã¯æŠ€è¡“担当者ã«é€£çµ¡ã‚’å–ã‚Šã€ã“ã‚ŒãŒæ·±åˆ»ãªã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£å•é¡Œã§ã‚ã‚‹ã“ã¨ã‚’ä¼ãˆã¦ãã ã•ã„。',
'proxyblocksuccess' => '終了ã—ã¾ã—ãŸã€‚',
+'sorbs' => 'DNSBL',
'sorbsreason' => 'ã‚ãªãŸã®IPアドレスã¯ã‚ªãƒ¼ãƒ—ンプロクシã§ã‚ã‚‹ã¨ã€[http://www.sorbs.net/ SORBS] DNSBLã«æŽ²è¼‰ã•ã‚Œã¦ã„ã¾ã™ã€‚',
-'sorbs_create_account_reason'=> 'ã‚ãªãŸã®IPアドレスãŒã‚ªãƒ¼ãƒ—ンプロクシã§ã‚ã‚‹ã¨ã€[http://www.sorbs.net/ SORBS] DNSBLã«æŽ²è¼‰ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆã§ãã¾ã›ã‚“。',
+'sorbs_create_account_reason' => 'ã‚ãªãŸã®IPアドレスãŒã‚ªãƒ¼ãƒ—ンプロクシã§ã‚ã‚‹ã¨ã€[http://www.sorbs.net/ SORBS] DNSBLã«æŽ²è¼‰ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆã§ãã¾ã›ã‚“。',
# Developer tools
'lockdb' => 'データベースã®ãƒ­ãƒƒã‚¯',
@@ -1117,7 +1232,7 @@ $NEWPAGE
'unlockdbsuccesssub' => 'データベースã®ãƒ­ãƒƒã‚¯ã¯è§£é™¤ã•ã‚Œã¾ã—ãŸ',
'lockdbsuccesstext' => 'データベースをロックã—ã¾ã—ãŸã€‚メンテナンスãŒçµ‚了ã—ãŸã‚‰å¿˜ã‚Œãšã«ãƒ­ãƒƒã‚¯ã‚’解除ã—ã¦ãã ã•ã„。',
'unlockdbsuccesstext' => 'データベースã®ãƒ­ãƒƒã‚¯ã¯è§£é™¤ã•ã‚Œã¾ã—ãŸã€‚',
-'lockfilenotwritable' => 'データベースã®ãƒ­ãƒƒã‚¯ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“。データベースã®ãƒ­ãƒƒã‚¯ãƒ»è§£é™¤ã‚’ã™ã‚‹ã«ã¯ã€ã‚µãƒ¼ãƒä¸Šã®ãƒ­ãƒƒã‚¯ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
+'lockfilenotwritable' => 'データベースã®ãƒ­ãƒƒã‚¯ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“。データベースã®ãƒ­ãƒƒã‚¯ãƒ»è§£é™¤ã‚’ã™ã‚‹ã«ã¯ã€ã‚µãƒ¼ãƒãƒ¼ä¸Šã®ãƒ­ãƒƒã‚¯ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'databasenotlocked' => 'データベースã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
# Make sysop
@@ -1138,12 +1253,16 @@ $NEWPAGE
'makesysop' => '利用者を{{int:group-sysop}}ã«ã™ã‚‹',
'already_sysop' => '利用者ã¯æ—¢ã«{{int:group-sysop}}ã§ã™ã€‚',
'already_bureaucrat' => '利用者ã¯æ—¢ã«{{int:group-bureaucrat}}ã§ã™ã€‚',
+'rightsnone' => '(権é™ãªã—)',
+
+# Move page
+#
'movepage' => 'ページã®ç§»å‹•',
'movepagetext' => '下ã®ãƒ•ã‚©ãƒ¼ãƒ ã‚’利用ã™ã‚‹ã¨ã€ãƒšãƒ¼ã‚¸åを変更ã—ã€ãã®å±¥æ­´ã‚‚変更先ã¸ç§»å‹•ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚å¤ã„ページã¯å¤‰æ›´å…ˆã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆãƒšãƒ¼ã‚¸ã¨ãªã‚Šã¾ã™ã€‚ページã®ä¸­èº«ã¨å¤‰æ›´å‰ã®ãƒšãƒ¼ã‚¸ã«å¼µã‚‰ã‚ŒãŸãƒªãƒ³ã‚¯ã¯å¤‰ã‚ã‚Šã¾ã›ã‚“。ã§ã™ã‹ã‚‰ã€äºŒé‡ã«ãªã£ãŸã‚Šå£Šã‚Œã¦ã—ã¾ã£ãŸãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
変更先ãŒã™ã§ã«å­˜åœ¨ã™ã‚‹å ´åˆã«ã¯ã€å±¥æ­´ãŒç§»å‹•å…ƒãƒšãƒ¼ã‚¸ã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆãŸã ä¸€ã¤ã§ã‚ã‚‹å ´åˆã‚’除ã„ã¦ã€ç§»å‹•ã§ãã¾ã›ã‚“。ã¤ã¾ã‚Šã€é–“é•ãˆã¦ãƒšãƒ¼ã‚¸åを変更ã—ãŸå ´åˆã«ã¯å…ƒã«æˆ»ã›ã¾ã™ã€‚
-<strong>注æ„ï¼</strong> よã閲覧ã•ã‚Œã‚‹ãƒšãƒ¼ã‚¸ã‚„ã€ä»–ã®å¤šãã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„るページを移動ã™ã‚‹ã¨äºˆæœŸã›ã¬çµæžœãŒèµ·ã“ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。ページã®ç§»å‹•ã«ä¼´ã†å½±éŸ¿ã‚’よã考ãˆã¦ã‹ã‚‰è¸ã¿åˆ‡ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。',
+よã閲覧ã•ã‚Œã‚‹ãƒšãƒ¼ã‚¸ã‚„ã€ä»–ã®å¤šãã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„るページを移動ã™ã‚‹ã¨äºˆæœŸã›ã¬çµæžœãŒèµ·ã“ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。ページã®ç§»å‹•ã«ä¼´ã†å½±éŸ¿ã‚’よã考ãˆã¦ã‹ã‚‰è¸ã¿åˆ‡ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。',
'movepagetalktext' => '付éšã™ã‚‹ãƒŽãƒ¼ãƒˆã®ãƒšãƒ¼ã‚¸ãŒã‚ã‚‹å ´åˆã«ã¯ã€åŸºæœ¬çš„ã«ã¯ã€ä¸€ç·’ã«ç§»å‹•ã•ã‚Œã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚
但ã—ã€ä»¥ä¸‹ã®å ´åˆã«ã¤ã„ã¦ã¯åˆ¥ã§ã™ã€‚
@@ -1156,6 +1275,7 @@ $NEWPAGE
'movenologin' => 'ログインã—ã¦ã„ã¾ã›ã‚“',
'movenologintext' => 'ページを移動ã™ã‚‹ãŸã‚ã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆä½œæˆã®ä¸Šã€[[Special:Userlogin|ログイン]]ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
'newtitle' => 'æ–°ã—ã„ページå',
+'move-watch' => '移動ã™ã‚‹ãƒšãƒ¼ã‚¸ã‚’ウォッãƒ',
'movepagebtn' => 'ページを移動',
'pagemovedsub' => '無事移動ã—ã¾ã—ãŸã€‚',
'pagemovedtext' => 'ページ "[[$1]]" 㯠"[[$2]]" ã«ç§»å‹•ã—ã¾ã—ãŸã€‚',
@@ -1173,7 +1293,7 @@ $NEWPAGE
'revertmove' => 'å·®ã—戻ã—',
'delete_and_move' => '削除ã—ã¦ç§»å‹•ã™ã‚‹',
'delete_and_move_text' => '== 削除ãŒå¿…è¦ã§ã™ ==
-移動先 "[[$1]]" ã¯æ—¢ã«å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®ãƒšãƒ¼ã‚¸ã‚’移動ã®ãŸã‚ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ',
+移動先 "[[$1]]" ã¯æ—¢ã«å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®ãƒšãƒ¼ã‚¸ã‚’移動ã®ãŸã‚ã«å‰Šé™¤ã—ã¾ã™ã‹?',
'delete_and_move_confirm'=> 'ページ削除ã®ç¢ºèª',
'delete_and_move_reason'=> '移動ã®ãŸã‚ã®å‰Šé™¤',
'selfmove' => '移動元ã¨ç§»å‹•å…ˆã®ãƒšãƒ¼ã‚¸åãŒåŒã˜ã§ã™ã€‚自分自身ã¸ã¯ç§»å‹•ã§ãã¾ã›ã‚“。',
@@ -1226,27 +1346,33 @@ $NEWPAGE
# import log
'importlogpage' => 'インãƒãƒ¼ãƒˆè¨˜éŒ²',
'importlogpagetext' => '以下ã¯ç®¡ç†è€…ã«ã‚ˆã‚‹ä»–ウィキã‹ã‚‰ã®ãƒšãƒ¼ã‚¸ãƒ‡ãƒ¼ã‚¿ã®å–ã‚Šè¾¼ã¿è¨˜éŒ²ã§ã™ã€‚',
-'import-logentry-upload'=> 'ファイルã®ã‚¢ãƒƒãƒ—ロードã«ã‚ˆã‚Š $1 をインãƒãƒ¼ãƒˆã—ã¾ã—ãŸ',
+'import-logentry-upload'=> 'ファイルã®ã‚¢ãƒƒãƒ—ロードã«ã‚ˆã‚Š [[$1]] をインãƒãƒ¼ãƒˆã—ã¾ã—ãŸ',
'import-logentry-upload-detail'=> '$1 版',
'import-logentry-interwiki'=> '$1 ã‚’transwikiã—ã¾ã—ãŸ',
'import-logentry-interwiki-detail'=> '$2 㮠$1 版',
# Keyboard access keys for power users
-'accesskey-diff' => 'd',
+'accesskey-search' => 'f',
+'accesskey-minoredit' => 'i',
+'accesskey-save' => 's',
+'accesskey-preview' => 'p',
+'accesskey-diff' => 'v',
+'accesskey-compareselectedversions' => 'v',
+'accesskey-watch' => 'w',
# tooltip help for some actions, most are in Monobook.js
'tooltip-search' => 'ウィキ内を検索 [alt-f]',
'tooltip-minoredit' => 'ã“ã®ç·¨é›†ã‚’細部ã®å¤‰æ›´ã¨ãƒžãƒ¼ã‚¯ [alt-i]',
'tooltip-save' => '編集をä¿å­˜ã—ã¾ã™ã€‚ [alt-s]',
'tooltip-preview' => '編集çµæžœã‚’確èªã—ã¾ã™ã€‚ä¿å­˜å‰ã«æ˜¯éžä½¿ç”¨ã—ã¦ãã ã•ã„。 [alt-p]',
-'tooltip-diff' => 'ã‚ãªãŸãŒç·¨é›†ã—ãŸç‰ˆã®å¤‰æ›´ç‚¹ã‚’表示ã—ã¾ã™ã€‚[alt-d]',
+'tooltip-diff' => 'ã‚ãªãŸãŒç·¨é›†ã—ãŸç‰ˆã®å¤‰æ›´ç‚¹ã‚’表示ã—ã¾ã™ã€‚[alt-v]',
'tooltip-compareselectedversions'=> 'é¸æŠžã•ã‚ŒãŸäºŒã¤ã®ç‰ˆã®å·®åˆ†ã‚’表示ã—ã¾ã™ã€‚ [alt-v]',
'tooltip-watch' => 'ã“ã®ãƒšãƒ¼ã‚¸ã‚’ウォッãƒãƒªã‚¹ãƒˆã¸è¿½åŠ ã—ã¾ã™ã€‚ [alt-w]',
-'Common.css' => '/* ã“ã“ã«æ›¸ã„㟠CSS ã¯å…¨ã¦ã®å¤–装ã«å映ã•ã‚Œã¾ã™ */',
-'Monobook.css' => '/* ã“ã®ãƒšãƒ¼ã‚¸ã‚’編集ã™ã‚‹ã¨ã‚µã‚¤ãƒˆå…¨ä½“ã§ã®å¤–装 monobook ã®ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã«ãªã‚Šã¾ã™ */
+'common.css' => '/* ã“ã“ã«æ›¸ã„㟠CSS ã¯å…¨ã¦ã®å¤–装ã«å映ã•ã‚Œã¾ã™ */',
+'monobook.css' => '/* ã“ã®ãƒšãƒ¼ã‚¸ã‚’編集ã™ã‚‹ã¨ã‚µã‚¤ãƒˆå…¨ä½“ã§ã®å¤–装 monobook ã®ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã«ãªã‚Šã¾ã™ */
#bodyContent { font-size:118% }',
-'nodublincore' => 'ã“ã®ã‚µãƒ¼ãƒã§ã¯ Dublin Core RDF メタデータãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
-'nocreativecommons' => 'ã“ã®ã‚µãƒ¼ãƒã§ã¯ã‚¯ãƒªã‚¨ã‚¤ãƒ†ã‚£ãƒ–・コモンズ㮠RDF メタデータãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
+'nodublincore' => 'ã“ã®ã‚µãƒ¼ãƒãƒ¼ã§ã¯ Dublin Core RDF メタデータãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
+'nocreativecommons' => 'ã“ã®ã‚µãƒ¼ãƒãƒ¼ã§ã¯ã‚¯ãƒªã‚¨ã‚¤ãƒ†ã‚£ãƒ–・コモンズ㮠RDF メタデータãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。',
'notacceptable' => 'ウィキサーãƒãƒ¼ã¯ã‚ãªãŸã®ä½¿ç”¨ã—ã¦ã„るクライアントãŒèª­ã‚ã‚‹å½¢å¼ã§æƒ…報をæä¾›ã§ãã¾ã›ã‚“。',
'anonymous' => '{{SITENAME}}ã®åŒ¿å利用者',
'siteuser' => '{{SITENAME}}ã®åˆ©ç”¨è€…$1',
@@ -1261,23 +1387,30 @@ $NEWPAGE
'spamprotectiontext' => 'ã‚ãªãŸãŒä¿å­˜ã—よã†ã¨ã—ãŸãƒšãƒ¼ã‚¸ã¯ã‚¹ãƒ‘ム・フィルターã«ã‚ˆã£ã¦ä¿å­˜ã‚’ブロックã•ã‚Œã¾ã—ãŸã€‚ã“ã‚Œã¯ä¸»ã«å¤–部サイトã¸ã®ãƒªãƒ³ã‚¯ãŒåŽŸå› ã§ã™ã€‚',
'spamprotectionmatch' => '以下ã¯ã‚¹ãƒ‘ム・フィルターã«ã‚ˆã£ã¦æ¤œå‡ºã•ã‚ŒãŸãƒ†ã‚­ã‚¹ãƒˆã§ã™: $1',
'subcategorycount' => 'ã“ã®ã‚«ãƒ†ã‚´ãƒªã«ã¯ $1 ã®ã‚µãƒ–カテゴリãŒã‚ã‚Šã¾ã™ã€‚',
-'categoryarticlecount' => 'ã“ã®ã‚«ãƒ†ã‚´ãƒªã«ã¯ $1 ã®é …ç›®ãŒã‚ã‚Šã¾ã™ã€‚',
+'categoryarticlecount' => 'ã“ã®ã‚«ãƒ†ã‚´ãƒªã«ã¯ $1 ã®ãƒšãƒ¼ã‚¸ãŒã‚ã‚Šã¾ã™ã€‚',
+'category-media-count' => 'ã“ã®ã‚«ãƒ†ã‚´ãƒªã«ã¯ $1 ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ã‚Šã¾ã™ã€‚',
'listingcontinuesabbrev'=> ' ã®ç¶šã',
'spambot_username' => 'MediaWiki スパム除去',
'spam_reverting' => '$1 ã¸ã®ãƒªãƒ³ã‚¯ã‚’å«ã¾ãªã„以å‰ã®ç‰ˆã«å·®ã—戻ã—',
'spam_blanking' => 'ã™ã¹ã¦ã®ç‰ˆã‹ã‚‰ $1 ã¸ã®ãƒªãƒ³ã‚¯ã‚’削除',
+
+# Info page
'infosubtitle' => 'ページ情報',
'numedits' => '編集数(項目): $1',
'numtalkedits' => '編集数(ノート): $1',
'numwatchers' => 'ウォッãƒã—ã¦ã„る利用者数: $1',
'numauthors' => '投稿者数(項目): $1',
'numtalkauthors' => '投稿者数(ノート): $1',
+
+# Math options
'mw_math_png' => '常ã«PNG',
'mw_math_simple' => 'シンプルãªæ•°å¼ã¯HTMLã€ãれ以外ã¯PNG',
'mw_math_html' => 'ã§ãã‚‹é™ã‚ŠHTMLã€ã•ã‚‚ãªã‘ã‚Œã°PNG',
'mw_math_source' => 'TeXã®ã¾ã¾ã«ã™ã‚‹ (テキストブラウザå‘ã‘)',
'mw_math_modern' => '最近ã®ãƒ–ラウザã§æŽ¨å¥¨',
'mw_math_mathml' => 'å¯èƒ½ãªã‚‰ã°MathMLを使ㆠ(実験中ã®æ©Ÿèƒ½)',
+
+# Patrolling
'markaspatrolleddiff' => 'パトロール済ã¿ã«ã™ã‚‹',
'markaspatrolledtext' => 'ã“ã®é …目をパトロール済ã¿ã«ã™ã‚‹',
'markedaspatrolled' => 'パトロール済ã¿ã«ã—ã¾ã—ãŸã€‚',
@@ -1285,8 +1418,11 @@ $NEWPAGE
'rcpatroldisabled' => 'RCパトロールãŒç„¡åŠ¹ã§ã™',
'rcpatroldisabledtext' => '最近更新ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã®ãƒ‘トロール機能ã¯ç¾åœ¨ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚',
'markedaspatrollederror'=> 'パトロール済ã¿ã«ã§ãã¾ã›ã‚“。',
-'markedaspatrollederrortext'=> 'パトロール済ã¿ã«ã™ã‚‹ãŸã‚ã«ã¯ã©ã®ç‰ˆã‹ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
-'Monobook.js' => '/* tooltips and access keys */
+'markedaspatrollederrortext' => 'パトロール済ã¿ã«ã™ã‚‹ãŸã‚ã«ã¯ã©ã®ç‰ˆã‹ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚',
+'markedaspatrollederror-noautopatrol' => '自分自身ã«ã‚ˆã‚‹ç·¨é›†ã‚’パトロール済ã¿ã«ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。',
+
+# Monobook.js: tooltips and access keys for monobook
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'自分ã®åˆ©ç”¨è€…ページ\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'ã‚ãªãŸã®IPアドレス用ã®åˆ©ç”¨è€…ページ\');
@@ -1297,7 +1433,7 @@ $NEWPAGE
ta[\'pt-mycontris\'] = new Array(\'y\',\'自分ã®æŠ•ç¨¿è¨˜éŒ²\');
ta[\'pt-login\'] = new Array(\'o\',\'ログインã™ã‚‹ã“ã¨ãŒæŽ¨å¥¨ã•ã‚Œã¾ã™ãŒã€ã—ãªãã¦ã‚‚構ã„ã¾ã›ã‚“。\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'ログインã™ã‚‹ã“ã¨ãŒæŽ¨å¥¨ã•ã‚Œã¾ã™ãŒã€ã—ãªãã¦ã‚‚構ã„ã¾ã›ã‚“。\');
- ta[\'pt-logout\'] = new Array(\'o\',\'ログアウト\');
+ ta[\'pt-logout\'] = new Array(\'\',\'ログアウト\');
ta[\'ca-talk\'] = new Array(\'t\',\'é …ç›®ã®ãƒŽãƒ¼ãƒˆ\');
ta[\'ca-edit\'] = new Array(\'e\',\'ã“ã®ãƒšãƒ¼ã‚¸ã‚’編集ã§ãã¾ã™ã€‚投稿ã®å‰ã«ã€Œ{{int:showpreview}}ã€ãƒœã‚¿ãƒ³ã‚’使ã£ã¦ãã ã•ã„。\');
ta[\'ca-addsection\'] = new Array(\'+\',\'ã“ã®ãƒšãƒ¼ã‚¸ã«ã‚³ãƒ¡ãƒ³ãƒˆã‚’加ãˆã‚‹\');
@@ -1338,6 +1474,9 @@ $NEWPAGE
ta[\'ca-nstab-template\'] = new Array(\'c\',\'テンプレートを表示\');
ta[\'ca-nstab-help\'] = new Array(\'c\',\'ヘルプページを表示\');
ta[\'ca-nstab-category\'] = new Array(\'c\',\'カテゴリページを表示\');',
+
+'common.js' => '/* ã“ã“ã«æ›¸ã„ãŸã‚¹ã‚¯ãƒªãƒ—トã¯å…¨ã¦ã®å¤–装ã«å映ã•ã‚Œã¾ã™ */',
+
'deletedrevision' => 'å¤ã„版 $1 を削除ã—ã¾ã—ãŸã€‚',
'previousdiff' => 'â†å‰ã®å·®åˆ†',
'nextdiff' => '次ã®å·®åˆ†â†’',
@@ -1362,6 +1501,13 @@ $NEWPAGE
'metadata-help' => 'ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ãƒ‡ã‚¸ã‚¿ãƒ«ã‚«ãƒ¡ãƒ©ãƒ»ã‚¹ã‚­ãƒ£ãƒŠãªã©ãŒä»˜åŠ ã—ãŸè¿½åŠ æƒ…報をå«ã‚“ã§ã„ã¾ã™ã€‚ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ªãƒªã‚¸ãƒŠãƒ«ã®çŠ¶æ…‹ã‹ã‚‰å¤‰æ›´ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã„ãã¤ã‹ã®é …ç›®ã¯å¤‰æ›´ã‚’完全ã«å映ã—ã¦ã„ãªã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。',
'metadata-expand' => '拡張項目を表示',
'metadata-collapse' => '拡張項目を隠ã™',
+'metadata-fields' => 'ã“ã“ã«æŒ™ã’ãŸEXIF情報ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã®ã¿ãŒæ¨™æº–ã§è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* focallength',
'exif-imagewidth' => 'ç”»åƒã®å¹…',
'exif-imagelength' => 'ç”»åƒã®é«˜ã•',
'exif-bitspersample' => 'ビット深度',
@@ -1410,6 +1556,7 @@ $NEWPAGE
'exif-exposuretime' => '露出時間',
'exif-exposuretime-format'=> '$1秒 ($2)',
'exif-fnumber' => 'F値',
+'exif-fnumber-format' =>'f/$1',
'exif-exposureprogram' => '露出プログラム',
'exif-spectralsensitivity'=> 'スペクトル感度',
'exif-isospeedratings' => 'ISOスピードレート',
@@ -1424,6 +1571,7 @@ $NEWPAGE
'exif-lightsource' => 'å…‰æº',
'exif-flash' => 'フラッシュ',
'exif-focallength' => 'レンズã®ç„¦ç‚¹è·é›¢',
+'exif-focallength-format' => '$1 mm',
'exif-subjectarea' => '主è¦è¢«å†™ä½“ã®ä½ç½®',
'exif-flashenergy' => 'フラッシュ強度',
'exif-spatialfrequencyresponse'=> '空間周波数応答',
@@ -1480,8 +1628,13 @@ $NEWPAGE
'exif-gpsareainformation'=> 'GPSエリアå',
'exif-gpsdatestamp' => 'GPS測ä½æ—¥æ™‚',
'exif-gpsdifferential' => 'ディファレンシャル補正',
+
'exif-compression-1' => 'éžåœ§ç¸®',
'exif-compression-6' => 'JPEG圧縮',
+
+'exif-photometricinterpretation-2' => 'RGB',
+'exif-photometricinterpretation-6' => 'YCbCr',
+
'exif-orientation-1' => '通常',
'exif-orientation-2' => 'å·¦å³å転',
'exif-orientation-3' => '180°回転',
@@ -1490,10 +1643,24 @@ $NEWPAGE
'exif-orientation-6' => '時計回りã«90°回転',
'exif-orientation-7' => '時計回りã«90°回転 上下å転',
'exif-orientation-8' => 'å時計回りã«90°回転',
+
'exif-planarconfiguration-1'=> '点順次フォーマット',
'exif-planarconfiguration-2'=> 'é¢é †æ¬¡ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ',
+
+'exif-xyresolution-i' => '$1 dpi',
+'exif-xyresolution-c' => '$1 dpc',
+
+'exif-colorspace-1' => 'sRGB',
'exif-colorspace-ffff.h'=> 'ãã®ä»–',
-'exif-componentsconfiguration-0'=> 'ãªã—',
+
+'exif-componentsconfiguration-0' => 'ãªã—',
+'exif-componentsconfiguration-1' => 'Y',
+'exif-componentsconfiguration-2' => 'Cb',
+'exif-componentsconfiguration-3' => 'Cr',
+'exif-componentsconfiguration-4' => 'R',
+'exif-componentsconfiguration-5' => 'G',
+'exif-componentsconfiguration-6' => 'B',
+
'exif-exposureprogram-0'=> '未定義',
'exif-exposureprogram-1'=> 'マニュアル',
'exif-exposureprogram-2'=> 'ノーマルプログラム',
@@ -1503,7 +1670,9 @@ $NEWPAGE
'exif-exposureprogram-6'=> 'アクション・プログラム',
'exif-exposureprogram-7'=> 'ãƒãƒ¼ãƒˆãƒ¬ã‚¤ãƒˆãƒ¢ãƒ¼ãƒ‰ï¼ˆè¿‘景)',
'exif-exposureprogram-8'=> 'ランドスケープモード(é æ™¯ï¼‰',
+
'exif-subjectdistance-value'=> '$1 メートル',
+
'exif-meteringmode-0' => 'ä¸æ˜Ž',
'exif-meteringmode-1' => 'å¹³å‡',
'exif-meteringmode-2' => '中央é‡ç‚¹',
@@ -1527,9 +1696,15 @@ $NEWPAGE
'exif-lightsource-17' => '標準光A',
'exif-lightsource-18' => '標準光B',
'exif-lightsource-19' => '標準光C',
+'exif-lightsource-20' => 'D55',
+'exif-lightsource-21' => 'D65',
+'exif-lightsource-22' => 'D75',
+'exif-lightsource-23' => 'D50',
'exif-lightsource-24' => 'ISOスタジオタングステン',
'exif-lightsource-255' => 'ãã®ä»–',
+
'exif-focalplaneresolutionunit-2'=> 'インãƒ',
+
'exif-sensingmethod-1' => '未定義',
'exif-sensingmethod-2' => 'å˜æ¿ã‚«ãƒ©ãƒ¼ã‚»ãƒ³ã‚µãƒ¼',
'exif-sensingmethod-3' => '2æ¿ã‚«ãƒ©ãƒ¼ã‚»ãƒ³ã‚µãƒ¼',
@@ -1591,14 +1766,21 @@ $NEWPAGE
'confirmemail' => 'メールアドレスã®ç¢ºèª',
'confirmemail_noemail' => '[[{{ns:special}}:Preferences|オプション設定]]ã§æœ‰åŠ¹ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。',
'confirmemail_text' => 'ã“ã®ã‚¦ã‚£ã‚­ã§ã¯ãƒ¡ãƒ¼ãƒ«é€šçŸ¥ã‚’å—ã‘å–ã‚‹å‰ã«ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ç¢ºèªãŒå¿…è¦ã§ã™ã€‚以下ã®ãƒœã‚¿ãƒ³ã‚’押ã™ã¨ã€Œ{{int:Confirmemail_subject}}ã€ã¨ã„ã†ä»¶åã®ç¢ºèªãƒ¡ãƒ¼ãƒ«ãŒã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã«é€ã‚‰ã‚Œã¾ã™ã€‚メールã«ã¯ç¢ºèªç”¨ã‚³ãƒ¼ãƒ‰ã‚’å«ã‚€ãƒªãƒ³ã‚¯ãŒæ›¸ã‹ã‚Œã¦ã„ã¾ã™ã€‚ãã®ãƒªãƒ³ã‚¯ã‚’é–‹ãã“ã¨ã«ã‚ˆã£ã¦ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®æ­£å½“性ãŒç¢ºèªã•ã‚Œã¾ã™ã€‚',
+'confirmemail_pending' => '<div class="error">
+確èªãƒ¡ãƒ¼ãƒ«ã¯æ—¢ã«é€ä¿¡ã•ã‚Œã¦ã„ã¾ã™ã€‚ã‚ãªãŸãŒã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’作æˆã—ãŸã°ã‹ã‚Šã§ã‚ã‚Œã°ã€æ•°åˆ†å¾…ã£ã¦æ—¢ã«ãƒ¡ãƒ¼ãƒ«ãŒé€ä¿¡ã•ã‚Œã¦ã„ãªã„ã‹ã‚’確ã‹ã‚ã¦ãã ã•ã„。
+</div>',
'confirmemail_send' => '確èªç”¨ã‚³ãƒ¼ãƒ‰ã‚’é€ä¿¡ã™ã‚‹',
'confirmemail_sent' => '確èªãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã—ãŸã€‚',
-'confirmemail_sendfailed'=> '確èªãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚メールアドレスã«ä¸æ­£ãªæ–‡å­—ãŒå«ã¾ã‚Œã¦ã„ãªã„ã‹ã©ã†ã‹ç¢ºèªã—ã¦ãã ã•ã„。',
+'confirmemail_sendfailed'=> '確èªãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚メールアドレスã«ä¸æ­£ãªæ–‡å­—ãŒå«ã¾ã‚Œã¦ã„ãªã„ã‹ã©ã†ã‹ç¢ºèªã—ã¦ãã ã•ã„。
+
+メールサーãƒãƒ¼ã‹ã‚‰ã®è¿”ç­”: $1',
'confirmemail_invalid' => '確èªç”¨ã‚³ãƒ¼ãƒ‰ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“。ã“ã®ã‚³ãƒ¼ãƒ‰ã¯æœŸé™åˆ‡ã‚Œã§ã™ã€‚',
'confirmemail_needlogin'=> 'メールアドレスを確èªã™ã‚‹ãŸã‚ã«$1ãŒå¿…è¦ã§ã™ã€‚',
-'confirmemail_success' => 'ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ç¢ºèªã•ã‚Œã¾ã—ãŸã€‚ログインã—ã¦ã‚¦ã‚£ã‚­ã‚’楽ã—ã‚“ã§ãã ã•ã„。',
+'confirmemail_oncreate' => 'メールアドレスã®æ­£å½“性を確èªã™ã‚‹ãŸã‚ã®ã‚³ãƒ¼ãƒ‰ã‚’å«ã‚“ã ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã—ãŸã€‚ã“ã®ç¢ºèªã‚’è¡Œã‚ãªãã¦ã‚‚ログインã¯ã§ãã¾ã™ãŒã€ç¢ºèªã™ã‚‹ã¾ã§ãƒ¡ãƒ¼ãƒ«é€šçŸ¥ã®æ©Ÿèƒ½ã¯ç„¡åŠ¹åŒ–ã•ã‚Œã¾ã™ã€‚',
+'confirmemail_success' => 'ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ç¢ºèªã•ã‚Œã¾ã—ãŸã€‚ログインã—ã¦ã‚¦ã‚£ã‚­ã‚’使用ã§ãã¾ã™ã€‚',
'confirmemail_loggedin' => 'ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ç¢ºèªã•ã‚Œã¾ã—ãŸã€‚',
'confirmemail_error' => 'ã‚ãªãŸã®ç¢ºèªã‚’ä¿å­˜ã™ã‚‹éš›ã«å†…部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚',
+'confirmemail_subject' => '{{SITENAME}} メールアドレスã®ç¢ºèª',
'confirmemail_body' => 'This is a E-mail confirmation of *{{SITENAME}}*.
If you can not read this message below,
you can not read wikimail either.
@@ -1642,6 +1824,9 @@ $1
ã“ã®ã¾ã¾ã“ã®ãƒšãƒ¼ã‚¸ã‚’æ–°è¦ä½œæˆã—ã¦è‰¯ã„ã‹ç¢ºèªã—ã¦ãã ã•ã„。',
'recreate' => 'æ–°è¦ä½œæˆã™ã‚‹',
'tooltip-recreate' => 'ã“ã®ã¾ã¾ã“ã®ãƒšãƒ¼ã‚¸ã‚’æ–°è¦ä½œæˆã™ã‚‹',
+
+'unit-pixel' => 'px',
+
'redirectingto' => '[[$1]]ã¸è»¢é€ã—ã¦ã„ã¾ã™...',
'confirm_purge' => 'ページã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’破棄ã—ã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹?
@@ -1654,20 +1839,38 @@ $1',
'hideresults' => 'çµæžœã‚’éš ã™',
'loginlanguagelabel' => '言語: $1',
+'displaytitle' => '(ã“ã®ãƒšãƒ¼ã‚¸ã¸ãƒªãƒ³ã‚¯ã™ã‚‹ã«ã¯ [[$1]] を使用)',
+
# Multipage image navigation
-'imgmultipageprev' => '&larr; å‰ãƒšãƒ¼ã‚¸',
-'imgmultipagenext' => '次ページ &rarr;',
+# 使用ページ例: http://commons.wikimedia.org/wiki/Image:Drei_Register_Arithmetischer_ahnfeng_zur_Practic.djvu
+'imgmultipageprev' => '&larr; å‰ãƒšãƒ¼ã‚¸',
+'imgmultipagenext' => '次ページ &rarr;',
+'imgmultigo' => '表示',
+'imgmultigotopre' => '',
+'imgmultigotopost' => 'ページ目を',
# Table pager
-'ascending_abbrev' => '昇順',
-'descending_abbrev' => 'é™é †',
-'table_pager_next' => '次ã®ãƒšãƒ¼ã‚¸',
-'table_pager_prev' => 'å‰ã®ãƒšãƒ¼ã‚¸',
-'table_pager_first' => '最åˆã®ãƒšãƒ¼ã‚¸',
-'table_pager_last' => '最後ã®ãƒšãƒ¼ã‚¸',
-'table_pager_limit' => '1ページ㫠$1 個表示',
+'ascending_abbrev' => '昇順',
+'descending_abbrev' => 'é™é †',
+'table_pager_next' => '次ã®ãƒšãƒ¼ã‚¸',
+'table_pager_prev' => 'å‰ã®ãƒšãƒ¼ã‚¸',
+'table_pager_first' => '最åˆã®ãƒšãƒ¼ã‚¸',
+'table_pager_last' => '最後ã®ãƒšãƒ¼ã‚¸',
+'table_pager_limit' => '1ページ㫠$1 個表示',
'table_pager_limit_submit' => '実行',
-'table_pager_empty' => 'çµæžœãªã—',
+'table_pager_empty' => 'çµæžœãªã—',
+
+# Auto-summaries
+'autosumm-blank' => 'ページã®ç™½ç´™åŒ–',
+'autosumm-replace' => 'ページã®ç½®æ›: \'$1\'',
+'autoredircomment' => '[[$1]]ã¸ã®ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ',
+'autosumm-new' => 'æ–°ã—ã„ページ: \'$1\'',
+
+# Size units
+'size-bytes' => '$1 ãƒã‚¤ãƒˆ',
+'size-kilobytes' => '$1 キロãƒã‚¤ãƒˆ',
+'size-megabytes' => '$1 メガãƒã‚¤ãƒˆ',
+'size-gigabytes' => '$1 ギガãƒã‚¤ãƒˆ',
);
?>
diff --git a/languages/messages/MessagesJbo.php b/languages/messages/MessagesJbo.php
index 231876b9..a65b8f5d 100644
--- a/languages/messages/MessagesJbo.php
+++ b/languages/messages/MessagesJbo.php
@@ -8,7 +8,8 @@
$messages = array(
'1movedto2' => 'le pu se cmene lu [[$1]] li\'u cu ca se cmene lu [[$2]] li\'u',
-'categories' => '{{PLURAL:$1|klesi|klesi}}',
+'categories' => 'klesi',
+'pagecategories' => '{{PLURAL:$1|klesi|klesi}}',
'currentevents' => 'nuzba ckupau',
'currentevents-url' => 'nuzba ckupau',
'help' => 'sidju ckupau',
diff --git a/languages/messages/MessagesKa.php b/languages/messages/MessagesKa.php
index c96fe2ac..2aa3cfe4 100644
--- a/languages/messages/MessagesKa.php
+++ b/languages/messages/MessagesKa.php
@@ -86,7 +86,8 @@ $messages = array(
'dec' => 'დეკ',
# Bits of text used by many pages:
-'categories' => '{{PLURAL:$1|კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ|კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ბი}}',
+'categories' => 'კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ბი',
+'pagecategories' => '{{PLURAL:$1|კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ|კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ბი}}',
'category_header' => 'სტáƒáƒ¢áƒ˜áƒ”ბი კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒáƒ¨áƒ˜ "$1"',
'subcategories' => 'ქვეკáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ”ბი',
@@ -544,7 +545,7 @@ this old version, (rev) = revert to this old version.
#TODO: 'confirm_purge_button' => 'OK',
'youhavenewmessagesmulti' => "თქვენ გáƒáƒ¥áƒ•áƒ— áƒáƒ®áƒáƒšáƒ˜ შეტყáƒáƒ‘ინებრ$1-ზე",
-#'newtalkseperator' => ',_',
+
#TODO: 'searchcontaining' => "Search for articles containing ''$1''.",
#TODO: 'searchnamed' => "Search for articles named ''$1''.",
#TODO: 'articletitles' => "Articles starting with ''$1''",
diff --git a/languages/messages/MessagesKaa.php b/languages/messages/MessagesKaa.php
new file mode 100644
index 00000000..9c2f9d0c
--- /dev/null
+++ b/languages/messages/MessagesKaa.php
@@ -0,0 +1,11 @@
+<?php
+/**
+ * Karakalpak (Qaraqalpaqsha)
+ *
+ * @package MediaWiki
+ * @subpackage Language
+ */
+
+$linkTrail = '/^([a-zÊ»`]+)(.*)$/sDu';
+
+?>
diff --git a/languages/messages/MessagesKg.php b/languages/messages/MessagesKg.php
new file mode 100644
index 00000000..ad5aceaf
--- /dev/null
+++ b/languages/messages/MessagesKg.php
@@ -0,0 +1,99 @@
+<?php
+/** Kongo (Kikongo)
+ *
+ * @package MediaWiki
+ * @subpackage Language
+ */
+
+$messages = array(
+
+# dates
+'sunday' => 'Lumingu',
+'monday' => 'Kimosi',
+'tuesday' => 'Kizole',
+'wednesday' => 'Kitatu',
+'thursday' => 'Kiya',
+'friday' => 'Kitanu',
+'saturday' => 'Sabala',
+
+# months
+'january' => 'ngonda ya ntete',
+'february' => 'ngonda ya zole',
+'march' => 'ngonda ya tatu',
+'april' => 'ngonda ya iya',
+'may_long' => 'ngonda ya tanu',
+'june' => 'ngonda ya sambanu',
+'july' => 'ngonda ya nsambwadi',
+'august' => 'ngonda ya nana',
+'september' => 'ngonda ya uvwa',
+'october' => 'ngonda ya kumi',
+'november' => 'ngonda ya kumi na mosi',
+'december' => 'ngonda ya kumi na zole',
+
+# Bits of text used by many pages:
+'categories' => 'Bakalasi',
+'pagecategories' => '{{PLURAL:$1|Kalasi|Bakalasi}}',
+'category_header' => 'Mikanda na kalasi "$1"',
+'mainpage' => 'Lukaya ya mfumu',
+
+'article' => 'Pagina contenta continens',
+'help' => 'Nsadisa',
+'mytalk' => 'Disolo ya munu',
+'currentevents' => 'Mambu ya mpa',
+'currentevents-url' => 'Mambu ya mpa',
+'search' => 'Sosa',
+'searchbutton' => 'Sosa',
+'searcharticle' => 'Kwenda',
+'history' => 'Bampaluka ya lukaya',
+'history_short' => 'Bampaluka',
+'edit' => 'Sonika',
+'talk' => 'Disolo',
+'toolbox' => 'Bisadilu',
+'otherlanguages' => 'Bandinga ya nkaka',
+'redirectedfrom' => '(Balulama tuka $1)',
+'retrievedfrom' => 'Receptum de "$1"',
+
+# nstab
+'nstab-main' => 'Mukanda',
+'nstab-category' => 'Kalasi',
+
+
+'yourlanguage' => 'Ndinga:',
+
+# Login and logout pages
+'loginlanguagelabel' => 'Ndinga: $1',
+'logout' => 'Basika',
+'userlogout' => 'Basika',
+
+'histfirst' => 'Ya ntete',
+'histlast' => 'Ya nsuka',
+
+'prevn' => 'biyita $1',
+'nextn' => 'bilandi $1',
+'viewprevnext' => 'Mona ($1) ($2) ($3).',
+
+'powersearch' => 'Sosa',
+
+'mypreferences' => 'Konte ya munu',
+
+# Recentchanges
+'recentchanges' => 'Bampaluka ya mpa',
+
+
+'ncategories' => '{{PLURAL:$1|kalasi|bakalasi}} $1',
+
+'randompage' => 'Lukaya na kintulumukini',
+'mycontris' => 'Makabu ya munu',
+'whatlinkshere' => 'Balukaya ke songa awa',
+
+'categoryarticlecount' => '{{PLURAL:$1|Mukanda mosi|Mikanda $1 }} ni na kalasi yayi.', //
+
+# Table pager
+'table_pager_first' => 'Lukaya ya ntete',
+'table_pager_last' => 'Lukaya ya nsuka',
+'table_pager_next' => 'Lukaya ya kulanda',
+'table_pager_prev' => 'Lukaya ya kuyita',
+
+);
+
+?>
diff --git a/languages/messages/MessagesKk.php b/languages/messages/MessagesKk.php
index 2da89a55..eb8cf791 100644
--- a/languages/messages/MessagesKk.php
+++ b/languages/messages/MessagesKk.php
@@ -1,10 +1,13 @@
<?php
-/** Kazakh (Қазақша)
+/**
+ * Kazakh (Қазақша)
*
* @package MediaWiki
* @subpackage Language
*/
-$linkTrail = '/^([a-zа-Ñäçéğıïñöşüʺʹёәіңғүұқөһ“»]+)(.*)$/sDu';
+$fallback = 'kk-kz';
+
+$linkTrail = '/^([a-zäçéğıïñöşüýа-Ñёәғіқңөұүһʺʹ“»]+)(.*)$/sDu';
?>
diff --git a/languages/messages/MessagesKk_cn.php b/languages/messages/MessagesKk_cn.php
index d10b3c5a..5cf82bd5 100644
--- a/languages/messages/MessagesKk_cn.php
+++ b/languages/messages/MessagesKk_cn.php
@@ -1,10 +1,2175 @@
<?php
-/** Kazakh Arabic (قازاق)
- *
- * @package MediaWiki
- * @subpackage Language
- */
+/**
+ * Kazakh (قازاقشا)
+ *
+ * @package MediaWiki
+ * @subpackage Language
+ *
+ */
+
+$fallback = 'kk-kz';
$rtl = true;
+$digitTransformTable = array(
+ "0" => "Û°",
+ "1" => "Û±",
+ "2" => "Û²",
+ "3" => "Û³",
+ "4" => "Û´",
+ "5" => "Ûµ",
+ "6" => "Û¶",
+ "7" => "Û·",
+ "8" => "Û¸",
+ "9" => "Û¹",
+ "%" => "Ùª",
+);
+
+$separatorTransformTable = array(
+ "," => "Ù¬",
+ "." => "Ù«", // wrong table?
+);
+
+$defaultUserOptionOverrides = array(
+ # Swap sidebar to right side by default
+ 'quickbar' => 2,
+ # Underlines seriously harm legibility. Force off:
+ 'underline' => 0,
+);
+
+$extraUserToggles = array(
+ 'nolangconversion'
+);
+
+$fallback8bitEncoding = 'windows-1256';
+
+$linkPrefixExtension = true;
+
+$namespaceNames = array(
+ NS_MEDIA => 'تاسپا',
+ NS_SPECIAL => 'ارنايى',
+ # NS_MAIN => '',
+ NS_TALK => 'تالقىلاۋ',
+ NS_USER => 'قاتىسۋشى',
+ NS_USER_TALK => 'قاتىسۋشى_تالقىلاۋى',
+ # NS_PROJECT set by $wgMetaNamespace
+ NS_PROJECT_TALK => '$1_تالقىلاۋى',
+ NS_IMAGE => 'سۋرەت',
+ NS_IMAGE_TALK => 'سۋرەت_تالقىلاۋى',
+ NS_MEDIAWIKI => 'مەدياۋيكي',
+ NS_MEDIAWIKI_TALK => 'مەدياۋيكي_تالقىلاۋى',
+ NS_TEMPLATE => 'ٴۇلگٴى',
+ NS_TEMPLATE_TALK => 'ٴۇلگٴى_تالقىلاۋى',
+ NS_HELP => 'انىقتاما',
+ NS_HELP_TALK => 'انىقتاما_تالقىلاۋى',
+ NS_CATEGORY => 'سانات',
+ NS_CATEGORY_TALK => 'سانات_تالقىلاۋى'
+);
+
+$namespaceAliases = array(
+ # Aliases to kk-kz namespaces
+ 'ТаÑпа' => NS_MEDIA,
+ 'Ðрнайы' => NS_SPECIAL,
+ 'Талқылау' => NS_TALK,
+ 'ҚатыÑушы' => NS_USER,
+ 'ҚатыÑушы_талқылауы' => NS_USER_TALK,
+ '$1_талқылауы' => NS_PROJECT_TALK,
+ 'Сурет' => NS_IMAGE,
+ 'Сурет_талқылауы' => NS_IMAGE_TALK,
+ 'МедиаУики' => NS_MEDIAWIKI,
+ 'МедиаУики_талқылауы' => NS_MEDIAWIKI_TALK,
+ 'Үлгі' => NS_TEMPLATE,
+ 'Үлгі_талқылауы' => NS_TEMPLATE_TALK,
+ 'Ðнықтама' => NS_HELP,
+ 'Ðнықтама_талқылауы' => NS_HELP_TALK,
+ 'Санат' => NS_CATEGORY,
+ 'Санат_талқылауы' => NS_CATEGORY_TALK,
+ # Aliases to kk-tr namespaces
+ 'Taspa' => NS_MEDIA,
+ 'Arnaýı' => NS_SPECIAL,
+ 'Talqılaw' => NS_TALK,
+ 'Qatıswşı' => NS_USER,
+ 'Qatıswşı_talqılawı' => NS_USER_TALK,
+ '$1_talqılawı' => NS_PROJECT_TALK,
+ 'Swret' => NS_IMAGE,
+ 'Swret_talqılawı' => NS_IMAGE_TALK,
+ 'MedïaWïkï' => NS_MEDIAWIKI,
+ 'MedïaWïkï_talqılawı' => NS_MEDIAWIKI_TALK,
+ 'Ãœlgi' => NS_TEMPLATE,
+ 'Ülgi_talqılawı' => NS_TEMPLATE_TALK,
+ 'Anıqtama' => NS_HELP,
+ 'Anıqtama_talqılawı' => NS_HELP_TALK,
+ 'Sanat' => NS_CATEGORY,
+ 'Sanat_talqılawı' => NS_CATEGORY_TALK,
+);
+
+$quickbarSettings = array(
+ 'ەشقانداي', 'سولعا بەكٴىتٴىلگەن', 'وڭعا بەكٴىتٴىلگەن', 'سولعا قالقىعان', 'وڭعا قالقىعان'
+);
+
+$skinNames = array(
+ 'standard' => 'داعدىلى',
+ 'nostalgia' => 'اڭساۋ',
+ 'cologneblue' => 'كٴولن زەڭگٴىرلٴىگٴى',
+ 'davinci' => 'دا ۆينچي',
+ 'mono' => 'دارا',
+ 'monobook' => 'دارا كٴىتاپ',
+ 'myskin' => 'ٴوز مٴانەرٴىم',
+ 'chick' => 'بالاپان',
+ 'simple' => 'كٴادٴىمگٴى'
+);
+
+$defaultDateFormat = 'ymd';
+
+$dateFormats = array(
+ 'mdy time' => 'H:i',
+ 'mdy date' => 'xg j, Y',
+ 'mdy both' => 'H:i, xg j, Y',
+
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j F, Y',
+ 'dmy both' => 'H:i, j F, Y',
+
+ 'ymd time' => 'H:i',
+ 'ymd date' => 'Y" ج" xg j',
+ 'ymd both' => 'H:i, Y" ج" xg j',
+
+ 'ISO 8601 time' => 'xnH:xni:xns',
+ 'ISO 8601 date' => 'xnY-xnm-xnd',
+ 'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+);
+
+
+#-------------------------------------------------------------------
+# Default messages
+#-------------------------------------------------------------------
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'سٴىلتەمەنٴى استىنان سىز:',
+'tog-highlightbroken' => 'جوقتالعان سٴىلتەمەلەردٴى <a href="" class="new">بىلاي</a> پٴىشٴىمدە (باسقاشا: بىلاي <a href="" class="internal">?</a> سيياقتى).',
+'tog-justify' => 'ەجەلەردٴى ەنٴى بويىنشا تۋرالاۋ',
+'tog-hideminor' => 'جۋىقتاعى ٴوزگەرٴىستەردە شاعىن تٴۇزەتۋدٴى جاسىر',
+'tog-extendwatchlist' => 'باقىلاۋ تٴىزٴىمدٴى ۇلعايت (بارلىق جارامدى ٴوزگەرٴىستەردٴى كٴورسەت)',
+'tog-usenewrc' => 'كەڭەيتٴىلگەن جۋىقتاعى ٴوزگەرٴىستەر (JavaScript)',
+'tog-numberheadings' => 'بٴولٴىم تاقىرىپتارىن ٴوزدٴىك تٴۇردە نومٴىرلە',
+'tog-showtoolbar' => 'ٴوڭدەۋ قۋرالدار جولاعىن كٴورسەت (JavaScript)',
+'tog-editondblclick' => 'قوس نۇقىمداپ ٴوڭدەۋ (JavaScript)',
+'tog-editsection' => 'بٴولٴىمدەردٴى [ٴوڭدەۋ] سٴىلتەمەسٴىمەن ٴوڭدەۋٴىن ەندٴىر',
+'tog-editsectiononrightclick' => 'بٴولٴىم اتاۋىن وڭ جاق نۇقۋمەن<br />ٴوڭدەۋٴىن ەندٴىر (JavaScript)',
+'tog-showtoc' => 'مازمۇنىن كٴورسەت (3-تەن ارتىق بٴولٴىمٴى بارىلارعا)',
+'tog-rememberpassword' => 'كٴىرگەنٴىمدٴى بۇل كومپييۋتەردە ۇمىتپا',
+'tog-editwidth' => 'ٴوڭدەۋ اۋماعى تولىق ەنٴىمەن',
+'tog-watchcreations' => 'مەن باستاعان بەتتەردٴى باقىلاۋ تٴىزٴىمٴىمە قوس',
+'tog-watchdefault' => 'مەن ٴوڭدەگەن بەتتەردٴى باقىلاۋ تٴىزٴىمٴىمە قوس',
+'tog-minordefault' => 'بارلىق تٴۇزەتۋلەردٴى ٴادەپكٴىدەن شاعىن دەپ بەلگٴىلە',
+'tog-previewontop' => 'قاراپ شىعۋدى ٴوڭدەۋ اۋماعىنىڭ ٴۇستٴىنە سال',
+'tog-previewonfirst' => 'بٴىرٴىنشٴى ٴوڭدەگەندە قاراپ شىعۋ',
+'tog-nocache' => 'بەت قوسالقى قالتاسىن ٴوشٴىر',
+'tog-enotifwatchlistpages' => 'باقىلانعان بەت ٴوزگەرگەندە ماعان حات جٴىبەر',
+'tog-enotifusertalkpages' => 'تالقىلاۋىم ٴوزگەرگەندە ماعان حات جٴىبەر',
+'tog-enotifminoredits' => 'شاعىن تٴۇزەتۋ تۋرالى دا ماعان حات جٴىبەر',
+'tog-enotifrevealaddr' => 'ە-پوشتا جايىمدى ەسكەرتۋ حاتتا اشىق كٴورسەت',
+'tog-shownumberswatching' => 'باقىلاپ تۇرعان قاتىسۋشىلاردىڭ سانىن كٴورسەت',
+'tog-fancysig' => 'قام قولتاڭبا (ٴوزدٴىك سٴىلتەمەسٴىز;)',
+'tog-externaleditor' => 'سىرتقى ٴوڭدەۋٴىشتٴى ٴادەپكٴىدەن قولدان',
+'tog-externaldiff' => 'سىرتقى ايىرماعىشتى ٴادەپكٴىدەن قولدان',
+'tog-showjumplinks' => '«ٴوتٴىپ كەتۋ» قاتىناۋ سٴىلتەمەلەرٴىن ەندٴىر',
+'tog-uselivepreview' => 'تۋرا قاراپ شىعۋدى قولدانۋ (JavaScript) (سىناق تٴۇرٴىندە)',
+'tog-autopatrol' => 'تٴۇزەتۋٴىمدٴى كٴۇزەتكە بەلگٴىلە',
+'tog-forceeditsummary' => 'ٴوڭدەۋ سيپاتتاماسى بوس قالعاندا ماعان ەسكەرت',
+'tog-watchlisthideown' => 'تٴۇزەتۋٴىمدٴى باقىلاۋ تٴىزٴىمنەن جاسىر',
+'tog-watchlisthidebots' => 'بوت تٴۇزەتۋٴىن باقىلاۋ تٴىزٴىمنەن جاسىر',
+'tog-nolangconversion' => 'تٴىل تٴۇرٴىن اۋدارماۋ',
+
+'underline-always' => 'ٴارقاشان',
+'underline-never' => 'ەشقاشان',
+'underline-default' => 'شولعىش بويىنشا',
+
+'skinpreview' => '(قاراپ شىعۋ)',
+
+# Dates
+'sunday' => 'جەكسەنبٴى',
+'monday' => 'دٴۇيسەنبٴى',
+'tuesday' => 'سەيسەنبٴى',
+'wednesday' => 'سٴارسەنبٴى',
+'thursday' => 'بەيسەنبٴى',
+'friday' => 'جۇما',
+'saturday' => 'سەنبٴى',
+'sun' => 'جەك',
+'mon' => 'دٴۇي',
+'tue' => 'بەي',
+'wed' => 'سٴار',
+'thu' => 'بەي',
+'fri' => 'جۇم',
+'sat' => 'سەن',
+'january' => 'قاڭتار',
+'february' => 'اقپان',
+'march' => 'ناۋرىز',
+'april' => 'cٴاۋٴىر',
+'may_long' => 'مامىر',
+'june' => 'ماۋسىم',
+'july' => 'شٴىلدە',
+'august' => 'تامىز',
+'september' => 'قىركٴۇيەك',
+'october' => 'قازان',
+'november' => 'قاراشا',
+'december' => 'جەلتوقسان',
+'january-gen' => 'قانتاردىڭ',
+'february-gen' => 'اقپاننىڭ',
+'march-gen' => 'ناۋرىزدىڭ',
+'april-gen' => 'سٴاۋٴىردٴىڭ',
+'may-gen' => 'مامىردىڭ',
+'june-gen' => 'ماۋسىمنىڭ',
+'july-gen' => 'شٴىلدەنٴىڭ',
+'august-gen' => 'تامىزدىڭ',
+'september-gen' => 'قىركٴۇيەكتٴىڭ',
+'october-gen' => 'قازاننىڭ',
+'november-gen' => 'قاراشانىڭ',
+'december-gen' => 'جەلتوقساننىڭ',
+'jan' => 'قان',
+'feb' => 'اقپ',
+'mar' => 'ناۋ',
+'apr' => 'cٴاۋ',
+'may' => 'مام',
+'jun' => 'ماۋ',
+'jul' => 'شٴىل',
+'aug' => 'تام',
+'sep' => 'قىر',
+'oct' => 'قاز',
+'nov' => 'قار',
+'dec' => 'جەل',
+
+# Bits of text used by many pages
+'categories' => 'بارلىق سانات تٴىزٴىمٴى',
+'pagecategories' => '{{PLURAL:$1|سانات|ساناتتار}}',
+'category_header' => '«$1» ساناتىنداعى بەتتەر',
+'subcategories' => 'تٴومەنگٴى ساناتتار',
+'category-media-header' => '«$1» ساناتىنداعى تاسپالار',
+
+'linkprefix' => '/^(.*?)([a-zäçéğıïñöşüýа-ÑёәіңғүұқөһA-ZÄÇÉĞİÃÑÖŞÜÃÐ-ЯÐӘІҢҒҮҰҚӨҺʺʹ«„]+)$/sDu',
+'mainpage' => 'باستى بەت',
+'mainpagetext' => "<big>'''مەدياۋيكي باعدارلاماسى سٴاتتٴى ورناتىلدى.'''</big>",
+'mainpagedocfooter' => 'ۋيكي باعدارلاماسىن پايدالانۋ اقپاراتى ٴۇشٴىن [http://meta.wikimedia.org/wiki/Help:Contents پايدالانۋشى نۇسقاۋلارىمەن] تانىسىڭىز.
+
+== باستاۋ ==
+
+* [http://www.mediawiki.org/wiki/Help:Configuration_settings باپتاۋ قالاۋلارى تٴىزٴىمٴى]
+* [http://www.mediawiki.org/wiki/Help:FAQ مەدياۋيكي جسج]
+* [http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce مەدياۋيكي حات تاراتۋ تٴىزٴىمٴى]',
+
+'portal' => 'قاۋىم پورتالى',
+'portal-url' => '{{ns:project}}:قاۋىم_پورتالى',
+'about' => 'بٴىز تۋرالى',
+'aboutsite' => '{{SITENAME}} تۋرالى',
+'aboutpage' => '{{ns:project}}:بٴىز_تۋرالى',
+'article' => 'ماعلۇمات',
+'help' => 'انىقتاما',
+'helppage' => '{{ns:help}}:مازمۇنى',
+'bugreports' => 'قاتە ەسەپتەمەلەرٴى',
+'bugreportspage' => '{{ns:project}}:قاتە_ەسەپتەمەلەرٴى',
+'sitesupport' => 'دەمەۋشٴىلٴىك',
+'sitesupport-url' => '{{ns:project}}:جٴاردەم',
+'faq' => 'جسج',
+'faqpage' => '{{ns:project}}:جسج',
+'edithelp' => 'ٴوندەۋ انىقتاماسى',
+'newwindow' => '(جاڭا تەرەزەدە اشىلادى)',
+'edithelppage' => '{{ns:help}}:ٴوڭدەۋ',
+'cancel' => 'بولدىرماۋ',
+'qbfind' => 'تابۋ',
+'qbbrowse' => 'شولۋ',
+'qbedit' => 'ٴوڭدەۋ',
+'qbpageoptions' => 'وسى بەت',
+'qbpageinfo' => 'مٴاتٴىن ارالىعى',
+'qbmyoptions' => 'بەتتەرٴىم',
+'qbspecialpages' => 'ارنايى بەتتەر',
+'moredotdotdot' => 'كٴوبٴىرەك…',
+'mypage' => 'جەكە بەتٴىم',
+'mytalk' => 'تالقىلاۋىم',
+'anontalk' => 'IP تالقىلاۋى',
+'navigation' => 'باعىتتاۋ',
+
+# Metadata in edit box
+'metadata_help' => 'مەتا-دەرەكتەر (تٴۇسٴىندٴىرمەلەر ٴۇشٴىن [[{{ns:project}}:مەتا-دەرەكتەر]] بەتٴىن قاراڭىز):',
+
+'currentevents' => 'اعىمداعى وقيعالار',
+'currentevents-url' => 'اعىمداعى_وقيعالار',
+
+'disclaimers' => 'جاۋاپكەرشٴىلٴىكتەن باس تارتۋ',
+'disclaimerpage' => '{{ns:project}}:جاۋاپكەرشٴىلٴىكتەن_باس_تارتۋ',
+'privacy' => 'جەكە قۇپيياسىن ساقتاۋ',
+'privacypage' => '{{ns:project}}:جەكە_قۇپيياسىن_ساقتاۋ',
+'errorpagetitle' => 'قاتە',
+'returnto' => '$1 دەگەنگە ورالۋ.',
+'tagline' => '{{GRAMMAR:ablative|{{SITENAME}}}}',
+'search' => 'ٴىزدەۋ',
+'searchbutton' => 'ٴىزدەۋ',
+'go' => 'ٴوتۋ',
+'searcharticle' => 'ٴوتۋ',
+'history' => 'بەت تاريحى',
+'history_short' => 'تاريحى',
+'updatedmarker' => 'سوڭعى كٴىرگەننەن بەرٴى جاڭارتىلعان',
+'info_short' => 'اقپارات',
+'printableversion' => 'باسىپ شىعارۋعا',
+'permalink' => 'تۇراقتى سٴىلتەمە',
+'print' => 'باسىپ شىعارۋ',
+'edit' => 'ٴوڭدەۋ',
+'editthispage' => 'بەتتٴى ٴوڭدەۋ',
+'delete' => 'جويۋ',
+'deletethispage' => 'بەتتٴى جويۋ',
+'undelete_short' => '{{PLURAL:$1|بٴىر|$1}} تٴۇزەتۋدٴى قايتارۋ',
+'protect' => 'قورعاۋ',
+'protectthispage' => 'بەتتٴى قورعاۋ',
+'unprotect' => 'قورعاماۋ',
+'unprotectthispage' => 'بەتتٴى قورعاماۋ',
+'newpage' => 'جاڭا بەت',
+'talkpage' => 'بەتتٴى تالقىلاۋ',
+'specialpage' => 'ارنايى بەت',
+'personaltools' => 'جەكە قۇرالدار',
+'postcomment' => 'مٴاندەمە جٴىبەرۋ',
+'articlepage' => 'ماعلۇمات بەتٴىن قاراۋ',
+'talk' => 'تالقىلاۋ',
+'views' => 'كٴورٴىنٴىس',
+'toolbox' => 'قۇرالدار',
+'userpage' => 'قاتىسۋشىنىڭ بەتٴىن قاراۋ',
+'projectpage' => 'جوبا بەتٴىن قاراۋ',
+'imagepage' => 'سۋرەت بەتٴىن قاراۋ',
+'mediawikipage' => 'حابار بەتٴىن قاراۋ',
+'templatepage' => 'ٴۇلگٴى بەتٴىن قاراۋ',
+'viewhelppage' => 'انىقتاما بەتٴىن قاراۋ',
+'categorypage' => 'سانات بەتٴىن قاراۋ',
+'viewtalkpage' => 'تالقىلاۋ بەتٴىن قاراۋ',
+'otherlanguages' => 'باسقا تٴىلدەردە',
+'redirectedfrom' => '($1 بەتٴىنەن ايداتىلعان)',
+'redirectpagesub' => 'ايداتۋ بەتٴى',
+'lastmodifiedat' => 'بۇل بەتتٴىڭ ٴوزگەرتٴىلگەن سوڭعى كەزٴى: $2, $1.', # $1 date, $2 time
+'viewcount' => 'بۇل بەت {{plural:$1|بٴىر|$1}} رەت قارالعان.',
+'copyright' => 'ماعلۇمات $1 قۇجاتى بويىنشا قاتىناۋلى.',
+'protectedpage' => 'قورعاۋلى بەت',
+'jumpto' => 'مىناعان ٴوتٴىپ كەتۋ:',
+'jumptonavigation' => 'باعىتتاۋ',
+'jumptosearch' => 'ٴىزدەۋ',
+
+'badaccess' => 'رۇقسات قاتەسٴى',
+'badaccess-group0' => 'سۇرانىسقان ٴارەكەتٴىڭٴىزدٴى جەگۋٴىڭٴىزگە رۇقسات ەتٴىلمەيدٴى.',
+'badaccess-group1' => 'سۇرانىسقان ٴارەكەتٴىڭٴىز $1 توبىنىڭ قاتىسۋشىلارىنا شەكتەلەدٴى.',
+'badaccess-group2' => 'سۇرانىسقان ٴارەكەتٴىڭٴىز $1 توپتارى بٴىرٴىنٴىڭ قاتۋسىشىلارىنا شەكتەلەدٴى.',
+'badaccess-groups' => 'سۇرانىسقان ٴارەكەتٴىڭٴىز $1 توپتارى بٴىرٴىنٴىڭ قاتۋسىشىلارىنا شەكتەلەدٴى.',
+
+'versionrequired' => 'MediaWiki $1 نۇسقاسى قاجەت',
+'versionrequiredtext' => 'وسى بەتتٴى قولدانۋ ٴۇشٴىن MediaWiki $1 نۇسقاسى قاجەت. [[{{ns:special}}:Version]] بەتٴىن قاراڭىز.',
+
+'ok' => 'جارايدى',
+'pagetitle' => '$1 — {{SITENAME}}',
+'retrievedfrom' => '«$1» دەگەننەن الىنعان',
+'youhavenewmessages' => 'سٴىزدە $1 بار ($2).',
+'newmessageslink' => 'جاڭا حابارلار',
+'newmessagesdifflink' => 'سوڭعى ٴوزگەرٴىسٴىنە',
+'editsection' => 'ٴوڭدەۋ',
+'editold' => 'ٴوڭدەۋ',
+'editsectionhint' => 'بٴولٴىمدٴى ٴوڭدەۋ: $1',
+'toc' => 'مازمۇنى',
+'showtoc' => 'كٴورسەت',
+'hidetoc' => 'جاسىر',
+'thisisdeleted' => 'قارايمىز با, نە قايتارامىز با?: $1',
+'viewdeleted' => 'قارايمىز با?: $1',
+'restorelink' => 'جويىلعان {{PLURAL:$1|بٴىر|$1}} تٴۇزەتۋ',
+'feedlinks' => 'ارنا:',
+'feed-invalid' => 'جارامسىز جازىلىم ارنا تٴۇرٴى.',
+
+# Short words for each namespace, by default used in the 'article' tab in monobook
+'nstab-main' => 'ماعلۇمات',
+'nstab-user' => 'جەكە بەتٴى',
+'nstab-media' => 'تاسپا بەتٴى',
+'nstab-special' => 'ارنايى',
+'nstab-project' => 'جوبا بەتٴى',
+'nstab-image' => 'Ùايل',
+'nstab-mediawiki' => 'جٴۇيە حابارى',
+'nstab-template' => 'ٴۇلگٴى',
+'nstab-help' => 'انىقتاما',
+'nstab-category' => 'سانات',
+
+# Main script and global functions
+'nosuchaction' => 'مۇنداي ٴارەكەت جوق',
+'nosuchactiontext' => 'وسى URL جايىمەن ەنگٴىزٴىلگەن ٴارەكەتتٴى
+وسى ۋيكي جورامالداپ بٴىلمەدٴى.',
+'nosuchspecialpage' => 'بۇل ارنايى بەت ەمەس',
+'nospecialpagetext' => 'سٴىز سۇرانىسقان ارنايى بەت جارامسىز. بارلىق جارامدى ارنايى بەتتەر تٴىزٴىمٴىن [[{{ns:special}}:Specialpages]] بەتٴىندە تابا الاسىز.',
+
+# General errors
+'error' => 'قاتە',
+'databaseerror' => 'دەرەكقوردىڭ قاتەسٴى',
+'dberrortext' => 'دەرەكقورعا سۇرانىس جاسالعاندا سينتاكسيس قاتەسٴى كەزدەستٴى.
+بۇل باعدارلامانىڭ قاتەسٴىن كٴورسەتۋ مٴۇمكٴىن.
+دەرەكقورعا سوڭعى بولعان سۇرانىس:
+<blockquote><tt>$1</tt></blockquote>
+مىنا Ùۋنكتسيياسىنان «<tt>$2</tt>».
+MySQL قايتارعان قاتەسٴى «<tt>$3: $4</tt>».',
+'dberrortextcl' => 'دەرەكقورعا سۇرانىس جاسالعاندا سينتاكسيس قاتەسٴى كەزدەستٴى.
+دەرەكقورعا سوڭعى بولعان سۇرانىس:
+«$1»
+مىنا Ùۋنكتسيياسىنان: «$2».
+MySQL قايتارعان قاتەسٴى «$3: $4»',
+'noconnect' => 'عاÙÛ‹ ەتٴىڭٴىز! بۇل ۋيكيدە كەيبٴىر تەحنيكالىق قيىنشىلىقتار كەزدەستٴى, سوندىقتان دەرەكقور سەرۆەرٴىنە قاتىناسۋ المايدى. <br />
+$1',
+'nodb' => '$1 دەرەكقورى تالعانبادى',
+'cachederror' => 'تٴومەندە سۇرانعان بەتتٴىڭ قوسالقى قالتاداعى كٴوشٴىرمەسٴى, وسى بەت جاڭارتىلماعان بولۋى مٴۇمكٴىن.',
+'laggedslavemode' => 'نازار سالىڭىز: بەتتە جۋىقتاعى جاڭالاۋلار بولماۋى مٴۇمكٴىن.',
+'readonly' => 'دەرەكقورى قۇلىپتالعان',
+'enterlockreason' => 'قۇلىپتاۋ سەبەبٴىن ەنگٴىزٴىڭٴىز, قاي ۋاقىتقا دەيٴىن
+قۇلىپتالعانىن قوسا',
+'readonlytext' => 'اعىمدا دەرەكقور جاڭا جازبا جٴانە تاعى باسقا ٴوزگەرٴىستەر جاساۋدان قۇلىپتالىنعان. بۇل دەرەكقوردى جٴوندەتۋ باعدارلامالارىن ورىنداۋ ٴۇشٴىن بولۋى مٴۇمكٴىن, بۇنى بٴىتٴىرگەننەن سوڭ قالٴىپتٴى ٴىسكە قايتارىلادى.
+
+قۇلىپتاعان ٴاكٴىمشٴى بۇنى بىلاي تٴۇسٴىندٴىرەدٴى: $1',
+'missingarticle' => 'ٴىزدەستٴىرٴىلگەن «$1» اتاۋلى بەت مٴاتٴىنٴى دەرەكقوردا تابىلمادى.
+
+بۇل داعدىدا ەسكٴىرگەن ايىرما سٴىلتەمەسٴىنە نەمەسە جويىلعان بەت تاريحىنىڭ سٴىلتەمەسٴىنە
+ەرگەننەن بولۋى مٴۇمكٴىن.
+
+ەگەر بۇل بولجام دۇرىس سەبەپ بولماسا, باعدارلامامىزداعى قاتەگە تاپ بولۋىڭىز مٴۇمكٴىن.
+بۇل تۋرالى ناقتى URL جايىن كٴورسەتٴىپ ٴاكٴىمشٴىگە ەسەپتەمە جٴىبەرٴىڭٴىز.',
+'readonly_lag' => 'جەتەك دەرەكقور سەرۆەرلەر باستاۋىشپەن قاداملانعاندا وسى دەرەكقور ٴوزدٴىك تٴۇرٴىندە قۇلىپتالىنعان',
+'internalerror' => 'ٴىشكٴى قاتە',
+'filecopyerror' => '«$1» Ùايلى «$2» Ùايلىنا كٴوشٴىرٴىلمەدٴى.',
+'filerenameerror' => '«$1» Ùايل اتى «$2» اتىنا ٴوزگەرتٴىلمەدٴى.',
+'filedeleteerror' => '«$1» Ùايلى جويىلمايدى.',
+'filenotfound' => '«$1» Ùايلى تابىلمادى.',
+'unexpected' => 'كٴۇتٴىلمەگەن ماعىنا: «$1» = «$2».',
+'formerror' => 'قاتە: جٴىبەرۋ ٴۇلگٴىتٴى ەمەس',
+'badarticleerror' => 'وسىنداي ٴارەكەت مىنا بەتتە اتقارىلمايدى.',
+'cannotdelete' => 'ايتىلمىش بەت نە سۋرەت جويىلمايدى. (بۇنى باسقا بٴىرەۋ جويعان شىعار.)',
+'badtitle' => 'جارامسىز اتاۋ',
+'badtitletext' => 'سۇرانىسقان بەت اتاۋى جارامسىز, بوس, تٴىلارا سٴىلتەمەسٴى نە ۋيكي-ارا اتاۋى مٴۇلتٴىك بولعان. اتاۋلاردا سٴۇەمەلدەمەگەن بٴىرقاتار ٴارٴىپتەر بولۋى مٴۇمكٴىن.',
+'perfdisabled' => 'عاÙÛ‹ ەتٴىڭٴىز! وسى قاسيەت, دەرەكقوردىڭ جىلدامىلىعىنا ٴاسەر ەتٴىپ, ەشكٴىمگە ۋيكيدٴى پايدالانۋعا بەرمەگەسٴىن, ۋاقىتشا ٴوشٴىرٴىلگەن.',
+'perfdisabledsub' => 'مىندا $1 بەتٴىنٴىڭ ساقتالعان كٴوشٴىرمەسٴى:', # obsolete?
+'perfcached' => 'كەلەسٴى دەرەك قوسالقى قالتاسىنان الىنعان, سوندىقتان تولىقتاي جاڭالانماعان بولۋى مٴۇمكٴىن.',
+'perfcachedts' => 'كەلەسٴى دەرەك قوسالقى قالتاسىنان الىنعان, سوڭعى جاڭالانلعان كەزٴى: $1.',
+'wrong_wfQuery_params' => 'wfQuery() Ùۋنكتسيياسىندا جارامسىز باپتار<br />
+Ùۋنكتسييا: $1<br />
+سۇرانىس: $2',
+'viewsource' => 'قاينارىن قاراۋ',
+'viewsourcefor' => '$1 قاينارى',
+'protectedtext' => 'بۇل بەت ٴوڭدەۋ بولدىرماۋ ٴۇشٴىن قۇلىپتالىنعان.
+
+بۇل بەتتٴىڭ قاينارىن قاراۋىڭىزعا جٴانە كٴوشٴىرٴىپ الۋڭىزعا بولادى:',
+'protectedinterface' => 'بۇل بەت باعدارلامانىڭ تٴىلدەسۋ مٴاتٴىنٴىن جەتٴىستٴىرەدٴى, سوندىقتان قييانات كەلتٴىرمەۋ ٴۇشٴىن ٴوزگەرتۋٴى قۇلىپتالعان.',
+'editinginterface' => "'''نازار سالىڭىز:''' باعدارلاماعا تٴىلدەسۋ مٴاتٴىنٴىن جەتٴىستٴىرەتٴىن MediaWiki بەتٴىن ٴوڭدەپ جاتىرسىز. بۇل بەتتٴىڭ ٴوزگەرتۋٴى بارلىق پايدالانۋشىلار تٴىلدەسۋٴىنە ٴاسەر ەتەدٴى.",
+'sqlhidden' => '(SQL سۇرانىسى جاسىرىلدى)',
+
+# Login and logout pages
+'logouttitle' => 'قاتىسۋشى شىعۋى',
+'logouttext' => '<strong>ەندٴى جٴۇيەدەن شىقتىڭىز.</strong><br />
+بۇل كومپييۋتەردەن ٴالٴى دە جٴۇيەگە كٴىرمەستەن {{SITENAME}} جوباسىن
+شولۋىڭىز مٴۇمكٴىن, نەمەسە باسقا پايدالانۋشىنىڭ جٴۇيەگە كٴىرۋٴى مٴۇمكٴىن.
+كەيبٴىر بەتتەردە ٴالٴى دە جٴۇيەگە كٴىرگەنٴىڭٴىزدەي كٴورٴىنۋٴى مٴۇمكٴىندٴىگٴىن
+ەسكەرتەمٴىز; بۇل شولعىشتىڭ قوسالقى قالتاسىن بوساتۋ ارقىلى شەشٴىلەدٴى.',
+'welcomecreation' => '== قوش كەلدٴىڭٴىز, $1! ==
+
+تٴىركەلگٴىڭٴىز جاسالدى. {{SITENAME}} باپتاۋىڭىزدى قالاۋىڭىزبەن ٴوزگەرتۋدٴى ۇمىتپاڭىز.',
+'loginpagetitle' => 'قاتىسۋشى كٴىرۋٴى',
+'yourname' => 'قاتىسۋشى اتىڭىز',
+'yourpassword' => 'قۇپييا سٴوزٴىڭٴىز',
+'yourpasswordagain' => 'قۇپييا سٴوزدٴى قايتالاپ ەنگٴىزٴىڭٴىز',
+'remembermypassword' => 'مەنٴىڭ كٴىرگەنٴىمدٴى بۇل كومپييۋتەردە ۇمىتپا',
+'yourdomainname' => 'جەلٴى ٴۇيشٴىگٴىڭٴىز',
+'externaldberror' => 'وسىندا سىرتقى تەڭدەستٴىرۋ دەرەكقورىندا قاتە بولدى, نەمەسە سىرتقى تٴىركەلگٴىڭٴىزدٴى جاڭالاۋعا رۇقسات جوق.',
+'loginproblem' => '<b>كٴىرۋٴىڭٴىز كەزٴىندە وسىندا قيىندىققا تاپ بولدىق.</b><br />تاعى دا قايتالاپ قاراڭىز.',
+'alreadyloggedin' => '<strong>$1 دەگەن قاتىسۋشى, كٴىرٴىپسٴىز تٴۇگە!<strong><br />',
+'login' => 'كٴىرۋ',
+'loginprompt' => '{{SITENAME}} تورابىنا كٴىرۋ ٴۇشٴىن «cookies» قاسيەتٴىن ەندٴىرۋٴىڭٴىز قاجەت.',
+'userlogin' => 'كٴىرۋ / تٴىركەلگٴى جاساۋ',
+'logout' => 'شىعۋ',
+'userlogout' => 'شىعۋ',
+'notloggedin' => 'كٴىرمەگەنسٴىز',
+'nologin' => 'تٴىركەلگٴىڭٴىز جوق پا? $1.',
+'nologinlink' => 'جاساڭىز',
+'createaccount' => 'تٴىركەلگٴى جاسا',
+'gotaccount' => 'تٴىركەلگٴىڭٴىز بار ما? $1.',
+'gotaccountlink' => 'كٴىرٴىڭٴىز',
+'createaccountmail' => 'ە-پوشتامەن',
+'badretype' => 'ەنگٴىزگەن قۇپييا سٴوزدەرٴىڭٴىز بٴىر بٴىرٴىنە سٴايكەس ەمەس.',
+'userexists' => 'ەنگٴىزگەن قاتىسۋشى اتىڭىزدى بٴىرەۋ پايدالانىپ جاتىر. باسقا اتاۋ تانداڭىز.',
+'youremail' => 'ە-پوشتا جايىڭىز *:',
+'username' => 'قاتىسۋشى اتىڭىز:',
+'uid' => 'قاتىسۋشى تەڭدەستٴىرۋٴىڭٴىز:',
+'yourrealname' => 'شىن اتىڭىز *:',
+'yourlanguage' => 'تٴىلٴىڭٴىز:',
+'yourvariant' => 'تٴۇرٴى',
+'yournick' => 'لاقاپ اتىڭىز:',
+'badsig' => 'قام قولتاڭباڭىز جارامسىز; HTML بەلگٴىشەلەرٴىن تەكسەرٴىڭٴىز.',
+'email' => 'ە-پوشتاڭىز',
+'prefs-help-email-enotif' => 'ەگەر سونى باپتاساڭىز, وسى ە-پوشتا جايى سٴىزگە ەسكەرتۋ حات جٴىبەرۋگە قولدانىلادى.',
+'prefs-help-realname' => '* شىن اتىڭىز (مٴىندەتتٴى ەمەس): ەنگٴىزسەڭٴىز, شىعارماڭىزدىڭ اۋتورلىعىن بەلگٴىلەۋٴى ٴۇشٴىن قولدانىلادى.',
+'loginerror' => 'كٴىرۋ قاتەسٴى',
+'prefs-help-email' => '* ە-پوشتاڭىز (مٴىندەتتٴى ەمەس): «قاتىسۋشى» نەمەسە «قاتىسۋشى تالقىلاۋ» بەتٴىڭٴىزدەر ارقىلى باسقالارعا بايلانىسۋ مٴۇمكٴىندٴىك بەرەدٴى. ٴوزٴىڭٴىزدٴىڭ كٴىم ەكەنٴىڭٴىزدٴى بٴىلدٴىرتپەيدٴى.',
+'nocookiesnew' => 'قاتىسۋشى تٴىركەلگٴىسٴى جاسالدى, تەك ٴالٴى كٴىرمەگەنسٴىز. {{SITENAME}} جوباسىنا قاتىسۋشى كٴىرۋ ٴۇشٴىن «cookies» قاسيەتٴى قاجەت. شولعىشىڭىزدا «cookies» قاسيەتٴى ٴوشٴىرٴىلگەن. سونى ەندٴىرٴىڭٴىز دە جاڭا قاتىسۋشى اتىڭىزدى جٴانە قۇپييا سٴوزٴىڭٴىزدٴى ەنگٴىزٴىپ كٴىرٴىڭٴىز.',
+'nocookieslogin' => 'قاتىسۋشى كٴىرۋ ٴۇشٴىن {{SITENAME}} جوباسى «cookies» قاسيەتٴىن قولدانادى. شولعىشىڭىزدا «cookies» قاسيەتٴى ٴوشٴىرٴىلگەن. سونى ەندٴىرٴىڭٴىز دە قايتالاپ كٴىرٴىڭٴىز.',
+'noname' => 'قاتىسۋشى اتىن دۇرىس ەنگٴىزبەدٴىڭٴىز.',
+'loginsuccesstitle' => 'كٴىرۋٴىڭٴىز سٴاتتٴى ٴوتتٴى',
+'loginsuccess' => "'''سٴىز ەندٴى {{SITENAME}} جوباسىنا «$1» رەتٴىندە كٴىرٴىپ وتىرسىز.'''",
+'nosuchuser' => 'مىندا «$1» اتاۋلى قاتىسۋشى جوق. ەملەڭٴىزدٴى تەكسەرٴىڭٴىز, نەمەسە جاڭا تٴىركەلگٴى جاساڭىز.',
+'nosuchusershort' => 'مىندا «$1» دەگەن قاتىسۋشى اتاۋى جوق. ەملەڭٴىزدٴى تەكسەرٴىڭٴىز.',
+'nouserspecified' => 'قاتىسۋشى اتىن ەنگٴىزٴىۋٴىڭٴىز قاجەت.',
+'wrongpassword' => 'ەنگٴىزگەن قۇپييا سٴوز جارامسىز. قايتالاپ كٴورٴىڭٴىز.',
+'wrongpasswordempty' => 'قۇپييا سٴوز بوستى بوپتى. قايتالاپ كٴورٴىڭٴىز.',
+'mailmypassword' => 'قۇپييا سٴوزٴىمدٴى حاتپەن جٴىبەر',
+'passwordremindertitle' => 'قۇپييا سٴوز تۋرالى {{SITENAME}} جوباسىنىڭ ەسكەرتۋٴى',
+'passwordremindertext' => 'كەيبٴىرەۋ (IP جايى: $1, بٴالكٴىم, ٴوزٴىڭٴىز بولارسىز)
+{{SITENAME}} ٴۇشٴىن بٴىزدەن جاڭا قۇپييا سٴوزٴىن جٴىبەرۋٴىن سۇرانىسقان ($4).
+«$2» قاتىسۋشىنىڭ قۇپييا سٴوزٴى «$3» بولدى ەندٴى.
+قازٴىر كٴىرۋٴىڭٴىز جٴانە قۇپييا سٴوزٴىڭٴىزدٴى اۋىسترۋىڭىز قاجەت.
+
+ەگەر باسقا بٴىرەۋ بۇل سۇرانىستى جاساسا, نەمەسە قۇپييا سٴوزٴىڭٴىزدٴى ۇمىتساڭىز دا,
+جٴانە بۇنى ٴوزگەرتكٴىڭٴىز كەلمەسە دە, وسى حابارلاماعا اڭعارماۋىڭىزعا دا بولادى,
+ەسكٴى قۇپييا سٴوزٴىڭٴىزدٴى ٴارٴىعاراي قولدانىپ.',
+'noemail' => 'مىندا «$1» قاتىسۋشىنىڭ ە-پوشتاسى جوق.',
+'passwordsent' => 'جاڭا قۇپييا سٴوز «$1» ٴۇشٴىن
+تٴىركەلگەن ە-پوشتا جايىنا جٴىبەرٴىلدٴى.
+قابىلداعاننان كەيٴىن كٴىرگەندە سونى ەنگٴىزٴىڭٴىز.',
+'blocked-mailpassword' => 'IP جايىڭىزدان ٴوڭدەۋ بۇعاتتالعان, سوندىقتان
+قيياناتشىلىقتان ساقتانۋ ٴۇشٴىن قۇپييا سٴوز جٴىبەرۋ قىزمەتٴىنٴىڭ ٴارەكەتٴى رۇقسات ەتٴىلمەيدٴى.',
+'eauthentsent' => 'كۋٴالاندىرۋ حاتى اتالعان ە-پوشتا جايىنا جٴىبەرٴىلدٴى.
+باسقا ە-پوشتا حاتىن جٴىبەرۋدٴىڭ الدىنان, تٴىركەلگٴى شىنىنان سٴىزدٴىكٴى ەكەنٴىن
+كۋٴالاندىرۋ ٴۇشٴىن حاتتاعى نۇسقاۋلارعا ەرٴىڭٴىز.',
+'throttled-mailpassword' => 'سوڭعى $1 ساعاتتا قۇپييا سٴوز ەسكەرتۋ حاتى جٴىبەرٴىلدٴى تٴۇگە.
+قيياناتشىلىققا كەدەرگٴى بولۋ ٴۇشٴىن, $1 ساعات سايىن تەك بٴىر عانا قۇپييا سٴوز ەسكەرتۋ
+حاتى جٴىبەرٴىلەدٴى.',
+'mailerror' => 'حات جٴىبەرۋ قاتەسٴى: $1',
+'acct_creation_throttle_hit' => 'عاÙÛ‹ ەتٴىڭٴىز, سٴىز $1 تٴىركەلگٴى جاساپسىز تٴۇگە. ونان ارتىق ٴىستەي المايسىز.',
+'emailauthenticated' => 'ە-پوشتا جايىڭىز كۋٴالاندىرىلعان كەزٴى: $1.',
+'emailnotauthenticated' => 'ە-پوشتا جايىڭىز ٴالٴى كۋٴالاندىرعان جوق.
+تٴومەندەگٴى قاسيەتتتەر ٴۇشٴىن ەشقانداي حات جٴىبەرٴىلمەيدٴى.',
+'noemailprefs' => 'وسى قاسيەتتەر ٴىستەۋٴى ٴۇشٴىن ە-پوشتا جايىڭىزدى ەنگٴىزٴىڭٴىز.',
+'emailconfirmlink' => 'ە-پوشتا جايىڭىزدى كۋٴالاندىرىڭىز',
+'invalidemailaddress' => 'وسى ە-پوشتا جايدا جارامسىز پٴىشٴىم بولعان, قابىل ەتٴىلمەيدٴى.
+دۇرىس پٴىشٴىمدەلگەن جايدى ەنگٴىزٴىڭٴىز, نە اۋماقتى بوس قالدىرىڭىز.',
+'accountcreated' => 'تٴىركەلگٴى جاسالدى',
+'accountcreatedtext' => '$1 ٴۇشٴىن قاتىسۋشى تٴىركەلگٴىسٴى جاسالدى.',
+
+# Edit page toolbar
+'bold_sample' => 'جۋان مٴاتٴىن',
+'bold_tip' => 'جۋان مٴاتٴىن',
+'italic_sample' => 'قيعاش مٴاتٴىن',
+'italic_tip' => 'قيعاش مٴاتٴىن',
+'link_sample' => 'سٴىلتەمە اتاۋى',
+'link_tip' => 'ٴىشكٴى سٴىلتەمە',
+'extlink_sample' => 'http://www.example.com سٴىلتەمە اتاۋى',
+'extlink_tip' => 'سىرتقى سٴىلتەمە (الدىنان http:// ەنگٴىزۋٴىن ۇمىتپاڭىز)',
+'headline_sample' => 'تاقىرىپ مٴاتٴىنٴى',
+'headline_tip' => '1-شٴى دەڭگەيلٴى تاقىرىپ',
+'math_sample' => 'Ùورمۋلانى مىندا ەنگٴىزٴىڭٴىز',
+'math_tip' => 'ماتەماتيكا Ùورمۋلاسى (LaTeX)',
+'nowiki_sample' => 'پٴىشٴىمدەلمەيتٴىن مٴاتٴىندٴى وسىندا ەنگٴىزٴىڭٴىز',
+'nowiki_tip' => 'ۋيكي پٴىشٴىمٴىن ەلەمەۋ',
+'image_sample' => 'Example.jpg',
+'image_tip' => 'كٴىرٴىكتٴىرٴىلگەن سۋرەت',
+'media_sample' => 'Example.ogg',
+'media_tip' => 'تاسپا Ùايلىنىڭ سٴىلتەمەسٴى',
+'sig_tip' => 'قولتاڭباڭىز جٴانە ۋاقىت بەلگٴىسٴى',
+'hr_tip' => 'دەرەلەي سىزىق (ٴۇنەمدٴى قولدانىڭىز)',
+
+# Edit pages
+'summary' => 'سيپاتتاماسى',
+'subject' => 'تاقىرىبى/باسى',
+'minoredit' => 'بۇل شاعىن تٴۇزەتۋ',
+'watchthis' => 'بەتتٴى باقىلاۋ',
+'savearticle' => 'بەتتٴى ساقتا!',
+'preview' => 'قاراپ شىعۋ',
+'showpreview' => 'قاراپ شىعۋ',
+'showlivepreview' => 'تۋرا قاراپ شىعۋ',
+'showdiff' => 'ٴوزگەرٴىستەردٴى كٴورسەت',
+'anoneditwarning' => "'''نازار سالىڭىز:''' سٴىز جٴۇيەگە كٴىرمەگەنسٴىز. IP جايىڭىز بۇل بەتتٴىڭ ٴوڭدەۋ تاريحىندا جازىلىپ الىنادى.",
+'missingsummary' => "'''ەسكەرتۋ:''' تٴۇزەتۋ سيپاتتاماسىن ەنگٴىزبەپسٴىز. «ساقتاۋ» تٴۇيمەسٴىن تاعى باسساڭىز, تٴۇزەتۋٴىڭٴىز مٴاندەمەسٴىز ساقتالادى.",
+'missingcommenttext' => 'تٴومەندە مٴاندەمەڭٴىزدٴى ەنگٴىزٴىڭٴىز.',
+'missingcommentheader' => "'''ەسكەرتۋ:''' بۇل مٴاندەمەگە تاقىرىپ/باسجول جەتٴىستٴىرمەپسٴىز. ەگەر تاعى دا ساقتاۋ تٴۇيمەسٴىن نۇقىساڭىز, تٴۇزەتۋٴىڭٴىز سولسىز ساقتالادى.",
+'summary-preview' => 'سيپاتتاماسىن قاراپ شىعۋ',
+'subject-preview' => 'تاقىرىبىن/باسىن قاراپ شىعۋ',
+'blockedtitle' => 'پايدالانۋشى بۇعاتتالعان',
+'blockedtext' => "<big>'''قاتىسۋشى اتىڭىز نە IP جايىڭىز بۇعاتتالعان.'''</big>
+
+بۇعاتتاۋدى $1 ٴىستەگەن. بەلگٴىلەنگەن سەبەبٴى: ''$2''.
+
+وسى بۇعاتتاۋدى تالقىلاۋ ٴۇشٴىن $1 دەگەنمەن نە باسقا [[{{ns:project}}:ٴاكٴىمشٴىلەر|ٴاكٴىمشٴىمەن]] قاتىناسۋىڭىزعا بولادى.
+[[{{ns:special:Preferences|تٴىركەلگٴى باپتاۋلارىن]] قولدانىپ جارامدى ە-پوشتا جايىن ەنگٴىزگەنشە دەيٴىن
+«قاتىسۋشىعا حات جازۋ» قاسيەتٴىن پايدالانىلمايسىز. اعىمدىق IP جايىڭىز $3 بولعان. بۇنى ٴاربٴىر سۇرانىسىڭىزعا قوسىڭىز.",
+'blockedoriginalsource' => "تٴومەندە '''$1''' دەگەننٴىڭ قاينارى كٴورسەتٴىلەدٴى:",
+'blockededitsource' => "تٴومەندە '''$1''' دەگەنگە جاسالعان '''تٴۇزەتۋڭٴىزدٴىڭ''' مٴاتٴىنٴى كٴورسەتٴىلەدٴى:",
+'whitelistedittitle' => 'ٴوڭدەۋ ٴۇشٴىن كٴىرۋٴىڭٴىز جٴون.',
+'whitelistedittext' => 'بەتتەردٴى ٴوڭدەۋ ٴۇشٴىن $1 جٴون.',
+'whitelistreadtitle' => 'وقۋ ٴۇشٴىن كٴىرۋٴىڭٴىز جٴون',
+'whitelistreadtext' => 'بەتتەردٴى وقۋ ٴۇشٴىن [[{{ns:special}}:Userlogin|كٴىرۋٴىڭٴىز]] جٴون.',
+'whitelistacctitle' => 'سٴىزگە تٴىركەلگٴى جاساۋعا رۇقسات بەرٴىلمەگەن',
+'whitelistacctext' => 'وسى ۋيكيدە باسقالارعا تٴىركەلگٴى جاساۋ ٴۇشٴىن [[{{ns:Special}}:Userlogin|كٴىرۋٴىڭٴىز]] قاجەت جٴانە جاناسىمدى رۇقساتتارىن بيلەۋ قاجەت.',
+'confirmedittitle' => 'ە-پوشتا جايىن كۋٴالاندىرۋ حاتىن قايتا ٴوڭدەۋ قاجەت',
+'confirmedittext' => 'بەتتەردٴى ٴوڭدەۋ ٴۇشٴىن الدىن الا ە-پوشتا جايىڭىزدى كۋٴالاندىرۋىڭىز قاجەت. جايىڭىزدى [[{{ns:Special}}:Preferences|قاتىسۋشى باپتاۋى]] ارقىلى ەنگٴىزٴىڭٴىز جٴانە تەكسەرتكٴىڭٴىز.',
+'loginreqtitle' => 'كٴىرۋٴىڭٴىز قاجەت',
+'loginreqlink' => 'كٴىرۋ',
+'loginreqpagetext' => 'باسقا بەتتەردٴى كٴورۋ ٴۇشٴىن سٴىز $1 بولۋىڭىز قاجەت.',
+'accmailtitle' => 'قۇپييا سٴوز جٴىبەرٴىلدٴى.',
+'accmailtext' => '$2 جايىنا «$1» قۇپييا سٴوزٴى جٴىبەرٴىلدٴى.',
+'newarticle' => '(جاڭا)',
+'newarticletext' => 'سٴىلتەمەگە ەرٴىپ ٴالٴى باستالماعان بەتكە
+كەلٴىپسٴىز. بەتتٴى باستاۋ ٴۇشٴىن, تٴومەندەگٴى اۋماقتا مٴاتٴىنٴىڭٴىزدٴى
+تەرٴىڭٴىز (كٴوبٴىرەك اقپارات ٴۇشٴىن [[{{ns:help}}:مازمۇنى|كٴومەك بەتٴىن]]
+قاراڭىز).ەگەر جاڭىلعاننان وسىندا كەلگەن بولساڭىز, شولعىشىڭىز
+«ارتقا» دەگەن تٴۇيمەسٴىن نۇقىڭىز.',
+'anontalkpagetext' => "----''بۇل تٴىركەلگٴىسٴىز (نەمەسە تٴىركەلگٴىسٴىن قولدانباعان) پايدالانۋشىنىڭ تالقىلاۋ بەتٴى. وسى پايدالانۋشىنى بٴىز تەك ساندىق IP جايىمەن تەڭدەستٴىرەمٴىز. وسىنداي IP جايلار بٴىرنەشە پايدالانۋشىعا ورتاق بولۋى مٴۇمكٴىن. ەگەر سٴىز تٴىركەلگٴىسٴىز پايدالانۋشى بولساڭىز جٴانە سٴىزگە قاتىسسىز مٴاندەمەلەر جٴىبەرٴىلگەنٴىن سەزسەڭٴىز, باسقا تٴىركەلگٴىسٴىز پايدالانۋشىلارمەن ارالاستىرماۋى ٴۇشٴىن [[{{ns:special}}:Userlogin|تٴىركەلگٴى جاساڭىز نە كٴىرٴىڭٴىز]].''",
+'noarticletext' => 'بۇل بەتتە اعىمدا ەش مٴاتٴىن جوق, باسقا بەتتەردەن وسى بەت اتاۋىن [[{{ns:special}}:Search/{{PAGENAME}}|ٴىزدەپ كٴورۋٴىڭٴىزگە]] نەمەسە وسى بەتتٴى [{{fullurl:{{FULLPAGENAME}}|action=edit}} تٴۇزەتۋٴىڭٴىزگە] بولادى.',
+'clearyourcache' => "'''اڭعارتپا:''' ساقتاعاننان كەيٴىن ٴوزگەرٴىستەردٴى كٴورۋ ٴۇشٴىن شولعىش قوسالقى قالتاسىن بوساتۋ كەرەگٴى مٴۇمكٴىن. '''Mozilla / Safari:''' ''Shift'' پەرنەسٴىن باسىپ تۇرىپ ''Reload'' (''قايتا جٴۇكتەۋ'') تٴۇيمەسٴىن نۇقىڭىز (نە ''Ctrl-Shift-R'' باسىڭىز); ''IE:'' ''Ctrl-F5'' باسىڭىز; '''Opera / Konqueror''' ''F5'' پەرنەسٴىن باسىڭىز.",
+'usercssjsyoucanpreview' => '<strong>باسالقى:</strong> ساقتاۋ الدىندا جاڭا CSS/JS Ùايلىن تەكسەرۋ ٴۇشٴىن «قاراپ شىعۋ» تٴۇيمەسٴىن قولدانىڭىز.',
+'usercsspreview' => "'''مىناۋ CSS مٴاتٴىنٴىن تەك قاراپ شىعۋ ەكەنٴىن ۇمىتپاڭىز, ول ٴالٴى ساقتالعان جوق!'''",
+'userjspreview' => "'''مىناۋ JavaScript قاتىسۋشى باعدارلاماسىن تەكسەرۋ/قاراپ شىعۋ ەكەنٴىن ۇمىتپاڭىز, ول ٴالٴى ساقتالعان جوق!'''",
+'userinvalidcssjstitle' => "'''نازار سالىڭىز:''' مىندا «$1» اتاۋلى بەزەندٴىرۋ مٴانەرٴى جوق. پايدالانۋشىنىڭ .css جٴانە .js Ùايل اتاۋى كٴىشٴى ٴارٴىپپپەن جازىلاتىنىن ۇمىتپاڭىز, مىسالعا {{ns:user}}:Foo/monobook.css دەگەندٴى {{ns:user}}:Foo/Monobook.css دەگەنمەن سالىستىرىڭىز.",
+'updated' => '(جاڭارتىلعان)',
+'note' => '<strong>اڭعارتپا:</strong>',
+'previewnote' => '<strong>مىناۋ تەك قاراپ شىعۋ ەكەنٴىن ۇمىتپاڭىز; تٴۇزەتۋلەر ٴالٴى ساقتالعان جوق!</strong>',
+'session_fail_preview' => '<strong>عاÙÛ‹ ەتٴىڭٴىز! سەسسييا دەرەكتەرٴى ىسىراپ قالعاندىقتان ٴوڭدەۋٴىڭٴىزدٴى جٴوندەي المايمىز.
+مٴاتٴىنٴىڭٴىزدٴى ساقتاپ قايتالاپ كٴورٴىڭٴىز. ەگەر ٴالٴى ٴىس ٴوتپەيتٴىن بولسا, شىعىپ جٴانە كەرٴى كٴىرٴىپ كٴورٴىڭٴىز.</strong>',
+'previewconflict' => 'بۇل قاراپ شىعۋ جوعارىداعى ٴوڭدەۋ اۋماعىنداعى مٴاتٴىنگە ساقتاعان كەزٴىندەگٴى دەي ىقپال ەتەدٴى.',
+'session_fail_preview_html' => "<strong>عاÙÛ‹ ەتٴىڭٴىز! سەسسييا دەرەكتەرٴى ىسىراپ قالعاندىقتان ٴوڭدەۋٴىڭٴىزدٴى جٴوندەي المايمىز.</strong>
+
+''وسى ۋيكيدە قام HTML ەندٴىرٴىلگەن, JavaScript شابۋىلداردان قورعانۋ ٴۇشٴىن الدىن الا قاراپ شىعۋ جاسىرىلعان.''
+
+<strong>ەگەر بۇل ٴوڭدەۋ ادال تالاپ بولسا, قايتارىپ كٴورٴىڭٴىز. ەگەر ٴالٴى دە ٴىستەمەسە, شىعىپ, سوسىن كەرٴى كٴىرٴىپ كٴورٴىڭٴىز.</strong>",
+'importing' => 'سىرتتان الۋدا: $1',
+'editing' => 'ٴوڭدەۋدە: $1',
+'editinguser' => 'قاتىسۋشىنى ٴوڭدەۋدە: <b>$1</b>',
+'editingsection' => 'ٴوڭدەۋدە: $1 (بٴولٴىمٴى)',
+'editingcomment' => 'ٴوڭدەۋدە: $1 (مٴاندەمەسٴى)',
+'editconflict' => 'ٴوڭدەۋ ەگەسٴى: $1',
+'explainconflict' => 'وسى بەتتٴى سٴىز ٴوڭدەي باستاعاندا باسقا كەيبٴىرەۋ بەتتٴى ٴوزگەرتكەن.
+جوعارعى اۋماقتا بەتتٴىڭ اعىمدىق مٴاتٴىنٴى بار.
+تٴومەنگٴى اۋماقتا سٴىز ٴوزگەرتكەن مٴاتٴىنٴى كٴورسەتٴىلەدٴى.
+ٴوزگەرتۋٴىڭٴىزدٴى اعىمدىق مٴاتٴىنگە ٴۇستەۋٴىڭٴىز جٴون.
+"بەتتٴى ساقتا!" تٴۇيمەسٴىنە باسقاندا
+<b>تەك</b> جوعارعى اۋماقتاعى مٴاتٴىن ساقتالادى.<br />',
+'yourtext' => 'مٴاتٴىنٴىڭٴىز',
+'storedversion' => 'ساقتالعان نۇسقاسى',
+'nonunicodebrowser' => '<strong>اڭعارتپا: شولعىشىڭىز Unicode بەلگٴىلەۋٴىنە ٴۇيلەسٴىمدٴى ەمەس, سوندىقتان لاتىن ەمەس ٴارٴىپتەرٴى بار بەتتەردٴى ٴوڭدەۋ زٴىل بولۋ مٴۇمكٴىن. جۇمىس ٴىستەۋگە ىقتيمالدىق بەرۋ ٴۇشٴىن, <strong>تٴومەنگٴى ٴوڭدەۋ اۋماعىندا ASCII ەمەس ٴارٴىپتەر ونالتىلىق سانىمەن كٴورسەتٴىلەدٴى</strong>.',
+'editingold' => '<strong>اڭعارتپا: وسى بەتتٴىڭ ەرتەرەك نۇسقاسىن
+ٴوڭدەپ جاتىرسىز.
+بۇنى ساقتاساڭىز, وسى نۋسقادان سوڭعى بارلىق تٴۇزەتۋلەر جويىلادى.</strong>',
+'yourdiff' => 'ايىرمالار',
+'copyrightwarning' => '{{SITENAME}} جوباسىنا قوسىلعان بٴۇكٴىل ٴۇلەس $2 (كٴوبٴىرەك اقپارات ٴۇشٴىن: $1) قۇجاتىنا ساي جٴىبەرٴىلگەن بولىپ سانالادى. ەگەر جازۋىڭىزدىڭ ەركٴىن كٴوشٴىرٴىلٴىپ تٴۇزەتٴىلۋٴىن قالاماساڭىز, مىندا ۇسىنباۋىڭىز جٴون.<br />
+تاعى, قوسقان ٴۇلەسٴىڭٴىز - ٴوزٴىڭٴىزدٴىڭ جازعانىعىز, نە اشىق اقپارات كٴوزدەرٴىنەن الىنعان ماعلۇمات بولعانىن ۋٴادە ەتەسٴىز.<br />
+<strong>اۆتورلىق قۇقىقپەن قورعاۋلى اقپاراتتى رۇقساتسىز قوسپاڭىز!</strong>',
+'copyrightwarning2' => 'ەستە تۇرسىن: بارلىق {{SITENAME}} جوباسىنا بەرٴىلگەن ٴۇلەستەر باسقا ۋلەس بەرۋشٴىلەرمەن تٴۇزەتۋگە, ٴوزگەرتۋگە, نە الاستانۋعا مٴۇمكٴىن. العىسسىز تٴۇزەتۋگە ەنجارلان بولساڭىز, وندا شىعارماڭىزدى مىندا جارييالاماڭىز.<br />
+تاعى, وسىنى ٴوزٴىڭٴىز جازعانىڭىزدى, نە بارشا قازىناسىنان, نەمەسە سونداي-اق اقىسىز اشىق قاينارىنان كٴوشٴىرگەنٴىڭٴىزدٴى
+دٴال وسىنداي بٴىزگە مٴىندەتتەمە بەرەسٴىز (كٴوبٴىرەك اقپارات ٴۇشٴىن $1 قۋجاتىن قاراڭىز).<br />
+<strong>اۋتورلىق قۇقىقپەن قورعاۋلى اقپاراتتى رۇقساتسىز قوسپاڭىز!</strong>',
+'longpagewarning' => '<strong>نازار سالىڭىز: بۇل بەتتٴىڭ مٴولشەرٴى — $1 كيلوبايت; كەيبٴىر
+شولعىشتاردا بەت مٴولشەرٴى 32 كب جەتسە نە ونى اسسا ٴوڭدەۋ كٴۇردەلٴى بولۋى مٴۇمكٴىن.
+بەتتٴى بٴىرنەشە كٴىشكٴىن بٴولٴىمدەرگە بٴولٴىپ كٴورٴىڭٴىز.</strong>',
+'longpageerror' => '<strong>قاتە: جٴىبەرەتٴىن مٴاتٴىنٴىڭٴىزدٴىن مٴولشەرٴى — $1 كب, ەڭ كٴوبٴى $2 كب
+رۇقسات ەتٴىلگەن مٴولشەرٴىنەن اسقان. بۇل ساقتاي الىنبايدى.</strong>',
+'readonlywarning' => '<strong>نازار سالىڭىز: دەرەكقور جٴوندەتۋ ٴۇشٴىن قۇلىپتالعان,
+سوندىقتان دٴال قازٴىر تٴۇزەتۋٴىڭٴىزدٴى ساقتاي المايسىز. سوسىن قولدانۋعا ٴۇشٴىن مٴاتٴانٴىڭٴىزدٴى كٴوشٴىرٴىپ,
+ٴوز كومپٴۇتەرٴىڭٴىزدە Ùايلعا ساقتاڭىز.</strong>',
+'protectedpagewarning' => '<strong>نازار سالىڭىز: بۇل بەت قورعالعان. تەك ٴاكٴىمشٴى رۇقساتى بار قاتىسۋشىلار ٴوڭدەۋ جاساي الادى.</strong>',
+'semiprotectedpagewarning' => "'''اڭعارتپا:''' بەت [[{{ns:project}}:جارتىلاي قورعاۋ ساياساتى|قورعالعان]], سوندىقتان وسىنى تەك رۇقساتى بار قاتىسۋشىلار ٴوڭدەي الادى.",
+'templatesused' => 'بۇل بەتتە قولدانىلعان ٴۇلگٴىلەر:',
+'templatesusedpreview' => 'بۇنى قاراپ شىعۋعا قولدانىلعان ٴۇلگٴىلەر:',
+'templatesusedsection' => 'بۇل بٴولٴىمدە قولدانىلعان ٴۇلگٴىلەر:',
+'edittools' => '<!-- مىنداعى ماعلۇمات ٴوڭدەۋ جٴانە قوتارۋ ٴۇلگٴىتترٴىڭٴىڭ استىندا كٴورسەتٴىلەدٴى. -->',
+'nocreatetitle' => 'بەتتٴى باستاۋ شەكتەلگەن',
+'nocreatetext' => 'بۇل توراپتا جاڭا بەت باستاۋى شەكتەلگەن.
+كەرٴى قايتىپ بار بەتتٴى ٴوڭدەۋٴىڭٴىزگە بولادى, نەمەسە [[{{ns:special}}:Userlogin|كٴىرۋٴىڭٴىزگە نە تٴىركەلگٴى جاساۋعا]] بولادى.',
+'cantcreateaccounttitle' => 'تٴىركەلگٴى جاسالمادى',
+'cantcreateaccounttext' => 'وسى IP جايدان (<b>$1</b>) تٴىركەلگٴى جاساۋى بۇعاتتالعان.
+بٴالكٴىم سەبەبٴى, وقۋ ورنىڭىزدان, نەمەسە ينتەرنەت جەتكٴىزۋشٴىدەن
+ٴۇزبەي بۇزاقىلىق بولعانى.',
+
+# History pages
+'revhistory' => 'نۇسقالار تاريحى',
+'viewpagelogs' => 'وسى بەتكە قاتىستى جۋرنالداردى قاراۋ',
+'nohistory' => 'وسى بەتتٴىنٴىڭ نۇسقالار تاريحى جوق.',
+'revnotfound' => 'نۇسقا تابىلمادى',
+'revnotfoundtext' => 'وسى سۇرانىسقان بەتتٴىڭ ەسكٴى نۇسقاسى تابىلعان جوق.
+وسى بەتتٴى اشۋعا پايدالانعان URL جايىن قايتا تەكسەرٴىپ شىعىڭىز.',
+'loadhist' => 'بەت تاريحىن جٴۇكتەۋٴى',
+'currentrev' => 'اعىمدىق نۇسقاسى',
+'revisionasof' => '$1 كەزٴىندەگٴى نۇسقاسى',
+'revision-info' => '$1 كەزٴىندەگٴى $2 جاساعان نۇسقاسى',
+'previousrevision' => '↠ەسكٴىلەۋ نۇسقاسى',
+'nextrevision' => 'جاڭالاۋ نۇسقاسى →',
+'currentrevisionlink' => 'اعىمدىق نۇسقاسى',
+'cur' => 'اعىم.',
+'next' => 'ÙƒÛ•Ù„.',
+'last' => 'سوڭ.',
+'orig' => 'تٴۇپ.',
+'histlegend' => 'ايىرماسىن كٴورۋ: سالىستىرامىن دەگەن نۇسقالاردى تاڭداپ, نە <Enter> پەرنەسٴىن, نە تٴومەندەگٴى تٴۇيمەنٴى باسىڭىز.<br />
+شارتتى بەلگٴىلەر: (اعىم.) = اعىمدىق نۇسقامەن ايىرماسى,
+(سوڭ.) = الدىڭعى نۇسقامەن ايىرماسى, ش = شاعىن تٴۇزەتۋ',
+'deletedrev' => '[جويىلعان]',
+'histfirst' => 'ەڭ العاشقىسىنا',
+'histlast' => 'ەڭ سوڭعىسىنا',
+'rev-deleted-comment' => '(مٴاندەمە الاستاتىلدى)',
+'rev-deleted-user' => '(قاتىسۋشى اتى الاستاتىلدى)',
+'rev-deleted-text-permission' => '<div class="mw-warning plainlinks">
+وسى بەتتٴىڭ نۇسقاسى جارييا مۇراعاتتارىنان الاستاتىلعان.
+بۇل جايتقا [{{fullurl:{{ns:special}}:Log/delete|page={{PAGENAMEE}}}} جويۋ جۋرنالىندا] ەگجەي-تەگجەي مٴالٴىمەتتەر بولۋى مٴۇمكٴىن.
+</div>',
+'rev-deleted-text-view' => '<div class="mw-warning plainlinks">
+وسى بەتتٴىڭ نۇسقاسى جارييا مۇراعاتتارىنان الاستاتىلعان.
+سونى وسى توراپتىڭ ٴاكٴىمشٴىسٴى بوپ كٴورۋٴىڭٴىز مٴۇمكٴىن;
+بۇل جايتقا [{{fullurl:{{ns:special}}:Log/delete|page={{PAGENAMEE}}}} جويۋ جۋرنالىندا] ەگجەي-تەگجەي مٴالمەتتەر بولۋى مٴۇمكٴىن.
+</div>',
+'rev-delundel' => 'كٴورسەت/جاسىر',
+
+'history-feed-title' => 'نۇسقالار تاريحى',
+'history-feed-description' => 'بۇل بەتتٴىڭ ۋيكيدەگٴى نۇسقالار تاريحى',
+'history-feed-item-nocomment' => '$1 دەگەن $2 كەزٴىندە', # user at time
+'history-feed-empty' => 'سۇرانعان بەت جوق.
+بۇل بەت ۋيكيدەن جويىلعان, نەمەسە قايتا اتالعان.
+سٴايكەسٴى بار جاڭا بەتتەردٴى [[{{ns:special}}:Search|ۋيكيدەن ٴىزدەپ]] قاراڭىز.',
+
+# Revision deletion
+'revisiondelete' => 'نۇسقالاردى جويۋ/قايتارۋ',
+'revdelete-nooldid-title' => 'نىسانا نۇسقاسى جوق',
+'revdelete-nooldid-text' => 'وسى ٴارەكەتتٴى ورىنداۋ ٴۇشٴىن اقىرعى نۇسقاسىن
+نە نۇسقالارىن ەنگٴىزبەپسٴىز.',
+'revdelete-selected' => '[[:$1]] دەگەننٴىڭ تالعانىلعان نۇسقاسى:',
+'revdelete-text' => 'جويىلعان نۇسقالاردى ٴالٴى دە بەت تاريحىندا كٴورۋگە بولادى,
+بٴىراق ونىڭ مٴاتٴىن ماعلۇماتى بارشاعا قاتىنالمايدى.
+
+وسى ۋيكيدٴىڭ باسقا ٴاكٴىمشٴىلەرٴى جاسىرىن ماعلۇماتقا قاتىناي الادى,
+جٴانە توراپ وپەراتورلارى قوسىمشا شەكتەۋ ەندٴىرگەنشە دەيٴىن,
+وسى تٴىلدەسۋ ارقىلى جويىلعاندى كەرٴى قايتارا الادى.',
+'revdelete-legend' => 'نۇسقانىنىڭ شەكتەۋلەرٴى:',
+'revdelete-hide-text' => 'نۇسقا مٴاتٴىنٴىن جاسىر',
+'revdelete-hide-comment' => 'تٴۇزەتۋ مٴاندەمەسٴىن جاسىر',
+'revdelete-hide-user' => 'ٴوڭدەۋشٴى اتىن (IP جايىن) جاسىر',
+'revdelete-hide-restricted' => 'وسى شەكتەۋلەردٴى بارشاعا سيياقتى ٴاكٴىمشٴىلەرگە دە قولدانۋ',
+'revdelete-log' => 'جۋرنال مٴاندەمەسٴى:',
+'revdelete-submit' => 'تالعانعان نۇسقاعا قولدانۋ',
+'revdelete-logentry' => '[[$1]] دەگەنگە نۇسقا كٴورٴىنٴىسٴىن ٴوزگەرتتٴى',
+
+# Diffs
+'difference' => '(نۇسقالار اراسىنداعى ايىرماشىلىق)',
+'loadingrev' => 'ايىرما ٴۇشٴىن نۇسقا جٴۇكتەۋ',
+'lineno' => 'جول $1:',
+'editcurrent' => 'وسى بەتتٴىڭ اعىمدىق نۇسقاسىن ٴوڭدەۋ',
+'selectnewerversionfordiff' => 'سالىستىرۋ ٴۇشٴىن جاڭالاۋ نۇسقاسىن تالعاڭىز',
+'selectolderversionfordiff' => 'سالىستىرۋ ٴۇشٴىن ەسكٴىلەۋ نۇسقاسىن تالعاڭىز',
+'compareselectedversions' => 'تاڭداعان نۇسقالاردى سالىستىرۋ',
+
+# Search results
+'searchresults' => 'ٴىزدەستٴىرۋ نٴاتيجەلەرٴى',
+'searchresulttext' => 'وسى {{SITENAME}} جوباسىندا ٴىزدەستٴىرۋ تۋرالى كٴوبٴىرەك اقپارات ٴۇشٴىن, [[{{ns:project}}:ٴىزدەۋ|{{SITENAME}} ٴىزدەۋ نۇسقاۋلارىن]] قاراڭىز.',
+'searchsubtitle' => "ٴىزدەستٴىرۋ سۇرانىسىڭىز: '''[[:$1]]'''",
+'searchsubtitleinvalid' => "ٴىزدەستٴىرۋ سۇرانىسىڭىز: '''$1'''",
+'badquery' => 'ٴىزدەستٴىرۋ سۇرانىس جارامسىز پٴىشٴىمدەلگەن',
+'badquerytext' => 'عاÙÛ‹ ەتٴىڭٴىز, سۇرانىسىڭىزدى ورىنداي المادىق.
+بۇل ٴۇش ٴارٴىپتەن كەم سٴوزدٴى ٴىزدەستٴىرۋگە تالاپتانعانىڭىزدان
+بولۋعا مٴۇمكٴىن, ول ٴالٴى دە سٴۇيەمەلدەنبەگەن.
+تاعى دا بۇل سٴويلەمدٴى دۇرىس ەنگٴىزبەگەندٴىكتەن دە بولۋعا مٴۇمكٴىن,
+مىسالى, «بالىق جٴانە جٴانە قابىرشاق».
+باسقا سۇرانىس جاساپ كٴورٴىڭٴىز',
+'matchtotals' => '«$1» ٴىزدەستٴىرۋ سۇرانىسى $2 بەتتٴىڭ اتاۋىنا
+جٴانە $3 بەتتٴىڭ مٴاتٴىنٴىنە سٴايكەس.',
+'noexactmatch' => "'''وسىندا «$1» اتاۋلى بەت جوق.''' بۇل بەتتٴى ٴوزٴىڭٴىز '''[[:$1|باستاي الاسىز]].'''",
+'titlematches' => 'بەت اتاۋى سٴايكەسٴى',
+'notitlematches' => 'ەش بەت اتاۋى سٴايكەس ەمەس',
+'textmatches' => 'بەت مٴاتٴىنٴىڭ سٴايكەسٴى',
+'notextmatches' => 'ەش بەت مٴاتٴىنٴى سٴايكەس ەمەس',
+'prevn' => 'الدىڭعى $1',
+'nextn' => 'كەلەسٴى $1',
+'viewprevnext' => 'كٴورسەتٴىلۋٴى: ($1) ($2) ($3) جازبا.',
+'showingresults' => 'تٴومەندە نٴومٴىر <b>$2</b> دەگەننەن باستاپ <b>$1</b> نٴاتيجەگە دەيٴىن كٴورسەتٴىلگەن.',
+'showingresultsnum' => 'تٴومەندە نٴومٴىر <b>$2</b> دەگەننەن باستاپ <b>$3</b> نٴاتيجە كٴورسەتٴىلگەن.',
+'nonefound' => "'''اڭعارتپا''': تابۋ سٴاتسٴىز بٴىتۋٴى جيٴى «بولعان» جٴانە «دەگەن» سيياقتى
+تٴىزٴىمدەلمەيتٴىن جالپى سٴوزدەرمەن ٴىزدەستٴىرۋدەن بولۋى مٴۇمكٴىن,
+نەمەسە بٴىردەن ارتىق ٴىزدەستٴىرۋ شارت سٴوزدەرٴىن ەگٴىزگەننەن (نٴاتيجەلەردە تەك
+بارلىق شارت سٴوزدەر كەدەسسە كٴورسەتٴىلەدٴى) بولۋى مٴۇمكٴىن.",
+'powersearch' => 'ٴىزدەۋ',
+'powersearchtext' => 'مىنا ەسٴىم ايالاردا ٴىزدەۋ:<br />$1<br />$2 ايداتۋلاردى تٴىزٴىمدەۋ<br />ٴىزدەستٴىرۋ سۇرانىسى: $3 $9',
+'searchdisabled' => '{{SITENAME}} جوباسىندا ٴىشكٴى ٴىزدەۋٴى ٴوشٴىرٴىلگەن. ٴازٴىرشە Google نەمەسە Yahoo! ارقىلى ٴىزدەۋگە بولادى. اڭعارتپا: {{SITENAME}} ماعلۇمات تٴىزٴىمٴىدەۋلەرٴى ولاردا ەسكٴىرگەن بولۋعا مٴۇمكٴىن.',
+'blanknamespace' => '(نەگٴىزگٴى)',
+
+# Preferences page
+'preferences' => 'باپتاۋلار',
+'mypreferences' => 'باپتاۋىم',
+'prefsnologin' => 'كٴىرمەگەنسٴىز',
+'prefsnologintext' => 'باپتاۋلاردى قالاۋ ٴۇشٴىن الدىن الا [[{{ns:special}}:Userlogin|كٴىرۋٴىڭٴىز]] قاجەت.',
+'prefsreset' => 'باپتاۋلار ارقاۋدان قايتا ورناتىلدى.',
+'qbsettings' => 'مٴازٴىر ايماعى',
+'changepassword' => 'قۇپييا سٴوز ٴوزگەرتۋ',
+'skin' => 'بەزەندٴىرۋ',
+'math' => 'ماتەماتيكا',
+'dateformat' => 'كٴۇن-اي پٴىشٴىمٴى',
+'datedefault' => 'ەش قالاۋسىز',
+'datetime' => 'ۋاقىت',
+'math_failure' => 'ٴوڭدەتۋ سٴاتسٴىز بٴىتتٴى',
+'math_unknown_error' => 'بەلگٴىسٴىز قاتە',
+'math_unknown_function' => 'بەلگٴىسٴىز Ùۋنكتسييا',
+'math_lexing_error' => 'لەكسيكا قاتەسٴى',
+'math_syntax_error' => 'سينتاكسيس قاتەسٴى',
+'math_image_error' => 'PNG اۋدارىسى سٴاتسٴىز بٴىتتٴى; latex, dvips, gs جٴانە convert باعدارلامالارىنىڭ مٴۇلتٴىكسٴىز ورناتۋىن تەكسەرٴىڭٴىز',
+'math_bad_tmpdir' => 'ماتەماتيكانىڭ ۋاقىتشا قالتاسىنا جازىلمادى, نە قالتا جاسالمادى',
+'math_bad_output' => 'ماتەماتيكانىڭ بەرٴىس قالتاسىنا جازىلمادى, نە قالتا جاسالمادى',
+'math_notexvc' => 'texvc باعدارلاماسى جوعالتىلعان; باپتاۋ ٴۇشٴىن math/README قۇجاتىن قاراڭىز.',
+'prefs-personal' => 'جەكە دەرەكتەرٴى',
+'prefs-rc' => 'جۋىقتاعى ٴوزگەرٴىستەر',
+'prefs-watchlist' => 'باقىلاۋ',
+'prefs-watchlist-days' => 'باقىلاۋ تٴىزٴىمٴىندە كٴورسەتەرٴىن كٴۇن سانى:',
+'prefs-watchlist-edits' => 'كەڭەيتٴىلگەن باقىلاۋ تٴىزٴىمٴى تٴۇزەتۋ كٴورسەتەرٴىن سانى:',
+'prefs-misc' => 'قوسىمشا',
+'saveprefs' => 'ساقتا',
+'resetprefs' => 'تاستا',
+'oldpassword' => 'اعىمدىق قۇپييا سٴوز:',
+'newpassword' => 'جاڭا قۇپييا سٴوز:',
+'retypenew' => 'جاڭا قۇپييا سٴوزدٴى قايتالاڭىز:',
+'textboxsize' => 'ٴوڭدەۋ',
+'rows' => 'جولدار:',
+'columns' => 'باعاندار:',
+'searchresultshead' => 'ٴىزدەۋ',
+'resultsperpage' => 'بەت سايىن نٴاتيجە سانى:',
+'contextlines' => 'نٴاتيجە سايىن جول سانى:',
+'contextchars' => 'جول سايىن ٴارٴىپ سانى:',
+'stubthreshold' => 'بٴىتەمە كٴورستەتۋٴىن انىقتاۋ تابالدىرىعى:',
+'recentchangescount' => 'جۋىقتاعى ٴوزگەرٴىستەردەگٴى اتاۋلار:',
+'savedprefs' => 'باپتاۋلارىڭىز ساقتالدى.',
+'timezonelegend' => 'ۋاقىت بەلدەۋٴى',
+'timezonetext' => 'جەرگٴىلٴىكتٴى ۋاقىتىڭىزبەن سەرۆەر ۋاقىتىنىڭ (UTC) اراسىنداعى ساعات سانى.',
+'localtime' => 'جەرگٴىلٴىكتٴى ۋاقىت',
+'timezoneoffset' => 'ىعىستىرۋ¹',
+'servertime' => 'سەرۆەر ۋاقىتى',
+'guesstimezone' => 'شولعىشتان الىپ تولتىرۋ',
+'allowemail' => 'باسقادان حات قابىلداۋىن ەندٴىرۋ',
+'defaultns' => 'مىنا ەسٴىم ايالاردا ٴادەپكٴىدەن ٴىزدەۋ:',
+'default' => 'ٴادەپكٴى',
+'files' => 'Ùايلدار',
+
+# User rights
+'userrights-lookup-user' => 'قاتىسۋشى توپتارىن مەڭگەرۋ',
+'userrights-user-editname' => 'قاتىسۋشى اتىن ەنگٴىزٴىڭٴىز:',
+'editusergroup' => 'قاتىسۋشى توپتارىن ٴوڭدەۋ',
+'userrights-editusergroup' => 'قاتىسۋشى توپتارىن ٴوڭدەۋ',
+'saveusergroups' => 'قاتىسۋشى توپتارىن ساقتاۋ',
+'userrights-groupsmember' => 'مٴۇشەلٴىگٴى:',
+'userrights-groupsavailable' => 'قاتىناۋلى توپتار:',
+'userrights-groupshelp' => 'قاتىسۋشىنى ٴۇستەيتٴىن نە الاستاتىن توپتاردى تالعاڭىز.
+تالعاۋى ٴوشٴىرٴىلگەن توپتار ٴوزگەرتٴىلٴىمەيدٴى. توپتاردىڭ تالعاۋىن CTRL + سول جاق نۇقۋمەن ٴوشٴىرۋٴىڭٴىزگە بولادى.',
+
+# Groups
+'group' => 'توپ:',
+'group-bot' => 'بوتتار',
+'group-sysop' => 'ٴاكٴىمشٴىلەر',
+'group-bureaucrat' => 'تٴورەشٴىلەر',
+'group-all' => '(بارلىعى)',
+
+'group-bot-member' => 'بوت',
+'group-sysop-member' => 'ٴاكٴىمشٴى',
+'group-bureaucrat-member' => 'تٴورەشٴى',
+
+'grouppage-bot' => '{{ns:project}}:بوتتار',
+'grouppage-sysop' => '{{ns:project}}:ٴاكٴىمشٴىلەر',
+'grouppage-bureaucrat' => '{{ns:project}}:تٴورەشٴىلەر',
+
+# Recent changes
+'changes' => 'ٴوزگەرٴىس',
+'recentchanges' => 'جۋىقتاعى ٴوزگەرٴىستەر',
+'recentchangestext' => 'بۇل بەتتە وسى ۋيكيدەگٴى بولعان جۋىقتاعى ٴوزگەرٴىستەر بايقالادى.',
+'rcnote' => '$3 كەزٴىنە دەيٴىن — تٴومەندە سوڭعى <strong>$2</strong> كٴۇندەگٴى, سوڭعى <strong>$1</strong> ٴوزگەرٴىس كٴورسەتٴىلگەن.',
+'rcnotefrom' => '<b>$2</b> كەزٴىنەن بەرٴى — تٴومەندە ٴوزگەرٴىستەر <b>$1</b> دەيٴىن كٴورسەتٴىلگەن.',
+'rclistfrom' => '$1 كەزٴىنەن بەرٴى — جاڭا ٴوزگەرٴىستەردٴى كٴورسەت.',
+'rcshowhideminor' => 'شاعىن تٴۇزەتۋدٴى $1',
+'rcshowhidebots' => 'بوتتاردى $1',
+'rcshowhideliu' => 'تٴىركەلگەندٴى $1',
+'rcshowhideanons' => 'تٴىركەلگٴىسٴىزدٴى $1',
+'rcshowhidepatr' => 'كٴۇزەتتەگٴى تٴۇزەتۋلەردٴى $1',
+'rcshowhidemine' => 'تٴۇزەتۋٴىمدٴى $1',
+'rclinks' => 'سوڭعى $2 كٴۇندە بولعان, سوڭعى $1 ٴوزگەرٴىستٴى كٴورسەت<br />$3',
+'diff' => 'ايىرم.',
+'hist' => 'تار.',
+'hide' => 'جاسىر',
+'show' => 'كٴورسەت',
+'minoreditletter' => 'Ø´',
+'newpageletter' => 'ج',
+'boteditletter' => 'ب',
+'sectionlink' => '→',
+'number_of_watching_users_pageview' => '[باقىلاعان $1 قاتىسۋشى]',
+'rc_categories' => 'ساناتتارعا شەكتەۋ ("|" بەلگٴىسٴىمەن بٴولٴىكتەڭٴىز)',
+'rc_categories_any' => 'قايسىبٴىر',
+
+# Upload
+'upload' => 'Ùايل قوتارۋ',
+'uploadbtn' => 'قوتار!',
+'reupload' => 'قايتالاپ قوتارۋ',
+'reuploaddesc' => 'قوتارۋ ٴۇلگٴىتٴىنە ورالۋ.',
+'uploadnologin' => 'كٴىرمەگەنسٴىز',
+'uploadnologintext' => 'Ùايل قوتارۋ ٴۇشٴىن
+[[{{ns:special}}:Userlogin|كٴىرۋٴىڭٴىز]] قاجەت.',
+'upload_directory_read_only' => 'قوتارۋ قالتاسىنا ($1) جازۋعا ۆەب-سەرۆەرگە رۇقسات بەرٴىلمەگەن.',
+'uploaderror' => 'قوتارۋ قاتەسٴى',
+'uploadtext' => "تٴومەندەگٴى ٴۇلگٴىت Ùايل قوتارۋعا قولدانىلادى, الدىنداعى سۋرەتتەردٴى قاراۋ ٴۇشٴىن Ù†Û• ٴىزدەۋ ٴۇشٴىن [[{{ns:special}}:Imagelist|قوتارىلعان Ùايلدار تٴىزٴىمٴىنە]] بارىڭىز, قوتارۋ Ù…Û•Ù† جويۋ تاعى دا [[{{ns:special}}:Log/upload|قوتارۋ جۋرنالىنا]] جازىلىپ الىنادى.
+
+سۋرەتتەردٴى بەتكە كٴىرگٴىزۋ ٴۇشٴىن, Ùايلعا تۋرا بايلانىستراتىن
+'''<nowiki>[[{{ns:image}}:File.jpg]]</nowiki>''',
+'''<nowiki>[[{{ns:image}}:File.png|بالاما مٴاتٴىن]]</nowiki>''' نەمەسە
+'''<nowiki>[[{{ns:media}}:File.ogg]]</nowiki>''' سٴىلتەمە پٴىشٴىمٴىن قولدانىڭىز.",
+'uploadlog' => 'قوتارۋ جۋرنالى',
+'uploadlogpage' => 'قوتارۋ جۋرنالى',
+'uploadlogpagetext' => 'تٴومەندە جۋىقتاعى قوتارىلعان Ùايل تٴىزٴىمٴى.',
+'filename' => 'Ùايل اتى',
+'filedesc' => 'سيپاتتاماسى',
+'fileuploadsummary' => 'سيپاتتاماسى:',
+'filestatus' => 'اۋتورلىق قۇقىقتارى كٴۇيٴى',
+'filesource' => 'Ùايل قاينارى',
+'copyrightpage' => '{{ns:project}}:اۋتورلىق قۇقىقتار',
+'copyrightpagename' => '{{SITENAME}} اۋتورلىق قۇقىقتارى',
+'uploadedfiles' => 'قوتارىلعان Ùايلدار',
+'ignorewarning' => 'نازار سالۋدى Û•Ù„Û•Ù…Û•Û‹ جٴانە Ùايلدى ٴاردەقاشان ساقتاۋ.',
+'ignorewarnings' => 'ٴارقايسى نازار سالۋلاردى ەلەمەۋ',
+'minlength' => 'Ùايل اتىندا Û•Ú­ كەمٴىندە ٴۇش ٴارٴىپ بولۋى كەرەك.',
+'illegalfilename' => '«$1» Ùايل اتاۋىندا بەت اتاۋلارىندا رۇقسات ەتٴىلمەگەن نىشاندار بار. Ùايلدى قايتا اتاڭىز, سوسىن قايتا جۋكتەپ كٴورٴىڭٴىز.',
+'badfilename' => 'Ùايلدىڭ اتى «$1» بوپ ٴوزگەرتٴىلدٴى.',
+'badfiletype' => '«.$1» ۇسىنىلماعان سۋرەت Ùايلىنىڭ كەڭەيتٴىمٴى.',
+'largefile' => 'Ùايل مٴولشەرٴىن $1 بايتتان اسىرماۋعا تىرىسىڭىز, بۇل Ùايل مٴولشەرٴى $2 بايت',
+'largefileserver' => 'وسى Ùايلدىڭ مٴولشەرٴى سەرۆەردٴىڭ قالاۋىنان اسىپ كەتكەن.',
+'emptyfile' => 'قوتارىلعان Ùايلىڭىز بوس سيياقتى. بۇل Ùايل اتاۋى جانساق ەنگٴىزٴىلگەنٴىنەن بولۋى مٴۇمكٴىن. قوتارعىڭىز ÙƒÛ•Ù„Ú¯Û•Ù† Ùايل شىنىندا دا وسى Ùايل بولعانىن تەكسەرٴىپ الىڭىز.',
+'fileexists' => 'وسىنداي اتاۋلى Ùايل بار تٴۇگە. قايتا جازۋدىڭ الدىنان $1 تەكسەرٴىپ شىعىڭىز.',
+'fileexists-forbidden' => 'وسىنداي اتاۋلى Ùايل بار تٴۇگە. كەرٴى قايتىڭىز دا, جٴانە وسى Ùايلدى باسقا اتىمەن قوتارىڭىز. [[{{ns:image}}:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'وسىنداي اتاۋلى Ùايل ورتاق Ùايل ارقاۋىندا بار تٴۇگە. كەرٴى قايتىڭىز دا, وسى Ùايلدى جاڭا اتىمەن قوتارىڭىز. [[{{ns:image}}:$1|thumb|center|$1]]',
+'successfulupload' => 'قوتارۋ سٴاتتٴى ٴوتتٴى',
+'fileuploaded' => '«$1» Ùايلى سٴاتتٴى قوتارىلدى!
+وسى سٴىلتەمەگە ەرٴىپ — $2, سيپاتتاما بەتٴىنە بارىڭىز دا, جٴانە وسى Ùايل تۋرالى
+اقپارات تولتىرىڭىز: قايدان الىنعانىن, قاشان جاسالعانىن, كٴىم جاساعانىن,
+تاعى باسقا بٴىلەتٴىڭٴىزدٴى. بۇل سۋرەت بولسا, مىناداي پٴىشٴىمٴىمەن كٴىرٴىستٴىرۋگە بولادى: <tt><nowiki>[[سۋرەت:$1|thumb|سيپاتتاماسى]]</nowiki></tt>',
+'uploadwarning' => 'قوتارۋ تۋرالى نازار سالۋ',
+'savefile' => 'Ùايلدى ساقتاۋ',
+'uploadedimage' => '«[[$1]]» Ùايلىن قوتاردى',
+'uploaddisabled' => 'Ùايل قوتارۋى ٴوشٴىرٴىلگەن',
+'uploaddisabledtext' => 'وسى ۋيكيدە Ùايل قوتارۋى ٴوشٴىرٴىلگەن.',
+'uploadscripted' => 'وسى Ùايلدا, ۆەب شولعىشتى اعات تٴۇسٴىندٴىككە كەلتٴىرەتٴىڭ HTML بەلگٴىلەۋ, Ù†Û• سكريپت كودى بار.',
+'uploadcorrupt' => 'وسى Ùايل بٴۇلدٴىرٴىلگەن, Ù†Û• ٴادەپسٴىز كەڭەيتٴىمٴى بار. Ùايلدى تەكسەرٴىپ, قوتارۋىن قايتالاڭىز.',
+'uploadvirus' => 'وسى Ùايلدا ۆيرۋس بولۋى مٴۇمكٴىن! ەگجەي-تەگجەي اقپاراتى: $1',
+'sourcefilename' => 'قاينارداعى Ùايل اتى',
+'destfilename' => 'اقىرعى Ùايل اتى',
+'watchthisupload' => 'وسى بەتتٴى باقىلاۋ',
+'filewasdeleted' => 'وسى اتاۋى بار Ùايل بۇرىن قوتارىلعان, سوسىن جويىلدىرىلعان. قايتا قوتارۋ الدىنان $1 دەگەندٴى تەكسەرٴىڭٴىز.',
+
+'upload-proto-error' => 'جارامسىز حاتتامالىق',
+'upload-proto-error-text' => 'سىرتتان قوتارۋ ٴۇشٴىن URL جايلارى <code>http://</code> نەمەسە <code>ftp://</code> دەگەندەردەن باستالۋ قاجەت.',
+'upload-file-error' => 'ٴىشكٴى قاتە',
+'upload-file-error-text' => 'سەرۆەردە ۋاقىتشا Ùايل جاساۋى ٴىشكٴى قاتەگە ۇشىراستى. بۇل جٴۇيەنٴىڭ ٴاكٴىمشٴىمەن قاتىناسىڭىز.',
+'upload-misc-error' => 'بەلگٴىسٴىز قوتارۋ قاتەسٴى',
+'upload-misc-error-text' => 'قوتارۋ كەزٴىندە بەلگٴىسٴىز قاتە ۇشىراستى. قايسى URL جايى جارامدى جٴانە قاتىناۋلى ەكەنٴىن تەكسەرٴىپ شىعىڭىز دا قايتالاپ كٴورٴىڭٴىز. ەگەر بۇل مٴاسەلە ٴالدە دە قالسا, جٴۇيە ٴاكٴىمشٴىمەن قاتىناسىڭىز.',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'URL جايى جەتٴىلمەدٴى',
+'upload-curl-error6-text' => 'بەرٴىلگەن URL جايى جەتٴىلمەدٴى. قايسى URL جايى دۇرىس ەكەنٴىن جٴانە توراپ ٴىستە ەكەنٴىن قايتالاپ قاتاڭ تەكسەرٴىڭٴىز.',
+'upload-curl-error28' => 'قوتارۋعا بەرٴىلگەن ۋاقىت بٴىتتٴى',
+'upload-curl-error28-text' => 'توراپتىڭ جاۋاپ بەرۋٴى تىم ۇزاق ۋاقىتقا سوزىلدى. بۇل توراپ ٴىستە ەكەنٴىن تەكسەرٴىپ شىعىڭىز, از ۋاقىت كٴىدٴىرە تۇرىڭىز دا تاعى قايتالاپ كٴورٴىڭٴىز. تالابىڭىزدى جٴۇكتەلۋٴى ازداۋ كەزٴىندە قايتالاۋعا بولمىس.',
+
+'license' => 'ليتسەنزيياسى',
+'nolicense' => 'ەشتەڭە تالعانباعان',
+'upload_source_url' => ' (جارامدى, بارشاعا قاتىناۋلى URL جاي)',
+'upload_source_file' => ' (كومپييۋتەرٴىڭٴىزدەگٴى Ùايل)',
+
+# Image list
+'imagelist' => 'Ùايل تٴىزٴىمٴى',
+'imagelisttext' => "تٴومەندە ''$2'' سۇرىپتالعان '''$1''' Ùايل تٴىزٴىمٴى.",
+'imagelistforuser' => 'مىندا تەك $1 جٴۇكتەگەن سۋرەتتەر كٴورسەتٴىلەدٴى.',
+'getimagelist' => 'Ùايل تٴىزٴىمدەۋٴى',
+'ilsubmit' => 'ٴىزدەۋ',
+'showlast' => 'سوڭعى $1 Ùايل $2 سۇرىپتاپ كٴورسەت.',
+'byname' => 'اتىمەن',
+'bydate' => 'كٴۇن-ايمەن',
+'bysize' => 'مٴولشەرٴىمەن',
+'imgdelete' => 'جويۋ',
+'imgdesc' => 'سيپپ.',
+'imgfile' => 'Ùايل',
+'imglegend' => 'شارتتى بەلگٴىلەر: (سيپپ.) — Ùايل سيپاتتاماسىن كٴورسەتۋ/ٴوڭدەۋ.',
+'imghistory' => 'Ùايل تاريحى',
+'revertimg' => 'قايت.',
+'deleteimg' => 'جويۋ',
+'deleteimgcompletely' => 'وسى Ùايلدىڭ بارلىق نۇسقالارىن جوي',
+'imghistlegend' => 'شارتتى بەلگٴىلەر: (اعىم.) = اعىمدىق Ùايل, (جويۋ) = ەسكٴى نۇسقاسىن
+جويۋ, (قاي.) = ەسكٴى نۇسقاسىنا قايتارۋ.
+<br /><i>قوتارىلعان Ùايلدى كٴورۋ ٴۇشٴىن كٴۇن-ايىنا نۇقىڭىز</i>.',
+'imagelinks' => 'سٴىلتەمەلەرٴى',
+'linkstoimage' => 'بۇل Ùايلعا كەلەسٴى بەتتەر سٴىلتەيدٴى:',
+'nolinkstoimage' => 'بۇل Ùايلعا Û•Ø´ بەت سٴىلتەمەيدٴى.',
+'sharedupload' => 'بۇل Ùايل ورتاق ارقاۋىنا قوتارىلعان سوندىقتان باسقا جوبالاردا قولدانۋى مٴۇمكٴىن.',
+'shareduploadwiki' => 'بىلايعى اقپارات ٴۇشٴىن $1 دەگەندٴى قاراڭىز.',
+'shareduploadwiki-linktext' => 'Ùايل سيپاتتاماسى بەتٴى',
+'noimage' => 'مىناداي اتاۋلى Ùايل جوق, $1 مٴۇمكٴىندٴىگٴىڭٴىز بار.',
+'noimage-linktext' => 'وسىنى قوتارۋ',
+'uploadnewversion-linktext' => 'بۇل Ùايلدىڭ جاڭا نۇسقاسىن قوتارۋ',
+'imagelist_date' => 'كٴۇن-ايى',
+'imagelist_name' => 'اتاۋى',
+'imagelist_user' => 'قاتىسۋشى',
+'imagelist_size' => 'مٴولشەرٴى (بايت)',
+'imagelist_description' => 'سيپاتتاماسى',
+'imagelist_search_for' => 'سۋرەتتٴى اتىمەن ٴىزدەۋ:',
+
+# MIME search
+'mimesearch' => 'Ùايلدى MIME تٴۇرٴىمەن ٴىزدەۋ',
+'mimetype' => 'MIME تٴۇرٴى:',
+'download' => 'جٴۇكتەۋ',
+
+# Unwatched pages
+'unwatchedpages' => 'باقىلانباعان بەتتەر',
+
+# List redirects
+'listredirects' => 'ايداتۋ بەت تٴىزٴىمٴى',
+
+# Unused templates
+'unusedtemplates' => 'پايدالانىلماعان ٴۇلگٴىلەر',
+'unusedtemplatestext' => 'بۇل بەت باسقا بەتكە كٴىرٴىcتٴىرٴىلمەگەن ٴۇلگٴى ەسٴىم اياىسىنداعى بارلىق بەتتەردٴى تٴىزٴىمدەيدٴى. ٴۇلگٴىلەردٴى جويۋ الدىنان بۇنىڭ باسقا سٴىلتەمەلەرٴىن تەكسەرٴىپ شىعۋىن ۇمىتپاڭىز',
+'unusedtemplateswlh' => 'باسقا سٴىلتەمەلەر',
+
+# Random redirect
+'randomredirect' => 'كەزدەيسوق ايداتۋ',
+
+# Statistics
+'statistics' => 'جوبا ساناعى',
+'sitestats' => '{{SITENAME}} ساناعى',
+'userstats' => 'قاتىسۋشى ساناعى',
+'sitestatstext' => "مىنداعى دەرەكقوردا بۇلايشا '''$1''' بەت بار.
+بۇنىڭ ٴىشٴىندە «تالقىلاۋ» بەتتەرٴى, {{SITENAME}} جوباسى تۋرالى بەتتەر, كٴىشكەنە «بٴىتەمە»
+بەتتەر, ايداتۋلار, ماعلۇمات بەت دەپ سانالمايتىن, بٴالكٴىم, تاعى دا باسقالار.
+وسىنى ەسەپتەن شىعارعاندا, مىندا ماعلۇماتتى دەپ سانالاتىن
+'''$2''' بەت بار شىعار.
+
+توراپقا '''$8''' Ùايل قوتارىلعان.
+
+وسى ۋيكي جوباسى ورناتىلعاننان بەرٴى بۇلايشا بەتتەر '''$3''' رەت قارالعان,
+جٴانە بەتتەر '''$4''' رەت ٴوڭدەلگەن.
+بۇنىڭ نٴاتيجەسٴىندە ورتا ەسەپپەن بٴىر بەت سايىن '''$5''' ٴوڭدەۋ ٴىستەلٴىنگەن, جٴانە بٴىر ٴوڭدەۋ سايىن '''$6''' رەت قاراۋ كەلگەن.
+
+اعىمدىق [http://meta.wikimedia.org/wiki/Help:Job_queue تاپسىرىم كەزەگٴى] ۇزىندىلىعى: '''$7'''.",
+'userstatstext' => "مىندا '''$1''' تٴىركەلگەن قاتىسۋشى بار, سونىڭ ٴىشٴىندە
+'''$2''' (نەمەسە '''$4 %''') $5 بار.",
+'statistics-mostpopular' => 'ەڭ كٴوپ قارالعان بەتتەر',
+
+'disambiguations' => 'ايرىقتى بەتتەر',
+'disambiguationspage' => '{{ns:template}}:Disambig',
+'disambiguationstext' => 'كەلەسٴى بەتتەر <i>ايرىقتى بەتكە</i> سٴىلتەيدٴى. بۇنىڭ ورنىنا بەلگٴىلٴى تاقىرىپقا سٴىلتەۋٴى قاجەت.<br />بەتكە $1 سٴىلتەگەن جاعدايدا, بەت ايرىقتى دەپ سانالادى.<br />باسقا ەسٴىم اياسىنان نۇسقايتىن سٴىلتەمەلەر مىندا <i>تٴىزٴىمدەلمەيدٴى</i>.',
+
+'doubleredirects' => 'شىنجىرلى ايداتۋلار',
+'doubleredirectstext' => 'ٴاربٴىر جولداعى بٴىرٴىنشٴى مەن ەكٴىنشٴى ايداتۋ سٴىلتەمەلەرٴى بار, سونىمەن بٴىرگە ەكٴىنشٴى ايداتۋ مٴاتٴىننٴىڭ بٴىرٴىنشٴى جولى بار. ٴادەتتە بٴىرٴىنشٴى سٴىلتەمە ايدايتىن «شىن» اقىرعى بەتتٴىڭ اتاۋى بولۋى قاجەت.',
+
+'brokenredirects' => 'ەش بەتكە كەلتٴىرمەيتٴىن ايداتۋلار',
+'brokenredirectstext' => 'كەلەسٴى ايداتۋلار جوق بەتتەرگە سٴىلتەيدٴى:',
+
+# Miscellaneous special pages
+'nbytes' => '$1 بايت',
+'ncategories' => '$1 سانات',
+'nlinks' => '$1 سٴىلتەمە',
+'nmembers' => '$1 بۋىن',
+'nrevisions' => '$1 نۇسقا',
+'nviews' => '$1 رەت قارالعان',
+'lonelypages' => 'ەش بەت سٴىلتەمەگەن بەتتەر',
+'lonelypagestext' => 'كەلەسٴى بەتتەرگە وسى جوباداعى باسقا بەتتەر سٴىلتەمەيدٴى.',
+'uncategorizedpages' => 'ەش ساناتقا كٴىرمەگەن بەتتەر',
+'uncategorizedcategories' => 'ەش ساناتقا كٴىرمەگەن ساناتتار',
+'uncategorizedimages' => 'ەش ساناتقا كٴىرمەگەن سۋرەتتەر',
+'unusedcategories' => 'پايدالانىلماعان ساناتتار',
+'unusedimages' => 'پايدالانىلماعان Ùايلدار',
+'popularpages' => 'ٴايگٴىلٴى بەتتەر',
+'wantedcategories' => 'باستالماعان ساناتتار',
+'wantedpages' => 'باستالماعان بەتتەر',
+'mostlinked' => 'ەڭ كٴوپ سٴىلتەنگەن بەتتەر',
+'mostlinkedcategories' => 'ەڭ كٴوپ سٴىلتەنگەن ساناتتار',
+'mostcategories' => 'ەڭ كٴوپ ساناتتارعا كٴىرگەن بەتتەر',
+'mostimages' => 'ەڭ كٴوپ سٴىلتەنگەن سۋرەتتەر',
+'mostrevisions' => 'ەڭ كٴوپ تٴۇزەتٴىلگەن بەتتەر',
+'allpages' => 'بارلىق بەت تٴىزٴىمٴى',
+'prefixindex' => 'بەت باستاۋ تٴىزٴىمٴى',
+'randompage' => 'كەزدەيسوق بەت',
+'shortpages' => 'ەڭ قىسقا بەتتەر',
+'longpages' => 'ەڭ ٴۇلكەن بەتتەر',
+'deadendpages' => 'ەش بەتكە سٴىلتەمەيتٴىن بەتتەر',
+'deadendpagestext' => 'كەلەسٴى بەتتەر وسى جوباداعى باسقا بەتتەرگە سٴىلتەمەيدٴى.',
+'listusers' => 'بارلىق قاتىسۋشى تٴىزٴىمٴى',
+'specialpages' => 'ارنايى بەتتەر',
+'spheading' => 'بارشانىڭ ارنايى بەتتەرٴى',
+'restrictedpheading' => 'شەكتەۋلٴى ارنايى بەتتەر',
+'recentchangeslinked' => 'قاتىستى تٴۇزەتۋلەر',
+'rclsub' => '(«$1» بەتٴىنەن سٴىلتەنگەن بەتتەرگە)',
+'newpages' => 'ەڭ جاڭا بەتتەر',
+'newpages-username' => 'قاتىسۋشى اتى:',
+'ancientpages' => 'ەڭ ەسكٴى بەتتەر',
+'intl' => 'تٴىلارالىق سٴىلتەمەلەر',
+'move' => 'جىلجىتۋ',
+'movethispage' => 'بەتتٴى جىلجىتۋ',
+'unusedimagestext' => '<p>ەسكەرتۋ: باسقا ۆەب توراپتار Ùايلدىڭ
+URL جايىنا تٴىكەلەي سٴىلتەۋٴى مٴۇمكٴىن. سوندىقتان, بەلسەندٴى پايدالانۋىنا اڭعارماي,
+وسى تٴىزٴىمدە قالۋى مٴۇمكٴىن.</p>',
+'unusedcategoriestext' => 'كەلەسٴى سانات بەتتەر بار بولىپ تۇر, بٴىراق وعان ەشقانداي بەت, نە سانات كٴىرمەيدٴى.',
+'booksources' => 'كٴىتاپ قاينارلارى',
+'categoriespagetext' => 'وسىندا ۋيكيدەگٴى بارلىق ساناتتارىنىڭ تٴىزٴىمٴى بەرٴىلٴىپ تۇر.',
+'data' => 'دەرەكتەر',
+'userrights' => 'قاتىسۋشىلار قۇقىقتارىن مەڭگەرۋ',
+'groups' => 'قاتىسۋشى توپتارى',
+'booksourcetext' => 'تٴومەندە جاڭا جٴانە قولدانعان كٴىتاپتار ساتاتىن
+توراپتارىنىڭ سٴىلتەمەلەرٴى تٴىزٴىمدەلگەن. بۇل توراپتاردا ٴىزدەلگەن كٴىتاپتار
+تۋرالى بىلايعى اقپارات بولۋعا مٴۇمكٴىن.',
+'isbn' => 'ISBN بەلگٴىسٴى',
+'alphaindexline' => '$1 — $2',
+'version' => 'جٴۇيە نۇسقاسى',
+'log' => 'جۋرنالدار',
+'alllogstext' => 'بٴىرٴىككەن قوتارۋ, جويۋ, قورعاۋ, بۇعاتتاۋ جٴانە ٴاكٴىمشٴىلٴىك جۋرنالدارىن كٴورسەتۋ.
+جۋرنال تٴۇرٴىن, قاتىسۋشى اتىن, تيٴىستٴى بەتٴىن تالعاپ, تارىلتىپ قاراۋىڭىزعا بولادى.',
+'logempty' => 'جۋرنالدا سٴايكەس دانالار جوق.',
+
+# Special:Allpages
+'nextpage' => 'كەلەسٴى بەتكە ($1)',
+'allpagesfrom' => 'مىنا بەتتەن باستاپ كٴورسەتۋ:',
+'allarticles' => 'بارلىق بەت تٴىزٴىمٴى',
+'allinnamespace' => 'بارلىق بەت ($1 ەسٴىم اياسى)',
+'allnotinnamespace' => 'بارلىق بەت ($1 ەسٴىم اياسىنان تىس)',
+'allpagesprev' => 'الدىڭعىعا',
+'allpagesnext' => 'كەلەسٴىگە',
+'allpagessubmit' => 'ٴوتۋ',
+'allpagesprefix' => 'مىنادان باستالعان بەتتەردٴى كٴورسەتۋ:',
+'allpagesbadtitle' => 'الىنعان بەت اتاۋى جارامسىز بولعان, نەمەسە تٴىل-ارالىق نە ۋيكي-ارالىق باستاۋى بار بولدى. اتاۋدا قولدانۋعا بولمايتىن نىشاندار بولۋى مٴۇمكٴىن.',
+
+# Special:Listusers
+'listusersfrom' => 'مىنا قاتىسۋشىدان باستاپ كٴورسەتۋ:',
+
+# E-mail user
+'mailnologin' => 'ە-پوشتا جايى جٴىبەرٴىلگەن جوق',
+'mailnologintext' => 'باسقا قاتىسۋشىعا حات جٴىبەرۋ ٴۇشٴىن
+[[{{ns:special}}:Userlogin|كٴىرۋٴىڭٴىز]] قاجەت, جٴانە [[{{ns:special}}:Preferences|باپتاۋىڭىزدا]]
+كۋٴالاندىرىلعان ە-پوشتا جايى بولۋى جٴون.',
+'emailuser' => 'قاتىسۋشىعا حات جازۋ',
+'emailpage' => 'قاتىسۋشىعا حات جٴىبەرۋ',
+'emailpagetext' => 'ەگەر بۇل قاتىسۋشى باپتاۋلارىندا كۋٴالاندىرعان ە-پوشتا
+جايىن ەنگٴىزسە, تٴومەندەگٴى ٴۇلگٴىت ارقىلى بۇعان جالعىز ە-پوشتا حاتىن جٴىبەرۋگە بولادى.
+قاتىسۋشى باپتاۋىڭىزدا ەنگٴىزگەن ە-پوشتا جايىڭىز
+«كٴىمنەن» دەگەن باس جولاعىندا كٴورٴىنەدٴى, سوندىقتان
+حات الۋشىسى تۋرا جاۋاپ بەرە الادى.',
+'usermailererror' => 'Mail نىسانى قاتە قايتاردى:',
+'defemailsubject' => '{{SITENAME}} ە-پوشتاسىنىڭ حاتى',
+'noemailtitle' => 'بۇل ە-پوشتا جايى ەمەس',
+'noemailtext' => 'وسى قاتىسۋشى جارامدى ە-پوشتا جايىن ەنگٴىزبەگەن,
+نەمەسە باسقالاردان حات قابىلداۋىن ٴوشٴىرگەن.',
+'emailfrom' => 'كٴىمنەن',
+'emailto' => 'كٴىمگە',
+'emailsubject' => 'تاقىرىبى',
+'emailmessage' => 'حات',
+'emailsend' => 'جٴىبەرۋ',
+'emailccme' => 'حاتىمدىڭ كٴوشٴىرمەسٴىن ماعان دا جٴىبەر.',
+'emailccsubject' => '$1 دەگەنگە جٴىبەرٴىلگەن حاتىڭىزدىڭ كٴوشٴىرمەسٴى: $2',
+'emailsent' => 'حات جٴىبەرٴىلدٴى',
+'emailsenttext' => 'ە-پوشتا حاتىڭىز جٴىبەرٴىلدٴى.',
+
+# Watchlist
+'watchlist' => 'باقىلاۋىم',
+'watchlistfor' => "('''$1''' باقىلاۋلارى)",
+'nowatchlist' => 'باقىلاۋ تٴىزٴىمٴىڭٴىزدە ەشبٴىر دانا جوق',
+'watchlistanontext' => 'باقىلاۋ تٴىزٴىمٴىڭٴىزدەگٴى دانالاردى قاراۋ, نە ٴوڭدەۋ ٴۇشٴىن $1 قاجەت.',
+'watchlistcount' => "'''باقىلاۋ تٴىزٴىمٴىڭٴىزدە (تالقىلاۋ بەتتەردٴى قوسا) $1 دانا بار.'''",
+'clearwatchlist' => 'باقىلاۋ تٴىزٴىمٴىن تازالاۋ',
+'watchlistcleartext' => 'سولاردى تولىق الاستاتۋعا باتىلسىز با?',
+'watchlistclearbutton' => 'باقىلاۋ تٴىزٴىمٴىن تازالاۋ',
+'watchlistcleardone' => 'باقىلاۋ تٴىزٴىمٴىڭٴىز تازارتىلدى. $1 دانا الاستاتىلدى.',
+'watchnologin' => 'كٴىرمەگەنسٴىز',
+'watchnologintext' => 'باقىلاۋ تٴىزٴىمٴىڭٴىزدٴى ٴوزگەرتۋ ٴۇشٴىن [[{{ns:special}}:Userlogin|كٴىرۋٴىڭٴىز]] جٴون.',
+'addedwatch' => 'باقىلاۋ تٴىزٴىمٴىنە قوسىلدى',
+'addedwatchtext' => "«[[:$1]]» بەتٴى [[{{ns:special}}:Watchlist|باقىلاۋ تٴىزٴىمٴىڭٴىزگە]] قوسىلدى.
+وسى بەتتٴىڭ جٴانە سونىڭ تالقىلاۋ بەتٴىنٴىڭ كەلەشەكتەگٴى ٴوزگەرٴىستەرٴى مىندا تٴىزٴىمدەلەدٴى.
+سوندا بەتتٴىڭ اتاۋى تابۋعا جەڭٴىلدەتٴىپ [[{{ns:special}}:Recentchanges|جۋىقتاعى ٴوزگەرٴىستەر تٴىزٴىمٴىندە]]
+'''جۋان ٴارپٴىمەن''' كٴورسەتٴىلەدٴى.
+
+وسى بەتتٴى سوڭىنان باقىلاۋ تٴىزٴىمنەن الاستاتىڭىز كەلسە «باقىلاماۋ» پاراعىن نۇقىڭىز.",
+'removedwatch' => 'باقىلاۋ تٴىزٴىمٴىڭٴىزدەن الاستاتىلدى',
+'removedwatchtext' => '«[[:$1]]» بەتٴى باقىلاۋ تٴىزٴىمٴىڭٴىزدەن الاستاتىلدى.',
+'watch' => 'باقىلاۋ',
+'watchthispage' => 'بەتتٴى باقىلاۋ',
+'unwatch' => 'باقىلاماۋ',
+'unwatchthispage' => 'باقىلاۋدى توقتاتۋ',
+'notanarticle' => 'ماعلۇمات بەتٴى ەمەس',
+'watchnochange' => 'كٴورسەتٴىلگەن مەرزٴىمدە ەشبٴىر باقىلانعان دانا ٴوڭدەلگەن جوق.',
+'watchdetails' => "* باقىلاۋ تٴىزٴىمٴىندە (تالقىلاۋ بەتتەرٴىسٴىز) '''$1''' بەت بار.
+* [[{{ns:special}}:Watchlist/edit|بٴۇكٴىل تٴىزٴىمدٴى قاراۋ جٴانە ٴوزگەرتۋ]].
+* [[{{ns:special}}:Watchlist/clear|تٴىزٴىمدەگٴى بارلىق دانا الاستاتۋ]].",
+'wlheader-enotif' => '* ەسكەرتۋ حات جٴىبەرۋٴى ەندٴىرٴىلگەن.',
+'wlheader-showupdated' => "* سوڭعى كٴىرگەنٴىمنەن بەرٴى تٴۇزەتٴىلگەن بەتتەردٴى '''جۋان''' مٴاتٴىنمەن كٴورسەت",
+'watchmethod-recent' => 'باقىلاۋلى بەتتەردٴىڭ جۋىقتاعى ٴوزگەرٴىستەرٴىن تەكسەرۋ',
+'watchmethod-list' => 'جۋىقتاعى ٴوزگەرٴىستەردە باقىلاۋلى بەتتەردٴى تەكسەرۋ',
+'removechecked' => 'بەلگٴىلەنگەندٴى باقىلاۋ تٴىزٴىمٴىنەن الاستاتۋ',
+'watchlistcontains' => 'باقىلاۋ تٴىزٴىمٴىڭٴىزدە $1 بەت بار.',
+'watcheditlist' => "وسىندا ٴالٴىپپەم سۇرىپتالعان باقىلانعان ماعلۇمات بەتتەرٴىڭٴىز تٴىزٴىمدەلٴىنگەن.
+بەتتەردٴى الاستاتۋ ٴۇشٴىن ونىڭ قاسىنداعى قاباشاقتاردى بەلگٴىلەپ, تٴومەندەگٴى ''بەلگٴىلەنگەندٴى الاستات'' تٴۇيمەسٴىن نۇقىڭىز
+(ماعلۇمات بەتٴىن جويعاندا تالقىلاۋ بەتٴى دە بٴىرگە جويىلادى).",
+'removingchecked' => 'سۇرانعان دانالاردى باقىلاۋ تٴىزٴىمنەن الاستاۋى…',
+'couldntremove' => '«$1» دەگەن دانا الاستاتىلمادى…',
+'iteminvalidname' => '«$1» داناسىنىڭ جارامسىز اتاۋىنان شاتاق تۋدى…',
+'wlnote' => 'تٴومەندە سوڭعى <b>$2</b> ساعاتتاعى, سوڭعى $1 ٴوزگەرٴىس كٴورسەتٴىلگەن.',
+'wlshowlast' => 'سوڭعى $1 ساعاتتاعى, $2 كٴۇندەگٴى, $3 بولعان ٴوزگەرٴىستٴى كٴورسەتۋ',
+'wlsaved' => 'بۇل باقىلۋ تٴىزٴىمٴىڭٴىزدٴىڭ ساقتالعان نۇسقاسى.',
+'wlhideshowown' => 'تٴۇزەتۋٴىمدٴى $1',
+'wlhideshowbots' => 'بوتتاردى $1',
+'wldone' => 'ٴىس بٴىتتٴى.',
+
+'enotif_mailer' => '{{SITENAME}} ەسكەرتۋ حات جٴىبەرۋ قىزمەتٴى',
+'enotif_reset' => 'بارلىق بەت كارالدٴى دەپ بەلگٴىلە',
+'enotif_newpagetext' => 'مىناۋ جاڭا بەت.',
+'changed' => 'ٴوزگەرتتٴى',
+'created' => 'جاسادى',
+'enotif_subject' => '{{SITENAME}} جوباسىندا $PAGEEDITOR $PAGETITLE اتاۋلى بەتتٴى $CHANGEDORCREATED',
+'enotif_lastvisited' => 'سوڭعى كٴىرۋٴىڭٴىزدەن بەرٴى بولعان ٴوزگەرٴىستەر ٴۇشٴىن $1 دەگەندٴى قاراڭىز.',
+'enotif_body' => 'قۇرمەتتٴى $WATCHINGUSERNAME,
+
+{{SITENAME}} جوباسىدا $PAGEEDITDATE كەزٴىندە $PAGEEDITOR $PAGETITLE اتاۋلى بەتتٴى $CHANGEDORCREATED, اعىمدىق نۇسقاسىن $PAGETITLE_URL جايىنان قاراڭىز.
+
+$NEWPAGE
+
+ٴوڭدەۋشٴى سيپاتتاماسى: $PAGESUMMARY $PAGEMINOREDIT
+
+ٴوڭدەۋشٴىمەن قاتىناسۋ:
+ە-پوشتا: $PAGEEDITOR_EMAIL
+ۋيكي: $PAGEEDITOR_WIKI
+
+بىلايعى ٴوزگەرٴىستەر بولعاندا دا سٴىز وسى بەتكە بارعانشا دەيٴىن ەشقانداي باسقا ەسكەرتۋ حاتتار جٴىبەرٴىلمەيدٴى. سونىمەن قاتار باقىلاۋ تٴىزٴىمٴىڭٴىزدەگٴى بەت ەسكەرتپەلٴىك بەلگٴىسٴىن ٴادەپكە كٴۇيٴىنە كەلتٴىرٴىڭٴىز.
+
+ سٴىزدٴىڭ دوستى {{SITENAME}} ەسكەرتۋ قىزمەتٴى
+
+----
+باقىلاۋ تٴىزٴىمٴىڭٴىزدٴى باپتاۋ ٴۇشٴىن, مىندا بارىڭىز
+{{fullurl:{{ns:special}}:Watchlist/edit}}
+
+سىن-پٴىكٴىر بەرۋ جٴانە بىلايعى جٴاردەم الۋ ٴۇشٴىن:
+{{fullurl:{{ns:help}}:مازمۇنى}}',
+
+# Delete/protect/revert
+'deletepage' => 'بەتتٴى جويۋ',
+'confirm' => 'راستاۋ',
+'excontent' => 'بولعان ماعلۇماتى: «$1»',
+'excontentauthor' => 'بولعان ماعلۇماتى: «$1» (تەك «[[Special:Contributions/$2|$2]]» ٴۇلەسٴى)',
+'exbeforeblank' => 'تازارتۋ الدىنداعى بولعان ماعلۇماتى: «$1»',
+'exblank' => 'بەت بوستى بولدى',
+'confirmdelete' => 'جويۋدى راستاۋ',
+'deletesub' => '(«$1» جويۋى)',
+'historywarning' => 'نازار سالىڭىز: جويۋعا ارنالعان بەتتە ٴوز تاريحى بار:',
+'confirmdeletetext' => 'بەتتٴى نەمەسە سۋرەتتٴى بارلىق تاريحىمەن
+بٴىرگە دەرەكقوردان ٴاردايىم جويىعىڭىز كەلەتٴىن سيياقتى.
+بۇنى جويۋدىڭ زاردابىن تٴۇسٴىنٴىپ شىن نيەتتەنگەنٴىڭٴىزدٴى, جٴانە
+[[{{ns:project}}:ساياسات]]قا لايىقتى دەپ
+سەنگەنٴىڭٴىزدٴى راستاڭىز.',
+'actioncomplete' => 'ٴارەكەت بٴىتتٴى',
+'deletedtext' => '«$1» جويىلدى.
+جۋىقتاعى جويۋلار تۋرالى جازبالارىن $2 دەگەننەن قاراڭىز.',
+'deletedarticle' => '«[[$1]]» بەتٴىن جويدى',
+'dellogpage' => 'جويۋ_جۋرنالى',
+'dellogpagetext' => 'تٴومەندە جۋىقتاعى جويۋلاردىڭ تٴىزٴىمٴى بەرٴىلگەن.',
+'deletionlog' => 'جويۋ جۋرنالى',
+'reverted' => 'ەرتەرەك نۇسقاسىنا قايتارىلعان',
+'deletecomment' => 'جويۋدىڭ سەبەبٴى',
+'imagereverted' => 'ەرتەرەك نۇسقاسىنا قايتارۋ سٴاتتٴى ٴوتتٴى.',
+'rollback' => 'تٴۇزەتۋلەردٴى قايتارۋ',
+'rollback_short' => 'قايتارۋ',
+'rollbacklink' => 'قايتارۋ',
+'rollbackfailed' => 'قايتارۋ سٴاتسٴىز اياقتالدى',
+'cantrollback' => 'تٴۇزەتۋ قايتارىلمايدى. بۇل بەتتٴىڭ سوڭعى ٴۇلەسكەرٴى تەك باستاۋىش اۋتورى.',
+'alreadyrolled' => '[[{{ns:user}}:$2|$2]] ([[{{ns:user_talk}}:$2|تالقىلاۋى]]) دەگەندٴى جاساعان [[:$1]]
+بەتٴىنٴىڭ سوڭعى ٴوڭدەۋٴىنەن قايتارۋ ٴوتپەدٴى; كەيبٴىرەۋ وسى قازٴىر بەتتٴى ٴوڭدەپ نە قايتارىپ جاتىر تٴۇگە.
+
+سوڭعى ٴوڭدەۋدٴى [[{{ns:user}}:$3|$3]] ([[{{ns:user_talk}}:$3|تالقىلاۋى]]) دەگەندٴى جاساعان.',
+'editcomment' => 'تٴۇزەتۋدٴىڭ بولعان مٴاندەمەسٴى: "<i>$1</i>".', # only shown if there is an edit comment
+'revertpage' => '[[{{ns:special}}:Contributions/$2|$2]] ([[{{ns:user_talk}}:$2|تالقىلاۋى]]) تٴۇزەتۋٴىنەن [[{{ns:user}}:$1|$1]] سوڭعى نۇسقاسىنا قايتاردى',
+'sessionfailure' => 'كٴىرۋ سەسسيياسىندا شاتاق بولعان سيياقتى;
+سەسسيياعا شابۋىلداۋداردان قورعانۋ ٴۇشٴىن, وسى ٴارەكەت توقتاتىلدى.
+«ارتقا» تٴۇيمەسٴىن باسىڭىز, جٴانە بەتتٴى كەرٴى جٴۇكتەڭٴىز, سوسىن قايتالاپ كٴورٴىڭٴىز.',
+'protectlogpage' => 'قورعاۋ_جۋرنالى',
+'protectlogtext' => 'تٴومەندە بەتتەردٴىڭ قورعاۋ/قورعاماۋ تٴىزٴىمٴى بەرٴىلگەن.',
+'protectedarticle' => '«$1» قورعالدى',
+'unprotectedarticle' => '«[[$1]]» قورعالمادى',
+'protectsub' => '(«$1» قورعاۋدا)',
+'confirmprotecttext' => 'وسى بەتتٴى راسىندا دا قورعاۋ قاجەت پە?',
+'confirmprotect' => 'قورعاۋدى راستاۋ',
+'protectmoveonly' => 'تەك جىلجىتۋدان قورعاۋ',
+'protectcomment' => 'قورعاۋ سەبەبٴى',
+'unprotectsub' => '(«$1» قورعاماۋدا)',
+'confirmunprotecttext' => 'وسى بەتتٴى راستان قورعاماۋ قاجەت پە?',
+'confirmunprotect' => 'قورعاماۋدى راستاۋ',
+'unprotectcomment' => 'قورعاماۋ سەبەبٴى',
+'protect-unchain' => 'جىلجىتۋعا رۇقسات بەرۋ',
+'protect-text' => '<strong>$1</strong> بەتٴىنٴىڭ قورعاۋ دەڭگەيٴىن قاراي جٴانە ٴوزگەرتە الاسىز.',
+'protect-viewtext' => 'تٴىركەلگٴىڭٴىز بەت قورعانىسى دەنگەيلەرٴىن ٴوزگەرتۋگە رۇقسات بەرمەيدٴى.
+مىنا <strong>$1</strong> بەتتٴىڭ اعىمدىق باپتاۋلارى:',
+'protect-default' => '(ٴادەپكٴى)',
+'protect-level-autoconfirmed' => 'تٴىركەلگٴىسٴىز پايدالانۋشىلارعا تيىم',
+'protect-level-sysop' => 'تەك ٴاكٴىمشٴىلەرگە رۇقسات',
+
+# Restrictions (nouns)
+'restriction-edit' => 'ٴوڭدەۋ',
+'restriction-move' => 'جىلجىتۋ',
+
+# Undelete
+'undelete' => 'جويىلعان بەتتەردٴى قاراۋ',
+'undeletepage' => 'جويىلعان بەتتەردٴى قاراۋ جٴانە قايتارۋ',
+'viewdeletedpage' => 'جويىلعان بەتتەردٴى قاراۋ',
+'undeletepagetext' => 'كەلەسٴى بەتتەر جويىلدى دەپ بەلگٴىلەنگەن, بٴىراق ماعلۇماتى مۇراعاتتا جاتقان,
+سوندىقتان كەرٴى قايتارۋعا ٴازٴىر. مۇراعات مەرزٴىم بويىنشا تازالانىپ تۇرۋى مٴۇمكٴىن.',
+'undeleteextrahelp' => "بٴۇكٴىل بەتتٴى قايتارۋ ٴۇشٴىن, بارلىق قاباشاقتاردى بوس قالدىرىپ
+'''''قايتار!''''' تٴۇيمەسٴىن نۇقىڭىز. بٴولەكشە قايتارۋ ورىنداۋ ٴۇشٴىن, قايتارايىن دەگەن نۇسقالارىنا سٴايكەس
+قاباشاقتارىن بەلگٴىلەڭٴىز دە, جٴانە '''''قايتار!''''' تٴۇيمەسٴىن نۇقىڭىز. '''''تاستا''''' تٴۇيمەسٴىن
+نۇقىعاندا مٴاندەمە اۋماعى مەن بارلىق قاباشاقتار تازالانادى.",
+'undeletearticle' => 'جويىلعان بەتتٴى قايتارۋ',
+'undeleterevisions' => '$1 نۇسقا مۇراعاتتالعان',
+'undeletehistory' => 'ەگەر بەت ماعلۇماتىن قايتارساڭىز,تاريحىندا بارلىق نۇسقالار دا
+قايتارىلادى. ەگەر جويۋدان سوڭ دٴال سولاي اتاۋىمەن جاڭا بەت جاسالسا, قايتارىلعان نۇسقالار
+تاريحتىڭ ەڭ ادىندا كٴورسەتٴىلەدٴى, جٴانە كٴورسەتٴىلٴىپ تۇرعان بەتتٴىڭ اعىمدىق نۇسقاسى
+ٴوزدٴىك تٴۇردە الماستىرىلمايدى.',
+'undeletehistorynoadmin' => 'بۇل بەت جويىلعان. جويۋ سەبەبٴى الدىنداعى ٴوڭدەگەن قاتىسۋشىلار
+ەگجەي-تەگجەيلەرٴىمەن بٴىرگە تٴومەندەگٴى سيپاتتاماسىندا كٴورسەتٴىلگەن.
+وسى جويىلعان نۇسقالاردىڭ مٴاتٴىنٴى تەك ٴاكٴىمشٴىلەرگە قاتىناۋلى.',
+'undeleterevision' => '$1 كەزٴىندەگٴى جويىلعان نۇسقاسىن',
+'undeleterevision-missing' => 'جارامسىز نە جوعالعان نۇسقا. سٴىلتەمەڭٴىز جارامسىز بولۋى مٴۇمكٴىن, نە
+نۇسقا قايتارىلعان تٴۇگە نەمەسە مۇراعاتتان الاستاتىلعان.',
+'undeletebtn' => 'قايتار!',
+'undeletereset' => 'تاستا',
+'undeletecomment' => 'مٴاندەمەسٴى:',
+'undeletedarticle' => '«[[$1]]» قايتاردى',
+'undeletedrevisions' => '$1 نۇسقاسى قايتارىلعان',
+'undeletedrevisions-files' => '$1 نۇسقا جٴانە $2 Ùايل قايتارىلدى',
+'undeletedfiles' => '$1 Ùايل قايتارىلدى',
+'cannotundelete' => 'قايتارۋ سٴاتسٴىز بٴىتتٴى; تاعى بٴىرەۋ سٴىزدەن بۇرىن سول بەتتٴى قايتارعان بولار.',
+'undeletedpage' => "<big>'''$1 قايتارىلدى'''</big>
+
+جۋىقتاعى جويۋ مەن قايتارۋ جٴونٴىندە [[{{ns:special}}:Log/delete|جويۋ جۋرنالىن]] قاراڭىز.",
+
+# Namespace form on various pages
+'namespace' => 'ەسٴىم اياسى:',
+'invert' => 'تالعاۋدى كەرٴىلەۋ',
+
+# Contributions
+'contributions' => 'قاتىسۋشى ٴۇلەسٴى',
+'mycontris' => 'ٴۇلەسٴىم',
+'contribsub' => '$1 ٴۇلەسٴى',
+'nocontribs' => 'وسى ٴىزدەۋ شارتىنا سٴايكەس ٴوزگەرٴىستەر تابىلعان جوق.',
+'ucnote' => 'تٴومەندە وسى قاتىسۋشىنىڭ سوڭعى <b>$2</b> كٴۇندەگٴى, سوڭعى <b>$1</b> ٴوزگەرٴىسٴى كٴورسەتلەدٴى.',
+'uclinks' => 'سوڭعى $2 كٴۇندەگٴى, سوڭعى $1 ٴوزگەرٴىسٴىن قاراۋ.',
+'uctop' => ' (ٴۇستٴى)',
+'newbies' => 'جاڭا قاتىسۋشىلار',
+
+'sp-newimages-showfrom' => '$1 كەزٴىنەن بەرٴى — جاڭا سۋرەتتەردٴى كٴورسەت',
+
+'sp-contributions-newest' => 'ەڭ جاڭاسىنا',
+'sp-contributions-oldest' => 'ەڭ ەسكٴىسٴىنە',
+'sp-contributions-newer' => 'جاڭالاۋ $1',
+'sp-contributions-older' => 'ەسكٴىلەۋ $1',
+'sp-contributions-newbies-sub' => 'جاڭا قاتىسۋشىلارعا',
+
+# What links here
+'whatlinkshere' => 'سٴىلتەگەن بەتتەر',
+'notargettitle' => 'اقىرعى اتاۋ جوق',
+'notargettext' => 'وسى ٴارەكەت ورىندالاتىن نىسانا بەت,
+نە قاتىسۋشى كٴورسەتٴىلمەگەن.',
+'linklistsub' => '(سٴىلتەمەلەر تٴىزٴىمٴى)',
+'linkshere' => "'''[[:$1]]''' دەگەنگە مىنا بەتتەر سٴىلتەيدٴى:",
+'nolinkshere' => "'''[[:$1]]''' دەگەنگە ەش بەت سٴىلتەمەيدٴى.",
+'isredirect' => 'ايداتۋ بەتٴى',
+'istemplate' => 'كٴىرٴىكتٴىرۋ',
+
+# Block/unblock
+'blockip' => 'پايدالانۋشىنى بۇعاتتاۋ',
+'blockiptext' => 'تٴومەندەگٴى ٴۇلگٴىت پايدالانۋشىنىڭ جازۋ رۇقساتىن
+بەلگٴىلٴى IP جايىمەن نە اتاۋىمەن بۇعاتتاۋ ٴۇشٴىن قولدانىلادى.
+بۇنى تەك بۇزاقىلىققا كەدەرگٴى ٴىستەۋ ٴۇشٴىن جٴانە دە
+[[{{ns:project}}:ساياسات|ساياسات]] بويىنشا اتقارۋىڭىز جٴون.
+تٴومەندە تيٴىستٴى سەبەبٴىن تولتىرىپ كٴورسەتٴىڭٴىز (مىسالى, دٴايەككە بۇزاقىلىقپەن
+ٴوزگەرتكەن بەتتەردٴى كەلتٴىرٴىپ).',
+'ipaddress' => 'IP جاي',
+'ipadressorusername' => 'IP جاي نە قاتىسۋشى اتى',
+'ipbexpiry' => 'بٴىتەتٴىن مەرزٴىمٴى',
+'ipbreason' => 'سەبەبٴى',
+'ipbanononly' => 'تەك تٴىركەلگٴىسٴىزدٴى بۇعاتتاۋ',
+'ipbcreateaccount' => 'تٴىركەلگٴى جاساۋىن كەدەرگٴىلەۋ',
+'ipbenableautoblock' => 'بۇل قاتىسۋشىنىڭ قولدانعان سوڭعى IP جايىن, جٴانە ٴارقايسى كەيٴىن تٴۇزەتۋ ٴىستەۋگە ٴۇمٴىتەلٴىگەن جايلارىن ٴوزدٴىك تٴۇردە بۇعاتتاۋ',
+'ipbsubmit' => 'پايدالانۋشىنى بۇعاتتاۋ',
+'ipbother' => 'باسقا مەرزٴىم',
+'ipboptions' => '2 ساعات:2 hours,1 كٴۇن:1 day,3 كٴۇن:3 days,1 اپتا:1 week,2 اپتا:2 weeks,1 اي:1 month,3 اي:3 months,6 اي:6 months,1 جىل:1 year,مٴانگٴى:infinite',
+'ipbotheroption' => 'باسقا',
+'badipaddress' => 'جارامسىز IP جاي',
+'blockipsuccesssub' => 'بۇعاتتاۋ سٴاتتٴى ٴوتتٴى',
+'blockipsuccesstext' => '[[{{ns:special}}:Contributions/$1|$1]] دەگەن بۇعاتتالعان.
+<br />بۇعاتتاۋلاردى [[{{ns:special}}:Ipblocklist|IP بۇعاتتاۋ تٴىزٴىمٴىندە]] قاراپ شىعىڭىز.',
+'unblockip' => 'پايدالانۋشىنى بۇعاتتاماۋ',
+'unblockiptext' => 'تٴومەندەگٴى ٴۇلگٴىت بەلگٴىلٴى IP جايىمەن نە اتاۋىمەن
+بۇرىن بۇعاتتالعان پايدالانۋشىنىڭ جازۋ رۇقساتىن قايتارۋ ٴۇشٴىن قولدانىلادى.',
+'ipusubmit' => 'وسى جايدى بۇعاتتاماۋ',
+'unblocked' => '[[{{ns:user}}:$1|$1]] بۇعاتتاۋى ٴوشٴىرٴىلدٴى',
+'ipblocklist' => 'بۇعاتتالعان پايدالانۋشى / IP- جاي تٴىزٴىمٴى',
+'blocklistline' => '$1, $2 «$3» دەگەندٴى بۇعاتتادى ($4)',
+'infiniteblock' => 'مٴانگٴى',
+'expiringblock' => 'بٴىتۋٴى: $1',
+'anononlyblock' => 'تەك تٴىركەلگٴىسٴىزدٴى',
+'noautoblockblock' => 'ٴوزدٴىك بۇعاتتاۋ ٴوشٴىرٴىلەنگەن',
+'createaccountblock' => 'تٴىركەلگٴى جاساۋى بۇعاتتالعان',
+'ipblocklistempty' => 'بۇعاتتاۋ تٴىزٴىمٴى بوس.',
+'blocklink' => 'بۇعاتتاۋ',
+'unblocklink' => 'بۇعاتتاماۋ',
+'contribslink' => 'ٴۇلەسٴى',
+'autoblocker' => "IP جايىڭىزدى جۋىقتا «[[{{ns:user}}:1|$1]]» پايدالانعان, سوندىقتان ٴوزدٴىك تٴۇردە بۇعاتتالعان. $1 بۇعاتتاۋ سەبەبٴى: «'''$2'''».",
+'blocklogpage' => 'بۇعاتتاۋ_جۋرنالى',
+'blocklogentry' => '«[[$1]]» بۇعاتتادى, بٴىتەتٴىن مەرزٴىمٴى: $2',
+'blocklogtext' => 'بۇل پايدالانۋشىلاردى بۇعاتتاۋ/بۇعاتتاماۋ ٴارەكەتتەرٴىنٴىڭ جۋرنالى. ٴوزدٴىك تٴۇردە
+بۇعاتتالعان IP جايلار وسىندا تٴىزٴىمدەلگەمەگەن. اعىمداعى بەلسەندٴى بۇعاتتاۋلارىن
+[[{{ns:special}}:Ipblocklist|IP بۇعاتتاۋ تٴىزٴىمٴىنەن]] قاراۋعا بولادى.',
+'unblocklogentry' => '«$1» بۇعاتتاۋىن ٴوشٴىردٴى',
+'range_block_disabled' => 'اۋقىم بۇعاتتاۋىن جاساۋ ٴاكٴىمشٴىلٴىك مٴۇمكٴىندٴىگٴى ٴوشٴىرٴىلگەن.',
+'ipb_expiry_invalid' => 'بٴىتەتٴىن ۋاقىتى جارامسىز.',
+'ipb_already_blocked' => '«$1» بۇعاتتالعان تٴۇگە',
+'ip_range_invalid' => 'IP جاي اۋقىمى جارامسىز.',
+'proxyblocker' => 'پروكسي سەرۆەرلەردٴى بۇعاتتاۋىش',
+'ipb_cant_unblock' => 'قاتە: IP $1 بۇعاتتاۋى تابىلمادى. ونىڭ بۇعاتتاۋى ٴوشٴىرلگەن سيياقتى.',
+'proxyblockreason' => 'IP جايىڭىز اشىق پروكسي سەرۆەرگە جاتاتىندىقتان بۇعاتتالعان. ينتەرنەت قىزمەتٴىن جابدىقتاۋشىڭىزبەن, نە تەحنيكالىق مەدەۋ قىزمەتٴىمەن قاتىناسىڭىز, جٴانە ولارعا وسى وتە كٴۇردەلٴى قاۋىپسٴىزدٴىك شاتاق تۋرالى اقپارات بەرٴىڭٴىز.',
+'proxyblocksuccess' => 'بٴىتتٴى.',
+'sorbs' => 'DNSBL قارا تٴىزٴىمٴى',
+'sorbsreason' => 'سٴىزدٴىڭ IP جايىڭىز وسى توراپتا قولدانىلعان DNSBL قارا تٴىزٴىمٴىندەگٴى اشىق پروكسي-سەرۆەر دەپ تابىلادى.',
+'sorbs_create_account_reason' => 'سٴىزدٴىڭ IP جايىڭىز وسى توراپتا قولدانىلعان DNSBL قارا تٴىزٴىمٴىندەگٴى اشىق پروكسي-سەرۆەر دەپ تابىلادى. تٴىركەلگٴى جاساي المايسىز.',
+
+# Developer tools
+'lockdb' => 'دەرەكقوردى قۇلىپتاۋ',
+'unlockdb' => 'دەرەكقوردى قۇلىپتاماۋ',
+'lockdbtext' => 'دەرەكقوردىن قۇلىپتالۋى بارلىق پايدالانۋشىنىڭ
+بەت ٴوڭدەۋ, باپتاۋىن قالاۋ, باقىلاۋ تٴىزٴىمٴىن, تاعى باسقا
+دەرەكقوردى ٴوزگەرتەتٴىن مٴۇمكٴىندٴىكتەرٴىن توقتاتا تۇرادى.
+وسى ماقساتىڭىزدى, جٴانە جٴوندەۋٴىڭٴىز بٴىتكەندە
+دەرەكقوردى اشاتىڭىزدى راستاڭىز.',
+'unlockdbtext' => 'دەرەكقودىن اشىلۋى بارلىق پايدالانۋشىنىڭ بەت ٴوڭدەۋ,
+باپتاۋىن قالاۋ, باقىلاۋ تٴىزٴىمٴىن, تاعى باسقا دەرەكقوردى ٴوزگەرتەتٴىن
+مٴۇمكٴىندٴىكتەرٴىن قايتا اشادى.
+وسى ماقساتىڭىزدى راستاڭىز.',
+'lockconfirm' => 'يٴا, مەن دەرەكقوردى راستان قۇلىپتايمىن.',
+'unlockconfirm' => 'يٴا, مەن دەرەكقوردى راستان قۇلىپتامايمىن.',
+'lockbtn' => 'دەرەكقوردى قۇلىپتا',
+'unlockbtn' => 'دەرەكقوردى قۇلىپتاما',
+'locknoconfirm' => 'راستاۋ بەلگٴىسٴىن قويماپسىز.',
+'lockdbsuccesssub' => 'دەرەكقوردى قۇلىپتاۋ سٴاتتٴى ٴوتتٴى',
+'unlockdbsuccesssub' => 'قۇلىپتالعان دەرەكقور اشىلدى',
+'lockdbsuccesstext' => 'دەرەكقور قۇلىپتالدى.
+<br />جٴوندەۋٴىڭٴىز بٴىتكەننەن كەيٴىن [[{{ns:special}}:Unlockdb|قۇلىپتاۋىن ٴوشٴىرۋگە]] ۇمىتپاڭىز.',
+'unlockdbsuccesstext' => 'قۇلىپتالعان دەرەكقور سٴاتتٴى اشىلدى.',
+'lockfilenotwritable' => 'دەرەكقور قۇلىپتاۋ Ùايلى جازىلمايدى. دەرەكقوردى قۇلىپتاۋ Ù†Û• اشۋ ٴۇشٴىن, ۆەب-سەرۆەر Ùايلعا جازۋ رۇقساتى بولۋ قاجەت.',
+'databasenotlocked' => 'دەرەكقور قۇلىپتالعان جوق.',
+
+# Make sysop
+'makesysoptitle' => 'قاتىسۋشىنى ٴاكٴىمشٴى قىلۋ',
+'makesysoptext' => 'بۇل ٴۇلگٴىتتٴى قاراپايىم قاتىسۋشىنى ٴاكٴىمشٴى قىلۋ ٴۇشٴىن تٴورەشٴىلەر قولدانادى.
+جولاققا قاتىسۋشى اتىن ەنگٴىزٴىڭٴىز دە, جٴانە بۇل قاتىسۋشىنى ٴاكٴىمشٴى قىلۋ ٴۇشٴىن, تٴۇيمەنٴى باسىڭىز.',
+'makesysopname' => 'قاتىسۋشى اتى:',
+'makesysopsubmit' => 'بۇل قاتىسۋشىنى ٴاكٴىمشٴى قىل',
+'makesysopok' => '<b>«$1» دەگەن قاتىسۋشى ەندٴى ٴاكٴىمشٴى بوپ تاعايىندالدى</b>',
+'makesysopfail' => '<b>«$1» دەگەن قاتىسۋشى ٴاكٴىمشٴى بوپ تاعايىندالمادى. (اتىن دۇرىس ەنگٴىزدٴىڭٴىز بە?)</b>',
+'setbureaucratflag' => 'قاتىسۋشىنى تٴورەشٴى قىلۋ',
+'rightslog' => 'قاتىسۋشى_قۇقىقتارى_جۋرنالى',
+'rightslogtext' => 'بۇل پايدالانۋشى قۇقىقتارىن ٴوزگەرتۋ جۋرنالى.',
+'rightslogentry' => ' $1 توپ مٴۇشەلگٴىن $2 دەگەننەن $3 دەگەنگە ٴوزگەرتتٴى',
+'rights' => 'قۇقىقتارى:',
+'set_user_rights' => 'قاتىسۋشى قۇقىقتارىن تاعايىنداۋ',
+'user_rights_set' => '<b>«$1» دەگەن قاتىسۋشىنىڭ قۇقىقتارى جاڭارتىلدى</b>',
+'set_rights_fail' => '<b>«$1» دەگەن قاتىسۋشىنىڭ قۇقىقتارى تاعايىندالمادى. (اتىن دۇرىس ەنگٴىزدٴىڭٴىز بە?)</b>',
+'makesysop' => 'قاتىسۋشىنى ٴاكٴىمشٴى قىلۋ',
+'already_sysop' => 'بۇل قاتىسۋشى ٴاكٴىمشٴى بوپتى تٴۇگە',
+'already_bureaucrat' => 'بۇل قاتىسۋشى تورەشٴى بوپتى تٴۇگە',
+'rightsnone' => '(ەشقانداي)',
+
+# Move page
+'movepage' => 'بەتتٴى جىلجىتۋ',
+'movepagetext' => "تٴومەندەگٴى ٴۇلگٴىتتٴى قولدانىپ بەتتەردٴى قايتا اتايدى,
+بارلىق تاريحىن جاڭا اتاۋعا جىلجىتادى.
+بۇرىنعى بەت اتاۋى جاڭا اتاۋعا ايداتاتىن بەت بولادى.
+ەسكٴى اتاۋىنا سٴىلتەيتٴىن سٴىلتەمەلەر ٴوزگەرتٴىلمەيدٴى; جىلجىتۋدان سوڭ
+شىنجىرلى ايداتۋلار بار-جوعىن تەكسەرٴىڭٴىز.
+سٴىلتەمەلەر بۇرىنعى جولداۋىمەن بىلايعى ٴوتۋٴىن تەكسەرۋٴىنە
+سٴىز مٴىندەتتٴى بولاسىز.
+
+ەسكەرٴىڭٴىز, ەگەر جىلجىتىلاتىن اتاۋدا بەت بولسا, سول ەسكٴى بەتكە ايداتۋ
+بولعانشا جٴانە تاريحى بولسا, بەت '''جىلجىتىلمايدى'''.
+وسىنىڭ ماعىناسى: ەگەر بەتتٴى قاتەلٴىك پەن قايتا اتالسا,
+بۇرىنعى اتاۋىنا قايتا اتاۋعا بولادى,
+بٴىراق بار بەتتٴىڭ ٴۇستٴىنە جازۋعا بولمايدى.
+
+<b>نازار سالىڭىز!</b>
+بۇل دٴارٴىپتٴى بەتكە قاتاڭ جٴانە كەنەت ٴوزگەرٴىس جاساۋعا مٴۇمكٴىن;
+ٴارەكەتتٴىڭ الدىنان وسىنىڭ زارداپتارىن تٴۇسٴىنگەنٴىڭٴىزگە باتىل
+بولىڭىز.",
+'movepagetalktext' => "كەلەسٴى سەبەپتەر '''بولعانشا''' دەيٴىن, تالقىلاۋ بەتٴى ٴوزدٴىك تٴۇردە بٴىرگە جىلجىتىلادى:
+* بوس ەمەس تالقىلاۋ بەتٴى جاڭا اتاۋدا بولعاندا, نەمەسە
+* تٴومەندەگٴى قابىشاقتا بەلگٴىنٴى الاستاتقاندا.
+
+وسى ورايدا, قالاۋىڭىز بولسا, بەتتٴى قولدان جىلجىتا نە قوسا الاسىز.",
+'movearticle' => 'بەتتٴى جىلجىتۋ',
+'movenologin' => 'جٴۇيەگە كٴىرمەگەنسٴىز',
+'movenologintext' => 'بەتتٴى جىلجىتۋ ٴۇشٴىن تٴىركەلگەن بولۋىڭىز جٴانە
+ [[{{ns:special}}:Userlogin|كٴىرۋٴىڭٴىز]] قاجەت.',
+'newtitle' => 'جاڭا اتاۋعا',
+'movepagebtn' => 'بەتتٴى جىلجىت',
+'pagemovedsub' => 'جىلجىتۋ سٴاتتٴى اياقتالدى',
+'pagemovedtext' => '«[[$1]]» بەتٴى «[[$2]]» بەتٴىنە جىلجىتىلدى.',
+'articleexists' => 'بىلاي اتاۋلى بەت بار بولدى, نە تاڭداعان
+اتاۋىڭىز جارامدى ەمەس.
+باسقا اتاۋ تانداڭىز',
+'talkexists' => "'''بەتتٴىڭ ٴوزٴى سٴاتتٴى جىلجىتىلدى, بٴىراق تالقىلاۋ بەتٴى بٴىرگە جىلجىتىلمادى, ونىڭ سەبەبٴى جاڭا اتاۋدىڭ تالقىلاۋ بەتٴى بار تٴۇگە. بۇنى قولمەن قوسىڭىز.'''",
+'movedto' => 'مىناعان جىلجىتىلدى:',
+'movetalk' => 'قاتىستى تالقىلاۋ بەتٴىمەن بٴىرگە جىلجىتۋ',
+'talkpagemoved' => 'قاتىستى تالقىلاۋ بەتٴى دە جىلجىتىلدى.',
+'talkpagenotmoved' => 'قاتىستى تالقىلاۋ بەتٴى <strong>جىلجىتىلمادى</strong>.',
+'1movedto2' => '«[[$1]]» بەتٴىندە ايداتۋ قالدىرىپ «[[$2]]» بەتٴىنە جىلجىتتى',
+'1movedto2_redir' => '«[[$1]]» بەتٴىن «[[$2]]» ايداتۋ بەتٴىنٴىڭ ٴۇستٴىنە جىلجىتتى',
+'movelogpage' => 'جىلجىتۋ جۋرنالى',
+'movelogpagetext' => 'تٴومەندە جىلجىتىلعان بەتتەردٴىڭ تٴىزٴىمٴى بەرٴىلٴىپ تۇر.',
+'movereason' => 'سەبەبٴى',
+'revertmove' => 'قايتارۋ',
+'delete_and_move' => 'جويۋ جٴانە جىلجىتۋ',
+'delete_and_move_text' => '==جويۋ قاجەت==
+
+اقىرعى «[[$1]]» بەت اتاۋى بار تٴۇگە.
+جىلجىتۋعا جول بەرۋ ٴۇشٴىن جويامىز با?',
+'delete_and_move_confirm' => 'يٴا, وسى بەتتٴى جوي',
+'delete_and_move_reason' => 'جىلجىتۋعا جول بەرۋ ٴۇشٴىن جويىلعان',
+'selfmove' => 'قاينار جٴانە اقىرعى اتاۋى بٴىردەي; بەت ٴوزٴىنە جىلجىتىلمايدى.',
+'immobile_namespace' => 'قاينار نەمەسە اقىرعى اتاۋى ارنايى تٴۇرٴىندە بولدى; وسىنداي ەسٴىم اياسى جاعىنا جٴانە جاعىنان بەتتەر جىلجىتىلمايدى.',
+
+# Export
+'export' => 'بەتتەردٴى سىرتقا بەرۋ',
+'exporttext' => 'XML پٴىشٴىمٴىنە قاپتالعان بٴولەك بەت نە بەتتەر بۋماسى
+مٴاتٴىنٴىڭ جٴانە ٴوڭدەۋ تاريحىن سىرتقا بەرە الاسىز. وسىنى, باسقا ۋيكي-گە
+{{ns:special}}:Import page MediaWiki قۇرالى ارقىلى, سىرتتان الۋعا بولادى.
+
+بەتتەردٴى سىرتقا بەرۋ ٴۇشٴىن, اتاۋلارىن تٴومەندەگٴى مٴاتٴىن اۋماعىنا ەنگٴىزٴىڭٴىز,
+بٴىر جولدا بٴىر اتاۋ, جٴانە تانداڭىز: نە اعىمدىق نۇسقاسىن, بارلىق ەسكٴى نۇسقالارى مەن
+جٴانە تاريحى جولدارى مەن بٴىرگە, نە دٴال اعىمدىق نۇسقاسىن, سوڭعى ٴوڭدەۋ تۋرالى اقپاراتى مەن بٴىرگە.
+
+سوڭعى جاعدايدا سٴىلتەمەنٴى دە قولدانۋعا بولادى, مىسالى {{int:mainpage}} بەتٴى ٴۇشٴىن [[{{ns:Special}}:Export/{{int:mainpage}}]].',
+'exportcuronly' => 'تولىق تاريحىن ەمەس, تەك اعىمدىق نۇسقاسىن كٴىرٴىستٴىرٴىڭٴىز',
+'exportnohistory' => "----
+'''اڭعارتپا:''' ٴونٴىمدٴىلٴىك ٴاسەرٴى سەبەپتەرٴىنەن, بەتتەر تولىق تاريحىن سىرتقا بەرۋٴى ٴوشٴىرٴىلگەن.",
+'export-submit' => 'سىرتقا بەر',
+
+# Namespace 8 related
+'allmessages' => 'جٴۇيە حابارلارى',
+'allmessagesname' => 'اتاۋى',
+'allmessagesdefault' => 'ٴادەپكٴى مٴاتٴىنٴى',
+'allmessagescurrent' => 'اعىمدىق مٴاتٴىنٴى',
+'allmessagestext' => 'مىندا «MediaWiki:» ەسٴىم اياسىنداعى بارلىق قاتىناۋلى جٴۇيە حابار تٴىزٴىمٴى بەرٴىلٴىپ تۇر.',
+'allmessagesnotsupportedUI' => 'Your current interface language <b>$1</b> is not supported by Special:Allmessages at this site.',
+'allmessagesnotsupportedDB' => "'''wgUseDatabaseMessages''' بابى ٴوشٴىرٴىلگەن سەبەبٴىنەن '''{{ns:special}}:AllMessages''' سيپاتى سٴۇەمەلدەنبەيدٴى.",
+'allmessagesfilter' => 'حاباردى اتاۋى بويىنشا سٴۇزگٴىلەۋ:',
+'allmessagesmodified' => 'تەك ٴوزگەرتٴىلگەندٴى كٴورسەت',
+
+# Thumbnails
+'thumbnail-more' => 'ٴۇلكەيتۋ',
+'missingimage' => '<b>جوعالعان سۋرەت </b><br /><i>$1</i>',
+'filemissing' => 'جوعالعان Ùايل',
+'thumbnail_error' => 'نوباي قۇرۋ قاتەسٴى: $1',
+
+# Special:Import
+'import' => 'بەتتەردٴى سىرتتان الۋ',
+'importinterwiki' => 'ۋيكي-تاسىمالداپ سىرتتان الۋ',
+'import-interwiki-text' => 'سىرتتان الاتىن ۋيكي جوباسىن جٴانە بەت اتاۋىن تانداڭىز.
+نۇسقا كٴۇن-ايى جٴانە ٴوڭدەۋشٴى اتتارى ساقتالادى.
+بارلىق ۋيكي-تاسىمالداپ سىرتتان الۋ ٴارەكەتتەر [[{{ns:special}}:Log/import|سىرتتان الۋ جۋرنالىنا]] جازىلىپ الىنادى.',
+'import-interwiki-history' => 'وسى بەتتٴىڭ بارلىق تاريحي نۇسقالارىن كٴوشٴىرۋ',
+'import-interwiki-submit' => 'سىرتتان الۋ',
+'import-interwiki-namespace' => 'مىنا ەسٴىم اياسىنا بەتتەردٴى تاسىمالداۋ:',
+'importtext' => 'قاينار ۋيكيدەن «Special:Export» قۋرالىن قولدانىپ, Ùايلدى سىرتقا بەرٴىڭٴىز, ديسكٴىڭٴىزگە ساقتاڭىز, سوسىن مىندا قوتارىڭىز.',
+'importstart' => 'بەتتەردٴى سىرتتان الۋى…',
+'import-revision-count' => '$1 نۇسقا',
+'importnopages' => 'سىرتتان الىناتىن بەتتەر جوق.',
+'importfailed' => 'سىرتتان الۋ سٴاتسٴىز بٴىتتٴى: $1',
+'importunknownsource' => 'Cىرتتان الۋ قاينار تٴۇرٴى تانىمالسىز',
+'importcantopen' => 'سىرتتان الۋ Ùايلى اشىلمايدى',
+'importbadinterwiki' => 'جارامسىز ۋيكي-ارالىق سٴىلتەمە',
+'importnotext' => 'بوستى, نە مٴاتٴىنٴى جوق',
+'importsuccess' => 'سىرتتان الۋ سٴاتتٴى اياقتالدى!',
+'importhistoryconflict' => 'تاريحىنىڭ ەگەس نۇسقالارى بار (بۇل بەتتٴى الدىندا سىرتتان الىنعان سيياقتى)',
+'importnosources' => 'ەشقانداي ۋيكي-تاسىمالداپ سىرتتان الۋ قاينارى بەلگٴىلەنمەگەن, جٴانە تاريحىن تٴىكەلەي قوتارۋى ٴوشٴىرٴىلگەن.',
+'importnofile' => 'سىرتتان الىناتىن Ùايل قوتارىلعان جوق.',
+'importuploaderror' => 'سىرتتان الۋ Ùايلدىڭ قوتارۋى سٴاتسٴىز بٴىتتٴى; وسى Ùايل مٴولشەرٴى رۇقسات ەتٴىلگەن مٴولشەردەن اسۋى مٴۇمكٴىن.',
+
+# Import log
+'importlogpage' => 'سىرتتان الۋ جۋرنالى',
+'importlogpagetext' => 'باسقا ۋيكيلەردەن ٴوڭدەۋ تاريحىمەن بٴىرگە بەتتەردٴى ٴاكٴىمشٴىلٴىك رەتٴىندە سىرتتان الۋ.',
+'import-logentry-upload' => 'Ùايل قوتارۋىمەن سىرتتان «[[$1]]» بەتٴى الىندى',
+'import-logentry-upload-detail' => '$1 نۇسقا',
+'import-logentry-interwiki' => 'ۋيكي-تاسىمالدانعان $1',
+'import-logentry-interwiki-detail' => '$2 دەگەننەن $1 نۇسقا',
+
+# Keyboard access keys for power users
+'accesskey-search' => 'f',
+'accesskey-minoredit' => 'i',
+'accesskey-save' => 's',
+'accesskey-preview' => 'p',
+'accesskey-diff' => 'v',
+'accesskey-compareselectedversions' => 'v',
+'accesskey-watch' => 'w',
+
+# Tooltip help for some actions, most are in Monobook.js
+'tooltip-search' => '{{SITENAME}} جوباسىنان ٴىزدەستٴىرۋ [alt-f]',
+'tooltip-minoredit' => 'وسىنى شاعىن تٴۇزەتۋ دەپ بەلگٴىلەۋ [alt-i]',
+'tooltip-save' => 'تٴۇزەتۋٴىڭٴىزدٴى ساقتاۋ [alt-s]',
+'tooltip-preview' => 'ساقتاۋدىڭ الدىنان تٴۇزەتۋٴىڭٴىزدٴى قاراپ شىعىڭىز! [alt-p]',
+'tooltip-diff' => 'مٴاتٴىنگە قانداي ٴوزگەرٴىستەردٴى جاساعانىڭىزدى قاراۋ. [alt-v]',
+'tooltip-compareselectedversions' => 'بەتتٴىڭ ەكٴى نۇسقاسىنىڭ ايىرماسىن قاراۋ. [alt-v]',
+'tooltip-watch' => 'بۇل بەتتٴى باقىلاۋ تٴىزٴىمٴىڭٴىزگە ٴۇستەۋ [alt-w]',
+
+# Stylesheets
+'common.css' => '/** مىنداعى CSS ٴامٴىرلەرٴى بارلىق بەزەندٴىرۋ مٴانەرٴىندەردە قولدانىلادى */',
+'monobook.css' => '/* مىنداعى CSS ٴامٴىرلەرٴى «دارا كٴىتاپ» بەزەندٴىرۋ مٴانەرٴىن پايدالانۋشىلارعا ٴاسەر ەتەدٴى */',
+
+# Metadata
+'nodublincore' => 'وسى سەرۆەرگە «Dublin Core RDF» مەتا-دەرەكتەرٴى ٴوشٴىرٴىلگەن.',
+'nocreativecommons' => 'وسى سەرۆەرگە «Creative Commons RDF» مەتا-دەرەكتەرٴى ٴوشٴىرٴىلگەن.',
+'notacceptable' => 'وسى ۋيكي سەرۆەرٴى سٴىزدٴىڭ «پايدالانۋشى ٴارەكەتكٴىشٴى» وقي الاتىن پٴىشٴىمٴى بار دەرەكتەردٴى جٴىبەرە المايدى.',
+
+# Attribution
+'anonymous' => '{{SITENAME}} تٴىركەلگٴىسٴىز پايدالانۋشى(لار)',
+'siteuser' => '{{SITENAME}} قاتىسۋشى $1',
+'lastmodifiedatby' => 'بۇل بەتتٴى $3 قاتىسۋشى سوڭعى ٴوزگەرتكەن كەزٴى: $2, $1.', # $1 date, $2 time, $3 user
+'and' => 'جٴانە',
+'othercontribs' => 'شىعارما نەگٴىزٴىن $1 جازعان.',
+'others' => 'باسقالار',
+'siteusers' => '{{SITENAME}} قاتىسۋشى(لار) $1',
+'creditspage' => 'بەتتٴى جازعاندار',
+'nocredits' => 'بۇل بەتتٴى جازعاندار تۋرالى اقپارات جوق.',
+
+# Spam protection
+'spamprotectiontitle' => '«سپام»-نان قورعايتىن سٴۇزگٴى',
+'spamprotectiontext' => 'بۇل بەتتٴىڭ ساقتاۋىن «سپام» سٴۇزگٴىسٴى بۇعاتتادى. بۇنىڭ سەبەبٴى سىرتقى توراپ سٴىلتەمەسٴىنەن بولۋى مٴۇمكٴىن.',
+'spamprotectionmatch' => 'كەلەسٴى «سپام» مٴاتٴىنٴى سٴۇزگٴىلەنگەن: $1',
+'subcategorycount' => 'بۇل ساناتتا {{PLURAL:$1|بٴىر|$1}} تٴومەنگٴى سانات بار.',
+'categoryarticlecount' => 'بۇل ساناتتا {{PLURAL:$1|بٴىر|$1}} بەت بار.',
+'category-media-count' => 'بۇل ساناتتا {{PLURAL:$1|بٴىر|$1}} Ùايل بار.',
+'listingcontinuesabbrev' => ' (جالع.)',
+'spambot_username' => 'MediaWiki spam cleanup',
+'spam_reverting' => '$1 دەگەنگە سٴىلتەمەسٴى جوق سوڭعى نۇسقاسىنا قايتارىلدى',
+'spam_blanking' => '$1 دەگەنگە سٴىلتەمەسٴى بار بارلىق نۇسقالار تازارتىلدى',
+
+# Info page
+'infosubtitle' => 'بەت تۋرالى اقپارات',
+'numedits' => 'تٴۇزەتۋ سانى (نەگٴىزگٴى بەتٴى): $1',
+'numtalkedits' => 'تٴۇزەتۋ سانى (تالقىلاۋ بەتٴى): $1',
+'numwatchers' => 'باقىلاۋشى سانى: $1',
+'numauthors' => 'ٴارتٴۇرلٴى اۋتورلار سانى (نەگٴىزگٴى بەتٴى): $1',
+'numtalkauthors' => 'ٴارتٴۇرلٴى اۋتور سانى (تالقىلاۋ بەتٴى): $1',
+
+# Math options
+'mw_math_png' => 'ٴارقاشان PNG تٴۇرٴىمەن كٴورسەت',
+'mw_math_simple' => 'كٴادٴىمگٴى بولسا HTML پٴىشٴىمٴىمەن, باسقاشا PNG تٴۇرٴىمەن',
+'mw_math_html' => 'ىقتيمال بولسا HTML پٴىشٴىمٴىمەن, باسقاشا PNG تٴۇرٴىمەن',
+'mw_math_source' => 'TeX پٴىشٴىمٴىندە قالدىرۋ (مٴاتٴىندٴىك شولعىشتارىنا)',
+'mw_math_modern' => 'وسى زاماننىڭ شولعىشتارىنا ۇسىنىلعان',
+'mw_math_mathml' => 'ىقتيمال بولسا MathML پشٴىمٴىمەن (سىناق تٴۇرٴىندە)',
+
+# Patrolling
+'markaspatrolleddiff' => 'كٴۇزەتتە دەپ بەلگٴىلەۋ',
+'markaspatrolledtext' => 'وسى بەتتٴى كٴۇزەتۋدە دەپ بەلگٴىلەۋ',
+'markedaspatrolled' => 'كٴۇزەتتە دەپ بەلگٴىلەندٴى',
+'markedaspatrolledtext' => 'تالعانعان نۇسقا كٴۇزەتتە دەپ بەلگٴىلەندٴى.',
+'rcpatroldisabled' => 'جۋىقتاعى ٴوزگەرٴىستەر كٴۇزەتٴى ٴوشٴىرٴىلگەن',
+'rcpatroldisabledtext' => 'جۋىقتاعى ٴوزگەرٴىستەر كٴۇزەتٴى قاسيەتٴى اعىمدا ٴوشٴىرٴىلگەن.',
+'markedaspatrollederror' => 'كٴۇزەتتە دەپ بەلگٴىلەنبەيدٴى',
+'markedaspatrollederrortext' => 'كٴۇزەتتە دەپ بەلگٴىلەۋ ٴۇشٴىن نۇسقاسىن ەنگٴىزٴىڭٴىز.',
+
+# Monobook.js: tooltips and access keys for monobook
+'monobook.js' => "/* tooltips and access keys */
+var ta = new Object();
+ta['pt-userpage'] = new Array('.','جەكە بەتٴىم');
+ta['pt-anonuserpage'] = new Array('.','وسى IP جايدىڭ جەكە بەتٴى');
+ta['pt-mytalk'] = new Array('n','تالقىلاۋ بەتٴىم');
+ta['pt-anontalk'] = new Array('n','وسى IP جاي تٴۇزەتۋلەرٴىن تالقىلاۋ');
+ta['pt-preferences'] = new Array('','باپتاۋىم');
+ta['pt-watchlist'] = new Array('l','ٴوزگەرٴىستەرٴىن باقىلاپ تۇرعان بەتتەر تٴىزٴىمٴىم.');
+ta['pt-mycontris'] = new Array('y','ٴۇلەستەرٴىمدٴىڭ تٴىزٴىمٴى');
+ta['pt-login'] = new Array('o','كٴىرۋٴىڭٴىزدٴى ۇسىنامىز, ول مٴىندەتتٴى ەمەس.');
+ta['pt-anonlogin'] = new Array('o','كٴىرۋٴىڭٴىزدٴى ۇسىنامىز, بٴىراق, ول مٴىندەتتٴى ەمەس.');
+ta['pt-logout'] = new Array('','شىعۋ');
+ta['ca-talk'] = new Array('t','ماعلۇمات بەتتٴى تالقىلاۋ');
+ta['ca-edit'] = new Array('e','بۇل بەتتٴى ٴوڭدەي الاسىز. ساقتاۋدىڭ الدىندا «قاراپ شىعۋ» تٴۇيمەسٴىن نۇقىڭىز.');
+ta['ca-addsection'] = new Array('+','بۇل تالقىلاۋ بەتٴىندە جاڭا تاراۋ باستاۋ.');
+ta['ca-viewsource'] = new Array('e','بۇل بەت قورعالعان, بٴىراق, قاينارىن قاراۋعا بولادى.');
+ta['ca-history'] = new Array('h','بۇل بەتتٴىن جۋىقتاعى نۇسقالارى.');
+ta['ca-protect'] = new Array('=','بۇل بەتتٴى قورعاۋ');
+ta['ca-unprotect'] = new Array('=','بۇل بەتتٴى قورعاماۋ');
+ta['ca-delete'] = new Array('d','بۇل بەتتٴى جويۋ');
+ta['ca-undelete'] = new Array('d','بۇل بەتتٴىڭ جويۋدىڭ الدىنداعى بولعان تٴۇزەتۋلەرٴىن قايتارۋ');
+ta['ca-move'] = new Array('m','بۇل بەتتٴى جىلجىتۋ');
+ta['ca-nomove'] = new Array('m','بۇل بەتتٴى جىلجىتۋعا رۇقساتىڭىز جوق');
+ta['ca-watch'] = new Array('w','بۇل بەتتٴى باقىلاۋ تٴىزٴىمٴىڭٴىزگە ٴۇستەۋ');
+ta['ca-unwatch'] = new Array('w','بۇل بەتتٴى باقىلاۋ تٴىزٴىمٴىڭٴىزدەن الاستاتۋ');
+ta['ca-varlang-0'] = new Array('','كيريلل جازۋى');
+ta['ca-varlang-1'] = new Array('','لاتىن جازۋى');
+ta['ca-varlang-2'] = new Array('','اراب جازۋى');
+ta['search'] = new Array('f','وسى ۋيكيدەن ٴىزدەۋ');
+ta['p-logo'] = new Array('','باستى بەتكە');
+ta['n-mainpage'] = new Array('z','باستى بەتكە بارىپ كەتٴىڭٴىز');
+ta['n-portal'] = new Array('','جوبا تۋرالى, نە ٴىستەۋٴىڭٴىزگە بولاتىن, قايدان تابۋعا بولاتىن تۋرالى');
+ta['n-currentevents'] = new Array('','اعىمداعى وقيعالارعا قاتىستى اقپارات');
+ta['n-recentchanges'] = new Array('r','وسى ۋيكيدەگٴى جۋىقتاعى ٴوزگەرٴىستەر تٴىزٴىمٴى.');
+ta['n-randompage'] = new Array('x','كەزدەيسوق بەتتٴى جٴۇكتەۋ');
+ta['n-help'] = new Array('','انىقتاما تابۋ ورنى.');
+ta['n-sitesupport'] = new Array('','بٴىزگە جٴاردەم ەتٴىڭٴىز');
+ta['t-whatlinkshere'] = new Array('j','مىندا سٴىلتەگەن بارلىق بەتتەردٴىڭ تٴىزٴىمٴى');
+ta['t-recentchangeslinked'] = new Array('k','مىننان سٴىلتەنگەن بەتتەردٴىڭ جۋىقتاعى ٴوزگەرٴىستەرٴى');
+ta['feed-rss'] = new Array('','بۇل بەتتٴىڭ RSS ارناسى');
+ta['feed-atom'] = new Array('','بۇل بەتتٴىڭ Atom ارناسى');
+ta['t-contributions'] = new Array('','وسى قاتىسۋشىنىڭ ٴۇلەس تٴىزٴىمٴىن قاراۋ');
+ta['t-emailuser'] = new Array('','وسى قاتىسۋشىعا email جٴىبەرۋ');
+ta['t-upload'] = new Array('u','سۋرەت Ù†Û• مەديا Ùايلدارىن قوتارۋ');
+ta['t-specialpages'] = new Array('q','بارلىق ارنايى بەتتەر تٴىزٴىمٴى');
+ta['t-print'] = new Array('','وسى بەتتٴىڭ باسىپ شىعارۋ نۇسقاسى');
+ta['t-permalink'] = new Array('','بەتتٴىڭ وسى نۇسقاسىنىڭ تۇراقتى سٴىلتەمەسٴى');
+ta['ca-nstab-main'] = new Array('c','ماعلۇمات بەتٴىن قاراۋ');
+ta['ca-nstab-user'] = new Array('c','قاتىسۋشى بەتٴىن قاراۋ');
+ta['ca-nstab-media'] = new Array('c','تاسپا بەتٴىن قاراۋ');
+ta['ca-nstab-special'] = new Array('','بۇل ارنايى بەت, بەتتٴىڭ ٴوزٴى ٴوڭدەلٴىنبەيدٴى.');
+ta['ca-nstab-project'] = new Array('a','جوبا بەتٴىن قاراۋ');
+ta['ca-nstab-image'] = new Array('c','سۋرەت بەتٴىن قاراۋ');
+ta['ca-nstab-mediawiki'] = new Array('c','جٴۇيە حابارىن قاراۋ');
+ta['ca-nstab-template'] = new Array('c','ٴۇلگٴىنٴى قاراۋ');
+ta['ca-nstab-help'] = new Array('c','انىقتىما بەتٴىن قاراۋ');
+ta['ca-nstab-category'] = new Array('c','سانات بەتٴىن قاراۋ');",
+
+# Common.js: contains nothing but a placeholder comment
+'common.js' => '/* مىنداعى كەز كەلگەن JavaScript ٴامٴىرلەرٴى ٴارقايسى بەت جٴۇكتەلگەندە بارلىق پايدالانۋشىلارعا جٴۇكتەلەدٴى. */
+
+// BEGIN workaround for RTL
+if (wgUserLanguage == "kk-cn"){
+ document.direction="rtl";
+ document.write(\'<style type="text/css">html {direction: rtl;}</style>\');
+ document.write(\'<link rel="stylesheet" type="text/css" href="\'+stylepath+\'/common/common_rtl.css">\');
+ document.write(\'<link rel="stylesheet" type="text/css" href="\'+stylepath+\'/\'+skin+\'/rtl.css">\');
+}
+// END workaround for RTL',
+
+# Image deletion
+'deletedrevision' => 'مىنا ەسكٴى نۇسقاسىن جويدى: $1.',
+
+# Browsing diffs
+'previousdiff' => '↠الدىڭعىمەن ايىرماسى',
+'nextdiff' => 'كەلەسٴىمەن ايىرماسى →',
+
+'imagemaxsize' => 'سۋرەت تٴۇيٴىندەمە بەتٴىندەگٴى سۋرەتتٴىڭ مٴولشەرٴىن شەكتەۋٴى:',
+'thumbsize' => 'نوباي مٴولشەرٴى:',
+'showbigimage' => 'جوعارى اجىراتىلىمدى ($1×$2, $3 كب) نۇسقاسىن جٴۇكتەۋ',
+
+'newimages' => 'Û•Ú­ جاڭا Ùايلدار قويماسى',
+'showhidebots' => '(بوتتاردى $1)',
+'noimages' => 'كٴورەتٴىن ەشتەڭە جوق.',
+
+# Variants for Kazakh language
+'variantname-kk-tr' => 'Latın',
+'variantname-kk-kz' => 'Кирил',
+'variantname-kk-cn' => 'توتە',
+'variantname-kk' => 'disable',
+
+# Labels for User: and Title: on Special:Log pages
+'specialloguserlabel' => 'قاتىسۋشى:',
+'speciallogtitlelabel' => 'اتاۋ:',
+
+'passwordtooshort' => 'قۇپييا سٴوزٴىڭٴىز تىم قىسقا. ەڭ كەمٴىندە $1 ٴارٴىپ بولۋى قاجەت.',
+
+# Media Warning
+'mediawarning' => "'''نازار سالىڭىز''': بۇل Ùايل تٴۇرٴىندە قاسكٴۇنەمدٴى ٴامٴىردٴىڭ بار بولۋى ىقتيمال; Ùايلدى جەگٴىپ جٴۇيەڭٴىزگە زييان كەلتٴىرۋٴىڭٴىز مٴۇمكٴىن.<hr />",
+
+'fileinfo' => '$1 كب, MIME تٴۇرٴى: <code>$2</code>',
+
+# Metadata
+'metadata' => 'مەتا-دەرەكتەرٴى',
+'metadata-help' => 'وسى Ùايلدا قوسىمشا اقپارات بار. بٴالكٴىم, وسى اقپارات Ùايلدى جاساپ شىعارۋ, Ù†Û• ساندىلاۋ ٴۇشٴىن پايدالانعان ساندىق كامەرا, Ù†Û• مٴاتٴىنالعىردان الىنعان. ەگەر وسى Ùايل نەگٴىزگٴى كٴۇيٴىنەن ٴوزگەرتٴىلگەن بولسا, كەيبٴىر ەجەلەلەرٴى ٴوزگەرتٴىلگەن Ùوتوسۋرەتكە لايىق بولماس.',
+'metadata-expand' => 'ەگجەي-تەگجەيٴىن كٴورسەت',
+'metadata-collapse' => 'ەگجەي-تەگجەيٴىن جاسىر',
+'metadata-fields' => 'وسى حاباردا تٴىزٴىمدەلگەن EXIF مەتا-دەرەك اۋماقتارى,
+سۋرەت بەتٴى كٴورسەتۋ كەزٴىندە مەتا-دەرەك كەستە جاسىرىلىعاندا كٴىرٴىستٴىرلەدٴى.
+باسقاسى ٴادەپكٴىدەن جاسىرىلادى.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* focallength',
+
+# EXIF tags
+'exif-imagewidth' => 'ەنٴى',
+'exif-imagelength' => 'بيٴىكتٴىگٴى',
+'exif-bitspersample' => 'قۇراش سايىن بيت سانى',
+'exif-compression' => 'قىسىم سۇلباسى',
+'exif-photometricinterpretation' => 'پيكسەل قيىسۋى',
+'exif-orientation' => 'مەگزەۋٴى',
+'exif-samplesperpixel' => 'قۇراش سانى',
+'exif-planarconfiguration' => 'دەرەك رەتتەۋٴى',
+'exif-ycbcrsubsampling' => 'Y قۇراشىنىڭ C قۇراشىنا جارناقتاۋى',
+'exif-ycbcrpositioning' => 'Y قۇراشى جٴانە C قۇراشى مەكەندەۋٴى',
+'exif-xresolution' => 'دەرەلەي اجىراتىلىمدىعى',
+'exif-yresolution' => 'تٴىرەلەي اجىراتىلىمدىعى',
+'exif-resolutionunit' => 'X جٴانە Y اجىراتىلىمدىقتارىعىنىڭ ٴولشەمٴى',
+'exif-stripoffsets' => 'سۋرەت دەرەرەكتەرٴىنٴىڭ جايعاسۋى',
+'exif-rowsperstrip' => 'بەلدٴىك سايىن جول سانى',
+'exif-stripbytecounts' => 'قىسىمدالعان بەلدٴىك سايىن بايت سانى',
+'exif-jpeginterchangeformat' => 'JPEG SOI دەگەننەن ىعىسۋى',
+'exif-jpeginterchangeformatlength' => 'JPEG دەرەكتەرٴىنٴىڭ بايت سانى',
+'exif-transferfunction' => 'تاسىمالداۋ Ùۋنكتسيياسى',
+'exif-whitepoint' => 'اق نٴۇكتە تٴۇستٴىلٴىگٴى',
+'exif-primarychromaticities' => 'العى شەپتەگٴى تٴۇستٴىلٴىكتەرٴى',
+'exif-ycbcrcoefficients' => 'تٴۇس اياسىن تاسىمالداۋ ماتريتسالىق ەسەلٴىكتەرٴى',
+'exif-referenceblackwhite' => 'قارا جٴانە اق انىقتاۋىش قوس كولەمدەرٴى',
+'exif-datetime' => 'Ùايلدىڭ ٴوزگەرتٴىلگەن كٴۇن-ايى',
+'exif-imagedescription' => 'سۋرەت اتاۋى',
+'exif-make' => 'كامەرا ٴوندٴىرۋشٴىسٴى',
+'exif-model' => 'كامەرا ٴۇلگٴىسٴى',
+'exif-software' => 'قولدانىلعان باعدارلاما',
+'exif-artist' => 'جىعارماشىسى',
+'exif-copyright' => 'جىعارماشىلىق قۇقىقتار يەسٴى',
+'exif-exifversion' => 'Exif نۇسقاسى',
+'exif-flashpixversion' => 'سٴۇيەمدەلٴىنگەن Flashpix نۇسقاسى',
+'exif-colorspace' => 'تٴۇس اياسى',
+'exif-componentsconfiguration' => 'ٴارقايسى قۇراش مٴانٴى',
+'exif-compressedbitsperpixel' => 'سۋرەت قىسىمداۋ تٴارتٴىبٴى',
+'exif-pixelydimension' => 'سۋرەتتٴىڭ جارامدى ەنٴى',
+'exif-pixelxdimension' => 'سۋرەتتٴىڭ جارامدى بيٴىكتٴىگٴى',
+'exif-makernote' => 'ٴوندٴىرۋشٴى ەسكەرتپەلەرٴى',
+'exif-usercomment' => 'پايدالانۋشى مٴاندەمەلەرٴى',
+'exif-relatedsoundfile' => 'قاتىستى دىبىس Ùايلى',
+'exif-datetimeoriginal' => 'جاسالعان كەزٴى',
+'exif-datetimedigitized' => 'ساندىقتاۋ كەزٴى',
+'exif-subsectime' => 'جاسالعان كەزٴىنٴىڭ سەكۋند بٴولشەكتەرٴى',
+'exif-subsectimeoriginal' => 'تٴۇپنۇسقا كەزٴىنٴىڭ سەكۋند بٴولشەكتەرٴى',
+'exif-subsectimedigitized' => 'ساندىقتاۋ كەزٴىنٴىڭ سەكۋند بٴولشەكتەرٴى',
+'exif-exposuretime' => 'ۇستالىم ۋاقىتى',
+'exif-exposuretime-format' => '$1 س ($2)',
+'exif-fnumber' => 'ساڭىلاۋ مٴولشەرٴى',
+'exif-fnumber-format' => 'f/$1',
+'exif-exposureprogram' => 'ۇستالىم باعدارلاماسى',
+'exif-spectralsensitivity' => 'سپەكتر بويىنشا سەزگٴىشتٴىگٴى',
+'exif-isospeedratings' => 'ISO جىلدامدىق جارناقتاۋى (جارىق سەزگٴىشتٴىگٴى)',
+'exif-oecf' => 'وپتوەلەكتروندى تٴۇرلەتۋ ىقپالى',
+'exif-shutterspeedvalue' => 'جاپقىش جىلدامدىلىعى',
+'exif-aperturevalue' => 'ساڭىلاۋلىق',
+'exif-brightnessvalue' => 'اشىقتىق',
+'exif-exposurebiasvalue' => 'ۇستالىم ٴوتەمٴى',
+'exif-maxaperturevalue' => 'بارىنشا ساڭىلاۋ اشۋى',
+'exif-subjectdistance' => 'نىسانا قاشىقتىعى',
+'exif-meteringmode' => 'ٴولشەۋ تٴارتٴىبٴى',
+'exif-lightsource' => 'جارىق كٴوزٴى',
+'exif-flash' => 'جارقىلداعىش',
+'exif-focallength' => 'شوعىرلاۋ الشاقتىعى',
+'exif-focallength-format' => '$1 mm',
+'exif-subjectarea' => 'نىسانا اۋقىمى',
+'exif-flashenergy' => 'جارقىلداعىش قارقىنى',
+'exif-spatialfrequencyresponse' => 'كەڭٴىستٴىك-جيٴىلٴىك ٴاسەرشٴىلٴىگٴى',
+'exif-focalplanexresolution' => 'ح بويىنشا شوعىرلاۋ جايپاقتىقتىڭ اجىراتىلىمدىعى',
+'exif-focalplaneyresolution' => 'Y بويىنشا شوعىرلاۋ جايپاقتىقتىڭ اجىراتىلىمدىعى',
+'exif-focalplaneresolutionunit' => 'شوعىرلاۋ جايپاقتىقتىڭ اجىراتىلىمدىق ٴولشەمٴى',
+'exif-subjectlocation' => 'نىسانا مەكەندەۋٴى',
+'exif-exposureindex' => 'ۇستالىم ايقىنداۋى',
+'exif-sensingmethod' => 'سەنسوردٴىڭ ٴولشەۋ ٴادٴىسٴى',
+'exif-filesource' => 'Ùايل قاينارى',
+'exif-scenetype' => 'ساحنا تٴۇرٴى',
+'exif-cfapattern' => 'CFA سٴۇزگٴى كەيٴىپٴى',
+'exif-customrendered' => 'قوسىمشا سۋرەت ٴوڭدەتۋٴى',
+'exif-exposuremode' => 'ۇستالىم تٴارتٴىبٴى',
+'exif-whitebalance' => 'اق تٴۇسٴىنٴىڭ تەندەستٴىگٴى',
+'exif-digitalzoomratio' => 'ساندىق اۋقىمداۋ جارناقتاۋى',
+'exif-focallengthin35mmfilm' => '35 mm تاسپاسىنىڭ شوعىرلاۋ الشاقتىعى',
+'exif-scenecapturetype' => 'تٴۇسٴىرگەن ساحنا تٴۇرٴى',
+'exif-gaincontrol' => 'ساحنانى مەڭگەرۋ',
+'exif-contrast' => 'قاراما-قارسىلىق',
+'exif-saturation' => 'قانىقتىق',
+'exif-sharpness' => 'ايقىندىق',
+'exif-devicesettingdescription' => 'جابدىق باپتاۋ سيپاتتارى',
+'exif-subjectdistancerange' => 'ساحنا قاشىقتىعىنىڭ كٴولەمٴى',
+'exif-imageuniqueid' => 'سۋرەتتٴىڭ بٴىرەگەي نٴومٴىرٴى (ID)',
+'exif-gpsversionid' => 'GPS بەلگٴىشەسٴىنٴىڭ نۇسقاسى',
+'exif-gpslatituderef' => 'سولتٴۇستٴىك نەمەسە وڭتٴۇستٴىك بويلىعى',
+'exif-gpslatitude' => 'بويلىعى',
+'exif-gpslongituderef' => 'شىعىس نەمەسە باتىس ەندٴىگٴى',
+'exif-gpslongitude' => 'ەندٴىگٴى',
+'exif-gpsaltituderef' => 'بيٴىكتٴىك كٴورسەتۋٴى',
+'exif-gpsaltitude' => 'بيٴىكتٴىك',
+'exif-gpstimestamp' => 'GPS ۋاقىتى (اتوم ساعاتى)',
+'exif-gpssatellites' => 'ٴولشەۋگە پيدالانىلعان جەر سەرٴىكتەرٴى',
+'exif-gpsstatus' => 'قابىلداعىش كٴۇيٴى',
+'exif-gpsmeasuremode' => 'ٴولشەۋ تٴارتٴىبٴى',
+'exif-gpsdop' => 'ٴولشەۋ دٴالدٴىگٴى',
+'exif-gpsspeedref' => 'جىلدامدىلىق ٴولشەمٴى',
+'exif-gpsspeed' => 'GPS قابىلداعىشتىڭ جىلدامدىلىعى',
+'exif-gpstrackref' => 'قوزعالىس باعىتىن كٴورسەتۋٴى',
+'exif-gpstrack' => 'قوزعالىس باعىتى',
+'exif-gpsimgdirectionref' => 'سۋرەت باعىتىن كٴورسەتۋٴى',
+'exif-gpsimgdirection' => 'سۋرەت باعىتى',
+'exif-gpsmapdatum' => 'پايدالانىلعان گەودەزييالىق تٴۇسٴىرمە دەرەكتەرٴى',
+'exif-gpsdestlatituderef' => 'نىسانا بويلىعىن كٴورسەتۋٴى',
+'exif-gpsdestlatitude' => 'نىسانا بويلىعى',
+'exif-gpsdestlongituderef' => 'نىسانا ەندٴىگٴىن كٴورسەتۋٴى',
+'exif-gpsdestlongitude' => 'نىسانا ەندٴىگٴى',
+'exif-gpsdestbearingref' => 'نىسانا ازيمۋتىن كٴورسەتۋٴى',
+'exif-gpsdestbearing' => 'نىسانا ازيمۋتى',
+'exif-gpsdestdistanceref' => 'نىسانا قاشىقتىعىن كٴورسەتۋٴى',
+'exif-gpsdestdistance' => 'نىسانا قاشىقتىعى',
+'exif-gpsprocessingmethod' => 'GPS ٴوڭدەتۋ ٴادٴىسٴىنٴىڭ اتاۋى',
+'exif-gpsareainformation' => 'GPS اۋماعىنىڭ اتاۋى',
+'exif-gpsdatestamp' => 'GPS كٴۇن-ايى',
+'exif-gpsdifferential' => 'GPS سارالانعان تٴۇزەتۋ',
+
+# EXIF attributes
+'exif-compression-1' => 'ۇلعايتىلعان',
+'exif-compression-6' => 'JPEG',
+
+'exif-photometricinterpretation-2' => 'RGB',
+'exif-photometricinterpretation-6' => 'YCbCr',
+
+'exif-orientation-1' => 'قالىپتى', # 0th row: top; 0th column: left
+'exif-orientation-2' => 'دەرەلەي شاعىلىسقان', # 0th row: top; 0th column: right
+'exif-orientation-3' => '180° بۇرىشقا اينالعان', # 0th row: bottom; 0th column: right
+'exif-orientation-4' => 'تٴىرەلەي شاعىلىسقان', # 0th row: bottom; 0th column: left
+'exif-orientation-5' => 'ساعات تٴىلشەسٴىنە قارسى 90° بۇرىشقا اينالعان جٴانە تٴىرەلەي شاعىلىسقان', # 0th row: left; 0th column: top
+'exif-orientation-6' => 'ساعات تٴىلشە بويىنشا 90° بۇرىشقا اينالعان', # 0th row: right; 0th column: top
+'exif-orientation-7' => 'ساعات تٴىلشە بويىنشا 90° بۇرىشقا اينالعان جٴانە تٴىرەلەي شاعىلىسقان', # 0th row: right; 0th column: bottom
+'exif-orientation-8' => 'ساعات تٴىلشەسٴىنە قارسى 90° بۇرىشقا اينالعان', # 0th row: left; 0th column: bottom
+
+'exif-planarconfiguration-1' => 'تالپاق پٴىشٴىم',
+'exif-planarconfiguration-2' => 'تايپاق پٴىشٴىم',
+
+'exif-xyresolution-i' => '$1 dpi',
+'exif-xyresolution-c' => '$1 dpc',
+
+'exif-colorspace-1' => 'sRGB',
+'exif-colorspace-ffff.h' => 'FFFF.H',
+
+'exif-componentsconfiguration-0' => 'بار بولمادى',
+'exif-componentsconfiguration-1' => 'Y',
+'exif-componentsconfiguration-2' => 'Cb',
+'exif-componentsconfiguration-3' => 'Cr',
+'exif-componentsconfiguration-4' => 'R',
+'exif-componentsconfiguration-5' => 'G',
+'exif-componentsconfiguration-6' => 'B',
+
+'exif-exposureprogram-0' => 'انىقتالماعان',
+'exif-exposureprogram-1' => 'قولمەن',
+'exif-exposureprogram-2' => 'باعدارلامالى ٴادٴىس (قالىپتى)',
+'exif-exposureprogram-3' => 'ساڭىلاۋ باسىڭقىلىعى',
+'exif-exposureprogram-4' => 'ىسىرما باسىڭقىلىعى',
+'exif-exposureprogram-5' => 'ٴونەر باعدارلاماسى (انىقتىق تەرەندٴىگٴىنە ساناسقان)',
+'exif-exposureprogram-6' => 'قيمىل باعدارلاماسى (جاپقىش شاپشاندىلىعىنا ساناسقان)',
+'exif-exposureprogram-7' => 'تٴىرەلەي ٴادٴىسٴى (ارتى شوعىرلاۋسىز تاياۋ تٴۇسٴىرمەلەر)',
+'exif-exposureprogram-8' => 'دەرەلەي ٴادٴىسٴى (ارتى شوعىرلانعان دەرەلەي تٴۇسٴىرمەلەر)',
+
+'exif-subjectdistance-value' => '$1 m',
+
+'exif-meteringmode-0' => 'بەلگٴىسٴىز',
+'exif-meteringmode-1' => 'بٴىركەلكٴى',
+'exif-meteringmode-2' => 'بۇلدىر داق',
+'exif-meteringmode-3' => 'بٴىرداقتى',
+'exif-meteringmode-4' => 'كٴوپداقتى',
+'exif-meteringmode-5' => 'ٴورنەكتٴى',
+'exif-meteringmode-6' => 'جىرتىندى',
+'exif-meteringmode-255' => 'باسقا',
+
+'exif-lightsource-0' => 'بەلگٴىسٴىز',
+'exif-lightsource-1' => 'كٴۇن جارىعى',
+'exif-lightsource-2' => 'كٴۇنجارىقتى شام',
+'exif-lightsource-3' => 'قىزدىرعىشتى شام',
+'exif-lightsource-4' => 'جارقىلداعىش',
+'exif-lightsource-9' => 'اشىق كٴۇن',
+'exif-lightsource-10' => 'بۇلىنعىر كٴۇن',
+'exif-lightsource-11' => 'كٴولەنكەلٴى',
+'exif-lightsource-12' => 'كٴۇنجارىقتى شام (D 5700–7100 K)',
+'exif-lightsource-13' => 'كٴۇنجارىقتى شام (N 4600–5400 K)',
+'exif-lightsource-14' => 'كٴۇنجارىقتى شام (W 3900–4500 K)',
+'exif-lightsource-15' => 'كٴۇنجارىقتى شام (WW 3200–3700 K)',
+'exif-lightsource-17' => 'قالىپتى جارىق قاينارى A',
+'exif-lightsource-18' => 'قالىپتى جارىق قاينارى B',
+'exif-lightsource-19' => 'قالىپتى جارىق قاينارى C',
+'exif-lightsource-20' => 'D55',
+'exif-lightsource-21' => 'D65',
+'exif-lightsource-22' => 'D75',
+'exif-lightsource-23' => 'D50',
+'exif-lightsource-24' => 'ستۋدييالىق ISO كٴۇنجارىقتى شام',
+'exif-lightsource-255' => 'باسقا جارىق قاينارى',
+
+'exif-focalplaneresolutionunit-2' => 'ديۋيم',
+
+'exif-sensingmethod-1' => 'انىقتالماعان',
+'exif-sensingmethod-2' => '1-چيپتٴى اۋماقتى تٴۇسسەزگٴىش',
+'exif-sensingmethod-3' => '2-چيپتٴى اۋماقتى تٴۇسسەزگٴىش',
+'exif-sensingmethod-4' => '3-چيپتٴى اۋماقتى تٴۇسسەزگٴىش',
+'exif-sensingmethod-5' => 'كەزەكتٴى اۋماقتى تٴۇسسەزگٴىش',
+'exif-sensingmethod-7' => '3-سىزىقتى تٴۇسسەزگٴىش',
+'exif-sensingmethod-8' => 'كەزەكتٴى سىزىقتى تٴۇسسەزگٴىش',
+
+'exif-filesource-3' => 'DSC',
+
+'exif-scenetype-1' => 'تٴىكەلەي تٴۇسٴىرٴىلگەن Ùوتوسۋرەت',
+
+'exif-customrendered-0' => 'قالىپتى ٴوڭدەتۋ',
+'exif-customrendered-1' => 'قوسىمشا ٴوڭدەتۋ',
+
+'exif-exposuremode-0' => 'ٴوزدٴىك ۇستالىمداۋ',
+'exif-exposuremode-1' => 'قولمەن ۇستالىمداۋ',
+'exif-exposuremode-2' => 'ٴوزدٴىك جارقىلداۋ',
+
+'exif-whitebalance-0' => 'اق تٴۇسٴىنٴىڭ ٴوزدٴىك تەندەستٴىرۋ',
+'exif-whitebalance-1' => 'اق تٴۇسٴىنٴىڭ قولمەن تەندەستٴىرۋ',
+
+'exif-scenecapturetype-0' => 'قالىپتى',
+'exif-scenecapturetype-1' => 'دەرەلەي',
+'exif-scenecapturetype-2' => 'تٴىرەلەي',
+'exif-scenecapturetype-3' => 'تٴۇنگٴى ساحنا',
+
+'exif-gaincontrol-0' => 'جوق',
+'exif-gaincontrol-1' => 'تٴومەن زورايۋ',
+'exif-gaincontrol-2' => 'جوعارى زورايۋ',
+'exif-gaincontrol-3' => 'تٴومەن باياۋلاۋ',
+'exif-gaincontrol-4' => 'جوعارى باياۋلاۋ',
+
+'exif-contrast-0' => 'قالىپتى',
+'exif-contrast-1' => 'ۇيان',
+'exif-contrast-2' => 'تۇرپايى',
+
+'exif-saturation-0' => 'قالىپتى',
+'exif-saturation-1' => 'تٴومەن قانىقتى',
+'exif-saturation-2' => 'جوعارى قانىقتى',
+
+'exif-sharpness-0' => 'قالىپتى',
+'exif-sharpness-1' => 'ۇيان',
+'exif-sharpness-2' => 'تۇرپايى',
+
+'exif-subjectdistancerange-0' => 'بەلگٴىسٴىز',
+'exif-subjectdistancerange-1' => 'تاياۋ تٴۇسٴىرٴىلگەن',
+'exif-subjectdistancerange-2' => 'جاقىن تٴۇسٴىرٴىلگەن',
+'exif-subjectdistancerange-3' => 'الىس تٴۇسٴىرٴىلگەن',
+
+# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'سولتٴۇستٴىك بويلىعى',
+'exif-gpslatitude-s' => 'وڭتٴۇستٴىك بويلىعى',
+
+# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'شىعىس ەندٴىگٴى',
+'exif-gpslongitude-w' => 'باتىس ەندٴىگٴى',
+
+'exif-gpsstatus-a' => 'ٴولشەۋ ۇلاسۋدا',
+'exif-gpsstatus-v' => 'ٴولشەۋ ٴوزارا ٴارەكەتتە',
+
+'exif-gpsmeasuremode-2' => '2-باعىتتىق ٴولشەم',
+'exif-gpsmeasuremode-3' => '3-باعىتتىق ٴولشەم',
+
+# Pseudotags used for GPSSpeedRef and GPSDestDistanceRef
+'exif-gpsspeed-k' => 'km/h',
+'exif-gpsspeed-m' => 'mil/h',
+'exif-gpsspeed-n' => 'ج. تٴۇيٴىن',
+
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'شىن باعىت',
+'exif-gpsdirection-m' => 'ماگنيتتى باعىت',
+
+# External editor support
+'edit-externally' => 'بۇل Ùايلدى سىرتقى قۇرال/باعدارلاما ارقىلى ٴوڭدەۋ',
+'edit-externally-help' => 'كٴوبٴىرەك اقپارات ٴۇشٴىن [http://meta.wikimedia.org/wiki/Help:External_editors ورناتۋ نۇسقاۋلارىن] قاراڭىز.',
+
+# 'all' in various places, this might be different for inflected languages
+'recentchangesall' => 'بارلىعىن',
+'imagelistall' => 'بارلىعى',
+'watchlistall1' => 'بارلىعى',
+'watchlistall2' => 'بارلىق',
+'namespacesall' => 'بارلىعى',
+
+# E-mail address confirmation
+'confirmemail' => 'ە-پوشتا جايىن كۋٴالاندىرۋ',
+'confirmemail_noemail' => '[[{{ns:special}}:Preferences|قاتىسۋشى باپتاۋىڭىزدا]] جارامدى ە-پوشتا جايىن ەنگٴىزبەپسٴىز.',
+'confirmemail_text' => 'بۇل ۋيكيدە ە-پوشتا قاسيەتتەرٴىن پايدالانۋدىڭ الدىنان ە-پوشتا جايىڭىزدى
+كۋٴالاندىرۋ قاجەت. ٴوزٴىڭٴىزدٴىڭ جايىڭىزعا كۋٴالاندىرۋ حاتىن جٴىبەرۋ ٴۇشٴىن تٴومەندەگٴى تٴۇيمەنٴى نۇقىڭىز.
+حاتتىڭ ٴىشٴىندە ارنايى كودى بار سٴىلتەمە كٴىرٴىستٴىرلەدٴى; ە-پوشتا جايىڭىزدىڭ جارامدىعىن كۋٴالاندىرۋ ٴۇشٴىن
+سٴىلتەمەنٴى شولعىشتىڭ مەكەن-جاي جولاعىنا ەنگٴىزٴىپ اشىڭىز.',
+'confirmemail_send' => 'كۋٴالاندىرۋ كودىن جٴىبەرۋ',
+'confirmemail_sent' => 'كۋٴالاندىرۋ ە-پوشتا حاتى جٴىبەرٴىلدٴى.',
+'confirmemail_sendfailed' => 'كۋٴالاندىرۋ حاتى جٴىبەرٴىلمەدٴى. ەنگٴىزٴىلگەن جايدى جارامسىز ٴارٴىتەرٴىنە تەكسەرٴىپ شىعىڭىز.
+
+ە-پوشتا قىزمەتٴى قايتارعانى: $1',
+'confirmemail_invalid' => 'كۋٴالاندىرۋ كودى جارامسىز. كودتىڭ مەرزٴىمٴى بٴىتكەن شىعار.',
+'confirmemail_needlogin' => 'ە-پوشتا جايىڭىزدى كۋٴالاندىرۋ ٴۇشٴىن $1 قاجەت.',
+'confirmemail_success' => 'ە-پوشتا جايىڭىز كۋٴالاندىرىلدى. ەندٴى ۋيكيگە كٴىرٴىپ جۇمىسقا كٴىرٴىسۋگە بولادى',
+'confirmemail_loggedin' => 'ە-پوشتا جايىڭىز كۋٴالاندىرىلدى.',
+'confirmemail_error' => 'كۋٴالاندىرۋىڭىزدى ساقتاعاندا بەلگٴىسٴىز قاتە بولدى.',
+'confirmemail_subject' => '{{SITENAME}} تورابىنان ە-پوشتا جايىڭىزدى كۋٴالاندىرۋ حاتى',
+'confirmemail_body' => "كەيبٴىرەۋ, مىنا $1 IP جايىنان, ٴوزٴىڭٴىز بولۋى مٴۇمكٴىن,
+{{SITENAME}} جوباسىنداعى ە-پوشتا جايىن قولدانىپ «$2» تٴىركەلگٴى جاساپتى.
+
+وسى تٴىركەلگٴى راستان سٴىزدٴىكٴى ەكەنٴىن كۋٴالاندىرۋ ٴۇشٴىن, جٴانە {{SITENAME}} جوباسىنىڭ
+ە-پوشتا قاسيەتتەرٴىن بەلسەندٴىرۋ ٴۇشٴىن, مىنا سٴىلتەمەنٴى شولعىشپەن اشىڭىز:
+
+$3
+
+بۇل سٴىزدٴىكٴى '''ەمەس''' بولسا, سٴىلتەمەگە ەرمەڭٴىز. كۋٴالاندىرۋ كودىنىڭ
+مەرزٴىمٴى $4 كەزٴىندە بٴىتەدٴى.",
+
+# Inputbox extension, may be useful in other contexts as well
+'tryexact' => 'دٴال سٴايكەسٴىن سىناپ كٴورٴىڭٴىز',
+'searchfulltext' => 'تولىق مٴاتٴىنٴىمەن ٴىزدەۋ',
+'createarticle' => 'بەتتٴى باستاۋ',
+
+# Scary transclusion
+'scarytranscludedisabled' => '[ۋيكي-ارا كٴىرەگۋ ٴوشٴىرٴىلگەن]',
+'scarytranscludefailed' => '[$1 بەتٴىنە ٴۇلگٴى ٴوڭدەتۋ سٴاتسٴىز بٴىتتٴى; كەشٴىرٴىڭٴىز]',
+'scarytranscludetoolong' => '[URL جايى تىم ۇزىن; كەشٴىرٴىڭٴىز]',
+
+# Trackbacks
+'trackbackbox' => '<div id="mw_trackbacks">
+بۇل بەتتٴىڭ اڭىستاۋلارى:<br />
+$1
+</div>',
+'trackbackremove' => '([$1 جويىلدى])',
+'trackbacklink' => 'اڭىستاۋ',
+'trackbackdeleteok' => 'اڭىستاۋ جويۋى سٴاتتٴى ٴوتتٴى.',
+
+# Delete conflict
+'deletedwhileediting' => 'نازار سالىڭىز:سٴىز بۇل بەتتٴىڭ ٴوڭدەۋٴىن باستاعاندا, وسى بەت جويىلدى!',
+'confirmrecreate' => "سٴىز بۇل بەتتٴىڭ ٴوندەۋٴىن باستاعاندا [[{{ns:user}}:$1|$1]] ([[{{ns:user_talk}}:$1|تالقىلاۋى]]) وسى بەتتٴى جويدى, كٴورسەتكەن سەبەبٴى:
+: ''$2''
+وسى بەتتٴى شىنىنان قايتا جاساۋىن راستاڭىز.",
+'recreate' => 'قايتا جاساۋ',
+'tooltip-recreate' => 'بۇل بەتتٴى جويىلۋىنا قاراماي قايتا جاساۋ',
+
+'unit-pixel' => ' px',
+
+# HTML dump
+'redirectingto' => '[[$1]] بەتٴىنە ايداتۋدا…',
+
+# action=purge
+'confirm_purge' => 'قوسالقى قالتاداعى وسى بەتٴىن تازالايمىز با?<br /><br />$1',
+'confirm_purge_button' => 'جارايدى',
+
+'youhavenewmessagesmulti' => '$1 دەگەنگە جاڭا حابارلار تٴۇستٴى',
+
+'searchcontaining' => "مىنا سٴوزٴى بار بەت اراسىنان ٴىزدەۋ: ''$1''.",
+'searchnamed' => "مىنا اتاۋلى بەت اراسىنان ٴىزدەۋ: ''$1''.",
+'articletitles' => "اتاۋلارى مىنادان باستالعان بەتتەر: ''$1''",
+'hideresults' => 'نٴاتيجەلەردٴى جاسىر',
+
+# DISPLAYTITLE
+'displaytitle' => '(بۇل بەتتٴىڭ سٴىلتەمەسٴى: [[$1]])',
+
+'loginlanguagelabel' => 'تٴىل: $1',
+
+# Multipage image navigation
+'imgmultipageprev' => '&larr; الدىڭعى بەتكە',
+'imgmultipagenext' => 'كەلەسٴى بەتكە &rarr;',
+'imgmultigo' => 'ٴوتۋ!',
+'imgmultigotopre' => 'مىنا بەتكە ٴوتۋ',
+
+# Table pager
+'ascending_abbrev' => 'ٴوسۋ',
+'descending_abbrev' => 'ÙƒÛ•Ù…Û‹',
+'table_pager_next' => 'كەلەسٴى بەتكە',
+'table_pager_prev' => 'الدىڭعى بەتكە',
+'table_pager_first' => 'العاشقى بەتكە',
+'table_pager_last' => 'سوڭعى بەتكە',
+'table_pager_limit' => 'بەت سايىن $1 دانا كٴورسەت',
+'table_pager_limit_submit' => 'ٴوتۋ',
+'table_pager_empty' => 'ەش نٴاتيجە جوق',
+
+# Auto-summaries
+'autosumm-blank' => 'بەتتٴىڭ بارلىق ماعلۇماتىن الاستاتتى',
+'autosumm-replace' => "بەتتٴى '$1' دەگەنمەن الماستىردى",
+'autoredircomment' => '[[$1]] دەگەنگە ايدادى', # This should be changed to the new naming convention, but existed beforehand
+'autosumm-new' => 'جاڭا بەت ماعلۇماتى: $1',
+);
+
?>
diff --git a/languages/messages/MessagesKk_kz.php b/languages/messages/MessagesKk_kz.php
new file mode 100644
index 00000000..2d7f7377
--- /dev/null
+++ b/languages/messages/MessagesKk_kz.php
@@ -0,0 +1,2150 @@
+<?php
+/**
+ * Kazakh (Қазақша)
+ *
+ * @package MediaWiki
+ * @subpackage Language
+ *
+ */
+
+
+$separatorTransformTable = array(
+ ',' => "\xc2\xa0",
+ '.' => ',',
+);
+
+$extraUserToggles = array(
+ 'nolangconversion'
+);
+
+$fallback8bitEncoding = 'windows-1251';
+
+$linkPrefixExtension = true;
+
+$namespaceNames = array(
+ NS_MEDIA => 'ТаÑпа',
+ NS_SPECIAL => 'Ðрнайы',
+ # NS_MAIN => '',
+ NS_TALK => 'Талқылау',
+ NS_USER => 'ҚатыÑушы',
+ NS_USER_TALK => 'ҚатыÑушы_талқылауы',
+ # NS_PROJECT set by $wgMetaNamespace
+ NS_PROJECT_TALK => '$1_талқылауы',
+ NS_IMAGE => 'Сурет',
+ NS_IMAGE_TALK => 'Сурет_талқылауы',
+ NS_MEDIAWIKI => 'МедиаУики',
+ NS_MEDIAWIKI_TALK => 'МедиаУики_талқылауы',
+ NS_TEMPLATE => 'Үлгі',
+ NS_TEMPLATE_TALK => 'Үлгі_талқылауы',
+ NS_HELP => 'Ðнықтама',
+ NS_HELP_TALK => 'Ðнықтама_талқылауы',
+ NS_CATEGORY => 'Санат',
+ NS_CATEGORY_TALK => 'Санат_талқылауы'
+);
+
+$namespaceAliases = array(
+ # Aliases to kk-tr namespaces
+ 'Taspa' => NS_MEDIA,
+ 'Arnaýı' => NS_SPECIAL,
+ 'Talqılaw' => NS_TALK,
+ 'Qatıswşı' => NS_USER,
+ 'Qatıswşı_talqılawı' => NS_USER_TALK,
+ '$1_talqılawı' => NS_PROJECT_TALK,
+ 'Swret' => NS_IMAGE,
+ 'Swret_talqılawı' => NS_IMAGE_TALK,
+ 'MedïaWïkï' => NS_MEDIAWIKI,
+ 'MedïaWïkï_talqılawı' => NS_MEDIAWIKI_TALK,
+ 'Ãœlgi' => NS_TEMPLATE,
+ 'Ülgi_talqılawı' => NS_TEMPLATE_TALK,
+ 'Anıqtama' => NS_HELP,
+ 'Anıqtama_talqılawı' => NS_HELP_TALK,
+ 'Sanat' => NS_CATEGORY,
+ 'Sanat_talqılawı' => NS_CATEGORY_TALK,
+ # Aliases to kk-cn namespaces
+ 'تاسپا' => NS_MEDIA,
+ 'ارنايى' => NS_SPECIAL,
+ 'تالقىلاۋ' => NS_TALK,
+ 'قاتىسۋشى' => NS_USER,
+ 'قاتىسۋشى_تالقىلاۋى'=> NS_USER_TALK,
+ '$1_تالقىلاۋى' => NS_PROJECT_TALK,
+ 'سۋرەت' => NS_IMAGE,
+ 'سۋرەت_تالقىلاۋى' => NS_IMAGE_TALK,
+ 'مەدياۋيكي' => NS_MEDIAWIKI,
+ 'مەدياۋيكي_تالقىلاۋى' => NS_MEDIAWIKI_TALK,
+ 'ٴۇلگٴى' => NS_TEMPLATE,
+ 'ٴۇلگٴى_تالقىلاۋى' => NS_TEMPLATE_TALK,
+ 'انىقتاما' => NS_HELP,
+ 'انىقتاما_تالقىلاۋى' => NS_HELP_TALK,
+ 'سانات' => NS_CATEGORY,
+ 'سانات_تالقىلاۋى' => NS_CATEGORY_TALK,
+);
+
+$quickbarSettings = array(
+ 'Ешқандай', 'Солға бекітілген', 'Оңға бекітілген', 'Солға қалқыған', 'Оңға қалқыған'
+);
+
+$skinNames = array(
+ 'standard' => 'Дағдылы',
+ 'nostalgia' => 'ÐÒ£Ñау',
+ 'cologneblue' => 'Көлн зеңгірлігі',
+ 'davinci' => 'Да Винчи',
+ 'mono' => 'Дара',
+ 'monobook' => 'Дара кітап',
+ 'myskin' => 'Өз мәнерім',
+ 'chick' => 'Балапан',
+ 'simple' => 'Кәдімгі'
+);
+
+$defaultDateFormat = 'ymd';
+
+$dateFormats = array(
+ 'mdy time' => 'H:i',
+ 'mdy date' => 'xg j, Y',
+ 'mdy both' => 'H:i, xg j, Y',
+
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j F, Y',
+ 'dmy both' => 'H:i, j F, Y',
+
+ 'ymd time' => 'H:i',
+ 'ymd date' => 'Y" ж." xg j',
+ 'ymd both' => 'H:i, Y" ж." xg j',
+
+ 'ISO 8601 time' => 'xnH:xni:xns',
+ 'ISO 8601 date' => 'xnY-xnm-xnd',
+ 'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+);
+
+#-------------------------------------------------------------------
+# Default messages
+#-------------------------------------------------------------------
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'Сілтемені аÑтынан Ñыз:',
+'tog-highlightbroken' => 'Жоқталған Ñілтемелерді <a href="" class="new">былай</a> пішімде (баÑқаша: былай <a href="" class="internal">?</a> ÑиÑқты).',
+'tog-justify' => 'Ежелерді ені бойынша туралау',
+'tog-hideminor' => 'Жуықтағы өзгеріÑтерде шағын түзетуді жаÑÑ‹Ñ€',
+'tog-extendwatchlist' => 'Бақылау тізімді ұлғайт (барлық жарамды өзгеріÑтерді көрÑет)',
+'tog-usenewrc' => 'Кеңейтілген Жуықтағы өзгеріÑтер (JavaScript)',
+'tog-numberheadings' => 'Бөлім тақырыптарын өздік түрде номірле',
+'tog-showtoolbar' => 'Өңдеу қуралдар жолағын көрÑет (JavaScript)',
+'tog-editondblclick' => 'ÒšÐ¾Ñ Ð½Ò±Ò›Ñ‹Ð¼Ð´Ð°Ð¿ өңдеу (JavaScript)',
+'tog-editsection' => 'Бөлімдерді [өңдеу] ÑілтемеÑімен өңдеуін ендір',
+'tog-editsectiononrightclick' => 'Бөлім атауын оң жақ нұқумен<br />өңдеуін ендір (JavaScript)',
+'tog-showtoc' => 'Мазмұнын көрÑет (3-тен артық бөлімі барыларға)',
+'tog-rememberpassword' => 'Кіргенімді бұл компьютерде ұмытпа',
+'tog-editwidth' => 'Өңдеу аумағы толық енімен',
+'tog-watchcreations' => 'Мен баÑтаған беттерді бақылау тізіміме қоÑ',
+'tog-watchdefault' => 'Мен өңдеген беттерді бақылау тізіміме қоÑ',
+'tog-minordefault' => 'Барлық түзетулерді әдепкіден шағын деп белгіле',
+'tog-previewontop' => 'Қарап шығуды өңдеу аумағының Ò¯Ñтіне Ñал',
+'tog-previewonfirst' => 'Бірінші өңдегенде қарап шығу',
+'tog-nocache' => 'Бет қоÑалқы қалтаÑын өшір',
+'tog-enotifwatchlistpages' => 'Бақыланған бет өзгергенде маған хат жібер',
+'tog-enotifusertalkpages' => 'Талқылауым өзгергенде маған хат жібер',
+'tog-enotifminoredits' => 'Шағын түзету туралы да маған хат жібер',
+'tog-enotifrevealaddr' => 'Е-пошта жайымды еÑкерту хатта ашық көрÑет',
+'tog-shownumberswatching' => 'Бақылап тұрған қатыÑушылардың Ñанын көрÑет',
+'tog-fancysig' => 'Қам қолтаңба (өздік ÑілтемеÑіз;)',
+'tog-externaleditor' => 'Сыртқы өңдеуішті әдепкіден қолдан',
+'tog-externaldiff' => 'Сыртқы айырмағышты әдепкіден қолдан',
+'tog-showjumplinks' => '«Өтіп кету» қатынау Ñілтемелерін ендір',
+'tog-uselivepreview' => 'Тура қарап шығуды қолдану (JavaScript) (Сынақ түрінде)',
+'tog-autopatrol' => 'Түзетуімді күзетке белгіле',
+'tog-forceeditsummary' => 'Өңдеу ÑипаттамаÑÑ‹ Ð±Ð¾Ñ Ò›Ð°Ð»Ò“Ð°Ð½Ð´Ð° маған еÑкерт',
+'tog-watchlisthideown' => 'Түзетуімді бақылау тізімнен жаÑÑ‹Ñ€',
+'tog-watchlisthidebots' => 'Бот түзетуін бақылау тізімнен жаÑÑ‹Ñ€',
+'tog-nolangconversion' => 'Тіл түрін аудармау',
+
+'underline-always' => 'Әрқашан',
+'underline-never' => 'Ешқашан',
+'underline-default' => 'Шолғыш бойынша',
+
+'skinpreview' => '(Қарап шығу)',
+
+# Dates
+'sunday' => 'ЖекÑенбі',
+'monday' => 'ДүйÑенбі',
+'tuesday' => 'СейÑенбі',
+'wednesday' => 'СәрÑенбі',
+'thursday' => 'БейÑенбі',
+'friday' => 'Жұма',
+'saturday' => 'Сенбі',
+'sun' => 'Жек',
+'mon' => 'Дүй',
+'tue' => 'Бей',
+'wed' => 'Сәр',
+'thu' => 'Бей',
+'fri' => 'Жұм',
+'sat' => 'Сен',
+'january' => 'қаңтар',
+'february' => 'ақпан',
+'march' => 'наурыз',
+'april' => 'cәуір',
+'may_long' => 'мамыр',
+'june' => 'мауÑым',
+'july' => 'шілде',
+'august' => 'тамыз',
+'september' => 'қыркүйек',
+'october' => 'қазан',
+'november' => 'қараша',
+'december' => 'желтоқÑан',
+'january-gen' => 'қантардың',
+'february-gen' => 'ақпанның',
+'march-gen' => 'наурыздың',
+'april-gen' => 'Ñәуірдің',
+'may-gen' => 'мамырдың',
+'june-gen' => 'мауÑымның',
+'july-gen' => 'шілденің',
+'august-gen' => 'тамыздың',
+'september-gen' => 'қыркүйектің',
+'october-gen' => 'қазанның',
+'november-gen' => 'қарашаның',
+'december-gen' => 'желтоқÑанның',
+'jan' => 'қан',
+'feb' => 'ақп',
+'mar' => 'нау',
+'apr' => 'cәу',
+'may' => 'мам',
+'jun' => 'мау',
+'jul' => 'шіл',
+'aug' => 'там',
+'sep' => 'қыр',
+'oct' => 'қаз',
+'nov' => 'қар',
+'dec' => 'жел',
+
+# Bits of text used by many pages
+'categories' => 'Барлық Ñанат тізімі',
+'pagecategories' => '{{PLURAL:$1|Санат|Санаттар}}',
+'category_header' => '«$1» Ñанатындағы беттер',
+'subcategories' => 'Төменгі Ñанаттар',
+'category-media-header' => '«$1» Ñанатындағы таÑпалар',
+
+'linkprefix' => '/^(.*?)([a-zäçéğıïñöşüýа-ÑёәіңғүұқөһA-ZÄÇÉĞİÃÑÖŞÜÃÐ-ЯÐӘІҢҒҮҰҚӨҺʺʹ«„]+)$/sDu',
+'mainpage' => 'БаÑÑ‚Ñ‹ бет',
+'mainpagetext' => "<big>'''МедиаУики бағдарламаÑÑ‹ Ñәтті орнатылды.'''</big>",
+'mainpagedocfooter' => 'Уики бағдарламаÑын пайдалану ақпараты үшін [http://meta.wikimedia.org/wiki/Help:Contents Пайдаланушы нұÑқауларымен] таныÑыңыз.
+
+== БаÑтау ==
+
+* [http://www.mediawiki.org/wiki/Help:Configuration_settings Баптау қалаулары тізімі]
+* [http://www.mediawiki.org/wiki/Help:FAQ МедиаУики ЖСЖ]
+* [http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаУики хат тарату тізімі]',
+
+'portal' => 'Қауым порталы',
+'portal-url' => '{{ns:project}}:Қауым_порталы',
+'about' => 'Біз туралы',
+'aboutsite' => '{{SITENAME}} туралы',
+'aboutpage' => '{{ns:project}}:Біз_туралы',
+'article' => 'Мағлұмат',
+'help' => 'Ðнықтама',
+'helppage' => '{{ns:help}}:Мазмұны',
+'bugreports' => 'Қате еÑептемелері',
+'bugreportspage' => '{{ns:project}}:Қате_еÑептемелері',
+'sitesupport' => 'Демеушілік',
+'sitesupport-url' => '{{ns:project}}:Жәрдем',
+'faq' => 'ЖСЖ',
+'faqpage' => '{{ns:project}}:ЖСЖ',
+'edithelp' => 'Өндеу анықтамаÑÑ‹',
+'newwindow' => '(жаңа терезеде ашылады)',
+'edithelppage' => '{{ns:help}}:Өңдеу',
+'cancel' => 'Болдырмау',
+'qbfind' => 'Табу',
+'qbbrowse' => 'Шолу',
+'qbedit' => 'Өңдеу',
+'qbpageoptions' => 'ОÑÑ‹ бет',
+'qbpageinfo' => 'Мәтін аралығы',
+'qbmyoptions' => 'Беттерім',
+'qbspecialpages' => 'Ðрнайы беттер',
+'moredotdotdot' => 'Көбірек…',
+'mypage' => 'Жеке бетім',
+'mytalk' => 'Талқылауым',
+'anontalk' => 'IP талқылауы',
+'navigation' => 'Бағыттау',
+
+# Metadata in edit box
+'metadata_help' => 'Мета-деректер (Ñ‚Ò¯Ñіндірмелер үшін [[{{ns:project}}:Мета-деректер]] бетін қараңыз):',
+
+'currentevents' => 'Ðғымдағы оқиғалар',
+'currentevents-url' => 'Ðғымдағы_оқиғалар',
+
+'disclaimers' => 'Жауапкершіліктен Ð±Ð°Ñ Ñ‚Ð°Ñ€Ñ‚Ñƒ',
+'disclaimerpage' => '{{ns:project}}:Жауапкершіліктен_баÑ_тарту',
+'privacy' => 'Жеке құпиÑÑын Ñақтау',
+'privacypage' => '{{ns:project}}:Жеке_құпиÑÑын_Ñақтау',
+'errorpagetitle' => 'Қате',
+'returnto' => '$1 дегенге оралу.',
+'tagline' => '{{GRAMMAR:ablative|{{SITENAME}}}}',
+'search' => 'Іздеу',
+'searchbutton' => 'Іздеу',
+'go' => 'Өту',
+'searcharticle' => 'Өту',
+'history' => 'Бет тарихы',
+'history_short' => 'Тарихы',
+'updatedmarker' => 'Ñоңғы кіргеннен бері жаңартылған',
+'info_short' => 'Ðқпарат',
+'printableversion' => 'БаÑып шығаруға',
+'permalink' => 'Тұрақты Ñілтеме',
+'print' => 'БаÑып шығару',
+'edit' => 'Өңдеу',
+'editthispage' => 'Бетті өңдеу',
+'delete' => 'Жою',
+'deletethispage' => 'Бетті жою',
+'undelete_short' => '{{PLURAL:$1|Бір|$1}} түзетуді қайтару',
+'protect' => 'Қорғау',
+'protectthispage' => 'Бетті қорғау',
+'unprotect' => 'Қорғамау',
+'unprotectthispage' => 'Бетті қорғамау',
+'newpage' => 'Жаңа бет',
+'talkpage' => 'Бетті талқылау',
+'specialpage' => 'Ðрнайы бет',
+'personaltools' => 'Жеке құралдар',
+'postcomment' => 'Мәндеме жіберу',
+'articlepage' => 'Мағлұмат бетін қарау',
+'talk' => 'Талқылау',
+'views' => 'КөрініÑ',
+'toolbox' => 'Құралдар',
+'userpage' => 'ҚатыÑушының бетін қарау',
+'projectpage' => 'Жоба бетін қарау',
+'imagepage' => 'Сурет бетін қарау',
+'mediawikipage' => 'Хабар бетін қарау',
+'templatepage' => 'Үлгі бетін қарау',
+'viewhelppage' => 'Ðнықтама бетін қарау',
+'categorypage' => 'Санат бетін қарау',
+'viewtalkpage' => 'Талқылау бетін қарау',
+'otherlanguages' => 'БаÑқа тілдерде',
+'redirectedfrom' => '($1 бетінен айдатылған)',
+'redirectpagesub' => 'Ðйдату беті',
+'lastmodifiedat' => 'Бұл беттің өзгертілген Ñоңғы кезі: $2, $1.', # $1 date, $2 time
+'viewcount' => 'Бұл бет {{plural:$1|бір|$1}} рет қаралған.',
+'copyright' => 'Мағлұмат $1 құжаты бойынша қатынаулы.',
+'protectedpage' => 'Қорғаулы бет',
+'jumpto' => 'Мынаған өтіп кету:',
+'jumptonavigation' => 'бағыттау',
+'jumptosearch' => 'іздеу',
+
+'badaccess' => 'РұқÑат қатеÑÑ–',
+'badaccess-group0' => 'СұраныÑқан әрекетіңізді жегуіңізге Ñ€Ò±Ò›Ñат етілмейді.',
+'badaccess-group1' => 'СұраныÑқан әрекетіңіз $1 тобының қатыÑушыларына шектеледі.',
+'badaccess-group2' => 'СұраныÑқан әрекетіңіз $1 топтары бірінің қатуÑышыларына шектеледі.',
+'badaccess-groups' => 'СұраныÑқан әрекетіңіз $1 топтары бірінің қатуÑышыларына шектеледі.',
+
+'versionrequired' => 'MediaWiki $1 нұÑқаÑÑ‹ қажет',
+'versionrequiredtext' => 'ОÑÑ‹ бетті қолдану үшін MediaWiki $1 нұÑқаÑÑ‹ қажет. [[{{ns:special}}:Version]] бетін қараңыз.',
+
+'ok' => 'Жарайды',
+'pagetitle' => '$1 — {{SITENAME}}',
+'retrievedfrom' => '«$1» дегеннен алынған',
+'youhavenewmessages' => 'Сізде $1 бар ($2).',
+'newmessageslink' => 'жаңа хабарлар',
+'newmessagesdifflink' => 'Ñоңғы өзгеріÑіне',
+'editsection' => 'өңдеу',
+'editold' => 'өңдеу',
+'editsectionhint' => 'Бөлімді өңдеу: $1',
+'toc' => 'Мазмұны',
+'showtoc' => 'көрÑет',
+'hidetoc' => 'жаÑÑ‹Ñ€',
+'thisisdeleted' => 'Қараймыз ба, не қайтарамыз ба?: $1',
+'viewdeleted' => 'Қараймыз ба?: $1',
+'restorelink' => 'жойылған {{PLURAL:$1|бір|$1}} түзету',
+'feedlinks' => 'Ðрна:',
+'feed-invalid' => 'ЖарамÑыз жазылым арна түрі.',
+
+# Short words for each namespace, by default used in the 'article' tab in monobook
+'nstab-main' => 'Мағлұмат',
+'nstab-user' => 'Жеке беті',
+'nstab-media' => 'ТаÑпа беті',
+'nstab-special' => 'Ðрнайы',
+'nstab-project' => 'Жоба беті',
+'nstab-image' => 'Файл',
+'nstab-mediawiki' => 'Жүйе хабары',
+'nstab-template' => 'Үлгі',
+'nstab-help' => 'Ðнықтама',
+'nstab-category' => 'Санат',
+
+# Main script and global functions
+'nosuchaction' => 'Мұндай әрекет жоқ',
+'nosuchactiontext' => 'ОÑÑ‹ URL жайымен енгізілген әрекетті
+оÑÑ‹ уики жорамалдап білмеді.',
+'nosuchspecialpage' => 'Бұл арнайы бет емеÑ',
+'nospecialpagetext' => 'Сіз ÑұраныÑқан арнайы бет жарамÑыз. Барлық жарамды арнайы беттер тізімін [[{{ns:special}}:Specialpages]] бетінде таба алаÑыз.',
+
+# General errors
+'error' => 'Қате',
+'databaseerror' => 'Дерекқордың қатеÑÑ–',
+'dberrortext' => 'Дерекқорға ÑÒ±Ñ€Ð°Ð½Ñ‹Ñ Ð¶Ð°Ñалғанда ÑинтакÑÐ¸Ñ Ò›Ð°Ñ‚ÐµÑÑ– кездеÑÑ‚Ñ–.
+Бұл бағдарламаның қатеÑін көрÑету мүмкін.
+Дерекқорға Ñоңғы болған ÑұраныÑ:
+<blockquote><tt>$1</tt></blockquote>
+мына функциÑÑынан «<tt>$2</tt>».
+MySQL қайтарған қатеÑÑ– «<tt>$3: $4</tt>».',
+'dberrortextcl' => 'Дерекқорға ÑÒ±Ñ€Ð°Ð½Ñ‹Ñ Ð¶Ð°Ñалғанда ÑинтакÑÐ¸Ñ Ò›Ð°Ñ‚ÐµÑÑ– кездеÑÑ‚Ñ–.
+Дерекқорға Ñоңғы болған ÑұраныÑ:
+«$1»
+мына функциÑÑынан: «$2».
+MySQL қайтарған қатеÑÑ– «$3: $4»',
+'noconnect' => 'Ғафу етіңіз! Бұл уикиде кейбір техникалық қиыншылықтар кездеÑÑ‚Ñ–, Ñондықтан дерекқор Ñерверіне қатынаÑу алмайды. <br />
+$1',
+'nodb' => '$1 дерекқоры талғанбады',
+'cachederror' => 'Төменде Ñұранған беттің қоÑалқы қалтадағы көшірмеÑÑ–, оÑÑ‹ бет жаңартылмаған болуы мүмкін.',
+'laggedslavemode' => 'Ðазар Ñалыңыз: Бетте жуықтағы жаңалаулар болмауы мүмкін.',
+'readonly' => 'Дерекқоры құлыпталған',
+'enterlockreason' => 'Құлыптау Ñебебін енгізіңіз, қай уақытқа дейін
+құлыпталғанын қоÑа',
+'readonlytext' => 'Ðғымда дерекқор жаңа жазба және тағы баÑқа өзгеріÑтер жаÑаудан құлыпталынған. Бұл дерекқорды жөндету бағдарламаларын орындау үшін болуы мүмкін, бұны бітіргеннен Ñоң қаліпті Ñ–Ñке қайтарылады.
+
+Құлыптаған әкімші бұны былай Ñ‚Ò¯Ñіндіреді: $1',
+'missingarticle' => 'ІздеÑтірілген «$1» атаулы бет мәтіні дерекқорда табылмады.
+
+Бұл дағдыда еÑкірген айырма ÑілтемеÑіне немеÑе жойылған бет тарихының ÑілтемеÑіне
+ергеннен болуы мүмкін.
+
+Егер бұл болжам Ð´Ò±Ñ€Ñ‹Ñ Ñебеп болмаÑа, бағдарламамыздағы қатеге тап болуыңыз мүмкін.
+Бұл туралы нақты URL жайын көрÑетіп әкімшіге еÑептеме жіберіңіз.',
+'readonly_lag' => 'Жетек дерекқор Ñерверлер баÑтауышпен қадамланғанда оÑÑ‹ дерекқор өздік түрінде құлыпталынған',
+'internalerror' => 'Ішкі қате',
+'filecopyerror' => '«$1» файлы «$2» файлына көшірілмеді.',
+'filerenameerror' => '«$1» файл аты «$2» атына өзгертілмеді.',
+'filedeleteerror' => '«$1» файлы жойылмайды.',
+'filenotfound' => '«$1» файлы табылмады.',
+'unexpected' => 'Күтілмеген мағына: «$1» = «$2».',
+'formerror' => 'Қате: жіберу үлгіті емеÑ',
+'badarticleerror' => 'ОÑындай әрекет мына бетте атқарылмайды.',
+'cannotdelete' => 'Ðйтылмыш бет не Ñурет жойылмайды. (Бұны баÑқа біреу жойған шығар.)',
+'badtitle' => 'ЖарамÑыз атау',
+'badtitletext' => 'СұраныÑқан бет атауы жарамÑыз, боÑ, тілара ÑілтемеÑÑ– не уики-ара атауы мүлтік болған. Ðтауларда Ñүемелдемеген бірқатар әріптер болуы мүмкін.',
+'perfdisabled' => 'Ғафу етіңіз! ОÑÑ‹ қаÑиет, дерекқордың жылдамылығына Ó™Ñер етіп, ешкімге уикиді пайдалануға бермегеÑін, уақытша өшірілген.',
+'perfdisabledsub' => 'Мында $1 бетінің Ñақталған көшірмеÑÑ–:', # obsolete?
+'perfcached' => 'КелеÑÑ– дерек қоÑалқы қалтаÑынан алынған, Ñондықтан толықтай жаңаланмаған болуы мүмкін.',
+'perfcachedts' => 'КелеÑÑ– дерек қоÑалқы қалтаÑынан алынған, Ñоңғы жаңаланлған кезі: $1.',
+'wrong_wfQuery_params' => 'wfQuery() функциÑÑында жарамÑыз баптар<br />
+ФункциÑ: $1<br />
+СұраныÑ: $2',
+'viewsource' => 'Қайнарын қарау',
+'viewsourcefor' => '$1 қайнары',
+'protectedtext' => 'Бұл бет өңдеу болдырмау үшін құлыпталынған.
+
+Бұл беттің қайнарын қарауыңызға және көшіріп алуңызға болады:',
+'protectedinterface' => 'Бұл бет бағдарламаның тілдеÑу мәтінін жетіÑтіреді, Ñондықтан қиÑнат келтірмеу үшін өзгертуі құлыпталған.',
+'editinginterface' => "'''Ðазар Ñалыңыз:''' Бағдарламаға тілдеÑу мәтінін жетіÑтіретін MediaWiki бетін өңдеп жатырÑыз. Бұл беттің өзгертуі барлық пайдаланушылар тілдеÑуіне Ó™Ñер етеді.",
+'sqlhidden' => '(SQL ÑұраныÑÑ‹ жаÑырылды)',
+
+# Login and logout pages
+'logouttitle' => 'ҚатыÑушы шығуы',
+'logouttext' => '<strong>Енді жүйеден шықтыңыз.</strong><br />
+Бұл компьютерден әлі де жүйеге кірмеÑтен {{SITENAME}} жобаÑын
+шолуыңыз мүмкін, немеÑе баÑқа пайдаланушының жүйеге кіруі мүмкін.
+Кейбір беттерде әлі де жүйеге кіргеніңіздей көрінуі мүмкіндігін
+еÑкертеміз; бұл шолғыштың қоÑалқы қалтаÑын боÑату арқылы шешіледі.',
+'welcomecreation' => '== Қош келдіңіз, $1! ==
+
+Тіркелгіңіз жаÑалды. {{SITENAME}} баптауыңызды қалауыңызбен өзгертуді ұмытпаңыз.',
+'loginpagetitle' => 'ҚатыÑушы кіруі',
+'yourname' => 'ҚатыÑушы атыңыз',
+'yourpassword' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзіңіз',
+'yourpasswordagain' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзді қайталап енгізіңіз',
+'remembermypassword' => 'Менің кіргенімді бұл компьютерде ұмытпа',
+'yourdomainname' => 'Желі үйшігіңіз',
+'externaldberror' => 'ОÑында Ñыртқы теңдеÑтіру дерекқорында қате болды, немеÑе Ñыртқы тіркелгіңізді жаңалауға Ñ€Ò±Ò›Ñат жоқ.',
+'loginproblem' => '<b>Кіруіңіз кезінде оÑында қиындыққа тап болдық.</b><br />Тағы да қайталап қараңыз.',
+'alreadyloggedin' => '<strong>$1 деген қатыÑушы, кіріпÑіз түге!<strong><br />',
+'login' => 'Кіру',
+'loginprompt' => '{{SITENAME}} торабына кіру үшін «cookies» қаÑиетін ендіруіңіз қажет.',
+'userlogin' => 'Кіру / Тіркелгі жаÑау',
+'logout' => 'Шығу',
+'userlogout' => 'Шығу',
+'notloggedin' => 'КірмегенÑіз',
+'nologin' => 'Тіркелгіңіз жоқ па? $1.',
+'nologinlink' => 'ЖаÑаңыз',
+'createaccount' => 'Тіркелгі жаÑа',
+'gotaccount' => 'Тіркелгіңіз бар ма? $1.',
+'gotaccountlink' => 'Кіріңіз',
+'createaccountmail' => 'е-поштамен',
+'badretype' => 'Енгізген Ò›Ò±Ð¿Ð¸Ñ Ñөздеріңіз бір біріне ÑÓ™Ð¹ÐºÐµÑ ÐµÐ¼ÐµÑ.',
+'userexists' => 'Енгізген қатыÑушы атыңызды біреу пайдаланып жатыр. БаÑқа атау тандаңыз.',
+'youremail' => 'Е-пошта жайыңыз *:',
+'username' => 'ҚатыÑушы атыңыз:',
+'uid' => 'ҚатыÑушы теңдеÑтіруіңіз:',
+'yourrealname' => 'Шын атыңыз *:',
+'yourlanguage' => 'Тіліңіз:',
+'yourvariant' => 'Түрі',
+'yournick' => 'Лақап атыңыз:',
+'badsig' => 'Қам қолтаңбаңыз жарамÑыз; HTML белгішелерін текÑеріңіз.',
+'email' => 'Е-поштаңыз',
+'prefs-help-email-enotif' => 'Егер Ñоны баптаÑаңыз, оÑÑ‹ е-пошта жайы Ñізге еÑкерту хат жіберуге қолданылады.',
+'prefs-help-realname' => '* Шын атыңыз (міндетті емеÑ): енгізÑеңіз, шығармаңыздың ауторлығын белгілеуі үшін қолданылады.',
+'loginerror' => 'Кіру қатеÑÑ–',
+'prefs-help-email' => '* Е-поштаңыз (міндетті емеÑ): «ҚатыÑушы» немеÑе «қатыÑушы талқылау» бетіңіздер арқылы баÑқаларға байланыÑу мүмкіндік береді. Өзіңіздің кім екеніңізді білдіртпейді.',
+'nocookiesnew' => 'ҚатыÑушы тіркелгіÑÑ– жаÑалды, тек әлі кірмегенÑіз. {{SITENAME}} жобаÑына қатыÑушы кіру үшін «cookies» қаÑиеті қажет. Шолғышыңызда «cookies» қаÑиеті өшірілген. Соны ендіріңіз де жаңа қатыÑушы атыңызды және Ò›Ò±Ð¿Ð¸Ñ Ñөзіңізді енгізіп кіріңіз.',
+'nocookieslogin' => 'ҚатыÑушы кіру үшін {{SITENAME}} жобаÑÑ‹ «cookies» қаÑиетін қолданады. Шолғышыңызда «cookies» қаÑиеті өшірілген. Соны ендіріңіз де қайталап кіріңіз.',
+'noname' => 'ҚатыÑушы атын Ð´Ò±Ñ€Ñ‹Ñ ÐµÐ½Ð³Ñ–Ð·Ð±ÐµÐ´Ñ–Ò£Ñ–Ð·.',
+'loginsuccesstitle' => 'Кіруіңіз Ñәтті Ó©Ñ‚Ñ‚Ñ–',
+'loginsuccess' => "'''Сіз енді {{SITENAME}} жобаÑына «$1» ретінде кіріп отырÑыз.'''",
+'nosuchuser' => 'Мында «$1» атаулы қатыÑушы жоқ. Емлеңізді текÑеріңіз, немеÑе жаңа тіркелгі жаÑаңыз.',
+'nosuchusershort' => 'Мында «$1» деген қатыÑушы атауы жоқ. Емлеңізді текÑеріңіз.',
+'nouserspecified' => 'ҚатыÑушы атын енгізіуіңіз қажет.',
+'wrongpassword' => 'Енгізген Ò›Ò±Ð¿Ð¸Ñ Ñөз жарамÑыз. Қайталап көріңіз.',
+'wrongpasswordempty' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөз боÑÑ‚Ñ‹ бопты. Қайталап көріңіз.',
+'mailmypassword' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзімді хатпен жібер',
+'passwordremindertitle' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөз туралы {{SITENAME}} жобаÑының еÑкертуі',
+'passwordremindertext' => 'Кейбіреу (IP жайы: $1, бәлкім, өзіңіз боларÑыз)
+{{SITENAME}} үшін бізден жаңа Ò›Ò±Ð¿Ð¸Ñ Ñөзін жіберуін ÑұраныÑқан ($4).
+«$2» қатыÑушының Ò›Ò±Ð¿Ð¸Ñ Ñөзі «$3» болды енді.
+Қазір кіруіңіз және Ò›Ò±Ð¿Ð¸Ñ Ñөзіңізді ауыÑтруыңыз қажет.
+
+Егер баÑқа біреу бұл ÑұраныÑÑ‚Ñ‹ жаÑаÑа, немеÑе Ò›Ò±Ð¿Ð¸Ñ Ñөзіңізді ұмытÑаңыз да,
+және бұны өзгерткіңіз келмеÑе де, оÑÑ‹ хабарламаға аңғармауыңызға да болады,
+еÑкі Ò›Ò±Ð¿Ð¸Ñ Ñөзіңізді әріғарай қолданып.',
+'noemail' => 'Мында «$1» қатыÑушының е-поштаÑÑ‹ жоқ.',
+'passwordsent' => 'Жаңа Ò›Ò±Ð¿Ð¸Ñ Ñөз «$1» үшін
+тіркелген е-пошта жайына жіберілді.
+Қабылдағаннан кейін кіргенде Ñоны енгізіңіз.',
+'blocked-mailpassword' => 'IP жайыңыздан өңдеу бұғатталған, Ñондықтан
+қиÑнатшылықтан Ñақтану үшін Ò›Ò±Ð¿Ð¸Ñ Ñөз жіберу қызметінің әрекеті Ñ€Ò±Ò›Ñат етілмейді.',
+'eauthentsent' => 'Куәландыру хаты аталған е-пошта жайына жіберілді.
+БаÑқа е-пошта хатын жіберудің алдынан, тіркелгі шынынан Ñіздікі екенін
+куәландыру үшін хаттағы нұÑқауларға еріңіз.',
+'throttled-mailpassword' => 'Соңғы $1 Ñағатта Ò›Ò±Ð¿Ð¸Ñ Ñөз еÑкерту хаты жіберілді түге.
+ҚиÑнатшылыққа кедергі болу үшін, $1 Ñағат Ñайын тек бір ғана Ò›Ò±Ð¿Ð¸Ñ Ñөз еÑкерту
+хаты жіберіледі.',
+'mailerror' => 'Хат жіберу қатеÑÑ–: $1',
+'acct_creation_throttle_hit' => 'Ғафу етіңіз, Ñіз $1 тіркелгі жаÑапÑыз түге. Онан артық Ñ–Ñтей алмайÑыз.',
+'emailauthenticated' => 'Е-пошта жайыңыз куәландырылған кезі: $1.',
+'emailnotauthenticated' => 'Е-пошта жайыңыз әлі куәландырған жоқ.
+Төмендегі қаÑиетттер үшін ешқандай хат жіберілмейді.',
+'noemailprefs' => 'ОÑÑ‹ қаÑиеттер Ñ–Ñтеуі үшін е-пошта жайыңызды енгізіңіз.',
+'emailconfirmlink' => 'Е-пошта жайыңызды куәландырыңыз',
+'invalidemailaddress' => 'ОÑÑ‹ е-пошта жайда жарамÑыз пішім болған, қабыл етілмейді.
+Ð”Ò±Ñ€Ñ‹Ñ Ð¿Ñ–ÑˆÑ–Ð¼Ð´ÐµÐ»Ð³ÐµÐ½ жайды енгізіңіз, не аумақты Ð±Ð¾Ñ Ò›Ð°Ð»Ð´Ñ‹Ñ€Ñ‹Ò£Ñ‹Ð·.',
+'accountcreated' => 'Тіркелгі жаÑалды',
+'accountcreatedtext' => '$1 үшін қатыÑушы тіркелгіÑÑ– жаÑалды.',
+
+# Edit page toolbar
+'bold_sample' => 'Жуан мәтін',
+'bold_tip' => 'Жуан мәтін',
+'italic_sample' => 'Қиғаш мәтін',
+'italic_tip' => 'Қиғаш мәтін',
+'link_sample' => 'Сілтеме атауы',
+'link_tip' => 'Ішкі Ñілтеме',
+'extlink_sample' => 'http://www.example.com Ñілтеме атауы',
+'extlink_tip' => 'Сыртқы Ñілтеме (алдынан http:// енгізуін ұмытпаңыз)',
+'headline_sample' => 'Тақырып мәтіні',
+'headline_tip' => '1-ші деңгейлі тақырып',
+'math_sample' => 'Формуланы мында енгізіңіз',
+'math_tip' => 'Математика формулаÑÑ‹ (LaTeX)',
+'nowiki_sample' => 'Пішімделмейтін мәтінді оÑында енгізіңіз',
+'nowiki_tip' => 'Уики пішімін елемеу',
+'image_sample' => 'Example.jpg',
+'image_tip' => 'Кіріктірілген Ñурет',
+'media_sample' => 'Example.ogg',
+'media_tip' => 'ТаÑпа файлының ÑілтемеÑÑ–',
+'sig_tip' => 'Қолтаңбаңыз және уақыт белгіÑÑ–',
+'hr_tip' => 'Дерелей Ñызық (үнемді қолданыңыз)',
+
+# Edit pages
+'summary' => 'СипаттамаÑÑ‹',
+'subject' => 'Тақырыбы/баÑÑ‹',
+'minoredit' => 'Бұл шағын түзету',
+'watchthis' => 'Бетті бақылау',
+'savearticle' => 'Бетті Ñақта!',
+'preview' => 'Қарап шығу',
+'showpreview' => 'Қарап шығу',
+'showlivepreview' => 'Тура қарап шығу',
+'showdiff' => 'ӨзгеріÑтерді көрÑет',
+'anoneditwarning' => "'''Ðазар Ñалыңыз:''' Сіз жүйеге кірмегенÑіз. IP жайыңыз бұл беттің өңдеу тарихында жазылып алынады.",
+'missingsummary' => "'''ЕÑкерту:''' Түзету ÑипаттамаÑын енгізбепÑіз. «Сақтау» түймеÑін тағы баÑÑаңыз, түзетуіңіз мәндемеÑіз Ñақталады.",
+'missingcommenttext' => 'Төменде мәндемеңізді енгізіңіз.',
+'missingcommentheader' => "'''ЕÑкерту:''' Бұл мәндемеге тақырып/баÑжол жетіÑтірмепÑіз. Егер тағы да Сақтау түймеÑін нұқыÑаңыз, түзетуіңіз ÑолÑыз Ñақталады.",
+'summary-preview' => 'СипаттамаÑын қарап шығу',
+'subject-preview' => 'Тақырыбын/баÑын қарап шығу',
+'blockedtitle' => 'Пайдаланушы бұғатталған',
+'blockedtext' => "<big>'''ҚатыÑушы атыңыз не IP жайыңыз бұғатталған.'''</big>
+
+бұғаттауды $1 Ñ–Ñтеген. Белгіленген Ñебебі: ''$2''.
+
+ОÑÑ‹ бұғаттауды талқылау үшін $1 дегенмен не баÑқа [[{{ns:project}}:Әкімшілер|әкімшімен]] қатынаÑуыңызға болады.
+[[{{ns:special:Preferences|Тіркелгі баптауларын]] қолданып жарамды е-пошта жайын енгізгенше дейін
+«ҚатыÑушыға хат жазу» қаÑиетін пайдаланылмайÑыз. Ðғымдық IP жайыңыз $3 болған. Бұны әрбір ÑұраныÑыңызға қоÑыңыз.",
+'blockedoriginalsource' => "Төменде '''$1''' дегеннің қайнары көрÑетіледі:",
+'blockededitsource' => "Төменде '''$1''' дегенге жаÑалған '''түзетуңіздің''' мәтіні көрÑетіледі:",
+'whitelistedittitle' => 'Өңдеу үшін кіруіңіз жөн.',
+'whitelistedittext' => 'Беттерді өңдеу үшін $1 жөн.',
+'whitelistreadtitle' => 'Оқу үшін кіруіңіз жөн',
+'whitelistreadtext' => 'Беттерді оқу үшін [[{{ns:special}}:Userlogin|кіруіңіз]] жөн.',
+'whitelistacctitle' => 'Сізге тіркелгі жаÑауға Ñ€Ò±Ò›Ñат берілмеген',
+'whitelistacctext' => 'ОÑÑ‹ уикиде баÑқаларға тіркелгі жаÑау үшін [[{{ns:Special}}:Userlogin|кіруіңіз]] қажет және жанаÑымды Ñ€Ò±Ò›Ñаттарын билеу қажет.',
+'confirmedittitle' => 'Е-пошта жайын куәландыру хатын қайта өңдеу қажет',
+'confirmedittext' => 'Беттерді өңдеу үшін алдын ала Е-пошта жайыңызды куәландыруыңыз қажет. Жайыңызды [[{{ns:Special}}:Preferences|қатыÑушы баптауы]] арқылы енгізіңіз және текÑерткіңіз.',
+'loginreqtitle' => 'Кіруіңіз қажет',
+'loginreqlink' => 'кіру',
+'loginreqpagetext' => 'БаÑқа беттерді көру үшін Ñіз $1 болуыңыз қажет.',
+'accmailtitle' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөз жіберілді.',
+'accmailtext' => '$2 жайына «$1» Ò›Ò±Ð¿Ð¸Ñ Ñөзі жіберілді.',
+'newarticle' => '(Жаңа)',
+'newarticletext' => 'Сілтемеге еріп әлі баÑталмаған бетке
+келіпÑіз. Бетті баÑтау үшін, төмендегі аумақта мәтініңізді
+теріңіз (көбірек ақпарат үшін [[{{ns:help}}:Мазмұны|көмек бетін]]
+қараңыз).Егер жаңылғаннан оÑында келген болÑаңыз, шолғышыңыз
+«Ðртқа» деген түймеÑін нұқыңыз.',
+'anontalkpagetext' => "----''Бұл тіркелгіÑіз (немеÑе тіркелгіÑін қолданбаған) пайдаланушының талқылау беті. ОÑÑ‹ пайдаланушыны біз тек Ñандық IP жайымен теңдеÑтіреміз. ОÑындай IP жайлар бірнеше пайдаланушыға ортақ болуы мүмкін. Егер Ñіз тіркелгіÑіз пайдаланушы болÑаңыз және Ñізге қатыÑÑыз мәндемелер жіберілгенін ÑезÑеңіз, баÑқа тіркелгіÑіз пайдаланушылармен аралаÑтырмауы үшін [[{{ns:special}}:Userlogin|тіркелгі жаÑаңыз не кіріңіз]].''",
+'noarticletext' => 'Бұл бетте ағымда еш мәтін жоқ, баÑқа беттерден оÑÑ‹ бет атауын [[{{ns:special}}:Search/{{PAGENAME}}|іздеп көруіңізге]] немеÑе оÑÑ‹ бетті [{{fullurl:{{FULLPAGENAME}}|action=edit}} түзетуіңізге] болады.',
+'clearyourcache' => "'''Ðңғартпа:''' Сақтағаннан кейін өзгеріÑтерді көру үшін шолғыш қоÑалқы қалтаÑын боÑату керегі мүмкін. '''Mozilla / Safari:''' ''Shift'' пернеÑін баÑып тұрып ''Reload'' (''Қайта жүктеу'') түймеÑін нұқыңыз (не ''Ctrl-Shift-R'' баÑыңыз); ''IE:'' ''Ctrl-F5'' баÑыңыз; '''Opera / Konqueror''' ''F5'' пернеÑін баÑыңыз.",
+'usercssjsyoucanpreview' => '<strong>БаÑалқы:</strong> Сақтау алдында жаңа CSS/JS файлын текÑеру үшін «Қарап шығу» түймеÑін қолданыңыз.',
+'usercsspreview' => "'''Мынау CSS мәтінін тек қарап шығу екенін ұмытпаңыз, ол әлі Ñақталған жоқ!'''",
+'userjspreview' => "'''Мынау JavaScript қатыÑушы бағдарламаÑын текÑеру/қарап шығу екенін ұмытпаңыз, ол әлі Ñақталған жоқ!'''",
+'userinvalidcssjstitle' => "'''Ðазар Ñалыңыз:''' Мында «$1» атаулы безендіру мәнері жоқ. Пайдаланушының .css және .js файл атауы кіші әріпппен жазылатынын ұмытпаңыз, мыÑалға {{ns:user}}:Foo/monobook.css дегенді {{ns:user}}:Foo/Monobook.css дегенмен ÑалыÑтырыңыз.",
+'updated' => '(Жаңартылған)',
+'note' => '<strong>Ðңғартпа:</strong>',
+'previewnote' => '<strong>Мынау тек қарап шығу екенін ұмытпаңыз; түзетулер әлі Ñақталған жоқ!</strong>',
+'session_fail_preview' => '<strong>Ғафу етіңіз! СеÑÑÐ¸Ñ Ð´ÐµÑ€ÐµÐºÑ‚ÐµÑ€Ñ– Ñ‹Ñырап қалғандықтан өңдеуіңізді жөндей алмаймыз.
+Мәтініңізді Ñақтап қайталап көріңіз. Егер әлі Ñ–Ñ Ó©Ñ‚Ð¿ÐµÐ¹Ñ‚Ñ–Ð½ болÑа, шығып және кері кіріп көріңіз.</strong>',
+'previewconflict' => 'Бұл қарап шығу жоғарыдағы өңдеу аумағындағы мәтінге Ñақтаған кезіндегі дей ықпал етеді.',
+'session_fail_preview_html' => "<strong>Ғафу етіңіз! СеÑÑÐ¸Ñ Ð´ÐµÑ€ÐµÐºÑ‚ÐµÑ€Ñ– Ñ‹Ñырап қалғандықтан өңдеуіңізді жөндей алмаймыз.</strong>
+
+''ОÑÑ‹ уикиде қам HTML ендірілген, JavaScript шабуылдардан қорғану үшін алдын ала қарап шығу жаÑырылған.''
+
+<strong>Егер бұл өңдеу адал талап болÑа, қайтарып көріңіз. Егер әлі де Ñ–ÑтемеÑе, шығып, ÑоÑын кері кіріп көріңіз.</strong>",
+'importing' => 'Сырттан алуда: $1',
+'editing' => 'Өңдеуде: $1',
+'editinguser' => 'ҚатыÑушыны өңдеуде: <b>$1</b>',
+'editingsection' => 'Өңдеуде: $1 (бөлімі)',
+'editingcomment' => 'Өңдеуде: $1 (мәндемеÑÑ–)',
+'editconflict' => 'Өңдеу егеÑÑ–: $1',
+'explainconflict' => 'ОÑÑ‹ бетті Ñіз өңдей баÑтағанда баÑқа кейбіреу бетті өзгерткен.
+Жоғарғы аумақта беттің ағымдық мәтіні бар.
+Төменгі аумақта Ñіз өзгерткен мәтіні көрÑетіледі.
+Өзгертуіңізді ағымдық мәтінге Ò¯Ñтеуіңіз жөн.
+"Бетті Ñақта!" түймеÑіне баÑқанда
+<b>тек</b> жоғарғы аумақтағы мәтін Ñақталады.<br />',
+'yourtext' => 'Мәтініңіз',
+'storedversion' => 'Сақталған нұÑқаÑÑ‹',
+'nonunicodebrowser' => '<strong>ÐÒ¢Ò’ÐРТПÐ: Шолғышыңыз Unicode белгілеуіне үйлеÑімді емеÑ, Ñондықтан латын ÐµÐ¼ÐµÑ Ó™Ñ€Ñ–Ð¿Ñ‚ÐµÑ€Ñ– бар беттерді өңдеу зіл болу мүмкін. Ð–Ò±Ð¼Ñ‹Ñ Ñ–Ñтеуге ықтималдық беру үшін, <strong>төменгі өңдеу аумағында ASCII ÐµÐ¼ÐµÑ Ó™Ñ€Ñ–Ð¿Ñ‚ÐµÑ€ оналтылық Ñанымен көрÑетіледі</strong>.',
+'editingold' => '<strong>ÐÒ¢Ò’ÐРТПÐ: ОÑÑ‹ беттің ертерек нұÑқаÑын
+өңдеп жатырÑыз.
+Бұны ÑақтаÑаңыз, оÑÑ‹ нуÑқадан Ñоңғы барлық түзетулер жойылады.</strong>',
+'yourdiff' => 'Ðйырмалар',
+'copyrightwarning' => '{{SITENAME}} жобаÑына қоÑылған бүкіл Ò¯Ð»ÐµÑ $2 (көбірек ақпарат үшін: $1) құжатына Ñай жіберілген болып Ñаналады. Егер жазуыңыздың еркін көшіріліп түзетілуін қаламаÑаңыз, мында Ò±Ñынбауыңыз жөн.<br />
+Тағы, қоÑқан үлеÑіңіз - өзіңіздің жазғанығыз, не ашық ақпарат көздерінен алынған мағлұмат болғанын уәде етеÑіз.<br />
+<strong>ÐВТОРЛЫҚ ҚҰҚЫҚПЕРҚОРҒÐУЛЫ ÐҚПÐРÐТТЫ РҰҚСÐТСЫЗ ҚОСПÐҢЫЗ!</strong>',
+'copyrightwarning2' => 'ЕÑте тұрÑын: барлық {{SITENAME}} жобаÑына берілген үлеÑтер баÑқа ÑƒÐ»ÐµÑ Ð±ÐµÑ€ÑƒÑˆÑ–Ð»ÐµÑ€Ð¼ÐµÐ½ түзетуге, өзгертуге, не алаÑтануға мүмкін. ÐлғыÑÑыз түзетуге енжарлан болÑаңыз, онда шығармаңызды мында жариÑламаңыз.<br />
+Тағы, оÑыны өзіңіз жазғаныңызды, не барша қазынаÑынан, немеÑе Ñондай-ақ ақыÑыз ашық қайнарынан көшіргеніңізді
+дәл оÑындай бізге міндеттеме береÑіз (көбірек ақпарат үшін $1 қужатын қараңыз).<br />
+<strong>ÐУТОРЛЫҚ ҚҰҚЫҚПЕРҚОРҒÐУЛЫ ÐҚПÐРÐТТЫ РҰҚСÐТСЫЗ ҚОСПÐҢЫЗ!</strong>',
+'longpagewarning' => '<strong>ÐÐЗÐР СÐЛЫҢЫЗ: Бұл беттің мөлшері — $1 килобайт; кейбір
+шолғыштарда бет мөлшері 32 кБ жетÑе не оны аÑÑа өңдеу күрделі болуы мүмкін.
+Бетті бірнеше кішкін бөлімдерге бөліп көріңіз.</strong>',
+'longpageerror' => '<strong>ÒšÐТЕ: Жіберетін мәтініңіздін мөлшері — $1 кБ, ең көбі $2 кБ
+Ñ€Ò±Ò›Ñат етілген мөлшерінен аÑқан. Бұл Ñақтай алынбайды.</strong>',
+'readonlywarning' => '<strong>ÐÐЗÐР СÐЛЫҢЫЗ: Дерекқор жөндету үшін құлыпталған,
+Ñондықтан дәл қазір түзетуіңізді Ñақтай алмайÑыз. СоÑын қолдануға үшін мәтәніңізді көшіріп,
+өз компүтеріңізде файлға Ñақтаңыз.</strong>',
+'protectedpagewarning' => '<strong>ÐÐЗÐР СÐЛЫҢЫЗ: Бұл бет қорғалған. Тек әкімші Ñ€Ò±Ò›Ñаты бар қатыÑушылар өңдеу жаÑай алады.</strong>',
+'semiprotectedpagewarning' => "'''Ðңғартпа:''' Бет [[{{ns:project}}:Жартылай қорғау ÑаÑÑаты|қорғалған]], Ñондықтан оÑыны тек Ñ€Ò±Ò›Ñаты бар қатыÑушылар өңдей алады.",
+'templatesused' => 'Бұл бетте қолданылған үлгілер:',
+'templatesusedpreview' => 'Бұны қарап шығуға қолданылған үлгілер:',
+'templatesusedsection' => 'Бұл бөлімде қолданылған үлгілер:',
+'edittools' => '<!-- Мындағы мағлұмат өңдеу және қотару үлгіттріңің аÑтында көрÑетіледі. -->',
+'nocreatetitle' => 'Бетті баÑтау шектелген',
+'nocreatetext' => 'Бұл торапта жаңа бет баÑтауы шектелген.
+Кері қайтып бар бетті өңдеуіңізге болады, немеÑе [[{{ns:special}}:Userlogin|кіруіңізге не тіркелгі жаÑауға]] болады.',
+'cantcreateaccounttitle' => 'Тіркелгі жаÑалмады',
+'cantcreateaccounttext' => 'ОÑÑ‹ IP жайдан (<b>$1</b>) тіркелгі жаÑауы бұғатталған.
+Бәлкім Ñебебі, оқу орныңыздан, немеÑе Интернет жеткізушіден
+үзбей бұзақылық болғаны.',
+
+# History pages
+'revhistory' => 'ÐÒ±Ñқалар тарихы',
+'viewpagelogs' => 'ОÑÑ‹ бетке қатыÑÑ‚Ñ‹ журналдарды қарау',
+'nohistory' => 'ОÑÑ‹ беттінің нұÑқалар тарихы жоқ.',
+'revnotfound' => 'ÐÒ±Ñқа табылмады',
+'revnotfoundtext' => 'ОÑÑ‹ ÑұраныÑқан беттің еÑкі нұÑқаÑÑ‹ табылған жоқ.
+ОÑÑ‹ бетті ашуға пайдаланған URL жайын қайта текÑеріп шығыңыз.',
+'loadhist' => 'Бет тарихын жүктеуі',
+'currentrev' => 'Ðғымдық нұÑқаÑÑ‹',
+'revisionasof' => '$1 кезіндегі нұÑқаÑÑ‹',
+'revision-info' => '$1 кезіндегі $2 жаÑаған нұÑқаÑÑ‹',
+'previousrevision' => '↠ЕÑкілеу нұÑқаÑÑ‹',
+'nextrevision' => 'Жаңалау нұÑқаÑÑ‹ →',
+'currentrevisionlink' => 'Ðғымдық нұÑқаÑÑ‹',
+'cur' => 'ағым.',
+'next' => 'кел.',
+'last' => 'Ñоң.',
+'orig' => 'түп.',
+'histlegend' => 'ÐйырмаÑын көру: ÑалыÑтырамын деген нұÑқаларды таңдап, не <Enter> пернеÑін, не төмендегі түймені баÑыңыз.<br />
+Шартты белгілер: (ағым.) = ағымдық нұÑқамен айырмаÑÑ‹,
+(Ñоң.) = алдыңғы нұÑқамен айырмаÑÑ‹, ш = шағын түзету',
+'deletedrev' => '[жойылған]',
+'histfirst' => 'Ең алғашқыÑына',
+'histlast' => 'Ең ÑоңғыÑына',
+'rev-deleted-comment' => '(мәндеме алаÑтатылды)',
+'rev-deleted-user' => '(қатыÑушы аты алаÑтатылды)',
+'rev-deleted-text-permission' => '<div class="mw-warning plainlinks">
+ОÑÑ‹ беттің нұÑқаÑÑ‹ Ð¶Ð°Ñ€Ð¸Ñ Ð¼Ò±Ñ€Ð°Ò“Ð°Ñ‚Ñ‚Ð°Ñ€Ñ‹Ð½Ð°Ð½ алаÑтатылған.
+Бұл жайтқа [{{fullurl:{{ns:special}}:Log/delete|page={{PAGENAMEE}}}} жою журналында] егжей-тегжей мәліметтер болуы мүмкін.
+</div>',
+'rev-deleted-text-view' => '<div class="mw-warning plainlinks">
+ОÑÑ‹ беттің нұÑқаÑÑ‹ Ð¶Ð°Ñ€Ð¸Ñ Ð¼Ò±Ñ€Ð°Ò“Ð°Ñ‚Ñ‚Ð°Ñ€Ñ‹Ð½Ð°Ð½ алаÑтатылған.
+Соны оÑÑ‹ тораптың әкімшіÑÑ– боп көруіңіз мүмкін;
+бұл жайтқа [{{fullurl:{{ns:special}}:Log/delete|page={{PAGENAMEE}}}} жою журналында] егжей-тегжей мәлметтер болуы мүмкін.
+</div>',
+'rev-delundel' => 'көрÑет/жаÑÑ‹Ñ€',
+
+'history-feed-title' => 'ÐÒ±Ñқалар тарихы',
+'history-feed-description' => 'Бұл беттің уикидегі нұÑқалар тарихы',
+'history-feed-item-nocomment' => '$1 деген $2 кезінде', # user at time
+'history-feed-empty' => 'Сұранған бет жоқ.
+Бұл бет уикиден жойылған, немеÑе қайта аталған.
+СәйкеÑÑ– бар жаңа беттерді [[{{ns:special}}:Search|уикиден іздеп]] қараңыз.',
+
+# Revision deletion
+'revisiondelete' => 'ÐÒ±Ñқаларды жою/қайтару',
+'revdelete-nooldid-title' => 'ÐÑ‹Ñана нұÑқаÑÑ‹ жоқ',
+'revdelete-nooldid-text' => 'ОÑÑ‹ әрекетті орындау үшін ақырғы нұÑқаÑын
+не нұÑқаларын енгізбепÑіз.',
+'revdelete-selected' => '[[:$1]] дегеннің талғанылған нұÑқаÑÑ‹:',
+'revdelete-text' => 'Жойылған нұÑқаларды әлі де бет тарихында көруге болады,
+бірақ оның мәтін мағлұматы баршаға қатыналмайды.
+
+ОÑÑ‹ уикидің баÑқа әкімшілері жаÑырын мағлұматқа қатынай алады,
+және торап операторлары қоÑымша шектеу ендіргенше дейін,
+оÑÑ‹ тілдеÑу арқылы жойылғанды кері қайтара алады.',
+'revdelete-legend' => 'ÐÒ±Ñқанының шектеулері:',
+'revdelete-hide-text' => 'ÐÒ±Ñқа мәтінін жаÑÑ‹Ñ€',
+'revdelete-hide-comment' => 'Түзету мәндемеÑін жаÑÑ‹Ñ€',
+'revdelete-hide-user' => 'Өңдеуші атын (IP жайын) жаÑÑ‹Ñ€',
+'revdelete-hide-restricted' => 'ОÑÑ‹ шектеулерді баршаға ÑиÑқты әкімшілерге де қолдану',
+'revdelete-log' => 'Журнал мәндемеÑÑ–:',
+'revdelete-submit' => 'Талғанған нұÑқаға қолдану',
+'revdelete-logentry' => '[[$1]] дегенге нұÑқа көрініÑін өзгертті',
+
+# Diffs
+'difference' => '(ÐÒ±Ñқалар араÑындағы айырмашылық)',
+'loadingrev' => 'айырма үшін нұÑқа жүктеу',
+'lineno' => 'Жол $1:',
+'editcurrent' => 'ОÑÑ‹ беттің ағымдық нұÑқаÑын өңдеу',
+'selectnewerversionfordiff' => 'СалыÑтыру үшін жаңалау нұÑқаÑын талғаңыз',
+'selectolderversionfordiff' => 'СалыÑтыру үшін еÑкілеу нұÑқаÑын талғаңыз',
+'compareselectedversions' => 'Таңдаған нұÑқаларды ÑалыÑтыру',
+
+# Search results
+'searchresults' => 'ІздеÑтіру нәтижелері',
+'searchresulttext' => 'ОÑÑ‹ {{SITENAME}} жобаÑында іздеÑтіру туралы көбірек ақпарат үшін, [[{{ns:project}}:Іздеу|{{SITENAME}} іздеу нұÑқауларын]] қараңыз.',
+'searchsubtitle' => "ІздеÑтіру ÑұраныÑыңыз: '''[[:$1]]'''",
+'searchsubtitleinvalid' => "ІздеÑтіру ÑұраныÑыңыз: '''$1'''",
+'badquery' => 'ІздеÑтіру ÑÒ±Ñ€Ð°Ð½Ñ‹Ñ Ð¶Ð°Ñ€Ð°Ð¼Ñыз пішімделген',
+'badquerytext' => 'Ғафу етіңіз, ÑұраныÑыңызды орындай алмадық.
+Бұл үш әріптен кем Ñөзді іздеÑтіруге талаптанғаныңыздан
+болуға мүмкін, ол әлі де Ñүйемелденбеген.
+Тағы да бұл Ñөйлемді Ð´Ò±Ñ€Ñ‹Ñ ÐµÐ½Ð³Ñ–Ð·Ð±ÐµÐ³ÐµÐ½Ð´Ñ–ÐºÑ‚ÐµÐ½ де болуға мүмкін,
+мыÑалы, «балық және және қабыршақ».
+БаÑқа ÑÒ±Ñ€Ð°Ð½Ñ‹Ñ Ð¶Ð°Ñап көріңіз',
+'matchtotals' => '«$1» іздеÑтіру ÑұраныÑÑ‹ $2 беттің атауына
+және $3 беттің мәтініне ÑәйкеÑ.',
+'noexactmatch' => "'''ОÑында «$1» атаулы бет жоқ.''' Бұл бетті өзіңіз '''[[:$1|баÑтай алаÑыз]].'''",
+'titlematches' => 'Бет атауы ÑәйкеÑÑ–',
+'notitlematches' => 'Еш бет атауы ÑÓ™Ð¹ÐºÐµÑ ÐµÐ¼ÐµÑ',
+'textmatches' => 'Бет мәтінің ÑәйкеÑÑ–',
+'notextmatches' => 'Еш бет мәтіні ÑÓ™Ð¹ÐºÐµÑ ÐµÐ¼ÐµÑ',
+'prevn' => 'алдыңғы $1',
+'nextn' => 'келеÑÑ– $1',
+'viewprevnext' => 'КөрÑетілуі: ($1) ($2) ($3) жазба.',
+'showingresults' => 'Төменде нөмір <b>$2</b> дегеннен баÑтап <b>$1</b> нәтижеге дейін көрÑетілген.',
+'showingresultsnum' => 'Төменде нөмір <b>$2</b> дегеннен баÑтап <b>$3</b> нәтиже көрÑетілген.',
+'nonefound' => "'''Ðңғартпа''': Табу ÑәтÑіз бітуі жиі «болған» және «деген» ÑиÑқты
+тізімделмейтін жалпы Ñөздермен іздеÑтіруден болуы мүмкін,
+немеÑе бірден артық іздеÑтіру шарт Ñөздерін егізгеннен (нәтижелерде тек
+барлық шарт Ñөздер кедеÑÑе көрÑетіледі) болуы мүмкін.",
+'powersearch' => 'Іздеу',
+'powersearchtext' => 'Мына еÑім аÑларда іздеу:<br />$1<br />$2 Ðйдатуларды тізімдеу<br />ІздеÑтіру ÑұраныÑÑ‹: $3 $9',
+'searchdisabled' => '{{SITENAME}} жобаÑында ішкі іздеуі өшірілген. Әзірше Google немеÑе Yahoo! арқылы іздеуге болады. Ðңғартпа: {{SITENAME}} мағлұмат тізімідеулері оларда еÑкірген болуға мүмкін.',
+'blanknamespace' => '(Ðегізгі)',
+
+# Preferences page
+'preferences' => 'Баптаулар',
+'mypreferences' => 'Баптауым',
+'prefsnologin' => 'КірмегенÑіз',
+'prefsnologintext' => 'Баптауларды қалау үшін алдын ала [[{{ns:special}}:Userlogin|кіруіңіз]] қажет.',
+'prefsreset' => 'Баптаулар арқаудан қайта орнатылды.',
+'qbsettings' => 'Мәзір аймағы',
+'changepassword' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөз өзгерту',
+'skin' => 'Безендіру',
+'math' => 'Математика',
+'dateformat' => 'Күн-ай пішімі',
+'datedefault' => 'Еш қалауÑыз',
+'datetime' => 'Уақыт',
+'math_failure' => 'Өңдету ÑәтÑіз бітті',
+'math_unknown_error' => 'белгіÑіз қате',
+'math_unknown_function' => 'белгіÑіз функциÑ',
+'math_lexing_error' => 'лекÑика қатеÑÑ–',
+'math_syntax_error' => 'ÑинтакÑÐ¸Ñ Ò›Ð°Ñ‚ÐµÑÑ–',
+'math_image_error' => 'PNG аударыÑÑ‹ ÑәтÑіз бітті; latex, dvips, gs және convert бағдарламаларының мүлтікÑіз орнатуын текÑеріңіз',
+'math_bad_tmpdir' => 'Математиканың уақытша қалтаÑына жазылмады, не қалта жаÑалмады',
+'math_bad_output' => 'Математиканың Ð±ÐµÑ€Ñ–Ñ Ò›Ð°Ð»Ñ‚Ð°Ñына жазылмады, не қалта жаÑалмады',
+'math_notexvc' => 'texvc бағдарламаÑÑ‹ жоғалтылған; баптау үшін math/README құжатын қараңыз.',
+'prefs-personal' => 'Жеке деректері',
+'prefs-rc' => 'Жуықтағы өзгеріÑтер',
+'prefs-watchlist' => 'Бақылау',
+'prefs-watchlist-days' => 'Бақылау тізімінде көрÑетерін күн Ñаны:',
+'prefs-watchlist-edits' => 'Кеңейтілген бақылау тізімі түзету көрÑетерін Ñаны:',
+'prefs-misc' => 'ҚоÑымша',
+'saveprefs' => 'Сақта',
+'resetprefs' => 'ТаÑта',
+'oldpassword' => 'Ðғымдық Ò›Ò±Ð¿Ð¸Ñ Ñөз:',
+'newpassword' => 'Жаңа Ò›Ò±Ð¿Ð¸Ñ Ñөз:',
+'retypenew' => 'Жаңа Ò›Ò±Ð¿Ð¸Ñ Ñөзді қайталаңыз:',
+'textboxsize' => 'Өңдеу',
+'rows' => 'Жолдар:',
+'columns' => 'Бағандар:',
+'searchresultshead' => 'Іздеу',
+'resultsperpage' => 'Бет Ñайын нәтиже Ñаны:',
+'contextlines' => 'Ðәтиже Ñайын жол Ñаны:',
+'contextchars' => 'Жол Ñайын әріп Ñаны:',
+'stubthreshold' => 'Бітеме көрÑтетуін анықтау табалдырығы:',
+'recentchangescount' => 'Жуықтағы өзгеріÑтердегі атаулар:',
+'savedprefs' => 'Баптауларыңыз Ñақталды.',
+'timezonelegend' => 'Уақыт белдеуі',
+'timezonetext' => 'Жергілікті уақытыңызбен Ñервер уақытының (UTC) араÑындағы Ñағат Ñаны.',
+'localtime' => 'Жергілікті уақыт',
+'timezoneoffset' => 'ЫғыÑтыру¹',
+'servertime' => 'Сервер уақыты',
+'guesstimezone' => 'Шолғыштан алып толтыру',
+'allowemail' => 'БаÑқадан хат қабылдауын ендіру',
+'defaultns' => 'Мына еÑім аÑларда әдепкіден іздеу:',
+'default' => 'әдепкі',
+'files' => 'Файлдар',
+
+# User rights
+'userrights-lookup-user' => 'ҚатыÑушы топтарын меңгеру',
+'userrights-user-editname' => 'ҚатыÑушы атын енгізіңіз:',
+'editusergroup' => 'ҚатыÑушы топтарын өңдеу',
+'userrights-editusergroup' => 'ҚатыÑушы топтарын өңдеу',
+'saveusergroups' => 'ҚатыÑушы топтарын Ñақтау',
+'userrights-groupsmember' => 'Мүшелігі:',
+'userrights-groupsavailable' => 'Қатынаулы топтар:',
+'userrights-groupshelp' => 'ҚатыÑушыны Ò¯Ñтейтін не алаÑтатын топтарды талғаңыз.
+Талғауы өшірілген топтар өзгертілімейді. Топтардың талғауын CTRL + Сол жақ нұқумен өшіруіңізге болады.',
+
+# Groups
+'group' => 'Топ:',
+'group-bot' => 'Боттар',
+'group-sysop' => 'Әкімшілер',
+'group-bureaucrat' => 'Төрешілер',
+'group-all' => '(барлығы)',
+
+'group-bot-member' => 'бот',
+'group-sysop-member' => 'әкімші',
+'group-bureaucrat-member' => 'төреші',
+
+'grouppage-bot' => '{{ns:project}}:Боттар',
+'grouppage-sysop' => '{{ns:project}}:Әкімшілер',
+'grouppage-bureaucrat' => '{{ns:project}}:Төрешілер',
+
+# Recent changes
+'changes' => 'өзгеріÑ',
+'recentchanges' => 'Жуықтағы өзгеріÑтер',
+'recentchangestext' => 'Бұл бетте оÑÑ‹ уикидегі болған жуықтағы өзгеріÑтер байқалады.',
+'rcnote' => '$3 кезіне дейін — төменде Ñоңғы <strong>$2</strong> күндегі, Ñоңғы <strong>$1</strong> Ó©Ð·Ð³ÐµÑ€Ñ–Ñ ÐºÓ©Ñ€Ñетілген.',
+'rcnotefrom' => '<b>$2</b> кезінен бері — төменде өзгеріÑтер <b>$1</b> дейін көрÑетілген.',
+'rclistfrom' => '$1 кезінен бері — жаңа өзгеріÑтерді көрÑет.',
+'rcshowhideminor' => 'Шағын түзетуді $1',
+'rcshowhidebots' => 'Боттарды $1',
+'rcshowhideliu' => 'Тіркелгенді $1',
+'rcshowhideanons' => 'ТіркелгіÑізді $1',
+'rcshowhidepatr' => 'Күзеттегі түзетулерді $1',
+'rcshowhidemine' => 'Түзетуімді $1',
+'rclinks' => 'Соңғы $2 күнде болған, Ñоңғы $1 өзгеріÑÑ‚Ñ– көрÑет<br />$3',
+'diff' => 'айырм.',
+'hist' => 'тар.',
+'hide' => 'жаÑÑ‹Ñ€',
+'show' => 'көрÑет',
+'minoreditletter' => 'ш',
+'newpageletter' => 'Ж',
+'boteditletter' => 'б',
+'sectionlink' => '→',
+'number_of_watching_users_pageview' => '[бақылаған $1 қатыÑушы]',
+'rc_categories' => 'Санаттарға шектеу ("|" белгіÑімен бөліктеңіз)',
+'rc_categories_any' => 'ҚайÑыбір',
+
+# Upload
+'upload' => 'Файл қотару',
+'uploadbtn' => 'Қотар!',
+'reupload' => 'Қайталап қотару',
+'reuploaddesc' => 'Қотару үлгітіне оралу.',
+'uploadnologin' => 'КірмегенÑіз',
+'uploadnologintext' => 'Файл қотару үшін
+[[{{ns:special}}:Userlogin|кіруіңіз]] қажет.',
+'upload_directory_read_only' => 'Қотару қалтаÑына ($1) жазуға веб-Ñерверге Ñ€Ò±Ò›Ñат берілмеген.',
+'uploaderror' => 'Қотару қатеÑÑ–',
+'uploadtext' => "Төмендегі үлгіт файл қотаруға қолданылады, алдындағы Ñуреттерді қарау үшін не іздеу үшін [[{{ns:special}}:Imagelist|қотарылған файлдар тізіміне]] барыңыз, қотару мен жою тағы да [[{{ns:special}}:Log/upload|қотару журналына]] жазылып алынады.
+
+Суреттерді бетке кіргізу үшін, файлға тура байланыÑтратын
+'''<nowiki>[[{{ns:image}}:File.jpg]]</nowiki>''',
+'''<nowiki>[[{{ns:image}}:File.png|балама мәтін]]</nowiki>''' немеÑе
+'''<nowiki>[[{{ns:media}}:File.ogg]]</nowiki>''' Ñілтеме пішімін қолданыңыз.",
+'uploadlog' => 'қотару журналы',
+'uploadlogpage' => 'Қотару журналы',
+'uploadlogpagetext' => 'Төменде жуықтағы қотарылған файл тізімі.',
+'filename' => 'Файл аты',
+'filedesc' => 'СипаттамаÑÑ‹',
+'fileuploadsummary' => 'СипаттамаÑÑ‹:',
+'filestatus' => 'Ðуторлық құқықтары күйі',
+'filesource' => 'Файл қайнары',
+'copyrightpage' => '{{ns:project}}:Ðуторлық құқықтар',
+'copyrightpagename' => '{{SITENAME}} ауторлық құқықтары',
+'uploadedfiles' => 'Қотарылған файлдар',
+'ignorewarning' => 'Ðазар Ñалуды елемеу және файлды әрдеқашан Ñақтау.',
+'ignorewarnings' => 'ӘрқайÑÑ‹ назар Ñалуларды елемеу',
+'minlength' => 'Файл атында ең кемінде үш әріп болуы керек.',
+'illegalfilename' => '«$1» файл атауында бет атауларында Ñ€Ò±Ò›Ñат етілмеген нышандар бар. Файлды қайта атаңыз, ÑоÑын қайта жуктеп көріңіз.',
+'badfilename' => 'Файлдың аты «$1» боп өзгертілді.',
+'badfiletype' => '«.$1» Ò±Ñынылмаған Ñурет файлының кеңейтімі.',
+'largefile' => 'Файл мөлшерін $1 Байттан аÑырмауға тырыÑыңыз, бұл файл мөлшері $2 Байт',
+'largefileserver' => 'ОÑÑ‹ файлдың мөлшері Ñервердің қалауынан аÑып кеткен.',
+'emptyfile' => 'Қотарылған файлыңыз Ð±Ð¾Ñ ÑиÑқты. Бұл файл атауы жанÑақ енгізілгенінен болуы мүмкін. Қотарғыңыз келген файл шынында да оÑÑ‹ файл болғанын текÑеріп алыңыз.',
+'fileexists' => 'ОÑындай атаулы файл бар түге. Қайта жазудың алдынан $1 текÑеріп шығыңыз.',
+'fileexists-forbidden' => 'ОÑындай атаулы файл бар түге. Кері қайтыңыз да, және оÑÑ‹ файлды баÑқа атымен қотарыңыз. [[{{ns:image}}:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'ОÑындай атаулы файл ортақ файл арқауында бар түге. Кері қайтыңыз да, оÑÑ‹ файлды жаңа атымен қотарыңыз. [[{{ns:image}}:$1|thumb|center|$1]]',
+'successfulupload' => 'Қотару Ñәтті Ó©Ñ‚Ñ‚Ñ–',
+'fileuploaded' => '«$1» файлы Ñәтті қотарылды!
+ОÑÑ‹ Ñілтемеге еріп — $2, Ñипаттама бетіне барыңыз да, және оÑÑ‹ файл туралы
+ақпарат толтырыңыз: қайдан алынғанын, қашан жаÑалғанын, кім жаÑағанын,
+тағы баÑқа білетіңізді. Бұл Ñурет болÑа, мынадай пішімімен кіріÑтіруге болады: <tt><nowiki>[[Сурет:$1|thumb|СипаттамаÑÑ‹]]</nowiki></tt>',
+'uploadwarning' => 'Қотару туралы назар Ñалу',
+'savefile' => 'Файлды Ñақтау',
+'uploadedimage' => '«[[$1]]» файлын қотарды',
+'uploaddisabled' => 'Файл қотаруы өшірілген',
+'uploaddisabledtext' => 'ОÑÑ‹ уикиде файл қотаруы өшірілген.',
+'uploadscripted' => 'ОÑÑ‹ файлда, веб шолғышты ағат Ñ‚Ò¯Ñіндікке келтіретің HTML белгілеу, не Ñкрипт коды бар.',
+'uploadcorrupt' => 'ОÑÑ‹ файл бүлдірілген, не әдепÑіз кеңейтімі бар. Файлды текÑеріп, қотаруын қайталаңыз.',
+'uploadvirus' => 'ОÑÑ‹ файлда Ð²Ð¸Ñ€ÑƒÑ Ð±Ð¾Ð»ÑƒÑ‹ мүмкін! Егжей-тегжей ақпараты: $1',
+'sourcefilename' => 'Қайнардағы файл аты',
+'destfilename' => 'Ðқырғы файл аты',
+'watchthisupload' => 'ОÑÑ‹ бетті бақылау',
+'filewasdeleted' => 'ОÑÑ‹ атауы бар файл бұрын қотарылған, ÑоÑын жойылдырылған. Қайта қотару алдынан $1 дегенді текÑеріңіз.',
+
+'upload-proto-error' => 'ЖарамÑыз хаттамалық',
+'upload-proto-error-text' => 'Сырттан қотару үшін URL жайлары <code>http://</code> немеÑе <code>ftp://</code> дегендерден баÑталу қажет.',
+'upload-file-error' => 'Ішкі қате',
+'upload-file-error-text' => 'Серверде уақытша файл жаÑауы ішкі қатеге ұшыраÑÑ‚Ñ‹. Бұл жүйенің әкімшімен қатынаÑыңыз.',
+'upload-misc-error' => 'БелгіÑіз қотару қатеÑÑ–',
+'upload-misc-error-text' => 'Қотару кезінде белгіÑіз қате ұшыраÑÑ‚Ñ‹. ҚайÑÑ‹ URL жайы жарамды және қатынаулы екенін текÑеріп шығыңыз да қайталап көріңіз. Егер бұл мәÑеле әлде де қалÑа, жүйе әкімшімен қатынаÑыңыз.',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'URL жайы жетілмеді',
+'upload-curl-error6-text' => 'Берілген URL жайы жетілмеді. ҚайÑÑ‹ URL жайы Ð´Ò±Ñ€Ñ‹Ñ ÐµÐºÐµÐ½Ñ–Ð½ және торап Ñ–Ñте екенін қайталап қатаң текÑеріңіз.',
+'upload-curl-error28' => 'Қотаруға берілген уақыт бітті',
+'upload-curl-error28-text' => 'Тораптың жауап беруі тым ұзақ уақытқа Ñозылды. Бұл торап Ñ–Ñте екенін текÑеріп шығыңыз, аз уақыт кідіре тұрыңыз да тағы қайталап көріңіз. Талабыңызды жүктелуі аздау кезінде қайталауға болмыÑ.',
+
+'license' => 'ЛицензиÑÑÑ‹',
+'nolicense' => 'Ештеңе талғанбаған',
+'upload_source_url' => ' (жарамды, баршаға қатынаулы URL жай)',
+'upload_source_file' => ' (компьютеріңіздегі файл)',
+
+# Image list
+'imagelist' => 'Файл тізімі',
+'imagelisttext' => "Төменде ''$2'' Ñұрыпталған '''$1''' файл тізімі.",
+'imagelistforuser' => 'Мында тек $1 жүктеген Ñуреттер көрÑетіледі.',
+'getimagelist' => 'файл тізімдеуі',
+'ilsubmit' => 'Іздеу',
+'showlast' => 'Соңғы $1 файл $2 Ñұрыптап көрÑет.',
+'byname' => 'атымен',
+'bydate' => 'күн-аймен',
+'bysize' => 'мөлшерімен',
+'imgdelete' => 'жою',
+'imgdesc' => 'Ñипп.',
+'imgfile' => 'файл',
+'imglegend' => 'Шартты белгілер: (Ñипп.) — файл ÑипаттамаÑын көрÑету/өңдеу.',
+'imghistory' => 'Файл тарихы',
+'revertimg' => 'қайт.',
+'deleteimg' => 'жою',
+'deleteimgcompletely' => 'ОÑÑ‹ файлдың барлық нұÑқаларын жой',
+'imghistlegend' => 'Шартты белгілер: (ағым.) = ағымдық файл, (жою) = еÑкі нұÑқаÑын
+жою, (қай.) = еÑкі нұÑқаÑына қайтару.
+<br /><i>Қотарылған файлды көру үшін күн-айына нұқыңыз</i>.',
+'imagelinks' => 'Сілтемелері',
+'linkstoimage' => 'Бұл файлға келеÑÑ– беттер Ñілтейді:',
+'nolinkstoimage' => 'Бұл файлға еш бет Ñілтемейді.',
+'sharedupload' => 'Бұл файл ортақ арқауына қотарылған Ñондықтан баÑқа жобаларда қолдануы мүмкін.',
+'shareduploadwiki' => 'Былайғы ақпарат үшін $1 дегенді қараңыз.',
+'shareduploadwiki-linktext' => 'файл ÑипаттамаÑÑ‹ беті',
+'noimage' => 'Мынадай атаулы файл жоқ, $1 мүмкіндігіңіз бар.',
+'noimage-linktext' => 'оÑыны қотару',
+'uploadnewversion-linktext' => 'Бұл файлдың жаңа нұÑқаÑын қотару',
+'imagelist_date' => 'Күн-айы',
+'imagelist_name' => 'Ðтауы',
+'imagelist_user' => 'ҚатыÑушы',
+'imagelist_size' => 'Мөлшері (байт)',
+'imagelist_description' => 'СипаттамаÑÑ‹',
+'imagelist_search_for' => 'Суретті атымен іздеу:',
+
+# MIME search
+'mimesearch' => 'Файлды MIME түрімен іздеу',
+'mimetype' => 'MIME түрі:',
+'download' => 'жүктеу',
+
+# Unwatched pages
+'unwatchedpages' => 'Бақыланбаған беттер',
+
+# List redirects
+'listredirects' => 'Ðйдату бет тізімі',
+
+# Unused templates
+'unusedtemplates' => 'Пайдаланылмаған үлгілер',
+'unusedtemplatestext' => 'Бұл бет баÑқа бетке кіріcтірілмеген үлгі еÑім аÑÑ‹Ñындағы барлық беттерді тізімдейді. Үлгілерді жою алдынан бұның баÑқа Ñілтемелерін текÑеріп шығуын ұмытпаңыз',
+'unusedtemplateswlh' => 'баÑқа Ñілтемелер',
+
+# Random redirect
+'randomredirect' => 'КездейÑоқ айдату',
+
+# Statistics
+'statistics' => 'Жоба Ñанағы',
+'sitestats' => '{{SITENAME}} Ñанағы',
+'userstats' => 'ҚатыÑушы Ñанағы',
+'sitestatstext' => "Мындағы дерекқорда бұлайша '''$1''' бет бар.
+Бұның ішінде «талқылау» беттері, {{SITENAME}} жобаÑÑ‹ туралы беттер, кішкене «бітеме»
+беттер, айдатулар, мағлұмат бет деп Ñаналмайтын, бәлкім, тағы да баÑқалар.
+ОÑыны еÑептен шығарғанда, мында мағлұматты деп Ñаналатын
+'''$2''' бет бар шығар.
+
+Торапқа '''$8''' файл қотарылған.
+
+ОÑÑ‹ уики жобаÑÑ‹ орнатылғаннан бері бұлайша беттер '''$3''' рет қаралған,
+және беттер '''$4''' рет өңделген.
+Бұның нәтижеÑінде орта еÑеппен бір бет Ñайын '''$5''' өңдеу Ñ–Ñтелінген, және бір өңдеу Ñайын '''$6''' рет қарау келген.
+
+Ðғымдық [http://meta.wikimedia.org/wiki/Help:Job_queue тапÑырым кезегі] ұзындылығы: '''$7'''.",
+'userstatstext' => "Мында '''$1''' тіркелген қатыÑушы бар, Ñоның ішінде
+'''$2''' (немеÑе '''$4 %''') $5 бар.",
+'statistics-mostpopular' => 'Ең көп қаралған беттер',
+
+'disambiguations' => 'Ðйрықты беттер',
+'disambiguationspage' => '{{ns:template}}:Disambig',
+'disambiguationstext' => 'КелеÑÑ– беттер <i>айрықты бетке</i> Ñілтейді. Бұның орнына белгілі тақырыпқа Ñілтеуі қажет.<br />Бетке $1 Ñілтеген жағдайда, бет айрықты деп Ñаналады.<br />БаÑқа еÑім аÑÑынан нұÑқайтын Ñілтемелер мында <i>тізімделмейді</i>.',
+
+'doubleredirects' => 'Шынжырлы айдатулар',
+'doubleredirectstext' => 'Әрбір жолдағы бірінші мен екінші айдату Ñілтемелері бар, Ñонымен бірге екінші айдату мәтіннің бірінші жолы бар. Әдетте бірінші Ñілтеме айдайтын «шын» ақырғы беттің атауы болуы қажет.',
+
+'brokenredirects' => 'Еш бетке келтірмейтін айдатулар',
+'brokenredirectstext' => 'КелеÑÑ– айдатулар жоқ беттерге Ñілтейді:',
+
+# Miscellaneous special pages
+'nbytes' => '$1 Байт',
+'ncategories' => '$1 Ñанат',
+'nlinks' => '$1 Ñілтеме',
+'nmembers' => '$1 буын',
+'nrevisions' => '$1 нұÑқа',
+'nviews' => '$1 рет қаралған',
+'lonelypages' => 'Еш бет Ñілтемеген беттер',
+'lonelypagestext' => 'КелеÑÑ– беттерге оÑÑ‹ жобадағы баÑқа беттер Ñілтемейді.',
+'uncategorizedpages' => 'Еш Ñанатқа кірмеген беттер',
+'uncategorizedcategories' => 'Еш Ñанатқа кірмеген Ñанаттар',
+'uncategorizedimages' => 'Еш Ñанатқа кірмеген Ñуреттер',
+'unusedcategories' => 'Пайдаланылмаған Ñанаттар',
+'unusedimages' => 'Пайдаланылмаған файлдар',
+'popularpages' => 'Әйгілі беттер',
+'wantedcategories' => 'БаÑталмаған Ñанаттар',
+'wantedpages' => 'БаÑталмаған беттер',
+'mostlinked' => 'Ең көп Ñілтенген беттер',
+'mostlinkedcategories' => 'Ең көп Ñілтенген Ñанаттар',
+'mostcategories' => 'Ең көп Ñанаттарға кірген беттер',
+'mostimages' => 'Ең көп Ñілтенген Ñуреттер',
+'mostrevisions' => 'Ең көп түзетілген беттер',
+'allpages' => 'Барлық бет тізімі',
+'prefixindex' => 'Бет баÑтау тізімі',
+'randompage' => 'КездейÑоқ бет',
+'shortpages' => 'Ең қыÑқа беттер',
+'longpages' => 'Ең үлкен беттер',
+'deadendpages' => 'Еш бетке Ñілтемейтін беттер',
+'deadendpagestext' => 'КелеÑÑ– беттер оÑÑ‹ жобадағы баÑқа беттерге Ñілтемейді.',
+'listusers' => 'Барлық қатыÑушы тізімі',
+'specialpages' => 'Ðрнайы беттер',
+'spheading' => 'Баршаның арнайы беттері',
+'restrictedpheading' => 'Шектеулі арнайы беттер',
+'recentchangeslinked' => 'ҚатыÑÑ‚Ñ‹ түзетулер',
+'rclsub' => '(«$1» бетінен Ñілтенген беттерге)',
+'newpages' => 'Ең жаңа беттер',
+'newpages-username' => 'ҚатыÑушы аты:',
+'ancientpages' => 'Ең еÑкі беттер',
+'intl' => 'Тіларалық Ñілтемелер',
+'move' => 'Жылжыту',
+'movethispage' => 'Бетті жылжыту',
+'unusedimagestext' => '<p>ЕÑкерту: БаÑқа веб тораптар файлдың
+URL жайына тікелей Ñілтеуі мүмкін. Сондықтан, белÑенді пайдалануына аңғармай,
+оÑÑ‹ тізімде қалуы мүмкін.</p>',
+'unusedcategoriestext' => 'КелеÑÑ– Ñанат беттер бар болып тұр, бірақ оған ешқандай бет, не Ñанат кірмейді.',
+'booksources' => 'Кітап қайнарлары',
+'categoriespagetext' => 'ОÑында уикидегі барлық Ñанаттарының тізімі беріліп тұр.',
+'data' => 'Деректер',
+'userrights' => 'ҚатыÑушылар құқықтарын меңгеру',
+'groups' => 'ҚатыÑушы топтары',
+'booksourcetext' => 'Төменде жаңа және қолданған кітаптар Ñататын
+тораптарының Ñілтемелері тізімделген. Бұл тораптарда ізделген кітаптар
+туралы былайғы ақпарат болуға мүмкін.',
+'isbn' => 'ISBN белгіÑÑ–',
+'alphaindexline' => '$1 — $2',
+'version' => 'Жүйе нұÑқаÑÑ‹',
+'log' => 'Журналдар',
+'alllogstext' => 'Біріккен қотару, жою, қорғау, бұғаттау және әкімшілік журналдарын көрÑету.
+Журнал түрін, қатыÑушы атын, тиіÑÑ‚Ñ– бетін талғап, тарылтып қарауыңызға болады.',
+'logempty' => 'Журналда ÑÓ™Ð¹ÐºÐµÑ Ð´Ð°Ð½Ð°Ð»Ð°Ñ€ жоқ.',
+
+# Special:Allpages
+'nextpage' => 'КелеÑÑ– бетке ($1)',
+'allpagesfrom' => 'Мына беттен баÑтап көрÑету:',
+'allarticles' => 'Барлық бет тізімі',
+'allinnamespace' => 'Барлық бет ($1 еÑім аÑÑÑ‹)',
+'allnotinnamespace' => 'Барлық бет ($1 еÑім аÑÑынан Ñ‚Ñ‹Ñ)',
+'allpagesprev' => 'Ðлдыңғыға',
+'allpagesnext' => 'КелеÑіге',
+'allpagessubmit' => 'Өту',
+'allpagesprefix' => 'Мынадан баÑталған беттерді көрÑету:',
+'allpagesbadtitle' => 'Ðлынған бет атауы жарамÑыз болған, немеÑе тіл-аралық не уики-аралық баÑтауы бар болды. Ðтауда қолдануға болмайтын нышандар болуы мүмкін.',
+
+# Special:Listusers
+'listusersfrom' => 'Мына қатыÑушыдан баÑтап көрÑету:',
+
+# E-mail user
+'mailnologin' => 'Е-пошта жайы жіберілген жоқ',
+'mailnologintext' => 'БаÑқа қатыÑушыға хат жіберу үшін
+[[{{ns:special}}:Userlogin|кіруіңіз]] қажет, және [[{{ns:special}}:Preferences|баптауыңызда]]
+куәландырылған е-пошта жайы болуы жөн.',
+'emailuser' => 'ҚатыÑушыға хат жазу',
+'emailpage' => 'ҚатыÑушыға хат жіберу',
+'emailpagetext' => 'Егер бұл қатыÑушы баптауларында куәландырған е-пошта
+жайын енгізÑе, төмендегі үлгіт арқылы бұған жалғыз е-пошта хатын жіберуге болады.
+ҚатыÑушы баптауыңызда енгізген е-пошта жайыңыз
+«Кімнен» деген Ð±Ð°Ñ Ð¶Ð¾Ð»Ð°Ò“Ñ‹Ð½Ð´Ð° көрінеді, Ñондықтан
+хат алушыÑÑ‹ тура жауап бере алады.',
+'usermailererror' => 'Mail ныÑаны қате қайтарды:',
+'defemailsubject' => '{{SITENAME}} е-поштаÑының хаты',
+'noemailtitle' => 'Бұл е-пошта жайы емеÑ',
+'noemailtext' => 'ОÑÑ‹ қатыÑушы жарамды Е-пошта жайын енгізбеген,
+немеÑе баÑқалардан хат қабылдауын өшірген.',
+'emailfrom' => 'Кімнен',
+'emailto' => 'Кімге',
+'emailsubject' => 'Тақырыбы',
+'emailmessage' => 'Хат',
+'emailsend' => 'Жіберу',
+'emailccme' => 'Хатымдың көшірмеÑін маған да жібер.',
+'emailccsubject' => '$1 дегенге жіберілген хатыңыздың көшірмеÑÑ–: $2',
+'emailsent' => 'Хат жіберілді',
+'emailsenttext' => 'Е-пошта хатыңыз жіберілді.',
+
+# Watchlist
+'watchlist' => 'Бақылауым',
+'watchlistfor' => "('''$1''' бақылаулары)",
+'nowatchlist' => 'Бақылау тізіміңізде ешбір дана жоқ',
+'watchlistanontext' => 'Бақылау тізіміңіздегі даналарды қарау, не өңдеу үшін $1 қажет.',
+'watchlistcount' => "'''Бақылау тізіміңізде (талқылау беттерді қоÑа) $1 дана бар.'''",
+'clearwatchlist' => 'Бақылау тізімін тазалау',
+'watchlistcleartext' => 'Соларды толық алаÑтатуға батылÑыз ба?',
+'watchlistclearbutton' => 'Бақылау тізімін тазалау',
+'watchlistcleardone' => 'Бақылау тізіміңіз тазартылды. $1 дана алаÑтатылды.',
+'watchnologin' => 'КірмегенÑіз',
+'watchnologintext' => 'Бақылау тізіміңізді өзгерту үшін [[{{ns:special}}:Userlogin|кіруіңіз]] жөн.',
+'addedwatch' => 'Бақылау тізіміне қоÑылды',
+'addedwatchtext' => "«[[:$1]]» беті [[{{ns:special}}:Watchlist|бақылау тізіміңізге]] қоÑылды.
+ОÑÑ‹ беттің және Ñоның талқылау бетінің келешектегі өзгеріÑтері мында тізімделеді.
+Сонда беттің атауы табуға жеңілдетіп [[{{ns:special}}:Recentchanges|жуықтағы өзгеріÑтер тізімінде]]
+'''жуан әрпімен''' көрÑетіледі.
+
+ОÑÑ‹ бетті Ñоңынан бақылау тізімнен алаÑтатыңыз келÑе «Бақыламау» парағын нұқыңыз.",
+'removedwatch' => 'Бақылау тізіміңізден алаÑтатылды',
+'removedwatchtext' => '«[[:$1]]» беті бақылау тізіміңізден алаÑтатылды.',
+'watch' => 'Бақылау',
+'watchthispage' => 'Бетті бақылау',
+'unwatch' => 'Бақыламау',
+'unwatchthispage' => 'Бақылауды тоқтату',
+'notanarticle' => 'Мағлұмат беті емеÑ',
+'watchnochange' => 'КөрÑетілген мерзімде ешбір бақыланған дана өңделген жоқ.',
+'watchdetails' => "* Бақылау тізімінде (талқылау беттеріÑіз) '''$1''' бет бар.
+* [[{{ns:special}}:Watchlist/edit|Бүкіл тізімді қарау және өзгерту]].
+* [[{{ns:special}}:Watchlist/clear|Тізімдегі барлық дана алаÑтату]].",
+'wlheader-enotif' => '* ЕÑкерту хат жіберуі ендірілген.',
+'wlheader-showupdated' => "* Соңғы кіргенімнен бері түзетілген беттерді '''жуан''' мәтінмен көрÑет",
+'watchmethod-recent' => 'бақылаулы беттердің жуықтағы өзгеріÑтерін текÑеру',
+'watchmethod-list' => 'жуықтағы өзгеріÑтерде бақылаулы беттерді текÑеру',
+'removechecked' => 'Белгіленгенді бақылау тізімінен алаÑтату',
+'watchlistcontains' => 'Бақылау тізіміңізде $1 бет бар.',
+'watcheditlist' => "ОÑында әліппем Ñұрыпталған бақыланған мағлұмат беттеріңіз тізімделінген.
+Беттерді алаÑтату үшін оның қаÑындағы қабашақтарды белгілеп, төмендегі ''Белгіленгенді алаÑтат'' түймеÑін нұқыңыз
+(мағлұмат бетін жойғанда талқылау беті де бірге жойылады).",
+'removingchecked' => 'Сұранған даналарды бақылау тізімнен алаÑтауы…',
+'couldntremove' => '«$1» деген дана алаÑтатылмады…',
+'iteminvalidname' => '«$1» данаÑының жарамÑыз атауынан шатақ туды…',
+'wlnote' => 'Төменде Ñоңғы <b>$2</b> Ñағаттағы, Ñоңғы $1 Ó©Ð·Ð³ÐµÑ€Ñ–Ñ ÐºÓ©Ñ€Ñетілген.',
+'wlshowlast' => 'Соңғы $1 Ñағаттағы, $2 күндегі, $3 болған өзгеріÑÑ‚Ñ– көрÑету',
+'wlsaved' => 'Бұл бақылу тізіміңіздің Ñақталған нұÑқаÑÑ‹.',
+'wlhideshowown' => 'Түзетуімді $1',
+'wlhideshowbots' => 'Боттарды $1',
+'wldone' => 'Ð†Ñ Ð±Ñ–Ñ‚Ñ‚Ñ–.',
+
+'enotif_mailer' => '{{SITENAME}} еÑкерту хат жіберу қызметі',
+'enotif_reset' => 'Барлық бет каралді деп белгіле',
+'enotif_newpagetext' => 'Мынау жаңа бет.',
+'changed' => 'өзгертті',
+'created' => 'жаÑады',
+'enotif_subject' => '{{SITENAME}} жобаÑында $PAGEEDITOR $PAGETITLE атаулы бетті $CHANGEDORCREATED',
+'enotif_lastvisited' => 'Соңғы кіруіңізден бері болған өзгеріÑтер үшін $1 дегенді қараңыз.',
+'enotif_body' => 'Құрметті $WATCHINGUSERNAME,
+
+{{SITENAME}} жобаÑыда $PAGEEDITDATE кезінде $PAGEEDITOR $PAGETITLE атаулы бетті $CHANGEDORCREATED, ағымдық нұÑқаÑын $PAGETITLE_URL жайынан қараңыз.
+
+$NEWPAGE
+
+Өңдеуші ÑипаттамаÑÑ‹: $PAGESUMMARY $PAGEMINOREDIT
+
+Өңдеушімен қатынаÑу:
+е-пошта: $PAGEEDITOR_EMAIL
+уики: $PAGEEDITOR_WIKI
+
+Былайғы өзгеріÑтер болғанда да Ñіз оÑÑ‹ бетке барғанша дейін ешқандай баÑқа еÑкерту хаттар жіберілмейді. Сонымен қатар бақылау тізіміңіздегі бет еÑкертпелік белгіÑін әдепке күйіне келтіріңіз.
+
+ Сіздің доÑÑ‚Ñ‹ {{SITENAME}} еÑкерту қызметі
+
+----
+Бақылау тізіміңізді баптау үшін, мында барыңыз
+{{fullurl:{{ns:special}}:Watchlist/edit}}
+
+Сын-пікір беру және былайғы жәрдем алу үшін:
+{{fullurl:{{ns:help}}:Мазмұны}}',
+
+# Delete/protect/revert
+'deletepage' => 'Бетті жою',
+'confirm' => 'РаÑтау',
+'excontent' => 'болған мағлұматы: «$1»',
+'excontentauthor' => 'болған мағлұматы: «$1» (тек «[[Special:Contributions/$2|$2]]» үлеÑÑ–)',
+'exbeforeblank' => 'тазарту алдындағы болған мағлұматы: «$1»',
+'exblank' => 'бет боÑÑ‚Ñ‹ болды',
+'confirmdelete' => 'Жоюды раÑтау',
+'deletesub' => '(«$1» жоюы)',
+'historywarning' => 'Ðазар Ñалыңыз: Жоюға арналған бетте өз тарихы бар:',
+'confirmdeletetext' => 'Бетті немеÑе Ñуретті барлық тарихымен
+бірге дерекқордан әрдайым жойығыңыз келетін ÑиÑқты.
+Бұны жоюдың зардабын Ñ‚Ò¯Ñініп шын ниеттенгеніңізді, және
+[[{{ns:project}}:СаÑÑат]]қа лайықты деп
+Ñенгеніңізді раÑтаңыз.',
+'actioncomplete' => 'Әрекет бітті',
+'deletedtext' => '«$1» жойылды.
+Жуықтағы жоюлар туралы жазбаларын $2 дегеннен қараңыз.',
+'deletedarticle' => '«[[$1]]» бетін жойды',
+'dellogpage' => 'Жою_журналы',
+'dellogpagetext' => 'Төменде жуықтағы жоюлардың тізімі берілген.',
+'deletionlog' => 'жою журналы',
+'reverted' => 'Ертерек нұÑқаÑына қайтарылған',
+'deletecomment' => 'Жоюдың Ñебебі',
+'imagereverted' => 'Ертерек нұÑқаÑына қайтару Ñәтті Ó©Ñ‚Ñ‚Ñ–.',
+'rollback' => 'Түзетулерді қайтару',
+'rollback_short' => 'Қайтару',
+'rollbacklink' => 'қайтару',
+'rollbackfailed' => 'Қайтару ÑәтÑіз аÑқталды',
+'cantrollback' => 'Түзету қайтарылмайды. Бұл беттің Ñоңғы үлеÑкері тек баÑтауыш ауторы.',
+'alreadyrolled' => '[[{{ns:user}}:$2|$2]] ([[{{ns:user_talk}}:$2|талқылауы]]) дегенді жаÑаған [[:$1]]
+бетінің Ñоңғы өңдеуінен қайтару өтпеді; кейбіреу оÑÑ‹ қазір бетті өңдеп не қайтарып жатыр түге.
+
+Соңғы өңдеуді [[{{ns:user}}:$3|$3]] ([[{{ns:user_talk}}:$3|талқылауы]]) дегенді жаÑаған.',
+'editcomment' => 'Түзетудің болған мәндемеÑÑ–: "<i>$1</i>".', # only shown if there is an edit comment
+'revertpage' => '[[{{ns:special}}:Contributions/$2|$2]] ([[{{ns:user_talk}}:$2|талқылауы]]) түзетуінен [[{{ns:user}}:$1|$1]] Ñоңғы нұÑқаÑына қайтарды',
+'sessionfailure' => 'Кіру ÑеÑÑиÑÑында шатақ болған ÑиÑқты;
+ÑеÑÑиÑға шабуылдаудардан қорғану үшін, оÑÑ‹ әрекет тоқтатылды.
+«Ðртқа» түймеÑін баÑыңыз, және бетті кері жүктеңіз, ÑоÑын қайталап көріңіз.',
+'protectlogpage' => 'Қорғау_журналы',
+'protectlogtext' => 'Төменде беттердің қорғау/қорғамау тізімі берілген.',
+'protectedarticle' => '«$1» қорғалды',
+'unprotectedarticle' => '«[[$1]]» қорғалмады',
+'protectsub' => '(«$1» қорғауда)',
+'confirmprotecttext' => 'ОÑÑ‹ бетті раÑында да қорғау қажет пе?',
+'confirmprotect' => 'Қорғауды раÑтау',
+'protectmoveonly' => 'Тек жылжытудан қорғау',
+'protectcomment' => 'Қорғау Ñебебі',
+'unprotectsub' => '(«$1» қорғамауда)',
+'confirmunprotecttext' => 'ОÑÑ‹ бетті раÑтан қорғамау қажет пе?',
+'confirmunprotect' => 'Қорғамауды раÑтау',
+'unprotectcomment' => 'Қорғамау Ñебебі',
+'protect-unchain' => 'Жылжытуға Ñ€Ò±Ò›Ñат беру',
+'protect-text' => '<strong>$1</strong> бетінің қорғау деңгейін қарай және өзгерте алаÑыз.',
+'protect-viewtext' => 'Тіркелгіңіз бет қорғаныÑÑ‹ денгейлерін өзгертуге Ñ€Ò±Ò›Ñат бермейді.
+Мына <strong>$1</strong> беттің ағымдық баптаулары:',
+'protect-default' => '(әдепкі)',
+'protect-level-autoconfirmed' => 'ТіркелгіÑіз пайдаланушыларға тиым',
+'protect-level-sysop' => 'Тек әкімшілерге Ñ€Ò±Ò›Ñат',
+
+# Restrictions (nouns)
+'restriction-edit' => 'Өңдеу',
+'restriction-move' => 'Жылжыту',
+
+# Undelete
+'undelete' => 'Жойылған беттерді қарау',
+'undeletepage' => 'Жойылған беттерді қарау және қайтару',
+'viewdeletedpage' => 'Жойылған беттерді қарау',
+'undeletepagetext' => 'КелеÑÑ– беттер жойылды деп белгіленген, бірақ мағлұматы мұрағатта жатқан,
+Ñондықтан кері қайтаруға әзір. Мұрағат мерзім бойынша тазаланып тұруы мүмкін.',
+'undeleteextrahelp' => "Бүкіл бетті қайтару үшін, барлық қабашақтарды Ð±Ð¾Ñ Ò›Ð°Ð»Ð´Ñ‹Ñ€Ñ‹Ð¿
+'''''Қайтар!''''' түймеÑін нұқыңыз. Бөлекше қайтару орындау үшін, қайтарайын деген нұÑқаларына ÑәйкеÑ
+қабашақтарын белгілеңіз де, және '''''Қайтар!''''' түймеÑін нұқыңыз. '''''ТаÑта''''' түймеÑін
+нұқығанда мәндеме аумағы мен барлық қабашақтар тазаланады.",
+'undeletearticle' => 'Жойылған бетті қайтару',
+'undeleterevisions' => '$1 нұÑқа мұрағатталған',
+'undeletehistory' => 'Егер бет мағлұматын қайтарÑаңыз,тарихында барлық нұÑқалар да
+қайтарылады. Егер жоюдан Ñоң дәл Ñолай атауымен жаңа бет жаÑалÑа, қайтарылған нұÑқалар
+тарихтың ең адында көрÑетіледі, және көрÑетіліп тұрған беттің ағымдық нұÑқаÑÑ‹
+өздік түрде алмаÑтырылмайды.',
+'undeletehistorynoadmin' => 'Бұл бет жойылған. Жою Ñебебі алдындағы өңдеген қатыÑушылар
+егжей-тегжейлерімен бірге төмендегі ÑипаттамаÑында көрÑетілген.
+ОÑÑ‹ жойылған нұÑқалардың мәтіні тек әкімшілерге қатынаулы.',
+'undeleterevision' => '$1 кезіндегі жойылған нұÑқаÑын',
+'undeleterevision-missing' => 'ЖарамÑыз не жоғалған нұÑқа. Сілтемеңіз жарамÑыз болуы мүмкін, не
+нұÑқа қайтарылған түге немеÑе мұрағаттан алаÑтатылған.',
+'undeletebtn' => 'Қайтар!',
+'undeletereset' => 'ТаÑта',
+'undeletecomment' => 'МәндемеÑÑ–:',
+'undeletedarticle' => '«[[$1]]» қайтарды',
+'undeletedrevisions' => '$1 нұÑқаÑÑ‹ қайтарылған',
+'undeletedrevisions-files' => '$1 нұÑқа және $2 файл қайтарылды',
+'undeletedfiles' => '$1 файл қайтарылды',
+'cannotundelete' => 'Қайтару ÑәтÑіз бітті; тағы біреу Ñізден бұрын Ñол бетті қайтарған болар.',
+'undeletedpage' => "<big>'''$1 қайтарылды'''</big>
+
+Жуықтағы жою мен қайтару жөнінде [[{{ns:special}}:Log/delete|жою журналын]] қараңыз.",
+
+# Namespace form on various pages
+'namespace' => 'ЕÑім аÑÑÑ‹:',
+'invert' => 'Талғауды керілеу',
+
+# Contributions
+'contributions' => 'ҚатыÑушы үлеÑÑ–',
+'mycontris' => 'ҮлеÑім',
+'contribsub' => '$1 үлеÑÑ–',
+'nocontribs' => 'ОÑÑ‹ іздеу шартына ÑÓ™Ð¹ÐºÐµÑ Ó©Ð·Ð³ÐµÑ€Ñ–Ñтер табылған жоқ.',
+'ucnote' => 'Төменде оÑÑ‹ қатыÑушының Ñоңғы <b>$2</b> күндегі, Ñоңғы <b>$1</b> өзгеріÑÑ– көрÑетледі.',
+'uclinks' => 'Соңғы $2 күндегі, Ñоңғы $1 өзгеріÑін қарау.',
+'uctop' => ' (Ò¯ÑÑ‚Ñ–)',
+'newbies' => 'жаңа қатыÑушылар',
+
+'sp-newimages-showfrom' => '$1 кезінен бері — жаңа Ñуреттерді көрÑет',
+
+'sp-contributions-newest' => 'Ең жаңаÑына',
+'sp-contributions-oldest' => 'Ең еÑкіÑіне',
+'sp-contributions-newer' => 'Жаңалау $1',
+'sp-contributions-older' => 'ЕÑкілеу $1',
+'sp-contributions-newbies-sub' => 'Жаңа қатыÑушыларға',
+
+# What links here
+'whatlinkshere' => 'Сілтеген беттер',
+'notargettitle' => 'Ðқырғы атау жоқ',
+'notargettext' => 'ОÑÑ‹ әрекет орындалатын ныÑана бет,
+не қатыÑушы көрÑетілмеген.',
+'linklistsub' => '(Сілтемелер тізімі)',
+'linkshere' => "'''[[:$1]]''' дегенге мына беттер Ñілтейді:",
+'nolinkshere' => "'''[[:$1]]''' дегенге еш бет Ñілтемейді.",
+'isredirect' => 'айдату беті',
+'istemplate' => 'кіріктіру',
+
+# Block/unblock
+'blockip' => 'Пайдаланушыны бұғаттау',
+'blockiptext' => 'Төмендегі үлгіт пайдаланушының жазу Ñ€Ò±Ò›Ñатын
+белгілі IP жайымен не атауымен бұғаттау үшін қолданылады.
+Бұны тек бұзақылыққа кедергі Ñ–Ñтеу үшін және де
+[[{{ns:project}}:СаÑÑат|ÑаÑÑат]] бойынша атқаруыңыз жөн.
+Төменде тиіÑÑ‚Ñ– Ñебебін толтырып көрÑетіңіз (мыÑалы, дәйекке бұзақылықпен
+өзгерткен беттерді келтіріп).',
+'ipaddress' => 'IP жай',
+'ipadressorusername' => 'IP жай не қатыÑушы аты',
+'ipbexpiry' => 'Бітетін мерзімі',
+'ipbreason' => 'Себебі',
+'ipbanononly' => 'Тек тіркелгіÑізді бұғаттау',
+'ipbcreateaccount' => 'Тіркелгі жаÑауын кедергілеу',
+'ipbenableautoblock' => 'Бұл қатыÑушының қолданған Ñоңғы IP жайын, және әрқайÑÑ‹ кейін түзету Ñ–Ñтеуге үмітеліген жайларын өздік түрде бұғаттау',
+'ipbsubmit' => 'Пайдаланушыны бұғаттау',
+'ipbother' => 'БаÑқа мерзім',
+'ipboptions' => '2 Ñағат:2 hours,1 күн:1 day,3 күн:3 days,1 апта:1 week,2 апта:2 weeks,1 ай:1 month,3 ай:3 months,6 ай:6 months,1 жыл:1 year,мәнгі:infinite',
+'ipbotheroption' => 'баÑқа',
+'badipaddress' => 'ЖарамÑыз IP жай',
+'blockipsuccesssub' => 'Бұғаттау Ñәтті Ó©Ñ‚Ñ‚Ñ–',
+'blockipsuccesstext' => '[[{{ns:special}}:Contributions/$1|$1]] деген бұғатталған.
+<br />Бұғаттауларды [[{{ns:special}}:Ipblocklist|IP бұғаттау тізімінде]] қарап шығыңыз.',
+'unblockip' => 'Пайдаланушыны бұғаттамау',
+'unblockiptext' => 'Төмендегі үлгіт белгілі IP жайымен не атауымен
+бұрын бұғатталған пайдаланушының жазу Ñ€Ò±Ò›Ñатын қайтару үшін қолданылады.',
+'ipusubmit' => 'ОÑÑ‹ жайды бұғаттамау',
+'unblocked' => '[[{{ns:user}}:$1|$1]] бұғаттауы өшірілді',
+'ipblocklist' => 'Бұғатталған пайдаланушы / IP- жай тізімі',
+'blocklistline' => '$1, $2 «$3» дегенді бұғаттады ($4)',
+'infiniteblock' => 'мәнгі',
+'expiringblock' => 'бітуі: $1',
+'anononlyblock' => 'тек тіркелгіÑізді',
+'noautoblockblock' => 'өздік бұғаттау өшіріленген',
+'createaccountblock' => 'тіркелгі жаÑауы бұғатталған',
+'ipblocklistempty' => 'Бұғаттау тізімі боÑ.',
+'blocklink' => 'бұғаттау',
+'unblocklink' => 'бұғаттамау',
+'contribslink' => 'үлеÑÑ–',
+'autoblocker' => "IP жайыңызды жуықта «[[{{ns:user}}:1|$1]]» пайдаланған, Ñондықтан өздік түрде бұғатталған. $1 бұғаттау Ñебебі: «'''$2'''».",
+'blocklogpage' => 'Бұғаттау_журналы',
+'blocklogentry' => '«[[$1]]» бұғаттады, бітетін мерзімі: $2',
+'blocklogtext' => 'Бұл пайдаланушыларды бұғаттау/бұғаттамау әрекеттерінің журналы. Өздік түрде
+бұғатталған IP жайлар оÑында тізімделгемеген. Ðғымдағы белÑенді бұғаттауларын
+[[{{ns:special}}:Ipblocklist|IP бұғаттау тізімінен]] қарауға болады.',
+'unblocklogentry' => '«$1» бұғаттауын өшірді',
+'range_block_disabled' => 'Ðуқым бұғаттауын жаÑау әкімшілік мүмкіндігі өшірілген.',
+'ipb_expiry_invalid' => 'Бітетін уақыты жарамÑыз.',
+'ipb_already_blocked' => '«$1» бұғатталған түге',
+'ip_range_invalid' => 'IP жай ауқымы жарамÑыз.',
+'proxyblocker' => 'ПрокÑи Ñерверлерді бұғаттауыш',
+'ipb_cant_unblock' => 'Қате: IP $1 бұғаттауы табылмады. Оның бұғаттауы өшірлген ÑиÑқты.',
+'proxyblockreason' => 'IP жайыңыз ашық прокÑи Ñерверге жататындықтан бұғатталған. Интернет қызметін жабдықтаушыңызбен, не техникалық медеу қызметімен қатынаÑыңыз, және оларға оÑÑ‹ оте күрделі қауыпÑіздік шатақ туралы ақпарат беріңіз.',
+'proxyblocksuccess' => 'Бітті.',
+'sorbs' => 'DNSBL қара тізімі',
+'sorbsreason' => 'Сіздің IP жайыңыз оÑÑ‹ торапта қолданылған DNSBL қара тізіміндегі ашық прокÑи-Ñервер деп табылады.',
+'sorbs_create_account_reason' => 'Сіздің IP жайыңыз оÑÑ‹ торапта қолданылған DNSBL қара тізіміндегі ашық прокÑи-Ñервер деп табылады. Тіркелгі жаÑай алмайÑыз.',
+
+# Developer tools
+'lockdb' => 'Дерекқорды құлыптау',
+'unlockdb' => 'Дерекқорды құлыптамау',
+'lockdbtext' => 'Дерекқордын құлыпталуы барлық пайдаланушының
+бет өңдеу, баптауын қалау, бақылау тізімін, тағы баÑқа
+дерекқорды өзгертетін мүмкіндіктерін тоқтата тұрады.
+ОÑÑ‹ мақÑатыңызды, және жөндеуіңіз біткенде
+дерекқорды ашатыңызды раÑтаңыз.',
+'unlockdbtext' => 'Дерекқодын ашылуы барлық пайдаланушының бет өңдеу,
+баптауын қалау, бақылау тізімін, тағы баÑқа дерекқорды өзгертетін
+мүмкіндіктерін қайта ашады.
+ОÑÑ‹ мақÑатыңызды раÑтаңыз.',
+'lockconfirm' => 'Иә, мен дерекқорды раÑтан құлыптаймын.',
+'unlockconfirm' => 'Иә, мен дерекқорды раÑтан құлыптамаймын.',
+'lockbtn' => 'Дерекқорды құлыпта',
+'unlockbtn' => 'Дерекқорды құлыптама',
+'locknoconfirm' => 'РаÑтау белгіÑін қоймапÑыз.',
+'lockdbsuccesssub' => 'Дерекқорды құлыптау Ñәтті Ó©Ñ‚Ñ‚Ñ–',
+'unlockdbsuccesssub' => 'Құлыпталған дерекқор ашылды',
+'lockdbsuccesstext' => 'Дерекқор құлыпталды.
+<br />Жөндеуіңіз біткеннен кейін [[{{ns:special}}:Unlockdb|құлыптауын өшіруге]] ұмытпаңыз.',
+'unlockdbsuccesstext' => 'Құлыпталған дерекқор Ñәтті ашылды.',
+'lockfilenotwritable' => 'Дерекқор құлыптау файлы жазылмайды. Дерекқорды құлыптау не ашу үшін, веб-Ñервер файлға жазу Ñ€Ò±Ò›Ñаты болу қажет.',
+'databasenotlocked' => 'Дерекқор құлыпталған жоқ.',
+
+# Make sysop
+'makesysoptitle' => 'ҚатыÑушыны әкімші қылу',
+'makesysoptext' => 'Бұл үлгітті қарапайым қатыÑушыны әкімші қылу үшін төрешілер қолданады.
+Жолаққа қатыÑушы атын енгізіңіз де, және бұл қатыÑушыны әкімші қылу үшін, түймені баÑыңыз.',
+'makesysopname' => 'ҚатыÑушы аты:',
+'makesysopsubmit' => 'Бұл қатыÑушыны әкімші қыл',
+'makesysopok' => '<b>«$1» деген қатыÑушы енді әкімші боп тағайындалды</b>',
+'makesysopfail' => '<b>«$1» деген қатыÑушы әкімші боп тағайындалмады. (Ðтын Ð´Ò±Ñ€Ñ‹Ñ ÐµÐ½Ð³Ñ–Ð·Ð´Ñ–Ò£Ñ–Ð· бе?)</b>',
+'setbureaucratflag' => 'ҚатыÑушыны төреші қылу',
+'rightslog' => 'ҚатыÑушы_құқықтары_журналы',
+'rightslogtext' => 'Бұл пайдаланушы құқықтарын өзгерту журналы.',
+'rightslogentry' => ' $1 топ мүшелгін $2 дегеннен $3 дегенге өзгертті',
+'rights' => 'Құқықтары:',
+'set_user_rights' => 'ҚатыÑушы құқықтарын тағайындау',
+'user_rights_set' => '<b>«$1» деген қатыÑушының құқықтары жаңартылды</b>',
+'set_rights_fail' => '<b>«$1» деген қатыÑушының құқықтары тағайындалмады. (Ðтын Ð´Ò±Ñ€Ñ‹Ñ ÐµÐ½Ð³Ñ–Ð·Ð´Ñ–Ò£Ñ–Ð· бе?)</b>',
+'makesysop' => 'ҚатыÑушыны әкімші қылу',
+'already_sysop' => 'Бұл қатыÑушы әкімші бопты түге',
+'already_bureaucrat' => 'Бұл қатыÑушы тореші бопты түге',
+'rightsnone' => '(ешқандай)',
+
+# Move page
+'movepage' => 'Бетті жылжыту',
+'movepagetext' => "Төмендегі үлгітті қолданып беттерді қайта атайды,
+барлық тарихын жаңа атауға жылжытады.
+Бұрынғы бет атауы жаңа атауға айдататын бет болады.
+ЕÑкі атауына Ñілтейтін Ñілтемелер өзгертілмейді; жылжытудан Ñоң
+шынжырлы айдатулар бар-жоғын текÑеріңіз.
+Сілтемелер бұрынғы жолдауымен былайғы өтуін текÑеруіне
+Ñіз міндетті болаÑыз.
+
+ЕÑкеріңіз, егер жылжытылатын атауда бет болÑа, Ñол еÑкі бетке айдату
+болғанша және тарихы болÑа, бет '''жылжытылмайды'''.
+ОÑының мағынаÑÑ‹: егер бетті қателік пен қайта аталÑа,
+бұрынғы атауына қайта атауға болады,
+бірақ бар беттің Ò¯Ñтіне жазуға болмайды.
+
+<b>ÐÐЗÐР СÐЛЫҢЫЗ!</b>
+Бұл дәріпті бетке қатаң және кенет Ó©Ð·Ð³ÐµÑ€Ñ–Ñ Ð¶Ð°Ñауға мүмкін;
+әрекеттің алдынан оÑының зардаптарын Ñ‚Ò¯Ñінгеніңізге батыл
+болыңыз.",
+'movepagetalktext' => "КелеÑÑ– Ñебептер '''болғанша''' дейін, талқылау беті өздік түрде бірге жылжытылады:
+* Ð‘Ð¾Ñ ÐµÐ¼ÐµÑ Ñ‚Ð°Ð»Ò›Ñ‹Ð»Ð°Ñƒ беті жаңа атауда болғанда, немеÑе
+* Төмендегі қабышақта белгіні алаÑтатқанда.
+
+ОÑÑ‹ орайда, қалауыңыз болÑа, бетті қолдан жылжыта не қоÑа алаÑыз.",
+'movearticle' => 'Бетті жылжыту',
+'movenologin' => 'Жүйеге кірмегенÑіз',
+'movenologintext' => 'Бетті жылжыту үшін тіркелген болуыңыз және
+ [[{{ns:special}}:Userlogin|кіруіңіз]] қажет.',
+'newtitle' => 'Жаңа атауға',
+'movepagebtn' => 'Бетті жылжыт',
+'pagemovedsub' => 'Жылжыту Ñәтті аÑқталды',
+'pagemovedtext' => '«[[$1]]» беті «[[$2]]» бетіне жылжытылды.',
+'articleexists' => 'Былай атаулы бет бар болды, не таңдаған
+атауыңыз жарамды емеÑ.
+БаÑқа атау тандаңыз',
+'talkexists' => "'''Беттің өзі Ñәтті жылжытылды, бірақ талқылау беті бірге жылжытылмады, оның Ñебебі жаңа атаудың талқылау беті бар түге. Бұны қолмен қоÑыңыз.'''",
+'movedto' => 'мынаған жылжытылды:',
+'movetalk' => 'ҚатыÑÑ‚Ñ‹ талқылау бетімен бірге жылжыту',
+'talkpagemoved' => 'ҚатыÑÑ‚Ñ‹ талқылау беті де жылжытылды.',
+'talkpagenotmoved' => 'ҚатыÑÑ‚Ñ‹ талқылау беті <strong>жылжытылмады</strong>.',
+'1movedto2' => '«[[$1]]» бетінде айдату қалдырып «[[$2]]» бетіне жылжытты',
+'1movedto2_redir' => '«[[$1]]» бетін «[[$2]]» айдату бетінің Ò¯Ñтіне жылжытты',
+'movelogpage' => 'Жылжыту журналы',
+'movelogpagetext' => 'Төменде жылжытылған беттердің тізімі беріліп тұр.',
+'movereason' => 'Себебі',
+'revertmove' => 'қайтару',
+'delete_and_move' => 'Жою және жылжыту',
+'delete_and_move_text' => '==Жою қажет==
+
+Ðқырғы «[[$1]]» бет атауы бар түге.
+Жылжытуға жол беру үшін жоÑмыз ба?',
+'delete_and_move_confirm' => 'Иә, оÑÑ‹ бетті жой',
+'delete_and_move_reason' => 'Жылжытуға жол беру үшін жойылған',
+'selfmove' => 'Қайнар және ақырғы атауы бірдей; бет өзіне жылжытылмайды.',
+'immobile_namespace' => 'Қайнар немеÑе ақырғы атауы арнайы түрінде болды; оÑындай еÑім аÑÑÑ‹ жағына және жағынан беттер жылжытылмайды.',
+
+# Export
+'export' => 'Беттерді Ñыртқа беру',
+'exporttext' => 'XML пішіміне қапталған бөлек бет не беттер бумаÑÑ‹
+мәтінің және өңдеу тарихын Ñыртқа бере алаÑыз. ОÑыны, баÑқа уики-ге
+{{ns:special}}:Import page MediaWiki құралы арқылы, Ñырттан алуға болады.
+
+Беттерді Ñыртқа беру үшін, атауларын төмендегі мәтін аумағына енгізіңіз,
+бір жолда бір атау, және тандаңыз: не ағымдық нұÑқаÑын, барлық еÑкі нұÑқалары мен
+және тарихы жолдары мен бірге, не дәл ағымдық нұÑқаÑын, Ñоңғы өңдеу туралы ақпараты мен бірге.
+
+Соңғы жағдайда Ñілтемені де қолдануға болады, мыÑалы {{int:mainpage}} беті үшін [[{{ns:Special}}:Export/{{int:mainpage}}]].',
+'exportcuronly' => 'Толық тарихын емеÑ, тек ағымдық нұÑқаÑын кіріÑтіріңіз',
+'exportnohistory' => "----
+'''Ðңғартпа:''' Өнімділік Ó™Ñері Ñебептерінен, беттер толық тарихын Ñыртқа беруі өшірілген.",
+'export-submit' => 'Сыртқа бер',
+
+# Namespace 8 related
+'allmessages' => 'Жүйе хабарлары',
+'allmessagesname' => 'Ðтауы',
+'allmessagesdefault' => 'Әдепкі мәтіні',
+'allmessagescurrent' => 'Ðғымдық мәтіні',
+'allmessagestext' => 'Мында «MediaWiki:» еÑім аÑÑындағы барлық қатынаулы жүйе хабар тізімі беріліп тұр.',
+'allmessagesnotsupportedUI' => 'Your current interface language <b>$1</b> is not supported by Special:Allmessages at this site.',
+'allmessagesnotsupportedDB' => "'''wgUseDatabaseMessages''' бабы өшірілген Ñебебінен '''{{ns:special}}:AllMessages''' Ñипаты Ñүемелденбейді.",
+'allmessagesfilter' => 'Хабарды атауы бойынша Ñүзгілеу:',
+'allmessagesmodified' => 'Тек өзгертілгенді көрÑет',
+
+# Thumbnails
+'thumbnail-more' => 'Үлкейту',
+'missingimage' => '<b>Жоғалған Ñурет </b><br /><i>$1</i>',
+'filemissing' => 'Жоғалған файл',
+'thumbnail_error' => 'Ðобай құру қатеÑÑ–: $1',
+
+# Special:Import
+'import' => 'Беттерді Ñырттан алу',
+'importinterwiki' => 'Уики-таÑымалдап Ñырттан алу',
+'import-interwiki-text' => 'Сырттан алатын уики жобаÑын және бет атауын тандаңыз.
+ÐÒ±Ñқа күн-айы және өңдеуші аттары Ñақталады.
+Барлық уики-таÑымалдап Ñырттан алу әрекеттер [[{{ns:special}}:Log/import|Ñырттан алу журналына]] жазылып алынады.',
+'import-interwiki-history' => 'ОÑÑ‹ беттің барлық тарихи нұÑқаларын көшіру',
+'import-interwiki-submit' => 'Сырттан алу',
+'import-interwiki-namespace' => 'Мына еÑім аÑÑына беттерді таÑымалдау:',
+'importtext' => 'Қайнар уикиден «Special:Export» қуралын қолданып, файлды Ñыртқа беріңіз, диÑкіңізге Ñақтаңыз, ÑоÑын мында қотарыңыз.',
+'importstart' => 'Беттерді Ñырттан алуы…',
+'import-revision-count' => '$1 нұÑқа',
+'importnopages' => 'Сырттан алынатын беттер жоқ.',
+'importfailed' => 'Сырттан алу ÑәтÑіз бітті: $1',
+'importunknownsource' => 'Cырттан алу қайнар түрі танымалÑыз',
+'importcantopen' => 'Сырттан алу файлы ашылмайды',
+'importbadinterwiki' => 'ЖарамÑыз уики-аралық Ñілтеме',
+'importnotext' => 'БоÑÑ‚Ñ‹, не мәтіні жоқ',
+'importsuccess' => 'Сырттан алу Ñәтті аÑқталды!',
+'importhistoryconflict' => 'Тарихының ÐµÐ³ÐµÑ Ð½Ò±Ñқалары бар (бұл бетті алдында Ñырттан алынған ÑиÑқты)',
+'importnosources' => 'Ешқандай уики-таÑымалдап Ñырттан алу қайнары белгіленмеген, және тарихын тікелей қотаруы өшірілген.',
+'importnofile' => 'Сырттан алынатын файл қотарылған жоқ.',
+'importuploaderror' => 'Сырттан алу файлдың қотаруы ÑәтÑіз бітті; оÑÑ‹ файл мөлшері Ñ€Ò±Ò›Ñат етілген мөлшерден аÑуы мүмкін.',
+
+# Import log
+'importlogpage' => 'Сырттан алу журналы',
+'importlogpagetext' => 'БаÑқа уикилерден өңдеу тарихымен бірге беттерді әкімшілік ретінде Ñырттан алу.',
+'import-logentry-upload' => 'файл қотаруымен Ñырттан «[[$1]]» беті алынды',
+'import-logentry-upload-detail' => '$1 нұÑқа',
+'import-logentry-interwiki' => 'уики-таÑымалданған $1',
+'import-logentry-interwiki-detail' => '$2 дегеннен $1 нұÑқа',
+
+# Keyboard access keys for power users
+'accesskey-search' => 'f',
+'accesskey-minoredit' => 'i',
+'accesskey-save' => 's',
+'accesskey-preview' => 'p',
+'accesskey-diff' => 'v',
+'accesskey-compareselectedversions' => 'v',
+'accesskey-watch' => 'w',
+
+# Tooltip help for some actions, most are in Monobook.js
+'tooltip-search' => '{{SITENAME}} жобаÑынан іздеÑтіру [alt-f]',
+'tooltip-minoredit' => 'ОÑыны шағын түзету деп белгілеу [alt-i]',
+'tooltip-save' => 'Түзетуіңізді Ñақтау [alt-s]',
+'tooltip-preview' => 'Сақтаудың алдынан түзетуіңізді қарап шығыңыз! [alt-p]',
+'tooltip-diff' => 'Мәтінге қандай өзгеріÑтерді жаÑағаныңызды қарау. [alt-v]',
+'tooltip-compareselectedversions' => 'Беттің екі нұÑқаÑының айырмаÑын қарау. [alt-v]',
+'tooltip-watch' => 'Бұл бетті бақылау тізіміңізге Ò¯Ñтеу [alt-w]',
+
+# Stylesheets
+'common.css' => '/** Мындағы CSS әмірлері барлық безендіру мәнеріндерде қолданылады */',
+'monobook.css' => '/* Мындағы CSS әмірлері «Дара кітап» безендіру мәнерін пайдаланушыларға Ó™Ñер етеді */',
+
+# Metadata
+'nodublincore' => 'ОÑÑ‹ Ñерверге «Dublin Core RDF» мета-деректері өшірілген.',
+'nocreativecommons' => 'ОÑÑ‹ Ñерверге «Creative Commons RDF» мета-деректері өшірілген.',
+'notacceptable' => 'ОÑÑ‹ уики Ñервері Ñіздің «пайдаланушы әрекеткіші» оқи алатын пішімі бар деректерді жібере алмайды.',
+
+# Attribution
+'anonymous' => '{{SITENAME}} тіркелгіÑіз пайдаланушы(лар)',
+'siteuser' => '{{SITENAME}} қатыÑушы $1',
+'lastmodifiedatby' => 'Бұл бетті $3 қатыÑушы Ñоңғы өзгерткен кезі: $2, $1.', # $1 date, $2 time, $3 user
+'and' => 'және',
+'othercontribs' => 'Шығарма негізін $1 жазған.',
+'others' => 'баÑқалар',
+'siteusers' => '{{SITENAME}} қатыÑушы(лар) $1',
+'creditspage' => 'Бетті жазғандар',
+'nocredits' => 'Бұл бетті жазғандар туралы ақпарат жоқ.',
+
+# Spam protection
+'spamprotectiontitle' => '«Спам»-нан қорғайтын Ñүзгі',
+'spamprotectiontext' => 'Бұл беттің Ñақтауын «Ñпам» ÑүзгіÑÑ– бұғаттады. Бұның Ñебебі Ñыртқы торап ÑілтемеÑінен болуы мүмкін.',
+'spamprotectionmatch' => 'КелеÑÑ– «Ñпам» мәтіні Ñүзгіленген: $1',
+'subcategorycount' => 'Бұл Ñанатта {{PLURAL:$1|бір|$1}} төменгі Ñанат бар.',
+'categoryarticlecount' => 'Бұл Ñанатта {{PLURAL:$1|бір|$1}} бет бар.',
+'category-media-count' => 'Бұл Ñанатта {{PLURAL:$1|бір|$1}} файл бар.',
+'listingcontinuesabbrev' => ' (жалғ.)',
+'spambot_username' => 'MediaWiki spam cleanup',
+'spam_reverting' => '$1 дегенге ÑілтемеÑÑ– жоқ Ñоңғы нұÑқаÑына қайтарылды',
+'spam_blanking' => '$1 дегенге ÑілтемеÑÑ– бар барлық нұÑқалар тазартылды',
+
+# Info page
+'infosubtitle' => 'Бет туралы ақпарат',
+'numedits' => 'Түзету Ñаны (негізгі беті): $1',
+'numtalkedits' => 'Түзету Ñаны (талқылау беті): $1',
+'numwatchers' => 'Бақылаушы Ñаны: $1',
+'numauthors' => 'Әртүрлі ауторлар Ñаны (негізгі беті): $1',
+'numtalkauthors' => 'Әртүрлі аутор Ñаны (талқылау беті): $1',
+
+# Math options
+'mw_math_png' => 'Әрқашан PNG түрімен көрÑет',
+'mw_math_simple' => 'Кәдімгі болÑа HTML пішімімен, баÑқаша PNG түрімен',
+'mw_math_html' => 'Ықтимал болÑа HTML пішімімен, баÑқаша PNG түрімен',
+'mw_math_source' => 'TeX пішімінде қалдыру (мәтіндік шолғыштарына)',
+'mw_math_modern' => 'ОÑÑ‹ заманның шолғыштарына Ò±Ñынылған',
+'mw_math_mathml' => 'Ықтимал болÑа MathML пшімімен (Ñынақ түрінде)',
+
+# Patrolling
+'markaspatrolleddiff' => 'Күзетте деп белгілеу',
+'markaspatrolledtext' => 'ОÑÑ‹ бетті күзетуде деп белгілеу',
+'markedaspatrolled' => 'Күзетте деп белгіленді',
+'markedaspatrolledtext' => 'Талғанған нұÑқа күзетте деп белгіленді.',
+'rcpatroldisabled' => 'Жуықтағы өзгеріÑтер Күзеті өшірілген',
+'rcpatroldisabledtext' => 'Жуықтағы өзгеріÑтер Күзеті қаÑиеті ағымда өшірілген.',
+'markedaspatrollederror' => 'Күзетте деп белгіленбейді',
+'markedaspatrollederrortext' => 'Күзетте деп белгілеу үшін нұÑқаÑын енгізіңіз.',
+
+# Monobook.js: tooltips and access keys for monobook
+'monobook.js' => "/* tooltips and access keys */
+var ta = new Object();
+ta['pt-userpage'] = new Array('.','Жеке бетім');
+ta['pt-anonuserpage'] = new Array('.','ОÑÑ‹ IP жайдың жеке беті');
+ta['pt-mytalk'] = new Array('n','Талқылау бетім');
+ta['pt-anontalk'] = new Array('n','ОÑÑ‹ IP жай түзетулерін талқылау');
+ta['pt-preferences'] = new Array('','Баптауым');
+ta['pt-watchlist'] = new Array('l','ӨзгеріÑтерін бақылап тұрған беттер тізімім.');
+ta['pt-mycontris'] = new Array('y','ҮлеÑтерімдің тізімі');
+ta['pt-login'] = new Array('o','Кіруіңізді Ò±Ñынамыз, ол міндетті емеÑ.');
+ta['pt-anonlogin'] = new Array('o','Кіруіңізді Ò±Ñынамыз, бірақ, ол міндетті емеÑ.');
+ta['pt-logout'] = new Array('','Шығу');
+ta['ca-talk'] = new Array('t','Мағлұмат бетті талқылау');
+ta['ca-edit'] = new Array('e','Бұл бетті өңдей алаÑыз. Сақтаудың алдында «Қарап шығу» түймеÑін нұқыңыз.');
+ta['ca-addsection'] = new Array('+','Бұл талқылау бетінде жаңа тарау баÑтау.');
+ta['ca-viewsource'] = new Array('e','Бұл бет қорғалған, бірақ, қайнарын қарауға болады.');
+ta['ca-history'] = new Array('h','Бұл беттін жуықтағы нұÑқалары.');
+ta['ca-protect'] = new Array('=','Бұл бетті қорғау');
+ta['ca-unprotect'] = new Array('=','Бұл бетті қорғамау');
+ta['ca-delete'] = new Array('d','Бұл бетті жою');
+ta['ca-undelete'] = new Array('d','Бұл беттің жоюдың алдындағы болған түзетулерін қайтару');
+ta['ca-move'] = new Array('m','Бұл бетті жылжыту');
+ta['ca-nomove'] = new Array('m','Бұл бетті жылжытуға Ñ€Ò±Ò›Ñатыңыз жоқ');
+ta['ca-watch'] = new Array('w','Бұл бетті бақылау тізіміңізге Ò¯Ñтеу');
+ta['ca-unwatch'] = new Array('w','Бұл бетті бақылау тізіміңізден алаÑтату');
+ta['ca-varlang-0'] = new Array('','Кирилл жазуы');
+ta['ca-varlang-1'] = new Array('','Латын жазуы');
+ta['ca-varlang-2'] = new Array('','Ðраб жазуы');
+ta['search'] = new Array('f','ОÑÑ‹ уикиден іздеу');
+ta['p-logo'] = new Array('','БаÑÑ‚Ñ‹ бетке');
+ta['n-mainpage'] = new Array('z','БаÑÑ‚Ñ‹ бетке барып кетіңіз');
+ta['n-portal'] = new Array('','Жоба туралы, не Ñ–Ñтеуіңізге болатын, қайдан табуға болатын туралы');
+ta['n-currentevents'] = new Array('','Ðғымдағы оқиғаларға қатыÑÑ‚Ñ‹ ақпарат');
+ta['n-recentchanges'] = new Array('r','ОÑÑ‹ уикидегі жуықтағы өзгеріÑтер тізімі.');
+ta['n-randompage'] = new Array('x','КездейÑоқ бетті жүктеу');
+ta['n-help'] = new Array('','Ðнықтама табу орны.');
+ta['n-sitesupport'] = new Array('','Бізге жәрдем етіңіз');
+ta['t-whatlinkshere'] = new Array('j','Мында Ñілтеген барлық беттердің тізімі');
+ta['t-recentchangeslinked'] = new Array('k','Мыннан Ñілтенген беттердің жуықтағы өзгеріÑтері');
+ta['feed-rss'] = new Array('','Бұл беттің RSS арнаÑÑ‹');
+ta['feed-atom'] = new Array('','Бұл беттің Atom арнаÑÑ‹');
+ta['t-contributions'] = new Array('','ОÑÑ‹ қатыÑушының Ò¯Ð»ÐµÑ Ñ‚Ñ–Ð·Ñ–Ð¼Ñ–Ð½ қарау');
+ta['t-emailuser'] = new Array('','ОÑÑ‹ қатыÑушыға email жіберу');
+ta['t-upload'] = new Array('u','Сурет не медиа файлдарын қотару');
+ta['t-specialpages'] = new Array('q','Барлық арнайы беттер тізімі');
+ta['t-print'] = new Array('','ОÑÑ‹ беттің баÑып шығару нұÑқаÑÑ‹');
+ta['t-permalink'] = new Array('','Беттің оÑÑ‹ нұÑқаÑының тұрақты ÑілтемеÑÑ–');
+ta['ca-nstab-main'] = new Array('c','Мағлұмат бетін қарау');
+ta['ca-nstab-user'] = new Array('c','ҚатыÑушы бетін қарау');
+ta['ca-nstab-media'] = new Array('c','ТаÑпа бетін қарау');
+ta['ca-nstab-special'] = new Array('','Бұл арнайы бет, беттің өзі өңделінбейді.');
+ta['ca-nstab-project'] = new Array('a','Жоба бетін қарау');
+ta['ca-nstab-image'] = new Array('c','Сурет бетін қарау');
+ta['ca-nstab-mediawiki'] = new Array('c','Жүйе хабарын қарау');
+ta['ca-nstab-template'] = new Array('c','Үлгіні қарау');
+ta['ca-nstab-help'] = new Array('c','Ðнықтыма бетін қарау');
+ta['ca-nstab-category'] = new Array('c','Санат бетін қарау');",
+
+# Common.js: contains nothing but a placeholder comment
+'common.js' => '/* Мындағы кез келген JavaScript әмірлері әрқайÑÑ‹ бет жүктелгенде барлық пайдаланушыларға жүктеледі. */
+
+// BEGIN workaround for RTL
+if (wgUserLanguage == "kk-cn"){
+ document.direction="rtl";
+ document.write(\'<style type="text/css">html {direction: rtl;}</style>\');
+ document.write(\'<link rel="stylesheet" type="text/css" href="\'+stylepath+\'/common/common_rtl.css">\');
+ document.write(\'<link rel="stylesheet" type="text/css" href="\'+stylepath+\'/\'+skin+\'/rtl.css">\');
+}
+// END workaround for RTL',
+
+# Image deletion
+'deletedrevision' => 'Мына еÑкі нұÑқаÑын жойды: $1.',
+
+# Browsing diffs
+'previousdiff' => '↠Ðлдыңғымен айырмаÑÑ‹',
+'nextdiff' => 'КелеÑімен айырмаÑÑ‹ →',
+
+'imagemaxsize' => 'Сурет түйіндеме бетіндегі Ñуреттің мөлшерін шектеуі:',
+'thumbsize' => 'Ðобай мөлшері:',
+'showbigimage' => 'Жоғары ажыратылымды ($1×$2, $3 кБ) нұÑқаÑын жүктеу',
+
+'newimages' => 'Ең жаңа файлдар қоймаÑÑ‹',
+'showhidebots' => '(боттарды $1)',
+'noimages' => 'Көретін ештеңе жоқ.',
+
+# Variants for Kazakh language
+'variantname-kk-tr' => 'Latın',
+'variantname-kk-kz' => 'Кирил',
+'variantname-kk-cn' => 'توتە',
+'variantname-kk' => 'disable',
+
+# Labels for User: and Title: on Special:Log pages
+'specialloguserlabel' => 'ҚатыÑушы:',
+'speciallogtitlelabel' => 'Ðтау:',
+
+'passwordtooshort' => 'ÒšÒ±Ð¿Ð¸Ñ Ñөзіңіз тым қыÑқа. Ең кемінде $1 әріп болуы қажет.',
+
+# Media Warning
+'mediawarning' => "'''Ðазар Ñалыңыз''': Бұл файл түрінде қаÑкүнемді әмірдің бар болуы ықтимал; файлды жегіп жүйеңізге зиÑн келтіруіңіз мүмкін.<hr />",
+
+'fileinfo' => '$1 кБ, MIME түрі: <code>$2</code>',
+
+# Metadata
+'metadata' => 'Мета-деректері',
+'metadata-help' => 'ОÑÑ‹ файлда қоÑымша ақпарат бар. Бәлкім, оÑÑ‹ ақпарат файлды жаÑап шығару, не Ñандылау үшін пайдаланған Ñандық камера, не мәтіналғырдан алынған. Егер оÑÑ‹ файл негізгі күйінен өзгертілген болÑа, кейбір ежелелері өзгертілген фотоÑуретке лайық болмаÑ.',
+'metadata-expand' => 'Егжей-тегжейін көрÑет',
+'metadata-collapse' => 'Егжей-тегжейін жаÑÑ‹Ñ€',
+'metadata-fields' => 'ОÑÑ‹ хабарда тізімделген EXIF мета-дерек аумақтары,
+Ñурет беті көрÑету кезінде мета-дерек кеÑте жаÑырылығанда кіріÑтірледі.
+БаÑқаÑÑ‹ әдепкіден жаÑырылады.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* focallength',
+
+# EXIF tags
+'exif-imagewidth' => 'Ені',
+'exif-imagelength' => 'Биіктігі',
+'exif-bitspersample' => 'Құраш Ñайын бит Ñаны',
+'exif-compression' => 'ҚыÑым ÑұлбаÑÑ‹',
+'exif-photometricinterpretation' => 'ПикÑел қиыÑуы',
+'exif-orientation' => 'Мегзеуі',
+'exif-samplesperpixel' => 'Құраш Ñаны',
+'exif-planarconfiguration' => 'Дерек реттеуі',
+'exif-ycbcrsubsampling' => 'Y құрашының C құрашына жарнақтауы',
+'exif-ycbcrpositioning' => 'Y құрашы және C құрашы мекендеуі',
+'exif-xresolution' => 'Дерелей ажыратылымдығы',
+'exif-yresolution' => 'Тірелей ажыратылымдығы',
+'exif-resolutionunit' => 'X және Y ажыратылымдықтарығының өлшемі',
+'exif-stripoffsets' => 'Сурет дереректерінің жайғаÑуы',
+'exif-rowsperstrip' => 'Белдік Ñайын жол Ñаны',
+'exif-stripbytecounts' => 'ҚыÑымдалған белдік Ñайын байт Ñаны',
+'exif-jpeginterchangeformat' => 'JPEG SOI дегеннен Ñ‹Ò“Ñ‹Ñуы',
+'exif-jpeginterchangeformatlength' => 'JPEG деректерінің байт Ñаны',
+'exif-transferfunction' => 'ТаÑымалдау функциÑÑÑ‹',
+'exif-whitepoint' => 'ÐÒ› нүкте Ñ‚Ò¯Ñтілігі',
+'exif-primarychromaticities' => 'Ðлғы шептегі Ñ‚Ò¯Ñтіліктері',
+'exif-ycbcrcoefficients' => 'Ð¢Ò¯Ñ Ð°ÑÑын таÑымалдау матрицалық еÑеліктері',
+'exif-referenceblackwhite' => 'Қара және ақ анықтауыш Ò›Ð¾Ñ ÐºÐ¾Ð»ÐµÐ¼Ð´ÐµÑ€Ñ–',
+'exif-datetime' => 'Файлдың өзгертілген күн-айы',
+'exif-imagedescription' => 'Сурет атауы',
+'exif-make' => 'Камера өндірушіÑÑ–',
+'exif-model' => 'Камера үлгіÑÑ–',
+'exif-software' => 'Қолданылған бағдарлама',
+'exif-artist' => 'ЖығармашыÑÑ‹',
+'exif-copyright' => 'Жығармашылық құқықтар иеÑÑ–',
+'exif-exifversion' => 'Exif нұÑқаÑÑ‹',
+'exif-flashpixversion' => 'Сүйемделінген Flashpix нұÑқаÑÑ‹',
+'exif-colorspace' => 'Ð¢Ò¯Ñ Ð°ÑÑÑ‹',
+'exif-componentsconfiguration' => 'ӘрқайÑÑ‹ құраш мәні',
+'exif-compressedbitsperpixel' => 'Сурет қыÑымдау тәртібі',
+'exif-pixelydimension' => 'Суреттің жарамды ені',
+'exif-pixelxdimension' => 'Суреттің жарамды биіктігі',
+'exif-makernote' => 'Өндіруші еÑкертпелері',
+'exif-usercomment' => 'Пайдаланушы мәндемелері',
+'exif-relatedsoundfile' => 'ҚатыÑÑ‚Ñ‹ Ð´Ñ‹Ð±Ñ‹Ñ Ñ„Ð°Ð¹Ð»Ñ‹',
+'exif-datetimeoriginal' => 'ЖаÑалған кезі',
+'exif-datetimedigitized' => 'Сандықтау кезі',
+'exif-subsectime' => 'ЖаÑалған кезінің Ñекунд бөлшектері',
+'exif-subsectimeoriginal' => 'ТүпнұÑқа кезінің Ñекунд бөлшектері',
+'exif-subsectimedigitized' => 'Сандықтау кезінің Ñекунд бөлшектері',
+'exif-exposuretime' => 'Ò°Ñталым уақыты',
+'exif-exposuretime-format' => '$1 Ñ ($2)',
+'exif-fnumber' => 'Саңылау мөлшері',
+'exif-fnumber-format' => 'f/$1',
+'exif-exposureprogram' => 'Ò°Ñталым бағдарламаÑÑ‹',
+'exif-spectralsensitivity' => 'Спектр бойынша Ñезгіштігі',
+'exif-isospeedratings' => 'ISO жылдамдық жарнақтауы (жарық Ñезгіштігі)',
+'exif-oecf' => 'Оптоелектронды түрлету ықпалы',
+'exif-shutterspeedvalue' => 'Жапқыш жылдамдылығы',
+'exif-aperturevalue' => 'Саңылаулық',
+'exif-brightnessvalue' => 'Ðшықтық',
+'exif-exposurebiasvalue' => 'Ò°Ñталым өтемі',
+'exif-maxaperturevalue' => 'Барынша Ñаңылау ашуы',
+'exif-subjectdistance' => 'ÐÑ‹Ñана қашықтығы',
+'exif-meteringmode' => 'Өлшеу тәртібі',
+'exif-lightsource' => 'Жарық көзі',
+'exif-flash' => 'Жарқылдағыш',
+'exif-focallength' => 'Шоғырлау алшақтығы',
+'exif-focallength-format' => '$1 mm',
+'exif-subjectarea' => 'ÐÑ‹Ñана ауқымы',
+'exif-flashenergy' => 'Жарқылдағыш қарқыны',
+'exif-spatialfrequencyresponse' => 'КеңіÑтік-жиілік Ó™Ñершілігі',
+'exif-focalplanexresolution' => 'Х бойынша шоғырлау жайпақтықтың ажыратылымдығы',
+'exif-focalplaneyresolution' => 'Y бойынша шоғырлау жайпақтықтың ажыратылымдығы',
+'exif-focalplaneresolutionunit' => 'Шоғырлау жайпақтықтың ажыратылымдық өлшемі',
+'exif-subjectlocation' => 'ÐÑ‹Ñана мекендеуі',
+'exif-exposureindex' => 'Ò°Ñталым айқындауы',
+'exif-sensingmethod' => 'СенÑордің өлшеу әдіÑÑ–',
+'exif-filesource' => 'Файл қайнары',
+'exif-scenetype' => 'Сахна түрі',
+'exif-cfapattern' => 'CFA Ñүзгі кейіпі',
+'exif-customrendered' => 'ҚоÑымша Ñурет өңдетуі',
+'exif-exposuremode' => 'Ò°Ñталым тәртібі',
+'exif-whitebalance' => 'ÐÒ› Ñ‚Ò¯Ñінің тендеÑтігі',
+'exif-digitalzoomratio' => 'Сандық ауқымдау жарнақтауы',
+'exif-focallengthin35mmfilm' => '35 mm таÑпаÑының шоғырлау алшақтығы',
+'exif-scenecapturetype' => 'ТүÑірген Ñахна түрі',
+'exif-gaincontrol' => 'Сахнаны меңгеру',
+'exif-contrast' => 'Қарама-қарÑылық',
+'exif-saturation' => 'Қанықтық',
+'exif-sharpness' => 'Ðйқындық',
+'exif-devicesettingdescription' => 'Жабдық баптау Ñипаттары',
+'exif-subjectdistancerange' => 'Сахна қашықтығының көлемі',
+'exif-imageuniqueid' => 'Суреттің бірегей нөмірі (ID)',
+'exif-gpsversionid' => 'GPS белгішеÑінің нұÑқаÑÑ‹',
+'exif-gpslatituderef' => 'СолтүÑтік немеÑе ОңтүÑтік бойлығы',
+'exif-gpslatitude' => 'Бойлығы',
+'exif-gpslongituderef' => 'Ð¨Ñ‹Ò“Ñ‹Ñ Ð½ÐµÐ¼ÐµÑе Ð‘Ð°Ñ‚Ñ‹Ñ ÐµÐ½Ð´Ñ–Ð³Ñ–',
+'exif-gpslongitude' => 'Ендігі',
+'exif-gpsaltituderef' => 'Биіктік көрÑетуі',
+'exif-gpsaltitude' => 'Биіктік',
+'exif-gpstimestamp' => 'GPS уақыты (атом Ñағаты)',
+'exif-gpssatellites' => 'Өлшеуге пйдаланылған Жер Ñеріктері',
+'exif-gpsstatus' => 'Қабылдағыш күйі',
+'exif-gpsmeasuremode' => 'Өлшеу тәртібі',
+'exif-gpsdop' => 'Өлшеу дәлдігі',
+'exif-gpsspeedref' => 'Жылдамдылық өлшемі',
+'exif-gpsspeed' => 'GPS қабылдағыштың жылдамдылығы',
+'exif-gpstrackref' => 'ÒšÐ¾Ð·Ò“Ð°Ð»Ñ‹Ñ Ð±Ð°Ò“Ñ‹Ñ‚Ñ‹Ð½ көрÑетуі',
+'exif-gpstrack' => 'ÒšÐ¾Ð·Ò“Ð°Ð»Ñ‹Ñ Ð±Ð°Ò“Ñ‹Ñ‚Ñ‹',
+'exif-gpsimgdirectionref' => 'Сурет бағытын көрÑетуі',
+'exif-gpsimgdirection' => 'Сурет бағыты',
+'exif-gpsmapdatum' => 'Пайдаланылған геодезиÑлық Ñ‚Ò¯Ñірме деректері',
+'exif-gpsdestlatituderef' => 'ÐÑ‹Ñана бойлығын көрÑетуі',
+'exif-gpsdestlatitude' => 'ÐÑ‹Ñана бойлығы',
+'exif-gpsdestlongituderef' => 'ÐÑ‹Ñана ендігін көрÑетуі',
+'exif-gpsdestlongitude' => 'ÐÑ‹Ñана ендігі',
+'exif-gpsdestbearingref' => 'ÐÑ‹Ñана азимутын көрÑетуі',
+'exif-gpsdestbearing' => 'ÐÑ‹Ñана азимуты',
+'exif-gpsdestdistanceref' => 'ÐÑ‹Ñана қашықтығын көрÑетуі',
+'exif-gpsdestdistance' => 'ÐÑ‹Ñана қашықтығы',
+'exif-gpsprocessingmethod' => 'GPS өңдету әдіÑінің атауы',
+'exif-gpsareainformation' => 'GPS аумағының атауы',
+'exif-gpsdatestamp' => 'GPS күн-айы',
+'exif-gpsdifferential' => 'GPS Ñараланған түзету',
+
+# EXIF attributes
+'exif-compression-1' => 'Ұлғайтылған',
+'exif-compression-6' => 'JPEG',
+
+'exif-photometricinterpretation-2' => 'RGB',
+'exif-photometricinterpretation-6' => 'YCbCr',
+
+'exif-orientation-1' => 'Қалыпты', # 0th row: top; 0th column: left
+'exif-orientation-2' => 'Дерелей шағылыÑқан', # 0th row: top; 0th column: right
+'exif-orientation-3' => '180° бұрышқа айналған', # 0th row: bottom; 0th column: right
+'exif-orientation-4' => 'Тірелей шағылыÑқан', # 0th row: bottom; 0th column: left
+'exif-orientation-5' => 'Сағат тілшеÑіне қарÑÑ‹ 90° бұрышқа айналған және тірелей шағылыÑқан', # 0th row: left; 0th column: top
+'exif-orientation-6' => 'Сағат тілше бойынша 90° бұрышқа айналған', # 0th row: right; 0th column: top
+'exif-orientation-7' => 'Сағат тілше бойынша 90° бұрышқа айналған және тірелей шағылыÑқан', # 0th row: right; 0th column: bottom
+'exif-orientation-8' => 'Сағат тілшеÑіне қарÑÑ‹ 90° бұрышқа айналған', # 0th row: left; 0th column: bottom
+
+'exif-planarconfiguration-1' => 'талпақ пішім',
+'exif-planarconfiguration-2' => 'тайпақ пішім',
+
+'exif-xyresolution-i' => '$1 dpi',
+'exif-xyresolution-c' => '$1 dpc',
+
+'exif-colorspace-1' => 'sRGB',
+'exif-colorspace-ffff.h' => 'FFFF.H',
+
+'exif-componentsconfiguration-0' => 'бар болмады',
+'exif-componentsconfiguration-1' => 'Y',
+'exif-componentsconfiguration-2' => 'Cb',
+'exif-componentsconfiguration-3' => 'Cr',
+'exif-componentsconfiguration-4' => 'R',
+'exif-componentsconfiguration-5' => 'G',
+'exif-componentsconfiguration-6' => 'B',
+
+'exif-exposureprogram-0' => 'Ðнықталмаған',
+'exif-exposureprogram-1' => 'Қолмен',
+'exif-exposureprogram-2' => 'Бағдарламалы Ó™Ð´Ñ–Ñ (қалыпты)',
+'exif-exposureprogram-3' => 'Саңылау баÑыңқылығы',
+'exif-exposureprogram-4' => 'ЫÑырма баÑыңқылығы',
+'exif-exposureprogram-5' => 'Өнер бағдарламаÑÑ‹ (анықтық терендігіне ÑанаÑқан)',
+'exif-exposureprogram-6' => 'Қимыл бағдарламаÑÑ‹ (жапқыш шапшандылығына ÑанаÑқан)',
+'exif-exposureprogram-7' => 'Тірелей әдіÑÑ– (арты шоғырлауÑыз таÑу Ñ‚Ò¯Ñірмелер)',
+'exif-exposureprogram-8' => 'Дерелей әдіÑÑ– (арты шоғырланған дерелей Ñ‚Ò¯Ñірмелер)',
+
+'exif-subjectdistance-value' => '$1 m',
+
+'exif-meteringmode-0' => 'БелгіÑіз',
+'exif-meteringmode-1' => 'Біркелкі',
+'exif-meteringmode-2' => 'Бұлдыр дақ',
+'exif-meteringmode-3' => 'БірДақты',
+'exif-meteringmode-4' => 'КөпДақты',
+'exif-meteringmode-5' => 'Өрнекті',
+'exif-meteringmode-6' => 'Жыртынды',
+'exif-meteringmode-255' => 'БаÑқа',
+
+'exif-lightsource-0' => 'БелгіÑіз',
+'exif-lightsource-1' => 'Күн жарығы',
+'exif-lightsource-2' => 'Күнжарықты шам',
+'exif-lightsource-3' => 'Қыздырғышты шам',
+'exif-lightsource-4' => 'Жарқылдағыш',
+'exif-lightsource-9' => 'Ðшық күн',
+'exif-lightsource-10' => 'Бұлынғыр күн',
+'exif-lightsource-11' => 'Көленкелі',
+'exif-lightsource-12' => 'Күнжарықты шам (D 5700–7100 K)',
+'exif-lightsource-13' => 'Күнжарықты шам (N 4600–5400 K)',
+'exif-lightsource-14' => 'Күнжарықты шам (W 3900–4500 K)',
+'exif-lightsource-15' => 'Күнжарықты шам (WW 3200–3700 K)',
+'exif-lightsource-17' => 'Қалыпты жарық қайнары A',
+'exif-lightsource-18' => 'Қалыпты жарық қайнары B',
+'exif-lightsource-19' => 'Қалыпты жарық қайнары C',
+'exif-lightsource-20' => 'D55',
+'exif-lightsource-21' => 'D65',
+'exif-lightsource-22' => 'D75',
+'exif-lightsource-23' => 'D50',
+'exif-lightsource-24' => 'СтудиÑлық ISO күнжарықты шам',
+'exif-lightsource-255' => 'БаÑқа жарық қайнары',
+
+'exif-focalplaneresolutionunit-2' => 'дюйм',
+
+'exif-sensingmethod-1' => 'Ðнықталмаған',
+'exif-sensingmethod-2' => '1-чипті аумақты Ñ‚Ò¯ÑÑезгіш',
+'exif-sensingmethod-3' => '2-чипті аумақты Ñ‚Ò¯ÑÑезгіш',
+'exif-sensingmethod-4' => '3-чипті аумақты Ñ‚Ò¯ÑÑезгіш',
+'exif-sensingmethod-5' => 'Кезекті аумақты Ñ‚Ò¯ÑÑезгіш',
+'exif-sensingmethod-7' => '3-Ñызықты Ñ‚Ò¯ÑÑезгіш',
+'exif-sensingmethod-8' => 'Кезекті Ñызықты Ñ‚Ò¯ÑÑезгіш',
+
+'exif-filesource-3' => 'DSC',
+
+'exif-scenetype-1' => 'Тікелей Ñ‚Ò¯Ñірілген фотоÑурет',
+
+'exif-customrendered-0' => 'Қалыпты өңдету',
+'exif-customrendered-1' => 'ҚоÑымша өңдету',
+
+'exif-exposuremode-0' => 'Өздік Ò±Ñталымдау',
+'exif-exposuremode-1' => 'Қолмен Ò±Ñталымдау',
+'exif-exposuremode-2' => 'Өздік жарқылдау',
+
+'exif-whitebalance-0' => 'ÐÒ› Ñ‚Ò¯Ñінің өздік тендеÑтіру',
+'exif-whitebalance-1' => 'ÐÒ› Ñ‚Ò¯Ñінің қолмен тендеÑтіру',
+
+'exif-scenecapturetype-0' => 'Қалыпты',
+'exif-scenecapturetype-1' => 'Дерелей',
+'exif-scenecapturetype-2' => 'Тірелей',
+'exif-scenecapturetype-3' => 'Түнгі Ñахна',
+
+'exif-gaincontrol-0' => 'Жоқ',
+'exif-gaincontrol-1' => 'Төмен зораю',
+'exif-gaincontrol-2' => 'Жоғары зораю',
+'exif-gaincontrol-3' => 'Төмен баÑулау',
+'exif-gaincontrol-4' => 'Жоғары баÑулау',
+
+'exif-contrast-0' => 'Қалыпты',
+'exif-contrast-1' => 'Ò°Ñн',
+'exif-contrast-2' => 'Тұрпайы',
+
+'exif-saturation-0' => 'Қалыпты',
+'exif-saturation-1' => 'Төмен қанықты',
+'exif-saturation-2' => 'Жоғары қанықты',
+
+'exif-sharpness-0' => 'Қалыпты',
+'exif-sharpness-1' => 'Ò°Ñн',
+'exif-sharpness-2' => 'Тұрпайы',
+
+'exif-subjectdistancerange-0' => 'БелгіÑіз',
+'exif-subjectdistancerange-1' => 'ТаÑу Ñ‚Ò¯Ñірілген',
+'exif-subjectdistancerange-2' => 'Жақын Ñ‚Ò¯Ñірілген',
+'exif-subjectdistancerange-3' => 'ÐÐ»Ñ‹Ñ Ñ‚Ò¯Ñірілген',
+
+# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'СолтүÑтік бойлығы',
+'exif-gpslatitude-s' => 'ОңтүÑтік бойлығы',
+
+# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'Ð¨Ñ‹Ò“Ñ‹Ñ ÐµÐ½Ð´Ñ–Ð³Ñ–',
+'exif-gpslongitude-w' => 'Ð‘Ð°Ñ‚Ñ‹Ñ ÐµÐ½Ð´Ñ–Ð³Ñ–',
+
+'exif-gpsstatus-a' => 'Өлшеу ұлаÑуда',
+'exif-gpsstatus-v' => 'Өлшеу өзара әрекетте',
+
+'exif-gpsmeasuremode-2' => '2-бағыттық өлшем',
+'exif-gpsmeasuremode-3' => '3-бағыттық өлшем',
+
+# Pseudotags used for GPSSpeedRef and GPSDestDistanceRef
+'exif-gpsspeed-k' => 'km/h',
+'exif-gpsspeed-m' => 'mil/h',
+'exif-gpsspeed-n' => 'Ж. түйін',
+
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'Шын бағыт',
+'exif-gpsdirection-m' => 'Магнитты бағыт',
+
+# External editor support
+'edit-externally' => 'Бұл файлды Ñыртқы құрал/бағдарлама арқылы өңдеу',
+'edit-externally-help' => 'Көбірек ақпарат үшін [http://meta.wikimedia.org/wiki/Help:External_editors орнату нұÑқауларын] қараңыз.',
+
+# 'all' in various places, this might be different for inflected languages
+'recentchangesall' => 'барлығын',
+'imagelistall' => 'барлығы',
+'watchlistall1' => 'барлығы',
+'watchlistall2' => 'барлық',
+'namespacesall' => 'барлығы',
+
+# E-mail address confirmation
+'confirmemail' => 'Е-пошта жайын куәландыру',
+'confirmemail_noemail' => '[[{{ns:special}}:Preferences|ҚатыÑушы баптауыңызда]] жарамды е-пошта жайын енгізбепÑіз.',
+'confirmemail_text' => 'Бұл уикиде е-пошта қаÑиеттерін пайдаланудың алдынан е-пошта жайыңызды
+куәландыру қажет. Өзіңіздің жайыңызға куәландыру хатын жіберу үшін төмендегі түймені нұқыңыз.
+Хаттың ішінде арнайы коды бар Ñілтеме кіріÑтірледі; е-пошта жайыңыздың жарамдығын куәландыру үшін
+Ñілтемені шолғыштың мекен-жай жолағына енгізіп ашыңыз.',
+'confirmemail_send' => 'Куәландыру кодын жіберу',
+'confirmemail_sent' => 'Куәландыру Е-пошта хаты жіберілді.',
+'confirmemail_sendfailed' => 'Куәландыру хаты жіберілмеді. Енгізілген жайды жарамÑыз әрітеріне текÑеріп шығыңыз.
+
+Е-пошта қызметі қайтарғаны: $1',
+'confirmemail_invalid' => 'Куәландыру коды жарамÑыз. Кодтың мерзімі біткен шығар.',
+'confirmemail_needlogin' => 'Е-пошта жайыңызды куәландыру үшін $1 қажет.',
+'confirmemail_success' => 'Е-пошта жайыңыз куәландырылды. Енді Уикиге кіріп жұмыÑқа кіріÑуге болады',
+'confirmemail_loggedin' => 'Е-пошта жайыңыз куәландырылды.',
+'confirmemail_error' => 'Куәландыруыңызды Ñақтағанда белгіÑіз қате болды.',
+'confirmemail_subject' => '{{SITENAME}} торабынан е-пошта жайыңызды куәландыру хаты',
+'confirmemail_body' => "Кейбіреу, мына $1 IP жайынан, өзіңіз болуы мүмкін,
+{{SITENAME}} жобаÑындағы Е-пошта жайын қолданып «$2» тіркелгі жаÑапты.
+
+ОÑÑ‹ тіркелгі раÑтан Ñіздікі екенін куәландыру үшін, және {{SITENAME}} жобаÑының
+е-пошта қаÑиеттерін белÑендіру үшін, мына Ñілтемені шолғышпен ашыңыз:
+
+$3
+
+Бұл Ñіздікі '''емеÑ''' болÑа, Ñілтемеге ермеңіз. Куәландыру кодының
+мерзімі $4 кезінде бітеді.",
+
+# Inputbox extension, may be useful in other contexts as well
+'tryexact' => 'Дәл ÑәйкеÑін Ñынап көріңіз',
+'searchfulltext' => 'Толық мәтінімен іздеу',
+'createarticle' => 'Бетті баÑтау',
+
+# Scary transclusion
+'scarytranscludedisabled' => '[Уики-ара кірегу өшірілген]',
+'scarytranscludefailed' => '[$1 бетіне үлгі өңдету ÑәтÑіз бітті; кешіріңіз]',
+'scarytranscludetoolong' => '[URL жайы тым ұзын; кешіріңіз]',
+
+# Trackbacks
+'trackbackbox' => '<div id="mw_trackbacks">
+Бұл беттің аңыÑтаулары:<br />
+$1
+</div>',
+'trackbackremove' => '([$1 Жойылды])',
+'trackbacklink' => 'ÐңыÑтау',
+'trackbackdeleteok' => 'ÐңыÑтау жоюы Ñәтті Ó©Ñ‚Ñ‚Ñ–.',
+
+# Delete conflict
+'deletedwhileediting' => 'Ðазар Ñалыңыз:Сіз бұл беттің өңдеуін баÑтағанда, оÑÑ‹ бет жойылды!',
+'confirmrecreate' => "Сіз бұл беттің өндеуін баÑтағанда [[{{ns:user}}:$1|$1]] ([[{{ns:user_talk}}:$1|талқылауы]]) оÑÑ‹ бетті жойды, көрÑеткен Ñебебі:
+: ''$2''
+ОÑÑ‹ бетті шынынан қайта жаÑауын раÑтаңыз.",
+'recreate' => 'Қайта жаÑау',
+'tooltip-recreate' => 'Бұл бетті жойылуына қарамай қайта жаÑау',
+
+'unit-pixel' => ' px',
+
+# HTML dump
+'redirectingto' => '[[$1]] бетіне айдатуда…',
+
+# action=purge
+'confirm_purge' => 'ҚоÑалқы қалтадағы оÑÑ‹ бетін тазалаймыз ба?<br /><br />$1',
+'confirm_purge_button' => 'Жарайды',
+
+'youhavenewmessagesmulti' => '$1 дегенге жаңа хабарлар Ñ‚Ò¯ÑÑ‚Ñ–',
+
+'searchcontaining' => "Мына Ñөзі бар бет араÑынан іздеу: ''$1''.",
+'searchnamed' => "Мына атаулы бет араÑынан іздеу: ''$1''.",
+'articletitles' => "Ðтаулары мынадан баÑталған беттер: ''$1''",
+'hideresults' => 'Ðәтижелерді жаÑÑ‹Ñ€',
+
+# DISPLAYTITLE
+'displaytitle' => '(Бұл беттің ÑілтемеÑÑ–: [[$1]])',
+
+'loginlanguagelabel' => 'Тіл: $1',
+
+# Multipage image navigation
+'imgmultipageprev' => '&larr; алдыңғы бетке',
+'imgmultipagenext' => 'келеÑÑ– бетке &rarr;',
+'imgmultigo' => 'Өту!',
+'imgmultigotopre' => 'Мына бетке өту',
+
+# Table pager
+'ascending_abbrev' => 'Ó©Ñу',
+'descending_abbrev' => 'кему',
+'table_pager_next' => 'КелеÑÑ– бетке',
+'table_pager_prev' => 'Ðлдыңғы бетке',
+'table_pager_first' => 'Ðлғашқы бетке',
+'table_pager_last' => 'Соңғы бетке',
+'table_pager_limit' => 'Бет Ñайын $1 дана көрÑет',
+'table_pager_limit_submit' => 'Өту',
+'table_pager_empty' => 'Еш нәтиже жоқ',
+
+# Auto-summaries
+'autosumm-blank' => 'Беттің барлық мағлұматын алаÑтатты',
+'autosumm-replace' => "Бетті '$1' дегенмен алмаÑтырды",
+'autoredircomment' => '[[$1]] дегенге айдады', # This should be changed to the new naming convention, but existed beforehand
+'autosumm-new' => 'Жаңа бет мағлұматы: $1',
+);
+
+?>
diff --git a/languages/messages/MessagesKk_tr.php b/languages/messages/MessagesKk_tr.php
new file mode 100644
index 00000000..94c9907d
--- /dev/null
+++ b/languages/messages/MessagesKk_tr.php
@@ -0,0 +1,2151 @@
+<?php
+/**
+ * Kazakh (QazaqÅŸa)
+ *
+ * @package MediaWiki
+ * @subpackage Language
+ *
+ */
+
+$fallback = 'kk-kz';
+
+$separatorTransformTable = array(
+ ',' => "\xc2\xa0",
+ '.' => ',',
+);
+
+$extraUserToggles = array(
+ 'nolangconversion'
+);
+
+$fallback8bitEncoding = 'windows-1254';
+
+$linkPrefixExtension = true;
+
+$namespaceNames = array(
+ NS_MEDIA => 'Taspa',
+ NS_SPECIAL => 'Arnaýı',
+ # NS_MAIN => '',
+ NS_TALK => 'Talqılaw',
+ NS_USER => 'Qatıswşı',
+ NS_USER_TALK => 'Qatıswşı_talqılawı',
+ # NS_PROJECT set by $wgMetaNamespace
+ NS_PROJECT_TALK => '$1_talqılawı',
+ NS_IMAGE => 'Swret',
+ NS_IMAGE_TALK => 'Swret_talqılawı',
+ NS_MEDIAWIKI => 'MedïaWïkï',
+ NS_MEDIAWIKI_TALK => 'MedïaWïkï_talqılawı',
+ NS_TEMPLATE => 'Ãœlgi',
+ NS_TEMPLATE_TALK => 'Ülgi_talqılawı',
+ NS_HELP => 'Anıqtama',
+ NS_HELP_TALK => 'Anıqtama_talqılawı',
+ NS_CATEGORY => 'Sanat',
+ NS_CATEGORY_TALK => 'Sanat_talqılawı'
+);
+
+$namespaceAliases = array(
+ # Aliases to kk-kz namespaces
+ 'ТаÑпа' => NS_MEDIA,
+ 'Ðрнайы' => NS_SPECIAL,
+ 'Талқылау' => NS_TALK,
+ 'ҚатыÑушы' => NS_USER,
+ 'ҚатыÑушы_талқылауы' => NS_USER_TALK,
+ '$1_талқылауы' => NS_PROJECT_TALK,
+ 'Сурет' => NS_IMAGE,
+ 'Сурет_талқылауы' => NS_IMAGE_TALK,
+ 'МедиаУики' => NS_MEDIAWIKI,
+ 'МедиаУики_талқылауы' => NS_MEDIAWIKI_TALK,
+ 'Үлгі' => NS_TEMPLATE,
+ 'Үлгі_талқылауы' => NS_TEMPLATE_TALK,
+ 'Ðнықтама' => NS_HELP,
+ 'Ðнықтама_талқылауы' => NS_HELP_TALK,
+ 'Санат' => NS_CATEGORY,
+ 'Санат_талқылауы' => NS_CATEGORY_TALK,
+ # Aliases to kk-cn namespaces
+ 'تاسپا' => NS_MEDIA,
+ 'ارنايى' => NS_SPECIAL,
+ 'تالقىلاۋ' => NS_TALK,
+ 'قاتىسۋشى' => NS_USER,
+ 'قاتىسۋشى_تالقىلاۋى'=> NS_USER_TALK,
+ '$1_تالقىلاۋى' => NS_PROJECT_TALK,
+ 'سۋرەت' => NS_IMAGE,
+ 'سۋرەت_تالقىلاۋى' => NS_IMAGE_TALK,
+ 'مەدياۋيكي' => NS_MEDIAWIKI,
+ 'مەدياۋيكي_تالقىلاۋى' => NS_MEDIAWIKI_TALK,
+ 'ٴۇلگٴى' => NS_TEMPLATE,
+ 'ٴۇلگٴى_تالقىلاۋى' => NS_TEMPLATE_TALK,
+ 'انىقتاما' => NS_HELP,
+ 'انىقتاما_تالقىلاۋى' => NS_HELP_TALK,
+ 'سانات' => NS_CATEGORY,
+ 'سانات_تالقىلاۋى' => NS_CATEGORY_TALK,
+);
+
+$quickbarSettings = array(
+ 'Eşqandaý', 'Solğa bekitilgen', 'Oñğa bekitilgen', 'Solğa qalqığan', 'Oñğa qalqığan'
+);
+
+$skinNames = array(
+ 'standard' => 'Dağdılı',
+ 'nostalgia' => 'Añsaw',
+ 'cologneblue' => 'Köln zeñgirligi',
+ 'davinci' => 'Da Vïnçï',
+ 'mono' => 'Dara',
+ 'monobook' => 'Dara kitap',
+ 'myskin' => 'Öz mänerim',
+ 'chick' => 'Balapan',
+ 'simple' => 'Kädimgi'
+);
+
+$defaultDateFormat = 'ymd';
+
+$dateFormats = array(
+ 'mdy time' => 'H:i',
+ 'mdy date' => 'xg j, Y',
+ 'mdy both' => 'H:i, xg j, Y',
+
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j F, Y',
+ 'dmy both' => 'H:i, j F, Y',
+
+ 'ymd time' => 'H:i',
+ 'ymd date' => 'Y" j." xg j',
+ 'ymd both' => 'H:i, Y" j." xg j',
+
+ 'ISO 8601 time' => 'xnH:xni:xns',
+ 'ISO 8601 date' => 'xnY-xnm-xnd',
+ 'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+);
+
+#-------------------------------------------------------------------
+# Default messages
+#-------------------------------------------------------------------
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'Siltemeni astınan sız:',
+'tog-highlightbroken' => 'Joqtalğan siltemelerdi <a href="" class="new">bılaý</a> pişimde (basqaşa: bılaý <a href="" class="internal">?</a> sïyaqtı).',
+'tog-justify' => 'Ejelerdi eni boýınşa twralaw',
+'tog-hideminor' => 'Jwıqtağı özgeristerde şağın tüzetwdi jasır',
+'tog-extendwatchlist' => 'Baqılaw tizimdi ulğaýt (barlıq jaramdı özgeristerdi körset)',
+'tog-usenewrc' => 'Keñeýtilgen Jwıqtağı özgerister (JavaScript)',
+'tog-numberheadings' => 'Bölim taqırıptarın özdik türde nomirle',
+'tog-showtoolbar' => 'Öñdew qwraldar jolağın körset (JavaScript)',
+'tog-editondblclick' => 'Qos nuqımdap öñdew (JavaScript)',
+'tog-editsection' => 'Bölimderdi [öñdew] siltemesimen öñdewin endir',
+'tog-editsectiononrightclick' => 'Bölim atawın oñ jaq nuqwmen<br />öñdewin endir (JavaScript)',
+'tog-showtoc' => 'Mazmunın körset (3-ten artıq bölimi barılarğa)',
+'tog-rememberpassword' => 'Kirgenimdi bul komp′ywterde umıtpa',
+'tog-editwidth' => 'Öñdew awmağı tolıq enimen',
+'tog-watchcreations' => 'Men bastağan betterdi baqılaw tizimime qos',
+'tog-watchdefault' => 'Men öñdegen betterdi baqılaw tizimime qos',
+'tog-minordefault' => 'Barlıq tüzetwlerdi ädepkiden şağın dep belgile',
+'tog-previewontop' => 'Qarap şığwdı öñdew awmağınıñ üstine sal',
+'tog-previewonfirst' => 'Birinşi öñdegende qarap şığw',
+'tog-nocache' => 'Bet qosalqı qaltasın öşir',
+'tog-enotifwatchlistpages' => 'Baqılanğan bet özgergende mağan xat jiber',
+'tog-enotifusertalkpages' => 'Talqılawım özgergende mağan xat jiber',
+'tog-enotifminoredits' => 'Şağın tüzetw twralı da mağan xat jiber',
+'tog-enotifrevealaddr' => 'E-poşta jaýımdı eskertw xatta aşıq körset',
+'tog-shownumberswatching' => 'Baqılap turğan qatıswşılardıñ sanın körset',
+'tog-fancysig' => 'Qam qoltañba (özdik siltemesiz;)',
+'tog-externaleditor' => 'Sırtqı öñdewişti ädepkiden qoldan',
+'tog-externaldiff' => 'Sırtqı aýırmağıştı ädepkiden qoldan',
+'tog-showjumplinks' => '«Ötip ketw» qatınaw siltemelerin endir',
+'tog-uselivepreview' => 'Twra qarap şığwdı qoldanw (JavaScript) (Sınaq türinde)',
+'tog-autopatrol' => 'Tüzetwimdi küzetke belgile',
+'tog-forceeditsummary' => 'Öñdew sïpattaması bos qalğanda mağan eskert',
+'tog-watchlisthideown' => 'Tüzetwimdi baqılaw tizimnen jasır',
+'tog-watchlisthidebots' => 'Bot tüzetwin baqılaw tizimnen jasır',
+'tog-nolangconversion' => 'Til türin awdarmaw',
+
+'underline-always' => 'Ärqaşan',
+'underline-never' => 'EÅŸqaÅŸan',
+'underline-default' => 'Şolğış boýınşa',
+
+'skinpreview' => '(Qarap şığw)',
+
+# Dates
+'sunday' => 'Jeksenbi',
+'monday' => 'Düýsenbi',
+'tuesday' => 'Seýsenbi',
+'wednesday' => 'Särsenbi',
+'thursday' => 'Beýsenbi',
+'friday' => 'Juma',
+'saturday' => 'Senbi',
+'sun' => 'Jek',
+'mon' => 'Düý',
+'tue' => 'Beý',
+'wed' => 'Sär',
+'thu' => 'Beý',
+'fri' => 'Jum',
+'sat' => 'Sen',
+'january' => 'qañtar',
+'february' => 'aqpan',
+'march' => 'nawrız',
+'april' => 'cäwir',
+'may_long' => 'mamır',
+'june' => 'mawsım',
+'july' => 'ÅŸilde',
+'august' => 'tamız',
+'september' => 'qırküýek',
+'october' => 'qazan',
+'november' => 'qaraÅŸa',
+'december' => 'jeltoqsan',
+'january-gen' => 'qantardıñ',
+'february-gen' => 'aqpannıñ',
+'march-gen' => 'nawrızdıñ',
+'april-gen' => 'säwirdiñ',
+'may-gen' => 'mamırdıñ',
+'june-gen' => 'mawsımnıñ',
+'july-gen' => 'şildeniñ',
+'august-gen' => 'tamızdıñ',
+'september-gen' => 'qırküýektiñ',
+'october-gen' => 'qazannıñ',
+'november-gen' => 'qaraşanıñ',
+'december-gen' => 'jeltoqsannıñ',
+'jan' => 'qan',
+'feb' => 'aqp',
+'mar' => 'naw',
+'apr' => 'cäw',
+'may' => 'mam',
+'jun' => 'maw',
+'jul' => 'ÅŸil',
+'aug' => 'tam',
+'sep' => 'qır',
+'oct' => 'qaz',
+'nov' => 'qar',
+'dec' => 'jel',
+
+# Bits of text used by many pages
+'categories' => 'Barlıq sanat tizimi',
+'pagecategories' => '{{PLURAL:$1|Sanat|Sanattar}}',
+'category_header' => '«$1» sanatındağı better',
+'subcategories' => 'Tömengi sanattar',
+'category-media-header' => '«$1» sanatındağı taspalar',
+
+'linkprefix' => '/^(.*?)([a-zäçéğıïñöşüýа-ÑёәіңғүұқөһA-ZÄÇÉĞİÃÑÖŞÜÃÐ-ЯÐӘІҢҒҮҰҚӨҺʺʹ«„]+)$/sDu',
+'mainpage' => 'Bastı bet',
+'mainpagetext' => "<big>'''MedïaWïkï bağdarlaması sätti ornatıldı.'''</big>",
+'mainpagedocfooter' => 'Wïkï bağdarlamasın paýdalanw aqparatı üşin [http://meta.wikimedia.org/wiki/Help:Contents Paýdalanwşı nusqawlarımen] tanısıñız.
+
+== Bastaw ==
+
+* [http://www.mediawiki.org/wiki/Help:Configuration_settings Baptaw qalawları tizimi]
+* [http://www.mediawiki.org/wiki/Help:FAQ MedïaWïkï JSJ]
+* [http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce MedïaWïkï xat taratw tizimi]',
+
+'portal' => 'Qawım portalı',
+'portal-url' => '{{ns:project}}:Qawım_portalı',
+'about' => 'Biz twralı',
+'aboutsite' => '{{SITENAME}} twralı',
+'aboutpage' => '{{ns:project}}:Biz_twralı',
+'article' => 'MaÄŸlumat',
+'help' => 'Anıqtama',
+'helppage' => '{{ns:help}}:Mazmunı',
+'bugreports' => 'Qate eseptemeleri',
+'bugreportspage' => '{{ns:project}}:Qate_eseptemeleri',
+'sitesupport' => 'DemewÅŸilik',
+'sitesupport-url' => '{{ns:project}}:Järdem',
+'faq' => 'JSJ',
+'faqpage' => '{{ns:project}}:JSJ',
+'edithelp' => 'Öndew anıqtaması',
+'newwindow' => '(jaña terezede aşıladı)',
+'edithelppage' => '{{ns:help}}:Öñdew',
+'cancel' => 'Boldırmaw',
+'qbfind' => 'Tabw',
+'qbbrowse' => 'Åžolw',
+'qbedit' => 'Öñdew',
+'qbpageoptions' => 'Osı bet',
+'qbpageinfo' => 'Mätin aralığı',
+'qbmyoptions' => 'Betterim',
+'qbspecialpages' => 'Arnaýı better',
+'moredotdotdot' => 'Köbirek…',
+'mypage' => 'Jeke betim',
+'mytalk' => 'Talqılawım',
+'anontalk' => 'IP talqılawı',
+'navigation' => 'Bağıttaw',
+
+# Metadata in edit box
+'metadata_help' => 'Meta-derekter (tüsindirmeler üşin [[{{ns:project}}:Meta-derekter]] betin qarañız):',
+
+'currentevents' => 'Ağımdağı oqïğalar',
+'currentevents-url' => 'Ağımdağı_oqïğalar',
+
+'disclaimers' => 'JawapkerÅŸilikten bas tartw',
+'disclaimerpage' => '{{ns:project}}:JawapkerÅŸilikten_bas_tartw',
+'privacy' => 'Jeke qupïyasın saqtaw',
+'privacypage' => '{{ns:project}}:Jeke_qupïyasın_saqtaw',
+'errorpagetitle' => 'Qate',
+'returnto' => '$1 degenge oralw.',
+'tagline' => '{{GRAMMAR:ablative|{{SITENAME}}}}',
+'search' => 'Ä°zdew',
+'searchbutton' => 'Ä°zdew',
+'go' => 'Ötw',
+'searcharticle' => 'Ötw',
+'history' => 'Bet tarïxı',
+'history_short' => 'Tarïxı',
+'updatedmarker' => 'soñğı kirgennen beri jañartılğan',
+'info_short' => 'Aqparat',
+'printableversion' => 'Basıp şığarwğa',
+'permalink' => 'Turaqtı silteme',
+'print' => 'Basıp şığarw',
+'edit' => 'Öñdew',
+'editthispage' => 'Betti öñdew',
+'delete' => 'Joyw',
+'deletethispage' => 'Betti joyw',
+'undelete_short' => '{{PLURAL:$1|Bir|$1}} tüzetwdi qaýtarw',
+'protect' => 'QorÄŸaw',
+'protectthispage' => 'Betti qorÄŸaw',
+'unprotect' => 'QorÄŸamaw',
+'unprotectthispage' => 'Betti qorÄŸamaw',
+'newpage' => 'Jaña bet',
+'talkpage' => 'Betti talqılaw',
+'specialpage' => 'Arnaýı bet',
+'personaltools' => 'Jeke quraldar',
+'postcomment' => 'Mändeme jiberw',
+'articlepage' => 'MaÄŸlumat betin qaraw',
+'talk' => 'Talqılaw',
+'views' => 'Körinis',
+'toolbox' => 'Quraldar',
+'userpage' => 'Qatıswşınıñ betin qaraw',
+'projectpage' => 'Joba betin qaraw',
+'imagepage' => 'Swret betin qaraw',
+'mediawikipage' => 'Xabar betin qaraw',
+'templatepage' => 'Ãœlgi betin qaraw',
+'viewhelppage' => 'Anıqtama betin qaraw',
+'categorypage' => 'Sanat betin qaraw',
+'viewtalkpage' => 'Talqılaw betin qaraw',
+'otherlanguages' => 'Basqa tilderde',
+'redirectedfrom' => '($1 betinen aýdatılğan)',
+'redirectpagesub' => 'Aýdatw beti',
+'lastmodifiedat' => 'Bul bettiñ özgertilgen soñğı kezi: $2, $1.', # $1 date, $2 time
+'viewcount' => 'Bul bet {{plural:$1|bir|$1}} ret qaralÄŸan.',
+'copyright' => 'Mağlumat $1 qujatı boýınşa qatınawlı.',
+'protectedpage' => 'Qorğawlı bet',
+'jumpto' => 'Mınağan ötip ketw:',
+'jumptonavigation' => 'bağıttaw',
+'jumptosearch' => 'izdew',
+
+'badaccess' => 'Ruqsat qatesi',
+'badaccess-group0' => 'Suranısqan äreketiñizdi jegwiñizge ruqsat etilmeýdi.',
+'badaccess-group1' => 'Suranısqan äreketiñiz $1 tobınıñ qatıswşılarına şekteledi.',
+'badaccess-group2' => 'Suranısqan äreketiñiz $1 toptarı biriniñ qatwsışılarına şekteledi.',
+'badaccess-groups' => 'Suranısqan äreketiñiz $1 toptarı biriniñ qatwsışılarına şekteledi.',
+
+'versionrequired' => 'MediaWiki $1 nusqası qajet',
+'versionrequiredtext' => 'Osı betti qoldanw üşin MediaWiki $1 nusqası qajet. [[{{ns:special}}:Version]] betin qarañız.',
+
+'ok' => 'Jaraýdı',
+'pagetitle' => '$1 — {{SITENAME}}',
+'retrievedfrom' => '«$1» degennen alınğan',
+'youhavenewmessages' => 'Sizde $1 bar ($2).',
+'newmessageslink' => 'jaña xabarlar',
+'newmessagesdifflink' => 'soñğı özgerisine',
+'editsection' => 'öñdew',
+'editold' => 'öñdew',
+'editsectionhint' => 'Bölimdi öñdew: $1',
+'toc' => 'Mazmunı',
+'showtoc' => 'körset',
+'hidetoc' => 'jasır',
+'thisisdeleted' => 'Qaraýmız ba, ne qaýtaramız ba?: $1',
+'viewdeleted' => 'Qaraýmız ba?: $1',
+'restorelink' => 'joýılğan {{PLURAL:$1|bir|$1}} tüzetw',
+'feedlinks' => 'Arna:',
+'feed-invalid' => 'Jaramsız jazılım arna türi.',
+
+# Short words for each namespace, by default used in the 'article' tab in monobook
+'nstab-main' => 'MaÄŸlumat',
+'nstab-user' => 'Jeke beti',
+'nstab-media' => 'Taspa beti',
+'nstab-special' => 'Arnaýı',
+'nstab-project' => 'Joba beti',
+'nstab-image' => 'Faýl',
+'nstab-mediawiki' => 'Jüýe xabarı',
+'nstab-template' => 'Ãœlgi',
+'nstab-help' => 'Anıqtama',
+'nstab-category' => 'Sanat',
+
+# Main script and global functions
+'nosuchaction' => 'Mundaý äreket joq',
+'nosuchactiontext' => 'Osı URL jaýımen engizilgen äreketti
+osı wïkï joramaldap bilmedi.',
+'nosuchspecialpage' => 'Bul arnaýı bet emes',
+'nospecialpagetext' => 'Siz suranısqan arnaýı bet jaramsız. Barlıq jaramdı arnaýı better tizimin [[{{ns:special}}:Specialpages]] betinde taba alasız.',
+
+# General errors
+'error' => 'Qate',
+'databaseerror' => 'Derekqordıñ qatesi',
+'dberrortext' => 'Derekqorğa suranıs jasalğanda sïntaksïs qatesi kezdesti.
+Bul bağdarlamanıñ qatesin körsetw mümkin.
+Derekqorğa soñğı bolğan suranıs:
+<blockquote><tt>$1</tt></blockquote>
+mına fwnkcïyasınan «<tt>$2</tt>».
+MySQL qaýtarğan qatesi «<tt>$3: $4</tt>».',
+'dberrortextcl' => 'Derekqorğa suranıs jasalğanda sïntaksïs qatesi kezdesti.
+Derekqorğa soñğı bolğan suranıs:
+«$1»
+mına fwnkcïyasınan: «$2».
+MySQL qaýtarğan qatesi «$3: $4»',
+'noconnect' => 'Ğafw etiñiz! Bul wïkïde keýbir texnïkalıq qïınşılıqtar kezdesti, sondıqtan derekqor serverine qatınasw almaýdı. <br />
+$1',
+'nodb' => '$1 derekqorı talğanbadı',
+'cachederror' => 'Tömende suranğan bettiñ qosalqı qaltadağı köşirmesi, osı bet jañartılmağan bolwı mümkin.',
+'laggedslavemode' => 'Nazar salıñız: Bette jwıqtağı jañalawlar bolmawı mümkin.',
+'readonly' => 'Derekqorı qulıptalğan',
+'enterlockreason' => 'Qulıptaw sebebin engiziñiz, qaý waqıtqa deýin
+qulıptalğanın qosa',
+'readonlytext' => 'Ağımda derekqor jaña jazba jäne tağı basqa özgerister jasawdan qulıptalınğan. Bul derekqordı jöndetw bağdarlamaların orındaw üşin bolwı mümkin, bunı bitirgennen soñ qalipti iske qaýtarıladı.
+
+Qulıptağan äkimşi bunı bılaý tüsindiredi: $1',
+'missingarticle' => 'İzdestirilgen «$1» atawlı bet mätini derekqorda tabılmadı.
+
+Bul dağdıda eskirgen aýırma siltemesine nemese joýılğan bet tarïxınıñ siltemesine
+ergennen bolwı mümkin.
+
+Eger bul boljam durıs sebep bolmasa, bağdarlamamızdağı qatege tap bolwıñız mümkin.
+Bul twralı naqtı URL jaýın körsetip äkimşige esepteme jiberiñiz.',
+'readonly_lag' => 'Jetek derekqor serverler bastawışpen qadamlanğanda osı derekqor özdik türinde qulıptalınğan',
+'internalerror' => 'Ä°ÅŸki qate',
+'filecopyerror' => '«$1» faýlı «$2» faýlına köşirilmedi.',
+'filerenameerror' => '«$1» faýl atı «$2» atına özgertilmedi.',
+'filedeleteerror' => '«$1» faýlı joýılmaýdı.',
+'filenotfound' => '«$1» faýlı tabılmadı.',
+'unexpected' => 'Kütilmegen mağına: «$1» = «$2».',
+'formerror' => 'Qate: jiberw ülgiti emes',
+'badarticleerror' => 'Osındaý äreket mına bette atqarılmaýdı.',
+'cannotdelete' => 'Aýtılmış bet ne swret joýılmaýdı. (Bunı basqa birew joýğan şığar.)',
+'badtitle' => 'Jaramsız ataw',
+'badtitletext' => 'Suranısqan bet atawı jaramsız, bos, tilara siltemesi ne wïkï-ara atawı mültik bolğan. Atawlarda süemeldemegen birqatar äripter bolwı mümkin.',
+'perfdisabled' => 'Ğafw etiñiz! Osı qasïet, derekqordıñ jıldamılığına äser etip, eşkimge wïkïdi paýdalanwğa bermegesin, waqıtşa öşirilgen.',
+'perfdisabledsub' => 'Mında $1 betiniñ saqtalğan köşirmesi:', # obsolete?
+'perfcached' => 'Kelesi derek qosalqı qaltasınan alınğan, sondıqtan tolıqtaý jañalanmağan bolwı mümkin.',
+'perfcachedts' => 'Kelesi derek qosalqı qaltasınan alınğan, soñğı jañalanlğan kezi: $1.',
+'wrong_wfQuery_params' => 'wfQuery() fwnkcïyasında jaramsız baptar<br />
+Fwnkcïya: $1<br />
+Suranıs: $2',
+'viewsource' => 'Qaýnarın qaraw',
+'viewsourcefor' => '$1 qaýnarı',
+'protectedtext' => 'Bul bet öñdew boldırmaw üşin qulıptalınğan.
+
+Bul bettiñ qaýnarın qarawıñızğa jäne köşirip alwñızğa boladı:',
+'protectedinterface' => 'Bul bet bağdarlamanıñ tildesw mätinin jetistiredi, sondıqtan qïyanat keltirmew üşin özgertwi qulıptalğan.',
+'editinginterface' => "'''Nazar salıñız:''' Bağdarlamağa tildesw mätinin jetistiretin MediaWiki betin öñdep jatırsız. Bul bettiñ özgertwi barlıq paýdalanwşılar tildeswine äser etedi.",
+'sqlhidden' => '(SQL suranısı jasırıldı)',
+
+# Login and logout pages
+'logouttitle' => 'Qatıswşı şığwı',
+'logouttext' => '<strong>Endi jüýeden şıqtıñız.</strong><br />
+Bul komp′ywterden äli de jüýege kirmesten {{SITENAME}} jobasın
+şolwıñız mümkin, nemese basqa paýdalanwşınıñ jüýege kirwi mümkin.
+Keýbir betterde äli de jüýege kirgeniñizdeý körinwi mümkindigin
+eskertemiz; bul şolğıştıñ qosalqı qaltasın bosatw arqılı şeşiledi.',
+'welcomecreation' => '== Qoş keldiñiz, $1! ==
+
+Tirkelgiñiz jasaldı. {{SITENAME}} baptawıñızdı qalawıñızben özgertwdi umıtpañız.',
+'loginpagetitle' => 'Qatıswşı kirwi',
+'yourname' => 'Qatıswşı atıñız',
+'yourpassword' => 'Qupïya söziñiz',
+'yourpasswordagain' => 'Qupïya sözdi qaýtalap engiziñiz',
+'remembermypassword' => 'Meniñ kirgenimdi bul komp′ywterde umıtpa',
+'yourdomainname' => 'Jeli üýşigiñiz',
+'externaldberror' => 'Osında sırtqı teñdestirw derekqorında qate boldı, nemese sırtqı tirkelgiñizdi jañalawğa ruqsat joq.',
+'loginproblem' => '<b>Kirwiñiz kezinde osında qïındıqqa tap boldıq.</b><br />Tağı da qaýtalap qarañız.',
+'alreadyloggedin' => '<strong>$1 degen qatıswşı, kiripsiz tüge!<strong><br />',
+'login' => 'Kirw',
+'loginprompt' => '{{SITENAME}} torabına kirw üşin «cookies» qasïetin endirwiñiz qajet.',
+'userlogin' => 'Kirw / Tirkelgi jasaw',
+'logout' => 'Şığw',
+'userlogout' => 'Şığw',
+'notloggedin' => 'Kirmegensiz',
+'nologin' => 'Tirkelgiñiz joq pa? $1.',
+'nologinlink' => 'Jasañız',
+'createaccount' => 'Tirkelgi jasa',
+'gotaccount' => 'Tirkelgiñiz bar ma? $1.',
+'gotaccountlink' => 'Kiriñiz',
+'createaccountmail' => 'e-poÅŸtamen',
+'badretype' => 'Engizgen qupïya sözderiñiz bir birine säýkes emes.',
+'userexists' => 'Engizgen qatıswşı atıñızdı birew paýdalanıp jatır. Basqa ataw tandañız.',
+'youremail' => 'E-poşta jaýıñız *:',
+'username' => 'Qatıswşı atıñız:',
+'uid' => 'Qatıswşı teñdestirwiñiz:',
+'yourrealname' => 'Şın atıñız *:',
+'yourlanguage' => 'Tiliñiz:',
+'yourvariant' => 'Türi',
+'yournick' => 'Laqap atıñız:',
+'badsig' => 'Qam qoltañbañız jaramsız; HTML belgişelerin tekseriñiz.',
+'email' => 'E-poştañız',
+'prefs-help-email-enotif' => 'Eger sonı baptasañız, osı e-poşta jaýı sizge eskertw xat jiberwge qoldanıladı.',
+'prefs-help-realname' => '* Şın atıñız (mindetti emes): engizseñiz, şığarmañızdıñ awtorlığın belgilewi üşin qoldanıladı.',
+'loginerror' => 'Kirw qatesi',
+'prefs-help-email' => '* E-poştañız (mindetti emes): «Qatıswşı» nemese «qatıswşı talqılaw» betiñizder arqılı basqalarğa baýlanısw mümkindik beredi. Öziñizdiñ kim ekeniñizdi bildirtpeýdi.',
+'nocookiesnew' => 'Qatıswşı tirkelgisi jasaldı, tek äli kirmegensiz. {{SITENAME}} jobasına qatıswşı kirw üşin «cookies» qasïeti qajet. Şolğışıñızda «cookies» qasïeti öşirilgen. Sonı endiriñiz de jaña qatıswşı atıñızdı jäne qupïya söziñizdi engizip kiriñiz.',
+'nocookieslogin' => 'Qatıswşı kirw üşin {{SITENAME}} jobası «cookies» qasïetin qoldanadı. Şolğışıñızda «cookies» qasïeti öşirilgen. Sonı endiriñiz de qaýtalap kiriñiz.',
+'noname' => 'Qatıswşı atın durıs engizbediñiz.',
+'loginsuccesstitle' => 'Kirwiñiz sätti ötti',
+'loginsuccess' => "'''Siz endi {{SITENAME}} jobasına «$1» retinde kirip otırsız.'''",
+'nosuchuser' => 'Mında «$1» atawlı qatıswşı joq. Emleñizdi tekseriñiz, nemese jaña tirkelgi jasañız.',
+'nosuchusershort' => 'Mında «$1» degen qatıswşı atawı joq. Emleñizdi tekseriñiz.',
+'nouserspecified' => 'Qatıswşı atın engiziwiñiz qajet.',
+'wrongpassword' => 'Engizgen qupïya söz jaramsız. Qaýtalap köriñiz.',
+'wrongpasswordempty' => 'Qupïya söz bostı boptı. Qaýtalap köriñiz.',
+'mailmypassword' => 'Qupïya sözimdi xatpen jiber',
+'passwordremindertitle' => 'Qupïya söz twralı {{SITENAME}} jobasınıñ eskertwi',
+'passwordremindertext' => 'Keýbirew (IP jaýı: $1, bälkim, öziñiz bolarsız)
+{{SITENAME}} üşin bizden jaña qupïya sözin jiberwin suranısqan ($4).
+«$2» qatıswşınıñ qupïya sözi «$3» boldı endi.
+Qazir kirwiñiz jäne qupïya söziñizdi awıstrwıñız qajet.
+
+Eger basqa birew bul suranıstı jasasa, nemese qupïya söziñizdi umıtsañız da,
+jäne bunı özgertkiñiz kelmese de, osı xabarlamağa añğarmawıñızğa da boladı,
+eski qupïya söziñizdi äriğaraý qoldanıp.',
+'noemail' => 'Mında «$1» qatıswşınıñ e-poştası joq.',
+'passwordsent' => 'Jaña qupïya söz «$1» üşin
+tirkelgen e-poşta jaýına jiberildi.
+Qabıldağannan keýin kirgende sonı engiziñiz.',
+'blocked-mailpassword' => 'IP jaýıñızdan öñdew buğattalğan, sondıqtan
+qïyanatşılıqtan saqtanw üşin qupïya söz jiberw qızmetiniñ äreketi ruqsat etilmeýdi.',
+'eauthentsent' => 'Kwälandırw xatı atalğan e-poşta jaýına jiberildi.
+Basqa e-poşta xatın jiberwdiñ aldınan, tirkelgi şınınan sizdiki ekenin
+kwälandırw üşin xattağı nusqawlarğa eriñiz.',
+'throttled-mailpassword' => 'Soñğı $1 sağatta qupïya söz eskertw xatı jiberildi tüge.
+Qïyanatşılıqqa kedergi bolw üşin, $1 sağat saýın tek bir ğana qupïya söz eskertw
+xatı jiberiledi.',
+'mailerror' => 'Xat jiberw qatesi: $1',
+'acct_creation_throttle_hit' => 'Ğafw etiñiz, siz $1 tirkelgi jasapsız tüge. Onan artıq isteý almaýsız.',
+'emailauthenticated' => 'E-poşta jaýıñız kwälandırılğan kezi: $1.',
+'emailnotauthenticated' => 'E-poşta jaýıñız äli kwälandırğan joq.
+Tömendegi qasïettter üşin eşqandaý xat jiberilmeýdi.',
+'noemailprefs' => 'Osı qasïetter istewi üşin e-poşta jaýıñızdı engiziñiz.',
+'emailconfirmlink' => 'E-poşta jaýıñızdı kwälandırıñız',
+'invalidemailaddress' => 'Osı e-poşta jaýda jaramsız pişim bolğan, qabıl etilmeýdi.
+Durıs pişimdelgen jaýdı engiziñiz, ne awmaqtı bos qaldırıñız.',
+'accountcreated' => 'Tirkelgi jasaldı',
+'accountcreatedtext' => '$1 üşin qatıswşı tirkelgisi jasaldı.',
+
+# Edit page toolbar
+'bold_sample' => 'Jwan mätin',
+'bold_tip' => 'Jwan mätin',
+'italic_sample' => 'Qïğaş mätin',
+'italic_tip' => 'Qïğaş mätin',
+'link_sample' => 'Silteme atawı',
+'link_tip' => 'Ä°ÅŸki silteme',
+'extlink_sample' => 'http://www.example.com silteme atawı',
+'extlink_tip' => 'Sırtqı silteme (aldınan http:// engizwin umıtpañız)',
+'headline_sample' => 'Taqırıp mätini',
+'headline_tip' => '1-şi deñgeýli taqırıp',
+'math_sample' => 'Formwlanı mında engiziñiz',
+'math_tip' => 'Matematïka formwlası (LaTeX)',
+'nowiki_sample' => 'Pişimdelmeýtin mätindi osında engiziñiz',
+'nowiki_tip' => 'Wïkï pişimin elemew',
+'image_sample' => 'Example.jpg',
+'image_tip' => 'Kiriktirilgen swret',
+'media_sample' => 'Example.ogg',
+'media_tip' => 'Taspa faýlınıñ siltemesi',
+'sig_tip' => 'Qoltañbañız jäne waqıt belgisi',
+'hr_tip' => 'Dereleý sızıq (ünemdi qoldanıñız)',
+
+# Edit pages
+'summary' => 'Sïpattaması',
+'subject' => 'Taqırıbı/bası',
+'minoredit' => 'Bul şağın tüzetw',
+'watchthis' => 'Betti baqılaw',
+'savearticle' => 'Betti saqta!',
+'preview' => 'Qarap şığw',
+'showpreview' => 'Qarap şığw',
+'showlivepreview' => 'Twra qarap şığw',
+'showdiff' => 'Özgeristerdi körset',
+'anoneditwarning' => "'''Nazar salıñız:''' Siz jüýege kirmegensiz. IP jaýıñız bul bettiñ öñdew tarïxında jazılıp alınadı.",
+'missingsummary' => "'''Eskertw:''' Tüzetw sïpattamasın engizbepsiz. «Saqtaw» tüýmesin tağı bassañız, tüzetwiñiz mändemesiz saqtaladı.",
+'missingcommenttext' => 'Tömende mändemeñizdi engiziñiz.',
+'missingcommentheader' => "'''Eskertw:''' Bul mändemege taqırıp/basjol jetistirmepsiz. Eger tağı da Saqtaw tüýmesin nuqısañız, tüzetwiñiz solsız saqtaladı.",
+'summary-preview' => 'Sïpattamasın qarap şığw',
+'subject-preview' => 'Taqırıbın/basın qarap şığw',
+'blockedtitle' => 'Paýdalanwşı buğattalğan',
+'blockedtext' => "<big>'''Qatıswşı atıñız ne IP jaýıñız buğattalğan.'''</big>
+
+buğattawdı $1 istegen. Belgilengen sebebi: ''$2''.
+
+Osı buğattawdı talqılaw üşin $1 degenmen ne basqa [[{{ns:project}}:Äkimşiler|äkimşimen]] qatınaswıñızğa boladı.
+[[{{ns:special:Preferences|Tirkelgi baptawların]] qoldanıp jaramdı e-poşta jaýın engizgenşe deýin
+«Qatıswşığa xat jazw» qasïetin paýdalanılmaýsız. Ağımdıq IP jaýıñız $3 bolğan. Bunı ärbir suranısıñızğa qosıñız.",
+'blockedoriginalsource' => "Tömende '''$1''' degenniñ qaýnarı körsetiledi:",
+'blockededitsource' => "Tömende '''$1''' degenge jasalğan '''tüzetwñizdiñ''' mätini körsetiledi:",
+'whitelistedittitle' => 'Öñdew üşin kirwiñiz jön.',
+'whitelistedittext' => 'Betterdi öñdew üşin $1 jön.',
+'whitelistreadtitle' => 'Oqw üşin kirwiñiz jön',
+'whitelistreadtext' => 'Betterdi oqw üşin [[{{ns:special}}:Userlogin|kirwiñiz]] jön.',
+'whitelistacctitle' => 'Sizge tirkelgi jasawÄŸa ruqsat berilmegen',
+'whitelistacctext' => 'Osı wïkïde basqalarğa tirkelgi jasaw üşin [[{{ns:Special}}:Userlogin|kirwiñiz]] qajet jäne janasımdı ruqsattarın bïlew qajet.',
+'confirmedittitle' => 'E-poşta jaýın kwälandırw xatın qaýta öñdew qajet',
+'confirmedittext' => 'Betterdi öñdew üşin aldın ala E-poşta jaýıñızdı kwälandırwıñız qajet. Jaýıñızdı [[{{ns:Special}}:Preferences|qatıswşı baptawı]] arqılı engiziñiz jäne teksertkiñiz.',
+'loginreqtitle' => 'Kirwiñiz qajet',
+'loginreqlink' => 'kirw',
+'loginreqpagetext' => 'Basqa betterdi körw üşin siz $1 bolwıñız qajet.',
+'accmailtitle' => 'Qupïya söz jiberildi.',
+'accmailtext' => '$2 jaýına «$1» qupïya sözi jiberildi.',
+'newarticle' => '(Jaña)',
+'newarticletext' => 'Siltemege erip äli bastalmağan betke
+kelipsiz. Betti bastaw üşin, tömendegi awmaqta mätiniñizdi
+teriñiz (köbirek aqparat üşin [[{{ns:help}}:Mazmunı|kömek betin]]
+qarañız).Eger jañılğannan osında kelgen bolsañız, şolğışıñız
+«Artqa» degen tüýmesin nuqıñız.',
+'anontalkpagetext' => "----''Bul tirkelgisiz (nemese tirkelgisin qoldanbağan) paýdalanwşınıñ talqılaw beti. Osı paýdalanwşını biz tek sandıq IP jaýımen teñdestiremiz. Osındaý IP jaýlar birneşe paýdalanwşığa ortaq bolwı mümkin. Eger siz tirkelgisiz paýdalanwşı bolsañız jäne sizge qatıssız mändemeler jiberilgenin sezseñiz, basqa tirkelgisiz paýdalanwşılarmen aralastırmawı üşin [[{{ns:special}}:Userlogin|tirkelgi jasañız ne kiriñiz]].''",
+'noarticletext' => 'Bul bette ağımda eş mätin joq, basqa betterden osı bet atawın [[{{ns:special}}:Search/{{PAGENAME}}|izdep körwiñizge]] nemese osı betti [{{fullurl:{{FULLPAGENAME}}|action=edit}} tüzetwiñizge] boladı.',
+'clearyourcache' => "'''Añğartpa:''' Saqtağannan keýin özgeristerdi körw üşin şolğış qosalqı qaltasın bosatw keregi mümkin. '''Mozilla / Safari:''' ''Shift'' pernesin basıp turıp ''Reload'' (''Qaýta jüktew'') tüýmesin nuqıñız (ne ''Ctrl-Shift-R'' basıñız); ''IE:'' ''Ctrl-F5'' basıñız; '''Opera / Konqueror''' ''F5'' pernesin basıñız.",
+'usercssjsyoucanpreview' => '<strong>Basalqı:</strong> Saqtaw aldında jaña CSS/JS faýlın tekserw üşin «Qarap şığw» tüýmesin qoldanıñız.',
+'usercsspreview' => "'''Mınaw CSS mätinin tek qarap şığw ekenin umıtpañız, ol äli saqtalğan joq!'''",
+'userjspreview' => "'''Mınaw JavaScript qatıswşı bağdarlamasın tekserw/qarap şığw ekenin umıtpañız, ol äli saqtalğan joq!'''",
+'userinvalidcssjstitle' => "'''Nazar salıñız:''' Mında «$1» atawlı bezendirw mäneri joq. Paýdalanwşınıñ .css jäne .js faýl atawı kişi äripppen jazılatının umıtpañız, mısalğa {{ns:user}}:Foo/monobook.css degendi {{ns:user}}:Foo/Monobook.css degenmen salıstırıñız.",
+'updated' => '(Jañartılğan)',
+'note' => '<strong>Añğartpa:</strong>',
+'previewnote' => '<strong>Mınaw tek qarap şığw ekenin umıtpañız; tüzetwler äli saqtalğan joq!</strong>',
+'session_fail_preview' => '<strong>Ğafw etiñiz! Sessïya derekteri ısırap qalğandıqtan öñdewiñizdi jöndeý almaýmız.
+Mätiniñizdi saqtap qaýtalap köriñiz. Eger äli is ötpeýtin bolsa, şığıp jäne keri kirip köriñiz.</strong>',
+'previewconflict' => 'Bul qarap şığw joğarıdağı öñdew awmağındağı mätinge saqtağan kezindegi deý ıqpal etedi.',
+'session_fail_preview_html' => "<strong>Ğafw etiñiz! Sessïya derekteri ısırap qalğandıqtan öñdewiñizdi jöndeý almaýmız.</strong>
+
+''Osı wïkïde qam HTML endirilgen, JavaScript şabwıldardan qorğanw üşin aldın ala qarap şığw jasırılğan.''
+
+<strong>Eger bul öñdew adal talap bolsa, qaýtarıp köriñiz. Eger äli de istemese, şığıp, sosın keri kirip köriñiz.</strong>",
+'importing' => 'Sırttan alwda: $1',
+'editing' => 'Öñdewde: $1',
+'editinguser' => 'Qatıswşını öñdewde: <b>$1</b>',
+'editingsection' => 'Öñdewde: $1 (bölimi)',
+'editingcomment' => 'Öñdewde: $1 (mändemesi)',
+'editconflict' => 'Öñdew egesi: $1',
+'explainconflict' => 'Osı betti siz öñdeý bastağanda basqa keýbirew betti özgertken.
+Joğarğı awmaqta bettiñ ağımdıq mätini bar.
+Tömengi awmaqta siz özgertken mätini körsetiledi.
+Özgertwiñizdi ağımdıq mätinge üstewiñiz jön.
+"Betti saqta!" tüýmesine basqanda
+<b>tek</b> joğarğı awmaqtağı mätin saqtaladı.<br />',
+'yourtext' => 'Mätiniñiz',
+'storedversion' => 'Saqtalğan nusqası',
+'nonunicodebrowser' => '<strong>AÑĞARTPA: Şolğışıñız Unicode belgilewine üýlesimdi emes, sondıqtan latın emes äripteri bar betterdi öñdew zil bolw mümkin. Jumıs istewge ıqtïmaldıq berw üşin, <strong>tömengi öñdew awmağında ASCII emes äripter onaltılıq sanımen körsetiledi</strong>.',
+'editingold' => '<strong>AÑĞARTPA: Osı bettiñ erterek nusqasın
+öñdep jatırsız.
+Bunı saqtasañız, osı nwsqadan soñğı barlıq tüzetwler joýıladı.</strong>',
+'yourdiff' => 'Aýırmalar',
+'copyrightwarning' => '{{SITENAME}} jobasına qosılğan bükil üles $2 (köbirek aqparat üşin: $1) qujatına saý jiberilgen bolıp sanaladı. Eger jazwıñızdıñ erkin köşirilip tüzetilwin qalamasañız, mında usınbawıñız jön.<br />
+Tağı, qosqan ülesiñiz - öziñizdiñ jazğanığız, ne aşıq aqparat közderinen alınğan mağlumat bolğanın wäde etesiz.<br />
+<strong>AVTORLIQ QUQIQPEN QORĞAWLI AQPARATTI RUQSATSIZ QOSPAÑIZ!</strong>',
+'copyrightwarning2' => 'Este tursın: barlıq {{SITENAME}} jobasına berilgen ülester basqa wles berwşilermen tüzetwge, özgertwge, ne alastanwğa mümkin. Alğıssız tüzetwge enjarlan bolsañız, onda şığarmañızdı mında jarïyalamañız.<br />
+Tağı, osını öziñiz jazğanıñızdı, ne barşa qazınasınan, nemese sondaý-aq aqısız aşıq qaýnarınan köşirgeniñizdi
+däl osındaý bizge mindetteme beresiz (köbirek aqparat üşin $1 qwjatın qarañız).<br />
+<strong>AWTORLIQ QUQIQPEN QORĞAWLI AQPARATTI RUQSATSIZ QOSPAÑIZ!</strong>',
+'longpagewarning' => '<strong>NAZAR SALIÑIZ: Bul bettiñ mölşeri — $1 kïlobaýt; keýbir
+şolğıştarda bet mölşeri 32 kB jetse ne onı assa öñdew kürdeli bolwı mümkin.
+Betti birneşe kişkin bölimderge bölip köriñiz.</strong>',
+'longpageerror' => '<strong>QATE: Jiberetin mätiniñizdin mölşeri — $1 kB, eñ köbi $2 kB
+ruqsat etilgen mölşerinen asqan. Bul saqtaý alınbaýdı.</strong>',
+'readonlywarning' => '<strong>NAZAR SALIÑIZ: Derekqor jöndetw üşin qulıptalğan,
+sondıqtan däl qazir tüzetwiñizdi saqtaý almaýsız. Sosın qoldanwğa üşin mätäniñizdi köşirip,
+öz kompüteriñizde faýlğa saqtañız.</strong>',
+'protectedpagewarning' => '<strong>NAZAR SALIÑIZ: Bul bet qorğalğan. Tek äkimşi ruqsatı bar qatıswşılar öñdew jasaý aladı.</strong>',
+'semiprotectedpagewarning' => "'''Añğartpa:''' Bet [[{{ns:project}}:Jartılaý qorğaw sayasatı|qorğalğan]], sondıqtan osını tek ruqsatı bar qatıswşılar öñdeý aladı.",
+'templatesused' => 'Bul bette qoldanılğan ülgiler:',
+'templatesusedpreview' => 'Bunı qarap şığwğa qoldanılğan ülgiler:',
+'templatesusedsection' => 'Bul bölimde qoldanılğan ülgiler:',
+'edittools' => '<!-- Mındağı mağlumat öñdew jäne qotarw ülgittriñiñ astında körsetiledi. -->',
+'nocreatetitle' => 'Betti bastaw ÅŸektelgen',
+'nocreatetext' => 'Bul torapta jaña bet bastawı şektelgen.
+Keri qaýtıp bar betti öñdewiñizge boladı, nemese [[{{ns:special}}:Userlogin|kirwiñizge ne tirkelgi jasawğa]] boladı.',
+'cantcreateaccounttitle' => 'Tirkelgi jasalmadı',
+'cantcreateaccounttext' => 'Osı IP jaýdan (<b>$1</b>) tirkelgi jasawı buğattalğan.
+Bälkim sebebi, oqw ornıñızdan, nemese Ãnternet jetkizwÅŸiden
+üzbeý buzaqılıq bolğanı.',
+
+# History pages
+'revhistory' => 'Nusqalar tarïxı',
+'viewpagelogs' => 'Osı betke qatıstı jwrnaldardı qaraw',
+'nohistory' => 'Osı bettiniñ nusqalar tarïxı joq.',
+'revnotfound' => 'Nusqa tabılmadı',
+'revnotfoundtext' => 'Osı suranısqan bettiñ eski nusqası tabılğan joq.
+Osı betti aşwğa paýdalanğan URL jaýın qaýta tekserip şığıñız.',
+'loadhist' => 'Bet tarïxın jüktewi',
+'currentrev' => 'Ağımdıq nusqası',
+'revisionasof' => '$1 kezindegi nusqası',
+'revision-info' => '$1 kezindegi $2 jasağan nusqası',
+'previousrevision' => '↠Eskilew nusqası',
+'nextrevision' => 'Jañalaw nusqası →',
+'currentrevisionlink' => 'Ağımdıq nusqası',
+'cur' => 'ağım.',
+'next' => 'kel.',
+'last' => 'soñ.',
+'orig' => 'tüp.',
+'histlegend' => 'Aýırmasın körw: salıstıramın degen nusqalardı tañdap, ne <Enter> pernesin, ne tömendegi tüýmeni basıñız.<br />
+Şarttı belgiler: (ağım.) = ağımdıq nusqamen aýırması,
+(soñ.) = aldıñğı nusqamen aýırması, ş = şağın tüzetw',
+'deletedrev' => '[joýılğan]',
+'histfirst' => 'Eñ alğaşqısına',
+'histlast' => 'Eñ soñğısına',
+'rev-deleted-comment' => '(mändeme alastatıldı)',
+'rev-deleted-user' => '(qatıswşı atı alastatıldı)',
+'rev-deleted-text-permission' => '<div class="mw-warning plainlinks">
+Osı bettiñ nusqası jarïya murağattarınan alastatılğan.
+Bul jaýtqa [{{fullurl:{{ns:special}}:Log/delete|page={{PAGENAMEE}}}} joyw jwrnalında] egjeý-tegjeý mälimetter bolwı mümkin.
+</div>',
+'rev-deleted-text-view' => '<div class="mw-warning plainlinks">
+Osı bettiñ nusqası jarïya murağattarınan alastatılğan.
+Sonı osı toraptıñ äkimşisi bop körwiñiz mümkin;
+bul jaýtqa [{{fullurl:{{ns:special}}:Log/delete|page={{PAGENAMEE}}}} joyw jwrnalında] egjeý-tegjeý mälmetter bolwı mümkin.
+</div>',
+'rev-delundel' => 'körset/jasır',
+
+'history-feed-title' => 'Nusqalar tarïxı',
+'history-feed-description' => 'Bul bettiñ wïkïdegi nusqalar tarïxı',
+'history-feed-item-nocomment' => '$1 degen $2 kezinde', # user at time
+'history-feed-empty' => 'SuranÄŸan bet joq.
+Bul bet wïkïden joýılğan, nemese qaýta atalğan.
+Säýkesi bar jaña betterdi [[{{ns:special}}:Search|wïkïden izdep]] qarañız.',
+
+# Revision deletion
+'revisiondelete' => 'Nusqalardı joyw/qaýtarw',
+'revdelete-nooldid-title' => 'Nısana nusqası joq',
+'revdelete-nooldid-text' => 'Osı äreketti orındaw üşin aqırğı nusqasın
+ne nusqaların engizbepsiz.',
+'revdelete-selected' => '[[:$1]] degenniñ talğanılğan nusqası:',
+'revdelete-text' => 'Joýılğan nusqalardı äli de bet tarïxında körwge boladı,
+biraq onıñ mätin mağlumatı barşağa qatınalmaýdı.
+
+Osı wïkïdiñ basqa äkimşileri jasırın mağlumatqa qatınaý aladı,
+jäne torap operatorları qosımşa şektew endirgenşe deýin,
+osı tildesw arqılı joýılğandı keri qaýtara aladı.',
+'revdelete-legend' => 'Nusqanınıñ şektewleri:',
+'revdelete-hide-text' => 'Nusqa mätinin jasır',
+'revdelete-hide-comment' => 'Tüzetw mändemesin jasır',
+'revdelete-hide-user' => 'Öñdewşi atın (IP jaýın) jasır',
+'revdelete-hide-restricted' => 'Osı şektewlerdi barşağa sïyaqtı äkimşilerge de qoldanw',
+'revdelete-log' => 'Jwrnal mändemesi:',
+'revdelete-submit' => 'TalÄŸanÄŸan nusqaÄŸa qoldanw',
+'revdelete-logentry' => '[[$1]] degenge nusqa körinisin özgertti',
+
+# Diffs
+'difference' => '(Nusqalar arasındağı aýırmaşılıq)',
+'loadingrev' => 'aýırma üşin nusqa jüktew',
+'lineno' => 'Jol $1:',
+'editcurrent' => 'Osı bettiñ ağımdıq nusqasın öñdew',
+'selectnewerversionfordiff' => 'Salıstırw üşin jañalaw nusqasın talğañız',
+'selectolderversionfordiff' => 'Salıstırw üşin eskilew nusqasın talğañız',
+'compareselectedversions' => 'Tañdağan nusqalardı salıstırw',
+
+# Search results
+'searchresults' => 'İzdestirw nätïjeleri',
+'searchresulttext' => 'Osı {{SITENAME}} jobasında izdestirw twralı köbirek aqparat üşin, [[{{ns:project}}:İzdew|{{SITENAME}} izdew nusqawların]] qarañız.',
+'searchsubtitle' => "İzdestirw suranısıñız: '''[[:$1]]'''",
+'searchsubtitleinvalid' => "İzdestirw suranısıñız: '''$1'''",
+'badquery' => 'İzdestirw suranıs jaramsız pişimdelgen',
+'badquerytext' => 'Ğafw etiñiz, suranısıñızdı orındaý almadıq.
+Bul üş äripten kem sözdi izdestirwge talaptanğanıñızdan
+bolwğa mümkin, ol äli de süýemeldenbegen.
+Tağı da bul söýlemdi durıs engizbegendikten de bolwğa mümkin,
+mısalı, «balıq jäne jäne qabırşaq».
+Basqa suranıs jasap köriñiz',
+'matchtotals' => '«$1» izdestirw suranısı $2 bettiñ atawına
+jäne $3 bettiñ mätinine säýkes.',
+'noexactmatch' => "'''Osında «$1» atawlı bet joq.''' Bul betti öziñiz '''[[:$1|bastaý alasız]].'''",
+'titlematches' => 'Bet atawı säýkesi',
+'notitlematches' => 'Eş bet atawı säýkes emes',
+'textmatches' => 'Bet mätiniñ säýkesi',
+'notextmatches' => 'Eş bet mätini säýkes emes',
+'prevn' => 'aldıñğı $1',
+'nextn' => 'kelesi $1',
+'viewprevnext' => 'Körsetilwi: ($1) ($2) ($3) jazba.',
+'showingresults' => 'Tömende nömir <b>$2</b> degennen bastap <b>$1</b> nätïjege deýin körsetilgen.',
+'showingresultsnum' => 'Tömende nömir <b>$2</b> degennen bastap <b>$3</b> nätïje körsetilgen.',
+'nonefound' => "'''Añğartpa''': Tabw sätsiz bitwi jïi «bolğan» jäne «degen» sïyaqtı
+tizimdelmeýtin jalpı sözdermen izdestirwden bolwı mümkin,
+nemese birden artıq izdestirw şart sözderin egizgennen (nätïjelerde tek
+barlıq şart sözder kedesse körsetiledi) bolwı mümkin.",
+'powersearch' => 'Ä°zdew',
+'powersearchtext' => 'Mına esim ayalarda izdew:<br />$1<br />$2 Aýdatwlardı tizimdew<br />İzdestirw suranısı: $3 $9',
+'searchdisabled' => '{{SITENAME}} jobasında işki izdewi öşirilgen. Äzirşe Google nemese Yahoo! arqılı izdewge boladı. Añğartpa: {{SITENAME}} mağlumat tizimidewleri olarda eskirgen bolwğa mümkin.',
+'blanknamespace' => '(Negizgi)',
+
+# Preferences page
+'preferences' => 'Baptawlar',
+'mypreferences' => 'Baptawım',
+'prefsnologin' => 'Kirmegensiz',
+'prefsnologintext' => 'Baptawlardı qalaw üşin aldın ala [[{{ns:special}}:Userlogin|kirwiñiz]] qajet.',
+'prefsreset' => 'Baptawlar arqawdan qaýta ornatıldı.',
+'qbsettings' => 'Mäzir aýmağı',
+'changepassword' => 'Qupïya söz özgertw',
+'skin' => 'Bezendirw',
+'math' => 'Matematïka',
+'dateformat' => 'Kün-aý pişimi',
+'datedefault' => 'Eş qalawsız',
+'datetime' => 'Waqıt',
+'math_failure' => 'Öñdetw sätsiz bitti',
+'math_unknown_error' => 'belgisiz qate',
+'math_unknown_function' => 'belgisiz fwnkcïya',
+'math_lexing_error' => 'leksïka qatesi',
+'math_syntax_error' => 'sïntaksïs qatesi',
+'math_image_error' => 'PNG awdarısı sätsiz bitti; latex, dvips, gs jäne convert bağdarlamalarınıñ mültiksiz ornatwın tekseriñiz',
+'math_bad_tmpdir' => 'Matematïkanıñ waqıtşa qaltasına jazılmadı, ne qalta jasalmadı',
+'math_bad_output' => 'Matematïkanıñ beris qaltasına jazılmadı, ne qalta jasalmadı',
+'math_notexvc' => 'texvc bağdarlaması joğaltılğan; baptaw üşin math/README qujatın qarañız.',
+'prefs-personal' => 'Jeke derekteri',
+'prefs-rc' => 'Jwıqtağı özgerister',
+'prefs-watchlist' => 'Baqılaw',
+'prefs-watchlist-days' => 'Baqılaw tiziminde körseterin kün sanı:',
+'prefs-watchlist-edits' => 'Keñeýtilgen baqılaw tizimi tüzetw körseterin sanı:',
+'prefs-misc' => 'Qosımşa',
+'saveprefs' => 'Saqta',
+'resetprefs' => 'Tasta',
+'oldpassword' => 'Ağımdıq qupïya söz:',
+'newpassword' => 'Jaña qupïya söz:',
+'retypenew' => 'Jaña qupïya sözdi qaýtalañız:',
+'textboxsize' => 'Öñdew',
+'rows' => 'Joldar:',
+'columns' => 'BaÄŸandar:',
+'searchresultshead' => 'Ä°zdew',
+'resultsperpage' => 'Bet saýın nätïje sanı:',
+'contextlines' => 'Nätïje saýın jol sanı:',
+'contextchars' => 'Jol saýın ärip sanı:',
+'stubthreshold' => 'Biteme körstetwin anıqtaw tabaldırığı:',
+'recentchangescount' => 'Jwıqtağı özgeristerdegi atawlar:',
+'savedprefs' => 'Baptawlarıñız saqtaldı.',
+'timezonelegend' => 'Waqıt beldewi',
+'timezonetext' => 'Jergilikti waqıtıñızben server waqıtınıñ (UTC) arasındağı sağat sanı.',
+'localtime' => 'Jergilikti waqıt',
+'timezoneoffset' => 'Iğıstırw¹',
+'servertime' => 'Server waqıtı',
+'guesstimezone' => 'Şolğıştan alıp toltırw',
+'allowemail' => 'Basqadan xat qabıldawın endirw',
+'defaultns' => 'Mına esim ayalarda ädepkiden izdew:',
+'default' => 'ädepki',
+'files' => 'Faýldar',
+
+# User rights
+'userrights-lookup-user' => 'Qatıswşı toptarın meñgerw',
+'userrights-user-editname' => 'Qatıswşı atın engiziñiz:',
+'editusergroup' => 'Qatıswşı toptarın öñdew',
+'userrights-editusergroup' => 'Qatıswşı toptarın öñdew',
+'saveusergroups' => 'Qatıswşı toptarın saqtaw',
+'userrights-groupsmember' => 'Müşeligi:',
+'userrights-groupsavailable' => 'Qatınawlı toptar:',
+'userrights-groupshelp' => 'Qatıswşını üsteýtin ne alastatın toptardı talğañız.
+Talğawı öşirilgen toptar özgertilimeýdi. Toptardıñ talğawın CTRL + Sol jaq nuqwmen öşirwiñizge boladı.',
+
+# Groups
+'group' => 'Top:',
+'group-bot' => 'Bottar',
+'group-sysop' => 'Äkimşiler',
+'group-bureaucrat' => 'Töreşiler',
+'group-all' => '(barlığı)',
+
+'group-bot-member' => 'bot',
+'group-sysop-member' => 'äkimşi',
+'group-bureaucrat-member' => 'töreşi',
+
+'grouppage-bot' => '{{ns:project}}:Bottar',
+'grouppage-sysop' => '{{ns:project}}:Äkimşiler',
+'grouppage-bureaucrat' => '{{ns:project}}:Töreşiler',
+
+# Recent changes
+'changes' => 'özgeris',
+'recentchanges' => 'Jwıqtağı özgerister',
+'recentchangestext' => 'Bul bette osı wïkïdegi bolğan jwıqtağı özgerister baýqaladı.',
+'rcnote' => '$3 kezine deýin — tömende soñğı <strong>$2</strong> kündegi, soñğı <strong>$1</strong> özgeris körsetilgen.',
+'rcnotefrom' => '<b>$2</b> kezinen beri — tömende özgerister <b>$1</b> deýin körsetilgen.',
+'rclistfrom' => '$1 kezinen beri — jaña özgeristerdi körset.',
+'rcshowhideminor' => 'Şağın tüzetwdi $1',
+'rcshowhidebots' => 'Bottardı $1',
+'rcshowhideliu' => 'Tirkelgendi $1',
+'rcshowhideanons' => 'Tirkelgisizdi $1',
+'rcshowhidepatr' => 'Küzettegi tüzetwlerdi $1',
+'rcshowhidemine' => 'Tüzetwimdi $1',
+'rclinks' => 'Soñğı $2 künde bolğan, soñğı $1 özgeristi körset<br />$3',
+'diff' => 'aýırm.',
+'hist' => 'tar.',
+'hide' => 'jasır',
+'show' => 'körset',
+'minoreditletter' => 'ÅŸ',
+'newpageletter' => 'J',
+'boteditletter' => 'b',
+'sectionlink' => '→',
+'number_of_watching_users_pageview' => '[baqılağan $1 qatıswşı]',
+'rc_categories' => 'Sanattarğa şektew ("|" belgisimen bölikteñiz)',
+'rc_categories_any' => 'Qaýsıbir',
+
+# Upload
+'upload' => 'Faýl qotarw',
+'uploadbtn' => 'Qotar!',
+'reupload' => 'Qaýtalap qotarw',
+'reuploaddesc' => 'Qotarw ülgitine oralw.',
+'uploadnologin' => 'Kirmegensiz',
+'uploadnologintext' => 'Faýl qotarw üşin
+[[{{ns:special}}:Userlogin|kirwiñiz]] qajet.',
+'upload_directory_read_only' => 'Qotarw qaltasına ($1) jazwğa veb-serverge ruqsat berilmegen.',
+'uploaderror' => 'Qotarw qatesi',
+'uploadtext' => "Tömendegi ülgit faýl qotarwğa qoldanıladı, aldındağı swretterdi qaraw üşin ne izdew üşin [[{{ns:special}}:Imagelist|qotarılğan faýldar tizimine]] barıñız, qotarw men joyw tağı da [[{{ns:special}}:Log/upload|qotarw jwrnalına]] jazılıp alınadı.
+
+Swretterdi betke kirgizw üşin, faýlğa twra baýlanıstratın
+'''<nowiki>[[{{ns:image}}:File.jpg]]</nowiki>''',
+'''<nowiki>[[{{ns:image}}:File.png|balama mätin]]</nowiki>''' nemese
+'''<nowiki>[[{{ns:media}}:File.ogg]]</nowiki>''' silteme pişimin qoldanıñız.",
+'uploadlog' => 'qotarw jwrnalı',
+'uploadlogpage' => 'Qotarw jwrnalı',
+'uploadlogpagetext' => 'Tömende jwıqtağı qotarılğan faýl tizimi.',
+'filename' => 'Faýl atı',
+'filedesc' => 'Sïpattaması',
+'fileuploadsummary' => 'Sïpattaması:',
+'filestatus' => 'Awtorlıq quqıqtarı küýi',
+'filesource' => 'Faýl qaýnarı',
+'copyrightpage' => '{{ns:project}}:Awtorlıq quqıqtar',
+'copyrightpagename' => '{{SITENAME}} awtorlıq quqıqtarı',
+'uploadedfiles' => 'Qotarılğan faýldar',
+'ignorewarning' => 'Nazar salwdı elemew jäne faýldı ärdeqaşan saqtaw.',
+'ignorewarnings' => 'Ärqaýsı nazar salwlardı elemew',
+'minlength' => 'Faýl atında eñ keminde üş ärip bolwı kerek.',
+'illegalfilename' => '«$1» faýl atawında bet atawlarında ruqsat etilmegen nışandar bar. Faýldı qaýta atañız, sosın qaýta jwktep köriñiz.',
+'badfilename' => 'Faýldıñ atı «$1» bop özgertildi.',
+'badfiletype' => '«.$1» usınılmağan swret faýlınıñ keñeýtimi.',
+'largefile' => 'Faýl mölşerin $1 Baýttan asırmawğa tırısıñız, bul faýl mölşeri $2 Baýt',
+'largefileserver' => 'Osı faýldıñ mölşeri serverdiñ qalawınan asıp ketken.',
+'emptyfile' => 'Qotarılğan faýlıñız bos sïyaqtı. Bul faýl atawı jansaq engizilgeninen bolwı mümkin. Qotarğıñız kelgen faýl şınında da osı faýl bolğanın tekserip alıñız.',
+'fileexists' => 'Osındaý atawlı faýl bar tüge. Qaýta jazwdıñ aldınan $1 tekserip şığıñız.',
+'fileexists-forbidden' => 'Osındaý atawlı faýl bar tüge. Keri qaýtıñız da, jäne osı faýldı basqa atımen qotarıñız. [[{{ns:image}}:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'Osındaý atawlı faýl ortaq faýl arqawında bar tüge. Keri qaýtıñız da, osı faýldı jaña atımen qotarıñız. [[{{ns:image}}:$1|thumb|center|$1]]',
+'successfulupload' => 'Qotarw sätti ötti',
+'fileuploaded' => '«$1» faýlı sätti qotarıldı!
+Osı siltemege erip — $2, sïpattama betine barıñız da, jäne osı faýl twralı
+aqparat toltırıñız: qaýdan alınğanın, qaşan jasalğanın, kim jasağanın,
+tağı basqa biletiñizdi. Bul swret bolsa, mınadaý pişimimen kiristirwge boladı: <tt><nowiki>[[Swret:$1|thumb|Sïpattaması]]</nowiki></tt>',
+'uploadwarning' => 'Qotarw twralı nazar salw',
+'savefile' => 'Faýldı saqtaw',
+'uploadedimage' => '«[[$1]]» faýlın qotardı',
+'uploaddisabled' => 'Faýl qotarwı öşirilgen',
+'uploaddisabledtext' => 'Osı wïkïde faýl qotarwı öşirilgen.',
+'uploadscripted' => 'Osı faýlda, veb şolğıştı ağat tüsindikke keltiretiñ HTML belgilew, ne skrïpt kodı bar.',
+'uploadcorrupt' => 'Osı faýl büldirilgen, ne ädepsiz keñeýtimi bar. Faýldı tekserip, qotarwın qaýtalañız.',
+'uploadvirus' => 'Osı faýlda vïrws bolwı mümkin! Egjeý-tegjeý aqparatı: $1',
+'sourcefilename' => 'Qaýnardağı faýl atı',
+'destfilename' => 'Aqırğı faýl atı',
+'watchthisupload' => 'Osı betti baqılaw',
+'filewasdeleted' => 'Osı atawı bar faýl burın qotarılğan, sosın joýıldırılğan. Qaýta qotarw aldınan $1 degendi tekseriñiz.',
+
+'upload-proto-error' => 'Jaramsız xattamalıq',
+'upload-proto-error-text' => 'Sırttan qotarw üşin URL jaýları <code>http://</code> nemese <code>ftp://</code> degenderden bastalw qajet.',
+'upload-file-error' => 'Ä°ÅŸki qate',
+'upload-file-error-text' => 'Serverde waqıtşa faýl jasawı işki qatege uşırastı. Bul jüýeniñ äkimşimen qatınasıñız.',
+'upload-misc-error' => 'Belgisiz qotarw qatesi',
+'upload-misc-error-text' => 'Qotarw kezinde belgisiz qate uşırastı. Qaýsı URL jaýı jaramdı jäne qatınawlı ekenin tekserip şığıñız da qaýtalap köriñiz. Eger bul mäsele älde de qalsa, jüýe äkimşimen qatınasıñız.',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'URL jaýı jetilmedi',
+'upload-curl-error6-text' => 'Berilgen URL jaýı jetilmedi. Qaýsı URL jaýı durıs ekenin jäne torap iste ekenin qaýtalap qatañ tekseriñiz.',
+'upload-curl-error28' => 'Qotarwğa berilgen waqıt bitti',
+'upload-curl-error28-text' => 'Toraptıñ jawap berwi tım uzaq waqıtqa sozıldı. Bul torap iste ekenin tekserip şığıñız, az waqıt kidire turıñız da tağı qaýtalap köriñiz. Talabıñızdı jüktelwi azdaw kezinde qaýtalawğa bolmıs.',
+
+'license' => 'Lïcenzïyası',
+'nolicense' => 'Eşteñe talğanbağan',
+'upload_source_url' => ' (jaramdı, barşağa qatınawlı URL jaý)',
+'upload_source_file' => ' (komp′ywteriñizdegi faýl)',
+
+# Image list
+'imagelist' => 'Faýl tizimi',
+'imagelisttext' => "Tömende ''$2'' surıptalğan '''$1''' faýl tizimi.",
+'imagelistforuser' => 'Mında tek $1 jüktegen swretter körsetiledi.',
+'getimagelist' => 'faýl tizimdewi',
+'ilsubmit' => 'Ä°zdew',
+'showlast' => 'Soñğı $1 faýl $2 surıptap körset.',
+'byname' => 'atımen',
+'bydate' => 'kün-aýmen',
+'bysize' => 'mölşerimen',
+'imgdelete' => 'joyw',
+'imgdesc' => 'sïpp.',
+'imgfile' => 'faýl',
+'imglegend' => 'Şarttı belgiler: (sïpp.) — faýl sïpattamasın körsetw/öñdew.',
+'imghistory' => 'Faýl tarïxı',
+'revertimg' => 'qaýt.',
+'deleteimg' => 'joyw',
+'deleteimgcompletely' => 'Osı faýldıñ barlıq nusqaların joý',
+'imghistlegend' => 'Şarttı belgiler: (ağım.) = ağımdıq faýl, (joyw) = eski nusqasın
+joyw, (qaý.) = eski nusqasına qaýtarw.
+<br /><i>Qotarılğan faýldı körw üşin kün-aýına nuqıñız</i>.',
+'imagelinks' => 'Siltemeleri',
+'linkstoimage' => 'Bul faýlğa kelesi better silteýdi:',
+'nolinkstoimage' => 'Bul faýlğa eş bet siltemeýdi.',
+'sharedupload' => 'Bul faýl ortaq arqawına qotarılğan sondıqtan basqa jobalarda qoldanwı mümkin.',
+'shareduploadwiki' => 'Bılaýğı aqparat üşin $1 degendi qarañız.',
+'shareduploadwiki-linktext' => 'faýl sïpattaması beti',
+'noimage' => 'Mınadaý atawlı faýl joq, $1 mümkindigiñiz bar.',
+'noimage-linktext' => 'osını qotarw',
+'uploadnewversion-linktext' => 'Bul faýldıñ jaña nusqasın qotarw',
+'imagelist_date' => 'Kün-aýı',
+'imagelist_name' => 'Atawı',
+'imagelist_user' => 'Qatıswşı',
+'imagelist_size' => 'Mölşeri (baýt)',
+'imagelist_description' => 'Sïpattaması',
+'imagelist_search_for' => 'Swretti atımen izdew:',
+
+# MIME search
+'mimesearch' => 'Faýldı MIME türimen izdew',
+'mimetype' => 'MIME türi:',
+'download' => 'jüktew',
+
+# Unwatched pages
+'unwatchedpages' => 'Baqılanbağan better',
+
+# List redirects
+'listredirects' => 'Aýdatw bet tizimi',
+
+# Unused templates
+'unusedtemplates' => 'Paýdalanılmağan ülgiler',
+'unusedtemplatestext' => 'Bul bet basqa betke kirictirilmegen ülgi esim ayaısındağı barlıq betterdi tizimdeýdi. Ülgilerdi joyw aldınan bunıñ basqa siltemelerin tekserip şığwın umıtpañız',
+'unusedtemplateswlh' => 'basqa siltemeler',
+
+# Random redirect
+'randomredirect' => 'Kezdeýsoq aýdatw',
+
+# Statistics
+'statistics' => 'Joba sanağı',
+'sitestats' => '{{SITENAME}} sanağı',
+'userstats' => 'Qatıswşı sanağı',
+'sitestatstext' => "Mındağı derekqorda bulaýşa '''$1''' bet bar.
+Bunıñ işinde «talqılaw» betteri, {{SITENAME}} jobası twralı better, kişkene «biteme»
+better, aýdatwlar, mağlumat bet dep sanalmaýtın, bälkim, tağı da basqalar.
+Osını esepten şığarğanda, mında mağlumattı dep sanalatın
+'''$2''' bet bar şığar.
+
+Torapqa '''$8''' faýl qotarılğan.
+
+Osı wïkï jobası ornatılğannan beri bulaýşa better '''$3''' ret qaralğan,
+jäne better '''$4''' ret öñdelgen.
+Bunıñ nätïjesinde orta eseppen bir bet saýın '''$5''' öñdew istelingen, jäne bir öñdew saýın '''$6''' ret qaraw kelgen.
+
+Ağımdıq [http://meta.wikimedia.org/wiki/Help:Job_queue tapsırım kezegi] uzındılığı: '''$7'''.",
+'userstatstext' => "Mında '''$1''' tirkelgen qatıswşı bar, sonıñ işinde
+'''$2''' (nemese '''$4 %''') $5 bar.",
+'statistics-mostpopular' => 'Eñ köp qaralğan better',
+
+'disambiguations' => 'Aýrıqtı better',
+'disambiguationspage' => '{{ns:template}}:Disambig',
+'disambiguationstext' => 'Kelesi better <i>aýrıqtı betke</i> silteýdi. Bunıñ ornına belgili taqırıpqa siltewi qajet.<br />Betke $1 siltegen jağdaýda, bet aýrıqtı dep sanaladı.<br />Basqa esim ayasınan nusqaýtın siltemeler mında <i>tizimdelmeýdi</i>.',
+
+'doubleredirects' => 'Şınjırlı aýdatwlar',
+'doubleredirectstext' => 'Ärbir joldağı birinşi men ekinşi aýdatw siltemeleri bar, sonımen birge ekinşi aýdatw mätinniñ birinşi jolı bar. Ädette birinşi silteme aýdaýtın «şın» aqırğı bettiñ atawı bolwı qajet.',
+
+'brokenredirects' => 'Eş betke keltirmeýtin aýdatwlar',
+'brokenredirectstext' => 'Kelesi aýdatwlar joq betterge silteýdi:',
+
+# Miscellaneous special pages
+'nbytes' => '$1 Baýt',
+'ncategories' => '$1 sanat',
+'nlinks' => '$1 silteme',
+'nmembers' => '$1 bwın',
+'nrevisions' => '$1 nusqa',
+'nviews' => '$1 ret qaralÄŸan',
+'lonelypages' => 'EÅŸ bet siltemegen better',
+'lonelypagestext' => 'Kelesi betterge osı jobadağı basqa better siltemeýdi.',
+'uncategorizedpages' => 'EÅŸ sanatqa kirmegen better',
+'uncategorizedcategories' => 'EÅŸ sanatqa kirmegen sanattar',
+'uncategorizedimages' => 'EÅŸ sanatqa kirmegen swretter',
+'unusedcategories' => 'Paýdalanılmağan sanattar',
+'unusedimages' => 'Paýdalanılmağan faýldar',
+'popularpages' => 'Äýgili better',
+'wantedcategories' => 'BastalmaÄŸan sanattar',
+'wantedpages' => 'BastalmaÄŸan better',
+'mostlinked' => 'Eñ köp siltengen better',
+'mostlinkedcategories' => 'Eñ köp siltengen sanattar',
+'mostcategories' => 'Eñ köp sanattarğa kirgen better',
+'mostimages' => 'Eñ köp siltengen swretter',
+'mostrevisions' => 'Eñ köp tüzetilgen better',
+'allpages' => 'Barlıq bet tizimi',
+'prefixindex' => 'Bet bastaw tizimi',
+'randompage' => 'Kezdeýsoq bet',
+'shortpages' => 'Eñ qısqa better',
+'longpages' => 'Eñ ülken better',
+'deadendpages' => 'Eş betke siltemeýtin better',
+'deadendpagestext' => 'Kelesi better osı jobadağı basqa betterge siltemeýdi.',
+'listusers' => 'Barlıq qatıswşı tizimi',
+'specialpages' => 'Arnaýı better',
+'spheading' => 'Barşanıñ arnaýı betteri',
+'restrictedpheading' => 'Şektewli arnaýı better',
+'recentchangeslinked' => 'Qatıstı tüzetwler',
+'rclsub' => '(«$1» betinen siltengen betterge)',
+'newpages' => 'Eñ jaña better',
+'newpages-username' => 'Qatıswşı atı:',
+'ancientpages' => 'Eñ eski better',
+'intl' => 'Tilaralıq siltemeler',
+'move' => 'Jıljıtw',
+'movethispage' => 'Betti jıljıtw',
+'unusedimagestext' => '<p>Eskertw: Basqa veb toraptar faýldıñ
+URL jaýına tikeleý siltewi mümkin. Sondıqtan, belsendi paýdalanwına añğarmaý,
+osı tizimde qalwı mümkin.</p>',
+'unusedcategoriestext' => 'Kelesi sanat better bar bolıp tur, biraq oğan eşqandaý bet, ne sanat kirmeýdi.',
+'booksources' => 'Kitap qaýnarları',
+'categoriespagetext' => 'Osında wïkïdegi barlıq sanattarınıñ tizimi berilip tur.',
+'data' => 'Derekter',
+'userrights' => 'Qatıswşılar quqıqtarın meñgerw',
+'groups' => 'Qatıswşı toptarı',
+'booksourcetext' => 'Tömende jaña jäne qoldanğan kitaptar satatın
+toraptarınıñ siltemeleri tizimdelgen. Bul toraptarda izdelgen kitaptar
+twralı bılaýğı aqparat bolwğa mümkin.',
+'isbn' => 'ISBN belgisi',
+'alphaindexline' => '$1 — $2',
+'version' => 'Jüýe nusqası',
+'log' => 'Jwrnaldar',
+'alllogstext' => 'Birikken qotarw, joyw, qorğaw, buğattaw jäne äkimşilik jwrnaldarın körsetw.
+Jwrnal türin, qatıswşı atın, tïisti betin talğap, tarıltıp qarawıñızğa boladı.',
+'logempty' => 'Jwrnalda säýkes danalar joq.',
+
+# Special:Allpages
+'nextpage' => 'Kelesi betke ($1)',
+'allpagesfrom' => 'Mına betten bastap körsetw:',
+'allarticles' => 'Barlıq bet tizimi',
+'allinnamespace' => 'Barlıq bet ($1 esim ayası)',
+'allnotinnamespace' => 'Barlıq bet ($1 esim ayasınan tıs)',
+'allpagesprev' => 'Aldıñğığa',
+'allpagesnext' => 'Kelesige',
+'allpagessubmit' => 'Ötw',
+'allpagesprefix' => 'Mınadan bastalğan betterdi körsetw:',
+'allpagesbadtitle' => 'Alınğan bet atawı jaramsız bolğan, nemese til-aralıq ne wïkï-aralıq bastawı bar boldı. Atawda qoldanwğa bolmaýtın nışandar bolwı mümkin.',
+
+# Special:Listusers
+'listusersfrom' => 'Mına qatıswşıdan bastap körsetw:',
+
+# E-mail user
+'mailnologin' => 'E-poşta jaýı jiberilgen joq',
+'mailnologintext' => 'Basqa qatıswşığa xat jiberw üşin
+[[{{ns:special}}:Userlogin|kirwiñiz]] qajet, jäne [[{{ns:special}}:Preferences|baptawıñızda]]
+kwälandırılğan e-poşta jaýı bolwı jön.',
+'emailuser' => 'Qatıswşığa xat jazw',
+'emailpage' => 'Qatıswşığa xat jiberw',
+'emailpagetext' => 'Eger bul qatıswşı baptawlarında kwälandırğan e-poşta
+jaýın engizse, tömendegi ülgit arqılı buğan jalğız e-poşta xatın jiberwge boladı.
+Qatıswşı baptawıñızda engizgen e-poşta jaýıñız
+«Kimnen» degen bas jolağında körinedi, sondıqtan
+xat alwşısı twra jawap bere aladı.',
+'usermailererror' => 'Mail nısanı qate qaýtardı:',
+'defemailsubject' => '{{SITENAME}} e-poştasınıñ xatı',
+'noemailtitle' => 'Bul e-poşta jaýı emes',
+'noemailtext' => 'Osı qatıswşı jaramdı E-poşta jaýın engizbegen,
+nemese basqalardan xat qabıldawın öşirgen.',
+'emailfrom' => 'Kimnen',
+'emailto' => 'Kimge',
+'emailsubject' => 'Taqırıbı',
+'emailmessage' => 'Xat',
+'emailsend' => 'Jiberw',
+'emailccme' => 'Xatımdıñ köşirmesin mağan da jiber.',
+'emailccsubject' => '$1 degenge jiberilgen xatıñızdıñ köşirmesi: $2',
+'emailsent' => 'Xat jiberildi',
+'emailsenttext' => 'E-poşta xatıñız jiberildi.',
+
+# Watchlist
+'watchlist' => 'Baqılawım',
+'watchlistfor' => "('''$1''' baqılawları)",
+'nowatchlist' => 'Baqılaw tizimiñizde eşbir dana joq',
+'watchlistanontext' => 'Baqılaw tizimiñizdegi danalardı qaraw, ne öñdew üşin $1 qajet.',
+'watchlistcount' => "'''Baqılaw tizimiñizde (talqılaw betterdi qosa) $1 dana bar.'''",
+'clearwatchlist' => 'Baqılaw tizimin tazalaw',
+'watchlistcleartext' => 'Solardı tolıq alastatwğa batılsız ba?',
+'watchlistclearbutton' => 'Baqılaw tizimin tazalaw',
+'watchlistcleardone' => 'Baqılaw tizimiñiz tazartıldı. $1 dana alastatıldı.',
+'watchnologin' => 'Kirmegensiz',
+'watchnologintext' => 'Baqılaw tizimiñizdi özgertw üşin [[{{ns:special}}:Userlogin|kirwiñiz]] jön.',
+'addedwatch' => 'Baqılaw tizimine qosıldı',
+'addedwatchtext' => "«[[:$1]]» beti [[{{ns:special}}:Watchlist|baqılaw tizimiñizge]] qosıldı.
+Osı bettiñ jäne sonıñ talqılaw betiniñ keleşektegi özgeristeri mında tizimdeledi.
+Sonda bettiñ atawı tabwğa jeñildetip [[{{ns:special}}:Recentchanges|jwıqtağı özgerister tiziminde]]
+'''jwan ärpimen''' körsetiledi.
+
+Osı betti soñınan baqılaw tizimnen alastatıñız kelse «Baqılamaw» parağın nuqıñız.",
+'removedwatch' => 'Baqılaw tizimiñizden alastatıldı',
+'removedwatchtext' => '«[[:$1]]» beti baqılaw tizimiñizden alastatıldı.',
+'watch' => 'Baqılaw',
+'watchthispage' => 'Betti baqılaw',
+'unwatch' => 'Baqılamaw',
+'unwatchthispage' => 'Baqılawdı toqtatw',
+'notanarticle' => 'MaÄŸlumat beti emes',
+'watchnochange' => 'Körsetilgen merzimde eşbir baqılanğan dana öñdelgen joq.',
+'watchdetails' => "* Baqılaw tiziminde (talqılaw betterisiz) '''$1''' bet bar.
+* [[{{ns:special}}:Watchlist/edit|Bükil tizimdi qaraw jäne özgertw]].
+* [[{{ns:special}}:Watchlist/clear|Tizimdegi barlıq dana alastatw]].",
+'wlheader-enotif' => '* Eskertw xat jiberwi endirilgen.',
+'wlheader-showupdated' => "* Soñğı kirgenimnen beri tüzetilgen betterdi '''jwan''' mätinmen körset",
+'watchmethod-recent' => 'baqılawlı betterdiñ jwıqtağı özgeristerin tekserw',
+'watchmethod-list' => 'jwıqtağı özgeristerde baqılawlı betterdi tekserw',
+'removechecked' => 'Belgilengendi baqılaw tiziminen alastatw',
+'watchlistcontains' => 'Baqılaw tizimiñizde $1 bet bar.',
+'watcheditlist' => "Osında älippem surıptalğan baqılanğan mağlumat betteriñiz tizimdelingen.
+Betterdi alastatw üşin onıñ qasındağı qabaşaqtardı belgilep, tömendegi ''Belgilengendi alastat'' tüýmesin nuqıñız
+(mağlumat betin joýğanda talqılaw beti de birge joýıladı).",
+'removingchecked' => 'Suranğan danalardı baqılaw tizimnen alastawı…',
+'couldntremove' => '«$1» degen dana alastatılmadı…',
+'iteminvalidname' => '«$1» danasınıñ jaramsız atawınan şataq twdı…',
+'wlnote' => 'Tömende soñğı <b>$2</b> sağattağı, soñğı $1 özgeris körsetilgen.',
+'wlshowlast' => 'Soñğı $1 sağattağı, $2 kündegi, $3 bolğan özgeristi körsetw',
+'wlsaved' => 'Bul baqılw tizimiñizdiñ saqtalğan nusqası.',
+'wlhideshowown' => 'Tüzetwimdi $1',
+'wlhideshowbots' => 'Bottardı $1',
+'wldone' => 'Ä°s bitti.',
+
+'enotif_mailer' => '{{SITENAME}} eskertw xat jiberw qızmeti',
+'enotif_reset' => 'Barlıq bet karaldi dep belgile',
+'enotif_newpagetext' => 'Mınaw jaña bet.',
+'changed' => 'özgertti',
+'created' => 'jasadı',
+'enotif_subject' => '{{SITENAME}} jobasında $PAGEEDITOR $PAGETITLE atawlı betti $CHANGEDORCREATED',
+'enotif_lastvisited' => 'Soñğı kirwiñizden beri bolğan özgerister üşin $1 degendi qarañız.',
+'enotif_body' => 'Qurmetti $WATCHINGUSERNAME,
+
+{{SITENAME}} jobasıda $PAGEEDITDATE kezinde $PAGEEDITOR $PAGETITLE atawlı betti $CHANGEDORCREATED, ağımdıq nusqasın $PAGETITLE_URL jaýınan qarañız.
+
+$NEWPAGE
+
+Öñdewşi sïpattaması: $PAGESUMMARY $PAGEMINOREDIT
+
+Öñdewşimen qatınasw:
+e-poÅŸta: $PAGEEDITOR_EMAIL
+wïkï: $PAGEEDITOR_WIKI
+
+Bılaýğı özgerister bolğanda da siz osı betke barğanşa deýin eşqandaý basqa eskertw xattar jiberilmeýdi. Sonımen qatar baqılaw tizimiñizdegi bet eskertpelik belgisin ädepke küýine keltiriñiz.
+
+ Sizdiñ dostı {{SITENAME}} eskertw qızmeti
+
+----
+Baqılaw tizimiñizdi baptaw üşin, mında barıñız
+{{fullurl:{{ns:special}}:Watchlist/edit}}
+
+Sın-pikir berw jäne bılaýğı järdem alw üşin:
+{{fullurl:{{ns:help}}:Mazmunı}}',
+
+# Delete/protect/revert
+'deletepage' => 'Betti joyw',
+'confirm' => 'Rastaw',
+'excontent' => 'bolğan mağlumatı: «$1»',
+'excontentauthor' => 'bolğan mağlumatı: «$1» (tek «[[Special:Contributions/$2|$2]]» ülesi)',
+'exbeforeblank' => 'tazartw aldındağı bolğan mağlumatı: «$1»',
+'exblank' => 'bet bostı boldı',
+'confirmdelete' => 'Joywdı rastaw',
+'deletesub' => '(«$1» joywı)',
+'historywarning' => 'Nazar salıñız: Joywğa arnalğan bette öz tarïxı bar:',
+'confirmdeletetext' => 'Betti nemese swretti barlıq tarïxımen
+birge derekqordan ärdaýım joýığıñız keletin sïyaqtı.
+Bunı joywdıñ zardabın tüsinip şın nïettengeniñizdi, jäne
+[[{{ns:project}}:Sayasat]]qa laýıqtı dep
+sengeniñizdi rastañız.',
+'actioncomplete' => 'Äreket bitti',
+'deletedtext' => '«$1» joýıldı.
+Jwıqtağı joywlar twralı jazbaların $2 degennen qarañız.',
+'deletedarticle' => '«[[$1]]» betin joýdı',
+'dellogpage' => 'Joyw_jwrnalı',
+'dellogpagetext' => 'Tömende jwıqtağı joywlardıñ tizimi berilgen.',
+'deletionlog' => 'joyw jwrnalı',
+'reverted' => 'Erterek nusqasına qaýtarılğan',
+'deletecomment' => 'Joywdıñ sebebi',
+'imagereverted' => 'Erterek nusqasına qaýtarw sätti ötti.',
+'rollback' => 'Tüzetwlerdi qaýtarw',
+'rollback_short' => 'Qaýtarw',
+'rollbacklink' => 'qaýtarw',
+'rollbackfailed' => 'Qaýtarw sätsiz ayaqtaldı',
+'cantrollback' => 'Tüzetw qaýtarılmaýdı. Bul bettiñ soñğı üleskeri tek bastawış awtorı.',
+'alreadyrolled' => '[[{{ns:user}}:$2|$2]] ([[{{ns:user_talk}}:$2|talqılawı]]) degendi jasağan [[:$1]]
+betiniñ soñğı öñdewinen qaýtarw ötpedi; keýbirew osı qazir betti öñdep ne qaýtarıp jatır tüge.
+
+Soñğı öñdewdi [[{{ns:user}}:$3|$3]] ([[{{ns:user_talk}}:$3|talqılawı]]) degendi jasağan.',
+'editcomment' => 'Tüzetwdiñ bolğan mändemesi: "<i>$1</i>".', # only shown if there is an edit comment
+'revertpage' => '[[{{ns:special}}:Contributions/$2|$2]] ([[{{ns:user_talk}}:$2|talqılawı]]) tüzetwinen [[{{ns:user}}:$1|$1]] soñğı nusqasına qaýtardı',
+'sessionfailure' => 'Kirw sessïyasında şataq bolğan sïyaqtı;
+sessïyağa şabwıldawdardan qorğanw üşin, osı äreket toqtatıldı.
+«Artqa» tüýmesin basıñız, jäne betti keri jükteñiz, sosın qaýtalap köriñiz.',
+'protectlogpage' => 'Qorğaw_jwrnalı',
+'protectlogtext' => 'Tömende betterdiñ qorğaw/qorğamaw tizimi berilgen.',
+'protectedarticle' => '«$1» qorğaldı',
+'unprotectedarticle' => '«[[$1]]» qorğalmadı',
+'protectsub' => '(«$1» qorğawda)',
+'confirmprotecttext' => 'Osı betti rasında da qorğaw qajet pe?',
+'confirmprotect' => 'Qorğawdı rastaw',
+'protectmoveonly' => 'Tek jıljıtwdan qorğaw',
+'protectcomment' => 'QorÄŸaw sebebi',
+'unprotectsub' => '(«$1» qorğamawda)',
+'confirmunprotecttext' => 'Osı betti rastan qorğamaw qajet pe?',
+'confirmunprotect' => 'Qorğamawdı rastaw',
+'unprotectcomment' => 'QorÄŸamaw sebebi',
+'protect-unchain' => 'Jıljıtwğa ruqsat berw',
+'protect-text' => '<strong>$1</strong> betiniñ qorğaw deñgeýin qaraý jäne özgerte alasız.',
+'protect-viewtext' => 'Tirkelgiñiz bet qorğanısı dengeýlerin özgertwge ruqsat bermeýdi.
+Mına <strong>$1</strong> bettiñ ağımdıq baptawları:',
+'protect-default' => '(ädepki)',
+'protect-level-autoconfirmed' => 'Tirkelgisiz paýdalanwşılarğa tïım',
+'protect-level-sysop' => 'Tek äkimşilerge ruqsat',
+
+# Restrictions (nouns)
+'restriction-edit' => 'Öñdew',
+'restriction-move' => 'Jıljıtw',
+
+# Undelete
+'undelete' => 'Joýılğan betterdi qaraw',
+'undeletepage' => 'Joýılğan betterdi qaraw jäne qaýtarw',
+'viewdeletedpage' => 'Joýılğan betterdi qaraw',
+'undeletepagetext' => 'Kelesi better joýıldı dep belgilengen, biraq mağlumatı murağatta jatqan,
+sondıqtan keri qaýtarwğa äzir. Murağat merzim boýınşa tazalanıp turwı mümkin.',
+'undeleteextrahelp' => "Bükil betti qaýtarw üşin, barlıq qabaşaqtardı bos qaldırıp
+'''''Qaýtar!''''' tüýmesin nuqıñız. Bölekşe qaýtarw orındaw üşin, qaýtaraýın degen nusqalarına säýkes
+qabaşaqtarın belgileñiz de, jäne '''''Qaýtar!''''' tüýmesin nuqıñız. '''''Tasta''''' tüýmesin
+nuqığanda mändeme awmağı men barlıq qabaşaqtar tazalanadı.",
+'undeletearticle' => 'Joýılğan betti qaýtarw',
+'undeleterevisions' => '$1 nusqa muraÄŸattalÄŸan',
+'undeletehistory' => 'Eger bet mağlumatın qaýtarsañız,tarïxında barlıq nusqalar da
+qaýtarıladı. Eger joywdan soñ däl solaý atawımen jaña bet jasalsa, qaýtarılğan nusqalar
+tarïxtıñ eñ adında körsetiledi, jäne körsetilip turğan bettiñ ağımdıq nusqası
+özdik türde almastırılmaýdı.',
+'undeletehistorynoadmin' => 'Bul bet joýılğan. Joyw sebebi aldındağı öñdegen qatıswşılar
+egjeý-tegjeýlerimen birge tömendegi sïpattamasında körsetilgen.
+Osı joýılğan nusqalardıñ mätini tek äkimşilerge qatınawlı.',
+'undeleterevision' => '$1 kezindegi joýılğan nusqasın',
+'undeleterevision-missing' => 'Jaramsız ne joğalğan nusqa. Siltemeñiz jaramsız bolwı mümkin, ne
+nusqa qaýtarılğan tüge nemese murağattan alastatılğan.',
+'undeletebtn' => 'Qaýtar!',
+'undeletereset' => 'Tasta',
+'undeletecomment' => 'Mändemesi:',
+'undeletedarticle' => '«[[$1]]» qaýtardı',
+'undeletedrevisions' => '$1 nusqası qaýtarılğan',
+'undeletedrevisions-files' => '$1 nusqa jäne $2 faýl qaýtarıldı',
+'undeletedfiles' => '$1 faýl qaýtarıldı',
+'cannotundelete' => 'Qaýtarw sätsiz bitti; tağı birew sizden burın sol betti qaýtarğan bolar.',
+'undeletedpage' => "<big>'''$1 qaýtarıldı'''</big>
+
+Jwıqtağı joyw men qaýtarw jöninde [[{{ns:special}}:Log/delete|joyw jwrnalın]] qarañız.",
+
+# Namespace form on various pages
+'namespace' => 'Esim ayası:',
+'invert' => 'Talğawdı kerilew',
+
+# Contributions
+'contributions' => 'Qatıswşı ülesi',
+'mycontris' => 'Ãœlesim',
+'contribsub' => '$1 ülesi',
+'nocontribs' => 'Osı izdew şartına säýkes özgerister tabılğan joq.',
+'ucnote' => 'Tömende osı qatıswşınıñ soñğı <b>$2</b> kündegi, soñğı <b>$1</b> özgerisi körsetledi.',
+'uclinks' => 'Soñğı $2 kündegi, soñğı $1 özgerisin qaraw.',
+'uctop' => ' (üsti)',
+'newbies' => 'jaña qatıswşılar',
+
+'sp-newimages-showfrom' => '$1 kezinen beri — jaña swretterdi körset',
+
+'sp-contributions-newest' => 'Eñ jañasına',
+'sp-contributions-oldest' => 'Eñ eskisine',
+'sp-contributions-newer' => 'Jañalaw $1',
+'sp-contributions-older' => 'Eskilew $1',
+'sp-contributions-newbies-sub' => 'Jaña qatıswşılarğa',
+
+# What links here
+'whatlinkshere' => 'Siltegen better',
+'notargettitle' => 'Aqırğı ataw joq',
+'notargettext' => 'Osı äreket orındalatın nısana bet,
+ne qatıswşı körsetilmegen.',
+'linklistsub' => '(Siltemeler tizimi)',
+'linkshere' => "'''[[:$1]]''' degenge mına better silteýdi:",
+'nolinkshere' => "'''[[:$1]]''' degenge eş bet siltemeýdi.",
+'isredirect' => 'aýdatw beti',
+'istemplate' => 'kiriktirw',
+
+# Block/unblock
+'blockip' => 'Paýdalanwşını buğattaw',
+'blockiptext' => 'Tömendegi ülgit paýdalanwşınıñ jazw ruqsatın
+belgili IP jaýımen ne atawımen buğattaw üşin qoldanıladı.
+Bunı tek buzaqılıqqa kedergi istew üşin jäne de
+[[{{ns:project}}:Sayasat|sayasat]] boýınşa atqarwıñız jön.
+Tömende tïisti sebebin toltırıp körsetiñiz (mısalı, däýekke buzaqılıqpen
+özgertken betterdi keltirip).',
+'ipaddress' => 'IP jaý',
+'ipadressorusername' => 'IP jaý ne qatıswşı atı',
+'ipbexpiry' => 'Bitetin merzimi',
+'ipbreason' => 'Sebebi',
+'ipbanononly' => 'Tek tirkelgisizdi buÄŸattaw',
+'ipbcreateaccount' => 'Tirkelgi jasawın kedergilew',
+'ipbenableautoblock' => 'Bul qatıswşınıñ qoldanğan soñğı IP jaýın, jäne ärqaýsı keýin tüzetw istewge ümiteligen jaýların özdik türde buğattaw',
+'ipbsubmit' => 'Paýdalanwşını buğattaw',
+'ipbother' => 'Basqa merzim',
+'ipboptions' => '2 sağat:2 hours,1 kün:1 day,3 kün:3 days,1 apta:1 week,2 apta:2 weeks,1 aý:1 month,3 aý:3 months,6 aý:6 months,1 jıl:1 year,mängi:infinite',
+'ipbotheroption' => 'basqa',
+'badipaddress' => 'Jaramsız IP jaý',
+'blockipsuccesssub' => 'Buğattaw sätti ötti',
+'blockipsuccesstext' => '[[{{ns:special}}:Contributions/$1|$1]] degen buÄŸattalÄŸan.
+<br />Buğattawlardı [[{{ns:special}}:Ipblocklist|IP buğattaw tiziminde]] qarap şığıñız.',
+'unblockip' => 'Paýdalanwşını buğattamaw',
+'unblockiptext' => 'Tömendegi ülgit belgili IP jaýımen ne atawımen
+burın buğattalğan paýdalanwşınıñ jazw ruqsatın qaýtarw üşin qoldanıladı.',
+'ipusubmit' => 'Osı jaýdı buğattamaw',
+'unblocked' => '[[{{ns:user}}:$1|$1]] buğattawı öşirildi',
+'ipblocklist' => 'Buğattalğan paýdalanwşı / IP- jaý tizimi',
+'blocklistline' => '$1, $2 «$3» degendi buğattadı ($4)',
+'infiniteblock' => 'mängi',
+'expiringblock' => 'bitwi: $1',
+'anononlyblock' => 'tek tirkelgisizdi',
+'noautoblockblock' => 'özdik buğattaw öşirilengen',
+'createaccountblock' => 'tirkelgi jasawı buğattalğan',
+'ipblocklistempty' => 'BuÄŸattaw tizimi bos.',
+'blocklink' => 'buÄŸattaw',
+'unblocklink' => 'buÄŸattamaw',
+'contribslink' => 'ülesi',
+'autoblocker' => "IP jaýıñızdı jwıqta «[[{{ns:user}}:1|$1]]» paýdalanğan, sondıqtan özdik türde buğattalğan. $1 buğattaw sebebi: «'''$2'''».",
+'blocklogpage' => 'Buğattaw_jwrnalı',
+'blocklogentry' => '«[[$1]]» buğattadı, bitetin merzimi: $2',
+'blocklogtext' => 'Bul paýdalanwşılardı buğattaw/buğattamaw äreketteriniñ jwrnalı. Özdik türde
+buğattalğan IP jaýlar osında tizimdelgemegen. Ağımdağı belsendi buğattawların
+[[{{ns:special}}:Ipblocklist|IP buğattaw tiziminen]] qarawğa boladı.',
+'unblocklogentry' => '«$1» buğattawın öşirdi',
+'range_block_disabled' => 'Awqım buğattawın jasaw äkimşilik mümkindigi öşirilgen.',
+'ipb_expiry_invalid' => 'Bitetin waqıtı jaramsız.',
+'ipb_already_blocked' => '«$1» buğattalğan tüge',
+'ip_range_invalid' => 'IP jaý awqımı jaramsız.',
+'proxyblocker' => 'Proksï serverlerdi buğattawış',
+'ipb_cant_unblock' => 'Qate: IP $1 buğattawı tabılmadı. Onıñ buğattawı öşirlgen sïyaqtı.',
+'proxyblockreason' => 'IP jaýıñız aşıq proksï serverge jatatındıqtan buÄŸattalÄŸan. Ãnternet qızmetin jabdıqtawşıñızben, ne texnïkalıq medew qızmetimen qatınasıñız, jäne olarÄŸa osı ote kürdeli qawıpsizdik ÅŸataq twralı aqparat beriñiz.',
+'proxyblocksuccess' => 'Bitti.',
+'sorbs' => 'DNSBL qara tizimi',
+'sorbsreason' => 'Sizdiñ IP jaýıñız osı torapta qoldanılğan DNSBL qara tizimindegi aşıq proksï-server dep tabıladı.',
+'sorbs_create_account_reason' => 'Sizdiñ IP jaýıñız osı torapta qoldanılğan DNSBL qara tizimindegi aşıq proksï-server dep tabıladı. Tirkelgi jasaý almaýsız.',
+
+# Developer tools
+'lockdb' => 'Derekqordı qulıptaw',
+'unlockdb' => 'Derekqordı qulıptamaw',
+'lockdbtext' => 'Derekqordın qulıptalwı barlıq paýdalanwşınıñ
+bet öñdew, baptawın qalaw, baqılaw tizimin, tağı basqa
+derekqordı özgertetin mümkindikterin toqtata turadı.
+Osı maqsatıñızdı, jäne jöndewiñiz bitkende
+derekqordı aşatıñızdı rastañız.',
+'unlockdbtext' => 'Derekqodın aşılwı barlıq paýdalanwşınıñ bet öñdew,
+baptawın qalaw, baqılaw tizimin, tağı basqa derekqordı özgertetin
+mümkindikterin qaýta aşadı.
+Osı maqsatıñızdı rastañız.',
+'lockconfirm' => 'Ãä, men derekqordı rastan qulıptaýmın.',
+'unlockconfirm' => 'Ãä, men derekqordı rastan qulıptamaýmın.',
+'lockbtn' => 'Derekqordı qulıpta',
+'unlockbtn' => 'Derekqordı qulıptama',
+'locknoconfirm' => 'Rastaw belgisin qoýmapsız.',
+'lockdbsuccesssub' => 'Derekqordı qulıptaw sätti ötti',
+'unlockdbsuccesssub' => 'Qulıptalğan derekqor aşıldı',
+'lockdbsuccesstext' => 'Derekqor qulıptaldı.
+<br />Jöndewiñiz bitkennen keýin [[{{ns:special}}:Unlockdb|qulıptawın öşirwge]] umıtpañız.',
+'unlockdbsuccesstext' => 'Qulıptalğan derekqor sätti aşıldı.',
+'lockfilenotwritable' => 'Derekqor qulıptaw faýlı jazılmaýdı. Derekqordı qulıptaw ne aşw üşin, veb-server faýlğa jazw ruqsatı bolw qajet.',
+'databasenotlocked' => 'Derekqor qulıptalğan joq.',
+
+# Make sysop
+'makesysoptitle' => 'Qatıswşını äkimşi qılw',
+'makesysoptext' => 'Bul ülgitti qarapaýım qatıswşını äkimşi qılw üşin töreşiler qoldanadı.
+Jolaqqa qatıswşı atın engiziñiz de, jäne bul qatıswşını äkimşi qılw üşin, tüýmeni basıñız.',
+'makesysopname' => 'Qatıswşı atı:',
+'makesysopsubmit' => 'Bul qatıswşını äkimşi qıl',
+'makesysopok' => '<b>«$1» degen qatıswşı endi äkimşi bop tağaýındaldı</b>',
+'makesysopfail' => '<b>«$1» degen qatıswşı äkimşi bop tağaýındalmadı. (Atın durıs engizdiñiz be?)</b>',
+'setbureaucratflag' => 'Qatıswşını töreşi qılw',
+'rightslog' => 'Qatıswşı_quqıqtarı_jwrnalı',
+'rightslogtext' => 'Bul paýdalanwşı quqıqtarın özgertw jwrnalı.',
+'rightslogentry' => ' $1 top müşelgin $2 degennen $3 degenge özgertti',
+'rights' => 'Quqıqtarı:',
+'set_user_rights' => 'Qatıswşı quqıqtarın tağaýındaw',
+'user_rights_set' => '<b>«$1» degen qatıswşınıñ quqıqtarı jañartıldı</b>',
+'set_rights_fail' => '<b>«$1» degen qatıswşınıñ quqıqtarı tağaýındalmadı. (Atın durıs engizdiñiz be?)</b>',
+'makesysop' => 'Qatıswşını äkimşi qılw',
+'already_sysop' => 'Bul qatıswşı äkimşi boptı tüge',
+'already_bureaucrat' => 'Bul qatıswşı toreşi boptı tüge',
+'rightsnone' => '(eşqandaý)',
+
+# Move page
+'movepage' => 'Betti jıljıtw',
+'movepagetext' => "Tömendegi ülgitti qoldanıp betterdi qaýta ataýdı,
+barlıq tarïxın jaña atawğa jıljıtadı.
+Burınğı bet atawı jaña atawğa aýdatatın bet boladı.
+Eski atawına silteýtin siltemeler özgertilmeýdi; jıljıtwdan soñ
+şınjırlı aýdatwlar bar-joğın tekseriñiz.
+Siltemeler burınğı joldawımen bılaýğı ötwin tekserwine
+siz mindetti bolasız.
+
+Eskeriñiz, eger jıljıtılatın atawda bet bolsa, sol eski betke aýdatw
+bolğanşa jäne tarïxı bolsa, bet '''jıljıtılmaýdı'''.
+Osınıñ mağınası: eger betti qatelik pen qaýta atalsa,
+burınğı atawına qaýta atawğa boladı,
+biraq bar bettiñ üstine jazwğa bolmaýdı.
+
+<b>NAZAR SALIÑIZ!</b>
+Bul däripti betke qatañ jäne kenet özgeris jasawğa mümkin;
+ärekettiñ aldınan osınıñ zardaptarın tüsingeniñizge batıl
+bolıñız.",
+'movepagetalktext' => "Kelesi sebepter '''bolğanşa''' deýin, talqılaw beti özdik türde birge jıljıtıladı:
+* Bos emes talqılaw beti jaña atawda bolğanda, nemese
+* Tömendegi qabışaqta belgini alastatqanda.
+
+Osı oraýda, qalawıñız bolsa, betti qoldan jıljıta ne qosa alasız.",
+'movearticle' => 'Betti jıljıtw',
+'movenologin' => 'Jüýege kirmegensiz',
+'movenologintext' => 'Betti jıljıtw üşin tirkelgen bolwıñız jäne
+ [[{{ns:special}}:Userlogin|kirwiñiz]] qajet.',
+'newtitle' => 'Jaña atawğa',
+'movepagebtn' => 'Betti jıljıt',
+'pagemovedsub' => 'Jıljıtw sätti ayaqtaldı',
+'pagemovedtext' => '«[[$1]]» beti «[[$2]]» betine jıljıtıldı.',
+'articleexists' => 'Bılaý atawlı bet bar boldı, ne tañdağan
+atawıñız jaramdı emes.
+Basqa ataw tandañız',
+'talkexists' => "'''Bettiñ özi sätti jıljıtıldı, biraq talqılaw beti birge jıljıtılmadı, onıñ sebebi jaña atawdıñ talqılaw beti bar tüge. Bunı qolmen qosıñız.'''",
+'movedto' => 'mınağan jıljıtıldı:',
+'movetalk' => 'Qatıstı talqılaw betimen birge jıljıtw',
+'talkpagemoved' => 'Qatıstı talqılaw beti de jıljıtıldı.',
+'talkpagenotmoved' => 'Qatıstı talqılaw beti <strong>jıljıtılmadı</strong>.',
+'1movedto2' => '«[[$1]]» betinde aýdatw qaldırıp «[[$2]]» betine jıljıttı',
+'1movedto2_redir' => '«[[$1]]» betin «[[$2]]» aýdatw betiniñ üstine jıljıttı',
+'movelogpage' => 'Jıljıtw jwrnalı',
+'movelogpagetext' => 'Tömende jıljıtılğan betterdiñ tizimi berilip tur.',
+'movereason' => 'Sebebi',
+'revertmove' => 'qaýtarw',
+'delete_and_move' => 'Joyw jäne jıljıtw',
+'delete_and_move_text' => '==Joyw qajet==
+
+Aqırğı «[[$1]]» bet atawı bar tüge.
+Jıljıtwğa jol berw üşin joyamız ba?',
+'delete_and_move_confirm' => 'Ãä, osı betti joý',
+'delete_and_move_reason' => 'Jıljıtwğa jol berw üşin joýılğan',
+'selfmove' => 'Qaýnar jäne aqırğı atawı birdeý; bet özine jıljıtılmaýdı.',
+'immobile_namespace' => 'Qaýnar nemese aqırğı atawı arnaýı türinde boldı; osındaý esim ayası jağına jäne jağınan better jıljıtılmaýdı.',
+
+# Export
+'export' => 'Betterdi sırtqa berw',
+'exporttext' => 'XML pişimine qaptalğan bölek bet ne better bwması
+mätiniñ jäne öñdew tarïxın sırtqa bere alasız. Osını, basqa wïkï-ge
+{{ns:special}}:Import page MediaWiki quralı arqılı, sırttan alwğa boladı.
+
+Betterdi sırtqa berw üşin, atawların tömendegi mätin awmağına engiziñiz,
+bir jolda bir ataw, jäne tandañız: ne ağımdıq nusqasın, barlıq eski nusqaları men
+jäne tarïxı joldarı men birge, ne däl ağımdıq nusqasın, soñğı öñdew twralı aqparatı men birge.
+
+Soñğı jağdaýda siltemeni de qoldanwğa boladı, mısalı {{int:mainpage}} beti üşin [[{{ns:Special}}:Export/{{int:mainpage}}]].',
+'exportcuronly' => 'Tolıq tarïxın emes, tek ağımdıq nusqasın kiristiriñiz',
+'exportnohistory' => "----
+'''Añğartpa:''' Önimdilik äseri sebepterinen, better tolıq tarïxın sırtqa berwi öşirilgen.",
+'export-submit' => 'Sırtqa ber',
+
+# Namespace 8 related
+'allmessages' => 'Jüýe xabarları',
+'allmessagesname' => 'Atawı',
+'allmessagesdefault' => 'Ädepki mätini',
+'allmessagescurrent' => 'Ağımdıq mätini',
+'allmessagestext' => 'Mında «MediaWiki:» esim ayasındağı barlıq qatınawlı jüýe xabar tizimi berilip tur.',
+'allmessagesnotsupportedUI' => 'Your current interface language <b>$1</b> is not supported by Special:Allmessages at this site.',
+'allmessagesnotsupportedDB' => "'''wgUseDatabaseMessages''' babı öşirilgen sebebinen '''{{ns:special}}:AllMessages''' sïpatı süemeldenbeýdi.",
+'allmessagesfilter' => 'Xabardı atawı boýınşa süzgilew:',
+'allmessagesmodified' => 'Tek özgertilgendi körset',
+
+# Thumbnails
+'thumbnail-more' => 'Ülkeýtw',
+'missingimage' => '<b>JoÄŸalÄŸan swret </b><br /><i>$1</i>',
+'filemissing' => 'Joğalğan faýl',
+'thumbnail_error' => 'Nobaý qurw qatesi: $1',
+
+# Special:Import
+'import' => 'Betterdi sırttan alw',
+'importinterwiki' => 'Wïkï-tasımaldap sırttan alw',
+'import-interwiki-text' => 'Sırttan alatın wïkï jobasın jäne bet atawın tandañız.
+Nusqa kün-aýı jäne öñdewşi attarı saqtaladı.
+Barlıq wïkï-tasımaldap sırttan alw äreketter [[{{ns:special}}:Log/import|sırttan alw jwrnalına]] jazılıp alınadı.',
+'import-interwiki-history' => 'Osı bettiñ barlıq tarïxï nusqaların köşirw',
+'import-interwiki-submit' => 'Sırttan alw',
+'import-interwiki-namespace' => 'Mına esim ayasına betterdi tasımaldaw:',
+'importtext' => 'Qaýnar wïkïden «Special:Export» qwralın qoldanıp, faýldı sırtqa beriñiz, dïskiñizge saqtañız, sosın mında qotarıñız.',
+'importstart' => 'Betterdi sırttan alwı…',
+'import-revision-count' => '$1 nusqa',
+'importnopages' => 'Sırttan alınatın better joq.',
+'importfailed' => 'Sırttan alw sätsiz bitti: $1',
+'importunknownsource' => 'Cırttan alw qaýnar türi tanımalsız',
+'importcantopen' => 'Sırttan alw faýlı aşılmaýdı',
+'importbadinterwiki' => 'Jaramsız wïkï-aralıq silteme',
+'importnotext' => 'Bostı, ne mätini joq',
+'importsuccess' => 'Sırttan alw sätti ayaqtaldı!',
+'importhistoryconflict' => 'Tarïxınıñ eges nusqaları bar (bul betti aldında sırttan alınğan sïyaqtı)',
+'importnosources' => 'Eşqandaý wïkï-tasımaldap sırttan alw qaýnarı belgilenmegen, jäne tarïxın tikeleý qotarwı öşirilgen.',
+'importnofile' => 'Sırttan alınatın faýl qotarılğan joq.',
+'importuploaderror' => 'Sırttan alw faýldıñ qotarwı sätsiz bitti; osı faýl mölşeri ruqsat etilgen mölşerden aswı mümkin.',
+
+# Import log
+'importlogpage' => 'Sırttan alw jwrnalı',
+'importlogpagetext' => 'Basqa wïkïlerden öñdew tarïxımen birge betterdi äkimşilik retinde sırttan alw.',
+'import-logentry-upload' => 'faýl qotarwımen sırttan «[[$1]]» beti alındı',
+'import-logentry-upload-detail' => '$1 nusqa',
+'import-logentry-interwiki' => 'wïkï-tasımaldanğan $1',
+'import-logentry-interwiki-detail' => '$2 degennen $1 nusqa',
+
+# Keyboard access keys for power users
+'accesskey-search' => 'f',
+'accesskey-minoredit' => 'i',
+'accesskey-save' => 's',
+'accesskey-preview' => 'p',
+'accesskey-diff' => 'v',
+'accesskey-compareselectedversions' => 'v',
+'accesskey-watch' => 'w',
+
+# Tooltip help for some actions, most are in Monobook.js
+'tooltip-search' => '{{SITENAME}} jobasınan izdestirw [alt-f]',
+'tooltip-minoredit' => 'Osını şağın tüzetw dep belgilew [alt-i]',
+'tooltip-save' => 'Tüzetwiñizdi saqtaw [alt-s]',
+'tooltip-preview' => 'Saqtawdıñ aldınan tüzetwiñizdi qarap şığıñız! [alt-p]',
+'tooltip-diff' => 'Mätinge qandaý özgeristerdi jasağanıñızdı qaraw. [alt-v]',
+'tooltip-compareselectedversions' => 'Bettiñ eki nusqasınıñ aýırmasın qaraw. [alt-v]',
+'tooltip-watch' => 'Bul betti baqılaw tizimiñizge üstew [alt-w]',
+
+# Stylesheets
+'common.css' => '/** Mındağı CSS ämirleri barlıq bezendirw mänerinderde qoldanıladı */',
+'monobook.css' => '/* Mındağı CSS ämirleri «Dara kitap» bezendirw mänerin paýdalanwşılarğa äser etedi */',
+
+# Metadata
+'nodublincore' => 'Osı serverge «Dublin Core RDF» meta-derekteri öşirilgen.',
+'nocreativecommons' => 'Osı serverge «Creative Commons RDF» meta-derekteri öşirilgen.',
+'notacceptable' => 'Osı wïkï serveri sizdiñ «paýdalanwşı äreketkişi» oqï alatın pişimi bar derekterdi jibere almaýdı.',
+
+# Attribution
+'anonymous' => '{{SITENAME}} tirkelgisiz paýdalanwşı(lar)',
+'siteuser' => '{{SITENAME}} qatıswşı $1',
+'lastmodifiedatby' => 'Bul betti $3 qatıswşı soñğı özgertken kezi: $2, $1.', # $1 date, $2 time, $3 user
+'and' => 'jäne',
+'othercontribs' => 'Şığarma negizin $1 jazğan.',
+'others' => 'basqalar',
+'siteusers' => '{{SITENAME}} qatıswşı(lar) $1',
+'creditspage' => 'Betti jazÄŸandar',
+'nocredits' => 'Bul betti jazğandar twralı aqparat joq.',
+
+# Spam protection
+'spamprotectiontitle' => '«Spam»-nan qorğaýtın süzgi',
+'spamprotectiontext' => 'Bul bettiñ saqtawın «spam» süzgisi buğattadı. Bunıñ sebebi sırtqı torap siltemesinen bolwı mümkin.',
+'spamprotectionmatch' => 'Kelesi «spam» mätini süzgilengen: $1',
+'subcategorycount' => 'Bul sanatta {{PLURAL:$1|bir|$1}} tömengi sanat bar.',
+'categoryarticlecount' => 'Bul sanatta {{PLURAL:$1|bir|$1}} bet bar.',
+'category-media-count' => 'Bul sanatta {{PLURAL:$1|bir|$1}} faýl bar.',
+'listingcontinuesabbrev' => ' (jalÄŸ.)',
+'spambot_username' => 'MediaWiki spam cleanup',
+'spam_reverting' => '$1 degenge siltemesi joq soñğı nusqasına qaýtarıldı',
+'spam_blanking' => '$1 degenge siltemesi bar barlıq nusqalar tazartıldı',
+
+# Info page
+'infosubtitle' => 'Bet twralı aqparat',
+'numedits' => 'Tüzetw sanı (negizgi beti): $1',
+'numtalkedits' => 'Tüzetw sanı (talqılaw beti): $1',
+'numwatchers' => 'Baqılawşı sanı: $1',
+'numauthors' => 'Ärtürli awtorlar sanı (negizgi beti): $1',
+'numtalkauthors' => 'Ärtürli awtor sanı (talqılaw beti): $1',
+
+# Math options
+'mw_math_png' => 'Ärqaşan PNG türimen körset',
+'mw_math_simple' => 'Kädimgi bolsa HTML pişimimen, basqaşa PNG türimen',
+'mw_math_html' => 'Iqtïmal bolsa HTML pişimimen, basqaşa PNG türimen',
+'mw_math_source' => 'TeX pişiminde qaldırw (mätindik şolğıştarına)',
+'mw_math_modern' => 'Osı zamannıñ şolğıştarına usınılğan',
+'mw_math_mathml' => 'Iqtïmal bolsa MathML pşimimen (sınaq türinde)',
+
+# Patrolling
+'markaspatrolleddiff' => 'Küzette dep belgilew',
+'markaspatrolledtext' => 'Osı betti küzetwde dep belgilew',
+'markedaspatrolled' => 'Küzette dep belgilendi',
+'markedaspatrolledtext' => 'Talğanğan nusqa küzette dep belgilendi.',
+'rcpatroldisabled' => 'Jwıqtağı özgerister Küzeti öşirilgen',
+'rcpatroldisabledtext' => 'Jwıqtağı özgerister Küzeti qasïeti ağımda öşirilgen.',
+'markedaspatrollederror' => 'Küzette dep belgilenbeýdi',
+'markedaspatrollederrortext' => 'Küzette dep belgilew üşin nusqasın engiziñiz.',
+
+# Monobook.js: tooltips and access keys for monobook
+'monobook.js' => "/* tooltips and access keys */
+var ta = new Object();
+ta['pt-userpage'] = new Array('.','Jeke betim');
+ta['pt-anonuserpage'] = new Array('.','Osı IP jaýdıñ jeke beti');
+ta['pt-mytalk'] = new Array('n','Talqılaw betim');
+ta['pt-anontalk'] = new Array('n','Osı IP jaý tüzetwlerin talqılaw');
+ta['pt-preferences'] = new Array('','Baptawım');
+ta['pt-watchlist'] = new Array('l','Özgeristerin baqılap turğan better tizimim.');
+ta['pt-mycontris'] = new Array('y','Ülesterimdiñ tizimi');
+ta['pt-login'] = new Array('o','Kirwiñizdi usınamız, ol mindetti emes.');
+ta['pt-anonlogin'] = new Array('o','Kirwiñizdi usınamız, biraq, ol mindetti emes.');
+ta['pt-logout'] = new Array('','Şığw');
+ta['ca-talk'] = new Array('t','Mağlumat betti talqılaw');
+ta['ca-edit'] = new Array('e','Bul betti öñdeý alasız. Saqtawdıñ aldında «Qarap şığw» tüýmesin nuqıñız.');
+ta['ca-addsection'] = new Array('+','Bul talqılaw betinde jaña taraw bastaw.');
+ta['ca-viewsource'] = new Array('e','Bul bet qorğalğan, biraq, qaýnarın qarawğa boladı.');
+ta['ca-history'] = new Array('h','Bul bettin jwıqtağı nusqaları.');
+ta['ca-protect'] = new Array('=','Bul betti qorÄŸaw');
+ta['ca-unprotect'] = new Array('=','Bul betti qorÄŸamaw');
+ta['ca-delete'] = new Array('d','Bul betti joyw');
+ta['ca-undelete'] = new Array('d','Bul bettiñ joywdıñ aldındağı bolğan tüzetwlerin qaýtarw');
+ta['ca-move'] = new Array('m','Bul betti jıljıtw');
+ta['ca-nomove'] = new Array('m','Bul betti jıljıtwğa ruqsatıñız joq');
+ta['ca-watch'] = new Array('w','Bul betti baqılaw tizimiñizge üstew');
+ta['ca-unwatch'] = new Array('w','Bul betti baqılaw tizimiñizden alastatw');
+ta['ca-varlang-0'] = new Array('','Kïrïll jazwı');
+ta['ca-varlang-1'] = new Array('','Latın jazwı');
+ta['ca-varlang-2'] = new Array('','Arab jazwı');
+ta['search'] = new Array('f','Osı wïkïden izdew');
+ta['p-logo'] = new Array('','Bastı betke');
+ta['n-mainpage'] = new Array('z','Bastı betke barıp ketiñiz');
+ta['n-portal'] = new Array('','Joba twralı, ne istewiñizge bolatın, qaýdan tabwğa bolatın twralı');
+ta['n-currentevents'] = new Array('','Ağımdağı oqïğalarğa qatıstı aqparat');
+ta['n-recentchanges'] = new Array('r','Osı wïkïdegi jwıqtağı özgerister tizimi.');
+ta['n-randompage'] = new Array('x','Kezdeýsoq betti jüktew');
+ta['n-help'] = new Array('','Anıqtama tabw ornı.');
+ta['n-sitesupport'] = new Array('','Bizge järdem etiñiz');
+ta['t-whatlinkshere'] = new Array('j','Mında siltegen barlıq betterdiñ tizimi');
+ta['t-recentchangeslinked'] = new Array('k','Mınnan siltengen betterdiñ jwıqtağı özgeristeri');
+ta['feed-rss'] = new Array('','Bul bettiñ RSS arnası');
+ta['feed-atom'] = new Array('','Bul bettiñ Atom arnası');
+ta['t-contributions'] = new Array('','Osı qatıswşınıñ üles tizimin qaraw');
+ta['t-emailuser'] = new Array('','Osı qatıswşığa email jiberw');
+ta['t-upload'] = new Array('u','Swret ne medïa faýldarın qotarw');
+ta['t-specialpages'] = new Array('q','Barlıq arnaýı better tizimi');
+ta['t-print'] = new Array('','Osı bettiñ basıp şığarw nusqası');
+ta['t-permalink'] = new Array('','Bettiñ osı nusqasınıñ turaqtı siltemesi');
+ta['ca-nstab-main'] = new Array('c','MaÄŸlumat betin qaraw');
+ta['ca-nstab-user'] = new Array('c','Qatıswşı betin qaraw');
+ta['ca-nstab-media'] = new Array('c','Taspa betin qaraw');
+ta['ca-nstab-special'] = new Array('','Bul arnaýı bet, bettiñ özi öñdelinbeýdi.');
+ta['ca-nstab-project'] = new Array('a','Joba betin qaraw');
+ta['ca-nstab-image'] = new Array('c','Swret betin qaraw');
+ta['ca-nstab-mediawiki'] = new Array('c','Jüýe xabarın qaraw');
+ta['ca-nstab-template'] = new Array('c','Ãœlgini qaraw');
+ta['ca-nstab-help'] = new Array('c','Anıqtıma betin qaraw');
+ta['ca-nstab-category'] = new Array('c','Sanat betin qaraw');",
+
+# Common.js: contains nothing but a placeholder comment
+'common.js' => '/* Mındağı kez kelgen JavaScript ämirleri ärqaýsı bet jüktelgende barlıq paýdalanwşılarğa jükteledi. */
+
+// BEGIN workaround for RTL
+if (wgUserLanguage == "kk-cn"){
+ document.direction="rtl";
+ document.write(\'<style type="text/css">html {direction: rtl;}</style>\');
+ document.write(\'<link rel="stylesheet" type="text/css" href="\'+stylepath+\'/common/common_rtl.css">\');
+ document.write(\'<link rel="stylesheet" type="text/css" href="\'+stylepath+\'/\'+skin+\'/rtl.css">\');
+}
+// END workaround for RTL',
+
+# Image deletion
+'deletedrevision' => 'Mına eski nusqasın joýdı: $1.',
+
+# Browsing diffs
+'previousdiff' => '↠Aldıñğımen aýırması',
+'nextdiff' => 'Kelesimen aýırması →',
+
+'imagemaxsize' => 'Swret tüýindeme betindegi swrettiñ mölşerin şektewi:',
+'thumbsize' => 'Nobaý mölşeri:',
+'showbigimage' => 'Joğarı ajıratılımdı ($1×$2, $3 kB) nusqasın jüktew',
+
+'newimages' => 'Eñ jaña faýldar qoýması',
+'showhidebots' => '(bottardı $1)',
+'noimages' => 'Köretin eşteñe joq.',
+
+# Variants for Kazakh language
+'variantname-kk-tr' => 'Latın',
+'variantname-kk-kz' => 'Кирил',
+'variantname-kk-cn' => 'توتە',
+'variantname-kk' => 'disable',
+
+# Labels for User: and Title: on Special:Log pages
+'specialloguserlabel' => 'Qatıswşı:',
+'speciallogtitlelabel' => 'Ataw:',
+
+'passwordtooshort' => 'Qupïya söziñiz tım qısqa. Eñ keminde $1 ärip bolwı qajet.',
+
+# Media Warning
+'mediawarning' => "'''Nazar salıñız''': Bul faýl türinde qaskünemdi ämirdiñ bar bolwı ıqtïmal; faýldı jegip jüýeñizge zïyan keltirwiñiz mümkin.<hr />",
+
+'fileinfo' => '$1 kB, MIME türi: <code>$2</code>',
+
+# Metadata
+'metadata' => 'Meta-derekteri',
+'metadata-help' => 'Osı faýlda qosımşa aqparat bar. Bälkim, osı aqparat faýldı jasap şığarw, ne sandılaw üşin paýdalanğan sandıq kamera, ne mätinalğırdan alınğan. Eger osı faýl negizgi küýinen özgertilgen bolsa, keýbir ejeleleri özgertilgen fotoswretke laýıq bolmas.',
+'metadata-expand' => 'Egjeý-tegjeýin körset',
+'metadata-collapse' => 'Egjeý-tegjeýin jasır',
+'metadata-fields' => 'Osı xabarda tizimdelgen EXIF meta-derek awmaqtarı,
+swret beti körsetw kezinde meta-derek keste jasırılığanda kiristirledi.
+Basqası ädepkiden jasırıladı.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* focallength',
+
+# EXIF tags
+'exif-imagewidth' => 'Eni',
+'exif-imagelength' => 'Bïiktigi',
+'exif-bitspersample' => 'Quraş saýın bït sanı',
+'exif-compression' => 'Qısım sulbası',
+'exif-photometricinterpretation' => 'Pïksel qïıswı',
+'exif-orientation' => 'Megzewi',
+'exif-samplesperpixel' => 'Quraş sanı',
+'exif-planarconfiguration' => 'Derek rettewi',
+'exif-ycbcrsubsampling' => 'Y quraşınıñ C quraşına jarnaqtawı',
+'exif-ycbcrpositioning' => 'Y quraşı jäne C quraşı mekendewi',
+'exif-xresolution' => 'Dereleý ajıratılımdığı',
+'exif-yresolution' => 'Tireleý ajıratılımdığı',
+'exif-resolutionunit' => 'X jäne Y ajıratılımdıqtarığınıñ ölşemi',
+'exif-stripoffsets' => 'Swret dererekteriniñ jaýğaswı',
+'exif-rowsperstrip' => 'Beldik saýın jol sanı',
+'exif-stripbytecounts' => 'Qısımdalğan beldik saýın baýt sanı',
+'exif-jpeginterchangeformat' => 'JPEG SOI degennen ığıswı',
+'exif-jpeginterchangeformatlength' => 'JPEG derekteriniñ baýt sanı',
+'exif-transferfunction' => 'Tasımaldaw fwnkcïyası',
+'exif-whitepoint' => 'Aq nükte tüstiligi',
+'exif-primarychromaticities' => 'Alğı şeptegi tüstilikteri',
+'exif-ycbcrcoefficients' => 'Tüs ayasın tasımaldaw matrïcalıq eselikteri',
+'exif-referenceblackwhite' => 'Qara jäne aq anıqtawış qos kolemderi',
+'exif-datetime' => 'Faýldıñ özgertilgen kün-aýı',
+'exif-imagedescription' => 'Swret atawı',
+'exif-make' => 'Kamera öndirwşisi',
+'exif-model' => 'Kamera ülgisi',
+'exif-software' => 'Qoldanılğan bağdarlama',
+'exif-artist' => 'Jığarmaşısı',
+'exif-copyright' => 'Jığarmaşılıq quqıqtar ïesi',
+'exif-exifversion' => 'Exif nusqası',
+'exif-flashpixversion' => 'Süýemdelingen Flashpix nusqası',
+'exif-colorspace' => 'Tüs ayası',
+'exif-componentsconfiguration' => 'Ärqaýsı quraş mäni',
+'exif-compressedbitsperpixel' => 'Swret qısımdaw tärtibi',
+'exif-pixelydimension' => 'Swrettiñ jaramdı eni',
+'exif-pixelxdimension' => 'Swrettiñ jaramdı bïiktigi',
+'exif-makernote' => 'Öndirwşi eskertpeleri',
+'exif-usercomment' => 'Paýdalanwşı mändemeleri',
+'exif-relatedsoundfile' => 'Qatıstı dıbıs faýlı',
+'exif-datetimeoriginal' => 'JasalÄŸan kezi',
+'exif-datetimedigitized' => 'Sandıqtaw kezi',
+'exif-subsectime' => 'Jasalğan keziniñ sekwnd bölşekteri',
+'exif-subsectimeoriginal' => 'Tüpnusqa keziniñ sekwnd bölşekteri',
+'exif-subsectimedigitized' => 'Sandıqtaw keziniñ sekwnd bölşekteri',
+'exif-exposuretime' => 'Ustalım waqıtı',
+'exif-exposuretime-format' => '$1 s ($2)',
+'exif-fnumber' => 'Sañılaw mölşeri',
+'exif-fnumber-format' => 'f/$1',
+'exif-exposureprogram' => 'Ustalım bağdarlaması',
+'exif-spectralsensitivity' => 'Spektr boýınşa sezgiştigi',
+'exif-isospeedratings' => 'ISO jıldamdıq jarnaqtawı (jarıq sezgiştigi)',
+'exif-oecf' => 'Optoelektrondı türletw ıqpalı',
+'exif-shutterspeedvalue' => 'Japqış jıldamdılığı',
+'exif-aperturevalue' => 'Sañılawlıq',
+'exif-brightnessvalue' => 'Aşıqtıq',
+'exif-exposurebiasvalue' => 'Ustalım ötemi',
+'exif-maxaperturevalue' => 'Barınşa sañılaw aşwı',
+'exif-subjectdistance' => 'Nısana qaşıqtığı',
+'exif-meteringmode' => 'Ölşew tärtibi',
+'exif-lightsource' => 'Jarıq közi',
+'exif-flash' => 'Jarqıldağış',
+'exif-focallength' => 'Şoğırlaw alşaqtığı',
+'exif-focallength-format' => '$1 mm',
+'exif-subjectarea' => 'Nısana awqımı',
+'exif-flashenergy' => 'Jarqıldağış qarqını',
+'exif-spatialfrequencyresponse' => 'Keñistik-jïilik äserşiligi',
+'exif-focalplanexresolution' => 'X boýınşa şoğırlaw jaýpaqtıqtıñ ajıratılımdığı',
+'exif-focalplaneyresolution' => 'Y boýınşa şoğırlaw jaýpaqtıqtıñ ajıratılımdığı',
+'exif-focalplaneresolutionunit' => 'Şoğırlaw jaýpaqtıqtıñ ajıratılımdıq ölşemi',
+'exif-subjectlocation' => 'Nısana mekendewi',
+'exif-exposureindex' => 'Ustalım aýqındawı',
+'exif-sensingmethod' => 'Sensordiñ ölşew ädisi',
+'exif-filesource' => 'Faýl qaýnarı',
+'exif-scenetype' => 'Saxna türi',
+'exif-cfapattern' => 'CFA süzgi keýipi',
+'exif-customrendered' => 'Qosımşa swret öñdetwi',
+'exif-exposuremode' => 'Ustalım tärtibi',
+'exif-whitebalance' => 'Aq tüsiniñ tendestigi',
+'exif-digitalzoomratio' => 'Sandıq awqımdaw jarnaqtawı',
+'exif-focallengthin35mmfilm' => '35 mm taspasınıñ şoğırlaw alşaqtığı',
+'exif-scenecapturetype' => 'Tüsirgen saxna türi',
+'exif-gaincontrol' => 'Saxnanı meñgerw',
+'exif-contrast' => 'Qarama-qarsılıq',
+'exif-saturation' => 'Qanıqtıq',
+'exif-sharpness' => 'Aýqındıq',
+'exif-devicesettingdescription' => 'Jabdıq baptaw sïpattarı',
+'exif-subjectdistancerange' => 'Saxna qaşıqtığınıñ kölemi',
+'exif-imageuniqueid' => 'Swrettiñ biregeý nömiri (ID)',
+'exif-gpsversionid' => 'GPS belgişesiniñ nusqası',
+'exif-gpslatituderef' => 'Soltüstik nemese Oñtüstik boýlığı',
+'exif-gpslatitude' => 'Boýlığı',
+'exif-gpslongituderef' => 'Şığıs nemese Batıs endigi',
+'exif-gpslongitude' => 'Endigi',
+'exif-gpsaltituderef' => 'Bïiktik körsetwi',
+'exif-gpsaltitude' => 'Bïiktik',
+'exif-gpstimestamp' => 'GPS waqıtı (atom sağatı)',
+'exif-gpssatellites' => 'Ölşewge pýdalanılğan Jer serikteri',
+'exif-gpsstatus' => 'Qabıldağış küýi',
+'exif-gpsmeasuremode' => 'Ölşew tärtibi',
+'exif-gpsdop' => 'Ölşew däldigi',
+'exif-gpsspeedref' => 'Jıldamdılıq ölşemi',
+'exif-gpsspeed' => 'GPS qabıldağıştıñ jıldamdılığı',
+'exif-gpstrackref' => 'Qozğalıs bağıtın körsetwi',
+'exif-gpstrack' => 'Qozğalıs bağıtı',
+'exif-gpsimgdirectionref' => 'Swret bağıtın körsetwi',
+'exif-gpsimgdirection' => 'Swret bağıtı',
+'exif-gpsmapdatum' => 'Paýdalanılğan geodezïyalıq tüsirme derekteri',
+'exif-gpsdestlatituderef' => 'Nısana boýlığın körsetwi',
+'exif-gpsdestlatitude' => 'Nısana boýlığı',
+'exif-gpsdestlongituderef' => 'Nısana endigin körsetwi',
+'exif-gpsdestlongitude' => 'Nısana endigi',
+'exif-gpsdestbearingref' => 'Nısana azïmwtın körsetwi',
+'exif-gpsdestbearing' => 'Nısana azïmwtı',
+'exif-gpsdestdistanceref' => 'Nısana qaşıqtığın körsetwi',
+'exif-gpsdestdistance' => 'Nısana qaşıqtığı',
+'exif-gpsprocessingmethod' => 'GPS öñdetw ädisiniñ atawı',
+'exif-gpsareainformation' => 'GPS awmağınıñ atawı',
+'exif-gpsdatestamp' => 'GPS kün-aýı',
+'exif-gpsdifferential' => 'GPS saralanğan tüzetw',
+
+# EXIF attributes
+'exif-compression-1' => 'Ulğaýtılğan',
+'exif-compression-6' => 'JPEG',
+
+'exif-photometricinterpretation-2' => 'RGB',
+'exif-photometricinterpretation-6' => 'YCbCr',
+
+'exif-orientation-1' => 'Qalıptı', # 0th row: top; 0th column: left
+'exif-orientation-2' => 'Dereleý şağılısqan', # 0th row: top; 0th column: right
+'exif-orientation-3' => '180° burışqa aýnalğan', # 0th row: bottom; 0th column: right
+'exif-orientation-4' => 'Tireleý şağılısqan', # 0th row: bottom; 0th column: left
+'exif-orientation-5' => 'Sağat tilşesine qarsı 90° burışqa aýnalğan jäne tireleý şağılısqan', # 0th row: left; 0th column: top
+'exif-orientation-6' => 'Sağat tilşe boýınşa 90° burışqa aýnalğan', # 0th row: right; 0th column: top
+'exif-orientation-7' => 'Sağat tilşe boýınşa 90° burışqa aýnalğan jäne tireleý şağılısqan', # 0th row: right; 0th column: bottom
+'exif-orientation-8' => 'Sağat tilşesine qarsı 90° burışqa aýnalğan', # 0th row: left; 0th column: bottom
+
+'exif-planarconfiguration-1' => 'talpaq piÅŸim',
+'exif-planarconfiguration-2' => 'taýpaq pişim',
+
+'exif-xyresolution-i' => '$1 dpi',
+'exif-xyresolution-c' => '$1 dpc',
+
+'exif-colorspace-1' => 'sRGB',
+'exif-colorspace-ffff.h' => 'FFFF.H',
+
+'exif-componentsconfiguration-0' => 'bar bolmadı',
+'exif-componentsconfiguration-1' => 'Y',
+'exif-componentsconfiguration-2' => 'Cb',
+'exif-componentsconfiguration-3' => 'Cr',
+'exif-componentsconfiguration-4' => 'R',
+'exif-componentsconfiguration-5' => 'G',
+'exif-componentsconfiguration-6' => 'B',
+
+'exif-exposureprogram-0' => 'Anıqtalmağan',
+'exif-exposureprogram-1' => 'Qolmen',
+'exif-exposureprogram-2' => 'Bağdarlamalı ädis (qalıptı)',
+'exif-exposureprogram-3' => 'Sañılaw basıñqılığı',
+'exif-exposureprogram-4' => 'Isırma basıñqılığı',
+'exif-exposureprogram-5' => 'Öner bağdarlaması (anıqtıq terendigine sanasqan)',
+'exif-exposureprogram-6' => 'Qïmıl bağdarlaması (japqış şapşandılığına sanasqan)',
+'exif-exposureprogram-7' => 'Tireleý ädisi (artı şoğırlawsız tayaw tüsirmeler)',
+'exif-exposureprogram-8' => 'Dereleý ädisi (artı şoğırlanğan dereleý tüsirmeler)',
+
+'exif-subjectdistance-value' => '$1 m',
+
+'exif-meteringmode-0' => 'Belgisiz',
+'exif-meteringmode-1' => 'Birkelki',
+'exif-meteringmode-2' => 'Buldır daq',
+'exif-meteringmode-3' => 'BirDaqtı',
+'exif-meteringmode-4' => 'KöpDaqtı',
+'exif-meteringmode-5' => 'Örnekti',
+'exif-meteringmode-6' => 'Jırtındı',
+'exif-meteringmode-255' => 'Basqa',
+
+'exif-lightsource-0' => 'Belgisiz',
+'exif-lightsource-1' => 'Kün jarığı',
+'exif-lightsource-2' => 'Künjarıqtı şam',
+'exif-lightsource-3' => 'Qızdırğıştı şam',
+'exif-lightsource-4' => 'Jarqıldağış',
+'exif-lightsource-9' => 'Aşıq kün',
+'exif-lightsource-10' => 'Bulınğır kün',
+'exif-lightsource-11' => 'Kölenkeli',
+'exif-lightsource-12' => 'Künjarıqtı şam (D 5700–7100 K)',
+'exif-lightsource-13' => 'Künjarıqtı şam (N 4600–5400 K)',
+'exif-lightsource-14' => 'Künjarıqtı şam (W 3900–4500 K)',
+'exif-lightsource-15' => 'Künjarıqtı şam (WW 3200–3700 K)',
+'exif-lightsource-17' => 'Qalıptı jarıq qaýnarı A',
+'exif-lightsource-18' => 'Qalıptı jarıq qaýnarı B',
+'exif-lightsource-19' => 'Qalıptı jarıq qaýnarı C',
+'exif-lightsource-20' => 'D55',
+'exif-lightsource-21' => 'D65',
+'exif-lightsource-22' => 'D75',
+'exif-lightsource-23' => 'D50',
+'exif-lightsource-24' => 'Stwdïyalıq ISO künjarıqtı şam',
+'exif-lightsource-255' => 'Basqa jarıq qaýnarı',
+
+'exif-focalplaneresolutionunit-2' => 'dywým',
+
+'exif-sensingmethod-1' => 'Anıqtalmağan',
+'exif-sensingmethod-2' => '1-çïpti awmaqtı tüssezgiş',
+'exif-sensingmethod-3' => '2-çïpti awmaqtı tüssezgiş',
+'exif-sensingmethod-4' => '3-çïpti awmaqtı tüssezgiş',
+'exif-sensingmethod-5' => 'Kezekti awmaqtı tüssezgiş',
+'exif-sensingmethod-7' => '3-sızıqtı tüssezgiş',
+'exif-sensingmethod-8' => 'Kezekti sızıqtı tüssezgiş',
+
+'exif-filesource-3' => 'DSC',
+
+'exif-scenetype-1' => 'Tikeleý tüsirilgen fotoswret',
+
+'exif-customrendered-0' => 'Qalıptı öñdetw',
+'exif-customrendered-1' => 'Qosımşa öñdetw',
+
+'exif-exposuremode-0' => 'Özdik ustalımdaw',
+'exif-exposuremode-1' => 'Qolmen ustalımdaw',
+'exif-exposuremode-2' => 'Özdik jarqıldaw',
+
+'exif-whitebalance-0' => 'Aq tüsiniñ özdik tendestirw',
+'exif-whitebalance-1' => 'Aq tüsiniñ qolmen tendestirw',
+
+'exif-scenecapturetype-0' => 'Qalıptı',
+'exif-scenecapturetype-1' => 'Dereleý',
+'exif-scenecapturetype-2' => 'Tireleý',
+'exif-scenecapturetype-3' => 'Tüngi saxna',
+
+'exif-gaincontrol-0' => 'Joq',
+'exif-gaincontrol-1' => 'Tömen zorayw',
+'exif-gaincontrol-2' => 'Joğarı zorayw',
+'exif-gaincontrol-3' => 'Tömen bayawlaw',
+'exif-gaincontrol-4' => 'Joğarı bayawlaw',
+
+'exif-contrast-0' => 'Qalıptı',
+'exif-contrast-1' => 'Uyan',
+'exif-contrast-2' => 'Turpaýı',
+
+'exif-saturation-0' => 'Qalıptı',
+'exif-saturation-1' => 'Tömen qanıqtı',
+'exif-saturation-2' => 'Joğarı qanıqtı',
+
+'exif-sharpness-0' => 'Qalıptı',
+'exif-sharpness-1' => 'Uyan',
+'exif-sharpness-2' => 'Turpaýı',
+
+'exif-subjectdistancerange-0' => 'Belgisiz',
+'exif-subjectdistancerange-1' => 'Tayaw tüsirilgen',
+'exif-subjectdistancerange-2' => 'Jaqın tüsirilgen',
+'exif-subjectdistancerange-3' => 'Alıs tüsirilgen',
+
+# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'Soltüstik boýlığı',
+'exif-gpslatitude-s' => 'Oñtüstik boýlığı',
+
+# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'Şığıs endigi',
+'exif-gpslongitude-w' => 'Batıs endigi',
+
+'exif-gpsstatus-a' => 'Ölşew ulaswda',
+'exif-gpsstatus-v' => 'Ölşew özara ärekette',
+
+'exif-gpsmeasuremode-2' => '2-bağıttıq ölşem',
+'exif-gpsmeasuremode-3' => '3-bağıttıq ölşem',
+
+# Pseudotags used for GPSSpeedRef and GPSDestDistanceRef
+'exif-gpsspeed-k' => 'km/h',
+'exif-gpsspeed-m' => 'mil/h',
+'exif-gpsspeed-n' => 'J. tüýin',
+
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'Şın bağıt',
+'exif-gpsdirection-m' => 'Magnïttı bağıt',
+
+# External editor support
+'edit-externally' => 'Bul faýldı sırtqı qural/bağdarlama arqılı öñdew',
+'edit-externally-help' => 'Köbirek aqparat üşin [http://meta.wikimedia.org/wiki/Help:External_editors ornatw nusqawların] qarañız.',
+
+# 'all' in various places, this might be different for inflected languages
+'recentchangesall' => 'barlığın',
+'imagelistall' => 'barlığı',
+'watchlistall1' => 'barlığı',
+'watchlistall2' => 'barlıq',
+'namespacesall' => 'barlığı',
+
+# E-mail address confirmation
+'confirmemail' => 'E-poşta jaýın kwälandırw',
+'confirmemail_noemail' => '[[{{ns:special}}:Preferences|Qatıswşı baptawıñızda]] jaramdı e-poşta jaýın engizbepsiz.',
+'confirmemail_text' => 'Bul wïkïde e-poşta qasïetterin paýdalanwdıñ aldınan e-poşta jaýıñızdı
+kwälandırw qajet. Öziñizdiñ jaýıñızğa kwälandırw xatın jiberw üşin tömendegi tüýmeni nuqıñız.
+Xattıñ işinde arnaýı kodı bar silteme kiristirledi; e-poşta jaýıñızdıñ jaramdığın kwälandırw üşin
+siltemeni şolğıştıñ meken-jaý jolağına engizip aşıñız.',
+'confirmemail_send' => 'Kwälandırw kodın jiberw',
+'confirmemail_sent' => 'Kwälandırw E-poşta xatı jiberildi.',
+'confirmemail_sendfailed' => 'Kwälandırw xatı jiberilmedi. Engizilgen jaýdı jaramsız äriterine tekserip şığıñız.
+
+E-poşta qızmeti qaýtarğanı: $1',
+'confirmemail_invalid' => 'Kwälandırw kodı jaramsız. Kodtıñ merzimi bitken şığar.',
+'confirmemail_needlogin' => 'E-poşta jaýıñızdı kwälandırw üşin $1 qajet.',
+'confirmemail_success' => 'E-poşta jaýıñız kwälandırıldı. Endi Wïkïge kirip jumısqa kiriswge boladı',
+'confirmemail_loggedin' => 'E-poşta jaýıñız kwälandırıldı.',
+'confirmemail_error' => 'Kwälandırwıñızdı saqtağanda belgisiz qate boldı.',
+'confirmemail_subject' => '{{SITENAME}} torabınan e-poşta jaýıñızdı kwälandırw xatı',
+'confirmemail_body' => "Keýbirew, mına $1 IP jaýınan, öziñiz bolwı mümkin,
+{{SITENAME}} jobasındağı E-poşta jaýın qoldanıp «$2» tirkelgi jasaptı.
+
+Osı tirkelgi rastan sizdiki ekenin kwälandırw üşin, jäne {{SITENAME}} jobasınıñ
+e-poşta qasïetterin belsendirw üşin, mına siltemeni şolğışpen aşıñız:
+
+$3
+
+Bul sizdiki '''emes''' bolsa, siltemege ermeñiz. Kwälandırw kodınıñ
+merzimi $4 kezinde bitedi.",
+
+# Inputbox extension, may be useful in other contexts as well
+'tryexact' => 'Däl säýkesin sınap köriñiz',
+'searchfulltext' => 'Tolıq mätinimen izdew',
+'createarticle' => 'Betti bastaw',
+
+# Scary transclusion
+'scarytranscludedisabled' => '[Wïkï-ara kiregw öşirilgen]',
+'scarytranscludefailed' => '[$1 betine ülgi öñdetw sätsiz bitti; keşiriñiz]',
+'scarytranscludetoolong' => '[URL jaýı tım uzın; keşiriñiz]',
+
+# Trackbacks
+'trackbackbox' => '<div id="mw_trackbacks">
+Bul bettiñ añıstawları:<br />
+$1
+</div>',
+'trackbackremove' => '([$1 Joýıldı])',
+'trackbacklink' => 'Añıstaw',
+'trackbackdeleteok' => 'Añıstaw joywı sätti ötti.',
+
+# Delete conflict
+'deletedwhileediting' => 'Nazar salıñız:Siz bul bettiñ öñdewin bastağanda, osı bet joýıldı!',
+'confirmrecreate' => "Siz bul bettiñ öndewin bastağanda [[{{ns:user}}:$1|$1]] ([[{{ns:user_talk}}:$1|talqılawı]]) osı betti joýdı, körsetken sebebi:
+: ''$2''
+Osı betti şınınan qaýta jasawın rastañız.",
+'recreate' => 'Qaýta jasaw',
+'tooltip-recreate' => 'Bul betti joýılwına qaramaý qaýta jasaw',
+
+'unit-pixel' => ' px',
+
+# HTML dump
+'redirectingto' => '[[$1]] betine aýdatwda…',
+
+# action=purge
+'confirm_purge' => 'Qosalqı qaltadağı osı betin tazalaýmız ba?<br /><br />$1',
+'confirm_purge_button' => 'Jaraýdı',
+
+'youhavenewmessagesmulti' => '$1 degenge jaña xabarlar tüsti',
+
+'searchcontaining' => "Mına sözi bar bet arasınan izdew: ''$1''.",
+'searchnamed' => "Mına atawlı bet arasınan izdew: ''$1''.",
+'articletitles' => "Atawları mınadan bastalğan better: ''$1''",
+'hideresults' => 'Nätïjelerdi jasır',
+
+# DISPLAYTITLE
+'displaytitle' => '(Bul bettiñ siltemesi: [[$1]])',
+
+'loginlanguagelabel' => 'Til: $1',
+
+# Multipage image navigation
+'imgmultipageprev' => '&larr; aldıñğı betke',
+'imgmultipagenext' => 'kelesi betke &rarr;',
+'imgmultigo' => 'Ötw!',
+'imgmultigotopre' => 'Mına betke ötw',
+
+# Table pager
+'ascending_abbrev' => 'ösw',
+'descending_abbrev' => 'kemw',
+'table_pager_next' => 'Kelesi betke',
+'table_pager_prev' => 'Aldıñğı betke',
+'table_pager_first' => 'Alğaşqı betke',
+'table_pager_last' => 'Soñğı betke',
+'table_pager_limit' => 'Bet saýın $1 dana körset',
+'table_pager_limit_submit' => 'Ötw',
+'table_pager_empty' => 'Eş nätïje joq',
+
+# Auto-summaries
+'autosumm-blank' => 'Bettiñ barlıq mağlumatın alastattı',
+'autosumm-replace' => "Betti '$1' degenmen almastırdı",
+'autoredircomment' => '[[$1]] degenge aýdadı', # This should be changed to the new naming convention, but existed beforehand
+'autosumm-new' => 'Jaña bet: $1',
+);
+
+?>
diff --git a/languages/messages/MessagesKn.php b/languages/messages/MessagesKn.php
index ef3ca239..066da532 100644
--- a/languages/messages/MessagesKn.php
+++ b/languages/messages/MessagesKn.php
@@ -290,6 +290,7 @@ $2",
'otherlanguages' => "ಇತರ ಭಾಷೆಗಳà³",
+'pagecategories' => "ವರà³à²—ಗಳà³",
'pagemovedsub' => "ಸà³à²¥à²³à²¾à³¦à²¤à²°à²¿à²¸à³à²µà²¿à²•à³† ಯಶಸà³à²µà²¿à²¯à²¾à²¯à²¿à²¤à³",
'popularpages' => "ಜನಪà³à²°à²¿à²¯ ಪà³à²Ÿà²—ಳà³",
'portal' => "ಸಮà³à²¦à²¾à²¯ ಪà³à²Ÿ",
diff --git a/languages/messages/MessagesKo.php b/languages/messages/MessagesKo.php
index e432780f..76bddab6 100644
--- a/languages/messages/MessagesKo.php
+++ b/languages/messages/MessagesKo.php
@@ -126,6 +126,7 @@ $messages = array(
'nov' => '11',
'dec' => '12',
'categories' => '분류',
+'pagecategories' => '분류',
'category_header' => '"$1" ë¶„ë¥˜ì— ì†í•´ 있는 문서',
'subcategories' => '하위 분류',
'mainpage' => '대문',
@@ -459,7 +460,7 @@ $messages = array(
'loadhist' => '문서 역사 불러오는 중',
'currentrev' => '현재 버전',
'revisionasof' => '$1 버전',
-'old-revision-navigation'=> '$1 버전; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => '$1 버전; $2',
'previousrevision' => 'â†ì´ì „ 버전',
'nextrevision' => 'ë‹¤ìŒ ë²„ì „â†’',
'currentrevisionlink' => '현재 ë²„ì „ì˜ ë¬¸ì„œ 보기',
@@ -840,7 +841,7 @@ $messages = array(
'rollbacklink' => 'ë˜ëŒë¦¬ê¸°',
'rollbackfailed' => 'ë˜ëŒë¦¬ê¸° 실패',
'cantrollback' => 'íŽ¸ì§‘ì„ ë˜ëŒë¦´ 수 없습니다. 문서를 편집한 사용ìžê°€ 한명ë¿ìž…니다.',
-'alreadyrolled' => '[[$1]]ì—ì„œ [[User:$2|$2]]([[User talk:$2|토론]])ì˜ íŽ¸ì§‘ì„ ë˜ëŒë¦´ 수 없습니다. 누군가가 문서를 고치거나 ë˜ëŒë ¸ìŠµë‹ˆë‹¤.
+'alreadyrolled' => '[[:$1]]ì—ì„œ [[User:$2|$2]]([[User talk:$2|토론]])ì˜ íŽ¸ì§‘ì„ ë˜ëŒë¦´ 수 없습니다. 누군가가 문서를 고치거나 ë˜ëŒë ¸ìŠµë‹ˆë‹¤.
마지막으로 문서를 편집한 사람ì€[[User:$3|$3]]([[User talk:$3|토론]])입니다.',
'revertpage' => '[[Special:Contributions/$2|$2]]([[User talk:$2|토론]])ì˜ íŽ¸ì§‘ì„ [[Special:Contributions/$1|$1]]ì˜ ë²„ì „ìœ¼ë¡œ ë˜ëŒë¦¼',
@@ -1046,8 +1047,8 @@ $messages = array(
'tooltip-diff' => 'ì›ëž˜ì˜ 문서와 현재 편집하는 문서를 비êµí•˜ê¸° [alt-v]',
'tooltip-compareselectedversions'=> 'ì´ ë¬¸ì„œì—ì„œ ì„ íƒí•œ ë‘ ë²„ì „ê°„ì˜ ì°¨ì´ë¥¼ ë¹„êµ [alt-v]',
'tooltip-watch' => 'ì´ ë¬¸ì„œë¥¼ 주시문서 목ë¡ì— 추가 [alt-w]',
-'Common.css' => '/** ì´ CSS ì„¤ì •ì€ ëª¨ë“  ìŠ¤í‚¨ì— ì ìš©ë©ë‹ˆë‹¤ */',
-'Monobook.css' => '/* ì´ CSS ì„¤ì •ì€ ëª¨ë“  ëª¨ë…¸ë¶ ìŠ¤í‚¨ì— ì ìš©ë©ë‹ˆë‹¤ */',
+'common.css' => '/** ì´ CSS ì„¤ì •ì€ ëª¨ë“  ìŠ¤í‚¨ì— ì ìš©ë©ë‹ˆë‹¤ */',
+'monobook.css' => '/* ì´ CSS ì„¤ì •ì€ ëª¨ë“  ëª¨ë…¸ë¶ ìŠ¤í‚¨ì— ì ìš©ë©ë‹ˆë‹¤ */',
'nodublincore' => 'ë”블린 코어 RDF 메타ë°ì´í„° ê¸°ëŠ¥ì€ ë¹„í™œì„±ë˜ì–´ 있습니다.',
'nocreativecommons' => 'í¬ë¦¬ì—ì´í‹°ë¸Œ 커먼즈 RDF 메타ë°ì´í„° ê¸°ëŠ¥ì€ ë¹„í™œì„±ë˜ì–´ 있습니다.',
'anonymous' => '{{SITENAME}}ì˜ ìµëª… 사용ìž',
@@ -1081,7 +1082,7 @@ $messages = array(
'rcpatroldisabledtext' => '최근 바뀜 검토 ê¸°ëŠ¥ì€ í˜„ìž¬ 비활성화ë˜ì–´ 있습니다.',
'markedaspatrollederror'=> 'ê²€í† ëœ ê²ƒìœ¼ë¡œ 표시할 수 없습니다.',
'markedaspatrollederrortext'=> 'ê²€í† ëœ ê²ƒìœ¼ë¡œ 표시할 ë²„ì „ì„ ì§€ì •í•´ì•¼ 합니다.',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'ë‚´ ì‚¬ìš©ìž ë¬¸ì„œ\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'ë‹¹ì‹ ì´ ì‚¬ìš©í•˜ëŠ” IP를 위한 ì‚¬ìš©ìž ë¬¸ì„œ\');
@@ -1092,7 +1093,7 @@ $messages = array(
ta[\'pt-mycontris\'] = new Array(\'y\',\'내가 편집한 글\');
ta[\'pt-login\'] = new Array(\'o\',\'You are encouraged to log in, it is not mandatory however.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'ê¼­ 필요한 ê²ƒì€ ì•„ë‹ˆì§€ë§Œ, 로그ì¸ì„ 하면 편리한 ì ì´ 많습니다.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'로그아웃\');
+ ta[\'pt-logout\'] = new Array(\'\',\'로그아웃\');
ta[\'ca-talk\'] = new Array(\'t\',\'ë¬¸ì„œì˜ ë‚´ìš©ì— ëŒ€í•œ 토론 문서\');
ta[\'ca-edit\'] = new Array(\'e\',\'문서를 편집할 수 있습니다. 저장하기 ì „ì— ë¯¸ë¦¬ë³´ê¸°ë¥¼ í•´ 주세요.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'내용 추가하기\');
diff --git a/languages/messages/MessagesKsh.php b/languages/messages/MessagesKsh.php
index 030b6d77..885396a8 100644
--- a/languages/messages/MessagesKsh.php
+++ b/languages/messages/MessagesKsh.php
@@ -48,6 +48,8 @@ $namespaceAliases = array(
'Katejorije_Klaaf' => NS_CATEGORY_TALK,
);
+$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
+
/**
* Labels of the quickbar settings in Special:Preferences
*/
@@ -177,7 +179,8 @@ dren shtëijdt',
'oct' => 'Okt',
'nov' => 'Nov',
'dec' => 'Dez',
-'categories' => '{{PLURAL:$1| Saachjropp | Saachjroppe }}',
+'categories' => 'Saachjroppe',
+'pagecategories' => '{{PLURAL:$1|Saachjropp|Saachjroppe }}',
'category_header' => 'Attikkelle in_de Saachjropp „$1“',
'subcategories' => 'Ungerjroppe',
'mainpage' => 'Houpsigk',
@@ -866,7 +869,7 @@ fottjeschmeßße hätt?',
'loadhist' => 'Donn de Lėßß met ahle Väsohne laade',
'currentrev' => 'Nöüßte Väsjohn',
'revisionasof' => 'Väsjohn fum $1',
-'old-revision-navigation'=> 'Väsjohn fum $1; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'Väsjohn fum $1; $2',
'previousrevision' => '↠De Revisjohn dö_für zëije',
'nextrevision' => 'De Väsjohn do_noh zëije →',
'currentrevisionlink' => 'De nöüßte Väsjohn',
@@ -2026,7 +2029,7 @@ huh_laade darrəf.',
'accesskey-minoredit' => 'm',
'accesskey-save' => 's',
'accesskey-preview' => 'p',
-'accesskey-diff' => 'd',
+'accesskey-diff' => 'v',
'accesskey-compareselectedversions'=> 'v',
'accesskey-watch' => 'w',
'tooltip-search' => 'En de {{SITENAME}} sööke [alt-f]',
@@ -2035,11 +2038,11 @@ huh_laade darrəf.',
'tooltip-preview' => 'Lißß de Füür_Aansėsh fun dä Sigk un_fun_Dinge Ännderonge ih_dat_De_n Affsphëijshere
dëijß! [alt-p]',
-'tooltip-diff' => 'Zëijsh Ding Ännderone am Täxx aan. [alt-d]',
+'tooltip-diff' => 'Zëijsh Ding Ännderone am Täxx aan. [alt-v]',
'tooltip-compareselectedversions'=> 'Donn de Ungescheed zweshe dä bëijde ußjewäälte Väsjohne zëije. [alt-v]',
'tooltip-watch' => 'Op di Sigk hee oppaßße. [alt-w]',
-'Common.css' => '.allpagesredirect, .titleNamespace {font-style:italic}',
-'Monobook.css' => ' /* edit this file to customize the monobook skin for the entire site */
+'common.css' => '.allpagesredirect, .titleNamespace {font-style:italic}',
+'monobook.css' => ' /* edit this file to customize the monobook skin for the entire site */
/* distinguish redirections in Special:Allpages directory */
.allpagesredirect {font-style:italic}
@@ -2109,7 +2112,7 @@ mieh op de füürije un nähkßte Sigge jëvve)</small>',
'rcpatroldisabledtext' => 'Et Nohluere fun de läzde Ännderonge eß fö_do_Mommännt nit mööshlėsh.',
'markedaspatrollederror'=> 'Kann dat Kënnzëijshe „Nohjeluert“ nit affshpëijshere.',
'markedaspatrollederrortext'=> 'Do_moss_en beshtemmpte Väsjohn ußsööke.',
-'Monobook.js' => ' /* tooltips and access keys */
+'monobook.js' => ' /* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Ding ëijen Medmaacher_Sigk.\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'De Medmaacher_Sigk fun Dinge aktlowälle IP_Adräßß.\');
@@ -2120,7 +2123,7 @@ mieh op de füürije un nähkßte Sigge jëvve)</small>',
ta[\'pt-mycontris\'] = new Array(\'y\',\'De Leßß met Dinge eijene Bëijdräsh.\');
ta[\'pt-login\'] = new Array(\'o\',\'Do küünz Desh widdo ennlogge, ed_eß ävver nit nüüdish.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Do küünz Desh hee als_enne Medmaacher aanmëllde, moss_ävvor nit.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Ußlogge, domet De zem nameloose Medmaacher weeß.\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Ußlogge, domet De zem nameloose Medmaacher weeß.\');
ta[\'ca-talk\'] = new Array(\'t\',\'Klaaf övver de Sigk med Enhalld.\');
ta[\'ca-edit\'] = new Array(\'e\',\'Do kannß di Sigk fo_änndere. Luer Der de Füür_Aansesh aan, ih dat_De_se
@@ -2315,7 +2318,6 @@ Wellß Do jäz medd_en nöüe Väsjohn di Sigk nöü aanlääje?',
$1',
'confirm_purge_button' => 'Jo — loßß jonn!',
'youhavenewmessagesmulti'=> 'Do häßß nöü Nohrishte op $1',
-'newtalkseperator' => ',_',
'searchcontaining' => 'Söök noh Atikkelle, wo „$1“ em Täxx fürkütt.',
'searchnamed' => 'Söök noh Atikkelle, wo „$1“ em Name fürkütt.',
'articletitles' => 'Atikkelle di met „$1“ aanfange',
diff --git a/languages/messages/MessagesKu.php b/languages/messages/MessagesKu.php
index be7c1f43..af790538 100644
--- a/languages/messages/MessagesKu.php
+++ b/languages/messages/MessagesKu.php
@@ -59,7 +59,8 @@ $messages = array(
'oct' => 'kew',
'nov' => 'ser',
'dec' => 'ber',
-'categories' => '{{PLURAL:$1|Kategorî|Kategorî}}',
+'categories' => 'Kategorî',
+'pagecategories' => '{{PLURAL:$1|Kategorî|Kategorî}}',
'category_header' => 'Gotarên di kategoriya "$1" de',
'subcategories' => 'Binkategorî',
'mainpage' => 'Destpêk',
@@ -513,7 +514,7 @@ Li rûpela [[Special:Recentchanges|Guherandinên dawî]] jî ji bo hasan dîtina
'rollback_short' => 'Bizivirîne pêş',
'rollbacklink' => 'bizivirîne pêş',
'cantrollback' => 'Guharto naye vegerandin; bikarhêrê dawî, \'\'\'tenya\'\'\' nivîskarê wê rûpelê ye.',
-'alreadyrolled' => 'Guherandina dawiya [[$1]]
+'alreadyrolled' => 'Guherandina dawiya [[:$1]]
bi [[User:$2|$2]] ([[User talk:$2|guftûgo]]) venizivre; keseke din wê rûpelê zivrandiye an guherandiye.
Guhartoya dawî bi [[User:$3|$3]] ([[User talk:$3|guftûgo]]).',
@@ -595,9 +596,9 @@ da bikarî navê wê rûpelê biguherînî.',
'allmessagesnotsupportedDB'=> '\'\'\'Special:Allmessages\'\'\' cannot be used because \'\'\'$wgUseDatabaseMessages\'\'\' is switched off.',
'thumbnail-more' => 'Mezin bike',
'importnotext' => 'Vala an nivîs tune',
-'tooltip-diff' => 'Show which changes you made to the text. [alt-d]',
+'tooltip-diff' => 'Show which changes you made to the text. [alt-v]',
'tooltip-compareselectedversions'=> 'Cudatiyên guhartoyên hilbijartî yên vê rûpelê bibîne. [alt-v]',
-'Monobook.css' => '*.rtl
+'monobook.css' => '*.rtl
{
dir:rtl;
text-align:right;
@@ -659,7 +660,7 @@ da bikarî navê wê rûpelê biguherînî.',
'subcategorycount' => 'Di vê kategoriyê de $1 binkategorî hene.',
'categoryarticlecount' => 'Di vê kategoriyê de $1 gotar hene.',
'listingcontinuesabbrev'=> ' dewam',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Rûpela min a şexsî\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'The user page for the ip you\'re editing as\');
@@ -670,7 +671,7 @@ da bikarî navê wê rûpelê biguherînî.',
ta[\'pt-mycontris\'] = new Array(\'y\',\'Lîsteya tevkariyên min\');
ta[\'pt-login\'] = new Array(\'o\',\'You are encouraged to log in, it is not mandatory however.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'You are encouraged to log in, it is not mandatory however.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Derkeve (Log out)\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Derkeve (Log out)\');
ta[\'ca-talk\'] = new Array(\'t\',\'guftûgo û şîrove ser vê rûpelê\');
ta[\'ca-edit\'] = new Array(\'e\',\'Vê rûpelê biguherîne! Berê qeydkirinê bişkoka "Pêşdîtin" bi kar bîne.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Beşekê zêde bike.\');
diff --git a/languages/messages/MessagesLa.php b/languages/messages/MessagesLa.php
index 734ecea7..ee0c8b90 100644
--- a/languages/messages/MessagesLa.php
+++ b/languages/messages/MessagesLa.php
@@ -35,6 +35,24 @@ $namespaceNames = array(
NS_CATEGORY_TALK => 'Disputatio_Categoriae',
);
+$dateFormats = array(
+ 'mdy time' => 'H:i',
+ 'mdy date' => 'xg j, Y',
+ 'mdy both' => 'H:i, xg j, Y',
+
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j xg Y',
+ 'dmy both' => 'H:i, j xg Y',
+
+ 'ymd time' => 'H:i',
+ 'ymd date' => 'Y xg j',
+ 'ymd both' => 'H:i, Y xg j',
+
+ 'ISO 8601 time' => 'xnH:xni:xns',
+ 'ISO 8601 date' => 'xnY-xnm-xnd',
+ 'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+);
+
$messages = array(
'tog-underline' => 'Nexus cum linea subscribere',
'tog-highlightbroken' => 'Formare nexos fractos <a href="" class="new">sici</a> (alioqui: sic<a href="" class="internal">?</a>).',
@@ -83,18 +101,30 @@ $messages = array(
'thursday' => 'dies Iovis',
'friday' => 'dies Veneris',
'saturday' => 'dies Saturni',
-'january' => 'Ianuarii',
-'february' => 'Februarii',
-'march' => 'Martii',
+'january' => 'Ianuarius',
+'february' => 'Februarius',
+'march' => 'Martius',
'april' => 'Aprilis',
-'may_long' => 'Maii',
-'june' => 'Iunii',
-'july' => 'Iulii',
-'august' => 'Augusti',
-'september' => 'Septembris',
-'october' => 'Octobris',
-'november' => 'Novembris',
-'december' => 'Decembris',
+'may_long' => 'Maius',
+'june' => 'Iunius',
+'july' => 'Iulius',
+'august' => 'Augustus',
+'september' => 'September',
+'october' => 'October',
+'november' => 'November',
+'december' => 'December',
+'january-gen' => 'Ianuarii',
+'february-gen' => 'Februarii',
+'march-gen' => 'Martii',
+'april-gen' => 'Aprilis',
+'may-gen' => 'Maii',
+'june-gen' => 'Iunii',
+'july-gen' => 'Iulii',
+'august-gen' => 'Augusti',
+'september-gen' => 'Septembris',
+'october-gen' => 'Octobris',
+'november-gen' => 'Novembris',
+'december-gen' => 'Decembris',
'jan' => 'ian',
'feb' => 'feb',
'mar' => 'mar',
@@ -107,22 +137,23 @@ $messages = array(
'oct' => 'oct',
'nov' => 'nov',
'dec' => 'dec',
-'categories' => '{{PLURAL:$1|Categoria|Categoriae}}',
+'categories' => 'Categoriae',
+'pagecategories' => '{{PLURAL:$1|Categoria|Categoriae}}',
'category_header' => 'Paginae in categoria "$1"',
'subcategories' => 'Categoriae inferiores',
'mainpage' => 'Pagina prima',
'portal' => 'Porta communis',
-'portal-url' => '{{ns:project}}Porta communis',
+'portal-url' => 'Project:Porta communis',
'about' => 'De {{SITENAME}}',
-'aboutpage' => '{{ns:project}}De {{SITENAME}}',
+'aboutpage' => 'Project:De {{SITENAME}}',
'article' => 'Pagina contenta continens',
'help' => 'Adiutatum',
'helppage' => 'Help:Auxilium pro editione',
'bugreports' => 'Renuntiare errores',
-'bugreportspage' => '{{ns:project}}Renuntiare errores',
+'bugreportspage' => 'Project:Renuntiare errores',
'sitesupport' => 'Donationes',
'faq' => 'Quaestiones frequentes',
-'faqpage' => '{{ns:project}}Quaestiones frequentes',
+'faqpage' => 'Project:Quaestiones frequentes',
'edithelp' => 'Adjutatum ad recensere',
'edithelppage' => '{{ns:help}}:Quam paginam recensere',
'newwindow' => '(in fenestra nova aperietur)',
@@ -281,7 +312,7 @@ Si non ipse hanc petitionem fecisti, aut si tesseram tuam meministi et etiam nol
'accmailtext' => 'Tessera usoris "$1" ad $2 missa est.',
'accmailtitle' => 'Tessera missa est.',
'newarticle' => '(Nova)',
-'newarticletext' => 'Per nexum progressus es ad paginam quae nondum exsistit. Novam paginam si vis creare, in capsam infra praebitam scribe. (Vide [[{{ns:project}}Adjutatum|paginam auxilii]] si plura cognoscere vis.) Si hic es propter errorem, solum \'\'\'Retrorsum\'\'\' in navigatro tuo preme.',
+'newarticletext' => 'Per nexum progressus es ad paginam quae nondum exsistit. Novam paginam si vis creare, in capsam infra praebitam scribe. (Vide [[Project:Adjutatum|paginam auxilii]] si plura cognoscere vis.) Si hic es propter errorem, solum \'\'\'Retrorsum\'\'\' in navigatro tuo preme.',
'anontalkpagetext' => '---- \'\'Haec est pagina disputationis usoris anonymi qui rationem nondum creavit, vel ratione creata non utitur. Non igitur nisi ex inscriptione IP eum agnoscere possumus. Memento insctriptiones IP posse pluribus hominibus pertinere.\'\'',
'noarticletext' => 'In hac pagina nondum litterae sunt.',
'updated' => '(Novata)',
@@ -419,7 +450,7 @@ Adde quae scis, sed memento addita tua mutari ameliorarique posse ab aliis utent
'uploadnologintext' => '[[{{ns:special}}:Userlogin|Aperire conventum]] debes ut fasciculos oneres.',
'uploaderror' => 'Error onerati',
'uploadvirus' => 'Imagini huic est virus! Singula: $1',
-'uploadtext' => '<strong>SISTERE!</strong> Ante hic oneras, lege et pare [[{{ns:project}}Vonsilias de uso imaginum|consilias de {{SITENAME}} de uso imaginum]].<br />
+'uploadtext' => '<strong>SISTERE!</strong> Ante hic oneras, lege et pare [[Project:Consilias de uso imaginum|consilias de {{SITENAME}} de uso imaginum]].<br />
Ut videre aut quaerere imagines oneratas antea,
adi [[{{ns:special}}:Imagelist|indicem imaginum oneratae]].
Onerata et deleta in [[{{ns:special}}:Log/upload|notationem oneratorum]] notata sunt.<br />
@@ -444,7 +475,7 @@ Totae horae in hora moderatri monstrantur (UTC).
'filedesc' => 'Descriptio',
'filestatus' => 'Locus verborum privatorum',
'filesource' => 'Fons',
-'copyrightpage' => '{{ns:project}}Verba privata',
+'copyrightpage' => 'Project:Verba privata',
'copyrightpagename' => '{{SITENAME}} verba privata',
'uploadedfiles' => 'Fasciculi onerati',
'ignorewarning' => 'Ignorare monita et servare fasciculum.',
@@ -593,7 +624,7 @@ $3...
'confirmdelete' => 'Adfirmare deletionem',
'deletesub' => '(Deletio de "$1")',
'historywarning' => 'Monitus: Paginam delebis historiam habet:',
-'confirmdeletetext' => 'Paginam imaginemve perpetuo delebis ex base datorum, cum tota historia eius. Adfirma quaeso te paginam delere velle, consequentias intellere, et deletionem [[{{ns:project}}Consilium|Consilio {{SITENAME}}e]] congruere.',
+'confirmdeletetext' => 'Paginam imaginemve perpetuo delebis ex base datorum, cum tota historia eius. Adfirma quaeso te paginam delere velle, consequentias intellere, et deletionem [[Project:Consilium|Consilio {{SITENAME}}e]] congruere.',
'actioncomplete' => 'Actio completa',
'deletedtext' => '"$1" deletum est.
Vide $2 pro indice deletionum recentum.',
@@ -612,18 +643,18 @@ Totae horae in cingulo horis moderatri sunt (UTC).
'rollbacklink' => 'reverti',
'rollbackfailed' => 'Reversum defecit',
'cantrollback' => 'Mutatio reverti non posse; conlator proximus solus auctor huius rei est.',
-'alreadyrolled' => 'Ad mutationem proxima paginae "[[$1]]" ab usore "[[{{ns:user}}:$2|$2]]" ([[{{ns:user_talk}}:$2|disputatio]]) reverti non potest; alius paginam iam recensuit vel revertit. Mutatio proxima ab usore "[[{{ns:user}}:$3|$3]]" ([[{{ns:user_talk}}:$3|disputatio]]) effecta est.',
+'alreadyrolled' => 'Ad mutationem proxima paginae "[[:$1]]" ab usore "[[{{ns:user}}:$2|$2]]" ([[{{ns:user_talk}}:$2|disputatio]]) reverti non potest; alius paginam iam recensuit vel revertit. Mutatio proxima ab usore "[[{{ns:user}}:$3|$3]]" ([[{{ns:user_talk}}:$3|disputatio]]) effecta est.',
'editcomment' => 'Dictum recensiti erat: "<i>$1</i>".',
'revertpage' => 'Reverti ad mutationem proximam ab $1',
'protectlogpage' => 'Index praesidii',
-'protectlogtext' => 'Subter index paginarum protectarum est. Vide [[{{ns:project}}Pagina protecta]] si pluris nuntii eges.',
+'protectlogtext' => 'Subter index paginarum protectarum est. Vide [[{{ns:project}}:Pagina protecta]] si pluris nuntii eges.',
'protectedarticle' => '[[$1]] protectum est',
'confirmprotect' => 'Protectionem adfirmare',
'confirmprotecttext' => 'Re vera hanc paginam visne protegere?',
'unprotectedarticle' => '[[$1]] deprotectum est',
'confirmunprotect' => 'Deprotectionem adfirmare',
'confirmunprotecttext' => 'Re vera hanc paginam visne deprotegere?',
-'protect-text' => 'You may view and change the protection level here for the page <strong>$1</strong>. Please be sure you are following the [[{{ns:project}}Protected page|project guidelines]].',
+'protect-text' => 'You may view and change the protection level here for the page <strong>$1</strong>. Please be sure you are following the [[Project:Protected page|project guidelines]].',
'undelete' => 'Restituere paginam deletam',
'undeletepage' => 'Videre et restituere paginas deletas',
'undeletepagetext' => 'Paginae sequentes deletae sunt sed in tabulis sunt et eas restituere posse. Tabulae nonnumquam deleta est.',
@@ -649,7 +680,7 @@ Si paginam novam cum ipse nomine post deletionem creata est, recensita restituta
'isredirect' => 'pagina redirectionis',
'istemplate' => 'inclusio',
'blockip' => 'Obstruere locum IP',
-'blockiptext' => 'Forma infera utere ut quendam locum IP obstruas. Hoc non nisi secundum [[{{ns:project}}Consilium|consilium {{SITENAME}}e]] fieri potest. Rationem certam subsribe.',
+'blockiptext' => 'Forma infera utere ut quendam locum IP obstruas. Hoc non nisi secundum [[Project:Consilium|consilium {{SITENAME}}e]] fieri potest. Rationem certam subsribe.',
'ipaddress' => 'Locus IP',
'ipbreason' => 'Ratio',
'ipbsubmit' => 'Obstruere hunc locum',
@@ -749,7 +780,7 @@ Selege nominem altera.',
'alphaindexline' => '$1 ad $2',
'import' => 'Paginas importare',
'tooltip-save' => 'Servare mutationes tuas [alt-s]',
-'tooltip-diff' => 'Show which changes you made to the text. [alt-d]',
+'tooltip-diff' => 'Show which changes you made to the text. [alt-v]',
'anonymous' => 'Usor ignotus {{SITENAME}}e',
'lastmodifiedat' => 'Ultima mutatio: $2, $1.',
'lastmodifiedatby' => 'Ultima mutatio: $2, $1 ab $3.',
@@ -762,7 +793,7 @@ Selege nominem altera.',
'mw_math_source' => 'Stet ut TeX (pro navigatri texti)',
'mw_math_modern' => 'Commendatum pro navigatri recentes',
'mw_math_mathml' => 'MathML',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Pagina usoris mea\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'The user page for the ip you\'re editing as\');
@@ -773,7 +804,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Paginae quae custodis\');
ta[\'pt-mycontris\'] = new Array(\'y\',\'Index conlationum mearum\');
ta[\'pt-login\'] = new Array(\'o\',\'Te conventum aperire hortamur, non autem requisitum\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Te conventum aperire hortamur, non autem requisitum\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Finire conventum\');
+ta[\'pt-logout\'] = new Array(\'\',\'Finire conventum\');
ta[\'ca-talk\'] = new Array(\'t\',\'Disputatio de hac pagina\');
ta[\'ca-edit\'] = new Array(\'e\',\'Hanc paginam recensere potes\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Huic disputationi adnotare\');
diff --git a/languages/messages/MessagesLi.php b/languages/messages/MessagesLi.php
index efca139e..b1e3e061 100644
--- a/languages/messages/MessagesLi.php
+++ b/languages/messages/MessagesLi.php
@@ -32,8 +32,13 @@ $namespaceNames = array(
NS_TEMPLATE_TALK => 'Euverlik_sjabloon',
NS_HELP => 'Help',
NS_HELP_TALK => 'Euverlik_help',
- NS_CATEGORY => 'Kategorie',
- NS_CATEGORY_TALK => 'Euverlik_kategorie'
+ NS_CATEGORY => 'Categorie',
+ NS_CATEGORY_TALK => 'Euverlik_categorie'
+);
+
+$namespaceAliases = array(
+ 'Kategorie' => NS_CATEGORY,
+ 'Euverlik_kategorie' => NS_CATEGORY_TALK,
);
$dateFormats = array(
@@ -100,7 +105,8 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nov',
'dec' => 'dec',
-'categories' => '{{PLURAL:$1|Categorie|Categorieë}}',
+'categories' => 'Categorieë',
+'pagecategories' => '{{PLURAL:$1|Categorie|Categorieë}}',
'category_header' => 'Artikele in categorie "$1"',
'subcategories' => 'Subkattegorië',
'mainpage' => 'Huidpazjena',
@@ -670,7 +676,7 @@ Commentaar en wiejer assistentie:
'rollback' => 'Wijzigingen ongedaan maken',
'rollbacklink' => 'Trukdrieje',
'cantrollback' => 'Trökdrejje van verangeringe neet meugelik: Dit artikel haet mer einen auteur.',
-'alreadyrolled' => '\'t Is neet meugelik óm de lèste verangering van [[$1]]
+'alreadyrolled' => '\'t Is neet meugelik óm de lèste verangering van [[:$1]]
door [[User:$2|$2]] ([[User talk:$2|euverlik]]) óngedaon te make. Emes angers haet de pazjena al hersjtèld of haet \'n anger bewèrking gedaon.
De lèste bewèrking is gedaon door [[User:$3|$3]] ([[User talk:$3|euverlik]]).',
@@ -799,7 +805,7 @@ De doeltitel "[[$1]]" besjteit al. Wils te dit artikel wisse óm ruumde te make
'tooltip-minoredit' => 'Markeer dit as \'n kleine verangering [alt-i]',
'tooltip-save' => 'Bewaar dien verangeringe [alt-s]',
'tooltip-preview' => 'Bekiek dien verangeringe veurdets te ze definitief opsjleis! [alt-p]',
-'tooltip-diff' => 'Bekiek dien verangeringe in de teks. [alt-d]',
+'tooltip-diff' => 'Bekiek dien verangeringe in de teks. [alt-v]',
'tooltip-compareselectedversions'=> 'Bekiek de versjille tusje de twie geselectierde versies van dees pazjena. [alt-v]',
'tooltip-watch' => 'Voog dees pazjena toe aan dien volglies [alt-w]',
'anonymous' => 'Anoniem(e) gebroeker(s) van {{SITENAME}}',
@@ -816,7 +822,7 @@ De doeltitel "[[$1]]" besjteit al. Wils te dit artikel wisse óm ruumde te make
'mw_math_source' => 'Laot de TeX code sjtaon (vuur tèksbrowsers)',
'mw_math_modern' => 'Aangeroaje vuur nuui browsers',
'mw_math_mathml' => 'MathML woe meugelik (experimenteil)',
-'Monobook.js' => '/* tooltips en access keys, pas op mit \'t \'-teike */
+'monobook.js' => '/* tooltips en access keys, pas op mit \'t \'-teike */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Mien gebroekerspazjena\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'De gebroekerspazjena veur dit IP adres\');
@@ -827,7 +833,7 @@ De doeltitel "[[$1]]" besjteit al. Wils te dit artikel wisse óm ruumde te make
ta[\'pt-mycontris\'] = new Array(\'y\',\'Liest van mien biedraag\');
ta[\'pt-login\'] = new Array(\'o\',\'De weurs aangemodigd om in te logge, meh t is neet verplich.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'De weurs aangemodigd om in te logge, meh t is neet verplich.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Aafmèlde\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Aafmèlde\');
ta[\'ca-talk\'] = new Array(\'t\',\'Euverlik euver dit artikel\');
ta[\'ca-edit\'] = new Array(\'e\',\'De kins dees pazjena verangere.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Opmèrking toevoge aan dees discussie.\');
diff --git a/languages/messages/MessagesLn.php b/languages/messages/MessagesLn.php
new file mode 100644
index 00000000..a6739387
--- /dev/null
+++ b/languages/messages/MessagesLn.php
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * Lingala language
+ *
+ * @package MediaWiki
+ * @subpackage language
+ */
+
+$linkPrefixExtension = true;
+
+# Same as the French (bug 8485)
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
+
+$messages = array( 'linkprefix' => '/^(.*?)([a-zA-Z\x80-\xff]+)$/sD' );
+
+?> \ No newline at end of file
diff --git a/languages/messages/MessagesLt.php b/languages/messages/MessagesLt.php
index 7c553b2c..e75c500f 100644
--- a/languages/messages/MessagesLt.php
+++ b/languages/messages/MessagesLt.php
@@ -44,899 +44,2034 @@ $skinNames = array(
$fallback8bitEncoding = 'windows-1257';
$separatorTransformTable = array(',' => ' ', '.' => ',' );
+$dateFormats = array(
+ 'mdy time' => 'H:i',
+ 'mdy date' => 'F j, Y',
+ 'mdy both' => 'H:i, F j, Y',
+
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'Y F j',
+ 'dmy both' => 'H:i, Y F j',
+
+ 'ymd time' => 'H:i',
+ 'ymd date' => 'Y F j',
+ 'ymd both' => 'Y F j, H:i',
+
+ 'ISO 8601 time' => 'xnH:xni:xns',
+ 'ISO 8601 date' => 'xnY-xnm-xnd',
+ 'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+);
$messages = array(
-'1movedto2' => 'Straipsnis \'$1\' pervadintas į \'$2\'',
-'1movedto2_redir' => '\'$1\' pervadintas į \'$2\' (anksÄiau buvo nukreipiamasis)',
-'Monobook.js' => '/* tooltips and access keys */
-var ta = new Object();
-ta[\'pt-userpage\'] = new Array(\'.\',\'Mano vartotojo puslapis\');
-ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Vartotojo puslapis jūsų ip ardesui\');
-ta[\'pt-mytalk\'] = new Array(\'n\',\'Mano aptarimų puslapis\');
-ta[\'pt-anontalk\'] = new Array(\'n\',\'Pakeitimų aptarimas, darytus naudojant šį IP adresą\');
-ta[\'pt-preferences\'] = new Array(\'\',\'Mano nustatymai\');
-ta[\'pt-watchlist\'] = new Array(\'l\',\'Sąrašas straipsnių, kuriuos jūs pasirinkote stebėti.\');
-ta[\'pt-mycontris\'] = new Array(\'y\',\'Mano darytų keitimų sąrašas\');
-ta[\'pt-login\'] = new Array(\'o\',\'Rekomenduojame prisijungti, nors tai nÄ—ra privaloma.\');
-ta[\'pt-anonlogin\'] = new Array(\'o\',\'Rekomenduojame prisijungti, nors tai nÄ—ra privaloma.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Atsijungti\');
-ta[\'ca-talk\'] = new Array(\'t\',\'Straipsnio aptarimas\');
-ta[\'ca-edit\'] = new Array(\'e\',\'Jūs galite redaguoti šį straipsnį. Nepamirškite peržiūrėti pakeitimų prieš užsaugodami.\');
-ta[\'ca-addsection\'] = new Array(\'+\',\'PradÄ—ti naujÄ… aptarimo temÄ….\');
-ta[\'ca-viewsource\'] = new Array(\'e\',\'Puslapis yra užrakintas. Galite tik pažiūrėti turinį.\');
-ta[\'ca-history\'] = new Array(\'h\',\'AnkstesnÄ—s puslapio versijos.\');
-ta[\'ca-protect\'] = new Array(\'=\',\'Uždrausti šį puslapį\');
-ta[\'ca-delete\'] = new Array(\'d\',\'Ištrinti šį puslapį\');
-ta[\'ca-undelete\'] = new Array(\'d\',\'Atstatyti puslapį su visais darytais keitimais\');
-ta[\'ca-move\'] = new Array(\'m\',\'Pervadinti straipsnį\');
-ta[\'ca-nomove\'] = new Array(\'\',\'Neturite teisių pervadinti šį straipsnį\');
-ta[\'ca-watch\'] = new Array(\'w\',\'Pridėti straipsnį į stebimųjų sąrašą\');
-ta[\'ca-unwatch\'] = new Array(\'w\',\'Išimti straipsnį iš stebimųjų sąrašo\');
-ta[\'search\'] = new Array(\'f\',\'Ieškoti projekte {{SITENAME}}\');
-ta[\'p-logo\'] = new Array(\'\',\'Į pradinį puslapį\');
-ta[\'n-mainpage\'] = new Array(\'z\',\'Apsilankykite pradiniame puslapyje\');
-ta[\'n-portal\'] = new Array(\'\',\'Apie projektÄ…, kÄ… galima daryti, kur kÄ… rasti\');
-ta[\'n-currentevents\'] = new Array(\'\',\'Find background information on current events\');
-ta[\'n-recentchanges\'] = new Array(\'r\',\'Sąrašas paskutinių keitimų.\');
-ta[\'n-randompage\'] = new Array(\'x\',\'Parinkti atsitiktinį straipsnį\');
-ta[\'n-help\'] = new Array(\'\',\'Vieta, kur rasite rūpimus atsakymus.\');
-ta[\'n-sitesupport\'] = new Array(\'\',\'Aukokite projektui\');
-ta[\'t-whatlinkshere\'] = new Array(\'j\',\'SÄ…raÅ¡as straipsnių, rodanÄių į Äia\');
-ta[\'t-recentchangeslinked\'] = new Array(\'k\',\'Paskutiniai keitimai straipsniuose, pasiekiamuose iš šio straipsnio\');
-ta[\'feed-rss\'] = new Array(\'\',\'RSS feed for this page\');
-ta[\'feed-atom\'] = new Array(\'\',\'Atom feed for this page\');
-ta[\'t-contributions\'] = new Array(\'\',\'Pažiūrėti vartotojo įnašą - darytus keitimus\');
-ta[\'t-emailuser\'] = new Array(\'\',\'Siųsti el.laišką vartotojui\');
-ta[\'t-upload\'] = new Array(\'u\',\'Įdėti paveikslėlį ar media failą\');
-ta[\'t-specialpages\'] = new Array(\'q\',\'Specialiųjų puslapių sąrašas\');
-ta[\'ca-nstab-main\'] = new Array(\'c\',\'Pereiti į straipsnio turinį\');
-ta[\'ca-nstab-user\'] = new Array(\'c\',\'Rodyti vartotojo puslapį\');
-ta[\'ca-nstab-media\'] = new Array(\'c\',\'Rodyti media puslapį\');
-ta[\'ca-nstab-special\'] = new Array(\'\',\'Å is puslapis yra specialusis - jo negalima redaguoti.\');
-ta[\'ca-nstab-project\'] = new Array(\'a\',\'Rodyti projekto puslapį\');
-ta[\'ca-nstab-image\'] = new Array(\'c\',\'Rodyti paveikslėlio puslapį\');
-ta[\'ca-nstab-mediawiki\'] = new Array(\'c\',\'Rodyti sisteminį pranešimą\');
-ta[\'ca-nstab-template\'] = new Array(\'c\',\'Rodyti Å¡ablonÄ…\');
-ta[\'ca-nstab-help\'] = new Array(\'c\',\'Rodyti pagalbos puslapį\');
-ta[\'ca-nstab-category\'] = new Array(\'c\',\'Rodyti kategorijos puslapį\');',
-
-'about' => 'Apie',
-'aboutpage' => 'Projektas:Apie',
-'aboutsite' => 'Apie {{SITENAME}} projektÄ…',
-'accmailtext' => 'Vartotojo \'$1\' slaptažodis nusiųstas į $2.',
-'accmailtitle' => 'Slaptažodis išsiųstas.',
-'acct_creation_throttle_hit' => 'Atleiskite, jūs jau sukūrėte $1 prisijungimo vardą. Daugiau nebegalima.',
-'actioncomplete' => 'Veiksmas atliktas',
-'addedwatch' => 'Pridėta prie Stebimų',
-'addedwatchtext' => 'Straipsnis "$1" pridėtas į [[Special:Watchlist|stebimųjų sąrašą]].
-Būsimi straipsnio bei atitinkamo aptarimo puslapio pakeitimai bus rodomi stebimųjų puslapių sąraše,
-taip pat bus \'\'\'paryškinti\'\'\' [[Special:Recentchanges|naujausių keitimų sąraše]] kad išsiskirtų iš kitų straipsnių.
-
-<p>Jei bet kuriuo metu užsinorėtumėte nustoti stebėti straipsnį, spustelkite "nebestebėti" viršutiniame meniu.',
-'allarticles' => 'Visi straipsniai',
-'allinnamespace' => 'Visi puslapiai (sritis - $1)',
-'alllogstext' => 'Bendra įdėtų failų, ištrynimų, užrakinimų, blokavimų ir teisių suteikimų istorija.
-Galima sumažinti rezultatų patikslinant veiksmo rūšį, vartotoją ar susijusį puslapį.',
-'allmessages' => 'Visi sistemos tekstai bei pranešimai',
-'allmessagescurrent' => 'Galiojanti reikšmė',
-'allmessagesdefault' => 'Reikšmė pagal nutylėjimą',
-'allmessagesname' => 'Pavadinimas',
-'allmessagesnotsupportedDB' => 'Specialus:AllMessages nepalaikoma, nes nustatymas wgUseDatabaseMessages yra išjungtas.',
-'allmessagesnotsupportedUI' => 'Jūsų pasirinkta kalba (<b>$1</b>) nėra palaikoma šiame projekte.',
-'allmessagestext' => 'Čia pateikiami visi sisteminiai tekstai bei pranešimai, esantys MediaWiki: vardų ervėje.',
-'allnotinnamespace' => 'Visi puslapiai (nesantys Å¡ioje srityje - $1)',
-'allpages' => 'Visi straipsniai',
-'allpagesfrom' => 'Rodyti puslapius pradedant nuo:',
-'allpagesnext' => 'Kitas (tolimesnis)',
-'allpagesprev' => 'Ankstesnis',
-'allpagessubmit' => 'Tinka',
-'alphaindexline' => 'Nuo $1 iki $2',
-'already_bureaucrat' => 'Vartotojas jau yra biurokratas',
-'already_sysop' => 'Vartotojas jau yra administratorius',
-'alreadyloggedin' => '<strong>Jūs jau esate prisijungęs kaip vartotojas User $1!</strong><br />',
-'alreadyrolled' => 'Nepavyko atmesti paskutinio [[Vartotojas:$2|$2]] ([[Vartotojo aptarimas:$2|aptarimas]]) daryto straipsnio [[$1]] keitimo; kažkas jau pakeitė straipsnį arba suspėjo pirmas atmesti keitimą.
-
-Paskutimas keitimas darytas vartotojo [[Vartotojas:$3|$3]] ([[Vartotojo aptarimas:$3|Aptarimas]]).',
-'ancientpages' => 'Seniausi straipsniai',
-'and' => 'ir',
-'anontalk' => 'Šio IP aptarimų puslapis',
-'anontalkpagetext' => '----\'\'Tai yra anoniminio vartotojo, nesusikÅ«rusio arba nenaudojanÄio vartotojo vardo, aptarimų puslapis. DÄ—l to naudojamas [[IP adresas]] jo identifikavimui, kuris gali bÅ«ti dalinamas keliems vartotojams. Jeigu JÅ«s esate anoniminis (neregistruotas) vartotojas ir atrodo, kad komentarai nÄ—ra skirti Jums, [[Special:Userlogin|užsiregistruokite]], ir nebÅ«site tapatinamas su kitais anonimais.\'\'',
-'anonymous' => 'Neregistruotas vartotojas',
-'apr' => 'Bal',
-'april' => 'Balandžio',
-'article' => 'Turinys',
-'articleexists' => 'Straipsnis tokiu pavadinimu jau egzistuoja
-arba pasirinktas vardas yra neteisingas.
-Pasirinkite kitÄ… pavadinimÄ….',
-'articlepage' => 'Rodyti straipsnį',
-'aug' => 'Rgp',
-'august' => 'RugpjÅ«Äio',
-'autoblocker' => 'Automatinis užblokavimas, nes dalinatės IP adresu su vartotoju "$1". Priežastis - "$2".',
-'badaccess' => 'Teisių klaida',
-'badarticleerror' => 'Veiksmas negalimas Å¡iam puslapiui.',
-'badfilename' => 'Paveiksliukas buvo pervadintas į "$1".',
-'badfiletype' => '".$1" yra nerekomenduojamas paveikslÄ—lio bylos formatas.',
-'badipaddress' => 'Neteisingas IP adresas',
-'badquery' => 'Bloga paieškos užklausa',
-'badquerytext' => 'Nepavyko apdoroti Jūsų paieškos užklausos.
-Tai galėjo būti dėl trumpesnio nei trijų simbolių paieškos rakto, arba neteisingai suformuotos užklausos (pavyzdžiui "namas and and tvartas").
-Pamėginkite kitokią užklausą.',
-'badretype' => 'Įvesti slaptažodžiai nesutampa.',
-'badtitle' => 'Blogas pavadinimas',
-'badtitletext' => 'Nurodytas puslapio pavadinimas buvo neteisingas, tuÅ¡Äias arba neteisingai sujungtas tarp-kalbinis arba tarp-wiki pavadinimas.',
-'blanknamespace' => '(straipsniai)',
-'blockedtext' => 'Jūsų vartotojo vardą arba IP adresą užblokavo $1.
-Nurodyta priežastis:<br />\'\'$2\'\'<p>Jūs galite susisiekti su $1 arba kuriuo nors kitu
-[[{{ns:project}}:Administrators|administratoriumi]] aptarti neaiškumus dėl blokavimo.
-
-Atkreipkite dėmesį, kad negalėsite išsiųsti el. laiško, jei nesate užsiregistravę ir pateikę realaus savo el. pašto adreso vartotojo [[Special:Preferences|nustatymuose]].
-
-Jūsų IP adresas yra $3. Prašome nurodyti šį adresą visais atvejais kai kreipiatės dėl blokavimo.',
-'blockedtitle' => 'Vartotojas yra blokuotas',
-'blockip' => 'Blokuoti vartotojÄ…',
-'blockipsuccesssub' => 'Užblokavimas pavyko',
-'blockipsuccesstext' => '"$1" buvo užblokuotas.
-<br />Aplankykite [[Special:Ipblocklist|IP blokų sąrašą]] norėdami jį peržiūrėti.',
-'blockiptext' => 'Naudokite šią formą, norėdami uždrausti rašymo teises iš nurodytų IP adresų ar vartotojų. Tai turėtų būti atliekama tiktai sustabdyti vandalizmui, bei priderinant [[{{ns:project}}:Policy|politiką]].
-Nurodykite tiksliÄ… priežastį apaÄioje (pavyzdžiui nurodydami sugadintus puslapius).',
-'blocklink' => 'blokuoti',
-'blocklistline' => '$1, $2 blokavo $3 (galioja iki $4)',
-'blocklogentry' => 'blokavo "$1", blokavimo laikas - $2',
-'blocklogpage' => 'Blokavimų_sąrašas',
-'blocklogtext' => 'Čia yra vartotojų blokavimo ir atblokavimo registras. Automatiškai blokuoti IP adresai neišvardinti. Jei norite pamatyti dabar blokuojamus adresus, žiūrėkite [[Special:Ipblocklist|IP blokavimų sąrašą]].',
-'bold_sample' => 'Paryškintas tekstas',
-'bold_tip' => 'Paryškinti tekstą',
-'booksources' => 'Knygų paieška',
-'brokenredirects' => 'Peradresavimai į niekur',
-'brokenredirectstext' => 'Žemiau iÅ¡vardinti peradresavimo puslapiai rodo į neegzistuojanÄius straipsnius.',
-'bugreports' => 'Pranešti apie klaidą',
-'bugreportspage' => 'Projektas:Klaidų_fiksavimas',
-'bydate' => 'pagal datÄ…',
-'byname' => 'pagal vardÄ…',
-'bysize' => 'pagal dydį',
-'cachederror' => 'Pateiktas išsaugota prašomo puslapio kopija, ji gali būti netiksli.',
-'cancel' => 'Atšaukti',
-'cannotdelete' => 'Nepavyko ištrinti nurodyto straipsnio ar paveikslėlio. (Gali būti, kad kažkas kitas ištrynė pirmas)',
-'cantrollback' => 'Negalima atmesti redagavimo; paskutinis keitęs vartotojas yra vienintelis straipsnį redagavęs autorius.',
-'categories' => 'Kategorijos',
-'categoriespagetext' => 'Projekte yra Å¡ios kategorijos.',
-'category_header' => 'Kategorijos "$1" straipsniai',
-'categoryarticlecount' => 'Kategorijoje straipsnių - $1',
-'changed' => 'pakeitÄ—',
-'changepassword' => 'Pakeisti slaptažodį',
-'changes' => 'pasikeitimai',
-'clearyourcache' => '\'\'\'DÄ—mesio:\'\'\' IÅ¡saugojÄ™ turite iÅ¡valyti narÅ¡yklÄ—s spartinanÄiÄ… saugyklÄ… (cache): \'\'\'Mozilla/Safari/Konqueror:\'\'\' spausdami \'\'Shift\'\' pasirinkite \'\'reload\'\' (arba \'\'Ctrl-Shift-R\'\'), \'\'\'IE:\'\'\' \'\'Ctrl-F5\'\', \'\'\'Opera:\'\'\' \'\'F5\'\'.',
-'columns' => 'Stulpeliai',
-'compareselectedversions' => 'Palyginti pasirinktas versijas',
-'confirm' => 'Tvirtinu',
-'confirmdelete' => 'Trynimo veiksmo patvirtinimas',
-'confirmdeletetext' => 'Jūs pasirinkote ištrinti straipsnį ar paveikslėlį
-kartu su visa istorija iš duomenų bazės.
-Prašome patvirtinti kad jūs norite tai padaryti,
-žinote kokios yra veiksmo pasekmės,
-ir kad jūs tai darote nenusižengdamas
-[[{{ns:project}}:Policy|{{SITENAME}}jos Politikai]].', // TODO: grammar
-'confirmemail' => 'Patvirtinkite el.pašto adresą',
-'confirmemail_body' => 'Kažkas (tikriausiai jūs) IP adresu užregistravo
-vartotoją "$2" susietą su šiuo el.pašto adresu projekte {{SITENAME}}.
-
-Kad užtikrinti el.pašto priklausomybę registravusiam naudotojui
-ir aktyvuoti su Å¡iuo adresu susijusias projekto galimybes,
-atverkite šią nuorodą savo naršyklėje:
+# User preference toggles
+'tog-underline' => 'Pabraukti nuorodas:',
+'tog-highlightbroken' => 'Formuoti nesanÄių puslapių nuorodas <a href="#" class="new">Å¡itaip</a> (prieÅ¡ingai - Å¡itaip <a href="#" class="internal">?</a>).',
+'tog-justify' => 'Lygiuoti pastraipas pagal abi puses',
+'tog-hideminor' => 'Slėpti smulkius pakeitimus naujausių keitimų sąraše',
+'tog-extendwatchlist' => 'Išplėsti stebimų sąrašą, kad rodytų visus tinkamus keitimus',
+'tog-usenewrc' => 'Pažangiai rodomi naujausi keitimai (JavaScript)',
+'tog-numberheadings' => 'Automatiškai numeruoti skyrelius',
+'tog-showtoolbar' => 'Rodyti redagavimo įrankinę (JavaScript)',
+'tog-editondblclick' => 'Puslapių redagavimas dvigubu spustelėjimu (JavaScript)',
+'tog-editsection' => 'Įjungti skyrelių redagavimą naudojant nuorodas [taisyti]',
+'tog-editsectiononrightclick' => 'Įjungti skyrelių redagavimą paspaudus skyrelio pavadinimą<br />dešiniuoju pelės klavišu (JavaScript)',
+'tog-showtoc' => 'Rodyti turinį, jei puslapyje daugiau nei 3 skyreliai',
+'tog-rememberpassword' => 'Prisiminti prisijungimo informacijÄ… Å¡iame kompiuteryje',
+'tog-editwidth' => 'Pilno ploÄio redagavimo laukas',
+'tog-watchcreations' => 'Pridėti puslapius, kuriuos sukūriau, į stebimų sąrašą',
+'tog-watchdefault' => 'Pridėti puslapius, kuriuos redaguoju, į stebimų sąrašą',
+'tog-watchdeletion' => 'Pridėti puslapius, kuriuos ištrinu, į stebimų sąrašą',
+'tog-minordefault' => 'Pagal nutylėjimą pažymėti redagavimus kaip smulkius',
+'tog-previewontop' => 'Rodyti peržiūrą virš redagavimo lauko',
+'tog-previewonfirst' => 'Rodyti straipsnio peržiūrą pirmu redagavimu',
+'tog-nocache' => 'Nenaudoti puslapių kaupimo (caching)',
+'tog-enotifwatchlistpages' => 'Siųsti man laiÅ¡kÄ…, kai pakeiÄiamas puslapis, kurį stebiu',
+'tog-enotifusertalkpages' => 'Siųsti man laiÅ¡kÄ…, kai pakeiÄiamas mano naudotojo aptarimo puslapis',
+'tog-enotifminoredits' => 'Siųsti man laišką, kai puslapio keitimas yra smulkus',
+'tog-enotifrevealaddr' => 'Rodyti mano el. pašto adresą priminimo laiškuose',
+'tog-shownumberswatching' => 'Rodyti stebinÄių naudotojų skaiÄių',
+'tog-fancysig' => 'Parašas be automatinių nuorodų',
+'tog-externaleditor' => 'Pagal nutylėjimą naudoti išorinį redaktorių',
+'tog-externaldiff' => 'Pagal nutylėjimą naudoti išorinę skirtumų rodymo programą',
+'tog-showjumplinks' => 'Įjungti "peršokti į" pasiekiamumo nuorodas',
+'tog-uselivepreview' => 'Naudoti tiesioginę peržiūrą (JavaScript) (Eksperimentinis)',
+'tog-forceeditsummary' => 'Klausti, kai palieku tuÅ¡ÄiÄ… keitimo komentarÄ…',
+'tog-watchlisthideown' => 'Slėpti mano keitimus stebimų sąraše',
+'tog-watchlisthidebots' => 'Slėpti robotų keitimus stebimų sąraše',
+'tog-watchlisthideminor' => 'Slėpti smulkius keitimus stebimų sąraše',
+'tog-nolangconversion' => 'Išjungti variantų keitimą',
+'tog-ccmeonemails' => 'Siųsti man laiÅ¡kų kopijas, kuriuos siunÄiu kitiems naudotojams',
-$3
+'underline-always' => 'Visada',
+'underline-never' => 'Niekada',
+'underline-default' => 'Pagal naršyklės nustatymus',
-Jei naudotoją registravote *ne* jūs, neatidarykite šio adreso. Patvirtinimo kodas
-baigs galioti $4.',
-'confirmemail_error' => 'Patvirtinimo metu įvyko neatpažinta klaida.',
-'confirmemail_invalid' => 'Neteisingas patvirtinimo kodas. Kodo galiojimas gali būti jau pasibaigęs.',
-'confirmemail_loggedin' => 'Jūsų el.pašto adresas patvirtintas.',
-'confirmemail_send' => 'Išsiųsti patvirtinimo kodą',
-'confirmemail_sendfailed' => 'Nepavyko išsiųsti patvirtinimo kodo. Patikrinkite, ar adrese nėra klaidingų simbolių.',
-'confirmemail_sent' => 'Patvirtinimo laiškas išsiųstas.',
-'confirmemail_subject' => '{{SITENAME}} el.pašto adreso patvirtinimas',
-'confirmemail_success' => 'Jūsų el.pašto adresas patvirtintas. Dabar galite prisijungti ir mėgautis wiki.',
-'confirmemail_text' => 'Šiame projekte būtina patvirtinti el.pašto adresą
-prieš naudojant su el.paštu susijusias galimybes. Spustelkite žemiau esantį mygtuką,
-kad jūsų el.pašto adresu būtų išsiųstas patvirtinimo kodas.
-Laiške bus atsiųsta nuoroda su kodu, kuria nuėjus, el.pašto adresas bus patvirtintas.',
-'confirmprotect' => 'Užrakinimo patvirtinimas',
-'confirmprotecttext' => 'Ar jūs tikrai norite užrakinti šį straipsnį?',
-'confirmrecreate' => 'Naudotojas [[Naudotojas:$1|$1]] ([[Naudotojo aptarimas:$1|aptarimas]]) ištrynė šį puslapį po to, kai pradėjote jį redaguoti. Trynimo priežąstis:
-: \'\'$2\'\'
-Prašome patvirtinti, kad tikrai norite iš naujo sukurti straipsnį.',
-'confirmunprotect' => 'Atrakinimo patvirtinimas',
-'confirmunprotecttext' => 'Ar tikrai norite atrakinti šį straipsnį?',
-'contextchars' => 'Konteksto simbolių eilutėje',
-'contextlines' => 'EiluÄių rezultate',
-'contribslink' => 'įnašas',
-'contribsub' => 'Vartotojo $1',
-'contributions' => 'Vartotojo indÄ—lis',
-'copyright' => 'Turinys pateikiamas su $1 licencija.',
-'copyrightpage' => '{{ns:project}}:Copyrights',
-'copyrightpagename' => '{{SITENAME}} copyright',
-'copyrightwarning' => 'ūsų pakeitimai įsigalios iškart.</div>
-* Jei norite tik išmėginti redagavimą, naudokite [[{{ns:project}}:Sandbox|smėlio dėžę]].
-* KÅ«rimas, redagavimas ir tobulinimas yra skatinami; taÄiau, netikÄ™ keitimai bus greitai atmesti.
-* \'\'\'Nepamirškite \'\'cituoti šaltinių\'\', kad kiti galėtų įsitikinti, kad pakeitimai teisingi.
-----
-NEKOPIJUOKITE AUTORINĖMIS TEISĖMIS APSAUGOTŲ DARBŲ BE LEIDIMO!
-
-*Viskam, kas patenka į projektąą, yra taikoma GNU Laisvos Documentacijos Licencija (detaliau - $1).
-*\'\'\'Jei nepageidaujate, kad jÅ«sų įvestas turinys bÅ«tų negailestingai redaguojamas ir platinamas, neraÅ¡ykite Äia.\'\'\'
-* JÅ«s taip pat pasižadate, kad tai jÅ«sų paÄių raÅ¡ytas turinys arba kopijuotas iÅ¡ viešų ar panaÅ¡ių nemokamų Å¡altinių (dauguma internetinių puslapių nepatenka į viešų Å¡altinių kategorijÄ…).',
-'couldntremove' => 'Nepavyko pašalinti \'$1\'...',
-'createaccount' => 'Sukurti vartotojÄ…',
-'createaccountmail' => 'el.paštu',
-'createarticle' => 'Kurti straipsnį',
-'created' => 'sukurta',
-'cur' => 'dab',
-'currentevents' => '-',
-'currentevents-url' => '-',
-'currentrev' => 'DabartinÄ— versija',
-'currentrevisionlink' => 'žiūrėti esamą versiją',
-'data' => 'Duomenys',
-'databaseerror' => 'Duomenų bazės klaida',
-'dateformat' => 'Datos formatas',
-'dberrortext' => 'Įvyko duomenų bazės užklausos klaida.
-Tai galėjo būti dėl neteisingos paieškos užklausos (žiūr. $5),
-arba dėl klaidos programinėje įrangoje.
+'skinpreview' => '(Peržiūra)',
+
+# Dates
+'sunday' => 'sekmadienis',
+'monday' => 'pirmadienis',
+'tuesday' => 'antradienis',
+'wednesday' => 'treÄiadienis',
+'thursday' => 'ketvirtadienis',
+'friday' => 'penktadienis',
+'saturday' => 'šeštadienis',
+'sun' => 'Sek',
+'mon' => 'Pir',
+'tue' => 'Ant',
+'wed' => 'Tre',
+'thu' => 'Ket',
+'fri' => 'Pen',
+'sat' => 'Šeš',
+'january' => 'sausio',
+'february' => 'vasario',
+'march' => 'kovo',
+'april' => 'balandžio',
+'may_long' => 'gegužės',
+'june' => 'birželio',
+'july' => 'liepos',
+'august' => 'rugpjÅ«Äio',
+'september' => 'rugsÄ—jo',
+'october' => 'spalio',
+'november' => 'lapkriÄio',
+'december' => 'gruodžio',
+'january-gen' => 'Sausis',
+'february-gen' => 'Vasaris',
+'march-gen' => 'Kovas',
+'april-gen' => 'Balandis',
+'may-gen' => 'Gegužė',
+'june-gen' => 'Birželis',
+'july-gen' => 'Liepa',
+'august-gen' => 'Rugpjūtis',
+'september-gen' => 'RugsÄ—jis',
+'october-gen' => 'Spalis',
+'november-gen' => 'Lapkritis',
+'december-gen' => 'Gruodis',
+'jan' => 'sau',
+'feb' => 'vas',
+'mar' => 'kov',
+'apr' => 'bal',
+'may' => 'geg',
+'jun' => 'bir',
+'jul' => 'lie',
+'aug' => 'rgp',
+'sep' => 'rgs',
+'oct' => 'spa',
+'nov' => 'lap',
+'dec' => 'grd',
+
+# Bits of text used by many pages
+'categories' => 'Kategorijos',
+'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorijos}}',
+'category_header' => 'Kategorijos "$1" straipsniai',
+'subcategories' => 'Subkategorijos',
+'category-media-header' => 'Media kategorijoje "$1"',
+
+'mainpage' => 'Pradžia',
+'mainpagetext' => "<big>'''MediaWiki sėkmingai įdiegta.'''</big>",
+'mainpagedocfooter' => 'Informacijos apie wiki programinės įrangos naudojimą, ieškokite [http://meta.wikimedia.org/wiki/Help:Contents žinyne].
+
+== Pradžiai ==
+
+* [http://www.mediawiki.org/wiki/Help:Configuration_settings Konfigūracijos nustatymų sąrašas]
+* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki DUK]
+* [http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki pranešimai paštu apie naujas versijas]',
+
+'portal' => 'BendruomenÄ—',
+'portal-url' => '{{ns:project}}:BendruomenÄ—',
+'about' => 'Apie',
+'aboutsite' => 'Apie {{SITENAME}}',
+'aboutpage' => '{{ns:project}}:Apie',
+'article' => 'Turinys',
+'help' => 'Pagalba',
+'helppage' => '{{ns:help}}:Turinys',
+'bugreports' => 'Pranešti apie klaidą',
+'bugreportspage' => '{{ns:project}}:Klaidų pranešimai',
+'sitesupport' => 'Parama',
+'sitesupport-url' => '{{ns:project}}:SvetainÄ—s palaikymas',
+'faq' => 'DUK',
+'faqpage' => '{{ns:project}}:DUK',
+'edithelp' => 'Kaip redaguoti',
+'newwindow' => '(atsidaro naujame lange)',
+'edithelppage' => '{{ns:help}}:Redagavimas',
+'cancel' => 'Atšaukti',
+'qbfind' => 'Paieška',
+'qbbrowse' => 'Naršymas',
+'qbedit' => 'Redagavimas',
+'qbpageoptions' => 'Å is puslapis',
+'qbpageinfo' => 'Kontekstas',
+'qbmyoptions' => 'Mano puslapiai',
+'qbspecialpages' => 'Specialieji puslapiai',
+'moredotdotdot' => 'Daugiau...',
+'mypage' => 'Mano puslapis',
+'mytalk' => 'Mano aptarimas',
+'anontalk' => 'Å io IP aptarimas',
+'navigation' => 'Navigacija',
+
+# Metadata in edit box
+'metadata_help' => 'Metaduomenys (žiūrėkite [[{{ns:project}}:Metaduomenys]] paaiškinimui):',
+
+'currentevents' => 'Naujienos',
+'currentevents-url' => 'Naujienos',
+
+'disclaimers' => 'Jokių Garantijų',
+'disclaimerpage' => '{{ns:project}}:Jokių garantijų',
+'privacy' => 'Privatumo politika',
+'privacypage' => '{{ns:project}}:Privatumo politika',
+'errorpagetitle' => 'Klaida',
+'returnto' => 'Grįžti į $1.',
+'tagline' => 'Straipsnis iš {{SITENAME}}.',
+'search' => 'Paieška',
+'searchbutton' => 'Paieška',
+'go' => 'Rodyti',
+'searcharticle' => 'Rodyti',
+'history' => 'Puslapio istorija',
+'history_short' => 'Istorija',
+'updatedmarker' => 'atnaujinta nuo paskutinio mano apsilankymo',
+'info_short' => 'Informacija',
+'printableversion' => 'Versija spausdinimui',
+'permalink' => 'NuolatinÄ— nuoroda',
+'print' => 'Spausdinti',
+'edit' => 'Redaguoti',
+'editthispage' => 'Redaguoti šį puslapį',
+'delete' => 'Trinti',
+'deletethispage' => 'Ištrinti šį puslapį',
+'undelete_short' => 'Atstatyti $1 {{plural:$1:redagavimą|redagavimus|redagavimų}}',
+'protect' => 'Užrakinti',
+'protectthispage' => 'Rakinti šį puslapį',
+'unprotect' => 'Atrakinti',
+'unprotectthispage' => 'Atrakinti šį puslapį',
+'newpage' => 'Naujas puslapis',
+'talkpage' => 'Aptarti šį puslapį',
+'specialpage' => 'Specialusis puslapis',
+'personaltools' => 'Asmeniniai įrankiai',
+'postcomment' => 'Rašyti komentarą',
+'articlepage' => 'Rodyti turinio puslapį',
+'talk' => 'Aptarimas',
+'views' => 'Žiūrėti',
+'toolbox' => 'Įrankiai',
+'userpage' => 'Rodyti naudotojo puslapį',
+'projectpage' => 'Rodyti projekto puslapį',
+'imagepage' => 'Žiūrėti paveikslėlio puslapį',
+'mediawikipage' => 'Rodyti pranešimo puslapį',
+'templatepage' => 'Rodyti šablono puslapį',
+'viewhelppage' => 'Rodyti pagalbos puslapį',
+'categorypage' => 'Rodyti kategorijos puslapį',
+'viewtalkpage' => 'Rodyti aptarimo puslapį',
+'otherlanguages' => 'Kitomis kalbomis',
+'redirectedfrom' => '(Nukreipta iš $1)',
+'redirectpagesub' => 'Nukreipimo puslapis',
+'lastmodifiedat' => 'Šis puslapis paskutinį kartą keistas $1 $2.', # $1 date, $2 time
+'viewcount' => 'Šis puslapis buvo atvertas $1 {{plural:$1|kartą|kartus|kartų}}.',
+'copyright' => 'Turinys pateikiamas su $1 licencija.',
+'protectedpage' => 'Užrakintas puslapis',
+'jumpto' => 'Peršokti į:',
+'jumptonavigation' => 'navigacijÄ…',
+'jumptosearch' => 'paiešką',
+
+'badaccess' => 'Teisių klaida',
+'badaccess-group0' => 'Jums neleidžiama įvykdyti veiksmo, kurio prašėte.',
+'badaccess-group1' => 'Veiksmas, kurio prašėte, galimas tik $1 grupės naudotojams.',
+'badaccess-group2' => 'Veiksmas, kurio prašėte, galimas tik naudotojams, esantiems vienoje iš šių grupių $1.',
+'badaccess-groups' => 'Veiksmas, kurio prašėte, galimas tik naudotojams, esantiems vienoje iš šių grupių $1.',
+
+'versionrequired' => 'Reikalinga $1 MediaWiki versija',
+'versionrequiredtext' => 'Reikalinga $1 MediaWiki versija, kad pamatytumėte šį puslapį. Žiūrėkite [[{{ns:special}}:Version]]',
+
+'ok' => 'Gerai',
+'pagetitle' => '$1 - {{SITENAME}}',
+'retrievedfrom' => 'Gauta iš "$1"',
+'youhavenewmessages' => 'JÅ«s turite $1 ($2).',
+'newmessageslink' => 'naujų žinuÄių',
+'newmessagesdifflink' => 'paskutinis pakeitimas',
+'editsection' => 'taisyti',
+'editold' => 'taisyti',
+'editsectionhint' => 'Redaguoti skyrelį: $1',
+'toc' => 'Turinys',
+'showtoc' => 'rodyti',
+'hidetoc' => 'slÄ—pti',
+'thisisdeleted' => 'Žiūrėti ar atkurti $1?',
+'viewdeleted' => 'Rodyti $1?',
+'restorelink' => '$1 {{plural:$1|ištrintą keitimą|ištrintus keitimus|ištrintų keitimų}}',
+'feedlinks' => 'Kanalas:',
+'feed-invalid' => 'Neleistinas kanalo tipas.',
+
+# Short words for each namespace, by default used in the 'article' tab in monobook
+'nstab-main' => 'Straipsnis',
+'nstab-user' => 'Naudotojo puslapis',
+'nstab-media' => 'Media puslapis',
+'nstab-special' => 'Specialus',
+'nstab-project' => 'Projekto puslapis',
+'nstab-image' => 'Failas',
+'nstab-mediawiki' => 'Pranešimas',
+'nstab-template' => 'Å ablonas',
+'nstab-help' => 'Pagalbos puslapis',
+'nstab-category' => 'Kategorija',
+
+# Main script and global functions
+'nosuchaction' => 'NÄ—ra tokio veiksmo',
+'nosuchactiontext' => 'Veiksmas, nurodytas adrese, neatpažintas',
+'nosuchspecialpage' => 'NÄ—ra tokio specialiojo puslapio',
+'nospecialpagetext' => 'Jūs prašėte neleistino specialiojo puslapio, leistinų specialiųjų puslapių sąrašas rasite [[{{ns:special}}:Specialpages]].',
+
+# General errors
+'error' => 'Klaida',
+'databaseerror' => 'Duomenų bazės klaida',
+'dberrortext' => 'Įvyko duomenų bazės užklausos sintaksės klaida.
+Tai gali reikšti klaidą programinėje įrangoje.
Paskutinė mėginta duomenų bazės užklausa buvo:
<blockquote><tt>$1</tt></blockquote>
iš funkcijos: "<tt>$2</tt>".
-Klaida: "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Įvyko duomenų bazės užklausos klaida.
+MySQL grąžino klaidą "<tt>$3: $4</tt>".',
+'dberrortextcl' => 'Įvyko duomenų bazės užklausos sintaksės klaida.
Paskutinė mėginta duomenų bazės užklausa buvo:
+"$1"
+iš funkcijos: "$2".
+MySQL grąžino klaidą "$3: $4".',
+'noconnect' => 'Atsiprašome, bet projektas turi techninių nesklandumų, ir negali prisijungti prie duomenų bazės. <br />
+$1',
+'nodb' => 'Nepavyksta pasirinkti duomenų bazės $1',
+'cachederror' => 'Pateiktas išsaugota prašomo puslapio kopija, ji gali būti pasenusi.',
+'laggedslavemode' => 'Dėmesio: Puslapyje gali nesimatyti naujausių pakeitimų.',
+'readonly' => 'Duomenų bazė užrakinta',
+'enterlockreason' => 'Įveskite užrakinimo priežastį, taip pat maždaug kada bus atrakinta',
+'readonlytext' => 'Duomenų bazė šiuo metu yra užrakinta naujiems įrašams ar kitiems keitimams,
+turbūt duomenų bazės techninei profilaktikai,
+po to viskas vėl veiks kaip įprasta.
- $1
-
-iš funkcijos: "$2". Klaida: "$3: $4".',
-'deadendpages' => 'Straipsniai-aklavietÄ—s',
-'dec' => 'Gru',
-'december' => 'Gruodžio',
-'defaultns' => 'Pagal nutylėjimą ieškoti šiose vardų erdvėse:',
-'defemailsubject' => '{{SITENAME}} e-mail',
-'delete' => 'trinti',
-'delete_and_move' => 'Perkelti ištrinant',
-'delete_and_move_reason' => 'IÅ¡trinta perkeliant Deleted',
-'deletecomment' => 'Trynimo priežastis',
-'deletedarticle' => 'ištrynė "$1"',
-'deletedrev' => '[ištrinta]',
-'deletedrevision' => 'IÅ¡trinta sena versija $1.',
-'deletedtext' => 'Straipsnis "$1" ištrintas.
-Šalinimų sąrašas - $2.',
-'deletedwhileediting' => 'Dėmesio: Šis puslapis ištrintas po to, kai pradėjote redaguoti!',
-'deleteimg' => 'trinti',
-'deleteimgcompletely' => 'IÅ¡trinti visas versijas',
-'deletepage' => 'Trinti puslapį',
-'deletesub' => '(Trinama "$1")',
-'deletethispage' => 'Ištrinti straipsnį',
-'deletionlog' => 'šalinimų sąrašas',
-'dellogpage' => 'Šalinimų_sąrašas',
-'dellogpagetext' => 'Žemiau pateikiamas sąrašas paskutiniu metu pašalintų straipsnių.',
-'destfilename' => 'Norimas failo vardas',
-'diff' => 'skirt',
-'difference' => '(Skirtumai tarp versijų)',
-'disambiguations' => 'Nukreipiamieji puslapiai',
-'disambiguationstext' => 'Žemiau išvardinti straipsniai, rodantys į <i>nukreipiamuosius puslapius</i>. Nuorodos turėtų būti patikslintos kad rodytų į konkretų straipsnį.<br />Puslapis skaitomas nukreipiamuoju, jei nuoroda į jį yra $1.<br />',
-'disclaimers' => 'Jokių Garantijų',
-'doubleredirects' => 'Dvigubi peradresavimai',
+Užrakinusiojo administratoriaus pateiktas rakinimo paaiškinimas: $1',
+'missingarticle' => 'Duomenų bazei nepavyksta rasti puslapio "$1" teksto.
+
+Paprastai tai sukelia pasenusi skirtumų ar istorijos nuoroda į puslapį, kuris buvo ištrintas.
+
+Jei tai ne toks atvejis, galbūt jūs aptikote klaidą programinėje įrangoje.
+Prašome pranešti apie tai administratoriui, taip pat nurodant ir URL.',
+'readonly_lag' => 'Duomenų bazė buvo automatiškai užrakinta, kol pagalbinės duomenų bazės prisivys pagrindinę',
+'internalerror' => 'VidinÄ— klaida',
+'filecopyerror' => 'Nepavyksta kopijuoti failo iš "$1" į "$2".',
+'filerenameerror' => 'Nepavyksta pervardinti failo iš "$1" į "$2".',
+'filedeleteerror' => 'Nepavyksta ištrinti failo "$1".',
+'filenotfound' => 'Nepavyksta rasti failo "$1".',
+'unexpected' => 'Netikėta reikšmė: "$1"="$2".',
+'formerror' => 'Klaida: nepavyko apdoroti formos duomenų',
+'badarticleerror' => 'Veiksmas negalimas Å¡iam puslapiui.',
+'cannotdelete' => 'Nepavyko ištrinti nurodyto puslapio ar failo. (Galbūt jį jau kažkas ištrynė)',
+'badtitle' => 'Blogas pavadinimas',
+'badtitletext' => 'Nurodytas puslapio pavadinimas buvo neleistinas, tuÅ¡Äias arba neteisingai sujungtas tarpkalbinis arba tarpprojektinis pavadinimas. Jame gali bÅ«ti vienas ar daugiau simbolių, neleistinų pavadinimuose',
+'perfdisabled' => 'AtsipraÅ¡ome, bet Å¡i funkcija yra laikinai iÅ¡jungta, nes tai ypaÄ sulÄ—tina duomenų bazÄ™ taip, kad daugiau niekas negali naudotis projektu.',
+'perfdisabledsub' => 'Tai išsaugota puslapio kopija iš $1:', # obsolete?
+'perfcached' => 'Rodoma išsaugota duomenų kopija, todėl duomenys gali būti ne patys naujausi.',
+'perfcachedts' => 'Rodoma išsaugota duomenų kopija, kuri buvo atnaujinta $1.',
+'wrong_wfQuery_params' => 'Neteisingi parametrai į funkciją wfQuery()<br />
+Funkcija: $1<br />
+Užklausa: $2',
+'viewsource' => 'Žiūrėti kodą',
+'viewsourcefor' => 'puslapiui $1',
+'protectedpagetext' => 'Šis puslapis yra užrakintas, saugant jį nuo redagavimo.',
+'viewsourcetext' => 'Jūs galite žiūrėti ir kopijuoti puslapio kodą:',
+'protectedinterface' => 'Šiame puslapyje yra programinės įrangos sąsajos tekstas ir yra apsaugotas, kad būtų apsisaugota nuo piktnaudžiavimo.',
+'editinginterface' => "'''Dėmesio:''' Jūs redaguojate puslapį, kuris yra naudojamas programinės įrangos sąsajos tekste. Pakeitimai šiame puslapyje taip pat pakeis naudotojo sąsajos išvaizdą ir kitiems naudojams.",
+'sqlhidden' => '(SQL užklausa paslėpta)',
+
+# Login and logout pages
+'logouttitle' => 'Naudotojo atsijungimas',
+'logouttext' => '<strong>Dabar jūs esate atsijungęs.</strong><br />
+Galite toliau naudoti {{SITENAME}} anonimiÅ¡kai arba prisijunkite iÅ¡ naujo tuo paÄiu ar kitu naudotoju.
+Pastaba: kai kuriuose puslapiuose ir toliau gali rodyti lyg būtumėte prisijungęs iki tol, kol išvalysite savo naršyklės podėlį',
+'welcomecreation' => '== Sveiki, $1! ==
+
+Jūsų paskyra buvo sukurta. Nepamirškite pakeisti savo {{SITENAME}} nustatymų.',
+'loginpagetitle' => 'Prisijungimas',
+'yourname' => 'Naudotojo vardas',
+'yourpassword' => 'Slaptažodis',
+'yourpasswordagain' => 'Pakartokite slaptažodį',
+'remembermypassword' => 'Prisiminti Å¡iÄ… informacijÄ… Å¡iame kompiuteryje',
+'yourdomainname' => 'Jūsų domenas',
+'externaldberror' => 'Yra arba išorinė autorizacijos duomenų bazės klaida arba jums neleidžiama atnaujinti jūsų išorinės paskyros.',
+'loginproblem' => '<b>Problemos su jūsų prisijungimu.</b><br />Pabandykite iš naujo!',
+'alreadyloggedin' => '<strong>Jūs jau esate prisijungęs kaip naudotojas $1!</strong><br />',
+'login' => 'Prisijungti',
+'loginprompt' => 'Įjunkite slapukus, jei norite prisijungti prie {{SITENAME}}.',
+'userlogin' => 'Prisijungti / sukurti paskyrÄ…',
+'logout' => 'Atsijungti',
+'userlogout' => 'Atsijungti',
+'notloggedin' => 'Neprisijungęs',
+'nologin' => 'Neturite prisijungimo vardo? $1.',
+'nologinlink' => 'Sukurkite paskyrÄ…',
+'createaccount' => 'Sukurti paskyrÄ…',
+'gotaccount' => 'Jau turite paskyrÄ…? $1.',
+'gotaccountlink' => 'Prisijunkite',
+'createaccountmail' => 'el. paštu',
+'badretype' => 'Įvesti slaptažodžiai nesutampa.',
+'userexists' => 'Įvestasis naudotojo vardas jau naudojamas. Prašome pasirinkti kitą vardą.',
+'youremail' => 'El. pašto adresas *:',
+'username' => 'Naudotojo vardas:',
+'uid' => 'Naudotojo ID:',
+'yourrealname' => 'Jūsų tikras vardas *:',
+'yourlanguage' => 'SÄ…sajos kalba:',
+'yourvariant' => 'Variantas',
+'yournick' => 'Slapyvardis:',
+'badsig' => 'Neteisingas parašas; patikrinkite HTML žymes.',
+'email' => 'El. paštas',
+'prefs-help-email-enotif' => 'Šis adresas tai pat naudojamas siųsti pranešimus, jei pasirinkote tokius pranešimus gauti.',
+'prefs-help-realname' => '* Tikras vardas (neprivaloma): jei jūs jį įvesite, jis bus naudojamas jūsų darbo pažymėjimui.',
+'loginerror' => 'Prisijungimo klaida',
+'prefs-help-email' => '* El. paštas (neprivalomas): Leidžia kitiems pasiekti jus per naudotojo ar naudotojo aptarimą neatskleidžiant jūsų tapatybės.',
+'nocookiesnew' => 'Naudotojo paskyra buvo sukurta, bet jūs nesate prisijungęs. {{SITENAME}} naudoja slapukus, kad prijungtų naudotojus. Jūs esate išjungę slapukus. Prašome įjungti juos, tada prisijunkite su savo naujuoju naudotojo vardu ir slaptažodžiu.',
+'nocookieslogin' => '{{SITENAME}} naudoja slapukus, kad prijungtų naudotojus. Jūs esate išjungę slapukus. Prašome įjungti juos ir pamėginkite vėl.',
+'noname' => 'Jūs nesate nurodęs teisingo naudotojo vardo.',
+'loginsuccesstitle' => 'SÄ—kmingai prisijungÄ—te',
+'loginsuccess' => '\'\'\'Dabar jūs prisijungęs prie {{SITENAME}} kaip "$1".\'\'\'',
+'nosuchuser' => 'Nėra jokio naudotojo pavadinto "$1". Patikrinkite rašybą, arba sukurkite naują paskyrą.',
+'nosuchusershort' => 'Nėra jokio naudotojo pavadinto "$1". Patikrinkite rašybą.',
+'nouserspecified' => 'Jums reikia nurodyti naudotojo vardÄ….',
+'wrongpassword' => 'Įvestas neteisingas slaptažodis. Pamėginkite dar kartą.',
+'wrongpasswordempty' => 'Ä®vestas slaptažodis yra tuÅ¡Äias. PamÄ—ginkite vÄ—l.',
+'mailmypassword' => 'Atsiųsti slaptažodį paštu',
+'passwordremindertitle' => 'Slaptažodžio priminimas iš {{SITENAME}}',
+'passwordremindertext' => 'Kažkas (tikriausiai jūs, IP adresu $1)
+paprašė, kad atsiųstumėte naują slaptažodį projektui {{SITENAME}} ($4).
+Naudotojo "$2" slaptažodis dabar yra "$3".
+Jūs turėtumėte prisijungti ir dabar pakeisti savo slaptažodį.
+
+Jei kažkas kitas atliko šį prašymą arba jūs prisiminėte savo slaptažodį ir
+nebenorite jo pakeisti, jūs galite tiesiog nekreipti dėmėsio į šį laišką ir toliau
+naudotis savo senuoju slaptažodžiu.',
+'noemail' => 'Nėra jokio el. pašto adreso įvesto naudotojui "$1".',
+'passwordsent' => 'Naujas slaptažodis buvo nusiųstas į el. pašto adresą,
+užregistruotą naudotojo "$1".
+Prašome prisijungti vėl, kai jūs jį gausite.',
+'blocked-mailpassword' => 'Jūsų IP adresas yra užblokuotas nuo redagavimo, taigi neleidžiama naudoti slaptažodžio priminimo funkcijos, kad apsisaugotume nuo piktnaudžiavimo.',
+'eauthentsent' => 'Patvirtinimo laiškas buvo nusiųstas į paskirtąjį el. pašto adresą.
+PrieÅ¡ iÅ¡siunÄiant kitÄ… laiÅ¡kÄ… į jÅ«sų dėžutÄ™, jÅ«s turite vykdyti nurodymus laiÅ¡ke, kad patvirtintumÄ—te, kad dėžutÄ— tikrai yra jÅ«sų.',
+'throttled-mailpassword' => 'Slaptažodžio priminimas jau buvo išsiųstas, per paskutinias $1 valandas. Norint apsisaugoti nuo piktnaudžiavimo, slaptažodžio priminimas gali būti išsiųstas tik kas $1 valandas.',
+'mailerror' => 'Klaida siunÄiant paÅ¡tÄ…: $1',
+'acct_creation_throttle_hit' => 'Atleiskite, bet jūs jau sukūrėte $1 paskyras. Daugiau nebegalima.',
+'emailauthenticated' => 'Jūsų el. pašto adresas buvo patvirtintas $1.',
+'emailnotauthenticated' => 'Jūsų el. pašto adresas dar nėra patvirtintas. Jokie laiškai
+nebus siunÄiami nei vienai žemiau iÅ¡vardintai paslaugai.',
+'noemailprefs' => 'Nurodykite el. pašto adresą, kad šios funkcijos veiktų.',
+'emailconfirmlink' => 'Patvirtinkite savo el. pašto adresą',
+'invalidemailaddress' => 'El. paÅ¡to adresas negali bÅ«ti priimtas, nes atrodo, kad jis nÄ—ra teisingo formato. PraÅ¡ome įvesti gerai suformuotÄ… adresÄ… arba palikite tÄ… laukelį tuÅ¡ÄiÄ….',
+'accountcreated' => 'Paskyra sukurta',
+'accountcreatedtext' => 'Naudotojo paskyra $1 buvo sukurta.',
+
+# Password reset dialog
+'resetpass' => 'Paskyros slaptažodžio atstatymas',
+'resetpass_announce' => 'JÅ«s prisijungÄ—te su atsiųstu laikinuoju kodu. NorÄ—dami užbaigti prisijungimÄ…, Äia jums reikia nustatyti naujÄ…jį slaptažodį:',
+'resetpass_text' => '<!-- Ä®terpkite Äia tekstÄ… -->',
+'resetpass_header' => 'Atstatyti slaptažodį',
+'resetpass_submit' => 'Nustatyti slaptažodį ir prisijungti',
+'resetpass_success' => 'Jūsų slaptažodis pakeistas sėkmingai! Dabar prisijungiama...',
+'resetpass_bad_temporary' => 'Neteisingas laikinasis slaptažodis. Galbūt jūs jau sėkmingai pakeitėte savo slaptažodį arba paprašėte naujo laikino slaptažodžio.',
+'resetpass_forbidden' => 'Šiame projekte slaptažodžiai negali būti pakeisti',
+'resetpass_missing' => 'Nėra formos duomenų.',
+
+# Edit page toolbar
+'bold_sample' => 'Paryškintas tekstas',
+'bold_tip' => 'Paryškinti tekstą',
+'italic_sample' => 'Tekstas kursyvu',
+'italic_tip' => 'Tekstas kursyvu',
+'link_sample' => 'Nuorodos pavadinimas',
+'link_tip' => 'VidinÄ— nuoroda',
+'extlink_sample' => 'http://www.pavyzdys.lt nuorodos pavadinimas',
+'extlink_tip' => 'Išorinė nuoroda (nepamirškite http:// priedėlio)',
+'headline_sample' => 'Skyriaus pavadinimas',
+'headline_tip' => 'Antro lygio skyriaus pavadinimas',
+'math_sample' => 'Įveskite formulę',
+'math_tip' => 'MatematinÄ— formulÄ— (LaTeX formatu)',
+'nowiki_sample' => 'Čia įterpkite neformuotą tekstą',
+'nowiki_tip' => 'Ignoruoti wiki formatÄ…',
+'image_sample' => 'Pavyzdys.jpg',
+'image_tip' => 'Įdėti paveiksėlį',
+'media_sample' => 'Pavyzdys.ogg',
+'media_tip' => 'Nuoroda į media failą',
+'sig_tip' => 'Jūsų parašas bei laikas',
+'hr_tip' => 'Horizontali linija (naudokite taupiai)',
+
+# Edit pages
+'summary' => 'Komentaras',
+'subject' => 'Tema/antraštė',
+'minoredit' => 'Tai smulkus pataisymas',
+'watchthis' => 'Stebėti šį puslapį',
+'savearticle' => 'Išsaugoti puslapį',
+'preview' => 'Peržiūra',
+'showpreview' => 'Rodyti peržiūrą',
+'showlivepreview' => 'Tiesioginė peržiūra',
+'showdiff' => 'Rodyti skirtumus',
+'anoneditwarning' => "'''Dėmesio:''' Jūs nesate prisijungęs. Jūsų IP adresas bus įrašytas į šio puslapio istoriją.",
+'missingsummary' => "'''Priminimas:''' Jūs nenurodėte keitimo komentaro. Jei vėl paspausite Saugoti, jūsų keitimas bus išsaugotas be jo.",
+'missingcommenttext' => 'Prašome įvesti komentarą.',
+'missingcommentheader' => "'''Priminimas:''' Jūs nenurodėte skyrelio/antraštės šiam komentarui. Jei vėl paspausite Saugoti, jūsų keitimas bus išsaugotas be jo.",
+'summary-preview' => 'Komentaro peržiūra',
+'subject-preview' => 'Skyrelio/antraštės peržiūra',
+'blockedtitle' => 'Naudotojas yra užblokuotas',
+'blockedtext' => "<big>'''Jūsų naudotojo vardas arba IP adresas yra užblokuotas.'''</big>
+
+Užblokavo $1. Nurodyta priežastis yra ''$2''.
+
+JÅ«s galite susisiekti su $1 arba kitu
+[[{{ns:project}}:Administrators|administratoriumi]] aptarti užblokavimą.
+Jūs negalite naudoti funkcija 'Rašyti laišką šiam naudotojui', jei nesate pateikę tikro savo el. pašto adreso savo [[{{ns:special}}:Preferences|paskyros nustatymuose]]. Jūsų IP adresas yra $3, o bloko ID yra #$5. Prašome nurodyti vieną ar abu juos, kai kreipiatės dėl blokavimo.",
+'blockedoriginalsource' => "Žemiau yra rodomas '''$1''' turinys:",
+'blockededitsource' => "''Jūsų keitimų''' tekstas puslapiui '''$1''' yra rodomas žemiau:",
+'whitelistedittitle' => 'Norint redaguoti reikia prisijungti',
+'whitelistedittext' => 'JÅ«s turite $1, kad redaguotumÄ—te puslapius.',
+'whitelistreadtitle' => 'Norint skaityti reikia prisijungti',
+'whitelistreadtext' => 'Jums reikia [[{{ns:special}}:Userlogin|prisijungti]], kad skaitytumÄ—te puslapius.',
+'whitelistacctitle' => 'Jums neleidžiama kurti paskyros',
+'whitelistacctext' => 'NorÄ—dami leisti kurti paskyras Å¡iame projekte, jums reikia [[{{ns:special}}:Userlogin|prisijungti]] ir turÄ—ti atitinkamas teises.',
+'confirmedittitle' => 'Reikalingas el. pašto patvirtinimas, kad redaguotumėte',
+'confirmedittext' => 'Jums reikia patvirtinti el. pašto adresą, prieš redaguojant puslapius. Prašome nurodyti ir patvirtinti jūsų el. pašto adresą per jūsų [[{{ns:special}}:Preferences|naudotojo nustatymus]].',
+'loginreqtitle' => 'Reikalingas prisijungimas',
+'loginreqlink' => 'prisijungti',
+'loginreqpagetext' => 'Jums reikia $1, kad matytumÄ—te kitus puslapius.',
+'accmailtitle' => 'Slaptažodis išsiųstas.',
+'accmailtext' => "Naudotojo '$1' slaptažodis nusiųstas į $2.",
+'newarticle' => '(Naujas)',
+'newarticletext' => "Jūs patekote į dar neegzistuojantį puslapį.
+NorÄ—dami sukurti puslapį, pradÄ—kite raÅ¡yti žemiau esanÄiame įvedimo lauke
+(plaÄiau [[{{ns:help}}:Kaip pradÄ—ti puslapį|apie puslapių kÅ«rimÄ…]]).
+Jei patekote Äia per klaidÄ…, paprasÄiausiai spustelkite narÅ¡yklÄ—s mygtukÄ… '''atgal'''.",
+'anontalkpagetext' => "----''Tai yra anoniminio naudotojo, nesusikÅ«rusio arba nenaudojanÄio paskyros, aptarimų puslapis. DÄ—l to naudojamas IP adresas jo identifikavimui. Å is IP adresas gali bÅ«ti dalinamas keliems naudotojams. Jeigu JÅ«s esate anoniminis naudotojas ir atrodo, kad komentarai nÄ—ra skirti Jums, [[{{ns:special}}:Userlogin|sukurkite paskyrÄ… arba prisijunkite]], ir nebÅ«site tapatinamas su kitais anoniminiais naudotojais.''",
+'noarticletext' => 'Šiuo metu šiame puslapyje nėra jokio teksto, jūs galite [[{{ns:special}}:Search/{{PAGENAME}}|ieškoti šio puslapio pavadinimo]] kituose puslapiuose arba [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaguoti šį puslapį].',
+'clearyourcache' => "'''DÄ—mesio:''' IÅ¡saugojÄ™ jums gali prireikti iÅ¡valyti jÅ«sų narÅ¡yklÄ—s podÄ—lį, kad pamatytumÄ—te pokyÄius. '''Mozilla / Safari / Konqueror:''' laikydami ''Shift'' pasirinkite ''Atsiųsti iÅ¡ naujo'', arba paspauskite ''Ctrl-Shift-R'' (sistemoje Apple Mac ''Cmd-Shift-R''); '''IE:''' laikydami ''Ctrl'' paspauskite ''Atnaujinti'', arba paspauskite ''Ctrl-F5''; '''Konqueror:''' tiesiog paspauskite ''Perkrauti'' mygtukÄ…, arba paspauskite ''F5''; '''Opera''' naudotojams gali prireikti pilnai iÅ¡valyti jų podÄ—lį ''PriemonÄ—s→Nuostatos''.",
+'usercssjsyoucanpreview' => "<strong>Patarimas:</strong> Naudokite 'Rodyti peržiūrą' mygtuką, kad išmėgintumėte savo naująjį CSS/JS prieš išsaugant.",
+'usercsspreview' => "'''Nepamirškite, kad jūs tik peržiūrit savo naudotojo CSS, jis dar nebuvo išsaugotas!'''",
+'userjspreview' => "'''Nepamirškite, kad jūs tik testuojat/peržiūrit savo naudotojo JavaScript, jis dar nebuvo išsaugotas!'''",
+'userinvalidcssjstitle' => '\'\'\'Dėmesio:\'\'\' Nėra jokios išvaizdos "$1". Nepamirškite, kad savo .css ir .js puslapiai naudoja pavadinimą mažosiomis raidėmis, pvz., {{ns:user}}:Foo/monobook.css, o ne {{ns:user}}:Foo/Monobook.css.',
+'updated' => '(Atnaujinta)',
+'note' => '<strong>Pastaba:</strong>',
+'previewnote' => '<strong>Nepamirškite, kad tai tik peržiūra, pakeitimai dar nėra išsaugoti!</strong>',
+'previewconflict' => 'Ši peržiūra parodo tekstą iš viršutiniojo teksto redagavimo lauko taip, kaip jis bus rodomas, jei pasirinksite išsaugoti.',
+'session_fail_preview' => '<strong>Atsiprašome! Mes negalime vykdyti jūsų keitimo dėl sesijos duomenų praradimo.
+Prašome pamėginti vėl. Jei tai nepadeda, pamėginkite atsijungti ir prisijungti atgal.</strong>',
+'session_fail_preview_html' => "<strong>Atsiprašome! Mes vykdyti apdoroti jūsų keitimo dėl sesijos duomenų praradimo.</strong>
+
+''Kadangi šiame projekte grynasis HTML yra įjungtas, peržiūra yra paslėpta kaip atsargumo priemonė prieš JavaScript atakas.''
+
+<strong>Jei tai teisėtas keitimo bandymas, prašome pamėginti vėl. Jei tai nepadeda, pamėginkite atsijungti ir prisijungti atgal.</strong>",
+'importing' => 'Importuojama $1',
+'editing' => 'Taisomas $1',
+'editinguser' => 'Taisomas naudotojas <b>$1</b>',
+'editingsection' => 'Taisomas $1 (skyrelis)',
+'editingcomment' => 'Taisomas $1 (komentaras)',
+'editconflict' => 'Išpręskite konfliktą: $1',
+'explainconflict' => 'Kažkas kitas jau pakeitė puslapį nuo tada, kai jūs pradėjote jį redaguoti.
+Viršutiniame tekstiniame lauke pateikta šiuo metu esanti puslapio versija.
+JÅ«sų keitimai pateikti žemiau esanÄiame lauke.
+Jums reikia sujungti jÅ«sų pakeitimus su esanÄia versija.
+Paspaudus "Išsaugoti", užsaugotas bus
+<b>tik</b> tekstas viršutiniame tekstiniame lauke.<br />',
+'yourtext' => 'Jūsų tekstas',
+'storedversion' => 'IÅ¡saugota versija',
+'nonunicodebrowser' => '<strong>ĮSPĖJIMAS: Jūsų naršyklė nepalaiko unikodo. Todėl, tam kad saugiai redaguotumėte straipsnį, redagavimo lauke vietoj ne ASCII simbolių bus rodomi šešioliktainiai kodai.</strong>',
+'editingold' => '<strong>Ä®SPÄ–JIMAS: JÅ«s keiÄiate ne naujausiÄ… puslapio versijÄ….
+Jei išsaugosite savo keitimus, po to daryti pakeitimai pradings.</strong>',
+'yourdiff' => 'Skirtumai',
+'copyrightwarning' => 'Primename, kad viskas, kas patenka į {{SITENAME}}, yra laikoma paskelbtu pagal $2 (detaliau - $1). Jei nenorite, kad jÅ«sų indÄ—lis bÅ«tų be gailesÄio redaguojamas ir platinamas, Äia neraÅ¡ykite.<br />
+JÅ«s taip pat pasižadate, kad tai jÅ«sų paÄių raÅ¡ytas turinys arba kopijuotas iÅ¡ viešų ar panaÅ¡ių nemokamų Å¡altinių.
+<strong>NEKOPIJUOKITE AUTORINĖMIS TEISĖMIS APSAUGOTŲ DARBŲ BE LEIDIMO!</strong>',
+'copyrightwarning2' => 'PraÅ¡ome pastebÄ—ti, kad viskas, kas patenka į {{SITENAME}} gali bÅ«ti redaguojami, perdaromi, ar paÅ¡alinami kitų naudotojų. Jei nenorite, kad jÅ«sų indÄ—lis bÅ«tų be gailesÄio redaguojamas, Äia neraÅ¡ykite.<br />
+Taip pat jÅ«s pasižadate, kad tai jÅ«sų paÄių raÅ¡ytas tekstas arba kopijuotas
+iš viešų ar panašių nemokamų šaltinių (detaliau - $1).
+<strong>NEKOPIJUOKITE AUTORINĖMIS TEISĖMIS APSAUGOTŲ DARBŲ BE LEIDIMO!</strong>',
+'longpagewarning' => '<strong>DĖMESIO: Šis puslapis yra $1 kilobaitų ilgio; kai kurios
+naršyklės gali turėti problemų redaguojant puslapius beveik ar virš 32 KB.
+Prašome pamėginti puslapį padalinti į keletą smulkesnių dalių.</strong>',
+'longpageerror' => '<strong>KLAIDA: Tekstas, kurį pateikėte, yra $1 kilobaitų ilgio,
+kuris yra didesnis nei daugiausiai leistini $2 kilobaitai. Jis nebus išsaugotas.</strong>',
+'readonlywarning' => '<strong>DĖMESIO: Duomenų bazė buvo užrakinta techninei profilaktikai,
+taigi negalėsite išsaugoti savo pakeitimų dabar. Jūs gali nusikopijuoti tekstą į tekstinį failą
+ir vÄ—liau įkelti jį Äia.</strong>',
+'protectedpagewarning' => '<strong>DĖMESIO: Šis puslapis yra užrakintas ir jį redaguoti gali tik administratoriaus teises turintys naudotojai.</strong>',
+'semiprotectedpagewarning' => "'''Pastaba:''' Šis puslapis buvo užrakintas ir jį gali redaguoti tik registruoti naudotojai.",
+'templatesused' => 'Straipsnyje naudojami Å¡ablonai:',
+'templatesusedpreview' => 'Šablonai, naudoti šioje peržiūroje:',
+'templatesusedsection' => 'Å ablonai, naudoti Å¡iame skyrelyje:',
+'edittools' => '<!-- Šis tekstas bus rodomas po redagavimo ir įkėlimo formomis. -->',
+'nocreatetitle' => 'Puslapių kūrimas apribotas',
+'nocreatetext' => 'Å ioje svetainÄ—je yra apribota galimybÄ— kurti naujus puslapius.
+Jūs galite grįžti ir redaguoti jau esantį puslapį, arba [[{{ns:special}}:Userlogin|prisijungti arba sukurti paskyrą]].',
+
+# "Undo" feature
+'undo-success' => 'Keitimas buvo atšauktas. Prašome patvirtinti, o tada išsaugoti pakeitimus žemiau.',
+'undo-failure' => 'Keitimas negali bÅ«ti atÅ¡auktas dÄ—l konfliktuojanÄių tarpinių keitimų.',
+'undo-summary' => 'Atšaukti [[{{ns:special}}:Contributions/$2]] ([[{{ns:user_talk}}:$2]]) versiją $1',
+
+# Account creation failure
+'cantcreateaccounttitle' => 'Paskyrų kūrimas negalimas',
+'cantcreateaccounttext' => 'Paskyrų kūrimas iš šio IP adreso (<b>$1</b>) yra užbluokuotas.
+Tai gali būti dėl dažno vandalizmo iš jūsų mokyklos ar interneto tiekėjo.',
+
+# History pages
+'revhistory' => 'Versijų istorija',
+'viewpagelogs' => 'Rodyti Å¡io puslapio specialiuosius veiksmus',
+'nohistory' => 'Šis puslapis neturi keitimų istorijos.',
+'revnotfound' => 'Versija nerasta',
+'revnotfoundtext' => 'Norima puslapio versija nerasta.
+Patikrinkite URL, kuriuo patekote į šį puslapį.',
+'loadhist' => 'Įkeliama puslapio istorija',
+'currentrev' => 'DabartinÄ— versija',
+'revisionasof' => '$1 versija',
+'revision-info' => '$1 versija naudotojo $2',
+'previousrevision' => 'â†AnkstesnÄ— versija',
+'nextrevision' => 'Vėlesnė versija→',
+'currentrevisionlink' => 'DabartinÄ— versija',
+'cur' => 'dab',
+'next' => 'kitas',
+'last' => 'pask',
+'orig' => 'orig',
+'histlegend' => "Skirtumai tarp versijų: pažymÄ—kite lyginamas versijas ir spustelkite ''Enter'' klaviÅ¡Ä… arba mygtukÄ… apaÄioje.<br />
+Žymėjimai: (dab) = palyginimas su naujausia versija,
+(pask) = palyginimas su prieš tai buvusia versija, S = smulkus keitimas.",
+'deletedrev' => '[ištrinta]',
+'histfirst' => 'Seniausi',
+'histlast' => 'Paskutiniai',
+'rev-deleted-comment' => '(komentaras pašalintas)',
+'rev-deleted-user' => '(naudotojo vardas pašalintas)',
+'rev-deleted-text-permission' => '<div class="mw-warning plainlinks">Ši puslapio versija buvo pašalinta iš viešųjų archyvų.
+[{{fullurl:{{ns:special}}:Log/delete|page={{PAGENAMEE}}}} Trynimo istorijoje] gali būti detalių.</div>',
+'rev-deleted-text-view' => '<div class="mw-warning plainlinks">
+Ši puslapio versija buvo pašalinta iš viešųjų archyvų.
+Kaip šios svetainės administratorius, jūs galite jį pamatyti;
+[{{fullurl:{{ns:special}}:Log/delete|page={{PAGENAMEE}}}} trynimo istorijoje] gali būti detalių.
+</div>',
+'rev-delundel' => 'rodyti/slÄ—pti',
+
+'history-feed-title' => 'Versijų istorija',
+'history-feed-description' => 'Šio puslapio versijų istorija projekte',
+'history-feed-item-nocomment' => '$1 $2', # user at time
+'history-feed-empty' => 'Prašomas puslapis neegzistuoja.
+Jis galėjo būti ištrintas iš projekto, arba pervardintas.
+Pamėginkite [[{{ns:special}}:Search|ieškoti projekte]] susijusių naujų puslapių.',
+
+# Revision deletion
+'revisiondelete' => 'Trinti/atkurti versijas',
+'revdelete-nooldid-title' => 'Nenurodyta versija',
+'revdelete-nooldid-text' => 'Nenurodėte versijos ar versijų, kurioms įvykdyti šią funkciją.',
+'revdelete-selected' => 'Pasirinktos [[:$1]] versijos:',
+'revdelete-text' => 'Ištrintos versjos vistiek dar bus rodomos puslapio istorijoje, bet jų turinys nebus viešai prieinamas.
+
+Kiti administratoriai Å¡iame projekte vis dar galÄ—s pasiekti paslÄ—ptÄ… turinį ir galÄ—s jį atkurti vÄ—l naudojantis ta paÄia sÄ…saja, nebent yra nustatyti papildomi apribojami svetainÄ—s tvarkytojams.',
+'revdelete-legend' => 'Nustatyti versijos apribojimus:',
+'revdelete-hide-text' => 'SlÄ—pti versijos tekstÄ…',
+'revdelete-hide-comment' => 'SlÄ—pti redagavimo komentarÄ…',
+'revdelete-hide-user' => 'SlÄ—pti redagavusiojo naudotojo vardÄ… ar IP adresÄ…',
+'revdelete-hide-restricted' => 'Taikyti Å¡iuos apribojimus ir administratoriams kaip ir kitiems',
+'revdelete-log' => 'Komentaras:',
+'revdelete-submit' => 'Taikyti pasirinktai versijai',
+'revdelete-logentry' => 'pakeistas versijos matomumas puslapiui [[$1]]',
+
+# Diffs
+'difference' => '(Skirtumai tarp versijų)',
+'loadingrev' => 'įkeliama versija palyginimui',
+'lineno' => 'EilutÄ— $1:',
+'editcurrent' => 'Redaguoti dabartinÄ™ puslapio versijÄ…',
+'selectnewerversionfordiff' => 'Pasirinkite naujesnÄ™ versijÄ… palyginimui',
+'selectolderversionfordiff' => 'Pasirinkite senesnÄ™ versijÄ… palyginimui',
+'compareselectedversions' => 'Palyginti pasirinktas versijas',
+'editundo' => 'atšaukti',
+'diff-multi' => '($1 {{plural:$1|tarpinis keitimas nėra rodomas|tarpiniai keitimai nėra rodomi|tarpinių keitimų nėra rodoma}}.)',
+
+# Search results
+'searchresults' => 'Paieškos rezultatai',
+'searchresulttext' => 'Daugiau informacijos apie paiešką projekte {{SITENAME}} rasite - [[{{ns:project}}:Paieška|Paieška projekte {{SITENAME}}]].',
+'searchsubtitle' => 'Ieškoma "[[:$1]]"',
+'searchsubtitleinvalid' => 'Ieškoma "$1"',
+'badquery' => 'Blogai suformuota paieškos užklausa',
+'badquerytext' => 'Nepavyko apdoroti Jūsų užklausos.
+Tai galėjo būti dėl trumpesnio nei trijų simbolių paieškos rakto, arba neteisingai suformuotos užklausos (pavyzdžiui "tigras and and liūtas").
+Pamėginkite kitokią užklausą.',
+'matchtotals' => 'Užklausa "$1" atitiko $2 puslapių pavadinimus
+ir $3 puslapių turinius.',
+'noexactmatch' => '\'\'\'Nėra jokio puslapio pavadinto "$1".\'\'\' Jūs galite [[:$1|sukurti šį puslapį]].',
+'titlematches' => 'Straipsnių pavadinimų atitikmenys',
+'notitlematches' => 'Jokių pavadinimo atitikmenų',
+'textmatches' => 'Puslapio turinio atitikmenys',
+'notextmatches' => 'Jokių puslapių teksto atitikmenų',
+'prevn' => 'ankstesnius $1',
+'nextn' => 'tolimesnius $1',
+'viewprevnext' => 'Žiūrėti ($1) ($2) ($3).',
+'showingresults' => 'Rodomi iki <b>$1</b> rezultatų pradedant #<b>$2</b>.',
+'showingresultsnum' => 'Rodoma <b>$3</b> rezultatų pradedant #<b>$2</b>.',
+'nonefound' => '\'\'\'Pastaba\'\'\': Nesėkminga paieška dažnai būna dėl ieškomų
+dažnai naudojamų žodžių, tokių kaip "yra" ar "iš", kurie yra
+neindeksuojami, arba nurodžius daugiau nei vieną paieškos žodį (rezultatuose
+bus tik tie straipsniai, kuriuose bus visi paieškos žodžiai).',
+'powersearch' => 'Ieškoti',
+'powersearchtext' => 'Ieškoti šiose vardų srityse:<br />$1<br /><label>$2 Rodyti peradresavimus</label><br />Ieškoti $3 $9',
+'searchdisabled' => 'Projekto {{SITENAME}} paieška yra uždrausta. Galite pamėginti ieškoti Google paieškos sistemoje. Paieškos sistemoje projekto {{SITENAME}} duomenys gali būti pasenę.',
+'blanknamespace' => '(PagrindinÄ—)',
+
+# Preferences page
+'preferences' => 'Nustatymai',
+'mypreferences' => 'Mano nustatymai',
+'prefsnologin' => 'Neprisijungęs',
+'prefsnologintext' => 'Jums reikia būti [[{{ns:special}}:Userlogin|prisijungti]], kad galėtumėte keisti savo nustatymus.',
+'prefsreset' => 'Nustatymai buvo atstatyti iš saugyklos.',
+'qbsettings' => 'Greitasis pasirinkimas',
+'changepassword' => 'Pakeisti slaptažodį',
+'skin' => 'IÅ¡vaizda',
+'math' => 'Matematika',
+'dateformat' => 'Datos formatas',
+'datedefault' => 'Jokio pasirinkimo',
+'datetime' => 'Data ir laikas',
+'math_failure' => 'Nepavyko apdoroti',
+'math_unknown_error' => 'nežinoma klaida',
+'math_unknown_function' => 'nežinoma funkcija',
+'math_lexing_error' => 'leksikos klaida',
+'math_syntax_error' => 'sintaksÄ—s klaida',
+'math_image_error' => 'PNG konvertavimas nepavyko; patikrinkite, ar teisingai įdiegta latex, dvips, gs, ir convert',
+'math_bad_tmpdir' => 'Nepavyksta sukurti arba rašyti į matematikos laikinąjį aplanką',
+'math_bad_output' => 'Nepavyksta sukurti arba rašyti į matematikos išvesties aplanką',
+'math_notexvc' => 'Trūksta texvc vykdomojo failo; pažiūrėkite math/README kaip konfigūruoti.',
+'prefs-personal' => 'Naudotojo profilis',
+'prefs-rc' => 'Paskutiniai keitimai',
+'prefs-watchlist' => 'Stebimų sąrašas',
+'prefs-watchlist-days' => 'Kiek dienų rodyti stebimų sąraše:',
+'prefs-watchlist-edits' => 'Kiek keitimų rodyti išplėstiniame stebimų sąraše:',
+'prefs-misc' => 'Įvairūs nustatymai',
+'saveprefs' => 'IÅ¡saugoti',
+'resetprefs' => 'Atstatyti nustatymus',
+'oldpassword' => 'Senas slaptažodis:',
+'newpassword' => 'Naujas slaptažodis:',
+'retypenew' => 'Pakartokite naują slaptažodį:',
+'textboxsize' => 'Redagavimo dėžė',
+'rows' => 'EilutÄ—s:',
+'columns' => 'Stulpeliai:',
+'searchresultshead' => 'Paieškos nustatymai',
+'resultsperpage' => 'Rezultatų puslapyje:',
+'contextlines' => 'EiluÄių rezultate:',
+'contextchars' => 'Konteksto simbolių eilutėje:',
+'stubthreshold' => 'Žymėti puslapį kaip nepilną, jei mažesnis nei:',
+'recentchangescount' => 'Kiek pakeitimų rodoma naujausių keitimų sąraše',
+'savedprefs' => 'Nustatymai sėkmingai išsaugoti.',
+'timezonelegend' => 'Laiko juosta',
+'timezonetext' => 'Įveskite kiek valandų jūsų vietinis laikas skiriasi nuo serverio laiko (UTC).',
+'localtime' => 'Vietinis laikas',
+'timezoneoffset' => 'Skirtumas¹',
+'servertime' => 'Serverio laikas',
+'guesstimezone' => 'Paimti iš naršyklės',
+'allowemail' => 'Leisti siųsti el. laiškus iš kitų naudotojų',
+'defaultns' => 'Pagal nutylėjimą ieškoti šiose vardų srityse:',
+'default' => 'pagal nutylÄ—jimÄ…',
+'files' => 'Failai',
+
+# User rights
+'userrights-lookup-user' => 'Tvarkyti naudotojo grupes',
+'userrights-user-editname' => 'Įveskite naudotojo vardą:',
+'editusergroup' => 'Redaguoti naudotojo grupes',
+'userrights-editusergroup' => 'Redaguoti naudotojų grupes',
+'saveusergroups' => 'Saugoti naudotojų grupes',
+'userrights-groupsmember' => 'Narys:',
+'userrights-groupsavailable' => 'Galimos grupÄ—s:',
+'userrights-groupshelp' => 'Pasirinkite grupes, į kurias pridėti ar iš kurių pašalinti naudotoją.
+Nepasirinktos grupės nebus pakeistos. Galite atžymėti grupę laikydami Ctrl ir paspausdami kairiuoju pelės klavišu',
+
+# Groups
+'group' => 'GrupÄ—:',
+'group-bot' => 'Robotai',
+'group-sysop' => 'Administratoriai',
+'group-bureaucrat' => 'Biurokratai',
+'group-all' => '(visi)',
+
+'group-bot-member' => 'Robotas',
+'group-sysop-member' => 'Administratorius',
+'group-bureaucrat-member' => 'Biurokratas',
+
+'grouppage-bot' => '{{ns:project}}:Robotai',
+'grouppage-sysop' => '{{ns:project}}:Administratoriai',
+'grouppage-bureaucrat' => '{{ns:project}}:Biurokratai',
+
+# Recent changes
+'changes' => 'pasikeitimai',
+'recentchanges' => 'Paskutiniai keitimai',
+'recentchangestext' => 'Å iame puslapyje yra patys naujausi pakeitimai Å¡iame projekte.',
+'rcnote' => 'Pateikiamas <strong>$1</strong> paskutinių pakeitimų sÄ…raÅ¡as per {{PLURAL:$2|$2 paskutiniÄ…jÄ… dienÄ…|paskutiniÄ…sias $2 dienas|paskutiniÄ…sias $2 dienų}} skaiÄiuojant nuo $3.',
+'rcnotefrom' => 'Žemiau yra pakeitimai pradedant <b>$2</b> (rodoma iki <b>$1</b> pakeitimų).',
+'rclistfrom' => 'Rodyti naujus pakeitimus pradedant $1',
+'rcshowhideminor' => '$1 smulkius keitimus',
+'rcshowhidebots' => '$1 robotus',
+'rcshowhideliu' => '$1 prisijungusius naudotojus',
+'rcshowhideanons' => '$1 anoniminius naudotojos',
+'rcshowhidepatr' => '$1 patikrintus keitimus',
+'rcshowhidemine' => '$1 mano keitimus',
+'rclinks' => 'Rodyti paskutinius $1 pakeitimų per paskutiniąsias $2 dienas(ų)<br />$3',
+'diff' => 'skirt',
+'hist' => 'ist',
+'hide' => 'SlÄ—pti',
+'show' => 'Rodyti',
+'minoreditletter' => 'S',
+'newpageletter' => 'N',
+'boteditletter' => 'R',
+'sectionlink' => '→',
+'number_of_watching_users_pageview' => '[$1 stebintys naudotojai]',
+'rc_categories' => 'Rodyti tik Å¡ias kategorijas (atskirkite su "|")',
+'rc_categories_any' => 'Bet kokia',
+
+# Upload
+'upload' => 'Įkelti failą',
+'uploadbtn' => 'Įkelti failą',
+'reupload' => 'Pakartoti įkėlimą',
+'reuploaddesc' => 'Grįžti į įkėlimo formą.',
+'uploadnologin' => 'Neprisijungęs',
+'uploadnologintext' => 'Norėdami įkelti failą, turite būti [[{{ns:special}}:Userlogin|prisijungęs]].',
+'upload_directory_read_only' => 'Tinklapio serveris negali rašyti į įkėlimo aplanką ($1).',
+'uploaderror' => 'Įkėlimo klaida',
+'uploadtext' => "NaudokitÄ—s žemiau pateikta forma failų įkÄ—limui, norÄ—dami peržiÅ«rÄ—ti ar ieÅ¡koti anksÄiau įkeltų paveikslÄ—lių,
+eikite į [[{{ns:special}}:Imagelist|įkeltų failų sąrašą]], įkėlimai ir trynimai yra registruojami [[{{ns:special}}:Log/upload|įkėlimų istorijoje]].
+
+Norėdami panaudoti įkeltą paveikslėlį puslapyje, naudokite tokias nuorodas
+'''<nowiki>[[{{ns:image}}:Failas.jpg]]</nowiki>''',
+'''<nowiki>[[{{ns:image}}:Failas.png|alternatyvusis tekstas]]</nowiki>''' arba
+'''<nowiki>[[{{ns:media}}:Failas.ogg]]</nowiki>''' tiesioginei nuorodai į failą.",
+'uploadlog' => 'įkėlimų sąrašas',
+'uploadlogpage' => 'Įkėlimų sąrašas',
+'uploadlogpagetext' => 'Žemiau pateikiamas paskutinių failų įkėlimų sąrašas.',
+'filename' => 'Failo vardas',
+'filedesc' => 'Komentaras',
+'fileuploadsummary' => 'Komentaras:',
+'filestatus' => 'AutorystÄ—s teisÄ—s',
+'filesource' => 'Å altinis',
+'copyrightpage' => '{{ns:project}}:AutorystÄ—s teisÄ—s',
+'copyrightpagename' => '{{SITENAME}} autorystÄ—s teisÄ—s',
+'uploadedfiles' => 'Įkelti failai',
+'ignorewarning' => 'Ignoruoti įspėjimą ir išsaugoti failą vistiek.',
+'ignorewarnings' => 'Ignuoruoti bet kokius įspėjimus',
+'minlength' => 'Failo pavadinimas turi būti bent trijų raidžių ilgio.',
+'illegalfilename' => 'Failo varde "$1" yra simbolių, neleidžiamų puslapio pavadinimuose. Prašome pervadint failą ir mėginkite įkelti jį iš naujo.',
+'badfilename' => 'Failo pavadinimas pakeistas į "$1".',
+'badfiletype' => '".$1" yra nerekomenduojamas paveikslÄ—lio bylos formatas.',
+'large-file' => 'Rekomenduojama, kad failų dydis būtų nedidesnis nei $1; šio failo dydis yra $2.',
+'largefileserver' => 'Šis failas yra didesnis nei serveris yra sukonfigūruotas leisti.',
+'emptyfile' => 'PanaÅ¡u, kad failas, kurį įkÄ—lÄ—te yra tuÅ¡Äias. Tai gali bÅ«ti dÄ—l klaidos failo pavadinime. Pasitikrinkite ar tikrai norite įkelti Å¡itÄ… failÄ….',
+'fileexists' => 'Failas tuo paÄiu vardu jau egzistuoja, praÅ¡ome pažiÅ«rÄ—ti $1, jei nesate tikras, ar norite perraÅ¡yti šį failÄ….',
+'fileexists-forbidden' => 'Failas tokiu paÄiu vardu jau egzistuoja; praÅ¡ome eiti atgal ir įkelti šį failÄ… kitu vardu. [[{{ns:image}}:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'Failas tokiu vardu jau egzistuoja bendrojoje failų saugykloje; prašome eiti atgal ir įkelti šį failą kitu vardu. [[{{ns:image}}:$1|thumb|center|$1]]',
+'successfulupload' => 'Įkelta sėkmingai',
+'fileuploaded' => 'Failas $1 sėkmingai įkeltas.
+Prašome nueiti šia nuoroda: $2 į aprašymo puslapį ir įrašyti
+informaciją apie failą, iš kokio šaltinio paimtas, kada buvo sukurtas,
+kas jo autorius, bei kitÄ… susijusiÄ… informacijÄ…. Jei tai
+paveikslėlis, jūs galite jį įterpti šitaip: <tt><nowiki>[[{{ns:image}}:$1|thumb|Aprašymas]]</nowiki></tt>',
+'uploadwarning' => 'DÄ—mesio',
+'savefile' => 'IÅ¡saugoti failÄ…',
+'uploadedimage' => 'įkėlė "[[$1]]"',
+'uploaddisabled' => 'Įkėlimai uždrausti',
+'uploaddisabledtext' => 'Šiame projekte failų įkėlimai yra uždrausti.',
+'uploadscripted' => 'Šis failas turi HTML arba programinį kodą, kuris gali būti klaidingai suprastas interneto naršyklės.',
+'uploadcorrupt' => 'Failas yra pažeistas arba turi neteisingą galūnę. Prašome patikrinti failą ir įkeltį jį vėl.',
+'uploadvirus' => 'Å iame faile yra virusas! Smulkiau: $1',
+'sourcefilename' => 'Įkeliamas failas',
+'destfilename' => 'Norimas failo vardas',
+'watchthisupload' => 'Stebėti šį puslapį',
+'filewasdeleted' => 'Failas Å¡iuo vardu anksÄiau buvo įkeltas, o paskui iÅ¡trintas. Jums reikÄ—tų patikrinti $1 prieÅ¡ bandant įkelti jį vÄ—l.',
+
+'upload-proto-error' => 'Neteisingas protokolas',
+'upload-proto-error-text' => 'Nuotoliniai įkėlimas reikalauja, kad URL prasidėtų <code>http://</code> arba <code>ftp://</code>.',
+'upload-file-error' => 'VidinÄ— klaida',
+'upload-file-error-text' => 'Įvyko vidinė klaida bandant sukurti laikinąjį failą serveryje. Prašome susisiekti su sistemos administratoriumi.',
+'upload-misc-error' => 'Nežinoma įkėlimo klaida',
+'upload-misc-error-text' => 'Įvyko nežinoma klaida vykstant įkėlimui. Prašome patikrinti, kad URL teisingas bei pasiekiamas ir pamėginkite vėl. Jei problema lieka, susisiekite su sistemos administratoriumi.',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'Nepavyksta pasiekti URL',
+'upload-curl-error6-text' => 'Pateiktas URL negali būti pasiektas. Prašome patikrinti, kad URL yra teisingas ir svetainė veikia.',
+'upload-curl-error28' => 'Per ilgai įkeliama',
+'upload-curl-error28-text' => 'Atsakant svetainė užtrunka per ilgai. Patikrinkite, ar svetainė veikia, palaukite truputį ir vėl pamėginkite. Galbūt jums reikėtų pamėginti ne tokiu apkrautu metu.',
+
+'license' => 'Licensija',
+'nolicense' => 'Nepasirinkta',
+'upload_source_url' => ' (tikras, viešai prieinamas URL)',
+'upload_source_file' => ' (failas jūsų kompiuteryje)',
+
+# Image list
+'imagelist' => 'Failų sąrašas',
+'imagelisttext' => "Žemiau yra '''$1''' {{plural:$1|failo|failų}} sąrašas, surūšiuotas $2.",
+'imagelistforuser' => 'Čia rodomi tik paveikslėliai, kuriuos įkelė $1.',
+'getimagelist' => 'gauti failų sąrašą',
+'ilsubmit' => 'Ieškoti',
+'showlast' => 'Rodyti paskutinius $1 paveikslėlių, rūšiuojant $2.',
+'byname' => 'pagal vardÄ…',
+'bydate' => 'pagal datÄ…',
+'bysize' => 'pagal dydį',
+'imgdelete' => 'trint',
+'imgdesc' => 'apr',
+'imgfile' => 'failas',
+'imglegend' => 'Žymėjimai: (apr) = žiūrėti/redaguoti failo aprašymą.',
+'imghistory' => 'PaveikslÄ—lio istorija',
+'revertimg' => 'atst',
+'deleteimg' => 'trinti',
+'deleteimgcompletely' => 'IÅ¡trinti visas Å¡io failo versijas',
+'imghistlegend' => 'Žymėjimai: (dab) = dabartinė failo versija, (trinti) = ištrinti
+senÄ… versijÄ…, (atst) = atstatyti senÄ… versijÄ….
+<br /><i>Spustelkite ant datos norėdami pažiūrėti tuo metu buvusią versiją</i>.',
+'imagelinks' => 'Nuorodos',
+'linkstoimage' => 'Šie puslapiai nurodo į šį failą:',
+'nolinkstoimage' => 'Ä® failÄ… nenurodo joks puslapis.',
+'sharedupload' => 'Šis failas yra įkeltas bendram naudojimui ir gali būti naudojamas kituose projektuose.',
+'shareduploadwiki' => 'Žiūrėkite $1 tolimesnei informacijai.',
+'shareduploadwiki-linktext' => 'failo aprašymo puslapį',
+'noimage' => 'Failas tokiu pavadinimu neegzistuoja. JÅ«s galite $1',
+'noimage-linktext' => 'įkelti jį',
+'uploadnewversion-linktext' => 'Įkelti naują failo versiją',
+'imagelist_date' => 'Data',
+'imagelist_name' => 'Pavadinimas',
+'imagelist_user' => 'Naudotojas',
+'imagelist_size' => 'Dydis (baitais)',
+'imagelist_description' => 'Aprašymas',
+'imagelist_search_for' => 'Ieškoti paveikslėlio pavadinimo:',
+
+# MIME search
+'mimesearch' => 'MIME paieška',
+'mimetype' => 'MIME tipas:',
+'download' => 'parsisiųsti',
+
+# Unwatched pages
+'unwatchedpages' => 'Nestebimi puslapiai',
+
+# List redirects
+'listredirects' => 'Peradresavimų sąrašas',
+
+# Unused templates
+'unusedtemplates' => 'Nenaudojami Å¡ablonai',
+'unusedtemplatestext' => 'Å is puslapis rodo sÄ…raÅ¡Ä… puslapių, esanÄių Å¡ablonų vardų srityje, kurie nÄ—ra įterpti į jokį kitÄ… puslapį. NepamirÅ¡kite patikrinti kitų nuorodų prieÅ¡ juos iÅ¡trinant.',
+'unusedtemplateswlh' => 'kitos nuorodos',
+
+# Random redirect
+'randomredirect' => 'Atsitiktinis peradresavimas',
+
+# Statistics
+'statistics' => 'Statistika',
+'sitestats' => '{{SITENAME}} statistika',
+'userstats' => 'Naudotojų statistika',
+'sitestatstext' => "Šiuo metu duomenų bazėje yra '''$1''' straipsnių.
+Ä® šį skaiÄių įeina aptarimų puslapiai, puslapiai apie {{SITENAME}}, peradresavimo puslapiai ir kiti, nelaikomi straipsniais.
+Be šių puslapių, yra '''$2''' {{PLURAL:$2|tikras straipsnis|tikri straipsniai|tikrų straipsnių}}.
+
+Buvo įkelti '''$8''' failai.
+
+Nuo projekto pradžios buvo parodyti '''$3''' puslapiai, ir buvo atlikta '''$4''' puslapių keitimų.
+Vidutiniškai kiekvienas puslapis keistas '''$5''' kartų, ir '''$6''' parodymai per redagavimą.
+
+[http://meta.wikimedia.org/wiki/Help:Job_queue UžduoÄių eilÄ—s] ilgis yra '''$7'''.",
+'userstatstext' => "Šiuo metu yra '''$1''' {{plural:$1|registruotas naudotojas|registruoti naudotojai|registruotų naudotojų}}, iš jų
+'''$2''' (arba '''$4%''') yra $5.",
+'statistics-mostpopular' => 'Daugiausiai rodyti puslapiai',
+
+'disambiguations' => 'Daugiaprasmių žodžių puslapiai',
+'disambiguationspage' => '{{ns:template}}:Daugiareikšmis',
+'disambiguationstext' => 'Žemiau iÅ¡vardinti puslapiai, rodantys į <i>daugiaprasmių žodžių puslapius</i>. Nuorodos turÄ—tų bÅ«ti patikslintos, kad rodytų į konkretų straipsnį.<br />Puslapis laikomas daugiaprasmiu, jei nuoroda į jį yra iÅ¡ $1.<br />Nuorodos iÅ¡ kitų vardų sriÄių Äia <i>nÄ—ra</i> įtrauktos.',
+
+'doubleredirects' => 'Dvigubi peradresavimai',
'doubleredirectstext' => 'Kiekvienoje eilutėje išvardintas pirmasis ir antrasis peradresavimai, taip pat pirma antrojo peradresavimo eilutė, paprastai rodanti į "teisingą" puslapį, į kurį turi būti rodoma.',
-'download' => 'parsisiųsti',
-'edit' => 'Redaguoti',
-'edit-externally' => 'Atidaryti išoriniame redaktoriuje',
-'edit-externally-help' => 'Žiūrėkite [http://meta.wikimedia.org/wiki/Help:External_editors diegimo instrukcijas] (angl.).',
-'editcomment' => 'Redagavimo komentaras: "<i>$1</i>".',
-'editconflict' => 'Išpręskite konfliktą: $1',
-'editcurrent' => 'Redaguoti dabartinÄ™ puslapio versijÄ…',
-'edithelp' => 'Kaip Redaguoti',
-'edithelppage' => 'Pagalba:Redagavimas',
-'editing' => 'Taisomas straipsnis - $1',
-'editinguser' => 'Taisomas straipsnis - $1',
-'editingcomment' => 'Taisomas straipsnis - $1 (comment)',
-'editingold' => '<strong>Ä®SPÄ–JIMAS: JÅ«s keiÄiate ne naujausiÄ… puslapio versijÄ….
-Jei išsaugosite savo keitimus, prieš tai daryti pakeitimai pradings.</strong>',
-'editingsection' => 'Taisomas straipsnis - $1 (skyrius)',
-'editsection' => 'taisyti',
-'editold' => 'taisyti',
-'editthispage' => 'Taisyti straipsnį',
-'editusergroup' => 'Redaguoti naudotojo gruoes',
-'email' => 'El. paštas',
-'emailconfirmlink' => 'Patvirtinkite savo el.pašto adresą',
-'emailfrom' => 'Nuo',
-'emailmessage' => 'Tekstas',
-'emailnotauthenticated' => 'Jūsų el.pašto adresas nėra patvirtintas. El.laiškas
-nebus siunÄiamas nei vienu žemiau iÅ¡vardintų bÅ«dų.',
-'emailpage' => 'Siųsti el.laišką',
-'emailsend' => 'Siųsti',
-'emailsent' => 'El.laiškas išsiųstas',
-'emailsenttext' => 'Jūsų el.pašto žinutė išsiųsta.',
-'emailsubject' => 'Tema',
-'emailto' => 'Kam',
-'emailuser' => 'Rašyti laišką',
-'emptyfile' => 'PanaÅ¡u, kad failas, kurį įkÄ—lÄ—te yra tuÅ¡Äias. Tai gali bÅ«ti dÄ—l klaidos failo pavadinime. Pasitikrinkite ar tikrai norite įkelti Å¡itÄ… failÄ….',
-'enotif_body' => '$WATCHINGUSERNAME,
-
-Projekto {{SITENAME}} puslapis $PAGETITLE buvo $CHANGEDORCREATED $PAGEEDITDATE vartotojo $PAGEEDITOR, dabartinÄ™ versijÄ… rasite adresu $PAGETITLE_URL.
+
+'brokenredirects' => 'Peradresavimai į niekur',
+'brokenredirectstext' => 'Žemiau iÅ¡vardinti peradresavimo puslapiai rodo į neegzistuojanÄius puslapius:',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|baitas|baitai|baitų}}',
+'ncategories' => '$1 {{PLURAL:$1|kategorija|kategorijos|kategorijų}}',
+'nlinks' => '$1 {{PLURAL:$1|nuoroda|nuorodos|nuorodų}}',
+'nmembers' => '$1 {{PLURAL:$1|narys|nariai|narių}}',
+'nrevisions' => '$1 {{PLURAL:$1|keitimas|keitimai|keitimų}}',
+'nviews' => '$1 {{PLURAL:$1|parodymas|parodymai|parodymų}}',
+'lonelypages' => 'Vieniši straipsniai',
+'lonelypagestext' => 'Į šiuos puslapius nėra nuorodų iš kitų šio projekto puslapių.',
+'uncategorizedpages' => 'Puslapiai, nepriskirti jokiai kategorijai',
+'uncategorizedcategories' => 'Kategorijos, nepriskirtos jokiai kategorijai',
+'uncategorizedimages' => 'PaveikslÄ—liai, nepriskirti jokiai kategorijai',
+'unusedcategories' => 'Nenaudojamos kategorijos',
+'unusedimages' => 'Nenaudojami failai',
+'popularpages' => 'Populiarūs puslapiai',
+'wantedcategories' => 'Geidžiamiausios kategorijos',
+'wantedpages' => 'Geidžiamiausi puslapiai',
+'mostlinked' => 'Daugiausiai nurodomi straipsniai',
+'mostlinkedcategories' => 'Daugiausiai nurodomos kategorijos',
+'mostcategories' => 'Straipsniai su daugiausia kategorijų',
+'mostimages' => 'Daugiausiai nurodomi paveikslÄ—liai',
+'mostrevisions' => 'Straipsniai su daugiausia keitimų',
+'allpages' => 'Visi puslapiai',
+'prefixindex' => 'Rodyklė pagal pavadinimo pradžią',
+'randompage' => 'Atsitiktinis puslapis',
+'shortpages' => 'Trumpiausi puslapiai',
+'longpages' => 'Ilgiausi puslapiai',
+'deadendpages' => 'Straipsniai-aklavietÄ—s',
+'deadendpagestext' => 'Šie puslapiai neturi nuorodų į kitus puslapius šiame projekte.',
+'listusers' => 'Naudotojų sąrašas',
+'specialpages' => 'Specialieji puslapiai',
+'spheading' => 'Specialieji puslapiai visiems naudotojams',
+'restrictedpheading' => 'Apribotieji specialieji puslapiai',
+'recentchangeslinked' => 'SusijÄ™ keitimai',
+'rclsub' => '(puslapių, pasiekiamų iš "$1")',
+'newpages' => 'Naujausi puslapiai',
+'newpages-username' => 'Naudotojo vardas:',
+'ancientpages' => 'Seniausi puslapiai',
+'intl' => 'TarpkalbinÄ—s nuorodos',
+'move' => 'Pervadinti',
+'movethispage' => 'Pervadinti šį puslapį',
+'unusedimagestext' => '<p>Primename, kad kitos svetainės gali būti nurodžiusios į paveikslėlį tiesioginiu URL, bet vistiek gali būti šiame sąraše, nors ir yra aktyviai naudojamas.</p>',
+'unusedcategoriestext' => 'Šie kategorijų puslapiai sukurti, nors joks kitas straipsnis ar kategorija jo nenaudoja.',
+
+# Book sources
+'booksources' => 'Knygų šaltiniai',
+'booksources-search-legend' => 'Knygų šaltinių paieška',
+'booksources-isbn' => 'ISBN:',
+'booksources-go' => 'Rodyti',
+'booksources-text' => 'Žemiau yra nuorodų sÄ…raÅ¡as į kitas svetaines, kurios parduoda naujas ar naudotas knygas, bei galbÅ«t turinÄias daugiau informacijos apie knygas, kurių ieÅ¡kote:',
+
+'categoriespagetext' => 'Projekte yra Å¡ios kategorijos.',
+'data' => 'Duomenys',
+'userrights' => 'Naudotojų teisių valdymas',
+'groups' => 'Naudotojų grupės',
+'isbn' => 'ISBN',
+'alphaindexline' => 'Nuo $1 iki $2',
+'version' => 'Versija',
+'log' => 'Specialiųjų veiksmų istorija',
+'alllogstext' => 'Bendra įdėtų failų, ištrynimų, užrakinimų, blokavimų ir teisių suteikimų istorija.
+Galima sumažinti rezultatų skaiÄių patikslinant veiksmo rūšį, naudotojÄ… ar susijusį puslapį.',
+'logempty' => 'Istorijoje nÄ—ra jokių atitinkanÄių įvykių.',
+
+# Special:Allpages
+'nextpage' => 'Kitas puslapis ($1)',
+'prevpage' => 'Ankstesnis puslapis ($1)',
+'allpagesfrom' => 'Rodyti puslapius pradedant nuo:',
+'allarticles' => 'Visi straipsniai',
+'allinnamespace' => 'Visi puslapiai ($1 vardų sritis)',
+'allnotinnamespace' => 'Visi puslapiai (nesantys $1 vardų srityje)',
+'allpagesprev' => 'Atgal',
+'allpagesnext' => 'Pirmyn',
+'allpagessubmit' => 'Rodyti',
+'allpagesprefix' => 'Rodyti puslapiu su priedÄ—liu:',
+'allpagesbadtitle' => 'Duotas puslapio pavadinimas yra neteisingas arba turi tarpkalbininį arba tarpprojektinį priedėlį. Jame yra vienas ar keli simboliai, kurių negalima naudoti pavadinimuose.',
+
+# Special:Listusers
+'listusersfrom' => 'Rodyti naudotojus pradedant nuo:',
+
+# E-mail user
+'mailnologin' => 'NÄ—ra adreso',
+'mailnologintext' => 'Jums reikia būti [[{{ns:special}}:Userlogin|prisijungusiam]]
+ir turi būti įvestas teisingas el. pašto adresas jūsų [[{{ns:special}}:Preferences|nustatymuose]],
+kad siųstumėte el. laiškus kitiems nautotojams.',
+'emailuser' => 'Rašyti laišką šiam naudotojui',
+'emailpage' => 'Siųsti el. laišką naudotojui',
+'emailpagetext' => 'Jei šis naudotojas yra įvedęs teisingą el. pašto adresą
+savo nustatymuose, ši forma nusiųs vieną laišką.
+El. pašto adresas, nurodytas jūsų nustatymuose, bus rodomas
+kaip laiško adresas "Nuo", kad gavėjas galėtų jums atsakyti.',
+'usermailererror' => 'Pašto objektas grąžino klaidą::',
+'defemailsubject' => '{{SITENAME}} el. paštas',
+'noemailtitle' => 'Nėra el. pašto adreso',
+'noemailtext' => 'Šis naudotojas yra nenurodęs teisingo el. pašto adreso, arba yra pasirinkęs negauti el. pašto iš kitų naudotojų.',
+'emailfrom' => 'Nuo',
+'emailto' => 'Kam',
+'emailsubject' => 'Tema',
+'emailmessage' => 'Tekstas',
+'emailsend' => 'Siųsti',
+'emailccme' => 'Siųsti man mano laiško kopiją.',
+'emailccsubject' => 'Laiško kopija naudotojui $1: $2',
+'emailsent' => 'El. laiškas išsiųstas',
+'emailsenttext' => 'Jūsų el. pašto žinutė išsiųsta.',
+
+# Watchlist
+'watchlist' => 'Stebimi straipsniai',
+'watchlistfor' => "(naudotojo '''$1''')",
+'nowatchlist' => 'Neturite nei vieno stebimo puslapio.',
+'watchlistanontext' => 'Prašome $1, kad peržiūrėtumėte ar pakeistumėte elementus savo stebimųjų sąraše.',
+'watchlistcount' => "'''Jūs turite $1 {{PLURAL:$1|elementą|elementus|elementų}} stebimųjų sąraše įskaitant aptarimo puslapius.'''",
+'clearwatchlist' => 'Išvalyti stebimų sąrašą',
+'watchlistcleartext' => 'Ar tikrai norite juos pašalinti?',
+'watchlistclearbutton' => 'Išvalyti stebimų sąrašą',
+'watchlistcleardone' => 'Jūsų stebimųjų sąrašas išvalytas. Pašalinta $1 {{PLURAL:$1|elementas|elementai|elementų}}.',
+'watchnologin' => 'Neprisijungęs',
+'watchnologintext' => 'Jums reikia būti [[{{ns:special}}:Userlogin|prisijungusiam]], kad pakeistumėte savo stebimųjų sąrašą.',
+'addedwatch' => 'Pridėta prie Stebimų',
+'addedwatchtext' => 'Puslapis "[[:$1]]" pridėtas į [[{{ns:special}}:Watchlist|stebimųjų sąrašą]].
+Būsimi puslapio bei atitinkamo aptarimo puslapio pakeitimai bus rodomi stebimųjų puslapių sąraše,
+taip pat bus \'\'\'paryškinti\'\'\' [[{{ns:special}}:Recentchanges|naujausių keitimų sąraše]], kad išsiskirtų iš kitų straipsnių.
+
+Jei vėliau užsinorėtumėte nustoti stebėti straipsnį, spustelkite "Nebestebėti" viršutiniame meniu.',
+'removedwatch' => 'Pašalinta iš stebimų',
+'removedwatchtext' => 'Puslapis "[[:$1]]" pašalintas iš jūsų stebimų sąrašo.',
+'watch' => 'StebÄ—ti',
+'watchthispage' => 'Stebėti šį puslapį',
+'unwatch' => 'NebestebÄ—ti',
+'unwatchthispage' => 'Nustoti stebÄ—ti',
+'notanarticle' => 'Ne turinio puslapis',
+'watchnochange' => 'Pasirinktu laikotarpiu nebuvo redaguotas nei vienas stebimas straipsnis.',
+'watchdetails' => '* Stebima $1 {{plural:$1|puslapis|puslapiai|puslapių}} neskaiÄiuojant aptarimų puslapių
+* [[{{ns:special}}:Watchlist/edit|Parodyti ir redaguoti pilną sąrašą]]
+* [[{{ns:special}}:Watchlist/clear|Pašalinti visus puslapius]]',
+'wlheader-enotif' => '* El. pašto priminimai yra įjungti.',
+'wlheader-showupdated' => "* Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra pažymėti '''pastorintai'''",
+'watchmethod-recent' => 'tikrinami paskutiniai keitimai stebimiems puslapiams',
+'watchmethod-list' => 'ieškoma naujausių keitimų stebimuose puslapiuose',
+'removechecked' => 'Išmesti pažymėtus elementus iš stebimų sąrašo',
+'watchlistcontains' => 'Puslapių jūsų stebimųjų sąraše - $1.',
+'watcheditlist' => 'Tai abėcėlės tvarka surikiuotas stebimų puslapių sąraše. Pažymėkite puslapius, kuriuos norite pašalinti iš jūsų stebimųjų sąrašo ir paspauskite žemiau
+esantį mygtukÄ… "IÅ¡mesti pažymÄ—tus" (paÅ¡alinus turinio puslapį bus paÅ¡alintas ir susijÄ™s aptarimo puslapis ir atvirkÅ¡Äiai).',
+'removingchecked' => 'Pasirinkti elementai išmetami iš stebimų sąrašo...',
+'couldntremove' => "Nepavyko pašalinti '$1'...",
+'iteminvalidname' => "Problema su elementu '$1', neteisingas vardas...",
+'wlnote' => 'Rodomi paskutiniai $1 pakeitimai, padaryti per paskutines <b>$2</b> valandas.',
+'wlshowlast' => 'Rodyti paskutinių $1 valandų, $2 dienų ar $3 pakeitimus',
+'wlsaved' => 'Tai išsaugota jūsų stebimųjų sąrašo versija.',
+'watchlist-show-bots' => 'Rodyti robotų keitimus',
+'watchlist-hide-bots' => 'Slėpti robotų keitimus',
+'watchlist-show-own' => 'Rodyti mano keitimus',
+'watchlist-hide-own' => 'SlÄ—pti mano keitimus',
+'watchlist-show-minor' => 'Rodyti smulkius keitimus',
+'watchlist-hide-minor' => 'SlÄ—pti smulkius keitimus',
+'wldone' => 'Atlikta.',
+
+# Displayed when you click the "watch" button and it's in the process of watching
+'watching' => 'Įtraukiama į stebimųjų sąrašą...',
+'unwatching' => 'Šalinama iš stebimųjų sąrašo...',
+
+'enotif_mailer' => '{{SITENAME}} Pranešimų sistema',
+'enotif_reset' => 'Pažymėti visus puslapius kaip aplankytus',
+'enotif_newpagetext' => 'Tai naujas puslapis.',
+'changed' => 'pakeitÄ—',
+'created' => 'sukurÄ—',
+'enotif_subject' => 'Projekte {{SITENAME}} naudotojas $PAGEEDITOR $CHANGEDORCREATED $PAGETITLE',
+'enotif_lastvisited' => 'Užeikite į $1, jei norite matyti pakeitimus nuo paskutiniojo apsilankymo.',
+'enotif_body' => '$WATCHINGUSERNAME,
+
+$PAGEEDITDATE projekte {{SITENAME}} naudotojas $PAGEEDITOR $CHANGEDORCREATED puslapį $PAGETITLE, dabartinę versiją rasite adresu $PAGETITLE_URL.
$NEWPAGE
Redaguotojo komentaras: $PAGESUMMARY $PAGEMINOREDIT
Susisiekti su redaguotoju:
-el.paštu: $PAGEEDITOR_EMAIL
+el. paštu: $PAGEEDITOR_EMAIL
wiki: $PAGEEDITOR_WIKI
-Daugiau praneÅ¡imų apie vÄ—lesnius pakeitimus nebus siunÄiama, jei neapsilankysite puslapyje. JÅ«s taip pat galite iÅ¡jungti praneÅ¡imo žymÄ™ jÅ«sų stebimiems puslapiams stebimų straipsnių puslapyje.
+Daugiau praneÅ¡imų apie vÄ—lesnius pakeitimus nebus siunÄiama, jei neapsilankysite puslapyje. JÅ«s taip pat galite iÅ¡jungti praneÅ¡imo žymÄ™ visiems jÅ«sų stebimiems puslapiams savo stebimųjų sÄ…raÅ¡e.
- Jūsų draugiškoji projekto {{SITENAME}} pranešimų sistema
+ Jūsų draugiškoji projekto {{SITENAME}} pranešimų sistema
--
Norėdami pakeisti stebimų puslapių nustatymus, užeikite į
-{{fullurl:Special:Watchlist/edit}}
+{{fullurl:{{ns:special}}:Watchlist}}
Atsiliepimai ir pagalba:
-{{fullurl:Help:Contents}}',
-'enotif_lastvisited' => 'Užeikite į $1, jei norite matyti pakeitimus nuo paskutiniojo apsilankymo.',
-'enotif_mailer' => '{{SITENAME}} Pranešimų sistema',
-'enotif_newpagetext' => 'Tai naujas puslapis.',
-'enotif_reset' => 'Pažymėti visuspuslapius kaip aplankytus',
-'enotif_subject' => '{{SITENAME}} projekte vartotojas $PAGEEDITOR $CHANGEDORCREATED $PAGETITLE',
-'error' => 'Klaida',
-'errorpagetitle' => 'Klaida',
-'exbeforeblank' => 'turinys prieš ištrinant buvo:',
-'exblank' => 'puslapis buvo tuÅ¡Äias',
-'excontent' => 'buvęs turinys:',
-'excontentauthor' => 'turinys: \'$1\' (redagavo tik \'$2\')',
-'explainconflict' => 'Straipsnis jau buvo redaguotas nuo tada, kai jūs pradėjote redaguoti straipsnį.
-Viršutiniame tekstiniame lauke pateikta šiuo metu projekte esanti straipsnio versija.
-JÅ«sų keitimai pateikti žemiau esanÄiame lauke.
-Kadangi automatiškai sulieti pakeitimų nepavyko, jums teks rankomis
-sulieti savo darytus pakeitimus į dabartinę versiją.
-Paspaudus "Išsaugoti", užsaugotas bus
-<b>tik</b> tekstas viršutiniame tekstiniame lauke.<br />',
-'export' => 'Eksportuoti puslapius',
-'exportcuronly' => 'Eksportuoti tik dabartinę versiją, neįtraukiant istorijos',
-'exporttext' => 'Galite eksportuoti vieno puslapio tekstą ir istoriją ar kelių puslapių vienu metu
-tame paÄiame XML atsakyme. Ateityje Å¡ie puslapiai galÄ—s bÅ«ti importuojami į kitÄ…
-projektą, veikiantį MediaWiki pagrindu.
+{{fullurl:{{ns:help}}:Turinys}}',
-NorÄ—dami eksportuoti puslapius, įveskite pavadinimus žemiau esanÄiame tekstiniame lauke
-po vienÄ… pavadinimÄ… eilutÄ—je, taip pat pasirinkite ar norite eksportuoti ir istorijÄ…
-ar tik dabartinÄ™ versijÄ… su paskutinio redagavimo informacija.
+# Delete/protect/revert
+'deletepage' => 'Trinti puslapį',
+'confirm' => 'Tvirtinu',
+'excontent' => 'buvęs turinys: "$1"',
+'excontentauthor' => "buvęs turinys: '$1' (redagavo tik '[[{{ns:special}}:Contributions/$2|$2]]')",
+'exbeforeblank' => 'prieš ištrinant turinys buvo: "$1"',
+'exblank' => 'puslapis buvo tuÅ¡Äias',
+'confirmdelete' => 'Trynimo patvirtinimas',
+'deletesub' => '(Trinama "$1")',
+'historywarning' => 'DÄ—mesio: Trinamas puslapis turi istorijÄ…:',
+'confirmdeletetext' => 'Jūs pasirinkote ištrinti puslapį ar paveikslėlį
+kartu su visa jo istorija iš duomenų bazės.
+Prašome patvirtinti, kad jūs norite tai padaryti,
+žinote apie galimas pasėkmes, ir kad jūs tai darote nenusižengdamas
+[[{{ns:project}}:Politika|projekto {{SITENAME}} politikai]].',
+'actioncomplete' => 'Veiksmas atliktas',
+'deletedtext' => '"$1" ištrintas.
+Paskutinių šalinimų sąrašas - $2.',
+'deletedarticle' => 'ištrynė "$1"',
+'dellogpage' => 'Šalinimų sąrašas',
+'dellogpagetext' => 'Žemiau pateikiamas sąrašas paskutinių trynimų sąrašas.',
+'deletionlog' => 'šalinimų sąrašas',
+'reverted' => 'Atkurta į ankstesnę versiją',
+'deletecomment' => 'Trynimo priežastis',
+'imagereverted' => 'Atstatymas į ankstesnę versiją pavyko.',
+'rollback' => 'Atmesti keitimus',
+'rollback_short' => 'Atmesti',
+'rollbacklink' => 'atmesti',
+'rollbackfailed' => 'Atmetimas nepavyko',
+'cantrollback' => 'Negalima atmesti redagavimo; paskutinis keitęs naudotojas yra šio puslapio autorius.',
+'alreadyrolled' => 'Nepavyko atmesti paskutinio [[{{ns:user}}:$2|$2]] ([[{{ns:user_talk}}:$2|Aptarimas]]) daryto straipsnio [[:$1]] keitimo; kažkas jau pakeitė straipsnį arba suspėjo pirmas atmesti keitimą.
-NorÄ—dami eksportuoti vieno puslapio dabartinÄ™ versijÄ…, galite naudoti nuorodÄ…, pvz. [[{{ns:Special}}:Export/Lietuva]]
-straipsniui [[Lietuva]].',
-'extlink_sample' => 'http://www.pavyzdys.lt Nuorodos pavadinimas',
-'extlink_tip' => 'Išorinė nuoroda (nepamirškite http:// prefikso)',
-'faq' => 'DUK',
-'faqpage' => 'Projektas:DUK',
-'feb' => 'Vas',
-'february' => 'Vasario',
-'filedesc' => 'Komentaras',
-'fileexists' => 'Failas tuo paÄiu vardu jau egzistuoja, praÅ¡ome pažiÅ«rÄ—ti $1 jei nesate tikras, ar norite perraÅ¡yti šį failÄ….',
-'filename' => 'Failas',
-'files' => 'Failai',
-'fileuploaded' => 'Failas "$1" sėkmingai įkeltas.
-Prašome nueiti šia nuoroda: $2 į failo aprašymo puslapį ir įrašyti informaciją apie failą, iš kokio šaltinio paimtas, kas jo autorius, bei kitą susijusią informaciją (taip pat ir licencijavimo tipą).',
-'fileuploadsummary' => 'Komentaras:',
-'formerror' => 'Klaida: nepavyko apdoroti formos duomenų',
-'friday' => 'Penktadienis',
-'go' => 'Rodyk',
-'searcharticle' => 'Rodyk',
-'guesstimezone' => 'Paimti iš naršyklės',
-'headline_sample' => 'Skyriaus Pavadinimas',
-'headline_tip' => 'Skyriaus pavadinimas (2-o lygio)',
-'help' => 'Pagalba',
-'helppage' => 'Pagalba:turinys',
-'hide' => 'SlÄ—pti',
-'hidetoc' => 'slÄ—pti',
-'hist' => 'ist',
-'histfirst' => 'Seniausi',
-'histlast' => 'Paskutiniai',
-'histlegend' => 'Skirtumai tarp versijų: radijo mygtukais iÅ¡sirinkite lyginamas versijas ir spustelkite \'\'Enter\'\' klaviÅ¡Ä… arba mygtukÄ…, esantį apaÄioje.<br />
-Žymėjimai: (dab) = palyginimas su naujausia versija,
-(pask) = palyginimas su prieš tai buvusia versija, S = smulkus keitimas.',
-'history' => 'Straipsnio istorija',
-'history_short' => 'Istorija',
-'historywarning' => 'DÄ—mesio: Trinamas puslapis turi istorijÄ…:',
-'hr_tip' => 'Horizontali linija (nepernaudoti)',
-'illegalfilename' => 'Failo varde "$1" yra simbolių, netinkamų straipsnio pavadinimui. Prašome pervadint failą ir mėginti įkelti iš naujo.',
-'ilsubmit' => 'Ieškoti',
-'image_sample' => 'Pavyzdys.jpg',
-'image_tip' => 'Įdėti paveiksėlį',
-'imagelinks' => 'PaveikslÄ—lio naudojimas',
-'imagelist' => 'Paveikslėlių sąrašas',
-'imagelistall' => 'visi',
-'imagelisttext' => 'Žemiau yra paveikslėlių sąrašas (rodoma $1), surūšiuotas $2.',
-'imagemaxsize' => 'Riboti rodomų paveikslėlių dydį:',
-'imagepage' => 'Žiūrėti paveikslėlio puslapį',
-'imagereverted' => 'AnkstesnÄ—s versijos atstatymas pavyko.',
-'imgdelete' => 'trint',
-'imgdesc' => 'apr',
-'imghistlegend' => 'Žymėjimai: (dab) = dabartinė paveikslėlio versija, (trint) = ištrinti
-senÄ… versijÄ…, (atst) = atstatyti senÄ… versijÄ….
-<br /><i>Spustelkite ant datos norėdami pažiūrėti tuo metu buvusią versiją</i>.',
-'imghistory' => 'PaveikslÄ—lio istorija',
-'imglegend' => 'Legend: (apr) = žiūrėti/redaguoti paveikslėlio aprašymą.',
-'import' => 'Importuoti puslapius',
-'importnosources' => 'Nenustatyti importo šaltiniai, o tiesioginis importas uždraustas.',
-'importsuccess' => 'Importas pavyko!',
-'internalerror' => 'Nenustatyta vidinÄ— klaida',
-'invert' => 'Rodyti visas sritis išskyrus pasirinktąją',
-'ipblocklist' => 'Blokuotų IP adresų bei vartotojų sąrašas',
-'ipbreason' => 'Priežastis',
-'ipbsubmit' => 'Blokuoti šį naudotoją',
-'ipusubmit' => 'Atblokuoti šį adresą',
-'isbn' => 'ISBN',
-'isredirect' => 'nukreipiamasis',
-'italic_sample' => 'Tekstas kursyvu',
-'italic_tip' => 'IÅ¡skirti kursyvu',
-'jan' => 'Sau',
-'january' => 'Sausio',
-'jul' => 'Lie',
-'july' => 'Liepos',
-'jun' => 'Bir',
-'june' => 'Birželio',
-'laggedslavemode' => 'Dėmesio: Straipsnyje gali nesimatyti naujausių pakeitimų.',
-'last' => 'pask',
-'lastmodifiedat' => 'Paskutinį kartą keista $2, $1.',
-'lineno' => 'EilutÄ— $1:',
-'link_sample' => 'Straipsnio pavadinimas',
-'link_tip' => 'VidinÄ— nuoroda',
-'linklistsub' => '(Nuorodų sąrašas)',
-'linkshere' => 'Šie straipsniai rodo į pasirinktąjį straipsnį:',
-'linkstoimage' => 'PaveikslÄ—lis naudojamas Å¡iuose straipsniuose:',
-'listingcontinuesabbrev' => ' tęs.',
-'listusers' => 'Vartotojų sąrašas',
-'loadhist' => 'Renkama straipsnio istorija',
-'localtime' => 'Rodomas vietinis laikas',
-'log' => 'Specialiųjų veiksmų istorija',
-'login' => 'Prisijungti/Registruotis',
-'loginerror' => 'Prisijungimo klaida',
-'loginpagetitle' => 'Prisijungimas',
-'loginproblem' => '<b>Problemos su jūsų prisijungimu.</b><br />Pabandykite iš naujo!',
-'loginprompt' => '<!--Norėdami prisijungti prie Wikipedijos, privalote įsijungti \'\'\'cookies\'\'\' savo naršyklėje.-->',
-'loginsuccess' => 'Šiuo metu jūs prisijungęs prie projekto kaip "$1".',
-'loginsuccesstitle' => 'SÄ—kmingai prisijungÄ—te',
-'logout' => 'Atsijungti',
-'logouttext' => 'JÅ«s atsijungÄ—te nuo projekto.
-Galite toliau naudoti projektÄ… anonimiÅ¡kai arba prisijunkite iÅ¡ naujo tuo paÄiu ar kitu vartotoju.<br />
-P.S.: kai kuriuose puslapiuose ir toliau gali rodyti lyg būtumėte prisijungęs iki tol, kol išvalysite savo naršyklės išsaugotas puslapių kopijas',
-'lonelypages' => 'Vieniši straipsniai',
-'longpages' => 'Ilgiausi puslapiai',
-'mailmypassword' => 'Siųsti naują slaptažodį paštu',
-'mainpage' => 'Pradžia',
-'makesysop' => 'Padaryti administratoriumi',
-'mar' => 'Kov',
-'march' => 'Kovo',
-'markaspatrolleddiff' => 'Žymėti kad patikrinta',
-'markaspatrolledtext' => 'Pažymėti, kad straipsnis patikrintas',
-'markedaspatrolled' => 'Uždėta žymė "Patikrinta"',
-'markedaspatrolledtext' => 'Pasirinkta revizija sėkmingi pažymėta kaip patikrinta',
-'math' => 'Matematika',
-'math_sample' => 'Įveskite formulę',
-'math_tip' => 'MatematinÄ— formulÄ— (LaTeX formatu)',
-'may' => 'Geg',
-'may_long' => 'Gegužės',
-'minoredit' => 'Smulkus pataisymas',
-'minoreditletter' => 'S',
-'missingimage' => '<b>Trūkstamas paveikslėlis</b><br /><i>$1</i>',
-'monday' => 'Pirmadienis',
-'moredotdotdot' => 'Daugiau...',
-'mostlinked' => 'Rodomiausi straipsniai',
-'move' => 'Pervadinti',
-'movearticle' => 'Straipsnio pervadinimas',
-'movedto' => 'perkeltas į',
-'movelogpage' => 'Perkėlimų sąrašas',
-'movenologin' => 'Neprisijungęs',
-'movenologintext' => 'Norėdami pervadinti puslapį, turite būti registruotas ir <a href="/wiki/Special:Userlogin">prisijungęs</a> vartotojas.',
-'movepage' => 'Straipsnio pervadinimas',
-'movepagebtn' => 'Pervadinti',
-'movepagetalktext' => 'Straipsnio aptarimo puslapis (jei egzistuoja) bus automatiškai
-perkeltas kartu su straipsniu, \'\'\'išskyrus,\'\'\' jei
-*keiÄiate straipsnio vardų erdvÄ™,
-*straipsniui nauju pavadinimu jau egzistuoja netuÅ¡Äias aptarimo puslapis, arba
-*paliksite žemiau esanÄia varnelÄ™ nepažymÄ—tÄ….
-
-Tokiu atveju jūs savo nuožiūra turite perkelti arba apjungti aptarimo puslapį.',
-'movepagetext' => 'Naudodamiesi žemiau pateikta forma, pervadinsite straipsnį
+Paskutimas keitimas darytas naudotojo [[{{ns:user}}:$3|$3]] ([[{{ns:user_talk}}:$3|Aptarimas]]).',
+'editcomment' => 'Redagavimo komentaras: "<i>$1</i>".', # only shown if there is an edit comment
+'revertpage' => 'Atmestas [[{{ns:special}}:Contributions/$2|$2]] ([[{{ns:user_talk}}:$2|Aptarimas]]) pakeitimas; sugrąžinta naudotojo [[{{ns:user}}:$1|$1]] versija',
+'sessionfailure' => 'Atrodo yra problemų su jūsų prisijungimo sesija; šis veiksmas buvo atšauktas kaip atsargumo priemonė prieš sesijos vogimą.
+Prašome paspausti "atgal" ir perkraukite puslapį iš kurio atėjote, ir pamėginkite vėl.',
+'protectlogpage' => 'Rakinimų sąrašas',
+'protectlogtext' => 'Žemiau yra puslapių užrakinimų bei atrakinimų sąrašas.',
+'protectedarticle' => 'užrakino "[[$1]]"',
+'unprotectedarticle' => 'atrakino "[[$1]]"',
+'protectsub' => '(Rakinamas "$1")',
+'confirmprotecttext' => 'Ar jūs tikrai norite užrakinti šį straipsnį?',
+'confirmprotect' => 'Užrakinimo patvirtinimas',
+'protectmoveonly' => 'Uždrausti tik perkėlimus',
+'protectcomment' => 'Rakinimo priežastis',
+'unprotectsub' => '(Atrakinamas "$1")',
+'confirmunprotecttext' => 'Ar tikrai norite atrakinti šį straipsnį?',
+'confirmunprotect' => 'Atrakinimo patvirtinimas',
+'unprotectcomment' => 'Atrakinimo priežastis',
+'protect-unchain' => 'Atrakinti pervardinimo teises',
+'protect-text' => 'Čia jūs gali matyti ir keisti apsaugos lygį puslapiui <strong>$1</strong>.',
+'protect-viewtext' => 'Jūsų paskyra neturi teisių keisti puslapių apsaugos lygius. Čia yra dabartiniai nustatymai puslapiui <strong>$1</strong>:',
+'protect-default' => '(pagal nutylÄ—jimÄ…)',
+'protect-level-autoconfirmed' => 'Blokuoti neregistruotus naudotojus',
+'protect-level-sysop' => 'Tik administratoriai',
+
+# Restrictions (nouns)
+'restriction-edit' => 'Redagavimas',
+'restriction-move' => 'Pervardinimas',
+
+# Undelete
+'undelete' => 'Atstatyti ištrintą puslapį',
+'undeletepage' => 'Rodyti ir atkurti ištrintus puslapius',
+'viewdeletedpage' => 'Rodyti ištrintus puslapius',
+'undeletepagetext' => 'Žemiau išvardinti puslapiai yra ištrinti, bet dar laikomi
+archyve, todėl jie gali būti atstatyti. Archyvas gali būti periodiškai valomas.',
+'undeleteextrahelp' => "Norėdami atkurti visą puslapį, palikite visas varneles nepažymėtas ir
+spauskite '''''Atstatyti'''''. Norėdami atlikti pasirinktinį atstatymą, pažymėkite varneles tų versijų, kurias norėtumėte atstatyti, ir spauskite '''''Atstatyti'''''. Paspaudus
+'''''Iš naujo''''' bus išvalytos visos varnelės bei komentaro laukas.",
+'undeletearticle' => 'Atstatyti ištrintą puslapį',
+'undeleterevisions' => '$1 versijos suarchyvuotos',
+'undeletehistory' => 'Jei atstatysite straipsnį, istorijoje bus atstatytos visos versijos.
+Jei po iÅ¡trynimo buvo sukurtas straipsnis tokiu paÄiu pavadinimu,
+atstatytos versijos atsiras ankstesnÄ—je istorijoje, o dabartinÄ—
+versija liks nepakeista.',
+'undeletehistorynoadmin' => 'Šis straipsnis buvo ištrintas. Trynimo priežastis yra
+rodoma žemiau, taip pat kas redagavo puslapį
+iki trynimo. Ištrintų puslapių tekstas yra galimas tik administratoriams.',
+'undeleterevision' => 'IÅ¡trinta $1 dienos versija',
+'undeleterevision-missing' => 'Neteisinga arba dingusi versija. Jūs turbūt turite blogą nuorodą, arba versija buvo atkurta arba pašalinta iš archyvo.',
+'undeletebtn' => 'Atstatyti',
+'undeletereset' => 'IÅ¡ naujo',
+'undeletecomment' => 'Komentaras:',
+'undeletedarticle' => 'atstatyta "[[$1]]"',
+'undeletedrevisions' => 'atstatyta $1 revizijų',
+'undeletedrevisions-files' => 'atkurtos $1 versijos ir $2 failai',
+'undeletedfiles' => '$1 failai atkurti',
+'cannotundelete' => 'Atkūrimas nepavyko; kažkas kitas pirmas galėjo atkurti puslapį.',
+'undeletedpage' => "<big>'''$1 buvo atkurtas'''</big>
+
+Peržiūrėkite [[{{ns:special}}:Log/delete|trynimų sąrašą]], norėdami rasti paskutinių trynimų ir atkūrimų sąrašą.",
+
+# Namespace form on various pages
+'namespace' => 'Vardų sritis:',
+'invert' => 'Žymėti priešingai',
+
+# Contributions
+'contributions' => 'Naudotojo įnašas',
+'mycontris' => 'Mano įnašas',
+'contribsub' => 'Naudotojo $1',
+'nocontribs' => 'Jokie keitimai neatitiko šių kriterijų.',
+'ucnote' => 'Žemiau yra šio naudotojo paskutiniai <b>$1</b> keitimai per pastarąsias <b>$2</b> dienas.',
+'uclinks' => 'Rodyti paskutinius $1 pakeitimus; rodyti paskutines $2 dienas.',
+'uctop' => ' (paskutinis)',
+'newbies' => 'naujokai',
+
+'sp-newimages-showfrom' => 'Rodyti naujus paveiklÄ—lius pradedant nuo $1',
+
+'sp-contributions-newest' => 'Naujausi',
+'sp-contributions-oldest' => 'Seniausi',
+'sp-contributions-newer' => '$1 naujesnių',
+'sp-contributions-older' => '$1 senesnių',
+'sp-contributions-newbies-sub' => 'Naujokams',
+
+# What links here
+'whatlinkshere' => 'SusijÄ™ puslapiai',
+'notargettitle' => 'Nenurodytas objektas',
+'notargettext' => 'JÅ«s nenurodÄ—te norimo puslapio ar naudotojo,
+kuriam įvykdyti šią funkciją.',
+'linklistsub' => '(Nuorodų sąrašas)',
+'linkshere' => "Šie puslapiai rodo į '''[[:$1]]''':",
+'nolinkshere' => "Į '''[[:$1]]''' nuorodų nėra.",
+'isredirect' => 'nukreipiamasis puslapis',
+'istemplate' => 'įterpimas',
+
+# Block/unblock
+'blockip' => 'Blokuoti naudotojÄ…',
+'blockiptext' => 'Naudokite šią formą norėdami uždrausti rašymo teises nurodytui IP adresi ar naudotojui. Tai turėtų būti atliekama tiktai tam, kad sustabdytumėte vandalizmą, ir pagal [[{{ns:project}}:Politika|politiką]].
+Žemiau nurodykite tikslią priežastį (pavyzdžiui, nurodydami sugadintus puslapius).',
+'ipaddress' => 'IP adresas',
+'ipadressorusername' => 'IP adresas arba naudotojo vardas',
+'ipbexpiry' => 'Galiojimo laikas',
+'ipbreason' => 'Priežastis',
+'ipbanononly' => 'Blokuoti tik anoniminius naudotojus',
+'ipbcreateaccount' => 'Neleisti kurti paskyrų',
+'ipbenableautoblock' => 'Automatiškai blokuoti šio naudotojo paskiausiai naudotą IP adresą, bei bet kokius vėlesnius adresus, iš kurių jie mėgina redaguoti',
+'ipbsubmit' => 'Blokuoti šį naudotoją',
+'ipbother' => 'Kitoks laikas',
+'ipboptions' => '2 valandos:2 hours,1 diena:1 day,3 dienos:3 days,1 savaite:1 week,2 savaitÄ—s:2 weeks,1 mÄ—nesis:1 month,3 mÄ—nesiai:3 months,6 mÄ—nesiai:6 months,1 metai:1 year,neribotai:infinite',
+'ipbotheroption' => 'kita',
+'badipaddress' => 'Neleistinas IP adresas',
+'blockipsuccesssub' => 'Užblokavimas pavyko',
+'blockipsuccesstext' => '[[{{ns:Special}}:Contributions/$1|$1]] buvo užblokuotas.
+<br />Aplankykite [[{{ns:special}}:Ipblocklist|IP blokavimų sąrašą]] norėdami jį peržiūrėti.',
+'unblockip' => 'Atblokuoti naudotojÄ…',
+'unblockiptext' => 'Naudokite šią formą, kad atkurtumėte rašymo teises
+ankÅ¡Äiau užblokuotam IP adresui ar naudotojui.',
+'ipusubmit' => 'Atblokuoti šį adresą',
+'unblocked' => '[[{{ns:user}}:$1|$1]] buvo atblokuotas',
+'ipblocklist' => 'Blokuotų IP adresų bei naudotojų sąrašas',
+'blocklistline' => '$1, $2 blokavo $3 ($4)',
+'infiniteblock' => 'neribotai',
+'expiringblock' => 'baigia galioti $1',
+'anononlyblock' => 'tik anonimai',
+'noautoblockblock' => 'automatinis blokavimas išjungtas',
+'createaccountblock' => 'paskyrų kūrimas uždraustas',
+'ipblocklistempty' => 'Užblokuotųjų sÄ…raÅ¡as tuÅ¡Äias.',
+'blocklink' => 'blokuoti',
+'unblocklink' => 'atblokuoti',
+'contribslink' => 'įnašas',
+'autoblocker' => 'Jūs buvote automatiškai užblokuotas, nes jūsų IP neseniai naudojo "[[{{ns:user}}:$1|$1]]". Duota priežastis naudotojo $1 užblokavimui: "\'\'\'$2\'\'\'".',
+'blocklogpage' => 'Blokavimų sąrašas',
+'blocklogentry' => 'blokavo "[[$1]]", blokavimo laikas - $2',
+'blocklogtext' => 'Čia yra naudotojų blokavimo ir atblokavimo sąrašas. Automatiškai blokuoti IP adresai nėra išvardinti. Jei norite pamatyti dabar blokuojamus adresus, žiūrėkite [[{{ns:special}}:Ipblocklist|IP blokavimų sąrašą]].',
+'unblocklogentry' => 'atblokavo $1',
+'range_block_disabled' => 'Administratoriaus galimybė kurti intevalinius blokus yra išjungta.',
+'ipb_expiry_invalid' => 'Galiojimo laikas neleistinas.',
+'ipb_already_blocked' => '"$1" jau užblokuotas',
+'ip_range_invalid' => 'Neleistina IP sritis.',
+'proxyblocker' => 'Tarpinių serverių blokuotojas',
+'ipb_cant_unblock' => 'Klaida: Blokavimo ID $1 nerastas. Galbūt jis jau atblokuotas.',
+'proxyblockreason' => 'Jūsų IP adresas yra užblokuotas, nes jis yra atvirasis tarpinis serveris. Prašome susisiekti su savo interneto paslaugų tiekėju ar technine pagalba ir praneškite jiems apie šią svarbią saugumo problemą.',
+'proxyblocksuccess' => 'Atlikta.',
+'sorbs' => 'DNSBL',
+'sorbsreason' => 'Jūsų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą šios svetainės.',
+'sorbs_create_account_reason' => 'Jūsų IP adresas yra įtrauktas į atvirųjų tarpinių serverių DNSBL sąrašą, naudojamą šios svetainės. Jūs negalite sukurti paskyros',
+
+# Developer tools
+'lockdb' => 'Užrakinti duomenų bazę',
+'unlockdb' => 'Atrakinti duomenų bazę',
+'lockdbtext' => 'Užrakinus duomenų bazę sustabdys galimybę visiems
+naudotojams redaguoti puslapius, keisti jų nustatymus, keisti jų stebimųjų sąrašą bei
+kitus dalykus, reikalaujanÄius pakeitimų duomenų bazÄ—je.
+Prašome patvirtinti, kad tai, ką ketinate padaryti, ir kad jūs
+atrakinsite duomenų bazę, kai techninė profilaktika bus baigta.',
+'unlockdbtext' => 'Atrakinus duomenų bazę grąžins galimybę visiems
+naudotojams redaguoti puslapius, keisti jų nustatymus, keisti jų stebimųjų sąrašą bei
+kitus dalykus, reikalaujanÄius pakeitimų duomenų bazÄ—je.
+Prašome patvirtinti tai, ką ketinate padaryti.',
+'lockconfirm' => 'Taip, aš tikrai noriu užrakinti duomenų bazę.',
+'unlockconfirm' => 'Taip, aš tikrai noriu atrakinti duomenų bazę.',
+'lockbtn' => 'Užrakinti duomenų bazę',
+'unlockbtn' => 'Atrakinti duomenų bazę',
+'locknoconfirm' => 'Jūs neuždėjote patvirtinimo varnelės.',
+'lockdbsuccesssub' => 'Duomenų bazės užrakinimas pavyko',
+'unlockdbsuccesssub' => 'Duomenų bazės užrakinimas pašalintas',
+'lockdbsuccesstext' => 'Duomenų bazė buvo užrakinta.
+<br />Nepamirškite [[Special:Unlockdb|pašalinti užraktą]], kai techninė profilaktika bus baigta.',
+'unlockdbsuccesstext' => 'Duomenų bazė buvo atrakinta.',
+'lockfilenotwritable' => 'Duomenų bazės užrakto failas nėra įrašomas. Norint užrakinti ar atrakinti duomenų bazę, tinklapio serveris privalo turėti įrašymo teises šiam failui.',
+'databasenotlocked' => 'Duomenų bazė neužrakinta.',
+
+# Make sysop
+'makesysoptitle' => 'Padaryti naudotojÄ… administratoriumi',
+'makesysoptext' => 'Ši forma yra naudojama biurokratų, kad paprastus naudotojus pavestų į administratorius.
+Įveskite naudotojo vardą ir paspauskite mygtuką, kad padarytumėte naudotoją administratoriumi',
+'makesysopname' => 'Naudotojo vardas:',
+'makesysopsubmit' => 'Padaryti šį naudotoją administratoriumi',
+'makesysopok' => '<b>Naudotojas "$1" dabar yra administratorius</b>',
+'makesysopfail' => '<b>Naudotojo "$1" nepavyko padaryti administratoriumi. (Ar teisingai įvedėte vardą?)</b>',
+'setbureaucratflag' => 'Nustatatyti biurokrato žymę',
+'rightslog' => 'Naudotojų teisių istorija',
+'rightslogtext' => 'Pateikiamas naudotojų teisių pasikeitimų sąrašas.',
+'rightslogentry' => 'pakeista $1 grupės narystė iš $2 į $3',
+'rights' => 'TeisÄ—s:',
+'set_user_rights' => 'Nustatyti naudotojo teises',
+'user_rights_set' => '<b>"$1" naudotojo teisÄ—s atnaujintos</b>',
+'set_rights_fail' => '<b>"$1" naudotojo teisės negali būti nustatytos. (Ar teisingai įvedėte vardą?)</b>',
+'makesysop' => 'Padaryti naudotojÄ… administratoriumi',
+'already_sysop' => 'Naudotojas jau yra administratorius',
+'already_bureaucrat' => 'Naudotojas jau yra biurokratas',
+'rightsnone' => '(jokių)',
+
+# Move page
+'movepage' => 'Puslapio pervadinimas',
+'movepagetext' => "Naudodamiesi žemiau pateikta forma, pervadinsite puslapį
neprarasdami jo istorijos.
-Senas straipsnio pavadinimas taps nukreipiamuoju - rodys į naująjį.
-Nuorodos į straipsnį nebus automatiškai pakeistos, todėl būtinai
-[[Special:Maintenance|patikrinkite]] ar nesukūrėte dvigubų ar
+Senasis pavadinimas taps nukreipiamuoju - rodys į naująjį.
+Nuorodos į senąjį puslapį nebus automatiškai pakeistos, todėl būtinai
+patikrinkite ar nesukūrėte dvigubų ar
neveikianÄių nukreipimų.
-Jūs esate atsakingas už tai, kad nuorodos rodytų į teisingą straipsnį.
+Jūs esate atsakingas už tai, kad nuorodos rodytų į ten, kur ir norėta.
-Pažymėtina, kad puslapis nebus pervadintas, jei jau yra straipsnis
-nauju pavadinimu, nebent tas straipsnis tuÅ¡Äias arba nukreipiamasis ir
-neturi redagavimo istorijos. Taigi, jūs galite pervadinti straipsnį
+Primename, kad puslapis '''nebus''' pervadintas, jei jau yra puslapis
+nauju pavadinimu, nebent tas puslapis tuÅ¡Äias arba nukreipiamasis ir
+neturi redagavimo istorijos. Taigi, jūs galite pervadinti puslapį
seniau naudotu vardu, jei prieš tai jis buvo per klaidą pervadintas,
o egzistuojanÄių puslapių sugadinti negalite.
<b>DÄ–MESIO!</b>
-Jei pervadinate populiarų straipsnį, tai gali sukelti nepageidaujamų
+Jei pervadinate populiarų puslapį, tai gali sukelti nepageidaujamų
šalutinių efektų, dėl to šį veiksmą vykdykite tik įsitikinę,
-kad suprantate visas pasekmes.',
-'movereason' => 'Priežastis',
-'movetalk' => 'Jei įmanoma, kartu perkelti aptarimo puslapį.',
-'movethispage' => 'Pervadinti straipsnį',
-'mw_math_html' => 'HTML kai įmanoma, kitaip - PNG',
-'mw_math_mathml' => 'MathML jei įmanoma (eksperimentinis)',
-'mw_math_modern' => 'Rekomenduojama modernioms naršyklėms',
-'mw_math_png' => 'Visada formuoti PNG',
+kad suprantate visas pasekmes.",
+'movepagetalktext' => "Susietas aptarimo puslapis bus automatiškai perkeltas kartu su juo, '''išskyrus:''':
+*Puslapis nauju pavadinimu jau turi netuÅ¡ÄiÄ… aptarimo puslapį, arba
+*Paliksite žemiau esanÄia varnelÄ™ nepažymÄ—tÄ….
+
+Šiais atvejais jūs savo nuožiūra turite perkelti arba apjungti aptarimo puslapį.",
+'movearticle' => 'Puslapio pervadinimas',
+'movenologin' => 'Neprisijungęs',
+'movenologintext' => 'Norėdami pervadinti puslapį, turite būti užsiregistravęs naudotojas ir būti [[{{ns:special}}:Userlogin|prisijungęs]].',
+'newtitle' => 'Naujas pavadinimas',
+'movepagebtn' => 'Pervadinti puslapį',
+'pagemovedsub' => 'Pervadinta sÄ—kmingai',
+'pagemovedtext' => 'Puslapis "[[$1]]" pervadintas į "[[$2]]".',
+'articleexists' => 'Puslapis tokiu pavadinimu jau egzistuoja
+arba pasirinktas vardas yra neteisingas.
+Pasirinkite kitÄ… pavadinimÄ….',
+'talkexists' => "'''Pats puslapis buvo sėkmingai pervadintas, bet aptarimų puslapis nebuvo perkeltas, kadangi naujo
+pavadinimo straipsnis jau turėjo aptarimų puslapį.
+Prašome sujungti šiuos puslapius.'''",
+'movedto' => 'pervardintas į',
+'movetalk' => 'Perkelti susijusį aptarimo puslapį.',
+'talkpagemoved' => 'Susietas aptarimo puslapis buvo taip pat perkeltas.',
+'talkpagenotmoved' => 'Susietas aptarimo puslapis <strong>nebuvo</strong> perkeltas.',
+'1movedto2' => '[[$1]] pervadintas į [[$2]]',
+'1movedto2_redir' => '[[$1]] pervadintas į [[$2]] (anksÄiau buvo nukreipiamasis)',
+'movelogpage' => 'Perkėlimų sąrašas',
+'movelogpagetext' => 'Perkeltų puslapių sąrašas.',
+'movereason' => 'Priežastis',
+'revertmove' => 'atkurti',
+'delete_and_move' => 'IÅ¡trinti ir perkelti',
+'delete_and_move_text' => '==Reikalingas ištrynimas==
+
+Paskirties straipsnis "[[$1]]" jau yra. Ar norite jį ištrinti, kad galėtumėte pervardinti?',
+'delete_and_move_confirm' => 'Taip, trinti puslapį',
+'delete_and_move_reason' => 'IÅ¡trinta dÄ—l perkÄ—limo',
+'selfmove' => 'Šaltinio ir paskirties pavadinimai yra tokie patys; negalima pervardinti puslapio į save.',
+'immobile_namespace' => 'Šaltinio arba paskirties pavadinimas yra specialiojo tipo; negalima pervadinti iš ir į tą vardų sritį.',
+
+# Export
+'export' => 'Eksportuoti puslapius',
+'exporttext' => 'Galite eksportuoti vieno puslapio tekstą ir istoriją ar kelių puslapių vienu metu
+tame paÄiame XML atsakyme. Å ie puslapiai galÄ—s bÅ«ti importuojami į kitÄ…
+projektą, veikiantį MediaWiki pagrindu, per {{ns:special}}:Import puslapį.
+
+NorÄ—dami eksportuoti puslapius, įveskite pavadinimus žemiau esanÄiame tekstiniame lauke
+po vienÄ… pavadinimÄ… eilutÄ—je, taip pat pasirinkite ar norite eksportuoti ir istorijÄ…
+ar tik dabartinÄ™ versijÄ… su paskutinio redagavimo informacija.
+
+Pastaruoju atveju, jūs taip pat galite naudoti nuorodą, pvz. [[{{ns:Special}}:Export/{{int:mainpage}}]] straipsniui [[{{int:mainpage}}]].',
+'exportcuronly' => 'Eksportuoti tik dabartinę versiją, neįtraukiant istorijos',
+'exportnohistory' => "----
+'''Pastaba:''' Pilnos puslapių istorijos eksportavimas naudojantis šia forma yra išjungtas dėl spartos.",
+'export-submit' => 'Ekportuoti',
+
+# Namespace 8 related
+'allmessages' => 'Sistemos pranešimų sąrašas',
+'allmessagesname' => 'Pavadinimas',
+'allmessagesdefault' => 'Pradinis tekstas',
+'allmessagescurrent' => 'Dabartinis tekstas',
+'allmessagestext' => 'ÄŒia pateikiamas sisteminių praneÅ¡imų sÄ…raÅ¡as, esanÄių MediaWiki vardų srityje.',
+'allmessagesnotsupportedUI' => 'Jūsų pasirinkta kalba <b>$1</b> nėra palaikoma puslapyje {{ns:special}}:Allmessages šioje svetainėje.',
+'allmessagesnotsupportedDB' => '\'\'\'{{ns:special}}:Allmessages\'\'\' nepalaikoma, nes nustatymas \'\'\'$wgUseDatabaseMessages\'\'\' yra išjungtas.',
+'allmessagesfilter' => 'Tekstų pavadinimo filtras:',
+'allmessagesmodified' => 'Rodyti tik pakeistus',
+
+# Thumbnails
+'thumbnail-more' => 'Padidinti',
+'missingimage' => '<b>Trūkstamas paveikslėlis</b><br /><i>$1</i>',
+'filemissing' => 'Dingęs failas',
+'thumbnail_error' => 'Klaida kuriant sumažintą paveiklėlį: $1',
+
+# Special:Import
+'import' => 'Importuoti puslapius',
+'importinterwiki' => 'Tarpprojektinis importas',
+'import-interwiki-text' => 'Pasirinkite projektÄ… ir puslapio pavadinimÄ… importavimui.
+Versijų datos ir redaktorių vardai bus išlaikyti.
+Visi tarpprojektiniai importo veiksmai yra registruojami [[Special:Log/import|importo istorijoje]].',
+'import-interwiki-history' => 'Kopijuoti visas istorijos versijas Å¡iam puslapiui',
+'import-interwiki-submit' => 'Importuoti',
+'import-interwiki-namespace' => 'Perkelti puslapius į vardų sritį:',
+'importtext' => 'PraÅ¡ome eksportuoti failÄ… iÅ¡ projekto-Å¡altinio naudojantis {{ns:special}}:Export priemone, iÅ¡saugokite jį savo diske ir įkelkite jį Äia.',
+'importstart' => 'Imporuojami puslapiai...',
+'import-revision-count' => '$1 {{PLURAL:$1|versija|versijos|versijų}}',
+'importnopages' => 'Nėra puslapių importavimui.',
+'importfailed' => 'Importavimas nepavyko: $1',
+'importunknownsource' => 'Nežinomas importo šaltinio tipas',
+'importcantopen' => 'Nepavyksta atverti importo failo',
+'importbadinterwiki' => 'Bloga tarpprojektinÄ— nuoroda',
+'importnotext' => 'TuÅ¡Äia arba jokio teksto',
+'importsuccess' => 'Importas pavyko!',
+'importhistoryconflict' => 'Yra konfliktuojanti istorijos versija (galbÅ«t Å¡is puslapis buvo importuotas anksÄiau)',
+'importnosources' => 'Nenustatyti transwiki importo šaltiniai, o tiesioginis praeities įkėlimas uždraustas.',
+'importnofile' => 'Nebuvo įkeltas joks importo failas.',
+'importuploaderror' => 'Importo failo įkelimas nepavyko; galbūt failas yra didesnis nei leidžiamas įkėlimo dydis.',
+
+# Import log
+'importlogpage' => 'Importo istorija',
+'importlogpagetext' => 'Administraciniai puslapių importai su keitimų istorija iš kitų wiki projektų.',
+'import-logentry-upload' => 'importuota $1 įkėliant failą',
+'import-logentry-upload-detail' => '$1 {{plural:$1|keitimas|keitimai|keitimų}}',
+'import-logentry-interwiki' => 'tarpprojektinis $1',
+'import-logentry-interwiki-detail' => '$1 {{plural:$1|keitimas|keitimai|keitimų}} iš $2',
+
+# Keyboard access keys for power users
+'accesskey-search' => 'f',
+'accesskey-minoredit' => 'i',
+'accesskey-save' => 's',
+'accesskey-preview' => 'p',
+'accesskey-diff' => 'v',
+'accesskey-compareselectedversions' => 'v',
+'accesskey-watch' => 'w',
+
+# Tooltip help for some actions, most are in Monobook.js
+'tooltip-search' => 'Ieškoti projekte {{SITENAME}} [alt-f]',
+'tooltip-minoredit' => 'Pažymėti keitimą kaip smulkų [alt-i]',
+'tooltip-save' => 'IÅ¡saugoti pakeitimus [alt-s]',
+'tooltip-preview' => 'Pakeitimų peržiūra, prašome pažiūrėti prieš išsaugant! [alt-p]',
+'tooltip-diff' => 'Rodo, kokius pakeitimus padarÄ—te tekste. [alt-v]',
+'tooltip-compareselectedversions' => 'Žiūrėti dviejų pasirinktų puslapio versijų skirtumus. [alt-v]',
+'tooltip-watch' => 'Pridėti šį straipsnį prie stebimų [alt-w]',
+
+# Stylesheets
+'common.css' => '/** Čia įdėtas CSS bus taikomas visoms išvaizdoms */',
+'monobook.css' => '/* Čia įdėtas CSS bus rodomas Monobook išvaizdos naudotojams */',
+
+# Metadata
+'nodublincore' => 'Dublin Core RDF metaduomenys yra išjungti šiame serveryje.',
+'nocreativecommons' => 'Creative Commons RDF metaduomenys yra išjungti šiame serveryje.',
+'notacceptable' => 'Projekto serveris negali pateikti duomenų formatu, kurį jūsų klientas galėtų skaityti.',
+
+# Attribution
+'anonymous' => 'neregistruotų {{SITENAME}} naudotojų',
+'siteuser' => '{{SITENAME}} naudotojas $1',
+'lastmodifiedatby' => 'Šį puslapį paskutinį kartą redagavo $3 $2, $1.', # $1 date, $2 time, $3 user
+'and' => 'ir',
+'othercontribs' => 'Paremta $1 darbu.',
+'others' => 'kiti',
+'siteusers' => '{{SITENAME}} naudotojas(-ai) $1',
+'creditspage' => 'Puslapio kūrėjai',
+'nocredits' => 'Kūrėjų informacija negalima šiam puslapiui.',
+
+# Spam protection
+'spamprotectiontitle' => 'Priešreklaminis filtras',
+'spamprotectiontext' => 'Puslapis, kurį norėjote išsaugoti buvo užblokuotas priešreklaminio filtro. Tai turbūt sukėlė nuoroda į kitą svetainę.',
+'spamprotectionmatch' => 'Šis tekstas buvo atpažintas priešreklaminio filtro: $1',
+'subcategorycount' => 'Kategorijoje yra $1 {{PLURAL:$1|subkategorija|subkategorijos|subkategorijų}}',
+'categoryarticlecount' => 'Kategorijoje yra $1 {{plural:$1|straipsnis|straipsniai|straipsnių}}',
+'category-media-count' => 'Kategorijoje yra $1 {{PLURAL:$1|failas|failai|failų}}.',
+'listingcontinuesabbrev' => ' tęs.',
+'spambot_username' => 'MediaWiki reklamų šalinimas',
+'spam_reverting' => 'Atkuriama į ankstesnÄ™ versijÄ…, neturinÄios nuorodų į $1',
+'spam_blanking' => 'Visos versijos turėjo nuorodų į $1, išvaloma',
+
+# Info page
+'infosubtitle' => 'Puslapio informacija',
+'numedits' => 'Keitimų skaiÄius (straipsnis): $1',
+'numtalkedits' => 'Keitimų skaiÄius (aptarimo puslapis): $1',
+'numwatchers' => 'StebinÄiųjų skaiÄius: $1',
+'numauthors' => 'Skirtingų autorių skaiÄius (straipsnis): $1',
+'numtalkauthors' => 'Skirtingų autorių skaiÄius (aptarimo puslapis): $1',
+
+# Math options
+'mw_math_png' => 'Visada formuoti PNG',
'mw_math_simple' => 'HTML paprastais atvejais, kitaip - PNG',
+'mw_math_html' => 'HTML kai įmanoma, kitaip - PNG',
'mw_math_source' => 'Palikti TeX formatą (tekstinėms naršyklėms)',
-'mycontris' => 'Mano įnašas',
-'mypage' => 'Mano puslapis',
-'mytalk' => 'mano aptarimas',
-'namespace' => 'Vardų sritis:',
-'namespacesall' => 'visos',
-'navigation' => 'Navigacija',
-'nbytes' => '$1 B',
-'newarticle' => '(Naujas)',
-'newarticletext' => 'JÅ«s patekote į neegzistuojanÄio straipsnio puslapį.
-NorÄ—dami sukurti straipsnį, pradÄ—kite žemiau esanÄiame įvedimo lauke
-(plaÄiau [[Help:Kaip pradÄ—ti puslapį|apie puslapių kÅ«rimÄ…]]).
-Jei patekote Äia per klaidÄ…, paprasÄiausiai spustelkite narÅ¡yklÄ—s mygtukÄ… \'atgal\' (\'\'\'back\'\'\').<br />
-\'\'\'Nepamirškite\'\'\' straipsnio turinį pateikti taip, kad žmogus suprastu tekstą be konteksto (dažniausiai žmonės pateks į šį puslapį visai kitu keliu, nei patekote jūs).',
-'newimages' => 'Naujausi paveikslÄ—liai',
-'newmessageslink' => 'naujų žinuÄių',
-'newpages' => 'Naujausi straipsniai',
-'newpassword' => 'Naujas slaptažodis',
-'newtitle' => 'Naujas pavadinimas',
-'newwindow' => '(atsidaro naujame lange)',
-'next' => 'sekantis',
-'nextdiff' => 'Sekantis pakeitimas →',
-'nextn' => 'sekanÄius $1',
-'nextpage' => 'Sekantis puslapis ($1)',
-'nextrevision' => 'Sekanti versija→',
-'nlinks' => '$1 k.',
-'noarticletext' => '<div style="border: 1px solid #ccc; padding: 7px; background-color: #fff; color: #000">\'\'\'Projekte nÄ—ra straipsnio norimu pavadinimu.\'\'\'
-* \'\'\'[{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} Sukurti straipsnį \'{{PAGENAME}}\']\'\'\'.
-* [[{{ns:special}}:Search/{{PAGENAME}}|Ieškoti teksto {{PAGENAME}}]] kituose straipsniuose.
-* [[wikt:{{NAMESPACE}}:{{PAGENAME}}|Tikrinti straipsnį {{PAGENAME}}]] Wikižodyne, susijusiame projekte.
-* [[Commons:{{NAMESPACE}}:{{PAGENAME}}|Tikrinti straipsnį {{PAGENAME}}]] Commons projekte, kur saugomi nemokami paveiksėliai ir kita media informacija.
-* [[{{ns:special}}:Allpages/{{PAGENAME}}|Žiūrėti straipsnių sąrašą]], pradedant \'{{PAGENAME}}\'.
-----
-* \'\'\'Jei sukÅ«rÄ—te šį straipsnį prieÅ¡ keletÄ… minuÄių ir matote šį praneÅ¡imÄ…, tai gali bÅ«ti dÄ—l techninių trukdžių atnaujinant duomenų bazes.\'\'\' PraÅ¡ome palaukti ir vÄ—l patikrinti prieÅ¡ bandant iÅ¡ naujo kurti straipsnį.
-* Jei anksÄiau esate sukÅ«rÄ™s straipsnį Å¡iuo pavadinimu, jis gali bÅ«ti iÅ¡trintas dÄ—l įvairių priežasÄių.
-</div>',
-'noexactmatch' => '<span style="font-size: 135%; font-weight: bold; margin-left: .6em">Straipsnis tiksliu įvestu pavadinimu neegzistuoja.</span>
-
-<span style="display: block; margin: 1.5em 2em">
-Galite \'\'\'[[:<nowiki>$1</nowiki>|sukurti straipsnį šiuo pavadinimu]]\'\'\'.
-
-<span style="display:block; font-size: 89%; margin-left:.2em">PrieÅ¡ kurdami straipsnį, atidžiai paieÅ¡kokite, ar Projekte nÄ—ra panaÅ¡aus straipsnio, kad iÅ¡vengti besidubliuojanÄių straipsnių.</span>
-</span>',
-'nohistory' => 'Šiam straipsniui nėra versijų istorijos.',
-'noimage' => 'Failas tokiu pavadinimu neegzistuoja. Jūs galite jį $1',
-'noimage-linktext' => 'įkelti',
-'nolinkshere' => 'Į šį puslapį nuorodų nėra.',
-'nolinkstoimage' => 'PaveikslÄ—lis nenaudojamas nei viename straipsnyje.',
-'note' => '<strong>Pastaba:</strong>',
-'notloggedin' => 'Neprisijungęs',
-'nov' => 'Lap',
-'november' => 'LapkriÄio',
-'nowatchlist' => 'Neturite nei vieno stebimo straipsnio.',
-'nstab-category' => 'Kategorija',
-'nstab-help' => 'Pagalba',
-'nstab-image' => 'PaveikslÄ—lis',
-'nstab-main' => 'Straipsnis',
-'nstab-media' => 'Failas',
-'nstab-mediawiki' => 'Tekstas',
-'nstab-special' => 'Specialus',
-'nstab-template' => 'Å ablonas',
-'nstab-user' => 'Vartotojas',
-'nstab-project' => 'Apie',
-'oct' => 'Spa',
-'october' => 'Spalio',
-'oldpassword' => 'Senas slaptažodis',
-'otherlanguages' => 'Kitomis kalbomis',
-'pagemovedsub' => 'Pervadinta sÄ—kmingai',
-'pagemovedtext' => 'Straipsnis "[[$1]]" pervadintas. Naujas vardas - "[[$2]]".
-
-\'\'\'Nepamirškite [[{{ns:Special}}:Whatlinkshere/$2|patikrinti]]\'\'\' ar perkeliant nebuvo sukurta dvigubų nukreipimų, o jei sukurta, prašome juos pataisyti.',
-'perfcached' => 'Rodoma išsaugota duomenų kopija, todėl duomenys gali būti ne patys naujausi:',
-'permalink' => 'NuolatinÄ— nuoroda',
-'personaltools' => 'Asmeniniai įrankiai',
-'portal' => 'BendruomenÄ—',
-'portal-url' => '{{ns:project}}:BendruomenÄ—',
-'postcomment' => 'Rašyti komentarą',
-'preferences' => 'Nustatymai',
-'prefixindex' => 'Rodyklė pagal pavadinimo pradžią',
-'prefs-help-email' => '* El. paštas (neprivalomas): Leidžia kitiems pasiekti jus elektroniniu paštu, nesužinant adreso.',
-'prefs-help-email-enotif' => 'Šis adresas tai pat naudojamas siųsti pranešimus, jei pasirinkote tokius pranešimus gauti.',
-'prefs-help-realname' => '¹ Tikras vardas (neprivaloma): if you choose to provide it this will be used for giving you attribution for your work.',
-'prefs-misc' => 'Įvairūs nustatymai',
-'prefs-personal' => 'Vartotojo duomenys',
-'prefs-rc' => 'Naujausių pasikeitimų vaizdavimas',
-'preview' => 'Peržiūra',
-'previewnote' => 'Nepamirškite, kad tai tik peržiūra, pakeitimai dar nėra išsaugoti!',
-'previousdiff' => '↠Prieš tai darytas keitimas',
-'previousrevision' => 'â†PrieÅ¡ tai buvusi versija',
-'prevn' => 'ankstesnius $1',
-'printableversion' => 'Versija spausdinimui',
-'protect' => 'Užrakinti',
-'protectcomment' => 'Rakinimo priežastis',
-'protectedarticle' => 'užrakino $1',
-'protectedpage' => 'Užrakintas puslapis',
-'protectedpagewarning' => '<strong>DĖMESIO: Šis puslapis yra užrakintas ir jį redaguoti gali tik administratoriaus teises turintys vartotojai. Nepamirškite laikytis
-[[{{ns:project}}:Puslapių rakinimas|užrakintų puslapių]] taisyklių.</strong>',
-'protectedtext' => 'Šis puslapis yra užrakintas, saugant jį nuo redagavimo;
-tai gali bÅ«ti padaryta dÄ—l skirtingų priežasÄių, plaÄiau -
-[[{{ns:project}}:Puslapių rakinimas|Puslapių rakinimas]].
-
-Jūs galite žiūrėti straipsnio turinį arba jį kopijuoti:',
-'protectlogpage' => 'Rakinimų_sąrašas',
-'protectlogtext' => 'Žemiau yra užrakinimų bei atrakinimų sąrašas.
-Daugiau informacijos puslapyje [[{{ns:project}}:Puslapių rakinimas|Puslapių rakinimas]].',
-'protectmoveonly' => 'Uždrausti tik perkėlimus',
-'protectsub' => '(Rakinamas "$1")',
-'protectthispage' => 'Rakinti šį puslapį',
-'qbbrowse' => 'Naršymas',
-'qbedit' => 'Redagavimas',
-'qbfind' => 'Paieška',
-'qbmyoptions' => 'Mano puslapiai',
-'qbpageinfo' => 'Kontekstas',
-'qbpageoptions' => 'Straipsnis',
-'qbsettings' => 'Greitasis pasirinkimas',
-'qbspecialpages' => 'Specialieji puslapiai',
-'randompage' => 'Atsitiktinis straipsnis',
-'rclinks' => 'Rodyti paskutinius $1 pakeitimų per paskutiniąsias $2 dienas(ų)<br />$3',
-'rclistfrom' => 'Rodyti pakeitimus pradedant $1',
-'rclsub' => '(straipsnių, pasiekiamų iš "$1")',
-'rcnote' => 'Pateikiamas <strong>$1</strong> paskutinių pakeitimų sąrašas per paskutiniąsias <strong>$2</strong> dienas(ų).',
-'rcnotefrom' => 'Žemiau yra pakeitimai pradedant <b>$2</b> (rodoma ne daugiau <b>$1</b> pakeitimų).',
-'readonly' => 'Duomenų bazė užrakinta',
-'readonlytext' => 'Enciklopedijos duomenų bazė šiuo metu yra užrakinta, todėl
-negalima rašyti naujų straipsnių ar redaguoti senų,
-paprastai duomenų bazė rakinama techninei profilaktikai,
-taigi vėliau bus atrakinta ir enciklopedija grįš į senas vėžes.
-Užrakinusiojo administratoriaus pateiktas rakinimo aprašymas:
-<p>$1',
-'recentchanges' => 'Naujausi keitimai',
-'recentchangesall' => 'visos',
-'recentchangescount' => 'Kiek pakeitimų rodoma naujausių keitimų sąraše',
-'recentchangeslinked' => 'SusijÄ™ keitimai',
-'redirectedfrom' => '(Nukreipta iš puslapio $1)',
-'remembermypassword' => 'Atsiminti slaptažodį.',
-'removechecked' => 'Išmesti pažymėtus straipsnius iš stebimų sąrašo',
-'removedwatch' => 'Išmesta iš stebimų',
-'removedwatchtext' => 'Straipsnis "$1" išmestas iš jūsų stebimų straipsnių sąrašo.',
-'removingchecked' => 'Pasirinkti straipsniai išmetami iš stebimų sąrašo...',
-'resetprefs' => 'Atšaukti nustatymus',
-'restorelink' => 'ištrintų versijų: $1',
-'resultsperpage' => 'Rezultatų puslapyje',
-'retrievedfrom' => 'Rodomas puslapis "$1"',
-'returnto' => 'Grįžti į $1.',
-'retypenew' => 'Pakartokite naują slaptažodį',
-'reupload' => 'Pakartoti įkėlimą',
-'reuploaddesc' => 'Grįžti į įkėlimo formą.',
-'revertimg' => 'atst',
-'revertpage' => 'Atmestas $2 pakeitimas, grąžinta paskutinė versija (vartotojo $1 keitimas)',
-'revhistory' => 'Straipsnio istorija',
-'revisionasof' => '$1 versija',
-'revnotfound' => 'Versija nerasta',
-'revnotfoundtext' => 'Norima straipsnio versija nerasta.
-Patikrinkite adresą (URL), kurio patekote į šį puslapį.',
-'rightslogtext' => 'Pateikiamas vartotojų teisių pasikeitimų sąrašas.',
-'rollback_short' => 'Atmesti',
-'rollbacklink' => 'atmesti',
-'rows' => 'EilutÄ—s',
-'saturday' => 'Šeštadienis',
-'savearticle' => 'IÅ¡saugoti',
-'savedprefs' => 'Nustatymai sėkmingai išsaugoti.',
-'savefile' => 'IÅ¡saugoti failÄ…',
-'saveprefs' => 'IÅ¡saugoti nustatymus',
-'search' => 'Paieška',
-'searchbutton' => 'Paieška',
-'searchdisabled' => '<p style="margin: 1.5em 2em 1em">Projekto \'{{SITENAME}}\' paieÅ¡ka yra uždrausta dÄ—l techninių kliÅ«Äių. Galite mÄ—ginti ieÅ¡koti Google paieÅ¡kos sistemoje.
-<span style="font-size: 89%; display: block; margin-left: .2em">Išorinėse paieškos sistemose (kaip Google) Vikipedijos gali būti šiek tiek pasenę duomenys.</span></p>',
-'searchsubtitle' => 'Ieškoma "[[:$1]]"',
-'searchsubtitleinvalid' => 'Ieškoma "$1"',
-'searchresults' => 'Paieškos rezultatai',
-'searchresultshead' => 'Paieškos nustatymai',
-'searchresulttext' => 'Daugiau informacijos apie paiešką {{SITENAME}} projekte rasite - [[Help:Searching|Paieška projekte]].',
-'sep' => 'Rgs',
-'september' => 'RugsÄ—jo',
-'servertime' => 'Serverio laikas yra',
-'shortpages' => 'Trumpiausi straipsniai',
-'show' => 'Rodyti',
+'mw_math_modern' => 'Rekomenduojama modernioms naršyklėms',
+'mw_math_mathml' => 'MathML jei įmanoma (eksperimentinis)',
+
+# Patrolling
+'markaspatrolleddiff' => 'Žymėti, kad patikrinta',
+'markaspatrolledtext' => 'Pažymėti, kad straipsnis patikrintas',
+'markedaspatrolled' => 'Pažymėtas kaip patikrintas',
+'markedaspatrolledtext' => 'Pasirinkta versija sėkmingai pažymėta kaip patikrinta',
+'rcpatroldisabled' => 'Paskutinių keitimų tikrinimas išjungtas',
+'rcpatroldisabledtext' => 'Paskutinių keitimų tikrinimo funkcija šiuo metu išjungta.',
+'markedaspatrollederror' => 'Negalima pažymėti, kad patikrinta',
+'markedaspatrollederrortext' => 'Jums reikia nurodyti versiją, kurią pažymėti kaip patikrintą.',
+'markedaspatrollederror-noautopatrol' => 'Jums neleidžiama pažymėti savo paties keitimų kaip patikrintų.',
+
+# Monobook.js: tooltips and access keys for monobook
+'monobook.js' => "/* patarimai ir spartieji klavišai */
+var ta = new Object();
+ta['pt-userpage'] = new Array('.','Mano naudotojo puslapis');
+ta['pt-anonuserpage'] = new Array('.','Naudotojo puslapis jūsų IP adresui');
+ta['pt-mytalk'] = new Array('n','Mano aptarimo puslapis');
+ta['pt-anontalk'] = new Array('n','Pakeitimų aptarimas, darytus naudojant šį IP adresą');
+ta['pt-preferences'] = new Array('','Mano nustatymai');
+ta['pt-watchlist'] = new Array('l','Puslapių sąrašas, kuriuos jūs pasirinkote stebėti.');
+ta['pt-mycontris'] = new Array('y','Mano darytų keitimų sąrašas');
+ta['pt-login'] = new Array('o','Rekomenduojame prisijungti, nors tai nÄ—ra privaloma.');
+ta['pt-anonlogin'] = new Array('o','Rekomenduojame prisijungti, nors tai nÄ—ra privaloma.');
+ta['pt-logout'] = new Array('','Atsijungti');
+ta['ca-talk'] = new Array('t','Puslapio turinio aptarimas');
+ta['ca-edit'] = new Array('e','Jūs galite redaguoti šį puslapį. Nepamirškite paspausti peržiūros mygtuka prieš išsaugodami.');
+ta['ca-addsection'] = new Array('+','Pridėti komentarą į aptarimą.');
+ta['ca-viewsource'] = new Array('e','Puslapis yra užrakintas. Galite pažiūrėti turinį.');
+ta['ca-history'] = new Array('h','AnkstesnÄ—s puslapio versijos.');
+ta['ca-protect'] = new Array('=','Užrakinti šį puslapį');
+ta['ca-delete'] = new Array('d','Ištrinti šį puslapį');
+ta['ca-undelete'] = new Array('d','Atkurti puslapį su visais darytais keitimais');
+ta['ca-move'] = new Array('m','Pervadinti puslapį');
+ta['ca-watch'] = new Array('w','Pridėti puslapį į stebimųjų sąrašą');
+ta['ca-unwatch'] = new Array('w','Pašalinti puslapį iš stebimųjų sąrašo');
+ta['search'] = new Array('f','Ieškoti šiame projekte');
+ta['p-logo'] = new Array('','Pradinis puslapis');
+ta['n-mainpage'] = new Array('z','Eiti į pradinį puslapį');
+ta['n-portal'] = new Array('','Apie projektÄ…, kÄ… galima daryti, kur kÄ… rasti');
+ta['n-currentevents'] = new Array('','Raskite naujausiÄ… informacijÄ…');
+ta['n-recentchanges'] = new Array('r','Paskutinių keitimų sąrašas šiame projekte.');
+ta['n-randompage'] = new Array('x','Atidaryti atsitiktinį puslapį');
+ta['n-help'] = new Array('','Vieta, kur rasite rūpimus atsakymus.');
+ta['n-sitesupport'] = new Array('','PadÄ—kite mums');
+ta['t-whatlinkshere'] = new Array('j','Puslapių sÄ…raÅ¡as, rodanÄių į Äia');
+ta['t-recentchangeslinked'] = new Array('k','Paskutiniai keitimai straipsniuose, pasiekiamuose iš šio straipsnio');
+ta['feed-rss'] = new Array('','Å io puslapio RSS kanalas');
+ta['feed-atom'] = new Array('','Å io puslapio Atom kanalas');
+ta['t-contributions'] = new Array('','Rodyti šio naudotojo keitimų sąrašą');
+ta['t-emailuser'] = new Array('','Siųsti laišką šiam naudotojui');
+ta['t-upload'] = new Array('u','Įdėti paveikslėlius ar media failus');
+ta['t-specialpages'] = new Array('q','Specialiųjų puslapių sąrašas');
+ta['ca-nstab-main'] = new Array('c','Rodyti puslapio turinį');
+ta['ca-nstab-user'] = new Array('c','Rodyti naudotojo puslapį');
+ta['ca-nstab-media'] = new Array('c','Rodyti media puslapį');
+ta['ca-nstab-special'] = new Array('','Å is puslapis yra specialusis - jo negalima redaguoti.');
+ta['ca-nstab-project'] = new Array('a','Rodyti projekto puslapį');
+ta['ca-nstab-image'] = new Array('c','Rodyti paveikslėlio puslapį');
+ta['ca-nstab-mediawiki'] = new Array('c','Rodyti sisteminį pranešimą');
+ta['ca-nstab-template'] = new Array('c','Rodyti Å¡ablonÄ…');
+ta['ca-nstab-help'] = new Array('c','Rodyti pagalbos puslapį');
+ta['ca-nstab-category'] = new Array('c','Rodyti kategorijos puslapį');",
+
+# Common.js: contains nothing but a placeholder comment
+'common.js' => '/* Bet koks Äia paraÅ¡ytas JavaScript bus paleistas kieviename puslapyje kievienam naudotojui. */',
+
+# Image deletion
+'deletedrevision' => 'IÅ¡trinta sena versija $1.',
+
+# Browsing diffs
+'previousdiff' => '↠Ankstesnis keitimas',
+'nextdiff' => 'Vėlesnis pakeitimas →',
+
+'imagemaxsize' => 'Riboti paveikslėlių dydį jų aprašymo puslapyje iki:',
+'thumbsize' => 'Sumažintų paveikslėlių dydis:',
'showbigimage' => 'Rodyti geresnės raiškos versiją ($1x$2, $3 KB)',
-'showdiff' => 'Rodyti skirtumus',
-'showingresults' => 'Rodoma <b>$1</b> rezultatų pradedant #<b>$2</b>.',
-'showlast' => 'Rodyti paskutinius $1 paveikslėlių, rūšiuojant $2.',
-'showpreview' => 'Kaip atrodys',
-'showtoc' => 'rodyti',
-'sitestats' => 'Tinklalapio statistika',
-'sitestatstext' => 'Duomenų bazÄ—je Å¡iuo metu esanÄių puslapių - \'\'\'$1\'\'\'.
-Ä® šį skaiÄių įeina aptarimų puslapiai, pagalbiniai projekto puslapiai, peradresavimo puslapiai ir kiti, neskaiÄiuojami kaip straipsniai.
-Be šių puslapių, tikrų straipsnių yra apie \'\'\'$2\'\'\'.
-
-Nuo wiki pradžios yra atlikta \'\'\'$4\'\'\' puslapių redagavimų - vidutiniškai kiekvienas puslapis keistas \'\'\'$5\'\'\' kartų.
-
-<!-- peržiūrėta: $3 vidutiniškai puslapiui: $6 -->',
-'sitesupport' => 'Parama',
-'skin' => 'IÅ¡vaizda',
-'sourcefilename' => 'Įkeliamas failas',
+
+'newimages' => 'Naujausių failų galerija',
+'showhidebots' => '($1 robotus)',
+'noimages' => 'NÄ—ra kÄ… parodyti.',
+
+# Labels for User: and Title: on Special:Log pages
+'specialloguserlabel' => 'Naudotojas:',
'speciallogtitlelabel' => 'Pavadinimas:',
-'specialloguserlabel' => 'Vartotojas:',
-'specialpage' => 'Specialusis Puslapis',
-'specialpages' => 'Specialieji puslapiai',
-'spheading' => 'Specialieji visiems vartotojams prieinami puslapiai',
-'statistics' => 'Statistika',
-'storedversion' => 'IÅ¡saugota versija',
-'subcategories' => 'Subkategorijos',
-'subcategorycount' => 'Kategorijoje esanÄių kategorijų - $1',
-'subject' => 'Tema/antraštė',
-'successfulupload' => 'Įkelta sėkmingai',
-'summary' => 'Komentaras',
-'sunday' => 'Sekmadienis',
-'tagline' => 'Straipsnis iš {{SITENAME}}.',
-'talk' => 'Aptarimas',
-'talkexists' => 'Straipsnis sÄ—kmingai pervadintas, bet
-aptarimų puslapis nebuvo perkeltas, kadangi naujo
-pavadinimo straipsnis jau turėjo aptarimų puslapį.
-Prašome sujungti šiuos puslapius.',
-'talkpage' => 'Aptarti straipsnį',
-'talkpagemoved' => 'Susietas aptarimų puslapis perkeltas.',
-'talkpagenotmoved' => 'Susietas aptarimų puslapis <strong>nebuvo</strong> perkeltas.',
-'templatesused' => 'Straipsnyje naudojami Å¡ablonai:',
-'textboxsize' => 'Redagavimo dėžė',
-'thisisdeleted' => 'Žiūrėti ar trinti $1?',
-'thumbsize' => 'Thumbnail paveikslėlių dydis :',
-'thursday' => 'Ketvirtadienis',
-'timezonelegend' => 'Laiko juosta',
-'timezoneoffset' => 'Skirtumas',
-'timezonetext' => 'Įveskite kiek valandų jūsų vietinis laikas skiriasi nuo serverio laiko (UTC).',
-'toc' => 'Turinys',
-'tog-editondblclick' => 'Puslapių redagavimas dvigubu spustelėjimu puslapyje (JavaScript)',
-'tog-editsection' => 'Įjungti skyrelių redagavimą (naudojant nuorodas [taisyti])',
-'tog-editsectiononrightclick' => 'Įjungti skyrelių redagavimą dvigubu spustelėjimu ant skyrelio pavadinimo (JavaScript)',
-'tog-editwidth' => 'Redagavimas pilnu ploÄiu',
-'tog-externaldiff' => 'Pagal nutylėjimą naudoti išorinę skirtumų rodymo programą',
-'tog-externaleditor' => 'Pagal nutylėjimą naudoti išorinį redaktorių',
-'tog-fancysig' => 'Parašas be automatinių nuorodų',
-'tog-hideminor' => 'Slėpti smulkius pakeitimus naujausių keitimų sąraše',
-'tog-highlightbroken' => 'Formuoti nesanÄių straipsnių nuorodas <a href="" class="new">Å¡itaip</a> (prieÅ¡ingai - Å¡itaip<a href="" class="internal">?</a>).',
-'tog-justify' => 'Lygiuoti pastraipas pagal abi puses',
-'tog-minordefault' => 'Pagal nutylėjimą pažymėti redagavimus kaip smulkius',
-'tog-nocache' => 'Nenaudoti puslapių kaupimo (caching)',
-'tog-numberheadings' => 'Automatiškai numeruoti skyrelius',
-'tog-previewonfirst' => 'Rodyti straipsnio peržiūrą pirmu redagavimu',
-'tog-previewontop' => 'Rodyti peržiūrimą vaizdą virš redagavimo lauko',
-'tog-rememberpassword' => 'Atsiminti slaptažodį tarp sesijų',
-'tog-showtoc' => 'Rodyti turinį, jei straipsnyje daugiau nei 3 skyreliai',
-'tog-showtoolbar' => 'Rodyti redagavimo \'įrankinę\'',
-'tog-underline' => 'Pabraukti nuorodas',
-'tog-usenewrc' => 'Pažangiai rodomi naujausi keitimai (veikia ne visose naršyklėse)',
-'tog-watchdefault' => 'Pridėti redaguojamus straipsnius į stebimų sąrašą',
-'toolbox' => 'Įrankiai',
-'tooltip-compareselectedversions' => 'Žiūrėti dviejų pasirinktų puslapio versijų skirtumus. [alt-v]',
-'tooltip-minoredit' => 'Pažymėti keitimą kaip smulkų [alt-i]',
-'tooltip-preview' => 'Pakeitimų peržiūra, labai prašome pažiūrėti prieš išsaugant! [alt-p]',
-'tooltip-save' => 'IÅ¡saugoti pakeitimus [alt-s]',
-'tooltip-search' => 'Ieškoti lietuviškame wiki [alt-f]',
-'tooltip-watch' => 'Pridėti šį straipsnį prie stebimų [alt-w]',
-'trackbackbox' => '<div id=\'mw_trackbacks\'>
-Trackbacks for this article:<br />
-$1
+
+'passwordtooshort' => 'Jūsų slaptažodis per trumpas. Jis turi būti bent $1 simbolių ilgio.',
+
+# Media Warning
+'mediawarning' => "'''Dėmesio''': Šis failas gali turėti kenksmingą kodą, jį paleidus jūsų sistema gali būti pažeista.<hr />",
+
+'fileinfo' => '$1 KB, MIME tipas: <code>$2</code>',
+
+# Metadata
+'metadata' => 'Metaduomenys',
+'metadata-help' => 'Šiame faile yra papildomos informacijos, tikriausiai pridėtos skaitmeninės kameros ar skaitytuvo, naudoto jam sukurti ar perkelti į skaitmeninį formatą. Jei failas buvo pakeistas iš pradinės versijos, kai kurios detalės gali nepilnai atspindėti naują failą.',
+'metadata-expand' => 'Rodyti išplėstinę informaciją',
+'metadata-collapse' => 'Slėpti išplėstinę informaciją',
+'metadata-fields' => 'EXIF metaduomenų laukai, nurodyti šiame pranešime, bus įtraukti į paveikslėlio puslapį, kai metaduomenų lentelė bus suskleista. Pagal nutylėjimą kiti laukai bus paslėpti.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* focallength',
+
+# EXIF tags
+'exif-imagewidth' => 'Plotis',
+'exif-imagelength' => 'Aukštis',
+'exif-bitspersample' => 'Bitai komponente',
+'exif-compression' => 'Suspaudimo tipas',
+'exif-photometricinterpretation' => 'Taškų struktūra',
+'exif-orientation' => 'Pasukimas',
+'exif-samplesperpixel' => 'Komponentų skaiÄius',
+'exif-planarconfiguration' => 'Duomenų išdėstymas',
+'exif-ycbcrsubsampling' => 'Y iki C atrankos santykis',
+'exif-ycbcrpositioning' => 'Y ir C pozicija',
+'exif-xresolution' => 'Horizontali raiška',
+'exif-yresolution' => 'Vertikali raiška',
+'exif-resolutionunit' => 'X ir Y raiškos matavimo vienetai',
+'exif-stripoffsets' => 'Paveikslėlio duomenų vieta',
+'exif-rowsperstrip' => 'Eilių skaiÄius juostoje',
+'exif-stripbytecounts' => 'Baitai suspaustje juostoje',
+'exif-jpeginterchangeformat' => 'JPEG SOI pozicija',
+'exif-jpeginterchangeformatlength' => 'JPEG duomenų baitai',
+'exif-transferfunction' => 'PerkÄ—limo funkcija',
+'exif-whitepoint' => 'Balto taško chromatiškumas',
+'exif-primarychromaticities' => 'Pagrindinių spalvų chromiškumas',
+'exif-ycbcrcoefficients' => 'Spalvų pristatym matricos matricos koeficientai',
+'exif-referenceblackwhite' => 'Juodos ir baltos poros nuorodos reikšmės',
+'exif-datetime' => 'Failo keitimo data ir laikas',
+'exif-imagedescription' => 'PaveikslÄ—lio pavadinimas',
+'exif-make' => 'Kameros gamintojas',
+'exif-model' => 'Kameros modelis',
+'exif-software' => 'Naudota programinė įranga',
+'exif-artist' => 'Autorius',
+'exif-copyright' => 'Autorystės teisių savininkas',
+'exif-exifversion' => 'Exif versija',
+'exif-flashpixversion' => 'Palaikoma Flashpix versija',
+'exif-colorspace' => 'Spalvų pristatymas',
+'exif-componentsconfiguration' => 'kiekvieno komponento reikšmė',
+'exif-compressedbitsperpixel' => 'Paveikslėlio suspaudimo režimas',
+'exif-pixelydimension' => 'Leistinas paveikslÄ—lio plotis',
+'exif-pixelxdimension' => 'Leistinas paveikslėlio aukštis',
+'exif-makernote' => 'Gamintojo pastabos',
+'exif-usercomment' => 'Naudotojo komentarai',
+'exif-relatedsoundfile' => 'Susijusi garso byla',
+'exif-datetimeoriginal' => 'Duomenų generavimo data ir laikas',
+'exif-datetimedigitized' => 'Pervedimo į skaitmeninį formatą data ir laikas',
+'exif-subsectime' => 'Datos ir laiko sekundÄ—s dalys',
+'exif-subsectimeoriginal' => 'Duomenų generavimo datos ir laiko sekundės dalys',
+'exif-subsectimedigitized' => 'Pervedimo į skaitmeninį formatą datos ir laiko sekundės dalys',
+'exif-exposuretime' => 'IÅ¡laikymo laikas',
+'exif-exposuretime-format' => '$1 sek. ($2)',
+'exif-fnumber' => 'F numeris',
+'exif-fnumber-format' => 'f/$1',
+'exif-exposureprogram' => 'IÅ¡laikymo programa',
+'exif-spectralsensitivity' => 'Spektrinis jautrumas',
+'exif-isospeedratings' => 'ISO greitis',
+'exif-oecf' => 'Optoelektronikos konversijos daugiklis',
+'exif-shutterspeedvalue' => 'Užrakto greitis',
+'exif-aperturevalue' => 'Diafragma',
+'exif-brightnessvalue' => 'Å viesumas',
+'exif-exposurebiasvalue' => 'IÅ¡laikymo paklaida',
+'exif-maxaperturevalue' => 'Mažiausias lešio F numeris',
+'exif-subjectdistance' => 'Objekto atstumas',
+'exif-meteringmode' => 'Matavimo režimas',
+'exif-lightsource' => 'Å viesos Å¡altinis',
+'exif-flash' => 'BlykstÄ—',
+'exif-focallength' => 'Židinio nuotolis',
+'exif-focallength-format' => '$1 mm',
+'exif-subjectarea' => 'Objekto zona',
+'exif-flashenergy' => 'BlykstÄ—s energija',
+'exif-spatialfrequencyresponse' => 'Erdvės dažnio atsakas',
+'exif-focalplanexresolution' => 'Židinio projekcijos X raiška',
+'exif-focalplaneyresolution' => 'Židinio projekcijos Y raiška',
+'exif-focalplaneresolutionunit' => 'Židinio projekcijos raiškos matavimo vienetai',
+'exif-subjectlocation' => 'Objekto vieta',
+'exif-exposureindex' => 'IÅ¡laikymo indeksas',
+'exif-sensingmethod' => 'Jutimo režimas',
+'exif-filesource' => 'Failo Å¡altinis',
+'exif-scenetype' => 'Scenos tipas',
+'exif-cfapattern' => 'CFA raštas',
+'exif-customrendered' => 'Pasirinktinis vaizdo apdorojimas',
+'exif-exposuremode' => 'Išlaikymo režimas',
+'exif-whitebalance' => 'Baltumo balansas',
+'exif-digitalzoomratio' => 'Skaitmeninio priartinimo koeficientas',
+'exif-focallengthin35mmfilm' => 'Židinio nuotolis 35 mm juostoje',
+'exif-scenecapturetype' => 'Scenos fiksavimo tipas',
+'exif-gaincontrol' => 'Scenos kontrolÄ—',
+'exif-contrast' => 'Kontrastas',
+'exif-saturation' => 'Sodrumas',
+'exif-sharpness' => 'AÅ¡trumas',
+'exif-devicesettingdescription' => 'Įrenginio nustatymų aprašas',
+'exif-subjectdistancerange' => 'Objekto nuotolis',
+'exif-imageuniqueid' => 'Unikalusis paveikslÄ—lio ID',
+'exif-gpsversionid' => 'GPS versija',
+'exif-gpslatituderef' => 'Šiaurės ar pietų platuma',
+'exif-gpslatitude' => 'Platuma',
+'exif-gpslongituderef' => 'Rytų ar vakarų ilguma',
+'exif-gpslongitude' => 'Ilguma',
+'exif-gpsaltituderef' => 'AukÅ¡Äio nuoroda',
+'exif-gpsaltitude' => 'Aukštis',
+'exif-gpstimestamp' => 'GPS laikas (atominis laikrodis)',
+'exif-gpssatellites' => 'Palydovai, naudoti matavimui',
+'exif-gpsstatus' => 'Gaviklio būsena',
+'exif-gpsmeasuremode' => 'Matavimo režimas',
+'exif-gpsdop' => 'Matavimo tikslumas',
+'exif-gpsspeedref' => 'GreiÄio vienetai',
+'exif-gpsspeed' => 'GPS gaviklio greitis',
+'exif-gpstrackref' => 'Nuoroda judÄ—jimo krypÄiai',
+'exif-gpstrack' => 'JudÄ—jimo kryptis',
+'exif-gpsimgdirectionref' => 'Nuoroda vaizdo krypÄiai',
+'exif-gpsimgdirection' => 'Nuotraukos kryptis',
+'exif-gpsmapdatum' => 'Panaudoti geodeziniai apžvalgos duomenys',
+'exif-gpsdestlatituderef' => 'Nuoroda paskirties platumai',
+'exif-gpsdestlatitude' => 'Paskirties platuma',
+'exif-gpsdestlongituderef' => 'Nuoroda paskirties ilgumai',
+'exif-gpsdestlongitude' => 'Paskirties ilguma',
+'exif-gpsdestbearingref' => 'Nuoroda į paskirties pelengą',
+'exif-gpsdestbearing' => 'Paskirties pelengas',
+'exif-gpsdestdistanceref' => 'Nuoroda atstumui iki paskirties',
+'exif-gpsdestdistance' => 'Atstumas iki paskirties',
+'exif-gpsprocessingmethod' => 'GPS apdorojimo metodo pavadinimas',
+'exif-gpsareainformation' => 'GPS zonos pavadinimas',
+'exif-gpsdatestamp' => 'GPS data',
+'exif-gpsdifferential' => 'GPS diferiancialo pataisymas',
+
+# EXIF attributes
+'exif-compression-1' => 'Nesuspausta',
+'exif-compression-6' => 'JPEG',
+
+'exif-photometricinterpretation-2' => 'RGB',
+'exif-photometricinterpretation-6' => 'YCbCr',
+
+'exif-orientation-1' => 'Standartinis', # 0th row: top; 0th column: left
+'exif-orientation-2' => 'Apversta horizontaliai', # 0th row: top; 0th column: right
+'exif-orientation-3' => 'Pasukta 180°', # 0th row: bottom; 0th column: right
+'exif-orientation-4' => 'Apversta vertikaliai', # 0th row: bottom; 0th column: left
+'exif-orientation-5' => 'Pasukta 90° prieš laikrodžio rodyklę ir apversta vertikaliai', # 0th row: left; 0th column: top
+'exif-orientation-6' => 'Pasukta 90° laikrodžio rodyklės kryptimi', # 0th row: right; 0th column: top
+'exif-orientation-7' => 'Pasukta 90° laikrodžio rodyklės kryptimi ir apversta vertikaliai', # 0th row: right; 0th column: bottom
+'exif-orientation-8' => 'Pasukta 90° prieš laikrodžio rodyklę', # 0th row: left; 0th column: bottom
+
+'exif-planarconfiguration-1' => 'stambusis formatas',
+'exif-planarconfiguration-2' => 'plokštuminis formatas',
+
+'exif-xyresolution-i' => '$1 taškai colyje',
+'exif-xyresolution-c' => '$1 taškai centimetre',
+
+'exif-colorspace-1' => 'sRGB',
+'exif-colorspace-ffff.h' => 'FFFF.H',
+
+'exif-componentsconfiguration-0' => 'neegzistuoja',
+'exif-componentsconfiguration-1' => 'Y',
+'exif-componentsconfiguration-2' => 'Cb',
+'exif-componentsconfiguration-3' => 'Cr',
+'exif-componentsconfiguration-4' => 'R',
+'exif-componentsconfiguration-5' => 'G',
+'exif-componentsconfiguration-6' => 'B',
+
+'exif-exposureprogram-0' => 'Nenurodyta',
+'exif-exposureprogram-1' => 'RankinÄ—',
+'exif-exposureprogram-2' => 'Paprasta programa',
+'exif-exposureprogram-3' => 'Diafragmos pirmenybÄ—',
+'exif-exposureprogram-4' => 'Užrakto pirmenybė',
+'exif-exposureprogram-5' => 'Kūrybos programa (linkusi į lauko gylį)',
+'exif-exposureprogram-6' => 'Veiksmo programa (linkusi link greito užrakto greiÄio)',
+'exif-exposureprogram-7' => 'Portreto režimas (nuotraukoms iš arti nepabrėžiant fono)',
+'exif-exposureprogram-8' => 'Peizažo režimas (peizažo nuotraukoms pabrėžiant foną)',
+
+'exif-subjectdistance-value' => '$1 metrų',
+
+'exif-meteringmode-0' => 'Nežinoma',
+'exif-meteringmode-1' => 'Vidurkis',
+'exif-meteringmode-2' => 'Centruotas vidurkis',
+'exif-meteringmode-3' => 'Taškas',
+'exif-meteringmode-4' => 'Daugiataškis',
+'exif-meteringmode-5' => 'Raštas',
+'exif-meteringmode-6' => 'Dalinis',
+'exif-meteringmode-255' => 'Kita',
+
+'exif-lightsource-0' => 'Nežinomas',
+'exif-lightsource-1' => 'Dienos Å¡viesa',
+'exif-lightsource-2' => 'Fluorescentinis',
+'exif-lightsource-3' => 'Volframas (kaitinamoji lempa)',
+'exif-lightsource-4' => 'BlykstÄ—',
+'exif-lightsource-9' => 'Giedras oras',
+'exif-lightsource-10' => 'Debesuotas oras',
+'exif-lightsource-11' => 'Šešėlis',
+'exif-lightsource-12' => 'Dienos šviesos fluorescentinis (D 5700 – 7100K)',
+'exif-lightsource-13' => 'Dienos baltumo fluorescentinis (N 4600 – 5400K)',
+'exif-lightsource-14' => 'Šalto baltumo fluorescentinis (W 3900 – 4500K)',
+'exif-lightsource-15' => 'Baltas fluorescentinis (WW 3200 – 3700K)',
+'exif-lightsource-17' => 'Standartinis apšvietimas A',
+'exif-lightsource-18' => 'Standartinis apšvietimas B',
+'exif-lightsource-19' => 'Standartinis apšvietimas C',
+'exif-lightsource-20' => 'D55',
+'exif-lightsource-21' => 'D65',
+'exif-lightsource-22' => 'D75',
+'exif-lightsource-23' => 'D50',
+'exif-lightsource-24' => 'ISO studijos volframas',
+'exif-lightsource-255' => 'Kitas Å¡viesos Å¡altinis',
+
+'exif-focalplaneresolutionunit-2' => 'coliai',
+
+'exif-sensingmethod-1' => 'Nenurodytas',
+'exif-sensingmethod-2' => 'Vienalustis spalvų zonos jutiklis',
+'exif-sensingmethod-3' => 'Dvilustis spalvų zonos jutiklis',
+'exif-sensingmethod-4' => 'Trilustis spalvų zonos jutiklis',
+'exif-sensingmethod-5' => 'Nuoseklusis spalvų zonos jutiklis',
+'exif-sensingmethod-7' => 'Trilinijinis jutiklis',
+'exif-sensingmethod-8' => 'Spalvų nuoseklusis linijinis jutiklis',
+
+'exif-filesource-3' => 'DSC',
+
+'exif-scenetype-1' => 'Tiesiogiai fotografuotas vaizdas',
+
+'exif-customrendered-0' => 'Standartinis procesas',
+'exif-customrendered-1' => 'Pasirinktinis procesas',
+
+'exif-exposuremode-0' => 'Automatinis išlaikymas',
+'exif-exposuremode-1' => 'Rankinis išlaikymas',
+'exif-exposuremode-2' => 'Automatinis skliaustas',
+
+'exif-whitebalance-0' => 'Automatinis baltumo balansas',
+'exif-whitebalance-1' => 'Rankinis baltumo balansas',
+
+'exif-scenecapturetype-0' => 'Paprastas',
+'exif-scenecapturetype-1' => 'Peizažas',
+'exif-scenecapturetype-2' => 'Portretas',
+'exif-scenecapturetype-3' => 'Nakties vaizdas',
+
+'exif-gaincontrol-0' => 'Jokia',
+'exif-gaincontrol-1' => 'Nedidelis pakÄ—limas',
+'exif-gaincontrol-2' => 'Didelis pakÄ—limas',
+'exif-gaincontrol-3' => 'Mažas nuleidimas',
+'exif-gaincontrol-4' => 'Didelis nuleidimas',
+
+'exif-contrast-0' => 'Paprastas',
+'exif-contrast-1' => 'Mažas',
+'exif-contrast-2' => 'Didelis',
+
+'exif-saturation-0' => 'Paprastas',
+'exif-saturation-1' => 'Mažas sodrumas',
+'exif-saturation-2' => 'Didelis sodrumas',
+
+'exif-sharpness-0' => 'Paprastas',
+'exif-sharpness-1' => 'Mažas',
+'exif-sharpness-2' => 'Didelis',
+
+'exif-subjectdistancerange-0' => 'Nežinomas',
+'exif-subjectdistancerange-1' => 'Macro',
+'exif-subjectdistancerange-2' => 'Artimas vaizdas',
+'exif-subjectdistancerange-3' => 'Tolimas vaizdas',
+
+# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
+'exif-gpslatitude-n' => 'Å iaurÄ—s platuma',
+'exif-gpslatitude-s' => 'Pietų platuma',
+
+# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
+'exif-gpslongitude-e' => 'Rytų ilguma',
+'exif-gpslongitude-w' => 'Vakarų ilguma',
+
+'exif-gpsstatus-a' => 'Matavimas vykdyme',
+'exif-gpsstatus-v' => 'Matuojamas programinis sÄ…veikumas',
+
+'exif-gpsmeasuremode-2' => 'Dvimatis matavimas',
+'exif-gpsmeasuremode-3' => 'Trimatis matavimas',
+
+# Pseudotags used for GPSSpeedRef and GPSDestDistanceRef
+'exif-gpsspeed-k' => 'Kilometrai per valandÄ…',
+'exif-gpsspeed-m' => 'Mylios per valandÄ…',
+'exif-gpsspeed-n' => 'Mazgai',
+
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'Tikroji kryptis',
+'exif-gpsdirection-m' => 'MagnetinÄ— kryptis',
+
+# External editor support
+'edit-externally' => 'Atidaryti išoriniame redaktoriuje',
+'edit-externally-help' => 'Norėdami gauti daugiau informacijos, žiūrėkite [http://meta.wikimedia.org/wiki/Help:External_editors diegimo instrukcijas].',
+
+# 'all' in various places, this might be different for inflected languages
+'recentchangesall' => 'visos',
+'imagelistall' => 'visi',
+'watchlistall1' => 'visi',
+'watchlistall2' => 'visus',
+'namespacesall' => 'visos',
+
+# E-mail address confirmation
+'confirmemail' => 'Patvirtinkite el. pašto adresą',
+'confirmemail_noemail' => 'Jūs neturite nurodę teisingo el. pašto adreso [[{{ns:special}}:Preferences|savo nustatymuose]].',
+'confirmemail_text' => 'Šiame projekte būtina patvirtinti el. pašto adresą prieš naudojant el. pašto funkcijas. Spustelkite žemiau esantį mygtuką,
+kad jūsų el. pašto adresu būtų išsiųstas patvirtinimo kodas.
+Laiške bus atsiųsta nuoroda su kodu, kuria nuėjus, el. pašto adresas bus patvirtintas.',
+'confirmemail_pending' => '<div class="error">
+Patvirtinimo kodas jau nusiųstas jums; jei neseniai sukūrėte savo paskyrą, jūs turėtumėte palaukti jo dar kelias minutes prieš prašant naujo kodo.
</div>',
-'tuesday' => 'Antradienis',
-'uctop' => ' (paskutinis)',
-'uncategorizedcategories' => 'Kategorijos, nepriskirtos jokiai kategorijai',
-'uncategorizedpages' => 'Puslapiai, nepriskirti jokiai kategorijai',
-'undelete' => 'Atstatyti ištrintą puslapį',
-'undelete_short' => 'Atstatyti $1 redagavimus',
-'undeletearticle' => 'Atstatyti ištrintą straipsnį',
-'undeletebtn' => 'Atstatyti!',
-'undeletedarticle' => 'atstatyta "[[$1]]"',
-'undeletedrevisions' => 'atstatyta $1 revizijų',
-'undeletehistory' => 'Jei atstatysite straipsnį, istorijoje bus atstatytos visos versijos.
-Jei po iÅ¡trynimo buvo sukurtas straipsnis tokiu paÄiu pavadinimu,
-atstatytos versijos atsiras ankstesnÄ—je istorijoje, o dabartinÄ— versija
-liks nepakeista.',
-'undeletepage' => 'Ištrintų straipsnių peržiūra ir atstatymas',
-'undeletepagetext' => 'Žemiau išvardinti ištrinti straipsniai ir puslapiai, dar laikomi
-archyve, todėl jie gali būti atstatyti. Archyvas gali būti periodiškai valomas.',
-'undeleterevision' => 'IÅ¡trinta $1 dienos versija',
-'underline-always' => 'Visada',
-'underline-default' => 'Pagal naršyklės nustatymus',
-'underline-never' => 'Niekada',
-'unprotect' => 'Atrakinti',
-'unprotectcomment' => 'Atrakinimo priežastis',
-'unprotectedarticle' => 'atrakino $1',
-'unprotectsub' => '(Atrakinamas "$1")',
-'unusedcategories' => 'Nenaudojamos kategorijos',
-'unusedimages' => 'Nenaudojami paveikslÄ—liai',
-'unwatch' => 'NebestebÄ—ti',
-'unwatchthispage' => 'Nustoti stebÄ—ti',
-'upload' => 'Įkelti failą',
-'uploadbtn' => 'Įkelti',
-'uploadedimage' => 'įkėlė "$1"',
-'uploaderror' => 'Įkėlimo klaida',
-'uploadlog' => 'įkėlimų sąrašas',
-'uploadlogpage' => 'Įkėlimų_sąrašas',
-'uploadlogpagetext' => 'Žemiau pateikiamas naujausių failų įkėlimų sąrašas.',
-'uploadnewversion-linktext' => 'Įkelti naują failo versiją',
-'uploadnologin' => 'Reikia prisijungti',
-'uploadnologintext' => 'Norėdami įkelti failą, turite būti [[Special:Userlogin|prisijungęs]].',
-'uploadtext' => '<div style="border: 1px solid grey; background: #ddf; padding: 5px; margin: 0 auto;">
-[[Image:Commons without text.png|left|30px|]] <big>Viešo naudojimo ir [[GFDL]] paveikslėlius \'\'\'labai rekomenduojama\'\'\' kelti į [[commons:Main|Commons]] projektą - šiame projekte įkeltus paveikslėlius galės naudoti ne tik lietuviškas, bet ir kiti projektai, taip sutaupysite laiko kitų projektų dalyviams.</big></div>
-
-\'\'\'STOP!\'\'\' Prieš įkeldami failą
-būtinai perskaitykite [[Help:Paveiklėliai|paveikslėlių naudojimo politiką]].
-
-NorÄ—dami peržiÅ«rÄ—ti anksÄiau įkeltus paveikslÄ—lius,
-eikite į [[Special:Imagelist|įkeltų paveikslėlių sąrašą]].
-Įkėlimai ir trynimai yra fiksuojami [[Project:Upload log|įkėlimų istorijoje]].
-
-Naudodamiesi žemiau pateikta forma, galite įkelti paveikslėlius,
-kuriuos vėliau panaudosite straipsnių iliustravimui.
-Daugumoje naršyklių yra "Browse..." mygtukas, kuris
-atidarys standartinį operacinės sistemos failo pasirinkimo dialogą.
-Pasirinkus reikiamą failą, failo vardo laukas (šalia mygtuko) automatiškai bus užpildytas.
-Taip pat bÅ«tina pažymÄ—ti varnelÄ™, patvirtinanÄiÄ…, kad nepažeidžiamos autorinÄ—s teisÄ—s.
-Mygtukas "Įkelti" inicijuoja įkėlimo veiksmą.
-Jei jūsų interneto ryšys nėra greitas, įkėlimas gali šiek tiek užtrukti.
-
-Rekomenduojami formatai yra: JPEG - fotografijoms, PNG -
-schemoms ir kitiems ikoniniams paveikslÄ—liams, OGG - garsams.
-Prašome failus vardinti vienareikšmiai, kad nekiltų painiavos.
-Norėdami panaudoti įkeltą paveikslėlį straipsnyje, naudokite tokio tipo nuorodas -
-\'\'\'<nowiki>[[{{ns:6}}:file.jpg]]</nowiki>\'\'\' arba
-\'\'\'<nowiki>[[{{ns:6}}:file.png|paveikslÄ—lio pavadinimas]]</nowiki>\'\'\' arba
-\'\'\'<nowiki>[[{{ns:-2}}:file.ogg]]</nowiki>\'\'\' garsams.
-
-Nepamirškite, kad kaip ir visame wiki, kiti gali redaguoti ar ištrinti jūsų įkeltus failus,
-jei jie mano, kad taip bus geriau projektui. Taip pat jums gali būti uždrausta įkelti failus,
-jei sistema naudositės nesilaikydami reikalavimų.
-
-<div style="border: 1px solid grey; background: #ddf; padding: 7px; margin: 0 auto;">Prašome nepamiršti:
-
-*Detaliai aprašyti įkeliamą failą.
-*Nurodyti failo licenciją. Pridėdami <tt>&#123;{GFDL}}</tt> pažymėsite kad failas pateikiamas su [[{{ns:project}}:Text of the GNU Free Documentation License|GNU FDL]] licencija, <tt>&#123;{PD}}</tt> - jei [[w:Public domain|viešo naudojimo]], taip pat reiktų aprašyti išimtis ar kitokio tipo licencijas.
+'confirmemail_send' => 'Išsiųsti patvirtinimo kodą',
+'confirmemail_sent' => 'Patvirtinimo laiškas išsiųstas.',
+'confirmemail_oncreate' => 'Patvirtinimo kodas buvo išsiųstas jūsų el. pašto adresu.
+Šis kodas nėra būtinas, kad prisijungtumėte, bet jums reikės jį duoti prieš įjungiant el. pašto paslaugas projekte.',
+'confirmemail_sendfailed' => 'Nepavyko išsiųsti patvirtinamojo laiško. Patikrinkite, ar adrese nėra klaidingų simbolių.
+
+Pašto tarnyba atsakė: $1',
+'confirmemail_invalid' => 'Neteisingas patvirtinimo kodas. Kodo galiojimas gali būti jau pasibaigęs.',
+'confirmemail_needlogin' => 'Jums reikia $1, kad patvirtintumėte savo el. pašto adresą.',
+'confirmemail_success' => 'Jūsų el. pašto adresas patvirtintas. Dabar galite prisijungti ir mėgautis projektu.',
+'confirmemail_loggedin' => 'Jūsų el. pašto adresas patvirtintas.',
+'confirmemail_error' => 'Patvirtinimo metu įvyko neatpažinta klaida.',
+'confirmemail_subject' => '{{SITENAME}} el. pašto adreso patvirtinimas',
+'confirmemail_body' => 'Kažkas, tikriausiai jūs IP adresu $1, užregistravo
+paskyrą "$2" susietą su šiuo el. pašto adresu projekte {{SITENAME}}.
+
+Kad patvirtintumėte, kad ši dėžutė tikrai priklauso jums, ir aktyvuotumėte
+el. pašto paslaugas projekte {{SITENAME}}, atverkite šią nuorodą savo naršyklėje:
+
+$3
+
+Jei naudotoją registravote *ne* jūs, neatidarykite šio adreso. Patvirtinimo kodas
+baigs galioti $4.',
+
+# Inputbox extension, may be useful in other contexts as well
+'tryexact' => 'Mėginti tikslų atitikimą',
+'searchfulltext' => 'Ieškoti pilno teksto',
+'createarticle' => 'Kurti straipsnį',
+
+# Scary transclusion
+'scarytranscludedisabled' => '[Tarpprojektinis įterpimas yra išjungtas]',
+'scarytranscludefailed' => '[Šablono gavimas iš $1 nepavyko; atsiprašome]',
+'scarytranscludetoolong' => '[URL per ilgas; atsiprašome]',
+
+# Trackbacks
+'trackbackbox' => '<div id="mw_trackbacks">
+Trackback Å¡iam straipsniui:<br />
+$1
</div>',
-'uploadwarning' => 'DÄ—mesio',
-'userlogin' => 'Prisijungti',
-'userlogout' => 'Atsijungti',
-'userpage' => 'Vartotojo puslapis',
-'userrights-user-editname' => 'Enter a username:',
-'userstats' => 'Vartotojų statistika',
-'userstatstext' => 'Šiuo metu registruotų vartotojų - \'\'\'$1\'\'\'.
-Iš jų administratoriaus teises turi - \'\'\'$2\'\'\' (žr. $3).',
-'version' => 'Versija',
-'viewprevnext' => 'Žiūrėti ($1) ($2) ($3).',
-'views' => 'Žiūrėti',
-'viewsource' => 'Žiūrėti kodą',
-'wantedpages' => 'Geidžiamiausi straipsniai',
-'watch' => 'StebÄ—ti',
-'watchdetails' => '* Stebimų straipsnių - $1 (aptarimų puslapiai neskaiÄiuojami)
-* [[Special:Watchlist/edit|Parodyti ir redaguoti pilną sąrašą]]',
-'watcheditlist' => 'Žemiau pateiktame stebimų straipsnių sąraše
-pažymėkite varneles prie straipsnių,
-kurių nebenorite stebÄ—ti ir spauskite apaÄioje
-esantį mygtuką \'Išmesti iš stebimų\'.',
-'watchlist' => 'Stebimi straipsniai',
-'watchlistcontains' => 'Straipsnių jūsų stebimųjų straipsnių sąraše - $1.',
-'watchmethod-list' => 'ieškoma naujausių keitimų stebimuose puslapiuose',
-'watchnochange' => 'Pasirinktu laikotarpiu nebuvo redaguotas nei vienas stebimas straipsnis.',
-'watchthis' => 'Stebėti straipsnį',
-'watchthispage' => 'Stebėti puslapį',
-'wednesday' => 'TreÄiadienis',
-'whatlinkshere' => 'SusijÄ™ straipsniai',
-'wlnote' => 'Rodomi paskutiniai $1 pakeitimai, padaryti per paskutines <b>$2</b> valandas.',
-'wlshowlast' => 'Rodyti paskutinių $1 valandų, $2 dienų ar $3 pakeitimus',
-'wrongpassword' => 'Įvestas neteisingas slaptažodis. Pamėginkite dar kartą.',
-'yourdiff' => 'Skirtumai',
-'youremail' => 'El. pašto adresas*',
-'yourlanguage' => 'Interfeiso kalba',
-'yourname' => 'Jūsų vartotojo vardas',
-'yournick' => 'Jūsų slapyvardis (parašams)',
-'yourpassword' => 'Pasirinktas slaptažodis',
-'yourpasswordagain' => 'Pakartokite slaptažodį',
-'yourrealname' => 'Jūsų tikras vardas*',
-'yourtext' => 'Jūsų tekstas',
+'trackbackremove' => ' ([$1 Trinti])',
+'trackbacklink' => 'Trackback',
+'trackbackdeleteok' => 'Trackback buvo sėkmingai ištrintas.',
+
+# Delete conflict
+'deletedwhileediting' => 'Dėmesio: Šis puslapis ištrintas po to, kai pradėjote redaguoti!',
+'confirmrecreate' => "Naudotojas [[{{ns:user}}:$1|$1]] ([[{{user_talk}}:$1|aptarimas]]) ištrynė šį puslapį po to, kai pradėjote jį redaguoti. Trynimo priežastis:
+: ''$2''
+Prašome patvirtinti, kad tikrai norite iš naujo sukurti straipsnį.",
+'recreate' => 'Atkurti',
+'tooltip-recreate' => 'Atkurti puslapį nepaisant to, kad jis buvo ištrintas',
+
+'unit-pixel' => 'px',
+
+# HTML dump
+'redirectingto' => 'Peradresuojama į [[$1]]...',
+
+# action=purge
+'confirm_purge' => 'Išvalyti šio puslapio podėlį?
+
+$1',
+'confirm_purge_button' => 'Gerai',
+
+'youhavenewmessagesmulti' => 'Turite naujų žinuÄių $1',
+
+'searchcontaining' => "IeÅ¡koti straipsnių, prasidedanÄių ''$1''.",
+'searchnamed' => "Ieškoti straipsnių, pavadintų ''$1''.",
+'articletitles' => "Straipsniai, pradedant nuo ''$1''",
+'hideresults' => 'SlÄ—pti rezultatus',
+
+# DISPLAYTITLE
+'displaytitle' => '(Nurodyti šį puslapį kaip [[$1]])',
+
+'loginlanguagelabel' => 'Kalba: $1',
+
+# Multipage image navigation
+'imgmultipageprev' => '&larr; ankstesnis puslapis',
+'imgmultipagenext' => 'kitas puslapis &rarr;',
+'imgmultigo' => 'Eiti!',
+'imgmultigotopre' => 'Pereiti į puslapį',
+
+# Table pager
+'ascending_abbrev' => 'didÄ—janti tvarka',
+'descending_abbrev' => 'mažėjanti tvarka',
+'table_pager_next' => 'Kitas puslapis',
+'table_pager_prev' => 'Ankstesnis puslapis',
+'table_pager_first' => 'Pirmas puslapis',
+'table_pager_last' => 'Paskutinis puslapis',
+'table_pager_limit' => 'Rodyti $1 elementų per puslapį',
+'table_pager_limit_submit' => 'Rodyti',
+'table_pager_empty' => 'Jokių rezultatų',
+
+# Auto-summaries
+'autosumm-blank' => 'Šalinamas visas turinys iš puslapio',
+'autosumm-replace' => "Puslapis keiÄiamas su '$1'",
+'autoredircomment' => 'Nukreipiama į [[$1]]', # This should be changed to the new naming convention, but existed beforehand
+'autosumm-new' => 'Naujas puslapis: $1',
+
+# Size units
+'size-bytes' => '$1 B',
+'size-kilobytes' => '$1 KiB',
+'size-megabytes' => '$1 MiB',
+'size-gigabytes' => '$1 GiB',
+
);
+
?>
diff --git a/languages/messages/MessagesLv.php b/languages/messages/MessagesLv.php
index 2203f689..3a6ac3a5 100644
--- a/languages/messages/MessagesLv.php
+++ b/languages/messages/MessagesLv.php
@@ -102,7 +102,8 @@ $messages= array(
'oct' => 'oktobrī,',
'nov' => 'novembrī,',
'dec' => 'decembrī,',
-'categories' => '{{PLURAL:$1|Kategorija|Kategorijas}}',
+'categories' => 'Kategorijas',
+'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorijas}}',
'category_header' => 'Raksti, kas ietverti kategorijÄ "$1".',
'subcategories' => 'Apakškategorijas',
'mainpage' => 'SÄkumlapa',
@@ -432,7 +433,7 @@ m = maznozīmīgs labojums.',
'searchresults' => 'MeklÄ“Å¡anas rezultÄti',
'searchresulttext' => 'Lai iegÅ«tu vairÄk informÄcijas par meklÄ“Å¡anu {{grammar:akuzatÄ«vs|{{SITENAME}}}}, skat. [[Project:Searching|{{grammar:Ä£enitÄ«vs|{{SITENAME}}}} meklÄ“Å¡ana]].',
'searchsubtitle' => 'Pieprasījums: [[:$1]] [[Special:Allpages/$1|&#x5B;Indekss&#x5D;]]',
-'searchsubtitleinvalid' => 'Pieprasījums: $1 ',
+'searchsubtitleinvalid' => 'Pieprasījums: $1',
'badquery' => 'Nepareizi noformulēts meklēšanas pieprasījums',
'badquerytext' => 'MÄ“s nevarÄ“jÄm apstrÄdÄt tavu pieprasÄ«jumu. IespÄ“jams, tÄpÄ“c, ka tu mÄ“Ä£inÄji meklÄ“t vÄrdu, kas ir Ä«sÄks par trim burtiem, kas vÄ“l nav iespÄ“jams. VarbÅ«t tu nepareizi ierakstÄ«ji kÄdu frÄzi, piemÄ“ram "fish and and scales". LÅ«dzu, mÄ“Ä£ini citus atslÄ“gvÄrdus.',
'titlematches' => 'RezultÄti virsrakstos',
@@ -736,7 +737,7 @@ un klikÅ¡Ä·ini uz pogas "\'\'\'Izņemt no uzraugÄmajÄm lapÄm\'\'\'".',
'rollbacklink' => 'novērst',
'rollbackfailed' => 'NovÄ“rÅ¡ana neizdevÄs',
'cantrollback' => 'Nav iespÄ“jams novÄ“rst labojumu; iepriekÅ¡Ä“jais labotÄjs ir vienÄ«gais lapas autors.',
-'alreadyrolled' => 'Nav iespÄ“jams novÄ“rst pÄ“dÄ“jÄs izmaiņas, ko lapÄ [[$1]] saglabÄja [[User:$2|$2]] ([[User talk:$2|Diskusija]]). KÄds cits jau ir rediģējis Å¡o lapu vai novÄ“rsis izmaiņas.
+'alreadyrolled' => 'Nav iespÄ“jams novÄ“rst pÄ“dÄ“jÄs izmaiņas, ko lapÄ [[:$1]] saglabÄja [[User:$2|$2]] ([[User talk:$2|Diskusija]]). KÄds cits jau ir rediģējis Å¡o lapu vai novÄ“rsis izmaiņas.
PÄ“dÄ“jÄs izmaiņas saglabÄja [[User:$3|$3]] ([[User talk:$3|diskusija]])',
'revertpage' => 'NovÄ“rsu izmaiņas, ko izdarÄ«ja [[Special:Contributions/$2|$2]], atjaunoju versiju, ko saglabÄja $1',
@@ -857,7 +858,7 @@ Ja tomÄ“r vÄ“lÄ“sies, tad tev Å¡Ä« diskusiju lapa bÅ«s jÄpÄrvieto vai jÄapvie
'tooltip-minoredit' => 'Atzīmēt šo par maznozīmīgu labojumu [alt-i]',
'tooltip-save' => 'SaglabÄt veiktÄs izmaiņas [alt-s]',
'tooltip-preview' => 'ParÄdÄ«t izmaiņu priekÅ¡skatÄ«jumu. LÅ«dzam izmantot Å¡o iespÄ“ju pirms saglabÄÅ¡anas. [alt-p]',
-'tooltip-diff' => 'ParÄdÄ«t, kÄ esi izmainÄ«jis tekstu. [alt-d]',
+'tooltip-diff' => 'ParÄdÄ«t, kÄ esi izmainÄ«jis tekstu. [alt-v]',
'tooltip-compareselectedversions'=> 'AplÅ«kot atÅ¡Ä·irÄ«bas starp divÄm izvÄ“lÄ“tajÄm lapas versijÄm. [alt-v]',
'tooltip-watch' => 'Pievienot Å¡o lapu uzraugÄmo lapu sarakstam [alt-w]',
'siteuser' => '{{grammar:Ä£enitÄ«vs|{{SITENAME}}}} lietotÄjs $1',
@@ -871,7 +872,7 @@ Ja tomÄ“r vÄ“lÄ“sies, tad tev Å¡Ä« diskusiju lapa bÅ«s jÄpÄrvieto vai jÄapvie
'mw_math_source' => 'SaglabÄt kÄ TeX (teksta pÄrlÅ«kiem)',
'mw_math_modern' => 'Moderniem pÄrlÅ«kiem ieteiktais variants',
'mw_math_mathml' => 'MathML, ja iespÄ“jams (eksperimentÄla iespÄ“ja)',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Mana lietotÄja lapa\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Manas IP adreses lietotÄja lapa\');
@@ -882,7 +883,7 @@ Ja tomÄ“r vÄ“lÄ“sies, tad tev Å¡Ä« diskusiju lapa bÅ«s jÄpÄrvieto vai jÄapvie
ta[\'pt-mycontris\'] = new Array(\'y\',\'Mani ieguldījumi\');
ta[\'pt-login\'] = new Array(\'o\',\'AicinÄm tevi ieiet {{grammar:lokatÄ«vs|{{SITENAME}}}}, tomÄ“r tas nav obligÄti.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'AicinÄm tevi ieiet {{grammar:lokatÄ«vs|{{SITENAME}}}}, tomÄ“r tas nav obligÄti.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Iziet\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Iziet\');
ta[\'ca-talk\'] = new Array(\'t\',\'Diskusija par Å¡Ä« raksta lapu\');
ta[\'ca-edit\'] = new Array(\'e\',\'IzmainÄ«t Å¡o lapu. LÅ«dzam izmantot pirmskatu pirms lapas saglabÄÅ¡anas.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Pievienot komentÄru Å¡ai diskusijai.\');
diff --git a/languages/messages/MessagesMi.php b/languages/messages/MessagesMi.php
new file mode 100644
index 00000000..d8d12d99
--- /dev/null
+++ b/languages/messages/MessagesMi.php
@@ -0,0 +1,111 @@
+<?php
+/** Maori (MÄori)
+ *
+ * @package MediaWiki
+ * @subpackage Language
+ */
+
+$messages = array(
+# Dates
+'sunday' => 'RÄtapu',
+'monday' => 'RÄhina',
+'tuesday' => 'RÄtÅ«',
+'wednesday' => 'RÄapa',
+'thursday' => 'RÄpare',
+'friday' => 'RÄmere',
+'saturday' => 'RÄhoroi',
+'january' => 'Kohi-tÄtea',
+'february' => 'Hui-tanguru',
+'march' => 'Poutū-te-rangi',
+'april' => 'Paenga-whÄwhÄ',
+'may_long' => 'Haratua',
+'june' => 'Pipiri',
+'july' => 'HÅngongoi',
+'august' => 'Here-turi-kÅkÄ',
+'september' => 'Mahuru',
+'october' => 'Whiringa-Ä-nuku',
+'november' => 'Whiringa-Ä-rangi',
+'december' => 'Hakihea',
+
+'mainpage' => 'Hau KÄinga',
+
+'portal' => 'Tomokanga hapori',
+'portal-url' => 'Project:Tomokanga hapori',
+'help' => 'WhakamÄrama',
+'sitesupport' => 'Koha',
+'cancel' => 'Whakakore',
+'qbspecialpages' => 'WhÄrangi motuhake',
+'mytalk' => 'Karere mÅku',
+'navigation' => 'Huarahi',
+
+'currentevents' => 'KÅrero',
+'currentevents-url' => 'Project:KÅrero',
+
+'search' => 'Rapua',
+'go' => 'Haere',
+'history' => 'KÅrero Nehe',
+'history_short' => 'Tuhinga/kaituhi',
+'printableversion' => 'TÄia',
+'permalink' => 'Hononga toitū',
+'edit' => 'Whakatika',
+'delete' => 'tangohia',
+'protect' => 'Whakangungua',
+'talk' => 'KÅrerorero',
+'toolbox' => 'Pouaka utauta',
+
+'toc' => 'RÄrangi kÅrero',
+'showtoc' => 'whakakite',
+'hidetoc' => 'hunaia',
+
+# Short words for each namespace, by default used in the 'article' tab in monobook
+'nstab-main' => 'tuhi pÄnui',
+'nstab-template' => 'papa tauira',
+'nstab-help' => 'Ä€whina',
+'nstab-category' => 'WÄhanga',
+
+# Login and logout pages
+'userlogout' => 'Whakarere',
+
+# Edit pages
+'savearticle' => 'Tiaki',
+'showdiff' => 'Tiro rerekētanga',
+
+# Preferences page
+'preferences' => 'KÅwhiringa',
+
+# Recent changes
+'recentchanges' => 'RerekÄ“tanga hÅu',
+'hide' => 'Hunaia',
+'show' => 'Whakaaturia',
+
+# Upload
+'upload' => 'Tuku atu',
+
+# Miscellaneous special pages
+'allpages' => 'NgÄ whÄrangi katoa',
+'randompage' => 'Tipihaere',
+'specialpages' => 'WhÄrangi motuhake',
+'recentchangeslinked' => 'Rerekētanga pū tahi',
+'move' => 'Nekehia',
+
+# Special:Allpages
+'allpagessubmit' => 'Haere',
+
+# Watchlist
+'watchlist' => 'RÄrangi mÄtaki',
+'watch' => 'MÄtaki',
+'unwatch' => 'kÄti te mÄtaki',
+
+# Contributions
+'contributions' => 'NgÄ mahi a tÄ“nei mema',
+'mycontris' => 'Äku mahi',
+
+# What links here
+'whatlinkshere' => 'NgÄ hononga mai',
+
+# Namespace 8 related
+'allmessages' => 'PÄnui pÅ«naha',
+
+);
+
+?>
diff --git a/languages/messages/MessagesMk.php b/languages/messages/MessagesMk.php
index dd831dee..29a7dfe7 100644
--- a/languages/messages/MessagesMk.php
+++ b/languages/messages/MessagesMk.php
@@ -176,7 +176,8 @@ $messages = array(
'oct' => 'окт',
'nov' => 'ное',
'dec' => 'дек',
-'categories' => '{{PLURAL:$1|Категорија|Категории}}',
+'categories' => 'Категории',
+'pagecategories' => '{{PLURAL:$1|Категорија|Категории}}',
'category_header' => 'Статии во категоријата "$1"',
'subcategories' => 'Подкатегории',
'mainpage' => 'Главна Ñтраница',
@@ -548,7 +549,7 @@ $1',
'loadhist' => 'Се вчитува иÑторијата за Ñтраницата',
'currentrev' => 'Тековна верзија',
'revisionasof' => 'Верзија од $1',
-'old-revision-navigation'=> 'Ревизии од $1; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'Ревизии од $1; $2',
'previousrevision' => '<Претходна ревизија',
'nextrevision' => 'Следна верзија>',
'currentrevisionlink' => 'видете ја тековната верзија',
@@ -1027,7 +1028,7 @@ $NEWPAGE
'rollbacklink' => 'Врати',
'rollbackfailed' => 'Враќањето беше неуÑпешно',
'cantrollback' => 'Ðе може да Ñе врати поÑледната промена, поÑледниот автор е иÑтовремено и единÑтвен.',
-'alreadyrolled' => 'Ðе може да Ñе врати поÑледната верзија [[$1]] на [[User:$2|$2]] ([[User talk:$2|Разговор]]); некој веќе ја уредил или ги вратил промените на Ñтраницата.
+'alreadyrolled' => 'Ðе може да Ñе врати поÑледната верзија [[:$1]] на [[User:$2|$2]] ([[User talk:$2|Разговор]]); некој веќе ја уредил или ги вратил промените на Ñтраницата.
ПоÑледното уредување беше на [[User:$3|$3]] ([[User talk:$3|Разговор]]).',
'editcomment' => 'Коментарот на уредувањето беше: "<i>$1</i>".',
@@ -1286,20 +1287,20 @@ $NEWPAGE
'importuploaderror' => 'Подигнувањето на увозната датотека не уÑпеа; можеби датотеката е поголема од макÑималната дозволена големина.',
'importlogpage' => 'Дневник на внеÑувања',
'importlogpagetext' => 'ÐдминиÑтративно внеÑување на Ñтраници Ñо иÑторија од други викија.',
-'import-logentry-upload'=> 'внеÑена $1 Ñо подигнување',
+'import-logentry-upload'=> 'внеÑена [[$1]] Ñо подигнување',
'import-logentry-upload-detail'=> '$1 ревизија(и)',
'import-logentry-interwiki'=> 'транÑвикифиран $1',
'import-logentry-interwiki-detail'=> '$1 ревизија(и) од $2',
-'accesskey-diff' => 'd',
+'accesskey-diff' => 'v',
'tooltip-search' => 'Пребарајте на {{SITENAME}} [alt-f]',
'tooltip-minoredit' => 'Обележете ја промената како Ñитна [alt-i]',
'tooltip-save' => 'Зачувајте ги вашите промени [alt-s]',
'tooltip-preview' => 'Прегледајте ги вашите промени, ве молиме кориÑтете го ова пред зачувување! [alt-p]',
-'tooltip-diff' => 'Покажи кои промени ги направи во текÑтот. [alt-d]',
+'tooltip-diff' => 'Покажи кои промени ги направи во текÑтот. [alt-v]',
'tooltip-compareselectedversions'=> 'Видете ги разликите меѓу двете избрани верзии на Ñтраницата. [alt-v]',
'tooltip-watch' => 'Додај ја оваа Ñтраница во набљудуваните Ñтраници [alt-w]',
-'Common.css' => '/** CSS кодот на оваа Ñтраница ќе Ñе примени на Ñите маÑки */',
-'Monobook.css' => '/* преку уредување на оваа датотека можете да ја прилагодите Monobook маÑката за целиот Ñајт */',
+'common.css' => '/** CSS кодот на оваа Ñтраница ќе Ñе примени на Ñите маÑки */',
+'monobook.css' => '/* преку уредување на оваа датотека можете да ја прилагодите Monobook маÑката за целиот Ñајт */',
'nodublincore' => 'Dublin Core RDF метаподатоци Ñе оневозможени за овој Ñервер.',
'nocreativecommons' => 'Creative Commons RDF метаподатоци Ñе оневозможени за овој Ñервер.',
'notacceptable' => 'Вики Ñерверот не може да генерира податоци во формат погоден за вашиот клиент.',
@@ -1341,7 +1342,7 @@ $NEWPAGE
'rcpatroldisabledtext' => 'Патролирањето на Скорешните промени е деактивирано.',
'markedaspatrollederror'=> 'Ðе можам да означам како проверена',
'markedaspatrollederrortext'=> 'Морате да внеÑете верзија за да ја означите како проверена.',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Мојата кориÑничка Ñтраница\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'КориÑничка Ñтраница за IP адреÑата од која уредувате\');
@@ -1352,7 +1353,7 @@ $NEWPAGE
ta[\'pt-mycontris\'] = new Array(\'y\',\'ЛиÑта на моите придонеÑи\');
ta[\'pt-login\'] = new Array(\'o\',\'Ве охрабруваме да Ñе најавите, иако тоа не е задолжително.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Ве охрабруваме да Ñе најавите, иако тоа не е задолжително.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Одјавете Ñе\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Одјавете Ñе\');
ta[\'ca-talk\'] = new Array(\'t\',\'Разговор за Ñтраницата\');
ta[\'ca-edit\'] = new Array(\'e\',\'Можете да ја уредите оваа Ñтраница. Ве молиме кориÑтете го копчето за преглед пред зачувување.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Додадете коментар во овој разговор.\');
diff --git a/languages/messages/MessagesMs.php b/languages/messages/MessagesMs.php
index 58534ff9..285cc0e9 100644
--- a/languages/messages/MessagesMs.php
+++ b/languages/messages/MessagesMs.php
@@ -191,6 +191,7 @@ $messages = array(
"restorelink" => "$1 suntingan dipadam",
"feedlinks" => "Menyuap:",
"categories" => "Kategori",
+"pagecategories" => "Kategori",
"category_header" => "Rencana dalam kategori \"$1\"",
"subcategories" => "Subkategori",
@@ -208,7 +209,7 @@ $messages = array(
"error" => "Ralat",
"databaseerror" => "Ralat Pangkalan Data", #"Database error",
"dberrortext" => "Kesalahan sintaks anda ini mungkin disebabkan oleh pepijat pangkalan data. Pertanyaan anda yang terakhir adalah: <blockquote><tt>$1</tt></blockquote> dari fungsi \"<tt>$2</tt>\". MySQL mengembalikan ralat \"<tt>$3: $4</tt>\".",
-"dberrortextcl" => "Kesalahan sintaks anda ini mungkin disebabkan oleh pepijat pangkalan data. Pertanyaan anda yang terakhir adalah \"$1\ dari fungsi \"$2\". MySQL mengembalikan ralat \"$3: $4\".\n",
+"dberrortextcl" => "Kesalahan sintaks anda ini mungkin disebabkan oleh pepijat pangkalan data. Pertanyaan anda yang terakhir adalah \"$1\ dari fungsi \"$2\". MySQL mengembalikan ralat \"$3: $4\".<br />",
"noconnect" => "Maaf! Wiki ini mengalami masalah teknikal dan tidak dapat menghubungi pelayan pangkalan data. <br />", #"Sorry! The wiki is experiencing some technical difficulties, and cannot contact the database server. <br />",
"nodb" => "Tidak dapat mencapai pangkalan data $1", #"Could not select database $1",
"cachederror" => "Berikut ini adalah salinan ingatan cache dari halaman yang dimintai. Salinan ini mungkin bukan versi yang terbaru.",
@@ -240,7 +241,7 @@ $messages = array(
# Login and logout pages
#
"logouttitle" => "Pengguna keluar", #"User logout",
-"logouttext" => "Anda telah keluar dari sistem. Anda masih boleh menggunakan {{SITENAME}} sebagai pengguna tanpa nama jika anda tidak ingin masuk semula. Perhatikan bahawa beberapa halaman mungkin masih dipaparkan sehingga anda membersihkan ingatan cache pelayar anda.\n",
+"logouttext" => "Anda telah keluar dari sistem. Anda masih boleh menggunakan {{SITENAME}} sebagai pengguna tanpa nama jika anda tidak ingin masuk semula. Perhatikan bahawa beberapa halaman mungkin masih dipaparkan sehingga anda membersihkan ingatan cache pelayar anda.<br />",
"welcomecreation" => "<h2>Selamat datang, $1!</h2><p>Akaun anda telah dibuka. Sila memperibadikan \"Tatarajah\" {{SITENAME}} anda.</p>",
"loginpagetitle" => "Pengguna masuk", #"User login",
"yourname" => "Nama Pengguna", #"Your user name",
@@ -250,7 +251,7 @@ $messages = array(
"yourdomainname" => "Domain anda.", #"Your domain",
"externaldberror" => "Kesalahan ini disebabkan oleh ralat pengesahan pangkalan data yang luar ataupun anda tidak mempunyai kebenaran untuk mengemaskinikan akaun luaran.", #'There was either an external authentication database error or you are not allowed to update your external account.',
"loginproblem" => "<b>Terdapat masalah dalam pendaftaran masuk anda.</b><br />Cuba semula!", #"There has been a problem with your login.</b><br />Try again!",
-"alreadyloggedin" => "<strong>$1, anda telah berjaya masuk!</strong><br />\n",
+"alreadyloggedin" => "<strong>$1, anda telah berjaya masuk!</strong><br />",
"login" => "Masuk", #"Log in",
"userlogin" => "Buka akaun atau log masuk", #"Create an account or log in",
"loginprompt" => "Anda harus menghidupkan cookie untuk masuk ke {{SITENAME}}.", #"You must have cookies enabled to log in to {{SITENAME}}.",
@@ -349,7 +350,7 @@ $messages = array(
"revhistory" => "Sejarah Penyemakan", #"Revision history",
"nohistory" => "Tiada sejarah penyuntingan untuk halaman ini", #"There is no edit history for this page.",
"revnotfound" => "Semakan tidak dapat dijumpai", #"Revision not found",
-"revnotfoundtext" => "Semakan lama untuk halaman yang anda pinta tidak dapat dijumpai. Sila semak URL yang anda gunakan untuk mencapai halaman ini.\n", #"The old revision of the page you asked for could not be found. Please check the URL you used to access this page.\n",
+"revnotfoundtext" => "Semakan lama untuk halaman yang anda pinta tidak dapat dijumpai. Sila semak URL yang anda gunakan untuk mencapai halaman ini.", #"The old revision of the page you asked for could not be found. Please check the URL you used to access this page.",
"loadhist" => "Muat turun halaman sejarah", #"Loading page history",
"currentrev" => "Semakan terkini", #"Current revision",
"revisionasof" => "Semakan sejak $1", #"Revision as of $1",
@@ -663,7 +664,7 @@ $messages = array(
"rollbacklink" => "Kembalikan ke asal",
"rollbackfailed" => "Pengembalian ke asal tergagal.",
"cantrollback" => "Tidak dapat mengembalikan suntingan terakhir; penyumbang akhir adalah pengarang tunggal untuk rencana ini.", #"Cannot revert edit; last contributor is only author of this article.",
-"alreadyrolled" => "Tidak dapat mengembalikan suntingan terakhir dari [[$1]] oleh [[Pengguna:$2|$2]] ([[Perbualan Pengguna:$2|Perbualan]]); terdapat pengguna yang telah berbuat demikian ataupun telah menyuntingnya. Suntingan terakhir telah dibuat oleh [[Pengguna:$3|$3]] ([[Perbualan Pengguna:$3|Perbualan]]).", #"Cannot rollback last edit of [[$1]] by [[User:$2|$2]] ([[User talk:$2|Talk]]); someone else has edited or rolled back the article already. Last edit was by [[User:$3|$3]] ([[User talk:$3|Talk]]).",
+"alreadyrolled" => "Tidak dapat mengembalikan suntingan terakhir dari [[$1]] oleh [[Pengguna:$2|$2]] ([[Perbualan Pengguna:$2|Perbualan]]); terdapat pengguna yang telah berbuat demikian ataupun telah menyuntingnya. Suntingan terakhir telah dibuat oleh [[Pengguna:$3|$3]] ([[Perbualan Pengguna:$3|Perbualan]]).", #"Cannot rollback last edit of [[:$1]] by [[User:$2|$2]] ([[User talk:$2|Talk]]); someone else has edited or rolled back the article already. Last edit was by [[User:$3|$3]] ([[User talk:$3|Talk]]).",
# only shown if there is an edit comment
"editcomment" => "Komen penyuntingan: \"<i>$1</i>\".", #"The edit comment was: \"<i>$1</i>\".",
"revertpage" => "Suntingan $1 dikembalikan ke versi terakhir oleh $1",
@@ -752,10 +753,10 @@ $messages = array(
"unblocklogentry" => "nyahsekat '$1'",
"range_block_disabled" => "Kebolehan penyelia untuk membuat penyekatan julat dimatikan.",
"ipb_expiry_invalid"=> "Waktu habis tempoh tidak sah.",
-"ip_range_invalid" => "Julat IP tidak sah.\n",
+"ip_range_invalid" => "Julat IP tidak sah.",
"proxyblocker" => "Penyekat proksi",
"proxyblockreason" => "Alamat IP anda telah disekat kerana ia merupakan proksi terbuka. Sila hubungi Penyedia Perkhidmatan Internet atau bantuan teknikal anda untuk memberitahu masalah keselamatan yang teruk ini.",
-"proxyblocksuccess" => "Berjaya.\n",
+"proxyblocksuccess" => "Berjaya.",
'sorbs' => 'SORBS DNSBL',
'sorbsreason' => "Alamat IP anda telah disenaraikan sebagai proksi terbuka di [http://www.sorbs.net SORBS] DNSBL.",
'sorbs_create_account_reason' => "Alamat IP anda telah disenaraikan sebagai proksi terbuka di [http://www.sorbs.net SORBS] DNSBL. Oleh sebab itu, anda tidak dapat membuka akaun.",
diff --git a/languages/messages/MessagesMt.php b/languages/messages/MessagesMt.php
new file mode 100644
index 00000000..8f2332a2
--- /dev/null
+++ b/languages/messages/MessagesMt.php
@@ -0,0 +1,99 @@
+<?php
+/** Maltese (Malti)
+ *
+ * @package MediaWiki
+ * @subpackage Language
+ */
+
+$messages = array(
+'mainpage' => 'Paġna prinċipali',
+
+'portal' => 'Portal tal-komunità',
+'portal-url' => 'Project:Portal tal-komunità',
+'aboutsite' => 'Dwar {{SITENAME}}',
+'help' => 'Għajnuna',
+'sitesupport' => 'Donazzjonijiet',
+'sitesupport-url' => 'Project:Donazzjonijiet',
+'mytalk' => 'Diskussjonijiet tiegħi',
+'navigation' => 'Navigazzjoni',
+
+'currentevents' => 'Ä rajjiet kurrenti',
+'currentevents-url' => 'Project:Ä rajjiet kurrenti',
+
+'disclaimers' => 'Ċaħdiet',
+'search' => 'Fittex',
+'go' => 'Mur',
+'history_short' => 'Kronoloġija',
+'printableversion' => 'Verżjoni għall-ipprintjar',
+'permalink' => 'Link permanenti',
+'edit' => 'Editja',
+'delete' => 'Ħassar',
+'protect' => 'Ipproteġi',
+'unprotect' => 'Tibqax tipproteġi',
+'personaltools' => 'Strumenti personali',
+'talk' => 'Diskussjoni',
+'toolbox' => 'Għodda',
+
+'youhavenewmessages' => 'Għandek $1 ($2).',
+
+# Short words for each namespace, by default used in the 'article' tab in monobook
+'nstab-main' => 'Artiklu',
+'nstab-mediawiki' => 'Messaġġ',
+
+# General errors
+'viewsource' => 'Ara l-fonti',
+
+# Login and logout pages
+'userlogin' => 'Idħol jew oħloq kont ġdid',
+'userlogout' => 'Oħroġ',
+
+# Edit pages
+'savearticle' => 'Salva l-paġna',
+'editing' => 'Qed jiġi editjat l-artiklu $1',
+'editingcomment' => 'Edit $1 (kumment)',
+
+# Preferences page
+'preferences' => 'Preferenzi',
+
+# Recent changes
+'recentchanges' => 'Tibdil riċenti',
+
+# Upload
+'upload' => "Tella' file",
+
+# Miscellaneous special pages
+'allpages' => 'Il-paġni kollha',
+'randompage' => 'Paġna kwalunkwe',
+'specialpages' => 'Paġni speċjali',
+'recentchangeslinked' => 'Tibdil relatat',
+'move' => 'Mexxi',
+
+'version' => 'Verżjoni',
+
+# E-mail user
+'emailuser' => 'Ibgħat e-mail lil dan l-utent',
+
+# Watchlist
+'watchlist' => "Lista t'osservazzjoni tiegħi",
+'watch' => 'Segwi',
+'unwatch' => 'Tibqax issegwi',
+
+# Undelete
+'undelete' => 'Irkupra l-paġna mħassra',
+
+# Contributions
+'contributions' => 'Kontribuzzjonijiet tal-user',
+'mycontris' => 'Kontribuzzjonijiet tiegħi',
+
+# What links here
+'whatlinkshere' => 'Links li jwasslu hawn',
+
+# Block/unblock
+'blockip' => 'Ibblokkja l-utent',
+
+# Namespace 8 related
+'allmessages' => 'Il-messaġġi kollha tas-sistema',
+
+);
+
+?>
diff --git a/languages/messages/MessagesNds.php b/languages/messages/MessagesNds.php
index b69058d5..4f0853c6 100644
--- a/languages/messages/MessagesNds.php
+++ b/languages/messages/MessagesNds.php
@@ -157,12 +157,13 @@ $messages = array(
# Textdelen, de vun vele Sieten bruukt warrn:
#
'categories' => 'Sietenkategorien',
+'pagecategories' => 'Sietenkategorien',
'category_header' => 'Sieten in de Kategorie $1',
'subcategories' => 'Ãœnnerkategorien',
'mainpage' => 'Hööftsiet',
'mainpagetext' => 'De Wiki-Software is mit Spood installeert worrn.',
-'mainpagedocfooter' => 'Kiek de [http://meta.wikipedia.org/wiki/MediaWiki_i18n Dokumentatschoon för dat Anpassen vun de Brukerböversiet]
-un dat [http://meta.wikipedia.org/wiki/MediaWiki_User%27s_Guide Brukerhandbook] för Hülp to de Bruuk un Konfiguratschoon.',
+'mainpagedocfooter' => 'Kiek de [http://meta.wikimedia.org/wiki/MediaWiki_i18n Dokumentatschoon för dat Anpassen vun de Brukerböversiet]
+un dat [http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Brukerhandbook] för Hülp to de Bruuk un Konfiguratschoon.',
'portal' => '{{SITENAME}}-Portal',
'portal-url' => '{{ns:4}}:Portal',
'about' => 'Över',
@@ -819,7 +820,7 @@ In $2 kannst du en List vun de letzten Löschen finnen.',
'rollbacklink' => 'Trüchnehmen',
'rollbackfailed' => 'Trüchnahm hett kenen Spood',
'cantrollback' => 'De Ännern kann nich trüchnahmen warrn; de letzte Autor is de eenzige.',
-'alreadyrolled' => 'Dat Trüchnehmen vun de Ännern an de Siet [[$1]] vun [[User:$2|$2]]
+'alreadyrolled' => 'Dat Trüchnehmen vun de Ännern an de Siet [[:$1]] vun [[User:$2|$2]]
([[User_talk:$2|Diskuschoonssiet]]) is nich mööglich, vun wegen dat dor en annere Ännern oder Trüchnahm ween is.
De letzte Ännern is vun [[User:$3|$3]]
@@ -1050,11 +1051,11 @@ Kontakteer dien Provider oder diene Systemtechnik un informeer se över dat möÃ
# Stilvörlagen
-'Monobook.css' => '/* disse Datei editeern üm den Monobook-Skin för de ganze Siet antopassen */',
-#'Monobook.js' => '/* disse Datei editeern üm js-Saken in den Monobook-Skin to ännern */',
+'monobook.css' => '/* disse Datei editeern üm den Monobook-Skin för de ganze Siet antopassen */',
+#'monobook.js' => '/* disse Datei editeern üm js-Saken in den Monobook-Skin to ännern */',
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* Tooltips un Togriepslötel */
+'monobook.js' => '/* Tooltips un Togriepslötel */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Mien Brukersiet\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'De Brukersiet för de IP-Adress ünner de du schriffst\');
@@ -1065,7 +1066,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Mien Oppasslist\');
ta[\'pt-mycontris\'] = new Array(\'y\',\'List vun mien Bidreeg\');
ta[\'pt-login\'] = new Array(\'o\',\'Du kannst di geern anmellen, dat is aver nich neudig, üm Sieten to bearbeiden.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Du kannst di geern anmellen, dat is aver nich neudig, üm Sieten to bearbeiden.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Afmellen\');
+ta[\'pt-logout\'] = new Array(\'\',\'Afmellen\');
ta[\'ca-talk\'] = new Array(\'t\',\'Diskuschoon över disse Siet\');
ta[\'ca-edit\'] = new Array(\'e\',\'Du kannst disse Siet ännern. Bruuk dat vör dat Spiekern.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'En Kommentar to disse Diskuschoonssiet hentofögen.\');
diff --git a/languages/messages/MessagesNds_nl.php b/languages/messages/MessagesNds_nl.php
index cfacc116..499169c3 100644
--- a/languages/messages/MessagesNds_nl.php
+++ b/languages/messages/MessagesNds_nl.php
@@ -4,8 +4,6 @@
* @package MediaWiki
* @subpackage Language
*
- * @bug 4497
- *
* @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>, Jens Frank
* @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason, Jens Frank
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
@@ -23,7 +21,7 @@ $skinNames = array(
$namespaceNames = array(
NS_MEDIA => 'Media',
- NS_SPECIAL => 'Speciaol',
+ NS_SPECIAL => 'Speciaal',
NS_MAIN => '',
NS_TALK => 'Overleg',
NS_USER => 'Gebruker',
@@ -38,8 +36,14 @@ $namespaceNames = array(
NS_TEMPLATE_TALK => 'Overleg_sjabloon',
NS_HELP => 'Help',
NS_HELP_TALK => 'Overleg_help',
- NS_CATEGORY => 'Categorie',
- NS_CATEGORY_TALK => 'Overleg_categorie'
+ NS_CATEGORY => 'Kattegerie',
+ NS_CATEGORY_TALK => 'Overleg_kattegerie'
+);
+
+$namespaceAliases = array(
+ 'Speciaol' => NS_SPECIAL,
+ 'Categorie' => NS_CATEGORY,
+ 'Overleg_categorie' => NS_CATEGORY_TALK,
);
$dateFormats = array(
@@ -56,5 +60,4 @@ $dateFormats = array(
'ymd both' => 'H:i, Y M j',
);
-
?>
diff --git a/languages/messages/MessagesNl.php b/languages/messages/MessagesNl.php
index 9bd6c448..1177543c 100644
--- a/languages/messages/MessagesNl.php
+++ b/languages/messages/MessagesNl.php
@@ -172,7 +172,8 @@ parent class in order maintain consistency across languages.
'dec' => 'dec',
# Bits of text used by many pages:
#
-'categories' => '{{PLURAL:$1|Categorie|Categorieën}}',
+'categories' => 'Categorieën',
+'pagecategories' => '{{PLURAL:$1|Categorie|Categorieën}}',
'category_header' => 'Pagina\'s in categorie "$1"',
'subcategories' => 'Ondercategorieën',
@@ -595,7 +596,7 @@ U kunt reeds bestaande pagina\'s wijzigen, of u kunt [[Special:Userlogin|zich aa
'loadhist' => 'Bezig met het laden van de paginageschiedenis',
'currentrev' => 'Huidige versie',
'revisionasof' => 'Versie op $1',
-'old-revision-navigation'=> 'Versie per $1; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'Versie per $1; $2',
'previousrevision' => 'â†Oudere versie',
'nextrevision' => 'Nieuwere versie→',
'currentrevisionlink' => 'Huidige versie',
@@ -1131,7 +1132,7 @@ Feedback en andere assistentie:
'rollbacklink' => 'terugdraaien',
'rollbackfailed' => 'Ongedaan maken van wijzigingen mislukt.',
'cantrollback' => 'Ongedaan maken van wijzigingen onmogelijk: deze pagina heeft slechts 1 auteur.',
-'alreadyrolled' => 'Het is niet mogelijk om de bewerking van de pagina [[$1]] door [[User:$2|$2]] ([[User talk:$2|overleg]]) ongedaan te maken. Iemand anders heeft deze pagina al bewerkt of hersteld naar een eerdere versie.
+'alreadyrolled' => 'Het is niet mogelijk om de bewerking van de pagina [[:$1]] door [[User:$2|$2]] ([[User talk:$2|overleg]]) ongedaan te maken. Iemand anders heeft deze pagina al bewerkt of hersteld naar een eerdere versie.
De meest recente bewerking is gemaakt door [[User:$3|$3]] ([[User talk:$3|overleg]]).',
'editcomment' => 'Bewerkingssamenvatting: "<i>$1</i>".',
@@ -1406,7 +1407,7 @@ Alle transwiki-importhandelingen worden opgeslagen in het [[Special:Log/import|i
# import log
'importlogpage' => 'Importlogboek',
'importlogpagetext' => 'Administratieve import van pagina\'s met geschiedenis van andere wiki\'s.',
-'import-logentry-upload'=> '$1 geïmporteerd via een bestandsupload',
+'import-logentry-upload'=> '[[$1]] geïmporteerd via een bestandsupload',
'import-logentry-upload-detail'=> '$1 versie(s)',
'import-logentry-interwiki'=> 'transwiki voor $1 geslaagd',
'import-logentry-interwiki-detail'=> '$1 versie(s) van $2',
@@ -1418,12 +1419,12 @@ Alle transwiki-importhandelingen worden opgeslagen in het [[Special:Log/import|i
'tooltip-minoredit' => 'Markeer dit als een kleine wijziging [alt-i]',
'tooltip-save' => 'Sla uw wijzigingen op [alt-s]',
'tooltip-preview' => 'Maak een voorvertoning. Gebruik dit! [alt-p]',
-'tooltip-diff' => 'Toon de gemaakte wijzigingen. [alt-d]',
+'tooltip-diff' => 'Toon de gemaakte wijzigingen. [alt-v]',
'tooltip-compareselectedversions'=> 'Toon de verschillen tussen de geselecteerde versies. [alt-v]',
'tooltip-watch' => 'Voeg deze pagina toe aan uw volglijst [alt-w]',
# stylesheets
-'Monobook.css' => '/* Een CSS die hier wordt geplaatst heeft invloed op alle gebruikers van de skin Monobook */',
+'monobook.css' => '/* Een CSS die hier wordt geplaatst heeft invloed op alle gebruikers van de skin Monobook */',
# Metadata
'nodublincore' => 'Dublin Core RDF metadata is uitgeschakeld op deze server.',
@@ -1479,7 +1480,7 @@ Alle transwiki-importhandelingen worden opgeslagen in het [[Special:Log/import|i
'markedaspatrollederrortext'=> 'Selecteer een versie om als gecontroleerd aan te merken.',
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* tooltips en sneltoetsen */
+'monobook.js' => '/* tooltips en sneltoetsen */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Mijn gebruikerspagina\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Gebruikerspagina voor uw IP-adres\');
@@ -1490,7 +1491,7 @@ Alle transwiki-importhandelingen worden opgeslagen in het [[Special:Log/import|i
ta[\'pt-mycontris\'] = new Array(\'y\',\'Mijn bijdragen\');
ta[\'pt-login\'] = new Array(\'o\',\'U wordt van harte uitgenodigd om u aan te melden als gebruiker, maar dit is niet verplicht\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'U wordt van harte uitgenodigd om u aan te melden als gebruiker, maar dit is niet verplicht\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Afmelden\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Afmelden\');
ta[\'ca-talk\'] = new Array(\'t\',\'Toon de overlegtekst bij deze pagina\');
ta[\'ca-edit\'] = new Array(\'e\',\'U kunt deze pagina bewerken. Gebruik a.u.b. de voorbeeldweergaveknop alvorens te bewaren\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Voeg uw opmerking toe aan de overlegpagina\');
diff --git a/languages/messages/MessagesNn.php b/languages/messages/MessagesNn.php
index d02e892b..3ffc0c1c 100644
--- a/languages/messages/MessagesNn.php
+++ b/languages/messages/MessagesNn.php
@@ -231,12 +231,13 @@ $messages = array(
# Bits of text used by many pages:
'categories' => 'Kategoriar',
+'pagecategories' => 'Kategoriar',
'category_header' => 'Artiklar i kategorien «$1»',
'subcategories' => 'Underkategoriar',
'mainpage' => 'Hovudside',
'mainpagetext' => 'MediaWiki er no installert.',
-'mainpagedocfooter' => 'Sjå [http://meta.wikipedia.org/wiki/MediaWiki_localization dokumentasjon for å tilpasse brukargrensesnittet] og [http://meta.wikipedia.org/wiki/Help:Contents brukarmanualen] for bruk og konfigurasjonshjelp.',
+'mainpagedocfooter' => 'Sjå [http://meta.wikimedia.org/wiki/MediaWiki_localization dokumentasjon for å tilpasse brukargrensesnittet] og [http://meta.wikimedia.org/wiki/Help:Contents brukarmanualen] for bruk og konfigurasjonshjelp.',
'portal' => 'Brukarportal',
'portal-url' => 'Project:Brukarportal',
@@ -952,7 +953,7 @@ For hjelp og meir informasjon:
'rollbacklink' => 'rull attende',
'rollbackfailed' => 'Kunne ikkje rulle attende',
'cantrollback' => 'Kan ikkje rulle attende fordi den siste brukaren er den einaste forfattaren.',
-'alreadyrolled' => 'Kan ikkje rulle attende den siste endringa av [[$1]] gjort av [[{{ns:2}}:$2|$2]] ([[{{ns:3}}:$2|brukardiskusjon]]) fordi nokon andre allereie har endra sida att eller fjerna endringa.
+'alreadyrolled' => 'Kan ikkje rulle attende den siste endringa av [[:$1]] gjort av [[{{ns:2}}:$2|$2]] ([[{{ns:3}}:$2|brukardiskusjon]]) fordi nokon andre allereie har endra sida att eller fjerna endringa.
Den siste endringa vart gjort av [[{{ns:2}}:$3|$3]] ([[{{ns:3}}:$3|brukardiskusjon]]).',
# only shown if there is an edit comment
@@ -1170,7 +1171,7 @@ For å eksportere bruker du [[{{ns:-1}}:Export|eksportsida]] på kjeldewikien; h
'accesskey-minoredit' => 'i',
'accesskey-save' => 's',
'accesskey-preview' => 'p',
-'accesskey-diff' => 'd',
+'accesskey-diff' => 'v',
'accesskey-compareselectedversions' => 'v',
# tooltip help for some actions, most are in Monobook.js
@@ -1178,7 +1179,7 @@ For å eksportere bruker du [[{{ns:-1}}:Export|eksportsida]] på kjeldewikien; h
'tooltip-minoredit' => 'Merk dette som ei uviktig endring [alt-i]',
'tooltip-save' => 'Lagre endringane dine [alt-s]',
'tooltip-preview' => 'Førehandsvis endringane dine, bruk denne funksjonen før du lagrar! [alt-p]',
-'tooltip-diff' => 'Vis skilnaden mellom din versjon og lagra versjon, utan å lagre. [alt-d]',
+'tooltip-diff' => 'Vis skilnaden mellom din versjon og lagra versjon, utan å lagre. [alt-v]',
'tooltip-compareselectedversions' => 'Sjå endringane mellom dei valde versjonane av denne sida. [alt-v]',
'tooltip-watch' => 'Legg denne sida til i overvakingslista di [alt-w]',
@@ -1231,7 +1232,7 @@ For å eksportere bruker du [[{{ns:-1}}:Export|eksportsida]] på kjeldewikien; h
'rcpatroldisabledtext' => 'Patruljeringsfunksjonen er deaktivert.',
# stylesheets
-'Monobook.js' => '/*
+'monobook.js' => '/*
<pre>
*/
/* verktøytips og snøggtastar */
@@ -1245,7 +1246,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Liste over sidene du overvak
ta[\'pt-mycontris\'] = new Array(\'y\',\'Liste over bidraga mine\');
ta[\'pt-login\'] = new Array(\'o\',\'Det er ikkje obligatorisk å logga inn, men medfører mange fordelar.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Det er ikkje obligatorisk å logga inn, men medfører mange fordelar.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Logg ut\');
+ta[\'pt-logout\'] = new Array(\'\',\'Logg ut\');
ta[\'ca-talk\'] = new Array(\'t\',\'Diskusjon om innhaldssida\');
ta[\'ca-edit\'] = new Array(\'e\',\'Du kan endre denne sida. Bruk førehandsvisings-knappen før du lagrar.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Legg til ein bolk på denne diskusjonssida.\');
diff --git a/languages/messages/MessagesNo.php b/languages/messages/MessagesNo.php
index 1b8477ff..93aab153 100644
--- a/languages/messages/MessagesNo.php
+++ b/languages/messages/MessagesNo.php
@@ -46,6 +46,7 @@ $namespaceNames = array(
);
$separatorTransformTable = array(',' => "\xc2\xa0", '.' => ',' );
+$linkTrail = '/^([æøåa-z]+)(.*)$/sDu';
$dateFormats = array(
'mdy time' => 'H:i',
@@ -86,7 +87,7 @@ $messages = array(
'tog-enotifwatchlistpages'=> 'E-post med ved sideenringer',
'tog-enotifusertalkpages'=> 'E-post meg ved endringer på brukerdiskusjonssiden min',
'tog-enotifminoredits' => 'E-post meg også ved mindre sideendringer',
-'tog-enotifrevealaddr' => 'Vis e-postadressa mi i e-poster',
+'tog-enotifrevealaddr' => 'Vis e-postadressen min i e-poster',
'tog-shownumberswatching'=> 'Vis antall overvåkende brukere',
'tog-fancysig' => 'RÃ¥signatur (uten automatisk lenke)',
'tog-externaleditor' => 'Bruk ekstern behandler som standard',
@@ -132,7 +133,8 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nov',
'dec' => 'des',
-'categories' => '{{PLURAL:$1|Kategori|Kategorier}}',
+'categories' => 'Kategorier',
+'pagecategories' => '{{PLURAL:$1|Kategori|Kategorier}}',
'category_header' => 'Artikler i kategorien «$1»',
'subcategories' => 'Underkategorier',
'mainpage' => 'Hovedside',
@@ -171,7 +173,7 @@ $messages = array(
'moredotdotdot' => 'Mer…',
'mypage' => 'Min side',
'mytalk' => 'Min diskusjonsside',
-'anontalk' => 'Brukerdiskusjon for denne IP-adressa',
+'anontalk' => 'Brukerdiskusjon for denne IP-adressen',
'navigation' => 'Navigasjon',
'metadata_help' => 'Metadata (se [[Project:Metadata]] for en forklaring):',
'currentevents' => 'Aktuelt',
@@ -285,14 +287,14 @@ Send en rapport om dette til en administrator, og inkluder adressen (URL-en)
til siden.',
'readonly_lag' => 'Databasen er automatisk skrivebeskyttet så slavetjenerne kan ta igjen mestertjeneren',
'internalerror' => 'Intern feil',
-'filecopyerror' => 'Kunne ikke kopiere fila «$1» til «$2».',
+'filecopyerror' => 'Kunne ikke kopiere filen «$1» til «$2».',
'filerenameerror' => 'Kunne ikke omdøpe filen «$1» til «$2».',
'filedeleteerror' => 'Kunne ikke slette filen «$1».',
'filenotfound' => 'Kunne ikke finne filen «$1».',
'unexpected' => 'Uventet verdi: «$1»=«$2».',
'formerror' => 'Feil: kunne ikke sende skjema',
'badarticleerror' => 'Handlingen kan ikke utføres på denne siden.',
-'cannotdelete' => 'Kunne ikke slette fila (den kan allerede være slettet av noen andre).',
+'cannotdelete' => 'Kunne ikke slette filen (den kan allerede være slettet av noen andre).',
'badtitle' => 'Ugyldig tittel',
'badtitletext' => 'Den ønskede tittelen var ugyldig, tom eller galt lenket fra et annet språk.',
'perfdisabled' => 'Denne funksjonen er midlertidig utilgjengelig av vedlikeholdsgrunner.',
@@ -332,7 +334,7 @@ Brukerkontoen din har blitt opprettet. Ikke glem å endre [[Special:Preferences|
'createaccount' => 'Opprett ny konto',
'gotaccount' => 'Har du allerede et brukernavn? $1.',
'gotaccountlink' => 'Logg inn',
-'createaccountmail' => 'per epost',
+'createaccountmail' => 'per e-post',
'badretype' => 'Passordene samsvarte ikke.',
'userexists' => 'Brukernavnet er allerede i bruk. Velg et nytt.',
'youremail' => 'E-postadresse',
@@ -343,8 +345,8 @@ Brukerkontoen din har blitt opprettet. Ikke glem å endre [[Special:Preferences|
'yourvariant' => 'Variant',
'yournick' => 'Signatur',
'badsig' => 'Ugyldig råsignatur; sjekk HTML-tagger.',
-'email' => 'Epost',
-'prefs-help-email-enotif'=> 'Denne adressa brukes også til å sende e-postmeldinger dersom du har slått på dette.',
+'email' => 'E-post',
+'prefs-help-email-enotif'=> 'Denne adressen brukes også til å sende e-postmeldinger dersom du har slått på dette.',
'prefs-help-realname' => '* Virkelig navn (valgfritt): dersom du velger å oppgi navnet, vil det bli brukt til å kreditere deg for ditt arbeid.',
'loginerror' => 'Innloggingsfeil',
'prefs-help-email' => '* E-post (valgfritt): Muliggjør at andre kan kontakte deg uten at identiteten din blir avslørt.',
@@ -360,19 +362,19 @@ Brukerkontoen din har blitt opprettet. Ikke glem å endre [[Special:Preferences|
'wrongpasswordempty' => 'Du oppga ikke noe passord. Prøv igjen.',
'mailmypassword' => 'Send nytt passord.',
'passwordremindertitle' => 'Nytt passord fra {{SITENAME}}',
-'passwordremindertext' => 'Noen (antagelig deg, fra IP-adressa $1) ba oss sende deg et nytt passord til {{SITENAME}} ($4). Passordet for kontoen «$2» er nå «$3». Du burde logge inn og endre pasordet nå.
+'passwordremindertext' => 'Noen (antagelig deg, fra IP-adressen $1) ba oss sende deg et nytt passord til {{SITENAME}} ($4). Passordet for kontoen «$2» er nå «$3». Du bør logge inn og endre pasordet nå.
Dersom noen andre gjorde denne forespørselen eller om du kom på passordet og ikke lenger ønsker å endre det, kan du ignorere denne beskjeden og fortsette å bruke det gamle passordet.',
'noemail' => 'Det er ikke registrert noen e-postadresse for brukeren «$1».',
-'passwordsent' => 'Et nytt passord har blitt send til e-postadressa registrert på bruker «$1». Logg inn når du har mottatt det nye passordet.',
-'eauthentsent' => 'En bekreftelsesepost har blitt sendt til gitte epostadresse. Før andre eposter kan sendes til kontoen, må du følge instruksjonene i eposten for å bekrefte at kontoen faktisk er din.',
+'passwordsent' => 'Et nytt passord har blitt send til e-postadressen registrert på bruker «$1». Logg inn når du har mottatt det nye passordet.',
+'eauthentsent' => 'En bekreftelses e-post har blitt sendt til den angitte e-postadressen. Før andre e-poster kan sendes til kontoen, må du følge instruksjonene i e-posten for å bekrefte at kontoen faktisk er din.',
'mailerror' => 'Feil under sending av e-post: $1',
'acct_creation_throttle_hit'=> 'Beklager, du har allerede opprettet $1 kontoer. Du kan ikke opprette flere.',
-'emailauthenticated' => 'Epostadressa di ble bekreftet $1.',
-'emailnotauthenticated' => 'Epostadressa di er ikke bekreftet. Ingen eposter vil bli sendt for følgende tjenester.',
+'emailauthenticated' => 'E-postadressen ble bekreftet $1.',
+'emailnotauthenticated' => 'E-postadressen er ikke bekreftet. Ingen e-poster vil bli sendt for følgende tjenester.',
'noemailprefs' => '<strong>Ingen e-postadresse er oppgitt</strong>, så følgende funksjoner vil ikke fungere.',
-'emailconfirmlink' => 'Bekreft epostadressa di.',
-'invalidemailaddress' => 'E-postadressa kan ikke aksepteres, fordi den er ugyldig formatert. Skriv inn en fungerende e-postadresse eller tøm feltet.',
+'emailconfirmlink' => 'Bekreft e-postadressen din.',
+'invalidemailaddress' => 'E-postadressen kan ikke aksepteres fordi den er ugyldig formatert. Skriv inn en fungerende e-postadresse eller tøm feltet.',
'accountcreated' => 'Brukerkonto opprettet',
'accountcreatedtext' => 'Brukerkonto for $1 har blitt opprettet.',
'bold_sample' => 'Fet tekst',
@@ -404,33 +406,33 @@ Dersom noen andre gjorde denne forespørselen eller om du kom på passordet og i
'showpreview' => 'Forhåndsvisning',
'showlivepreview' => 'Levende forhåndsvisning',
'showdiff' => 'Vis endringer',
-'anoneditwarning' => '\'\'\'Advarsel:\'\'\' Du er ikke logget inn. IP-adressa di vil bli bevart i sidens redigeringshistorikk.',
+'anoneditwarning' => '\'\'\'Advarsel:\'\'\' Du er ikke logget inn. Din IP-adresse vil bli bevart i sidens redigeringshistorikk.',
'missingsummary' => '\'\'\'PÃ¥minnelse:\'\'\' Du har ikke lagt inn en [[Help:Redigeringsforklaring|redigeringsforklaring]]. velger du \'\'Lagre siden\'\' en gang til blir endringene lagret uten forklaring.',
'missingcommenttext' => 'Vennligst legg inn en kommentar under.',
'blockedtitle' => 'Brukeren er blokkert',
-'blockedtext' => 'Brukernavnet eller IP-adressa di er blitt blokkert av $1, med følgende begrunnelse:<br />\'\'$2\'\'
+'blockedtext' => 'Brukernavnet eller IP-adressen er blokkert av $1 med følgende begrunnelse:<br />\'\'$2\'\'
Du kan kontakte $1 eller en annen [[Project:Administratorer|administrator]] for å diskutere utestengelsen.
-IP-adressa di er $3. Vennligst inkluder denne i alle forespørsler du gjør.',
+Din ip-adresse er $3. Vennligst inkluder denne i alle forespørsler du gjør.',
'whitelistedittitle' => 'Innlogging kreves for å redigere',
-'whitelistedittext' => 'Du må $1 for å redigere artikler.',
+'whitelistedittext' => 'Du må [[Special:userlogin|logge inn}} for å redigere artikler.',
'whitelistreadtitle' => 'Innlogging kreves for å lese',
'whitelistreadtext' => 'Du må [[Special:Userlogin|logge inn]] for å lese artikler.',
'whitelistacctitle' => 'Du har ikke adgang til å opprette en konto',
-'whitelistacctext' => 'For å få adgang til å opprette kontoer må du [[Special:Userlogin|logge inn]] og ha riktige rettigheter.',
-'confirmedittitle' => 'Epostbekreftelse nødvendig før du kan redigere',
-'confirmedittext' => 'Du må bekrefte epostadressa di før du kan redigere sider. Vennligst oppgi og valider epostadressa di via [[Special:Preferences|innstillingene dine]].',
+'whitelistacctext' => 'For å få adgang til å opprette kontoer må du [[Special:Userlogin|logge inn]] og ha tilstrekkelige rettigheter.',
+'confirmedittitle' => 'E-postbekreftelse nødvendig før du kan redigere',
+'confirmedittext' => 'Du må bekrefte e-postadressen din før du kan redigere sider. Vennligst oppgi og valider e-postadressen din via [[Special:Preferences|innstillingene dine]].',
'loginreqtitle' => 'Innlogging kreves',
-'loginreqlink' => 'innlogging',
-'loginreqpagetext' => 'Du må $1 for å se andre sider.',
+'loginreqlink' => 'logge inn',
+'loginreqpagetext' => 'Du må [[Special:Userlogin|logge inn]] for å se andre sider.',
'accmailtitle' => 'Passord sendt',
'accmailtext' => 'Passordet for «$1» har blitt sendt til $2.',
'newarticle' => '(ny)',
-'newarticletext' => 'Du har fulgt en lenke til en side som ikke finnes ennå. For å opprette siden, start å skrive i boksen under (se [[Project:Hjelp|hjelpesiden]] for mer informasjon). Om du kom hit ved en feil, bare trykk på nettleserens \'\'\'tilbake\'\'\'-knapp.',
+'newarticletext' => 'Du har fulgt en lenke til en side som ikke finnes ennå. For å opprette siden, start å skrive i boksen under (se [[Project:Hjelp|hjelpesiden]] for mer informasjon). Om du kom hit ved en feil, trykk på nettleserens \'\'\'tilbake\'\'\'-knapp.',
'anontalkpagetext' => '----
-\'\'Dette er en diskusjonsside for en anonym bruker som ikke har opprettet konto eller ikke er logget inn. Vi er derfor nødt til å bruke den numeriske IP-adressa til å identifisere ham eller henne. En IP-adresse kan være delt mellom flere brukere. Hvis du er en anonym bruker og synes at du har fått irrelevante kommentarer på en slik side, [[Special:Userlogin|logg på]] så vi unngår framtidige forvekslinger med andre anonyme brukere.\'\'',
-'noarticletext' => 'Det er ikke noe tekst på denne siden. Du kanm [[Special:Search/{{PAGENAME}}|søke etter siden]] i andre sider, eller [{{fullurl:{{FULLPAGENAME}}|action=edit}} redigere siden].',
+\'\'Dette er en diskusjonsside for en anonym bruker som ikke har opprettet konto eller ikke er logget inn. Vi er derfor nødt til å bruke den numeriske IP-adressen til å identifisere ham eller henne. En IP-adresse kan være delt mellom flere brukere. Hvis du er en anonym bruker og synes at du har fått irrelevante kommentarer på en slik side, [[Special:Userlogin|logg på]] så vi unngår framtidige forvekslinger med andre anonyme brukere.\'\'',
+'noarticletext' => 'Det er ikke noe tekst på denne siden. Du kan [[Special:Search/{{PAGENAME}}|søke etter siden]] i andre sider, eller [{{fullurl:{{FULLPAGENAME}}|action=edit}} redigere siden].',
'clearyourcache' => '\'\'\'NB:\'\'\' Etter å ha lagret må du tømme nettleserens mellomlager («cache») for å kunne se endringene: \'\'\'Mozilla/Safari/Konqueror:\'\'\' hold nede \'\'Shift\'\' mens du klikker på \'\'Reload\'\' (eller trykk \'\'Ctrl-Shift-R\'\'), \'\'\'IE:\'\'\' trykk \'\'Ctrl-F5\'\', \'\'\'Opera:\'\'\' trykk \'\'F5\'\'.',
'usercssjsyoucanpreview'=> '<strong>Tips:</strong> Bruk «Forhåndsvisning»-knappen for å teste din nye CSS/JS før du lagrer.',
'usercsspreview' => '\'\'\'Husk at dette bare er en forhåndsvisning av din bruker-CSS og at den ikke er lagret!\'\'\'',
@@ -458,7 +460,7 @@ Du er nødt til å flette dine endringer sammen med den nåværende teksten.
trykker «Lagre siden».<br />',
'yourtext' => 'Din tekst',
'storedversion' => 'Den lagrede versjonen',
-'nonunicodebrowser' => '<strong>ADVARSEL: Nettleseren din har ikke støtte for Unicode. Skru det på før du begynner å redigere artikler.</strong>',
+'nonunicodebrowser' => '<strong>ADVARSEL: Nettleseren din har ikke støtte for nicode. Skru det på før du begynner å redigere artikler.</strong>',
'editingold' => '\'\'\'ADVARSEL: Du redigerer en gammel versjon av denne siden. Hvis du lagrer den, vil alle endringer foretatt siden denne versjonen bli overskrevet.\'\'\'',
'yourdiff' => 'Forskjeller',
'copyrightwarning' => 'Vennligst merk at alle bidrag til {{SITENAME}} anses som utgitt under $2 (se $1 for detaljer). Om du ikke vil at dine bidrag skal kunne redigeres og distribuert fritt, ikke legg det til her.<br />
@@ -470,7 +472,7 @@ Du lover også at du har skrevet dette selv, eller kopiert det fra en ressurs so
'readonlywarning' => '<strong>ADVARSEL: Databasen er låst på grunn av vedlikehold,
så du kan ikke lagre dine endringer akkurat nå. Det kan være en god idé å
kopiere teksten din til en tekstfil, så du kan lagre den til senere.</strong>',
-'protectedpagewarning' => '<strong>ADVARSEL: Denne siden er lås, så bare administratorer kan redigere den. Sørg for at du følger [[Project:Retningslinjer for låsing av sider|retningslinjer for låsing av sider]].</strong>',
+'protectedpagewarning' => '<strong>ADVARSEL: Denne siden er låst slik at bare administratorer kan redigere den. Sørg for at du følger [[Project:Retningslinjer for låsing av sider|retningslinjer for låsing av sider]].</strong>',
'semiprotectedpagewarning'=> '\'\'\'Merk:\'\'\' Denne siden har blitt låst slik at kun registrerte brukere kan endre den. Nyopprettede og anonyme brukere kan ikke redigere.',
'templatesused' => 'Maler i bruk på denne siden:',
'edittools' => '<!-- Teksten her vil vises under redigerings- og opplastingsboksene. -->',
@@ -479,7 +481,7 @@ kopiere teksten din til en tekstfil, så du kan lagre den til senere.</strong>',
'revhistory' => 'Historikk',
'nohistory' => 'Denne siden har ingen historikk.',
'revnotfound' => 'Versjonen er ikke funnet',
-'revnotfoundtext' => 'Den gamle versjon av siden du etterspurte finnes ikke. Kontroller adressa du brukte for å få adgang til denne siden.',
+'revnotfoundtext' => 'Den gamle versjonen av siden du etterspurte finnes ikke. Vennligst kontroller adressen du brukte for å få adgang til denne siden.',
'loadhist' => 'Laster historikk',
'currentrev' => 'Nåværende versjon',
'revisionasof' => 'Versjonen fra $1',
@@ -592,7 +594,7 @@ Andre administratorer på denne wikien vil fortsatt kunne se det skjulte innhold
'timezoneoffset' => 'Forskjell',
'servertime' => 'Tjenerens tid er nå',
'guesstimezone' => 'Hent tidssone fra nettleseren',
-'allowemail' => 'Tillat andre å sende epost til meg',
+'allowemail' => 'Tillat andre å sende e-post til meg',
'defaultns' => 'Søk i disse navnerommene som standard:',
'default' => 'standard',
'files' => 'Filer',
@@ -643,7 +645,7 @@ Andre administratorer på denne wikien vil fortsatt kunne se det skjulte innhold
'reupload' => 'Last opp fil igjen',
'reuploaddesc' => 'Tilbake til skjemaet for å laste opp filer.',
'uploadnologin' => 'Ikke logget inn',
-'uploadnologintext' => 'Du må være [[Special:Userlogin|loggett inn]] for å kunne laste opp filer.',
+'uploadnologintext' => 'Du må være [[Special:Userlogin|logget inn]] for å kunne laste opp filer.',
'upload_directory_read_only'=> 'Opplastingsmappa ($1) er ikke skrivbar for tjeneren.',
'uploaderror' => 'Feil under opplasting av fil',
'uploadtext' => 'Bruk skjemaet under for å laste opp filer. For å se eller søke i tidligere opplastede filer, gå til [[Special:Imagelist|fillista]]. Opplastinger lagres også i [[Special:Log/upload|opplastingsloggen]].
@@ -664,36 +666,36 @@ For å lenke direkte til bildet, skriv:
'copyrightpage' => 'Project:Opphavsrett',
'copyrightpagename' => 'Opphavsrett',
'uploadedfiles' => 'Filer som er lastet opp',
-'ignorewarning' => 'Lagre fila likevel.',
+'ignorewarning' => 'Lagre filen likevel.',
'ignorewarnings' => 'Ignorer eventuelle advarsler',
-'minlength' => 'Navnet på fila må bestå av minst tre bokstaver.',
-'illegalfilename' => 'Filnavnet «$1» inneholder ugyldige tegn; gi fila et nytt navn og prøv igjen.',
+'minlength' => 'Navnet på filen må bestå av minst tre bokstaver.',
+'illegalfilename' => 'Filnavnet «$1» inneholder ugyldige tegn; gi filem et nytt navn og prøv igjen.',
'badfilename' => 'Navnet på filen er blitt endret til «$1».',
-'badfiletype' => '«.$1» er ikke et tillat filformat.',
-'largefile' => 'Det anbefales at filer ikke er større enn $1&nbsp;bytes; denne fila er $2&nbsp;bytes',
-'largefileserver' => 'Denne fila er større enn det tjeneren er konfigurert til å tillate.',
-'emptyfile' => 'Fila du lastet opp ser ut til å være tom. Dette kan komme av en skrivefeil i filnavnet. Sjekk om du virkelig vil laste opp denne fila.',
-'fileexists' => 'Ei fil med dette navnet finnes allerede. Sjekk $1 hvis du ikke er sikker på at du vil forandre den.',
+'badfiletype' => '«.$1» er ikke et tillatt filformat.',
+'largefile' => 'Det anbefales at filer ikke er større enn $1&nbsp;bytes; denne filen er $2&nbsp;bytes',
+'largefileserver' => 'Denne filen er større enn det tjeneren er konfigurert til å tillate.',
+'emptyfile' => 'Filen du lastet opp ser ut til å være tom. Dette kan komme av en skrivefeil i filnavnet. Sjekk om du virkelig vil laste opp denne filen.',
+'fileexists' => 'En fil med dette navnet finnes allerede. Sjekk $1 hvis du ikke er sikker på at du vil forandre den.',
'fileexists-forbidden' => 'En fil med dette navnet finnes fra før; gå tilbake og last opp filen under et nytt navn. [[Image:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden'=> 'Ei fil med dette navnet finnes fra før i det delte fillageret; gå tilbake og last opp fila under et nytt navn. [[Image:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden'=> 'En fil med dette navnet finnes fra før i det delte fillageret; gå tilbake og last opp filen under et nytt navn. [[Image:$1|thumb|center|$1]]',
'successfulupload' => 'Opplastingen er gjennomført',
-'fileuploaded' => 'Opplastingen av $1 var vellykket. Vennligst følg denne lenka: $2 til beskrivelsessiden og fyll inn informasjon om fila, som hvor den kom fra, når og av hvem den ble laget, og annen informasjon. Om fila er et bilde, kan du sette det inn slik: <tt><nowiki>[[Image:$1|thumb|Beskrivelse]]</nowiki></tt>',
+'fileuploaded' => 'Opplastingen av $1 var vellykket. Vennligst følg denne lenken $2 til beskrivelsessiden og fyll inn informasjon om filen, som hvor den kom fra, når og av hvem den ble laget, og annen informasjon. Om filen er et bilde, kan du sette det inn slik: <tt><nowiki>[[Image:$1|thumb|Beskrivelse]]</nowiki></tt>',
'uploadwarning' => 'Opplastingsadvarsel',
'savefile' => 'Lagre fil',
'uploadedimage' => 'Lastet opp «[[$1]]»',
'uploaddisabled' => 'Opplastingsfunksjonen er deaktivert',
'uploaddisabledtext' => 'Opplasting er slått av på denne wikien.',
-'uploadscripted' => 'Denne fila inneholder HTML eller skripting som kan feiltolkes av en nettleser.',
-'uploadcorrupt' => 'Denne fila er ødelagt eller er en ugyldig filtype. Sjekk fila og last den opp på nytt.',
-'uploadvirus' => 'Denne fila inneholder virus! Detaljer: $1',
-'sourcefilename' => 'Velg ei fil',
+'uploadscripted' => 'Denne filen inneholder HTML eller skripting som kan feiltolkes av en nettleser.',
+'uploadcorrupt' => 'Denne filen er ødelagt eller er en ugyldig filtype. Sjekk filen og last den opp på nytt.',
+'uploadvirus' => 'Denne filen inneholder virus! Detaljer: $1',
+'sourcefilename' => 'Velg en fil',
'destfilename' => 'Ønsket filnavn',
-'filewasdeleted' => 'Ei fil ved dette navnet har blitt lastet opp tidligere, og så slettet. Sjekk $1 før du forsøker å laste det opp igjen.',
+'filewasdeleted' => 'En fil ved dette navnet har blitt lastet opp tidligere og så slettet. Sjekk $1 før du forsøker å laste det opp igjen.',
'license' => 'Lisensiering',
'nolicense' => 'Ingen spesifisert',
'imagelist' => 'Bildeliste',
-'imagelisttext' => 'Her er ei liste med <strong>$1</strong> filer sortert <strong>$2</strong>.',
-'imagelistforuser' => 'Denne lista viser filer lastet opp av $1.',
+'imagelisttext' => 'Her er en liste med <strong>$1</strong> filer sortert <strong>$2</strong>.',
+'imagelistforuser' => 'Denne listen viser filer lastet opp av $1.',
'getimagelist' => 'henter filliste',
'ilsubmit' => 'Søk',
'showlast' => 'Vis de siste $1 filene sortert $2.',
@@ -706,18 +708,18 @@ For å lenke direkte til bildet, skriv:
'imghistory' => 'Filhistorikk',
'revertimg' => 'gjenopprett',
'deleteimg' => 'slett',
-'deleteimgcompletely' => 'Slett alle revisjoner av denne fila',
-'imghistlegend' => 'Forklaring: (nå) = dette er den nåværende fila, (slett) = slett denne gamle versjonen, (gjenopprett) = gjenopprett en gammel versjon.
-<br /><i>Klikk på en dato for å se fila som ble lastet opp da</i>.',
+'deleteimgcompletely' => 'Slett alle revisjoner av denne filen',
+'imghistlegend' => 'Forklaring: (nå) = dette er den nåværende filen, (slett) = slett denne gamle versjonen, (gjenopprett) = gjenopprett en gammel versjon.
+<br /><i>Klikk på en dato for å se filen som ble lastet opp</i>.',
'imagelinks' => 'Lenker',
-'linkstoimage' => 'Følgende sider har lenker til denne fila:',
-'nolinkstoimage' => 'Det er ingen sider som bruker denne fila.',
-'sharedupload' => 'Denne fila deles av andre prosjekter.',
+'linkstoimage' => 'Følgende sider har lenker til denne filen:',
+'nolinkstoimage' => 'Det er ingen sider som bruker denne filen.',
+'sharedupload' => 'Denne filen deles av andre prosjekter.',
'shareduploadwiki' => 'Se $1 for mer informasjon.',
'shareduploadwiki-linktext'=> 'filbeskrivelsesside',
'noimage' => 'Ingen fil ved dette navnet finnes, du kan $1.',
'noimage-linktext' => 'laste det opp',
-'uploadnewversion-linktext'=> 'Last opp en ny versjon av denne fila',
+'uploadnewversion-linktext'=> 'Last opp en ny versjon av denne filen',
'mimesearch' => 'MIME-søk',
'mimetype' => 'MIME-type:',
'download' => 'last ned',
@@ -730,7 +732,7 @@ For å lenke direkte til bildet, skriv:
'statistics' => 'Statistikk',
'sitestats' => '{{SITENAME}}-statistikk',
'userstats' => 'Brukerstatistikk',
-'sitestatstext' => 'Det er til sammen \'\'\'$1\'\'\' sider i databasen. Dette inkluderer diskusjonssider, sider om {{SITENAME}}, små stubbsider, omdirigeringer, og annet som antagligvis ikke gjelder som ordentlig innhold. Om man ikke regner med disse, er det \'\'\'$2\'\'\' sider som sannsynligvis er ordentlige innholdssider.
+'sitestatstext' => 'Det er til sammen \'\'\'$1\'\'\' sider i databasen. Dette inkluderer diskusjonssider, sider om {{SITENAME}}, små stubbsider, omdirigeringer, og annet som antageligvis ikke gjelder som ordentlig innhold. Om man ikke regner med disse er det \'\'\'$2\'\'\' sider som sannsynligvis er ordentlige innholdssider.
\'\'\'$8\'\'\' filer har blitt lastet opp.
@@ -740,11 +742,11 @@ Det har vært totalt \'\'\'$3\'\'\' sidevisninger, og \'\'\'$4\'\'\' redigeringe
'userstatstext' => 'Det er \'\'\'$1\'\'\' registrerte brukere. \'\'\'$2\'\'\' av disse (eller $4 %) er administratorer (se $3).',
'disambiguations' => 'Artikler med flertydige titler',
'disambiguationspage' => 'Template:Peker',
-'disambiguationstext' => 'Følgende artikler har lenker til \'\'artikler med flertydige titler\'\'. De burde ha ei lenke til en entydig tittel i stedet. En artikkel blir behandlet som flertydig dersom den lenker til $1. Lenker fra andre nevnerom listes \'\'ikke\'\' her.',
+'disambiguationstext' => 'Følgende artikler har lenker til \'\'artikler med flertydige titler\'\'. De bør ha en lenke til en entydig tittel i stedet. En artikkel blir behandlet som flertydig dersom den lenker til $1. Lenker fra andre navnerom listes \'\'ikke\'\' her.',
'doubleredirects' => 'Doble omdirigeringer',
-'doubleredirectstext' => '\'\'\'NB:\'\'\' Denne lista kan inneholde gale resultater. Det er som regel fordi siden inneholder ekstra tekst under den første <tt>#redirect</tt>.<br />Hver linje inneholder lenker til den første og den andre omdirigeringen, og den første linja fra den andre omdirigeringsteksten. Det gir som regel den «riktige» målartikkelen, som den første omdirigeringen skulle ha pekt på.',
+'doubleredirectstext' => '\'\'\'NB:\'\'\' Denne listen kan inneholde gale resultater. Det er som regel fordi siden inneholder ekstra tekst under den første <tt>#redirect</tt>.<br />Hver linje inneholder lenker til den første og den andre omdirigeringen, og den første linjen fra den andre omdirigeringsteksten. Det gir som regel den «riktige» artikkelen, som den første omdirigeringen skulle ha pekt på.',
'brokenredirects' => 'Ødelagte omdirigeringer',
-'brokenredirectstext' => 'Følgende omdirigeringer peker til ikkeeksisterende sider.',
+'brokenredirectstext' => 'Følgende omdirigeringer peker til ikke-eksisterende sider.',
'nbytes' => '$1 {{plural:$1|byte|bytes}}',
'ncategories' => '$1 {{plural:$1|kategori|kategorier}}',
'nlinks' => '$1 {{plural:$1|lenke|lenker}}',
@@ -806,12 +808,12 @@ Det har vært totalt \'\'\'$3\'\'\' sidevisninger, og \'\'\'$4\'\'\' redigeringe
'allpagesprefix' => 'Vis sider med prefikset:',
'mailnologin' => 'Ingen avsenderadresse',
'mailnologintext' => 'Du må være [[Special:Userlogin|logget inn]] og ha en gyldig e-postadresse satt i [[Special:Preferences|brukerinnstillingene]] for å sende e-post til andre brukere.',
-'emailuser' => 'Epost til denne brukeren',
-'emailpage' => 'Epost til bruker.',
-'emailpagetext' => 'Hvis denne brukeren har oppgitt en gyldig epostadresse i sine innstillinger, vil dette skjemaet sende en enkelt beskjed. Den epostadressa du har satt i innstillingene dine vil dukke opp i «Fra»-feltet på denne eposten, så mottakeren er i stand til å svare.',
-'defemailsubject' => 'Epost fra {{SITENAME}}',
+'emailuser' => 'E-post til denne brukeren',
+'emailpage' => 'E-post til bruker.',
+'emailpagetext' => 'Hvis denne brukeren har oppgitt en gyldig e-postadresse i sine innstillinger, vil dette skjemaet sende en enkelt beskjed. Den e-postadressen du har satt i innstillingene dine vil dukke opp i «Fra»-feltet på denne e-posten, så mottakeren er i stand til å svare.',
+'defemailsubject' => 'E-post fra {{SITENAME}}',
'noemailtitle' => 'Ingen e-postadresse',
-'noemailtext' => 'Dene brukeren har ikke oppgitt en gyldig e-postadresse, eller har valgt å ikke motta e-post fra andre brukere.',
+'noemailtext' => 'Denne brukeren har ikke oppgitt en gyldig e-postadresse eller har valgt å ikke motta e-post fra andre brukere.',
'emailfrom' => 'Fra',
'emailto' => 'Til',
'emailsubject' => 'Emne',
@@ -825,7 +827,7 @@ Det har vært totalt \'\'\'$3\'\'\' sidevisninger, og \'\'\'$4\'\'\' redigeringe
'clearwatchlist' => 'Nullstill overvåkningsliste',
'watchlistcleartext' => 'Er du sikker på at du vil fjerne dem?',
'watchlistclearbutton' => 'Nullstill overvåkningsliste',
-'watchlistcleardone' => 'Overvåkningslista di er nullstilt. $1 {{plural:$1|objekt|objekter}} ble fjernet.',
+'watchlistcleardone' => 'Overvåkningslisten din er nullstilt. $1 {{plural:$1|objekt|objekter}} ble fjernet.',
'watchnologin' => 'Ikke logget inn',
'watchnologintext' => 'Du må være [[Special:Userlogin|logget inn]] for å kunne endre overvåkningslisten.',
'addedwatch' => 'Lagt til overvåkningslista',
@@ -912,7 +914,7 @@ Tilbakemeldinger og videre assistanse:
'rollbacklink' => 'tilbakestill',
'rollbackfailed' => 'Kunne ikke tilbakestille',
'cantrollback' => 'Kan ikke fjerne redigering; den siste brukeren er den eneste forfatteren.',
-'alreadyrolled' => 'Kan ikke fjerne den siste redigeringen på [[$1]] av [[User:$2|$2]] ([[User talk:$2|diskusjon]]); en annen har allerede redigert siden eller fjernet redigeringen. Den siste redigeringen er foretatt av [[User:$3|$3]] ([[User talk:$3|diskusjon]]).',
+'alreadyrolled' => 'Kan ikke fjerne den siste redigeringen på [[:$1]] av [[User:$2|$2]] ([[User talk:$2|diskusjon]]); en annen har allerede redigert siden eller fjernet redigeringen. Den siste redigeringen er foretatt av [[User:$3|$3]] ([[User talk:$3|diskusjon]]).',
'editcomment' => 'Redigeringskommentaren var: «\'\'$1\'\'»',
'revertpage' => 'Tilbakestilte endring av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]] · [[Special:Blockip/$2|blokker]]) til siste versjon av $1',
'sessionfailure' => 'Det ser ut til å være et problem med innloggingen din, og den har blitt avbrutt av sikkerhetshensyn. Trykk \'\'Tilbake\'\' i nettleseren din, oppdater siden og prøv igjen.',
@@ -992,16 +994,16 @@ Sjekk [[Special:Log/delete|slettingsloggen]] for en liste over nylige slettinger
'ipadressorusername' => 'IP-adresse eller brukernavn',
'ipbexpiry' => 'Utløper',
'ipbreason' => 'Begrunnelse',
-'ipbsubmit' => 'Blokker denne adressa',
+'ipbsubmit' => 'Blokker denne adressen',
'ipbother' => 'Annen tid',
'ipboptions' => '2 timer:2 hours,1 dag:1 day,3 dager:3 days,1 uke:1 week,2 uker:2 weeks,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year,uendelig:infinite',
'ipbotheroption' => 'annet',
'badipaddress' => 'Ugyldig IP-adresse.',
'blockipsuccesssub' => 'Blokkering utført',
-'blockipsuccesstext' => 'IP-adressa «$1» er blokkert. Se [[Special:Ipblocklist|blokkeringslista]] for alle blokkeringer.',
+'blockipsuccesstext' => 'IP-adressen «$1» er blokkert. Se [[Special:Ipblocklist|blokkeringslista]] for alle blokkeringer.',
'unblockip' => 'Opphev blokkering',
'unblockiptext' => 'Bruk skjemaet under for å gjenopprette skriveadgangen for en tidligere blokkert adresse eller bruker.',
-'ipusubmit' => 'Opphav blokkeringen av denne adressa',
+'ipusubmit' => 'Opphav blokkeringen av denne adressen',
'unblocked' => '[[User:$1|$1]] har blitt avblokkert',
'ipblocklist' => 'Liste over blokkerte IP-adresser og brukere',
'blocklistline' => '$1, $2 blokkerte $3 ($4)',
@@ -1020,11 +1022,11 @@ Sjekk [[Special:Log/delete|slettingsloggen]] for en liste over nylige slettinger
'ipb_expiry_invalid' => 'Ugyldig utløpstid.',
'ip_range_invalid' => 'Ugyldig IP-rad.',
'proxyblocker' => 'Proxyblokker',
-'proxyblockreason' => 'IP-adressa di har blitt blokkert fordi den er en åpen proxy. Kontakt internettleverandør eller teknisk støtte og informer dem om dette alvorlige sikkerhetsproblemet.',
+'proxyblockreason' => 'IP-adressen din har blitt blokkert fordi den er en åpen proxy. Kontakt internettleverandør eller teknisk støtte og informer dem om dette alvorlige sikkerhetsproblemet.',
'proxyblocksuccess' => 'Utført.',
'sorbs' => 'SORBS DNSBL',
-'sorbsreason' => 'IP-adressa di er oppgitt som åpen proxy i [http://sorbs.net/ SORBS]\' DNSBL.',
-'sorbs_create_account_reason'=> 'IP-adressa di oppgis som en åpen proxy i [http://sorbs.net/ SORBS]\' DNSBL. Du kan ikke opprette en konto.',
+'sorbsreason' => 'IP-adressen din er oppgitt som åpen proxy i [http://sorbs.net/ SORBS]\' DNSBL.',
+'sorbs_create_account_reason'=> 'IP-adressen din oppgis som en åpen proxy i [http://sorbs.net/ SORBS]\' DNSBL. Du kan ikke opprette en konto.',
'lockdb' => 'LÃ¥s database',
'unlockdb' => 'Ã…pne database',
'lockdbtext' => 'Å låse databasen vil avbryte alle brukere fra å kunne
@@ -1131,14 +1133,14 @@ For å eksportere sider, skriv inn titler i tekstboksen under, én tittel per li
'allmessagesmodified' => 'Vis kun endrede',
'thumbnail-more' => 'Forstørr',
'missingimage' => '<b>Bilde mangler</b><br /><i>$1</i>',
-'filemissing' => 'Fila mangler',
+'filemissing' => 'Filen mangler',
'thumbnail_error' => 'Feil under oppretting av miniatyrbilde: $1',
'import' => 'Importer sider',
'importinterwiki' => 'Transwiki-importering',
'import-interwiki-text' => 'Velg en wiki og en side å importere. Revisjonsdatoer og bidragsyteres navn vil bli bevart. Alle transwiki-importeringer spares i [[Special:Log/import|importloggen]].',
'import-interwiki-history'=> 'Kopier all historikk for denne siden',
'import-interwiki-submit'=> 'Importer',
-'importtext' => 'Importer fila fra kildewikien med Special:Export-verktøyet, lagre den på den egen datamaskin, og last den opp hit.',
+'importtext' => 'Importer filen fra kildewikien med Special:Export-verktøyet, lagre den på den egen datamaskin, og last den opp hit.',
'importstart' => 'Importerer sider…',
'import-revision-count' => '{{PLURAL:$1|Én revisjon|$1 revisjoner}}',
'importnopages' => 'Ingen sider å importere.',
@@ -1151,10 +1153,10 @@ For å eksportere sider, skriv inn titler i tekstboksen under, én tittel per li
'importhistoryconflict' => 'Motstridende revisjoner finnes (siden kan ha blitt importert tidligere)',
'importnosources' => 'Ingen transwikiimportkilder er definert, og direkte historikkimporteringer er slått av.',
'importnofile' => 'Ingen importfil opplastet.',
-'importuploaderror' => 'Opplasting av importfil feilet; kanskje fila er større en den tillatte opplastingsstørrelsen.',
+'importuploaderror' => 'Opplasting av importfil feilet; kanskje filen er større en den tillatte opplastingsstørrelsen.',
'importlogpage' => 'Importlogg',
'importlogpagetext' => 'Administrativ import av sider med redigeringshistorikk fra andre wikier.',
-'import-logentry-upload'=> 'importerte $1 ved opplasting',
+'import-logentry-upload'=> 'importerte [[$1]] ved opplasting',
'import-logentry-upload-detail'=> '{{PLURAL:$1|Én revisjon|$1 revisjoner}}',
'import-logentry-interwiki'=> 'transwikiimporterte $1',
'import-logentry-interwiki-detail'=> '{{PLURAL:$1|Én revisjon|$1 revisjoner}} fra $2',
@@ -1169,11 +1171,11 @@ For å eksportere sider, skriv inn titler i tekstboksen under, én tittel per li
'tooltip-minoredit' => 'Merk dette som en mindre endring [alt-i]',
'tooltip-save' => 'Lagre endringer [alt-s]',
'tooltip-preview' => 'Forhåndsvis endringene, vennligst bruk denne funksjonen før du lagrer! [alt-p]',
-'tooltip-diff' => 'Vis hvilke endringer du har gjort på teksten. [alt-d]',
+'tooltip-diff' => 'Vis hvilke endringer du har gjort på teksten. [alt-v]',
'tooltip-compareselectedversions'=> 'Se forskjellene mellom de to valgte versjonene av denne siden. [alt-v]',
-'tooltip-watch' => 'Legg denne siden til overvåkningslista di [alt-w]',
-'Common.css' => '/* CSS plassert i denne fila vil gjelde for alle utseender. */',
-'Monobook.css' => '/* rediger denne filen for å tilpasse Monobook-skinnet for hele siden */',
+'tooltip-watch' => 'Legg denne siden til din overvåkningsliste [alt-w]',
+'common.css' => '/* CSS plassert i denne filen vil gjelde for alle utseender. */',
+'monobook.css' => '/* rediger denne filen for å tilpasse Monobook-skinnet for hele siden */',
'nodublincore' => 'Dublin Core RDF-metadata er slått av på denne tjeneren.',
'nocreativecommons' => 'Create Commons RDF-metadata er slått av på denne tjeneren.',
'notacceptable' => 'Tjeneren har ingen mulige måter å vise data i din nettleser.',
@@ -1215,18 +1217,18 @@ For å eksportere sider, skriv inn titler i tekstboksen under, én tittel per li
'rcpatroldisabledtext' => 'Siste endringer-patruljeringsfunksjonen er slått av.',
'markedaspatrollederror'=> 'Kan ikke merke som godkjent',
'markedaspatrollederrortext'=> 'Du må spesifisere en versjon å merke som godkjent.',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Min brukerside\');
- ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Brukersiden for IP-adressa du redigerer fra\');
+ ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Brukersiden for IP-adressen du redigerer fra\');
ta[\'pt-mytalk\'] = new Array(\'n\',\'Min diskusjonsside\');
- ta[\'pt-anontalk\'] = new Array(\'n\',\'Diskusjon om redigeringer fra denne IP-adressa\');
+ ta[\'pt-anontalk\'] = new Array(\'n\',\'Diskusjon om redigeringer fra denne IP-adressen\');
ta[\'pt-preferences\'] = new Array(\'\',\'Mine innstillinger\');
- ta[\'pt-watchlist\'] = new Array(\'l\',\'Lista over sider du overvåker for endringer.\');
+ ta[\'pt-watchlist\'] = new Array(\'l\',\'Liste over sider du overvåker for endringer.\');
ta[\'pt-mycontris\'] = new Array(\'y\',\'Liste over mine bidrag\');
ta[\'pt-login\'] = new Array(\'o\',\'Du oppfordres til å logge inn, men det er ikke obligatorisk.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Du oppfordres til å logge inn, men det er ikke obligatorisk.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Logg ut\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Logg ut\');
ta[\'ca-talk\'] = new Array(\'t\',\'Diskusjon om innholdssiden\');
ta[\'ca-edit\'] = new Array(\'e\',\'Du kan redigere denne siden. Vennligst bruk Forhåndsvis-knappen før du lagrer.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Legg til et diskusjonsinnlegg.\');
@@ -1237,14 +1239,14 @@ For å eksportere sider, skriv inn titler i tekstboksen under, én tittel per li
ta[\'ca-undelete\'] = new Array(\'d\',\'Gjenopprett redigerenge som ble gjort på denne siden før den ble slettet.\');
ta[\'ca-move\'] = new Array(\'m\',\'Flytt denne siden\');
ta[\'ca-nomove\'] = new Array(\'\',\'Du har ikke tillatelse til å flytte denne siden\');
- ta[\'ca-watch\'] = new Array(\'w\',\'Legg til denne siden til overvåkningslista di.\');
- ta[\'ca-unwatch\'] = new Array(\'w\',\'Fjern denne siden fra overvåkningslista di.\');
+ ta[\'ca-watch\'] = new Array(\'w\',\'Legg til denne siden til din overvåkningsliste.\');
+ ta[\'ca-unwatch\'] = new Array(\'w\',\'Fjern denne siden fra din overvåkningsliste.\');
ta[\'search\'] = new Array(\'f\',\'Søk i denne wikien\');
ta[\'p-logo\'] = new Array(\'\',\'Hovedside\');
ta[\'n-mainpage\'] = new Array(\'z\',\'GÃ¥ til hovedsiden\');
ta[\'n-portal\'] = new Array(\'\',\'Om prosjektet; hva du kan gjøre og hvor du kan finne ting\');
ta[\'n-currentevents\'] = new Array(\'\',\'Finn bakgrunnsinformasjon om aktuelle hendelser\');
- ta[\'n-recentchanges\'] = new Array(\'r\',\'Lista over siste endringer på wikien.\');
+ ta[\'n-recentchanges\'] = new Array(\'r\',\'Liste over siste endringer på wikien.\');
ta[\'n-randompage\'] = new Array(\'x\',\'Gå inn på en tilfeldig side\');
ta[\'n-help\'] = new Array(\'\',\'Stedet for å få hjelp.\');
ta[\'n-sitesupport\'] = new Array(\'\',\'Støtt oss\');
@@ -1252,8 +1254,8 @@ For å eksportere sider, skriv inn titler i tekstboksen under, én tittel per li
ta[\'t-recentchangeslinked\'] = new Array(\'k\',\'Siste endringer i sider som blir lenket fra denne siden\');
ta[\'feed-rss\'] = new Array(\'\',\'RSS-føde for denne siden\');
ta[\'feed-atom\'] = new Array(\'\',\'Atom-føde for denne siden\');
- ta[\'t-contributions\'] = new Array(\'\',\'Vis lista over bidrag fra denne brukeren\');
- ta[\'t-emailuser\'] = new Array(\'\',\'Send en epost til denne brukeren\');
+ ta[\'t-contributions\'] = new Array(\'\',\'Vis liste over bidrag fra denne brukeren\');
+ ta[\'t-emailuser\'] = new Array(\'\',\'Send en e-post til denne brukeren\');
ta[\'t-upload\'] = new Array(\'u\',\'Last opp bilder eller mediafiler\');
ta[\'t-specialpages\'] = new Array(\'q\',\'Liste over alle spesialsider\');
ta[\'ca-nstab-main\'] = new Array(\'c\',\'Vis innholdssiden\');
@@ -1290,10 +1292,10 @@ For å eksportere sider, skriv inn titler i tekstboksen under, én tittel per li
'specialloguserlabel' => 'Bruker:',
'speciallogtitlelabel' => 'Tittel:',
'passwordtooshort' => 'Passordet ditt er for kort. Det må ha minst $1 tegn.',
-'mediawarning' => '\'\'\'Advarsel\'\'\': Denne fila kan inneholde farlig kode; ved å åpne den kan systemet ditt kompromitteres.<hr />',
+'mediawarning' => '\'\'\'Advarsel\'\'\': Denne filen kan inneholde farlig kode; ved å åpne den kan systemet ditt kompromitteres.<hr />',
'fileinfo' => '$1&nbsp;KB, MIME-type: <code>$2</code>',
'metadata' => 'Metadata',
-'metadata-help' => 'Denne fila inneholder tilleggsinformasjon, antagligvis fra digitalkameraet eller skanneren brukt til å lage eller digitalisere det. Hvis fila har blitt forandret fra utgangspunktet, kan enkelte detaljer kanskje være unøyaktige.',
+'metadata-help' => 'Denne filen inneholder tilleggsinformasjon, antagligvis fra digitalkameraet eller skanneren brukt til å lage eller digitalisere det. Hvis filen har blitt forandret fra utgangspunktet kan enkelte detaljer være unøyaktige.',
'metadata-expand' => 'Vis detaljer',
'metadata-collapse' => 'Skjul detaljer',
'exif-imagewidth' => 'Bredde',
@@ -1313,27 +1315,27 @@ For å eksportere sider, skriv inn titler i tekstboksen under, én tittel per li
'exif-pixelxdimension' => 'Gyldig bildehøyde',
'exif-usercomment' => 'Brukerkommentarer',
'exif-relatedsoundfile' => 'Relatert lydfil',
-'edit-externally' => 'Rediger denne fila med en ekstern applikasjon',
+'edit-externally' => 'Rediger denne filen med en ekstern applikasjon',
'edit-externally-help' => 'Se [http://meta.wikimedia.org/wiki/Help:External_editors oppsettsinstruksjonene] for mer informasjon.',
'recentchangesall' => 'alle',
'imagelistall' => 'alle',
'watchlistall1' => 'alle',
'watchlistall2' => 'alle',
'namespacesall' => 'alle',
-'confirmemail' => 'Bekreft epostadresse',
-'confirmemail_text' => 'Denne wikien krever at du bekrefter epostadressa di før eposttjenester kan bli brukt. Trykk på knappen under for å sende en bekreftelsesepost til din adresse. Eposten vil inneholde ei lenke med en kode; last lenka i nettleseren din for å bekrefte at epostadressa er gyldig.',
+'confirmemail' => 'Bekreft e-postadresse',
+'confirmemail_text' => 'Denne wikien krever at du bekrefter e-postadressen din før e-posttjenester kan bli brukt. Trykk på knappen under for å sende en bekreftelsese-post til din adresse. E-posten vil inneholde en lenke med en kode; last lenken i nettleseren din for å bekrefte at e-postadressen er gyldig.',
'confirmemail_send' => 'Send en bekreftelseskode.',
-'confirmemail_sent' => 'Bekreftelsesepost sendt.',
-'confirmemail_sendfailed'=> 'Kunne ikke sende bekreftelseskode. Sjekk epostadressa for ugyldige tegn.',
+'confirmemail_sent' => 'Bekreftelsese-post sendt.',
+'confirmemail_sendfailed'=> 'Kunne ikke sende bekreftelseskode. Sjekk e-postadressen for ugyldige tegn.',
'confirmemail_invalid' => 'Ugyldig bekreftelseskode. Koden kan ha utløpt.',
-'confirmemail_needlogin'=> 'Du må $1 for å bekrefte epostadressa di.',
-'confirmemail_success' => 'Epostadressa di har blitt bekreftet. Du kan nå logge inn og nyte wikien.',
-'confirmemail_loggedin' => 'Epostadressa di har blitt bekreftet.',
-'confirmemail_error' => 'Noe gitt galt i lagringa av din bekreftelse.',
-'confirmemail_subject' => 'Bekreftelsesepost fra {{SITENAME}}',
-'confirmemail_body' => 'Noen, antageligvis deg, fra IP-adressa $1, har registrert kontoen «$2» på {{SITENAME}}, og oppgitt denne adressa. For å bekrefte at kontoen virkelig tilhører deg og for å aktivere eposttjenester på {{SITENAME}}, åpne denne lenka i din nettleser: $3
+'confirmemail_needlogin'=> 'Du må $1 for å bekrefte e-postadressen di.',
+'confirmemail_success' => 'E-postadressen din har blitt bekreftet. Du kan nå logge inn og nyte wikien.',
+'confirmemail_loggedin' => 'E-postadressen din har blitt bekreftet.',
+'confirmemail_error' => 'Noe gitt galt under registrering av din bekreftelse.',
+'confirmemail_subject' => 'Bekreftelsese-post fra {{SITENAME}}',
+'confirmemail_body' => 'Noen, antageligvis deg, fra IP-adressen $1, har registrert kontoen «$2» på {{SITENAME}}, og oppgitt denne e-post-adressen. For å bekrefte at kontoen virkelig tilhører deg og for å aktivere e-posttjenester på {{SITENAME}}, åpne denne lenken i din nettleser: $3
-Om dette ikke er deg, ikke følg lenka. Denne bekreftelseskoden vil løpe ut $4.',
+Om dette ikke er deg, ikke følg lenken. Denne bekreftelseskoden vil utløpe $4.',
'tryexact' => 'Prøv nøyaktig treff',
'searchfulltext' => 'Søk full tekst',
'createarticle' => 'Opprett artikkel',
@@ -1356,7 +1358,6 @@ $1
'confirm_purge' => 'Vil du slette tjenerens mellomlagrede versjon (\'\'cache\'\') av denne siden? $1',
'confirm_purge_button' => 'OK',
'youhavenewmessagesmulti'=> 'Du har nye beskjeder på $1',
-'newtalkseperator' => ',_',
'searchcontaining' => 'Søk etter artikler som inneholder \'\'$1\'\'.',
'searchnamed' => 'Søk for artikler ved navn \'\'$1\'\'.',
'articletitles' => 'Artikler som begynner med \'\'$1\'\'',
diff --git a/languages/messages/MessagesOc.php b/languages/messages/MessagesOc.php
index 901072f9..6f20ba5a 100644
--- a/languages/messages/MessagesOc.php
+++ b/languages/messages/MessagesOc.php
@@ -22,35 +22,46 @@ $namespaceNames = array(
NS_SPECIAL => 'Especial',
NS_MAIN => '',
NS_TALK => 'Discutir',
- NS_USER => 'Utilisator',
- NS_USER_TALK => 'Discutida_Utilisator',
+ NS_USER => 'Utilizaire',
+ NS_USER_TALK => 'Discussion_Utilizaire',
# NS_PROJECT set by $wgMetaNamespace
- NS_PROJECT_TALK => 'Discutida_$1',
+ NS_PROJECT_TALK => 'Discussion_$1',
NS_IMAGE => 'Imatge',
- NS_IMAGE_TALK => 'Discutida_Imatge',
+ NS_IMAGE_TALK => 'Discussion_Imatge',
NS_MEDIAWIKI => 'Mediaòiqui',
- NS_MEDIAWIKI_TALK => 'Discutida_Mediaòiqui',
+ NS_MEDIAWIKI_TALK => 'Discussion_Mediaòiqui',
NS_TEMPLATE => 'Modèl',
- NS_TEMPLATE_TALK => 'Discutida_Modèl',
+ NS_TEMPLATE_TALK => 'Discussion_Modèl',
NS_HELP => 'Ajuda',
- NS_HELP_TALK => 'Discutida_Ajuda',
+ NS_HELP_TALK => 'Discussion_Ajuda',
NS_CATEGORY => 'Categoria',
- NS_CATEGORY_TALK => 'Discutida_Categoria',
+ NS_CATEGORY_TALK => 'Discussion_Categoria',
+);
+$namespaceAliases = array(
+ 'Utilisator' => NS_USER,
+ 'Discussion_Utilisator' => NS_USER_TALK,
+ 'Discutida_Utilisator' => NS_USER_TALK,
+ //'Discutida_$1' => NS_PROJECT_TALK, /// @fixme
+ 'Discutida_Imatge' => NS_IMAGE_TALK,
+ 'Discutida_Mediaòiqui' => NS_MEDIAWIKI_TALK,
+ 'Discutida_Modèl' => NS_TEMPLATE_TALK,
+ 'Discutida_Ajuda' => NS_HELP_TALK,
+ 'Discutida_Categoria' => NS_CATEGORY_TALK,
);
$linkTrail = "/^([a-zàâçéèêîôû]+)(.*)\$/sDu";
$dateFormats = array(
'mdy time' => 'H:i',
'mdy date' => 'M j, Y',
- 'mdy both' => 'M j, Y à H:i',
+ 'mdy both' => 'M j, Y "a" H:i',
'dmy time' => 'H:i',
'dmy date' => 'j M Y',
- 'dmy both' => 'j M Y à H:i',
+ 'dmy both' => 'j M Y "a" H:i',
'ymd time' => 'H:i',
'ymd date' => 'Y M j',
- 'ymd both' => 'Y M j à H:i',
+ 'ymd both' => 'Y M j "a" H:i',
);
@@ -82,10 +93,13 @@ $messages = array(
'sunday' => 'dimenge',
'monday' => 'diluns',
'tuesday' => 'dimarts',
-'wednesday' => 'dimèrcres',
+'wednesday' => 'dimècres',
'thursday' => 'dijòus',
'friday' => 'divendres',
'saturday' => 'dissabte',
+
+'wed' => 'Dimè',
+
'january' => 'janvièir',
'february' => 'febrièr',
'march' => 'març',
@@ -98,6 +112,7 @@ $messages = array(
'october' => 'octòbre',
'november' => 'novembre',
'december' => 'decembre',
+
'jan' => 'jan',
'feb' => 'feb',
'mar' => 'mar',
@@ -114,7 +129,8 @@ $messages = array(
# Bits of text used by many pages:
#
-"categories" => "Catégories de la page", // Looxix "Page categories",
+"categories" => "Catégories de la page", // Looxix "Categories",
+"pagecategories" => "Catégories de la page", // Looxix "{{PLURAL:$1|Category|Categories}}",
"category_header" => "Articles dans la catégorie \"$1\"", // Looxix "Articles in category \"$1\"",
"subcategories" => "Sous-catégories", // Looxix "Subcategories",
@@ -202,7 +218,7 @@ MySQL a renvoyé l'erreur \"<tt>$3: $4</tt>\".",
"nodb" => "Sélection impossible de la base de données $1",
"cachederror" => "Ceci est une copie de la page demandée et peut ne pas être à jour", // Looxix
"readonly" => "Mises à jour bloquées sur la base de données",
-"enterlockreason" => "Indiquez la raison du blocage, ainsi qu'une estimation de la durée de blocage ",
+"enterlockreason" => "Indiquez la raison du blocage, ainsi qu'une estimation de la durée de blocage",
"readonlytext" => "Les ajouts et mises à jour sur la base de données {{SITENAME}} sont actuellement bloqués, probablement pour permettre la maintenance de la base, après quoi, tout rentrera dans l'ordre. Voici la raison pour laquelle l'administrateur a bloqué la base :
<p>$1",
"missingarticle" => "La base de données n'a pas pu trouver le texte d'une page existante, dont le titre est \"$1\".
@@ -237,12 +253,13 @@ Vous pouvez continuer à utiliser {{SITENAME}} de façon anonyme, ou vous reconn
N'oubliez pas de personnaliser votre {{SITENAME}} en consultant la page Préférences.",
"loginpagetitle" => "Votre identifiant",
-"yourname" => "Votre nom d'utilisateur",
-"yourpassword" => "Votre mot de passe",
+"yourname" => "Vòstre nom d'utilizaire",
+"yourpassword" => "Vòstre senhal",
"yourpasswordagain" => "Entrez à nouveau votre mot de passe",
"remembermypassword" => "Se souvenir de mon mot de passe (cookie)",
"loginproblem" => "<b>Problème d'identification.</b><br />Essayez à nouveau !",
"alreadyloggedin" => "<strong>Utilisateur $1, vous êtes déjà identifié !</strong><br />",
+'yourvariant' => 'Varianta lingüistica',
"login" => "Identification",
"userlogin" => "Identification",
@@ -252,7 +269,8 @@ N'oubliez pas de personnaliser votre {{SITENAME}} en consultant la page Préfér
"createaccountmail" => "par courriel", // Looxix "by eMail",
"badretype" => "Les deux mots de passe que vous avez saisis ne sont pas identiques.",
"userexists" => "Le nom d'utilisateur que vous avez saisi est déjà utilisé. Veuillez en choisir un autre.",
-"youremail" => "Mon adresse électronique",
+"yourdomainname" => "Vòstre domeni",
+"youremail" => "Vòstra adreça electronica",
"yournick" => "Mon surnom (pour les signatures)",
"loginerror" => "Problème d'identification",
"noname" => "Vous n'avez pas saisi de nom d'utilisateur.",
@@ -281,11 +299,11 @@ Veuillez vous identifier dès que vous l'aurez reçu.",
"showpreview" => "Prévisualisation",
"blockedtitle" => "Utilisateur bloqué",
"blockedtext" => "Votre compte utilisateur ou votre adresse IP ont été bloqués par $1 pour la raison suivante :<br />$2<p> Vous pouvez contacter l'administrateur pour en discuter.",
-"whitelistedittitle" => "Login requis pour rédiger", // Looxix "Login required to edit",
+'whitelistedittitle' => 'Devètz vos enregistrar per redigir',
"whitelistedittext" => "Vous devez être [[Special:Userlogin|connecté]] pour pouvoir rédiger", // Looxix
"whitelistreadtitle" => "Login requis pour lire", // Looxix "Login required to read",
"whitelistreadtext" => "Vous devez être [[Special:Userlogin|connecté]] pour pouvoir lire les articles", // Looxix
-"whitelistacctitle" => "Vous n'êtes pas autorisé à créer un compte", // Looxix
+'whitelistacctitle' => 'Vos es pas permés de crear un compte',
"whitelistacctext" => "Pour pouvoir créer un compte sur ce Wiki vous devez être [[Special:Userlogin|connecté]] et avoir les permissions appropriées", // Looxix
"accmailtitle" => "Mot de passe envoyé.", // Looxix "Password sent.",
"accmailtext" => "Le mot de passe de '$1' a été envoyé à $2.", // Looxix
@@ -294,8 +312,8 @@ Veuillez vous identifier dès que vous l'aurez reçu.",
"newarticletext" => "Saisissez ici le texte de votre article.",
"anontalkpagetext" => "---- ''Ceci est la page de discussion pour un utilisateur anonyme qui n'a pas encore créé un compte ou qui ne l'utilise pas. Pour cette raison, nous devons utiliser l'[[adresse IP]] numérique pour l'identifier. Une adresse de ce type peut être partagée entre plusieurs utilisateurs. Si vous êtes un utilisateur anonyme et si vous constatez que des commentaires qui ne vous concernent pas vous ont été adressés, vous pouvez [[Special:Userlogin|créer un compte ou vous connecter]] afin d'éviter toute future confusion à l'avenir.",
"noarticletext" => "(Il n'y a pour l'instant aucun texte sur cette page)",
-"updated" => "(Mis à jour)",
-"note" => "<strong>Note :</strong> ",
+"updated" => "(Mes a jorn)",
+"note" => "<strong>Note :</strong>",
"previewnote" => "Attention, ce texte n'est qu'une prévisualisation et n'a pas encore été sauvegardé !",
"previewconflict" => "La prévisualisation montre le texte de cette page tel qu'il apparaîtra une fois sauvegardé.",
"editing" => "modification de $1",
@@ -303,10 +321,10 @@ Veuillez vous identifier dès que vous l'aurez reçu.",
"editconflict" => "Conflit de modification : $1",
"explainconflict" => "<b>Cette page a été sauvegardée après que vous avez commencé à la modifier.
La zone d'édition supérieure contient le texte tel qu'il est enregistré actuellement dans la base de données. Vos modifications apparaissent dans la zone d'édition inférieure. Vous allez devoir apporter vos modifications au texte existant. Seul le texte de la zone supérieure sera sauvegardé.<br />",
-"yourtext" => "Votre texte",
+'yourtext' => 'Vòstre tèxt',
"storedversion" => "Version enregistrée",
"editingold" => "<strong>Attention : vous êtes en train de modifier une version obsolète de cette page. Si vous sauvegardez, toutes les modifications effectuées depuis cette version seront perdues.</strong>",
-"yourdiff" => "Différences",
+"yourdiff" => "Diferéncias",
/*"copyrightwarning" => "Toutes les contributions à {{SITENAME}} sont considérées comme publiées sous les termes de la GNU Free Documentation Licence, une licence de documentation libre (Voir $1 pour plus de détails). Si vous ne désirez pas que vos écrits soient édités et distribués à volonté, ne les envoyez pas. De même, merci de ne contribuer qu'en apportant vos propres écrits ou des écrits issus d'une source libre de droits. <b>N'UTILISEZ PAS DE TRAVAUX SOUS COPYRIGHT SANS AUTORISATION EXPRESSE !</b>",*/
"longpagewarning" => "<strong>AVERTISSEMENT : cette page a une longueur de $1 ko;
quelques navigateurs gèrent mal les pages approchant ou dépassant 32 ko lors de leur rédaction.
@@ -428,7 +446,7 @@ Jetez un coup d'\x{0153}il sur ces pages : [[{{ns:project}}:FAQ|foire aux questi
[[{{ns:project}}:La neutralité de point de vue|la neutralité de point de vue]]),
et [[{{ns:project}}:Les faux-pas les plus courants|les faux-pas les plus courants]].
-Si vous voulez que {{SITENAME}} connaisse le succès, merci de ne pas y inclure pas de matériaux protégés par des [[{{ns:project}}:Copyright|copyrights]]. La responsabilité juridique pourrait en effet compromettre le projet. ",
+Si vous voulez que {{SITENAME}} connaisse le succès, merci de ne pas y inclure pas de matériaux protégés par des [[{{ns:project}}:Copyright|copyrights]]. La responsabilité juridique pourrait en effet compromettre le projet.",
"rcnote" => "Voici les <strong>$1</strong> dernières modifications effectuées au cours des <strong>$2</strong> derniers jours.",
"rcnotefrom" => "Voici les modifications effectuées depuis le <strong>$2</strong> (<b>$1</b> au maximum).",
"rclistfrom" => "Afficher les nouvelles modifications depuis le $1.",
@@ -444,15 +462,15 @@ Si vous voulez que {{SITENAME}} connaisse le succès, merci de ne pas y inclure
# Upload
#
-"upload" => "Copier sur le serveur",
-"uploadbtn" => "Copier un fichier",
+"upload" => 'Copiar sul serveire',
+"uploadbtn" => 'Copiar un fichièr',
"reupload" => "Copier à nouveau",
"reuploaddesc" => "Retour au formulaire.",
-"uploadnologin" => "Non connecté(e)",
+'uploadnologin' => 'Non connectat(ada)',
"uploadnologintext" => "Vous devez être [[Special:Userlogin|connecté]]
pour copier des fichiers sur le serveur.",
-"uploaderror" => "Erreur",
+'uploaderror' => 'Error',
"uploadtext" => "'''STOP !''' Avant de copier votre fichier sur le serveur,
prenez connaissance des [[Project:règles d'utilisation des images|règles d'utilisation des images]] de {{SITENAME}} et assurez-vous que vous les respectez.<br />N'oubliez pas de remplir la [[Project:Page de description d'une image|page de description de l'image]] quand celle-ci sera sur le serveur.
@@ -486,7 +504,7 @@ L'heure indiquée est celle du serveur (UTC).
"filedesc" => "Description",
"copyrightpage" => "{{ns:project}}:Copyright",
"copyrightpagename" => "licence {{SITENAME}}",
-"uploadedfiles" => "Fichiers copiés",
+"uploadedfiles" => 'Fichièrs copiats',
"minlength" => "Les noms des images doivent comporter au moins trois lettres.",
"badfilename" => "L'image a été renommée \"$1\".",
"badfiletype" => "\".$1\" n'est pas un format recommandé pour les fichiers images.",
@@ -553,10 +571,10 @@ Parmi ceux-ci, <b>$2</b> ont le statut d'administrateur (voir $3).",
# Miscellaneous special pages
#
"lonelypages" => "Pages orphelines",
-"unusedimages" => "Images orphelines",
+"unusedimages" => "Imatges orfanèls",
"popularpages" => "Pages les plus consultées",
"nviews" => "$1 consultations",
-"wantedpages" => "Pages les plus demandées",
+"wantedpages" => "Paginas mai demandadas",
"nlinks" => "$1 références",
"allpages" => "Toutes les pages",
"randompage" => "Une page au hasard",
@@ -599,7 +617,7 @@ L'adresse électronique que vous avez indiquée dans vos préférences apparaît
# Watchlist
#
-"watchlist" => "Liste de suivi",
+'watchlist' => 'Lista de seguit',
"nowatchlist" => "Votre liste de suivi ne contient aucun article.",
"watchnologin" => "Non connecté",
"watchnologintext" => "Vous devez être [[Special:Userlogin|connecté]]
@@ -628,7 +646,7 @@ Les prochaines modifications de cette page et de la page discussion associée se
"couldntremove" => "Impossible de retirer l'article '$1'...", // Looxix "Couldn't remove item '$1'...",
"iteminvalidname" => "Problème avec l'article '$1': les nom est invalide...", // Looxix
"wlnote" => "Ci-dessous se trouve les $1 dernières modifications depuis les <b>$2</b> dernières heures.", // Looxix
-
+'wldone' => 'Acabat.',
# Delete/protect/revert
#
@@ -639,7 +657,7 @@ Les prochaines modifications de cette page et de la page discussion associée se
"exblank" => "page vide",
"confirmdelete" => "Confirmer la suppression",
"deletesub" => "(Suppression de \"$1\")",
-"historywarning" => "Attention: La page que vous êtes sur le point de supprimer à un historique: ",
+"historywarning" => "Attention: La page que vous êtes sur le point de supprimer à un historique:",
"confirmdeletetext" => "Vous êtes sur le point de supprimer définitivement de la base de données une page
ou une image, ainsi que toutes ses versions antérieures.
Veuillez confirmer que c'est bien là ce que vous voulez faire, que vous en comprenez les conséquences et que vous faites cela en accord avec les [[{{ns:project}}:Recommandations Et Règles à Suivre|recommandations et règles à suivre]].",
@@ -660,10 +678,10 @@ L'heure indiquée est celle du serveur (UTC).
"rollbacklink" => "révoquer",
"rollbackfailed" => "La révocation a échoué",
"cantrollback" => "Impossible de révoquer: dernier auteur est le seul à avoir modifié cet article",
-"alreadyrolled" => "Impossible de révoquer la dernière modification de [[$1]]
+"alreadyrolled" => "Impossible de révoquer la dernière modification de [[:$1]]
par [[User:$2|$2]] ([[User talk:$2|Talk]]); quelqu'un d'autre à déjà modifer ou révoquer l'article.
-La dernière modificaion était de [[User:$3|$3]] ([[User talk:$3|Talk]]). ", //Looxix
+La dernière modificaion était de [[User:$3|$3]] ([[User talk:$3|Talk]]).", //Looxix
# only shown if there is an edit comment
"editcomment" => "Le résumé de la modification était: \"<i>$1</i>\".", //Looxix
@@ -696,7 +714,7 @@ les révisions restaurées apparaîtront dans l'historique antérieur et la vers
# What links here
#
-"whatlinkshere" => "Pages liées",
+"whatlinkshere" => 'Paginas ligadas',
"notargettitle" => "Pas de cible",
"notargettext" => "Indiquez une page cible ou un utilisateur cible.",
"linklistsub" => "(Liste de liens)",
@@ -794,6 +812,9 @@ sous le nouveau nom. S'il vous plait, fusionnez les manuellement.", // Looxix
'mw_math_modern' => "Per los navigaire modèrn",
'mw_math_mathml' => 'MathML',
+# Other stuff
+
+
);
diff --git a/languages/messages/MessagesOs.php b/languages/messages/MessagesOs.php
index 623a7dbd..a1b24d5c 100644
--- a/languages/messages/MessagesOs.php
+++ b/languages/messages/MessagesOs.php
@@ -144,6 +144,7 @@ $messages = array(
'nstab-user' => "Ðрхайæджы фарÑ",
'otherlanguages' => "Æндæр æвзæгтыл",
'others' => "æндæртæ",
+'pagecategories' => "Категоритæ",
'portal' => "Ðрхайджыты æхÑæнад",
'prevn' => "$1 фæÑтæмæ",
'printableversion' => "Мыхурмæ верÑи",
diff --git a/languages/messages/MessagesPa.php b/languages/messages/MessagesPa.php
index d8f48100..d1b6a434 100644
--- a/languages/messages/MessagesPa.php
+++ b/languages/messages/MessagesPa.php
@@ -89,6 +89,7 @@ $messages = array(
'dec' => 'ਦਸੰਬਰ',
'categories' => 'ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚',
+'pagecategories' => 'ਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚',
'category_header' => 'ਸ਼à©à¨°à©‡à¨£à©€ \'$1\' ਵਾਲੇ ਲੇਖ',
'subcategories' => 'ਉਪਸ਼à©à¨°à©‡à¨£à©€à¨†à¨‚',
@@ -126,7 +127,6 @@ $messages = array(
'anontalk' => 'ਇੱਸ ਆਈ-ਪੀ (IP) ਦੀ ਚਰਚਾ',
'navigation' => 'ਨੈਵੀਗੇਸ਼ੱਨ',
-'currentevents' => '-',
'disclaimers' => 'ਡਿਸਕਲੇਮਰ',
diff --git a/languages/messages/MessagesPl.php b/languages/messages/MessagesPl.php
index 3c401b42..657d6a2d 100644
--- a/languages/messages/MessagesPl.php
+++ b/languages/messages/MessagesPl.php
@@ -154,12 +154,13 @@ $messages = array(
# Bits of text used by many pages:
#
-'categories' => '{{PLURAL:$1|Kategoria|Kategorie}}',
+'categories' => 'Kategorie',
+'pagecategories' => '{{PLURAL:$1|Kategoria|Kategorie}}',
'category_header' => 'Artykuły w kategorii "$1"',
'subcategories' => 'Podkategorie',
'mainpage' => 'Strona główna',
-'mainpagetext' => '<big><b>Instalacja oprogramowania powiodła się.</b></big>',
+'mainpagetext' => "<big>'''Instalacja oprogramowania powiodła się.'''</big>",
'mainpagedocfooter' => 'Zobacz [http://meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika] w celu uzyskania informacji o działaniu oprogramowania wiki.
== Na poczÄ…tek ==
@@ -292,7 +293,7 @@ $messages = array(
'nstab-image' => 'Plik',
'nstab-mediawiki' => 'Komunikat',
'nstab-template' => 'Szablon',
-'nstab-help' => 'Pomoc',
+'nstab-help' => 'Strona pomocy',
'nstab-category' => 'Kategoria',
# Main script and global functions
@@ -359,7 +360,7 @@ dla których jest to robione - zobacz [[{{ns:Project}}:Strona_zabezpieczona]].
Tekst źródłowy strony można w dalszym ciągu podejrzeć i skopiować.',
'protectedinterface' => 'Ta strona dostarcza tekst interfejsu do oprogramowania i została zablokowana możliwość jej edycji.',
-'editinginterface' => '<b>Ostrzeżenie:</b> Edytujesz stronę, która jest użyta w celu dostarczenia tekstu interfejsu do oprogramowania. Zmiany na tej stronie zmienią wygląd interfejsu użytkownika dla innych użytkowników.',
+'editinginterface' => "'''Ostrzeżenie:''' Edytujesz stronę, która jest użyta w celu dostarczenia tekstu interfejsu do oprogramowania. Zmiany na tej stronie zmienią wygląd interfejsu użytkownika dla innych użytkowników.",
'sqlhidden' => '(ukryto zapytanie SQL)',
# Login and logout pages
@@ -375,7 +376,7 @@ Właśnie utworzyliśmy dla Ciebie konto. Nie zapomnij dostosować [[{{ns:Specia
'yourname' => 'Login',
'yourpassword' => 'Hasło',
'yourpasswordagain' => 'Powtórz hasło',
-'remembermypassword' => 'Zapamiętaj hasło',
+'remembermypassword' => 'Zapamiętaj moje hasło na tym komputerze',
'yourdomainname' => 'Twoja domena',
'externaldberror' => 'Wystąpił błąd zewnętrznej bazy autentyfikacyjnej lub nie posiadasz uprawnień koniecznych do aktualizacji zewnętrznego konta.',
'loginproblem' => '<b>Wystąpił problem przy próbie zalogowania się.</b><br />Spróbuj ponownie!',
@@ -473,15 +474,16 @@ Nim jakiekolwiek wiadomości zostaną wysłane na ten adres, należy wypełnić
'showlivepreview' => 'Dynamiczny podglÄ…d',
'showdiff' => 'PodglÄ…d zmian',
'anoneditwarning' => 'Nie jesteś zalogowany. Twój adres IP będzie zapisany w historii edycji strony.',
-'missingsummary' => '<b>Przypomnienie:</b> Nie wprowadziłeś opisu zmian. Jeżeli nie chcesz go wprowadzać naciśnij przycisk "Zapisz" jeszcze raz.',
+'missingsummary' => "'''Przypomnienie:''' Nie wprowadziłeś opisu zmian. Jeżeli nie chcesz go wprowadzać naciśnij przycisk \"Zapisz\" jeszcze raz.",
'missingcommenttext' => 'Wprowadź komentarz poniżej.',
'blockedtitle' => 'Użytkownik jest zablokowany',
-'blockedtext' => 'Twoje konto lub adres IP zostały zablokowane przez $1.
-Podany powód to:<br /><i>$2</i>
+'blockedtext' => "'''Twoje konto lub adres IP zostały zablokowane.'''
+
+Blokada została nałożona przez $1. Podany powód to: ''$2''.
W celu wyjaśnienia sprawy zablokowania możesz się skontaktować z $1 lub innym [[{{ns:Project}}:Administratorzy|administratorem]].
-Twój adres IP to $3.',
+Twój adres IP to $3.",
'whitelistedittitle' => 'Przed edycją musisz się zalogować',
'whitelistedittext' => 'Musisz $1 żeby móc edytować artykuły.',
'whitelistreadtitle' => 'Przed przeczytaniem musisz się zalogować',
@@ -496,14 +498,14 @@ Twój adres IP to $3.',
'accmailtitle' => 'Hasło wysłane.',
'accmailtext' => 'Hasło dla użytkownika "$1" zostało wysłane pod adres $2.',
'newarticle' => '(Nowy)',
-'newarticletext' => 'Nie ma jeszcze artykułu o tym tytule. W poniższym polu można wpisać pierwszy jego fragment. Jeśli nie to było Twoim zamiarem, wciśnij po prostu <i>Wstecz</i>.',
-'anontalkpagetext' => '---- <i>To jest strona dyskusyjna dla użytkowników anonimowych - takich, którzy nie mają jeszcze swojego konta lub nie chcą go w tej chwili używać. By ich identyfikować używamy numerów IP. Jeśli jesteś anonimowym użytkownikiem i wydaje Ci się, że zamieszczone tu komentarze nie są skierowane do Ciebie, [[{{ns:Special}}:Userlogin|utwórz proszę konto albo zaloguj się]] - dzięki temu unikniesz w przyszłości podobnych nieporozumień.</i>',
+'newarticletext' => "Nie ma jeszcze artykułu o tym tytule. W poniższym polu można wpisać pierwszy jego fragment. Jeśli nie to było Twoim zamiarem, wciśnij po prostu ''Wstecz''.",
+'anontalkpagetext' => "---- ''To jest strona dyskusyjna dla użytkowników anonimowych - takich, którzy nie mają jeszcze swojego konta lub nie chcą go w tej chwili używać. By ich identyfikować używamy numerów IP. Jeśli jesteś anonimowym użytkownikiem i wydaje Ci się, że zamieszczone tu komentarze nie są skierowane do Ciebie, [[{{ns:Special}}:Userlogin|utwórz proszę konto albo zaloguj się]] - dzięki temu unikniesz w przyszłości podobnych nieporozumień.''",
'noarticletext' => 'Nie ma jeszcze artykułu o tym tytule. Możesz [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} utworzyć artykuł {{FULLPAGENAME}}] lub [[{{ns:Special}}:Search/{{FULLPAGENAME}}|poszukać {{FULLPAGENAME}} w innych artykułach]].',
-'clearyourcache' => '<b>Uwaga:</b> po zapisaniu zmian musisz zaktualizować pamięć podręczną (cache) przeglądarki: <b>Mozilla / Firefox:</b> kliknij <i>Reload</i> (lub <i>Ctrl-R</i>), <b>IE / Opera:</b> <i>Ctrl-F5</i>, <b>Safari:</b> <i>Cmd-R</i>, <b>Konqueror</b> <i>Ctrl-R</i>.',
+'clearyourcache' => "'''Uwaga:''' po zapisaniu zmian musisz zaktualizować pamięć podręczną (cache) przeglądarki: '''Mozilla / Firefox:''' kliknij ''Reload'' (lub ''Ctrl-R''), '''IE / Opera:''' ''Ctrl-F5'', '''Safari:''' ''Cmd-R'', '''Konqueror''' ''Ctrl-R''.",
'usercssjsyoucanpreview' => '<strong>Wskazówka:</strong> Użyj przycisku "Podgląd", aby przetestować Twój nowy arkusz stylów CSS lub kod JavaScript przed jego zapisaniem.',
-'usercsspreview' => '<b>Pamiętaj, że to na razie tylko podgląd Twojego arkusza stylów - nic jeszcze nie zostało zapisane!</b>',
-'userjspreview' => '<b>Pamiętaj, że to na razie tylko podgląd Twojego JavaScriptu - nic jeszcze nie zostało zapisane!</b>',
-'userinvalidcssjstitle' => '<b>Uwaga:</b> Nie ma skórki o nazwie "$1". Pamiętaj, że strony użytkownika zawierające CSS i JavaScript powinny zaczynać się małą literą, np. User:Foo/monobook.css.',
+'usercsspreview' => "'''Pamiętaj, że to na razie tylko podgląd Twojego arkusza stylów - nic jeszcze nie zostało zapisane!'''",
+'userjspreview' => "'''Pamiętaj, że to na razie tylko podgląd Twojego JavaScriptu - nic jeszcze nie zostało zapisane!'''",
+'userinvalidcssjstitle' => "'''Uwaga:''' Nie ma skórki o nazwie \"$1\". Pamiętaj, że strony użytkownika zawierające CSS i JavaScript powinny zaczynać się małą literą, np. User:Foo/monobook.css.",
'updated' => '(Zmodyfikowano)',
'note' => '<strong>Uwaga:</strong>',
'previewnote' => '<strong>To jest tylko podgląd - artykuł nie został jeszcze zapisany!</strong>',
@@ -525,9 +527,9 @@ By wprowadzić swoje zmiany musisz zmodyfikować tekst z górnego pola.
'nonunicodebrowser' => "<strong>Uwaga! Twoja przeglądarka nie umie poprawnie rozpoznawać kodowania UTF-8 (Unicode). Z tego powodu wszystkie znaki, których Twoja przeglądarka nie jest w stanie rozpoznać, zostały zastąpione ich kodami heksadecymalnymi.</strong>",
'editingold' => "<strong>Ostrzeżenie: Edytujesz inną niż bieżąca wersję tej strony. Jeśli zapiszesz ją wszystkie późniejsze zmiany zostaną skasowane.</strong>",
'yourdiff' => 'Różnice',
-'copyrightwarning' => 'Proszę pamiętać o tym, że wszelki wkład do serwisu {{SITENAME}} jest udostępniany na zasadach $2 (szczegóły w $1). Jeśli nie chcesz, żeby Twój tekst był dowolnie zmieniany przez każdego i rozpowszechniany bez ograniczeń, nie umieszczaj go tutaj.<br />
-Niniejszym jednocześnie oświadczasz, że ten tekst jest Twoim dziełem lub pochodzi z materiałów dostępnych na zasadach <i>public domain</i> albo kompatybilnych.
-<br /><strong>PROSZĘ NIE UÅ»YWAĆ BEZ POZWOLENIA MATERIAÅÓW OBJĘTYCH PRAWEM AUTORSKIM!</strong>',
+'copyrightwarning' => "Proszę pamiętać o tym, że wszelki wkład do serwisu {{SITENAME}} jest udostępniany na zasadach $2 (szczegóły w $1). Jeśli nie chcesz, żeby Twój tekst był dowolnie zmieniany przez każdego i rozpowszechniany bez ograniczeń, nie umieszczaj go tutaj.<br />
+Niniejszym jednocześnie oświadczasz, że ten tekst jest Twoim dziełem lub pochodzi z materiałów dostępnych na zasadach ''public domain'' albo kompatybilnych.
+<br /><strong>PROSZĘ NIE UÅ»YWAĆ BEZ POZWOLENIA MATERIAÅÓW OBJĘTYCH PRAWEM AUTORSKIM!</strong>",
'longpagewarning' => '<strong>Uwaga: Ta strona ma $1 kilobajt-y/-ów; w przypadku niektórych przeglądarek mogą wystąpić problemy w edycji stron mających więcej niż 32 kilobajty. Jeśli to możliwe, spróbuj podzielić tekst na mniejsze części.</strong>',
'longpageerror' => '<strong>Błąd: Przesłany przez Ciebie tekst ma $1 kilobajtów. Maksymalna długość tekstu nie może przekraczać $2 kilobajtów. Twój tekst nie zostanie zapisany.</strong>',
'readonlywarning' => '<strong>Uwaga: Baza danych została chwilowo zablokowana do celów administracyjnych. Nie można więc na razie zapisać nowej wersji artykułu. Proponujemy przenieść jej tekst do prywatnego pliku (wytnij/wklej) i zachować na później.</strong>',
@@ -550,7 +552,7 @@ Niniejszym jednocześnie oświadczasz, że ten tekst jest Twoim dziełem lub poc
'loadhist' => 'Pobieranie historii tej strony',
'currentrev' => 'Aktualna wersja',
'revisionasof' => 'Wersja z dnia $1',
-'old-revision-navigation' => 'Wersja z dnia $1; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'Wersja z dnia $1; $2',
'previousrevision' => '↠Poprzednia wersja',
'nextrevision' => 'Następna wersja →',
'currentrevisionlink' => 'Aktualna wersja',
@@ -606,11 +608,11 @@ liczba znalezionych artykułów: $3.',
'viewprevnext' => 'Zobacz ($1) ($2) ($3).',
'showingresults' => 'Oto lista <b>$1</b> pozycji, poczynajÄ…c od numeru <b>$2</b>.',
'showingresultsnum' => 'Oto lista <b>$3</b> pozycji, poczynajÄ…c od numeru <b>$2</b>.',
-'nonefound' => '<b>Uwaga</b>: brak rezultatów wyszukiwania spowodowany jest bardzo często szukaniem najpopularniejszych słów, takich jak "jest" czy "nie", które nie są indeksowane, albo z powodu podania w zapytaniu więcej niż jednego słowa (na liście odnalezionych stron znajdą się tylko te, które zawierają wszystkie podane słowa).',
+'nonefound' => "'''Uwaga''': brak rezultatów wyszukiwania spowodowany jest bardzo często szukaniem najpopularniejszych słów, takich jak \"jest\" czy \"nie\", które nie są indeksowane, albo z powodu podania w zapytaniu więcej niż jednego słowa (na liście odnalezionych stron znajdą się tylko te, które zawierają wszystkie podane słowa).",
'powersearch' => 'Szukaj',
'powersearchtext' => "Szukaj w przestrzeniach nazw:<br />$1<br />$2 Pokaż przekierowania<br />Szukany tekst $3 $9",
'searchdisabled' => 'Wyszukiwanie w serwisie {{SITENAME}} zostało wyłączone. W międzyczasie możesz skorzystać z wyszukiwania Google.',
-'blanknamespace' => '(Główna)',
+'blanknamespace' => '(główna)',
# Preferences page
#
@@ -774,7 +776,7 @@ liczba znalezionych artykułów: $3.',
# Image list
#
'imagelist' => 'Lista plików',
-'imagelisttext' => 'To jest lista <b>$1</b> plików posortowanych $2.',
+'imagelisttext' => "To jest lista '''$1''' plików posortowanych $2.",
'imagelistforuser' => 'Lista grafik załadowanych przez $1.',
'getimagelist' => 'pobieranie listy plików',
'ilsubmit' => 'Szukaj',
@@ -833,16 +835,16 @@ liczba znalezionych artykułów: $3.',
'statistics' => 'Statystyka',
'sitestats' => 'Statystyka artykułów',
'userstats' => 'Statystyka użytkowników',
-'sitestatstext' => 'W bazie danych jest w sumie <b>$1</b> stron.
+'sitestatstext' => "W bazie danych jest w sumie '''$1''' stron.
-Ta liczba uwzględnia strony dyskusji, strony na temat serwisu {{SITENAME}}, strony prowizorycznych ("stub"), strony przekierowujące, oraz inne, które trudno uznać za artykuły. Wyłączając powyższe, jest prawdopodobnie <b>$2</b> stron, które można uznać za artykuły.
+Ta liczba uwzględnia strony dyskusji, strony na temat serwisu {{SITENAME}}, strony prowizorycznych (\"stub\"), strony przekierowujące oraz inne, które trudno uznać za artykuły. Wyłączając powyższe, jest prawdopodobnie '''$2''' stron, które można uznać za artykuły.
-Ilość przesłanych plików: <b>$8</b>
+Ilość przesłanych plików: '''$8'''.
-Użytkownicy od startu serwisu wykonali <b>$4</b> edycji, średnio <b>$5</b> edycji na stronę. W sumie było <b>$3</b> odwiedzin, średnio <b>$6</b> odwiedzin na edycję.
+Użytkownicy od startu serwisu wykonali '''$4''' edycji, średnio '''$5''' edycji na stronę. W sumie było '''$3''' odwiedzin, średnio '''$6''' odwiedzin na edycję.
-Długość [http://meta.wikimedia.org/wiki/Help:Job_queue kolejki zadań] wynosi <b>$7</b>.',
-'userstatstext' => 'Jest <b>$1</b> zarejestrowanych użytkowników. Spośród nich <b>$2</b> (czyli <b>$4%</b>) ma status $5.',
+Długość [http://meta.wikimedia.org/wiki/Help:Job_queue kolejki zadań] wynosi '''$7'''.",
+'userstatstext' => "Jest '''$1''' zarejestrowanych użytkowników. Spośród nich '''$2''' (czyli '''$4%''') ma status $5.",
'statistics-mostpopular' => 'Najczęściej odwiedzane strony',
'disambiguations' => 'Strony ujednoznaczniajÄ…ce',
@@ -885,6 +887,7 @@ Długość [http://meta.wikimedia.org/wiki/Help:Job_queue kolejki zadań] wynosi
'shortpages' => 'Najkrótsze strony',
'longpages' => 'Najdłuższe strony',
'deadendpages' => 'Strony bez linków',
+'deadendpagestext' => 'Poniższe strony nie posiadają odnośników do innych stron znajdujących się w tej wiki.',
'listusers' => 'Lista użytkowników',
'specialpages' => 'Strony specjalne',
'spheading' => 'Strony specjalne dla wszystkich użytkowników',
@@ -950,20 +953,20 @@ Długość [http://meta.wikimedia.org/wiki/Help:Job_queue kolejki zadań] wynosi
# Watchlist
#
'watchlist' => 'Obserwowane',
-'watchlistfor' => '(dla użytkownika <b>$1</b>)',
+'watchlistfor' => "(dla użytkownika '''$1''')",
'nowatchlist' => 'Nie ma żadnych pozycji na liście obserwowanych przez Ciebie stron.',
'watchlistanontext' => '$1 aby obejrzeć lub edytować elementy listy obserwowanych.',
-'watchlistcount' => '<b>Masz $1 stron na liście obserwowanych, włączając strony dyskusji.</b>',
-'clearwatchlist' => 'Wyczyść obserwowane',
+'watchlistcount' => "'''Masz $1 {{PLURAL:$1|$1 pozycję|$1 pozycji}} na liście obserwowanych stron, włączając strony dyskusji.'''",
+'clearwatchlist' => 'Wyczyść listę obserwowanych',
'watchlistcleartext' => 'Czy jesteś pewien, że chcesz je usunąć?',
'watchlistclearbutton' => 'Wyczyść obserwowane',
'watchlistcleardone' => 'Twoja lista stron obserwowanych została wyczyszczona. Liczba usuniętych obiektów: $1.',
'watchnologin' => 'Brak logowania',
'watchnologintext' => 'Musisz się [[{{ns:Special}}:Userlogin|zalogować]] przed modyfikacją listy obserwowanych artykułów.',
'addedwatch' => 'Dodana do listy obserwowanych',
-'addedwatchtext' => 'Strona "<b>[[:$1|$1]]</b>" została dodana do Twojej [[{{ns:Special}}:Watchlist|listy obserwowanych]]. Na tej liście znajdzie się rejestr przyszłych zmian tej strony i związanej z nią strony Dyskusji, a nazwa samej strony zostanie <b>wytłuszczona</b> na [[{{ns:Special}}:Recentchanges|liście ostatnich zmian]], aby łatwiej było Ci sam fakt zmiany zauważyć.
+'addedwatchtext' => "Strona \"[[:$1|$1]]\" została dodana do Twojej [[{{ns:Special}}:Watchlist|listy obserwowanych]]. Na tej liście znajdzie się rejestr przyszłych zmian tej strony i związanej z nią strony dyskusji, a nazwa samej strony zostanie '''wytłuszczona''' na [[{{ns:Special}}:Recentchanges|liście ostatnich zmian]], aby łatwiej było Ci sam fakt zmiany zauważyć.
-Jeśli chcesz usunąć stronę ze swojej listy obserwowanych, kliknij na "Przestań obserwować".',
+Jeśli chcesz usunąć stronę ze swojej listy obserwowanych, kliknij na \"Przestań obserwować\".",
'removedwatch' => 'Usunięto z listy obserwowanych',
'removedwatchtext' => 'Strona "[[:$1]]" została usunięta z Twojej listy obserwowanych.',
'watch' => 'Obserwuj',
@@ -972,16 +975,16 @@ Jeśli chcesz usunąć stronę ze swojej listy obserwowanych, kliknij na "Przest
'unwatchthispage' => 'Przestań obserwować',
'notanarticle' => 'To nie artykuł',
'watchnochange' => 'Żadna z obserwowanych stron nie była edytowana w podanym okresie.',
-'watchdetails' => '* liczba obserwowanych przez Ciebie stron: $1, nie liczÄ…c stron dyskusji;
+'watchdetails' => '* Liczba obserwowanych przez Ciebie stron: $1, nie liczÄ…c stron dyskusji.
* [[{{ns:Special}}:Watchlist/edit|Pokaż i edytuj pełną listę]]
-* [[{{ns:Special}}:Watchlist/clear|Usuń wszystkie strony]]',
+* [[{{ns:Special}}:Watchlist/clear|Wyczyść listę obserwowanych]]',
'wlheader-enotif' => '* Wysyłanie powiadomień na adres e-mail jest włączone.',
-'wlheader-showupdated' => '* Strony które zostały zmienione od twojej ostatniej wizyty na nich zostały <b>pogrubione</b>',
+'wlheader-showupdated' => "* Strony które zostały zmienione od twojej ostatniej wizyty na nich zostały '''pogrubione'''",
'watchmethod-recent'=> 'poszukiwanie ostatnich zmian wśród obserwowanych stron',
'watchmethod-list' => 'poszukiwanie obserwowanych stron wśród ostatnich zmian',
'removechecked' => 'Usuń zaznaczone pozycje z listy obserwowanych',
'watchlistcontains' => 'Lista obserwowanych przez Ciebie stron zawiera $1 pozycji.',
-'watcheditlist' => 'Oto alfabetyczna lista obserwowanych stron. Zaznacz, które z nich chcesz usunąć z listy i kliknij przycisk <i>Usuń...</i> znajdujący się na dole strony.',
+'watcheditlist' => "Oto alfabetyczna lista obserwowanych stron. Zaznacz, które z nich chcesz usunąć z listy i kliknij przycisk ''Usuń zaznaczone pozycje z listy obserwowanych'' znajdujący się na dole strony.",
'removingchecked' => 'Usuwamy zaznaczone pozycje z listy obserwowanych...',
'couldntremove' => 'Nie można było usunąć pozycji "$1"...',
'iteminvalidname' => 'Problem z pozycjÄ… "$1", niepoprawna nazwa...',
@@ -1083,8 +1086,8 @@ Naciśnij "wstecz", przeładuj stronę, po czym ponownie wydaj polecenie.',
'undelete' => 'Odtwórz skasowaną stronę',
'undeletepage' => 'Odtwarzanie skasowanych stron',
'viewdeletedpage' => 'Zobacz skasowane wersje',
-'undeletepagetext' => 'Poniższe strony zostały skasowane, ale ich kopia wciąż znajduje się w archiwum.<br /><b>Uwaga:</b> archiwum co jakiś czas także jest kasowane!',
-'undeleteextrahelp' => 'Aby odtworzyć całą stronę, pozostaw wszystkie pola niezaznaczone i kliknij <b>Odtwórz</b>. Aby wybrać częściowe odtworzenie należy zaznaczyć odpowiednie pole. Naciśnięcie <b>Wyczyść</b> wyczyści wszystkie pola, łącznie z opisem komentarza.',
+'undeletepagetext' => 'Poniższe strony zostały skasowane, ale ich kopia wciąż znajduje się w archiwum. Archiwum co jakiś czas także jest kasowane.',
+'undeleteextrahelp' => "Aby odtworzyć całą stronę, pozostaw wszystkie pola niezaznaczone i kliknij '''Odtwórz'''. Aby wybrać częściowe odtworzenie należy zaznaczyć odpowiednie pole. Naciśnięcie '''Wyczyść''' wyczyści wszystkie pola, łącznie z opisem komentarza.",
'undeletearticle' => 'Odtwórz skasowaną stronę',
'undeleterevisions' => 'Liczba zarchiwizowanych wersji: $1',
'undeletehistory' => 'Odtworzenie strony spowoduje przywrócenie także jej wszystkich poprzednich wersji. Jeśli od czasu skasowania ktoś utworzył nową stronę o tej nazwie, odtwarzane wersje znajdą się w jej historii, a obecna wersja pozostanie bez zmian.',
@@ -1167,7 +1170,7 @@ Zobacz [[{{ns:Special}}:Log/delete]], jeśli chcesz przejrzeć rejestr ostatnio
'blocklink' => 'zablokuj',
'unblocklink' => 'odblokuj',
'contribslink' => 'wkład',
-'autoblocker' => 'Zablokowano Cię automatycznie ponieważ używasz tego samego adresu IP co użytkownik "[[{{ns:user}}:$1|$1]]". Powód: "<b>$2</b>".',
+'autoblocker' => 'Zablokowano Cię automatycznie ponieważ używasz tego samego adresu IP co użytkownik "[[{{ns:user}}:$1|$1]]". Powód: "\'\'\'$2\'\'\'".',
'blocklogpage' => 'Zablokowani',
'blocklogentry' => 'zablokowano "[[$1]]", czas blokady: $2',
'blocklogtext' => 'Poniżej znajduje się lista blokad założonych i zdjętych z poszczególnych adresów IP. Na liście nie znajdą się adresy IP, które zablokowano w sposób automatyczny. By przejrzeć listę obecnie aktywnych blokad, przejdź na stronę [[{{ns:Special}}:Ipblocklist|Zablokowane adresy IP]].',
@@ -1222,21 +1225,21 @@ Zobacz [[{{ns:Special}}:Log/delete]], jeśli chcesz przejrzeć rejestr ostatnio
# Move page
#
'movepage' => 'PrzenieÅ› stronÄ™',
-'movepagetext' => 'Za pomocą poniższego formularza zmienisz nazwę strony, przenosząc jednocześnie jej historię.
+'movepagetext' => "Za pomocą poniższego formularza zmienisz nazwę strony, przenosząc jednocześnie jej historię.
Pod starym tytułem zostanie umieszczona strona przekierowująca. Linki do starego tytułu pozostaną niezmienione.
Upewnij się, że uwzględniasz podwójne lub zerwane przekierowania. Odpowiadasz za to, żeby linki odnosiły się do właściwych artykułów!
-Strona <b>nie</b> będzie przeniesiona jeśli:
+Strona '''nie''' będzie przeniesiona jeśli:
*jest pusta i nigdy nie była edytowana
*jest stronÄ… przekierowujÄ…cÄ…
*strona o nowej nazwie już istnieje
-<b>UWAGA!</b>
-Może to być drastyczna lub nieprzewidywalna zmiana w przypadku popularnych stron; upewnij się co do konsekwencji tej operacji zanim się na nią zdecydujesz.',
-'movepagetalktext' => 'Odpowiednia strona dyskusji, jeśli istnieje, będzie przeniesiona automatycznie, pod warunkiem, że:
+'''UWAGA!'''
+Może to być drastyczna lub nieprzewidywalna zmiana w przypadku popularnych stron; upewnij się co do konsekwencji tej operacji zanim się na nią zdecydujesz.",
+'movepagetalktext' => "Odpowiednia strona dyskusji, jeśli istnieje, będzie przeniesiona automatycznie, pod warunkiem, że:
*nie przenosisz strony do innej przestrzeni nazw
*nie istnieje strona dyskusji o nowej nazwie
-W takich przypadkach tekst dyskusji trzeba przenieść, i ewentualnie połączyć z istniejącym, ręcznie. Możesz też zrezygnować z przeniesienia dyskusji (poniższy <i>checkbox</i>).',
+W takich przypadkach tekst dyskusji trzeba przenieść, i ewentualnie połączyć z istniejącym, ręcznie. Możesz też zrezygnować z przeniesienia dyskusji (poniższy ''checkbox'').",
'movearticle' => 'PrzenieÅ› stronÄ™',
'movenologin' => 'Brak logowania',
'movenologintext' => 'Musisz być zarejestrowanym i [[{{ns:Special}}:Userlogin|zalogowanym]] użytkownikiem aby móc przenieść stronę.',
@@ -1248,8 +1251,8 @@ W takich przypadkach tekst dyskusji trzeba przenieść, i ewentualnie poÅ‚Ä…czyÄ
'talkexists' => 'Strona artykułu została przeniesiona, natomiast strona dyskusji nie - strona dyskusji o nowym tytule już istnieje. Połącz, proszę, teksty obu dyskusji ręcznie.',
'movedto' => 'przeniesiono do',
'movetalk' => 'Przenieś także stronę dyskusji, jeśli to możliwe.',
-'talkpagemoved' => 'Odpowiednia strona z <i>Dyskusją</i> także została przeniesiona.',
-'talkpagenotmoved' => 'Odpowiednia strona z <i>Dyskusją</i> <strong>nie</strong> została przeniesiona.',
+'talkpagemoved' => 'Odpowiednia strona dyskusji także została przeniesiona.',
+'talkpagenotmoved' => 'Odpowiednia strona dyskusji <strong>nie</strong> została przeniesiona.',
'1movedto2' => '[[$1]] przeniesiono do [[$2]]',
'1movedto2_redir' => '[[$1]] przeniesiono do [[$2]] nad przekierowaniem',
'movelogpage' => 'Przeniesione',
@@ -1274,8 +1277,8 @@ Artykuł docelowy "[[:$1|$1]]" już istnieje. Czy chcesz go usunąć, by zrobić
Można również użyć łącza, np. [[{{ns:Special}}:Export/{{Mediawiki:mainpage}}]] dla strony {{Mediawiki:mainpage}}.',
'exportcuronly' => 'Tylko bieżąca wersja, bez historii',
-'exportnohistory' => '----
-<b>Uwaga:</b> możliwość eksportowania pełnej historii stron została wyłączona.',
+'exportnohistory' => "----
+'''Uwaga:''' możliwość eksportowania pełnej historii stron została wyłączona.",
'export-submit' => 'Eksportuj',
# Namespace 8 related
@@ -1286,7 +1289,7 @@ Można również użyć łącza, np. [[{{ns:Special}}:Export/{{Mediawiki:mainpag
'allmessagescurrent' => 'Tekst obecny',
'allmessagestext' => 'Oto lista wszystkich komunikatów dostępnych w przestrzeni nazw MediaWiki:',
'allmessagesnotsupportedUI' => 'Wybrany przez Ciebie język interfejsu <b>$1</b> nie jest wspierany przez stronę Special:Allmessages.',
-'allmessagesnotsupportedDB' => 'Strona <b>Special:Allmessages</b> nie może być użyta, ponieważ <b>$wgUseDatabaseMessages</b> jest wyłączone.',
+'allmessagesnotsupportedDB' => 'Strona \'\'\'Special:Allmessages\'\'\' nie może być użyta, ponieważ \'\'\'$wgUseDatabaseMessages\'\'\' jest wyłączone.',
'allmessagesfilter' => 'Filtr nazw komunikatów:',
'allmessagesmodified' => 'Pokaż tylko zmodyfikowane',
@@ -1334,8 +1337,8 @@ Można również użyć łącza, np. [[{{ns:Special}}:Export/{{Mediawiki:mainpag
'tooltip-watch' => 'Dodaj tÄ™ stronÄ™ do listy obserwowanych [alt-w]',
# stylesheets
-'Common.css' => '/* Kod CSS umieszczony tutaj zostanie zastosowany we wszystkich skórkach */',
-'Monobook.css' => '/* Kod CSS umieszczony tutaj wpłynie na wygląd skórki Monobook */',
+'common.css' => '/* Kod CSS umieszczony tutaj zostanie zastosowany we wszystkich skórkach */',
+'monobook.css' => '/* Kod CSS umieszczony tutaj wpłynie na wygląd skórki Monobook */',
'notacceptable' => 'Serwer wiki nie jest w stanie dostarczyć danych, które Twoja przeglądarka będzie w stanie odczytać.',
@@ -1388,7 +1391,7 @@ Można również użyć łącza, np. [[{{ns:Special}}:Export/{{Mediawiki:mainpag
'markedaspatrollederrortext' => 'Musisz wybrać wersję żeby oznaczyć ją jako "sprawdzoną".',
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '
+'monobook.js' => '
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Moja osobista strona\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Strona użytkownika numeru IP spod którego edytujesz\');
@@ -1399,7 +1402,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Lista stron obserwowanych\');
ta[\'pt-mycontris\'] = new Array(\'y\',\'Lista moich edycji\');
ta[\'pt-login\'] = new Array(\'o\',\'Zachęcamy do zalogowania się, choć nie jest to obowiązkowe.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Zachęcamy do zalogowania się, choć nie jest to obowiązkowe\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Wylogowanie\');
+ta[\'pt-logout\'] = new Array(\'\',\'Wylogowanie\');
ta[\'ca-talk\'] = new Array(\'t\',\'Dyskusja o zawartości tej strony.\');
ta[\'ca-edit\'] = new Array(\'e\',\'Możesz edytować tę stronę. Przed zapisaniem zmian użyj przycisku podgląd.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Dodaj swój komentarz do dyskusji\');
@@ -1462,7 +1465,7 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'Zobacz stronÄ™ kategorii\');',
'passwordtooshort' => 'Twoje hasło jest za krótkie. Musi mieć co najmniej $1 znaków.',
# Media Warning
-'mediawarning' => '<b>Uwaga:</b> Ten plik może zawierać złośliwy kod, otwierając go możesz zarazić swój system.<hr />',
+'mediawarning' => "'''Uwaga:''' Ten plik może zawierać złośliwy kod, otwierając go możesz zarazić swój system.<hr />",
'fileinfo' => '$1KB, typ MIME: <code>$2</code>',
@@ -1705,7 +1708,9 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'Zobacz stronÄ™ kategorii\');',
'confirmemail_text' => 'Wymagane jest potwierdzenie adresu e-mail przed użyciem funkcji pocztowych. Wciśnij przycisk poniżej aby wysłać na swój adres list uwierzytelniający. W liście znajdziesz link zawierający kod: załaduj go do przeglądarki aby potwierdzić swój adres.',
'confirmemail_send' => 'Wyślij kod potwierdzenia',
'confirmemail_sent' => 'E-mail uwierzytelniający został wysłany.',
-'confirmemail_sendfailed' => 'Nie udało się wsłać maila potwierdzającego. Proszę sprawdzić adres.',
+'confirmemail_sendfailed' => 'Nie udało się wsłać maila potwierdzającego. Proszę sprawdzić adres.
+
+Program zwrócił komunikat: $1',
'confirmemail_invalid' => 'Błędny kod potwierdzenia. Kod może być przedawniony.',
'confirmemail_needlogin' => 'Musisz $1 aby potwierdzić adres email.',
'confirmemail_success' => 'Adres e-mail został zatwierdzony. Możesz się zalogować i cieszyć możliwościami wiki.',
@@ -1745,9 +1750,9 @@ $1
# delete conflict
'deletedwhileediting' => 'Uwaga: Ta strona została usunięta po tym, jak rozpoczęłeś jej edycję!',
-'confirmrecreate' => 'Użytkownik [[{{ns:user}}:$1|$1]] ([[{{ns:user_talk}}:$1|dyskusja]]) usunął tę stronę po tym jak rozpocząłeś jego edycję, podając jako powód usunięcia:
-: <b>$2</b>
-Potwierdź chęć odtworzenia tej strony.',
+'confirmrecreate' => "Użytkownik [[{{ns:user}}:$1|$1]] ([[{{ns:user_talk}}:$1|dyskusja]]) usunął tę stronę po tym jak rozpocząłeś jego edycję, podając jako powód usunięcia:
+: '''$2'''
+Potwierdź chęć odtworzenia tej strony.",
'recreate' => 'Odtwórz',
'tooltip-recreate' => 'Odtworzono stronę pomimo jej wcześniejszego usunięcia.',
@@ -1761,9 +1766,9 @@ $1',
'confirm_purge_button' => 'Wyczyść',
'youhavenewmessagesmulti' => 'Masz nowe wiadomości: $1',
-'searchcontaining' => 'Szukaj artykułów zawierających <i>$1</i>.',
-'searchnamed' => 'Szukaj artykułów nazywających się <i>$1</i>.',
-'articletitles' => 'Artykuły zaczynające się od <i>$1</i>',
+'searchcontaining' => "Szukaj artykułów zawierających ''$1''.",
+'searchnamed' => "Szukaj artykułów nazywających się ''$1''.",
+'articletitles' => "Artykuły zaczynające się od ''$1''.",
'hideresults' => 'Ukryj wyniki',
# DISPLAYTITLE
diff --git a/languages/messages/MessagesPms.php b/languages/messages/MessagesPms.php
index 874196c0..dfd516d4 100644
--- a/languages/messages/MessagesPms.php
+++ b/languages/messages/MessagesPms.php
@@ -106,12 +106,13 @@ dj\'artìcol ancó pa scrit',
'oct' => 'Oto',
'nov' => 'Nov',
'dec' => 'Dze',
-'categories' => '{{PLURAL:$1|Categorìa|Categorìe}}',
+'categories' => 'Categorìe',
+'pagecategories' => '{{PLURAL:$1|Categorìa|Categorìe}}',
'category_header' => 'Artìcoj ant la categorìa "$1"',
'subcategories' => 'Sotacategorìe',
'mainpage' => 'Intrada',
'mainpagetext' => '<big>\'\'\'MediaWiki a l\'é staita anstalà a la perfession.\'\'\'</big>',
-'mainpagedocfooter' => 'Che a varda la [http://meta.wikipedia.org/wiki/MediaWiki_User%27s_Guide User\'s Guide] ([[belavans]] për adess a-i é mach n\'anglèis) për avej dj\'anformassion suplementar ant sël coma dovré ël programa dla wiki.
+'mainpagedocfooter' => 'Che a varda la [http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide User\'s Guide] ([[belavans]] për adess a-i é mach n\'anglèis) për avej dj\'anformassion suplementar ant sël coma dovré ël programa dla wiki.
== Për anandiesse a travajé ==
@@ -482,7 +483,6 @@ a-j ven-a còmod copiesse via sò test e butesslo da na part për salvelo peuj.<
'protectedpagewarning' => '<strong>AVIS: costa pàgina-sì a l\'é staita blocà an manera che mach dj\'utent con la qualìfica da aministrator a peulo modifichelo. Che a varda le [[Project:Pàgina proteta|polìtiche për la protession dle pàgine]] për savejne dë pì.</strong>',
'semiprotectedpagewarning'=> '\'\'\'Nòta:\'\'\'costa pàgina-sì a l\'é staita protegiùa an manera che mach j\'utent registrà a peulo modifichela.',
'templatesused' => 'Stamp dovrà dzora a sta pàgina-sì:',
-'edittools' => '',
'nocreatetitle' => 'Creassion ëd pàgine limità',
'nocreatetext' => 'Cost sit-sì a l\'ha limità la possibilità ëd creé dle pàgine neuve.
A peul torné andaré e modifiché na pàgine che a-i é già, ò pura [[Special:Userlogin|rintré ant ël sistema ò deurb-se un cont]].',
@@ -494,7 +494,7 @@ Che as controla për piasì l\'adrëssa (URL) che a l\'ha dovrà për rivé a st
'loadhist' => 'I soma antramentr che i carioma la stòria dë sta pàgina-sì',
'currentrev' => 'Versione dël dì d\'ancheuj',
'revisionasof' => 'Revision $1',
-'old-revision-navigation' => 'Revision al $1; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'Revision al $1; $2',
'previousrevision' => 'â†Version pì veja',
'nextrevision' => 'Revision pì neuve→',
'currentrevisionlink' => 'vardé la version corenta',
@@ -994,7 +994,7 @@ Ij temp a son conforma a l\'ora dël server (UTC).
'rollbacklink' => 'ripristiné j\'archivi',
'rollbackfailed' => 'A l\'é pa podusse ripristiné',
'cantrollback' => 'As peul pa tornesse a na version pì veja: l\'ùltima modìfica a l\'ha fala l\'ùnich utent che a l\'abia travajà a cost artìcol-sì.',
-'alreadyrolled' => 'As peulo pa anulé j\'Ultime modìfiche ëd [[$1]]
+'alreadyrolled' => 'As peulo pa anulé j\'Ultime modìfiche ëd [[:$1]]
faite da [[User:$2|$2]] ([[User talk:$2|Talk]]); Cheidun d\'àutr a l\'ha già modificà ò pura anulà le modìfiche a sta pàgina-sì.
L\'ùltima modìfica a l\'é staita faita da [[User:$3|$3]] ([[User talk:$3|Talk]]).',
@@ -1251,7 +1251,7 @@ Tute le amportassion antra wiki diferente a resto marcà ant ël [[Special:Log/i
'importuploaderror' => 'L\'archivi da amporté a l\'é pa podusse carié; miraco a fussa mai pì gròss che ël màssim consentì?',
'importlogpage' => 'Registr dj\'amportassion',
'importlogpagetext' => 'Amportassion aministrative ëd pàgine e ëd soa stòria da dj\'àutre wiki.',
-'import-logentry-upload'=> 'amportà $1 con un càrich d\'archivi',
+'import-logentry-upload'=> 'amportà [[$1]] con un càrich d\'archivi',
'import-logentry-upload-detail'=> '$1 revision',
'import-logentry-interwiki'=> 'Amportà da n\'àutra wiki $1',
'import-logentry-interwiki-detail'=> '$1 revision da $2',
@@ -1259,18 +1259,18 @@ Tute le amportassion antra wiki diferente a resto marcà ant ël [[Special:Log/i
'accesskey-minoredit' => 'c',
'accesskey-save' => 's',
'accesskey-preview' => 'p',
-'accesskey-diff' => 'd',
+'accesskey-diff' => 'v',
'accesskey-compareselectedversions'=> 'v',
'accesskey-watch' => 'w',
'tooltip-search' => 'Sërca an {{SITENAME}} [alt-f]',
'tooltip-minoredit' => 'Marca sossì coma modìfica cita [alt-i]',
'tooltip-save' => 'Salva le modìfiche [alt-s]',
'tooltip-preview' => 'Preuva dle modìfiche (mej sempe fela, prima che fé che salvé!) [alt-p]',
-'tooltip-diff' => 'Fame vëdde che modìfiche che i l\'hai faje al test. [alt-d]',
+'tooltip-diff' => 'Fame vëdde che modìfiche che i l\'hai faje al test. [alt-v]',
'tooltip-compareselectedversions'=> 'Fame ël paragon dle diferense antra le version selessionà. [alt-v]',
'tooltip-watch' => 'Gionta sta pàgina-sì a la lista dle ròbe che im ten-o sot euj [alt-w]',
-'Common.css' => '/** Ël còdes CSS che as buta ambelessì a resta dovrà ant tute le "facie" */',
-'Monobook.css' => '/* cangé st\'archivi-sì për modifiché la formatassion dël sit antregh */',
+'common.css' => '/** Ël còdes CSS che as buta ambelessì a resta dovrà ant tute le "facie" */',
+'monobook.css' => '/* cangé st\'archivi-sì për modifiché la formatassion dël sit antregh */',
'nodublincore' => 'Ij metadat dla sòrt \'\'\'Dublin Core RDF\'\'\' a son disabilità ansima a sta màchina-sì.',
'nocreativecommons' => 'Ij metadat dla sòrt \'\'\'Creative Commons RDF\'\'\' a son disabilità ansima a sta màchina-sì.',
'notacceptable' => 'Ël server dla wiki a-i la fa pa a provëdde dij dat ant na forma che sò programa local a peula lese.',
@@ -1312,7 +1312,7 @@ Tute le amportassion antra wiki diferente a resto marcà ant ël [[Special:Log/i
'rcpatroldisabledtext' => 'La possibilità ëd verifichè j\'ùltime modìfiche a l\'é disabilità.',
'markedaspatrollederror'=> 'As peul pa marchè verificà',
'markedaspatrollederrortext'=> 'A venta che a specìfica che version che a veul marchè verificà.',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Mia pàgina Utent.\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Pàgina Utent për l\'IP dont a scriv coma anònim.\');
@@ -1323,7 +1323,7 @@ Tute le amportassion antra wiki diferente a resto marcà ant ël [[Special:Log/i
ta[\'pt-mycontris\'] = new Array(\'y\',\'Sòn i l\'hai falo mi! \');
ta[\'pt-login\'] = new Array(\'o\',\'Un a l\'é nen obligà a rintré ant al sistema, ma se a lo fa a l\'é mej.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Un a l\'é nen obligà a rintré ant al sistema, ma se a lo fa a l\'é mej.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Seurte da \'nt ël sistema.\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Seurte da \'nt ël sistema.\');
ta[\'ca-talk\'] = new Array(\'t\',\'Discussion ansima a sta pàgina ëd contnù.\');
ta[\'ca-edit\'] = new Array(\'e\',\'Modifiché sta pàgina-sì. Për piasì, che as fasa na preuva anans che salvé .\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Gionteje un coment a sta discussion-sì.\');
@@ -1688,7 +1688,6 @@ Për piasì, che an conferma che da bon a veul torna creélo.',
$1',
'confirm_purge_button' => 'Va bin',
'youhavenewmessagesmulti'=> 'A l\'ha dij neuv messagi an $1',
-'newtalkseperator' => ',_',
'searchcontaining' => 'Sërca le vos che a l\'han andrinta \'\'$1\'\'.',
'searchnamed' => 'Sërca le vos che a l\'han për tìtol \'\'$1\'\'.',
'articletitles' => 'Artìcoj che as anandio për \'\'$1\'\'',
diff --git a/languages/messages/MessagesPt.php b/languages/messages/MessagesPt.php
index 25b294a2..49672df8 100644
--- a/languages/messages/MessagesPt.php
+++ b/languages/messages/MessagesPt.php
@@ -217,7 +217,8 @@ $messages = array(
# Bits of text used by many pages:
#
-'categories' => '{{PLURAL:$1|Categoria|Categorias}}',
+'categories' => 'Categorias',
+'pagecategories' => '{{PLURAL:$1|Categoria|Categorias}}',
'category_header' => 'Artigos na categoria "$1"',
'subcategories' => 'Subcategorias',
@@ -225,7 +226,7 @@ $messages = array(
#'linkprefix' => '/^(.*?)([a-zA-Z\x80-\xff]+)$/sD', # ignore list
'mainpage' => 'Página principal',
'mainpagetext' => "<big>'''MediaWiki instalado com sucesso.'''</big>",
-'mainpagedocfooter' => "Consultar o [http://meta.wikipedia.org/wiki/Help:Contents Guia de Utilizadores] para informação acerca de como utilizador o software wiki.
+'mainpagedocfooter' => "Consultar o [http://meta.wikimedia.org/wiki/Help:Contents Guia de Utilizadores] para informação acerca de como utilizador o software wiki.
== Começando ==
@@ -451,7 +452,7 @@ a cache do seu navegador.',
A sua conta foi criada. Não se esqueça de personalizar as suas [[Special:Preferences|preferências]] na {{SITENAME}}.",
-'loginpagetitle' => 'Autentificação de utilizador',
+'loginpagetitle' => 'Autenticação de utilizador',
'yourname' => 'Seu nome de utilizador',
'yourpassword' => 'Palavra-chave',
'yourpasswordagain' => 'Reintroduza a sua palavra-chave',
@@ -459,16 +460,16 @@ A sua conta foi criada. Não se esqueça de personalizar as suas [[Special:Prefe
'yourdomainname' => 'Seu domínio',
'externaldberror' => 'Ocorreu um erro externo à base de dados durante a autenticação, ou não lhe é permitido actualizar a sua conta externa.',
'loginproblem' => '<b>Houve um problema com a sua autenticação.</b><br />Tente novamente!',
-'alreadyloggedin' => "<strong>Utilizador $1, você já está autentificado!</strong><br />",
+'alreadyloggedin' => "<strong>Utilizador $1, você já está autenticado!</strong><br />",
'login' => 'Entrar',
-'loginprompt' => "Você necessita de ter os <i>cookies</i> ligados para poder autentificar-se na {{SITENAME}}.",
+'loginprompt' => "Você necessita de ter os <i>cookies</i> ligados para poder autenticar-se na {{SITENAME}}.",
'userlogin' => 'Criar uma conta ou entrar',
'logout' => 'Sair',
'userlogout' => 'Sair',
-'notloggedin' => 'Não autentificado',
+'notloggedin' => 'Não autenticado',
'nologin' => 'Não possui uma conta? $1.',
'nologinlink' => 'Criar uma conta',
-'createaccount' => 'Create account',
+'createaccount' => 'Criar conta de utilizador',
'gotaccount' => 'Já possui uma conta? $1.',
'gotaccountlink' => 'Entrar',
'createaccount' => 'Criar nova conta',
@@ -486,9 +487,9 @@ A sua conta foi criada. Não se esqueça de personalizar as suas [[Special:Prefe
'email' => 'Correio electrónico',
'prefs-help-email-enotif' => 'Este endereço é também utilizado para enviar-lhe notificações caso as active nas preferências.',
'prefs-help-realname' => '* Nome verdadeiro (opcional): caso decida indicar, este será utilizado para lhe dar crédito pelo seu trabalho.',
-'loginerror' => 'Erro de autentificação',
+'loginerror' => 'Erro de autenticação',
'prefs-help-email' => '* Email (opcional): Permite os utilizadores entrem em contacto consigo sem que tenha de lhes revelar o seu endereço de e-mail.',
-'nocookiesnew' => "A conta de utilizador foi criada, mas você não foi ligado à conta. Tem os <i>cookies</i> desactivados no seu navegador, e a {{SITENAME}} utiliza <i>cookies</i> para ligar os utilizadores às suas contas. Por favor os active, depois autentifique-se com o seu nome de utilizador e a sua palavra-chave.",
+'nocookiesnew' => "A conta de utilizador foi criada, mas você não foi ligado à conta. Tem os <i>cookies</i> desactivados no seu navegador, e a {{SITENAME}} utiliza <i>cookies</i> para ligar os utilizadores às suas contas. Por favor os active, depois autentique-se com o seu nome de utilizador e a sua palavra-chave.",
'nocookieslogin' => "Você tem os <i>cookies</i> desactivados no seu navegador, e a {{SITENAME}} utiliza <i>cookies</i> para ligar os utilizadores às suas contas. Por favor os active e tente novamente.",
'noname' => 'Não colocou um nome de utilizador válido.',
'loginsuccesstitle' => 'Login bem sucedido',
@@ -507,7 +508,7 @@ A palavra para o utilizador \"$2\" é a partir de agora \"$3\". Pode agora entra
Caso tenha sido outra pessoa a fazer este pedido ou caso você já se tenha lembrado da sua palavra-chave e se não a desejar alterar, pode ignorar esta mensagem e continuar a utilizar a palavra-chave antiga.",
'noemail' => "Não existe um endereço de correio electrónico associado ao utilizador \"$1\".",
'passwordsent' => "Uma nova palavra-chave encontra-se a ser enviada para o endereço de correio electrónico associado ao utilizador \"$1\".
-Por favor, volte a efectuar a autentificação ao recebê-la.",
+Por favor, volte a efectuar a autenticação ao recebê-la.",
'eauthentsent' => "Um email de confirmação foi enviado para o endereço de correio electrónico nomeado.
Antes de qualquer outro email seja enviado para a conta, terá seguir as instruções no email,
de modo a confirmar que a conta é mesmo sua.",
@@ -574,13 +575,13 @@ Note que não poderá utilizar a funcionalidade \"Contactar utilizador\" se não
'whitelistedittitle' => 'Autentificação necessária para visualizar',
'whitelistedittext' => 'Precisa de se $1 para poder visualizar páginas.',
'whitelistreadtitle' => 'Autentificação necessária para visualizar',
-'whitelistreadtext' => 'Precisa de se [[Special:Userlogin|autentificar]] para poder visualizar páginas.',
+'whitelistreadtext' => 'Precisa de se [[Special:Userlogin|autenticar]] para puder visualizar páginas.',
'whitelistacctitle' => 'Não lhe é permitido criar uma conta',
-'whitelistacctext' => 'De modo a poder criar contas de utilizador nesta Wiki terá que se [[Special:Userlogin|autentificar]] e possuir as devidas permissões.',
+'whitelistacctext' => 'De modo a poder criar contas de utilizador nesta Wiki terá que se [[Special:Userlogin|autenticar]] e possuir as devidas permissões.',
'confirmedittitle' => 'Confirmação por correio electrónico necessária para editar',
'confirmedittext' => 'Precisa de confirmar o seu endereço de correio electrónico antes de começar a editar páginas. Por favor introduza e valide o seu endereço de correio electrónico através das suas [[Especial:Preferences|preferências de utilizador]].',
-'loginreqtitle' => 'Autentificação Requesitada',
-'loginreqlink' => 'autentificar-se',
+'loginreqtitle' => 'Autenticação Requesitada',
+'loginreqlink' => 'autenticar-se',
'loginreqpagetext' => 'Precisa de $1 para visualizar outras páginas.',
'accmailtitle' => 'Palavra-chave enviada.',
'accmailtext' => "A palavra-chave para '$1' foi enviada para $2.",
@@ -590,7 +591,7 @@ Note que não poderá utilizar a funcionalidade \"Contactar utilizador\" se não
(Consulte [[{{ns:project}}:Ajuda|a página de ajuda]] para mais informações)",
'anontalkpagetext' => "----
-''Esta é a página de discussão para um utilizador anónimo que ainda não criou uma conta ou que não a utiliza. De modo a que temos que utilizar o endereço de IP para identificá-lo(a). Um endereço de IP pode ser partilhado por vários utilizadores. Se é um utilizador anónimo e acha relevante que os comentários sejam direccionados a si, por favor [[{{ns:special}}:Userlogin|crie uma conta ou autentifique-se]] para evitar futuras confusões com outros utilizadores anónimos.''",
+''Esta é a página de discussão para um utilizador anónimo que ainda não criou uma conta ou que não a utiliza. De modo a que temos que utilizar o endereço de IP para identificá-lo(a). Um endereço de IP pode ser partilhado por vários utilizadores. Se é um utilizador anónimo e acha relevante que os comentários sejam direccionados a si, por favor [[{{ns:special}}:Userlogin|crie uma conta ou autentique-se]] para evitar futuras confusões com outros utilizadores anónimos.''",
'noarticletext' => 'Não existe actualmente texto nesta página, pode [[{{ns:special}}:Search/{{PAGENAME}}|pesquisar pelo título desta página noutras páginas]] ou [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} editar esta página].',
'clearyourcache' => "'''Nota:''' Após salvar, terá de limpar a cache do seu navegador para ver as alterações.
'''Mozilla / Firefox / Safari:''' pressione ''Shift'' enquanto clica em ''Recarregar'', ou pressione ''Ctrl-Shift-R'' (''Cmd-Shift-R'' no Apple Mac); '''IE:''' pressione ''Ctrl'' enquanto clica em ''Recarregar'', ou pressione ''Ctrl-F5''; '''Konqueror:''': simplesmente clique no botão ''Recarregar'', ou pressione ''F5''; utilizadores do navegador '''Opera''' podem limpar completamente a sua cache em ''Ferramentas→Preferências''.",
@@ -646,7 +647,7 @@ em tamanho, que é maior que o máximo de $2 kilobytes. A página não pode salv
'edittools' => '<!-- Text here will be shown below edit and upload forms. -->',
'nocreatetitle' => 'Limitada a criação de páginas',
'nocreatetext' => 'Este website tem restringida a habilidade de criar novas páginas.
-Pode voltar atrás e editar uma página já existente, ou [[Special:Userlogin|autentificar-se ou criar uma conta]].',
+Pode voltar atrás e editar uma página já existente, ou [[Special:Userlogin|autenticar-se ou criar uma conta]].',
'cantcreateaccounttitle' => 'Não é possível criar uma conta',
'cantcreateaccounttext' => 'A criação de contas a partir deste endereço IP (<b>$1</b>) foi bloqueada.
Isto é provavelmente devido a vandalismo persistente efectuada a partir da sua escola ou ISP.',
@@ -661,7 +662,7 @@ Isto é provavelmente devido a vandalismo persistente efectuada a partir da sua
'loadhist' => 'Carregando histórico',
'currentrev' => 'Revisão actual',
'revisionasof' => 'Revisão de $1',
-'old-revision-navigation' => 'Revisão de $1; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'Revisão de $1; $2',
'previousrevision' => '↠Versão anterior',
'nextrevision' => 'Versão posterior →',
'currentrevisionlink' => 'ver versão actual',
@@ -765,7 +766,7 @@ Note que os índices do conteúdo da {{SITENAME}} destes sites podem estar desac
'preferences' => 'Preferências',
'mypreferences' => 'Minhas preferências',
'prefsnologin' => 'Não autenticado',
-'prefsnologintext' => "Precisa estar [[Special:Userlogin|autentificado]] para definir suas preferências.",
+'prefsnologintext' => "Precisa estar [[Special:Userlogin|autenticado]] para definir suas preferências.",
'prefsreset' => 'Preferências restauradas da base de dados.',
'qbsettings' => 'Barra Rápida',
'changepassword' => 'Alterar palavra-chave',
@@ -876,8 +877,8 @@ Grupos não seleccionados, não serão alterados. Pode seleccionar ou remover a
'uploadbtn' => 'Carregar ficheiro',
'reupload' => 'Recarregar',
'reuploaddesc' => 'Voltar ao formulário de carregamento.',
-'uploadnologin' => 'Não autentificado',
-'uploadnologintext' => "Deve estar <a href=\"{{localurle:Special:Userlogin}}\">autentificado</a>
+'uploadnologin' => 'Não autenticado',
+'uploadnologintext' => "Deve estar <a href=\"{{localurle:Special:Userlogin}}\">autenticado</a>
para carregar ficheiros.",
'upload_directory_read_only' => 'A directoria de envio ($1) não tem permissões de escrita pelo servidor Web.',
'uploaderror' => 'Erro ao carregar',
@@ -1096,7 +1097,7 @@ Pode diminuir a lista escolhendo um tipo de registo, um nome de utilizar, ou uma
# E this user
#
'mailnologin' => 'Nenhum endereço de envio',
-'mailnologintext' => "Necessita de estar [[Special:Userlogin|autentificado]]
+'mailnologintext' => "Necessita de estar [[Special:Userlogin|autenticado]]
e de possuir um endereço de e-mail válido nas suas [[Special:Preferences|preferências]]
para enviar um e-mail a outros utilizadores.",
'emailuser' => 'Contactar este utilizador',
@@ -1123,13 +1124,13 @@ para que o destinatário lhe possa responder.',
'watchlistfor' => "(para '''$1''')",
'nowatchlist' => 'Não existem itens na sua lista de artigos vigiados.',
'watchlistanontext' => 'Por favor $1 para ver ou editar os itens na sua lista de artigos vigiados.',
-'watchlistcount' => "'''Tem $1 items na sua lista de artigos vigiados, incluindo páginas de discussão.'''",
+'watchlistcount' => "'''Tem {{PLURAL:$1|$1 item|$1 items}} na sua lista de artigos vigiados, incluindo páginas de discussão.'''",
'clearwatchlist' => 'Limpar lista de artigos vigiados',
'watchlistcleartext' => 'Tem a certeza que deseja removê-los?',
'watchlistclearbutton' => 'Limpar',
-'watchlistcleardone' => 'A sua lista de artigos vigiados foi limpa. $1 items foram removidos.',
-'watchnologin' => 'Não está autentificado',
-'watchnologintext' => 'Deve estar [[Special:Userlogin|autentificado]] para modificar a sua lista de artigos vigiados.',
+'watchlistcleardone' => 'A sua lista de artigos vigiados foi limpa. {{PLURAL:$1|$1 item foi removido|$1 items foram removidos}}.',
+'watchnologin' => 'Não está autenticado',
+'watchnologintext' => 'Deve estar [[Special:Userlogin|autenticado]] para modificar a sua lista de artigos vigiados.',
'addedwatch' => 'Adicionado à lista',
'addedwatchtext' => "A página \"$1\" foi adicionada à sua [[Special:Watchlist|lista de artigos vigiados]].
Modificações futuras neste artigo e páginas de discussão associadas serão listadas lá e a página aparecerá a '''negrito''' na [[Especial:Recentchanges|lista de mudanças recentes]], para que possa encontrá-la com maior facilidade.
@@ -1143,7 +1144,7 @@ Se desejar remover o artigo da sua lista de artigos vigiados, clique em \"Desint
'unwatchthispage' => 'Parar de vigiar esta página',
'notanarticle' => 'Não é um artigo',
'watchnochange' => 'Nenhum dos itens vigiados foram editados no período exibido.',
-'watchdetails' => '* $1 páginas vigiadas, excluindo páginas de discussão
+'watchdetails' => '* {{PLURAL:$1|$1 página vigiada|$1 páginas vigiadas}}, excluindo páginas de discussão
* [[Especial:Watchlist/edit|Mostrar e editar a lista completa]]
* [[Especial:Watchlist/clear|Remover todas as páginas]]',
'wlheader-enotif' => "* Notificação por email encontra-se activada.",
@@ -1198,7 +1199,7 @@ Contacto e assistência
'deletepage' => 'Eliminar página',
'confirm' => 'Confirmar',
'excontent' => "conteúdo era: '$1'",
-'excontentauthor' => "conteúdo era: '$1' (e o único editor era '$2')",
+'excontentauthor' => "conteúdo era: '$1' (e o único editor era '[[Especial:Contributions/$2|$2]]')",
'exbeforeblank' => "conteúdo antes de esvaziar era: '$1'",
'exblank' => 'página esvaziada',
'confirmdelete' => 'Confirmar eliminação',
@@ -1221,7 +1222,7 @@ Consulte $2 para um registo de eliminações recentes.",
'rollbacklink' => 'voltar',
'rollbackfailed' => 'Reversão falhou',
'cantrollback' => 'Não foi possível reverter a edição; o último contribuidor é o único autor deste artigo',
-'alreadyrolled' => "Não foi possível reverter as edições de [[$1]]
+'alreadyrolled' => "Não foi possível reverter as edições de [[:$1]]
por [[{{ns:user}}:$2|$2]] ([[{{ns:user_talk}}:$2|Discussão]]); alguém editou ou já reverteu o artigo.
A última edição foi de [[{{ns:user}}:$3|$3]] ([[{{ns:user_talk}}:$3|Discussão]]).",
@@ -1426,8 +1427,8 @@ Isto pode ser uma mudança drástica e inesperada para uma página popular; por
Nestes casos, você terá que mover ou mesclar a página manualmente, se desejar.',
'movearticle' => 'Mover página',
-'movenologin' => 'Não autentificado',
-'movenologintext' => "Você deve ser um utilizador registado e [[Special:Userlogin|autentificado]]</a>
+'movenologin' => 'Não autenticado',
+'movenologintext' => "Deve ser um utilizador registado e [[Special:Userlogin|autenticado]]</a>
para mover uma página.",
'newtitle' => 'Para novo título',
'movepagebtn' => 'Mover página',
@@ -1514,7 +1515,7 @@ Todas as acções de importação transwiki são registadas no [[Special:Log/imp
# import log
'importlogpage' => 'Registo de importações',
'importlogpagetext' => 'Importações administrativas de páginas com revisões noutras wikis.',
-'import-logentry-upload' => 'importado $1 através de ficheiro de importação',
+'import-logentry-upload' => 'importado [[$1]] através de ficheiro de importação',
'import-logentry-upload-detail' => '{{PLURAL:$1|revisão|revisões}}',
'import-logentry-interwiki' => 'transwiki $1',
'import-logentry-interwiki-detail' => '{{PLURAL:$1|revisão|revisões}} de $2',
@@ -1538,8 +1539,8 @@ Todas as acções de importação transwiki são registadas no [[Special:Log/imp
'tooltip-watch' => 'Adicionar esta página à sua lista de artigos vigiados [alt-w]',
# stylesheets
-'Common.css' => '/** o código CSS colocado aqui será aplicado a todos os temas */',
-'Monobook.css' => '/* o código CSS colocado aqui terá efeito nos utilizadores do tema Monobook */',
+'common.css' => '/** o código CSS colocado aqui será aplicado a todos os temas */',
+'monobook.css' => '/* o código CSS colocado aqui terá efeito nos utilizadores do tema Monobook */',
# Metadata
'nodublincore' => 'Dublin Core RDF metadata disabled for this server.',
@@ -1597,7 +1598,7 @@ Todas as acções de importação transwiki são registadas no [[Special:Log/imp
'markedaspatrollederrortext' => "Precisa de especificar uma revisão para marcar como verificado.",
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Minha página de utilizador\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'A página de utilizador para o ip que está a utilizar para editar\');
@@ -1608,7 +1609,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Lista de artigos vigiados.\');
ta[\'pt-mycontris\'] = new Array(\'y\',\'Lista das minhas contribuições\');
ta[\'pt-login\'] = new Array(\'o\',\'You are encouraged to log in, it is not mandatory however.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'You are encouraged to log in, it is not mandatory however.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Sair\');
+ta[\'pt-logout\'] = new Array(\'\',\'Sair\');
ta[\'ca-talk\'] = new Array(\'t\',\'Discussão sobre o conteúdo da página\');
ta[\'ca-edit\'] = new Array(\'e\',\'Você pode editar esta página. Por favor, utilize o botão Mostrar Previsão antes de salvar.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Adicionar comentário a essa discussão.\');
@@ -1914,7 +1915,9 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'Ver a página da categoria\');',
'confirmemail_text' => "Esta wiki requer que valide o seu endereço de e-mail antes de utilizar as funcionalidades que requerem um endereço de e-mail. Active o botão abaixo para enviar uma confirmação para o seu endereço de e-mail. A mensagem incluíra um endereço que contém um código; carregue o endereço no seu navegador para confirmar que o seu endereço de e-mail encontra-se válido.",
'confirmemail_send' => 'Enviar código de confirmação',
'confirmemail_sent' => 'E-mail de confirmação enviado.',
-'confirmemail_sendfailed' => 'Não foi possível enviar o email de confirmação. Por favor verifique o seu endereço de e-mail.',
+'confirmemail_sendfailed' => 'Não foi possível enviar o email de confirmação. Por favor verifique o seu endereço de e-mail.
+
+Mailer retornou: $1',
'confirmemail_invalid' => 'Código de confirmação inválido. O código poderá ter expirado.',
'confirmemail_needlogin' => 'Precisa de $1 para confirmar o seu endereço de correio electrónico.',
'confirmemail_success' => 'O seu endereço de e-mail foi confirmado. Pode agora se ligar.',
@@ -1965,7 +1968,7 @@ Por favor confirme que realmente deseja recriar este artigo.',
'confirm_purge_button' => 'OK',
'youhavenewmessagesmulti' => "Tem novas mensagens em $1",
-'newtalkseperator' => ',_',
+
'searchcontaining' => "Pesquisar por artigos contendo ''$1''.",
'searchnamed' => "Pesquisar por artigos intitulados de ''$1''.",
'articletitles' => "Artigos começandor com ''$1''",
diff --git a/languages/messages/MessagesPt_br.php b/languages/messages/MessagesPt_br.php
index acfc1579..a8495abd 100644
--- a/languages/messages/MessagesPt_br.php
+++ b/languages/messages/MessagesPt_br.php
@@ -93,6 +93,7 @@ $messages = array(
# Bits of text used by many pages:
#
"categories" => "Page categories",
+"pagecategories" => "Page categories",
"category_header" => "Articles in category \"$1\"",
"subcategories" => "Subcategories",
@@ -291,10 +292,10 @@ Para criá-lo, começe escrevendo na caixa abaixo
(veja [[{{ns:4}}:Ajuda|a página de ajuda]] para mais informações).
Se você chegou aqui por engano, apenas clique no botão '''voltar''' do seu navegador.",
-"anontalkpagetext" => "---- ''Esta é a página de discussão para um usuário anônimo que não criou uma conta ainda ou que não a usa. Então nós temos que usar o endereço numérico de IP para identificá-lo. Um endereço de IP pode ser compartilhado por vários usuários. Se você é um usuário anônimo e acha irrelevante que os comentários sejam direcionados a você, por favor [[Especial:Userlogin|crie uma conta ou autentique-se]] para evitar futuras confusões com outros usuários anônimos.'' ",
+"anontalkpagetext" => "---- ''Esta é a página de discussão para um usuário anônimo que não criou uma conta ainda ou que não a usa. Então nós temos que usar o endereço numérico de IP para identificá-lo. Um endereço de IP pode ser compartilhado por vários usuários. Se você é um usuário anônimo e acha irrelevante que os comentários sejam direcionados a você, por favor [[Especial:Userlogin|crie uma conta ou autentique-se]] para evitar futuras confusões com outros usuários anônimos.''",
"noarticletext" => "(Não há atualmente nenhum texto nesta página)",
"updated" => "(Atualizado)",
-"note" => "<strong>Nota:</strong> ",
+"note" => "<strong>Nota:</strong>",
"previewnote" => "Lembre-se que isto é apenas uma previsão. O conteúdo ainda não foi salvo!",
"previewconflict" => "Esta previsão reflete o texto que está na área de edição acima e como ele aparecerá se você escolher salvar.",
"editing" => "Editando $1",
@@ -393,7 +394,7 @@ para definir suas preferências.",
"dateformat" => "Formato da Data",
"math_failure" => "Falhou ao checar gramática(parse)",
"math_unknown_error" => "erro desconhecido",
-"math_unknown_function" => "função desconhecida ",
+"math_unknown_function" => "função desconhecida",
"math_lexing_error" => "erro léxico",
"math_syntax_error" => "erro de síntaxe",
"saveprefs" => "Salvar preferências",
@@ -641,7 +642,7 @@ $3...
"exblank" => "página estava vazia",
"confirmdelete" => "Confirmar deleção",
"deletesub" => "(Apagando \"$1\")",
-"historywarning" => "Atenção: A página que você quer deletar tem um histórico: ",
+"historywarning" => "Atenção: A página que você quer deletar tem um histórico:",
"confirmdeletetext" => "Você está prestes a deletar permanentemente uma página ou imagem junto com todo seu histórico do banco de dados.
Por favor, confirme que você realmente pretende fazer isto, que você compreende as consequências, e que você está fazendo isto em acordo com a [[{{ns:4}}:Policy| Política da {{SITENAME}}]].",
"actioncomplete" => "Ação efetuada com sucesso",
@@ -661,10 +662,10 @@ Todos os horários mostrados estão no horário do servidor (UTC).
"rollbacklink" => "voltar",
"rollbackfailed" => "Rollback falhou",
"cantrollback" => "Não foi possível reverter a edição; o último contribuidor é o único autor deste artigo.",
-"alreadyrolled" => "Não foi possível reverter as edições de [[$1]]
+"alreadyrolled" => "Não foi possível reverter as edições de [[:$1]]
por [[User:$2|$2]] ([[User talk:$2|discussão]]); alguém o editou ou já o reverteu.
-A última edição foi de [[User:$3|$3]] ([[User talk:$3|Conversar com ele]]). ",
+A última edição foi de [[User:$3|$3]] ([[User talk:$3|Conversar com ele]]).",
# only shown if there is an edit comment
"editcomment" => "O comentário de edição era: \"<i>$1</i>\".",
"revertpage" => "Revertido para a última edição por $1",
diff --git a/languages/messages/MessagesRmy.php b/languages/messages/MessagesRmy.php
index 4fc572bd..e2902961 100644
--- a/languages/messages/MessagesRmy.php
+++ b/languages/messages/MessagesRmy.php
@@ -272,7 +272,7 @@ Dikh ando $2 ek patrinipen le palutne butyange khosle.',
'lastmodifiedatby' => 'Kadaya patrin sas paruvdi agoreste $2, $1 katar $3.',
'and' => 'thai',
'others' => 'aver',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Miri labyarneski pajina\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Miri labyarneski pajina ki akanutni IP adress\');
@@ -283,7 +283,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'I lista le pajinenge so dikhav lendar (
ta[\'pt-mycontris\'] = new Array(\'y\',\'Le mire editisarimata\');
ta[\'pt-login\'] = new Array(\'o\',\'Mishto si te identifikares tut, pale na si musai.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Mishto si te identifikares tut, pale na si musai.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Kathe aćhaves i sesiyunya\');
+ta[\'pt-logout\'] = new Array(\'\',\'Kathe aćhaves i sesiyunya\');
ta[\'ca-talk\'] = new Array(\'t\',\'Diskuciya le artikoleske\');
ta[\'ca-edit\'] = new Array(\'e\',\'Shai te editisares kadaya pajina. Mangas te paledikhes o teksto anglal te uxtaves les.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Kathe shai te thos ek komentaryo ki kadaya diskuciya.\');
diff --git a/languages/messages/MessagesRo.php b/languages/messages/MessagesRo.php
index 7124be16..8387fa46 100644
--- a/languages/messages/MessagesRo.php
+++ b/languages/messages/MessagesRo.php
@@ -143,7 +143,8 @@ pe titlul secţiunii (JavaScript)',
'oct' => 'oct',
'nov' => 'nov',
'dec' => 'dec',
-'categories' => '{{PLURAL:$1|Categorie|Categorii}}',
+'categories' => 'Categorii',
+'pagecategories' => '{{PLURAL:$1|Categorie|Categorii}}',
'category_header' => 'Articole din categoria "$1"',
'subcategories' => 'Subcategorii',
'mainpage' => 'Pagina principală',
@@ -487,8 +488,7 @@ ceea ce înseamnă mai mult decât maximum de $2 kilobytes. Salvarea nu este pos
'loadhist' => 'ÃŽncarc istoria versiunilor',
'currentrev' => 'Versiunea curentă',
'revisionasof' => 'Versiunea de la data $1',
-'old-revision-navigation'=> 'Revizia pentru $1; $5<br />
-($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'Revizia pentru $1; $2',
'previousrevision' => 'â†Versiunea anterioară',
'nextrevision' => 'Versiunea următoare →',
'currentrevisionlink' => 'afişează versiunea curentă',
@@ -946,7 +946,7 @@ Asistenţă şi suport:
'rollbacklink' => 'revenire',
'rollbackfailed' => 'Revenirea nu s-a putut face',
'cantrollback' => 'Nu se poate reveni; ultimul contribuitor este autorul acestui articol.',
-'alreadyrolled' => 'Nu se poate reveni peste ultima modificare a articolului [[$1]]
+'alreadyrolled' => 'Nu se poate reveni peste ultima modificare a articolului [[:$1]]
făcută de către [[User:$2|$2]] ([[User talk:$2|discuţie]]); altcineva a modificat articolul sau a revenit deja.
Ultima editare a fost făcută de către [[User:$3|$3]] ([[User talk:$3|discuţie]]).',
@@ -1196,7 +1196,7 @@ Articolul de destinaţie "[[$1]]" există deja. Doriţi să îl ştergeţi pentr
'importuploaderror' => 'Încărcarea fişierului de import nu a avut succes; probabil mărimea fişierului este mai mare decât mărimea maximă acceptată pentru fişiere.',
'importlogpage' => 'Log import',
'importlogpagetext' => 'Imoprturi administrative de pagini de la alte wiki, cu istoricul editărilor.',
-'import-logentry-upload'=> '$1 importate prin upload',
+'import-logentry-upload'=> '[[$1]] importate prin upload',
'import-logentry-upload-detail'=> '$1 revizie(i)',
'import-logentry-interwiki'=> 'transwikificat $1',
'import-logentry-interwiki-detail'=> '$1 revizie(i) de la $2',
@@ -1211,11 +1211,11 @@ Articolul de destinaţie "[[$1]]" există deja. Doriţi să îl ştergeţi pentr
'tooltip-minoredit' => 'Marcaţi această modificare ca fiind minoră [alt-i]',
'tooltip-save' => 'Salvează modificările tale [alt-s]',
'tooltip-preview' => 'Previzualizarea modificărilor tale, foloseşte-o te rog înainte de a salva! [alt-p]',
-'tooltip-diff' => 'Arată ce modificări ai făcut textului. [alt-d]',
+'tooltip-diff' => 'Arată ce modificări ai făcut textului. [alt-v]',
'tooltip-compareselectedversions'=> 'Vezi diferenţele între cele două versiuni selectate de pe această pagină. [alt-v]',
'tooltip-watch' => 'Adaugă această pagină la lista mea de pagini urmărite [alt-w]',
-'Common.css' => '/** CSS plasate aici vor fi aplicate tuturor apariţiilor */',
-'Monobook.css' => '/* modificaţi acest fişier pentru a adapta înfăţişarea monobook-ului pentru tot situl*/',
+'common.css' => '/** CSS plasate aici vor fi aplicate tuturor apariţiilor */',
+'monobook.css' => '/* modificaţi acest fişier pentru a adapta înfăţişarea monobook-ului pentru tot situl*/',
'nodublincore' => 'Metadatele Dublin Core RDF sunt dezactivate pentru acest server.',
'nocreativecommons' => 'Metadatele Creative Commons RDF dezactivate pentru acest server.',
'notacceptable' => 'Serverul wiki nu poate oferi date într-un format pe care clientul tău să-l poată citi.',
@@ -1257,7 +1257,7 @@ Articolul de destinaţie "[[$1]]" există deja. Doriţi să îl ştergeţi pentr
'rcpatroldisabledtext' => 'Patrularea modificărilor recente este în prezent dezactivată.',
'markedaspatrollederror'=> 'Nu se poate marca ca patrulat',
'markedaspatrollederrortext'=> 'Trebuie să specificaţi o revizie care să fie marcată ca patrulată.',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'history-prevlink\'] = new Array(\'-\',\'Previous\');
ta[\'history-nextlink\'] = new Array(\'+\',\'Next\');
@@ -1270,7 +1270,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Lista paginilor pe care le monitorizez.
ta[\'pt-mycontris\'] = new Array(\'y\',\'Listă de contribuţii\');
ta[\'pt-login\'] = new Array(\'o\',\'Eşti încurajat să te autentifici, deşi acest lucru nu este obligatoriu.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Eşti încurajat să te autentifici, deşi acest lucru nu este obligatoriu.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'ÃŽnchide sesiunea\');
+ta[\'pt-logout\'] = new Array(\'\',\'ÃŽnchide sesiunea\');
ta[\'ca-talk\'] = new Array(\'t\',\'Discuţie despre articol\');
ta[\'ca-edit\'] = new Array(\'e\',\'Poţi edita această pagină. Te rugăm să previzualizezi conţinutul înainte de salvare.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Adaugă un comentariu acestei discuţii.\');
@@ -1615,7 +1615,6 @@ Vă rugăm să confirmaţi faptul că într-adevăr doriţi să recreaţi acest
'confirm_purge' => 'Doriţi să reîncărcaţi pagina? $1',
'confirm_purge_button' => 'Da',
'youhavenewmessagesmulti'=> 'Aveţi mesaje noi la $1',
-'newtalkseperator' => ',_',
'searchcontaining' => 'Caută articolele care conţin \'\'$1\'\'.',
'searchnamed' => 'Caută articole cu numele \'\'$1\'\'.',
'articletitles' => 'Articole începând cu \'\'$1\'\'',
diff --git a/languages/messages/MessagesRu.php b/languages/messages/MessagesRu.php
index d814b46a..45d11ec5 100644
--- a/languages/messages/MessagesRu.php
+++ b/languages/messages/MessagesRu.php
@@ -1,15 +1,21 @@
<?php
/** Russian (руÑÑкий Ñзык)
*
- * Based on MessagesEn.php 16773 (2006-10-05)
- * and ru.wikipedia MediaWiki namespace (2006-10-05)
+ * Based on MessagesEn.php revision 18716 (2007-01-01)
+ * and ru.wikipedia MediaWiki namespace (2007-01-01)
*
- * You can contact Alexander Sigachov (alexander.sigachov на Google Mail)
+ * Maintainer: Alexander Sigachov (alexander.sigachov на Google Mail)
+ *
+ * Ð’ÐИМÐÐИЕ! ÐЕ РЕДÐКТИРУЙТЕ ЭТОТ ФÐЙЛ!
+ *
+ * ЕÑли необходимо внеÑти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² перевод отдельных Ñтрок интерфейÑа,
+ * Ñделайте Ñто поÑредÑтвом Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтраниц вида «MediaWiki:*».
+ * Их ÑпиÑок можно найти на Ñтранице «Special:Allmessages».
*
*/
$separatorTransformTable = array(
- ',' => "\xc2\xa0",
+ ',' => "\xc2\xa0", # nbsp
'.' => ','
);
@@ -195,6 +201,8 @@ $magicWords = array(
'formatnum' => array( 0, 'FORMATNUM', 'ФОРМÐТИРОВÐТЬ_ЧИСЛО' ),
'padleft' => array( 0, 'PADLEFT', 'ЗÐПОЛÐИТЬ_СЛЕВÐ'),
'padright' => array( 0, 'PADRIGHT', 'ЗÐПОЛÐИТЬ_СПРÐÐ’Ð'),
+ 'special' => array( 0, 'special', 'ÑлужебнаÑ' ),
+ 'defaultsort' => array( 1, 'DEFAULTSORT:', 'СОРТИРОВКÐ_ПО_УМОЛЧÐÐИЮ'),
);
$linkTrail = '/^([a-zабвгдеёжзийклмнопрÑтуфхцчшщъыьÑÑŽÑ“»]+)(.*)$/sDu';
@@ -218,6 +226,7 @@ $messages = array(
'tog-editwidth' => 'Поле Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¾ вÑÑŽ ширину окна браузера',
'tog-watchcreations' => 'По умолчанию добавлÑÑ‚ÑŒ Ñозданные Ñтатьи в ÑпиÑок наблюдениÑ',
'tog-watchdefault' => 'По умолчанию добавлÑÑ‚ÑŒ новые и изменённые Ñтатьи в ÑпиÑок наблюдениÑ',
+'tog-watchdeletion' => 'ДобавлÑÑ‚ÑŒ удалённые мной Ñтраницы в ÑпиÑок наблюдениÑ',
'tog-minordefault' => 'По умолчанию помечать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ°Ðº малозначимые',
'tog-previewontop' => 'Показывать предпроÑмотр Ñтатьи до окна редактированиÑ',
'tog-previewonfirst' => 'Предварительный проÑмотр по первому изменению',
@@ -232,10 +241,12 @@ $messages = array(
'tog-externaldiff' => 'ИÑпользовать по умолчанию внешнюю программу ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð²ÐµÑ€Ñий',
'tog-showjumplinks' => 'Включить вÑпомогательные ÑÑылки «перейти к»',
'tog-uselivepreview' => 'ИÑпользовать быÑтрый предварительный проÑмотр (JavaScript, ÑкÑпериментально)',
-'tog-autopatrol' => 'Отмечать Ñделанные правки как проверенные',
'tog-forceeditsummary' => 'Предупреждать, когда не указано краткое опиÑание изменений',
'tog-watchlisthideown' => 'Скрывать мои правки из ÑпиÑка наблюдениÑ',
'tog-watchlisthidebots' => 'Скрывать правки ботов из ÑпиÑка наблюдениÑ',
+'tog-watchlisthideminor' => 'Скрывать малые правки из ÑпиÑка наблюдениÑ',
+'tog-nolangconversion' => 'Отключить преобразование ÑиÑтем пиÑьма',
+'tog-ccmeonemails' => 'ОтправлÑÑ‚ÑŒ мне копии пиÑем, которые Ñ Ð¿Ð¾Ñылаю другим учаÑтникам.',
'underline-always' => 'Ð’Ñегда',
'underline-never' => 'Ðикогда',
@@ -296,10 +307,11 @@ $messages = array(
'dec' => 'дек',
# Bits of text used by many pages:
#
-'categories' => '{{PLURAL:$1|КатегориÑ|Категории|Категории}}',
+'categories' => 'Категории',
+'pagecategories' => '{{PLURAL:$1|КатегориÑ|Категории|Категории}}',
'category_header' => 'Статьи в категории «$1»',
'subcategories' => 'Подкатегории',
-
+'category-media-header' => 'Файлы в категории «$1»',
'linkprefix' => '/^(.*?)(„|«)$/sD',
'mainpage' => 'Ð—Ð°Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница',
@@ -395,7 +407,6 @@ $messages = array(
'viewtalkpage' => 'ПроÑмотреть обÑуждение',
'otherlanguages' => 'Ðа других Ñзыках',
'redirectedfrom' => '(Перенаправлено Ñ $1)',
- 'autoredircomment' => 'Перенаправление на [[$1]]',
'redirectpagesub' => 'Страница-перенаправление',
'lastmodifiedat' => 'ПоÑледнее изменение Ñтой Ñтраницы: $2, $1.',
'viewcount' => 'К Ñтой Ñтранице обращалиÑÑŒ $1 {{plural:$1|раз|раза|раз}}.',
@@ -412,8 +423,9 @@ $messages = array(
'badaccess-groups' => 'Запрошенное дейÑтвие могут выполнÑÑ‚ÑŒ только учаÑтники из групп $1.',
'versionrequired' => 'ТребуетÑÑ MediaWiki верÑии $1',
-'versionrequiredtext' => 'Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ñтой Ñтраницей требуетÑÑ MediaWiki верÑии $1. См. [[Special:Version]].',
+'versionrequiredtext' => 'Ð”Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ñтой Ñтраницей требуетÑÑ MediaWiki верÑии $1. См. [[{{ns:special}}:Version]].',
+'widthheight' => '$1 × $2',
'ok' => 'OK',
'pagetitle' => '$1 — {{SITENAME}}',
'retrievedfrom' => 'Получено Ñ $1',
@@ -428,7 +440,7 @@ $messages = array(
'hidetoc' => 'убрать',
'thisisdeleted' => 'ПроÑмотреть или воÑÑтановить $1?',
'viewdeleted' => 'ПроÑмотреть $1?',
-'restorelink' => '{{PLURAL:$1|$1 удалённую правку|$1 удалённых правки|$1 удалённых правок}}',
+'restorelink' => '{{PLURAL:$1|$1 удалённую правку|$1 удалённые правки|$1 удалённых правок}}',
'feedlinks' => 'В виде:',
'feed-invalid' => 'Ðеправильный тип канала Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки.',
@@ -441,7 +453,7 @@ $messages = array(
'nstab-image' => 'Файл',
'nstab-mediawiki' => 'Сообщение',
'nstab-template' => 'Шаблон',
-'nstab-help' => 'Страница Ñправки',
+'nstab-help' => 'Справка',
'nstab-category' => 'КатегориÑ',
# Main script and global functions
@@ -503,19 +515,17 @@ $1',
ЗапроÑ: $2',
'viewsource' => 'ПроÑмотр',
'viewsourcefor' => 'Страница «$1»',
-'protectedtext' => 'Эта Ñтраница защищена от редактированиÑ.
-
-Ð’Ñ‹ можете проÑмотреть и Ñкопировать иÑходный код Ñтой Ñтраницы:',
+'protectedtext' => 'Эта Ñтраница закрыта Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ.',
+'viewsourcetext' => 'Ð’Ñ‹ можете проÑмотреть и Ñкопировать иÑходный текÑÑ‚ Ñтой Ñтраницы:',
'protectedinterface' => 'Эта Ñтраница Ñодержит ÑиÑтемное Ñообщение MediaWiki, её могут изменÑÑ‚ÑŒ только админиÑтраторы проекта.',
-'editinginterface' => "'''Внимание:''' Ð’Ñ‹ редактируете Ñтраницу Ñодержащую ÑиÑтемное Ñообщение MediaWiki. Её изменение повлиÑет на внешний вид интерфейÑа Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… пользователей.",
+'editinginterface' => "'''Внимание:''' Ð’Ñ‹ редактируете Ñтраницу, Ñодержащую ÑиÑтемное Ñообщение MediaWiki. Её изменение повлиÑет на внешний вид интерфейÑа Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… пользователей.",
'sqlhidden' => '(SQL Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñкрыт)',
# Login and logout pages
#
'logouttitle' => 'Стать инкогнито',
'logouttext' => 'Ð’Ñ‹ работаете в том же режиме, который был до вашего предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑиÑтеме. Ð’Ñ‹ идентифицируетеÑÑŒ не по имени, а по IP-адреÑу.
-Ð’Ñ‹ можете продолжить учаÑтие в проекте анонимно или начать новый ÑÐµÐ°Ð½Ñ ÐºÐ°Ðº тот же Ñамый или другой пользователь. Ðекоторые Ñтраницы могут отображатьÑÑ
-как будто вы ещё предÑтавлены ÑиÑтеме под именем, Ð´Ð»Ñ Ð±Ð¾Ñ€ÑŒÐ±Ñ‹ Ñ Ñтим Ñвлением обновите кеш браузера.',
+Ð’Ñ‹ можете продолжить учаÑтие в проекте анонимно или начать новый ÑÐµÐ°Ð½Ñ ÐºÐ°Ðº тот же Ñамый или другой пользователь. Ðекоторые Ñтраницы могут отображатьÑÑ, как будто вы ещё предÑтавлены ÑиÑтеме под именем, Ð´Ð»Ñ Ð±Ð¾Ñ€ÑŒÐ±Ñ‹ Ñ Ñтим Ñвлением обновите кеш браузера.',
'welcomecreation' => '== Добро пожаловать, $1! ==
@@ -524,7 +534,7 @@ $1',
'loginpagetitle' => 'ПредÑтавитьÑÑ ÑиÑтеме',
'yourname' => 'Ваше Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника',
'yourpassword' => 'Ваш пароль',
-'yourpasswordagain' => 'Повторный набор паролÑ',
+'yourpasswordagain' => 'Повторный набор паролÑ:',
'remembermypassword' => 'Помнить мою учётную запиÑÑŒ на Ñтом компьютере',
'yourdomainname' => 'Ваш домен',
'externaldberror' => 'Произошла ошибка при аутентификации Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ внешней базы данных, или у Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно прав Ð´Ð»Ñ Ð²Ð½ÐµÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в Ñвою внешнюю учётную запиÑÑŒ.',
@@ -564,7 +574,7 @@ $1',
'loginsuccesstitle' => 'Опознание прошло уÑпешно',
'loginsuccess' => 'Теперь вы работаете под именем $1.',
'nosuchuser' => 'УчаÑтника Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ $1 не ÑущеÑтвует.
-Проверьте правильноÑÑ‚ÑŒ напиÑаниÑ, или воÑпользуйтеÑÑŒ формой ниже, чтобы зарегиÑтрировать нового учаÑтника.',
+Проверьте правильноÑÑ‚ÑŒ напиÑÐ°Ð½Ð¸Ñ Ð¸Ð»Ð¸ воÑпользуйтеÑÑŒ формой ниже, чтобы зарегиÑтрировать нового учаÑтника.',
'nosuchusershort' => 'Ðе ÑущеÑтвует учаÑтника Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ $1. Проверьте напиÑание имени.',
'nouserspecified' => 'Ð’Ñ‹ должны указать Ð¸Ð¼Ñ ÑƒÑ‡Ð°Ñтника.',
'wrongpassword' => 'Введённый вами пароль неверен. Попробуйте ещё раз.',
@@ -582,17 +592,29 @@ $1',
'passwordsent' => 'Ðовый пароль был выÑлан на Ð°Ð´Ñ€ÐµÑ Ñлектронной почты, указанный Ð´Ð»Ñ ÑƒÑ‡Ð°Ñтника $1.
ПожалуйÑта, предÑтавьтеÑÑŒ ÑиÑтеме заново поÑле Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ.',
+'blocked-mailpassword' => 'Редактирование Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ IP-адреÑа запрещено, заблокирована и Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ.',
'eauthentsent' => 'Временный пароль был отправлен на Ð°Ð´Ñ€ÐµÑ Ñлектронной почты нового учаÑтника $1. Ð’ пиÑьме также опиÑаны дейÑтвиÑ, которые нужно выполнить, чтобы подтвердить, что Ñтот Ð°Ð´Ñ€ÐµÑ Ñлектронной почты дейÑтвительно принадлежит вам.',
+'throttled-mailpassword' => 'Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ ÑƒÐ¶Ðµ иÑпользовалоÑÑŒ в течение поÑледних $1 чаÑов. Ð”Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð»Ð¾ÑƒÐ¿Ð¾Ñ‚Ñ€ÐµÐ±Ð»ÐµÐ½Ð¸Ð¹, разрешено запрашивать не более одного Ð½Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ Ð·Ð° $1 чаÑов.',
'mailerror' => 'Ошибка при отправке почты: $1',
'acct_creation_throttle_hit' => 'К Ñожалению, вы уже Ñоздали $1 учётных запиÑей. Ð’Ñ‹ не можете Ñоздать больше ни одной.',
'emailauthenticated' => 'Ваш почтовый Ð°Ð´Ñ€ÐµÑ Ð±Ñ‹Ð» ÑопоÑтавлен Ñ $1.',
'emailnotauthenticated' => 'Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты ещё не был подтверждён, функции вики-движка по работе Ñ Ñл. почтой отключены.',
'noemailprefs' => 'ÐÐ´Ñ€ÐµÑ Ñлектронной почты не был указан, функции вики-движка по работе Ñ Ñл. почтой отключены.',
'emailconfirmlink' => 'Подтвердить ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты',
-'invalidemailaddress' => 'Введённый Ð°Ð´Ñ€ÐµÑ Ð½Ðµ может быть принÑÑ‚, так как он не ÑоответÑтвует формату адреÑов Ñлектронной почты. ПожалуйÑта введите корректный Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ оÑтавьте поле пуÑтым.',
+'invalidemailaddress' => 'Введённый Ð°Ð´Ñ€ÐµÑ Ð½Ðµ может быть принÑÑ‚, так как он не ÑоответÑтвует формату адреÑов Ñлектронной почты. ПожалуйÑта, введите корректный Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ оÑтавьте поле пуÑтым.',
'accountcreated' => 'Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ñоздана',
'accountcreatedtext' => 'Создана ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ учаÑтника $1.',
+# Password reset dialog
+'resetpass' => 'Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¾Ñ‚ учётной запиÑи',
+'resetpass_announce' => 'Ð’Ñ‹ предÑтавилиÑÑŒ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ временного паролÑ, полученного по Ñлектронной почте. Ð”Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð²Ñ…Ð¾Ð´Ð° в ÑиÑтему, вы должны уÑтановить новый пароль.',
+'resetpass_header' => 'Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ',
+'resetpass_submit' => 'УÑтановить пароль и предÑтавитьÑÑ',
+'resetpass_success' => 'Ваш пароль был уÑпешно изменён! ВыполнÑетÑÑ Ð²Ñ…Ð¾Ð´ в ÑиÑтему…',
+'resetpass_bad_temporary' => 'ÐедейÑтвительный временный пароль. Возможно, вы уже изменили ваш пароль, или попробуйте запроÑить временный пароль Ñнова.',
+'resetpass_forbidden' => 'ВозможноÑÑ‚ÑŒ Ñмены Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð² данной вики-ÑиÑтеме не предуÑмотрена',
+'resetpass_missing' => 'Форма не Ñодержит данных.',
+
# Edit page toolbar
'bold_sample'=>'Полужирное начертание',
'bold_tip'=>'Полужирное начертание',
@@ -604,7 +626,7 @@ $1',
'extlink_tip'=>'ВнешнÑÑ ÑÑылка (помните о префикÑе http:// )',
'headline_sample'=>'ТекÑÑ‚ заголовка',
'headline_tip'=>'Заголовок 2-го уровнÑ',
-'math_sample'=>'Ð’ÑтавлÑйте Ñюда формулу',
+'math_sample'=>'Ð’Ñтавьте Ñюда формулу',
'math_tip'=>'МатематичеÑÐºÐ°Ñ Ñ„Ð¾Ñ€Ð¼ÑƒÐ»Ð° (формат LaTeX)',
'nowiki_sample'=>'Ð’ÑтавлÑйте Ñюда неотформатированный текÑÑ‚.',
'nowiki_tip'=>'Ðе обрабатывать как размеченный текÑÑ‚',
@@ -617,7 +639,7 @@ $1',
# Edit pages
#
-'summary' => 'Краткое опиÑание изменений',
+'summary' => 'ОпиÑание изменений',
'subject' => 'Тема/заголовок',
'minoredit' => 'Малое изменение',
'watchthis' => 'Включить Ñту Ñтраницу в ÑпиÑок наблюдениÑ',
@@ -629,24 +651,27 @@ $1',
'anoneditwarning' => "'''Внимание''': Ð’Ñ‹ не предÑтавилиÑÑŒ ÑиÑтеме. Ваш IP-Ð°Ð´Ñ€ÐµÑ Ð±ÑƒÐ´ÐµÑ‚ запиÑан в иÑторию изменений Ñтой Ñтраницы.",
'missingsummary' => "'''Ðапоминание.''' Ð’Ñ‹ не дали краткого опиÑÐ°Ð½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹. При повторном нажатии на кнопку «Сохранить», ваши Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ Ñохранены без комментариÑ.",
'missingcommenttext' => 'ПожалуйÑта, введите ниже ваше Ñообщение.',
+'missingcommentheader' => "'''Ðапоминание:''' Ð’Ñ‹ не указали заголовок комментариÑ. При повторном нажатии на кнопку «Сохранить», ваш комментарий будет запиÑан без заголовка.",
+'summary-preview' => 'ОпиÑание будет',
+'subject-preview' => 'Заголовок будет',
'blockedtitle' => 'УчаÑтник заблокирован',
'blockedtext' => "<big>'''Ваша ÑƒÑ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ или IP-Ð°Ð´Ñ€ÐµÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ñ‹.'''</big>
Блокировка произведена админиÑтратором $1. Указана ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¿Ñ€Ð¸Ñ‡Ð¸Ð½Ð° блокировки: ''«$2»''.
Ð’Ñ‹ можете отправить пиÑьмо учаÑтнику $1 или любому другому [[{{ns:project}}:ÐдминиÑтраторы|админиÑтратору]], чтобы обÑудить блокировку.
-Обратите внимание, что вы не Ñможете отправить пиÑьмо админиÑтратору, еÑли вы не зарегиÑтрированы в Википедии и не подтвердили Ñвой Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в [[Special:Preferences|личных наÑтройках]].
+Обратите внимание, что вы не Ñможете отправить пиÑьмо админиÑтратору, еÑли вы не зарегиÑтрированы в Википедии и не подтвердили Ñвой Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в [[{{ns:special}}:Preferences|личных наÑтройках]].
Ваш IP-Ð°Ð´Ñ€ÐµÑ â€” $3. ПожалуйÑта, указывайте Ñтот Ð°Ð´Ñ€ÐµÑ Ð²Ð¾ вÑех Ñвоих запроÑах.",
'blockedoriginalsource' => "Ðиже показан текÑÑ‚ Ñтраницы «$1».",
'blockededitsource' => "Ðиже показан текÑÑ‚ '''ваших изменений''' Ñтраницы «$1».",
'whitelistedittitle' => 'Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ',
'whitelistedittext' => 'Ð’Ñ‹ должны $1 Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñтраниц.',
'whitelistreadtitle' => 'Ð”Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ',
-'whitelistreadtext' => 'Ð’Ñ‹ должны [[Special:Userlogin|зарегиÑтрироватьÑÑ]] Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñтих Ñтраниц.',
+'whitelistreadtext' => 'Ð’Ñ‹ должны [[{{ns:special}}:Userlogin|зарегиÑтрироватьÑÑ]] Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñтих Ñтраниц.',
'whitelistacctitle' => 'У Ð²Ð°Ñ Ð½ÐµÑ‚ прав, чтобы Ñоздать учётную запиÑÑŒ',
-'whitelistacctext' => 'Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтобы иметь возможноÑÑ‚ÑŒ Ñоздавать учётные запиÑи в Ñтой вики, вы должны [[Special:Userlogin|зарегиÑтрироватьÑÑ]] и иметь ÑоответÑтвующие права.',
+'whitelistacctext' => 'Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтобы иметь возможноÑÑ‚ÑŒ Ñоздавать учётные запиÑи в Ñтой вики, вы должны [[{{ns:special}}:Userlogin|зарегиÑтрироватьÑÑ]] и иметь ÑоответÑтвующие права.',
'confirmedittitle' => 'ТребуетÑÑ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ðµ адреÑа Ñлектронной почты',
-'confirmedittext' => 'Ð’Ñ‹ должны подтвердить ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты перед правкой Ñтраниц. ПожалуйÑта, введите и подтвердите ваш Ð°Ð´Ñ€ÐµÑ Ñл. почты на [[Special:Preferences|Ñтранице наÑтроек]].',
+'confirmedittext' => 'Ð’Ñ‹ должны подтвердить ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты перед правкой Ñтраниц. ПожалуйÑта, введите и подтвердите ваш Ð°Ð´Ñ€ÐµÑ Ñл. почты на [[{{ns:special}}:Preferences|Ñтранице наÑтроек]].',
'loginreqtitle' => 'ТребуетÑÑ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ',
'loginreqlink' => 'предÑтавитьÑÑ',
'loginreqpagetext' => 'Ð’Ñ‹ должны $1, чтобы проÑмотреть другие Ñтраницы.',
@@ -658,7 +683,7 @@ $1',
Чтобы Ñоздать новую Ñтраницу, наберите текÑÑ‚ в окне, раÑположенном ниже
(Ñм. [[{{ns:help}}:Справка|Ñправочную Ñтраницу]] чтобы получить больше информации).
ЕÑли вы оказалиÑÑŒ здеÑÑŒ по ошибке, проÑто нажмите кнопку \'\'\'назад\'\'\' вашего браузера.',
-'anontalkpagetext' => "----''Эта Ñтраница обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ‚ анонимному учаÑтнику, который ещё не зарегиÑтрировалÑÑ Ð¸Ð»Ð¸ который не предÑтавилÑÑ Ñ€ÐµÐ³Ð¸Ñтрированным именем. Ð”Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ иÑпользуетÑÑ Ñ†Ð¸Ñ„Ñ€Ð¾Ð²Ð¾Ð¹ IP-адреÑ. ЕÑли вы анонимный учаÑтник и полагаете, что получили ÑообщениÑ, адреÑованные не вам (один IP-Ð°Ð´Ñ€ÐµÑ Ð¼Ð¾Ð¶ÐµÑ‚ иÑпользоватьÑÑ Ð½ÐµÑколькими пользователÑми), пожалуйÑта, [[СлужебнаÑ:Userlogin|предÑтавьтеÑÑŒ ÑиÑтеме]], чтобы впредь избежать возможной путаницы Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ учаÑтниками.''",
+'anontalkpagetext' => "----''Эта Ñтраница обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ‚ анонимному учаÑтнику, который ещё не зарегиÑтрировалÑÑ Ð¸Ð»Ð¸ который не предÑтавилÑÑ Ñ€ÐµÐ³Ð¸Ñтрированным именем. Ð”Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ иÑпользуетÑÑ Ñ†Ð¸Ñ„Ñ€Ð¾Ð²Ð¾Ð¹ IP-адреÑ. ЕÑли вы анонимный учаÑтник и полагаете, что получили ÑообщениÑ, адреÑованные не вам (один IP-Ð°Ð´Ñ€ÐµÑ Ð¼Ð¾Ð¶ÐµÑ‚ иÑпользоватьÑÑ Ð½ÐµÑколькими пользователÑми), пожалуйÑта, [[{{ns:special}}:Userlogin|предÑтавьтеÑÑŒ ÑиÑтеме]], чтобы впредь избежать возможной путаницы Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ учаÑтниками.''",
'noarticletext' => "Ð’ наÑтоÑщий момент текÑÑ‚ на данной Ñтранице отÑутÑтвует. Ð’Ñ‹ можете [[{{ns:special}}:Search/{{PAGENAME}}|найти упоминание данного названиÑ]] в других ÑтатьÑÑ… или '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} Ñоздать Ñтраницу Ñ Ñ‚Ð°ÐºÐ¸Ð¼ названием]'''.",
'clearyourcache' => "'''Замечание:''' Чтобы поÑле ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÑƒÐ²Ð¸Ð´ÐµÑ‚ÑŒ Ñделанные изменениÑ, очиÑтите кеш Ñвоего браузера: '''Mozilla / Firefox''': ''Ctrl+Shift+R'', '''IE:''' ''Ctrl+F5'', '''Safari''': ''Cmd+Shift+R'', '''Konqueror''': ''F5'', '''Opera''': через меню ''Tools→Preferences''.",
'usercssjsyoucanpreview' => "<strong>ПодÑказка:</strong> ИÑпользуйте кнопку предварительного проÑмотра, чтобы протеÑтировать ваш новый css-файл или js-файл перед Ñохранением.",
@@ -695,8 +720,7 @@ $1',
'copyrightwarning2' => 'ПожалуйÑта, обратите внимание, что вÑе ваши добавлениÑ
могут быть отредактированы или удалены другими учаÑтниками.
ЕÑли вы не хотите, чтобы кто-либо изменÑл ваши текÑÑ‚Ñ‹, не помещайте их Ñюда.<br />
-Ð’Ñ‹ также подтверждаете, что ÑвлÑетеÑÑŒ автором вноÑимых дополнений, или Ñкопировали их из
-иÑточника допуÑкающего Ñвободное раÑпроÑтранение и изменение Ñвоего Ñодержимого (Ñм. $1).<br />
+Ð’Ñ‹ также подтверждаете, что ÑвлÑетеÑÑŒ автором вноÑимых дополнений, или Ñкопировали их из иÑточника, допуÑкающего Ñвободное раÑпроÑтранение и изменение Ñвоего Ñодержимого (Ñм. $1).<br />
<strong>ÐЕ РÐЗМЕЩÐЙТЕ БЕЗ РÐЗРЕШЕÐИЯ ОХРÐÐЯЕМЫЕ ÐВТОРСКИМ ПРÐВОМ ÐœÐТЕРИÐЛЫ!</strong>',
'longpagewarning' => '<strong>ПРЕДУПРЕЖДЕÐИЕ: Длина Ñтой Ñтраницы ÑоÑтавлÑет $1 килобайт. Страницы, размер которых приближаетÑÑ Ðº 32 КБ или превышает Ñто значение, могут неверно отображатьÑÑ Ð² некоторых браузерах.
ПожалуйÑта, раÑÑмотрите вариант Ñ€Ð°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ñтраницы на меньшие чаÑти.</strong>',
@@ -704,13 +728,22 @@ $1',
'readonlywarning' => '<strong>ПРЕДУПРЕЖДЕÐИЕ: база данных заблокирована в ÑвÑзи Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð°Ð¼Ð¸ обÑлуживаниÑ,
поÑтому вы не можете запиÑать ваши Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ñмо ÑейчаÑ.
Возможно, вам Ñледует Ñохранить текÑÑ‚ в файл на Ñвоём диÑке и помеÑтить его в данный проект позже.</strong>',
-'protectedpagewarning' => '<strong>ПРЕДУПРЕЖДЕÐИЕ: Ñта Ñтраница была защищена, только админиÑтраторы проекта могут её редактировать.</strong>',
-'semiprotectedpagewarning' => "'''Замечание:''' Ñта ÑÑ‚Ð°Ñ‚ÑŒÑ Ð±Ñ‹Ð»Ð° защищена, только зарегиÑтрированные пользователи могут её редактировать.",
+'protectedpagewarning' => '<strong>ПРЕДУПРЕЖДЕÐИЕ: Ñта Ñтраница защищена от изменений, и только [[{{ns:project}}:ÐдминиÑтраторы|админиÑтраторы]] могут редактировать её. См. [[{{ns:project}}:Правила защиты Ñтраниц|правила защиты Ñтраниц]].</strong>',
+'semiprotectedpagewarning' => "'''Замечание:''' Ñта ÑÑ‚Ð°Ñ‚ÑŒÑ Ð±Ñ‹Ð»Ð° защищена; редактировать её могут только зарегиÑтрированные пользователи.",
'templatesused' => 'Шаблоны, иÑпользованные на Ñтой Ñтранице:',
-'edittools' => '<!-- Ð¢ÐµÐºÑ Ñ€Ð°Ñположенный здеÑÑŒ будет показыватьÑÑ Ð¿Ð¾Ð´ формой Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ формой загрузки. -->',
+'templatesusedpreview' => 'Шаблоны, иÑпользуемые в предпроÑматриваемой Ñтранице:',
+'templatesusedsection' => 'Шаблоны, иÑпользуемые в Ñтой Ñекции:',
+'edittools' => '<!-- РаÑположенный здеÑÑŒ текÑÑ‚ будет показыватьÑÑ Ð¿Ð¾Ð´ формой Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ формой загрузки. -->',
'nocreatetitle' => 'Создание Ñтраниц ограничено',
'nocreatetext' => 'Ðа Ñтом Ñайте ограничена возможноÑÑ‚ÑŒ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ñ‹Ñ… Ñтраниц.
-Ð’Ñ‹ можете вернутьÑÑ Ð½Ð°Ð·Ð°Ð´ и отредактировать ÑущеÑтвующую Ñтраницу, [[Special:Userlogin|предÑтавитьÑÑ ÑиÑтеме или Ñоздать новую учётную запиÑÑŒ]].',
+Ð’Ñ‹ можете вернутьÑÑ Ð½Ð°Ð·Ð°Ð´ и отредактировать ÑущеÑтвующую Ñтраницу, [[{{ns:special}}:Userlogin|предÑтавитьÑÑ ÑиÑтеме или Ñоздать новую учётную запиÑÑŒ]].',
+
+# "Undo" feature
+'undo-success' => 'Правка была отменена. ПожалуйÑта, нажмите «ЗапиÑать Ñтраницу», чтобы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñтупили в Ñилу.',
+'undo-failure' => 'Правка не может быть отменена из-за неÑовмеÑтимоÑти промежуточных изменений.',
+'undo-summary' => 'Отмена правки â„– $1 учаÑтника [[Special:Contributions/$2|$2]] ([[User talk:$2|обÑуждение]])',
+
+# Account creation failure
'cantcreateaccounttitle' => 'Ðевозможно Ñоздать учётную запиÑÑŒ',
'cantcreateaccounttext' => 'РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ð¾Ð²Ñ‹Ñ… учаÑтников Ñ Ñтого IP-адреÑа (<b>$1</b>) запрещена.
ВероÑтно, Ñто ÑвÑзано Ñ ÑиÑтематичеÑким вандализмом Ñ Ñтого адреÑа
@@ -727,7 +760,7 @@ $1',
'loadhist' => 'Загрузка журнала изменений Ñтраницы',
'currentrev' => 'Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ',
'revisionasof' => 'ВерÑÐ¸Ñ $1',
-'old-revision-navigation' => 'ВерÑÐ¸Ñ Ð¾Ñ‚ $1; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'ВерÑÐ¸Ñ Ð¾Ñ‚ $1; $2',
'previousrevision' => '↠ПредыдущаÑ',
'nextrevision' => 'Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ â†’',
'currentrevisionlink' => 'Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ',
@@ -737,18 +770,18 @@ $1',
'orig' => 'перв.',
'histlegend' => "ПоÑÑнениÑ: (текущ.) — отличие от текущей верÑии; (пред.) — отличие от предшеÑтвующей верÑии; '''м''' — малозначимое изменение",
'deletedrev' => '[удалена]',
-'histfirst' => 'Первый',
-'histlast' => 'ПоÑледний',
+'histfirst' => 'Ñтарейшие',
+'histlast' => 'недавние',
'rev-deleted-comment' => '(комментарий удалён)',
'rev-deleted-user' => '(Ð¸Ð¼Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð° Ñтёрто)',
'rev-deleted-text-permission' => '<div class="mw-warning plainlinks">
Эта верÑÐ¸Ñ Ñтраницы была удалена из общедоÑтупного архива.
-Возможно, объÑÑÐ½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ñ‹ в [{{fullurl:Special:Log/delete|page={{PAGENAMEE}}}} журнале удалений].
+Возможно, объÑÑÐ½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ñ‹ в [{{fullurl:{{ns:special}}:Log/delete|page={{PAGENAMEE}}}} журнале удалений].
</div>',
'rev-deleted-text-view' => '<div class="mw-warning plainlinks">
Эта верÑÐ¸Ñ Ñтраницы была удалена из общедоÑтупного архива.
Ð’Ñ‹ можете проÑмотреть её, так как ÑвлÑетеÑÑŒ админиÑтратором Ñайта.
-Возможно, объÑÑÐ½ÐµÐ½Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ñ‹ в [{{fullurl:Special:Log/delete|page={{PAGENAMEE}}}} журнале удалений].
+Возможно, объÑÑÐ½ÐµÐ½Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ñ‹ в [{{fullurl:{{ns:special}}:Log/delete|page={{PAGENAMEE}}}} журнале удалений].
</div>',
#'rev-delundel' => 'del/undel',
'rev-delundel' => 'показать/Ñкрыть',
@@ -758,7 +791,7 @@ $1',
'history-feed-item-nocomment' => '$1 в $2', # user at time
'history-feed-empty' => 'Запрашиваемой Ñтраницы не ÑущеÑтвует.
Она могла быть удалена или переименована.
-Попробуйте [[Special:Search|найти в вики]] похожие Ñтраницы.',
+Попробуйте [[{{ns:special}}:Search|найти в вики]] похожие Ñтраницы.',
# Revision deletion
#
@@ -789,6 +822,8 @@ $1',
'selectnewerversionfordiff' => 'Выберите новую верÑию Ð´Ð»Ñ ÑравнениÑ',
'selectolderversionfordiff' => 'Выберите Ñтарую верÑию Ð´Ð»Ñ ÑравнениÑ',
'compareselectedversions' => 'Сравнить выбранные верÑии',
+'editundo' => 'отменить',
+'diff-multi' => "({{plural:$1|$1 Ð¿Ñ€Ð¾Ð¼ÐµÐ¶ÑƒÑ‚Ð¾Ñ‡Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð½Ðµ показана|$1 промежуточные верÑии не показаны|$1 промежуточных верÑий не показаны.}})",
# Search results
#
@@ -812,8 +847,8 @@ $1',
'prevn' => 'предыдущие $1',
'nextn' => 'Ñледующие $1',
'viewprevnext' => 'ПроÑмотреть ($1) ($2) ($3).',
-'showingresults' => 'Ðиже показаны <strong>$1</strong> результатов, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ â„–&nbsp;<strong>$2</strong>.',
-'showingresultsnum' => 'Ðиже показаны <strong>$3</strong> результатов, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ â„–&nbsp;<strong>$2</strong>.',
+'showingresults' => 'Ðиже {{plural:$1|показан|показаны|показаны}} <strong>$1</strong> {{plural:$1|результат|результата|результатов}}, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ â„–&nbsp;<strong>$2</strong>.oubleredirect',
+'showingresultsnum' => 'Ðиже {{plural:$3|показан|показаны|показаны}} <strong>$3</strong> {{plural:$3|результат|результата|результатов}}, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ â„–&nbsp;<strong>$2</strong>.',
'nonefound' => 'Ðеудачный поиÑк может быть вызван попыткой найти общие Ñлова, которые не подлежат индекÑированию, например — «тоже» и «чтобы» или употреблением более чем одного ключевого Ñлова поиÑка (показываютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñтраницы, Ñодержащие вÑе указанные Ñлова Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка).',
'powersearch' => 'ИÑкать',
'powersearchtext' => 'ИÑкать в проÑтранÑтвах имён:<br />$1<br />$2 Показывать перенаправлениÑ<br /> ИÑкать $3 $9',
@@ -826,7 +861,7 @@ $1',
'preferences' => 'ÐаÑтройки',
'mypreferences' => 'Мои наÑтройки',
'prefsnologin' => 'Ð’Ñ‹ не предÑтавилиÑÑŒ ÑиÑтеме',
-'prefsnologintext' => 'Ð’Ñ‹ должны [[Special:Userlogin|предÑтавитьÑÑ ÑиÑтеме]], чтобы изменÑÑ‚ÑŒ наÑтройки учаÑтника.',
+'prefsnologintext' => 'Ð’Ñ‹ должны [[{{ns:special}}:Userlogin|предÑтавитьÑÑ ÑиÑтеме]], чтобы изменÑÑ‚ÑŒ наÑтройки учаÑтника.',
'prefsreset' => 'ВоÑÑтановлены наÑтройки по умолчанию.',
'qbsettings' => 'Панель навигации',
'changepassword' => 'Сменить пароль',
@@ -939,15 +974,15 @@ $1',
'reupload' => 'Изменить загрузку',
'reuploaddesc' => 'ВернутьÑÑ Ðº форме загрузки.',
'uploadnologin' => 'Ð’Ñ‹ не предÑтавилиÑÑŒ ÑиÑтеме',
-'uploadnologintext' => 'Ð’Ñ‹ должны [[Special:Userlogin|предÑтавитьÑÑ ÑиÑтеме]],
+'uploadnologintext' => 'Ð’Ñ‹ должны [[{{ns:special}}:Userlogin|предÑтавитьÑÑ ÑиÑтеме]],
чтобы загружать файлы на Ñервер.',
'upload_directory_read_only' => 'Веб-Ñервер не имеет прав запиÑи в папку ($1), в которой предполагаетÑÑ Ñ…Ñ€Ð°Ð½Ð¸Ñ‚ÑŒ загружаемые файлы.',
'uploaderror' => 'Ошибка загрузки файла',
'uploadtext' => "ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñту форму вы можете загрузить на Ñервер файлы.
Чтобы проÑмотреть ранее загруженные файлы,
-перейдите Ñюда: [[Special:Imagelist|ÑпиÑок загруженных изображений]].<br />
-Загрузка и удаление файлов отражаютÑÑ Ð² [[Special:Log|журнале загрузки файлов]].
+перейдите Ñюда: [[{{ns:special}}:Imagelist|ÑпиÑок загруженных изображений]].<br />
+Загрузка и удаление файлов отражаютÑÑ Ð² [[{{ns:special}}:Log|журнале загрузки файлов]].
Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² Ñтатью вы можете иÑпользовать Ñтроки вида:
*'''<nowiki>[[{{ns:image}}:File.jpg]]</nowiki>'''
@@ -975,10 +1010,10 @@ $1',
'illegalfilename' => 'Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° «$1» Ñодержит Ñимволы, которые не разрешаетÑÑ Ð¸Ñпользовать в заголовках. ПожалуйÑта, переименуйте файл и попытайтеÑÑŒ загрузить его Ñнова.',
'badfilename' => 'Ðазвание файла было изменено на $1.',
'badfiletype' => '«.$1» не ÑвлÑетÑÑ Ñ€ÐµÐºÐ¾Ð¼ÐµÐ½Ð´Ð¾Ð²Ð°Ð½Ð½Ñ‹Ð¼ форматом Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñми.',
-'largefile' => 'РекомендуетÑÑ Ð½Ðµ иÑпользовать файлы, размер которых не превышает $1 байт (размер загруженного файла ÑоÑтавлÑет $2 байт).',
-'largefileserver' => 'Размер файла больше уÑтановленного на Ñервере предела.',
+'large-file' => 'РекомендуетÑÑ Ð¸Ñпользовать изображениÑ, размер которых не превышает $1 байт (размер загруженного файла ÑоÑтавлÑет $2 байт).',
+'largefileserver' => 'Размер файла превышает макÑимально разрешённый.',
'emptyfile' => 'Загруженный вами файл вероÑтно пуÑтой. Возможно, Ñто произошло из-за ошибки при наборе имени файла. ПожалуйÑта, проверьте, дейÑтвительно ли вы хотите загрузить Ñтот файл.',
-'fileexists' => 'Файл Ñ Ñтим именем уже ÑущеÑтвует, пожалуйÑта, проверьте $1 еÑли вы не уверены что, хотите заменить его.',
+'fileexists' => 'Файл Ñ Ñтим именем уже ÑущеÑтвует, пожалуйÑта, проверьте $1, еÑли вы не уверены, что хотите заменить его.',
'fileexists-forbidden' => 'Файл Ñ Ñтим именем уже ÑущеÑтвует; пожалуйÑта, вернитеÑÑŒ назад и загрузите файл под другим именем. [[Image:$1|thumb|center|$1]]',
'fileexists-shared-forbidden' => 'Файл Ñ Ñтим именем уже ÑущеÑтвует в общем хранилище файлов; пожалуйÑта, вернитеÑÑŒ назад и загрузите файл под другим именем. [[Image:$1|thumb|center|$1]]',
'successfulupload' => 'Загрузка уÑпешно завершена',
@@ -987,7 +1022,7 @@ $1',
ПожалуйÑта, проÑледуйте по Ñледующей ÑÑылке: ($2) к Ñтранице Ñ Ð¾Ð¿Ð¸Ñанием и заполните информацию о файле, такую как: иÑточник файла, когда и кем был Ñоздан файл, а также любую другую информацию извеÑтную вам об Ñтом файле.',
'uploadwarning' => 'Предупреждение',
'savefile' => 'ЗапиÑать файл',
-'uploadedimage' => 'загружен «[[$1]]»',
+'uploadedimage' => 'загружено «[[$1]]»',
'uploaddisabled' => 'Загрузка запрещена.',
'uploaddisabledtext' => 'Ðа Ñтом вики-Ñайте загрузка файлов запрещена.',
'uploadscripted' => 'Файл Ñодержит HTML-код или Ñкрипт, который может быть ошибочно обработан браузером.',
@@ -998,6 +1033,18 @@ $1',
'watchthisupload' => 'Включить Ñтот файл в ÑпиÑок наблюдениÑ',
'filewasdeleted' => 'Файл Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвовал ранее, но был удалён. ПожалуйÑта, проверьте $1 перед повторной загрузкой.',
+'upload-proto-error' => 'Ðеправильный протокол',
+'upload-proto-error-text' => 'Ð£Ð´Ð°Ð»Ñ‘Ð½Ð½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° требует Ð°Ð´Ñ€ÐµÑ Ð½Ð°Ñ‡Ð¸Ð½Ð°ÑŽÑ‰Ð¸Ð¹ÑÑ Ñ <code>http://</code> или <code>ftp://</code>.',
+'upload-file-error' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°',
+'upload-file-error-text' => 'ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° при попытке Ñоздать временный файл на Ñервере. ПожалуйÑта, обратитеÑÑŒ к ÑиÑтемному админиÑтратору.',
+'upload-misc-error' => 'ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° загрузки',
+'upload-misc-error-text' => 'ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° загрузки. ПожалуйÑта, проверьте, что Ð°Ð´Ñ€ÐµÑ Ð²ÐµÑ€ÐµÐ½, и повторите попытку. ЕÑли проблема оÑтаётÑÑ, обратитеÑÑŒ к ÑиÑтемному админиÑтратору.',
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => "Ðевозможно обратить по указанному адреÑу.",
+'upload-curl-error6-text' => 'Ðевозможно обратить по указанному адреÑу. ПожалуйÑта, проверьте, что Ð°Ð´Ñ€ÐµÑ Ð²ÐµÑ€ÐµÐ½, а Ñайт доÑтупен.',
+'upload-curl-error28' => 'Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚Ð²ÐµÐ´Ñ‘Ð½Ð½Ð¾Ðµ на загрузку иÑтекло',
+'upload-curl-error28-text' => 'Сайт Ñлишком долго не отвечает. ПожалуйÑта, проверьте что Ñайт работоÑпоÑобен и поÑле небольшого перерыва попробуйте ещё раз. Возможно, операцию Ñледует провеÑти в другое времÑ, когда Ñайт менее нагружен.',
+
'license' => 'Лицензирование',
'nolicense' => 'ОтÑутÑтвует',
'upload_source_url' => ' (правильный, публично доÑтупный интернет-адреÑ)',
@@ -1007,7 +1054,7 @@ $1',
#
'imagelist' => 'СпиÑок файлов',
'imagelisttext' => "Ðиже предÑтавлен ÑпиÑок из '''$1''' {{plural:$1|файла|файлов|файлов}}, отÑортированных $2.",
-'imagelistforuser' => "Только Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð½Ñ‹Ðµ учаÑтником $1.",
+'imagelistforuser' => "Только изображениÑ, загруженные учаÑтником $1.",
'getimagelist' => 'получение ÑпиÑка файлов',
'ilsubmit' => 'ИÑкать',
'showlast' => 'Показать поÑледние $1 {{plural:$1|файл|файла|файлов}}, {{plural:$1|отÑортированный|отÑортированные|отÑортированных}} $2.',
@@ -1068,7 +1115,7 @@ $1',
'statistics' => 'СтатиÑтика',
'sitestats' => 'СтатиÑтика Ñайта',
'userstats' => 'СтатиÑтика учаÑтников',
-'sitestatstext' => "Суммарно в базе данных ÑодержитÑÑ '''$1''' {{plural:$1|Ñтраница|Ñтраницы|Ñтраниц}}.
+'sitestatstext' => "Ð’Ñего в базе данных ÑодержитÑÑ '''$1''' {{plural:$1|Ñтраница|Ñтраницы|Ñтраниц}}.
Это чиÑло включает в ÑÐµÐ±Ñ Ñтраницы о проекте, Ñтраницы обÑуждений, незаконченные Ñтатьи, Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ другие Ñтраницы, которые, не учитываютÑÑ Ð¿Ñ€Ð¸ подÑчёте количеÑтва Ñтатей.
За иÑключением них, еÑÑ‚ÑŒ '''$2''' {{plural:$2|Ñтраница|Ñтраницы|Ñтраниц}}, которые ÑчитаютÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ñ†ÐµÐ½Ð½Ñ‹Ð¼Ð¸ ÑтатьÑми.
@@ -1077,14 +1124,14 @@ $1',
Ð’Ñего Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° уÑтановки вики было Ñделано '''$3''' проÑмотров Ñтраниц и '''$4''' {{plural:$4|изменение|изменениÑ|изменений}} Ñтраниц. Таким образом, в Ñреднем приходитÑÑ '''$5''' {{plural:$5|изменение|изменениÑ|изменений}} на одну Ñтраницу, и '''$6''' проÑмотров на одно изменение.
Величина [http://meta.wikimedia.org/wiki/Help:Job_queue очереди заданий] ÑоÑтавлÑет '''$7'''.",
-'userstatstext' => "{{plural:$1|ЗарегиÑтрировалÑÑ|ЗарегиÑтрировалиÑÑŒ|ЗарегиÑтрировалиÑÑŒ}} '''$1''' {{plural:$1|учаÑтник|учаÑтника|учаÑтников}}, из которых '''$2''' ($4 %) ÑвлÑÑŽÑ‚ÑÑ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтраторами (Ñм. $3).",
+'userstatstext' => "{{plural:$1|ЗарегиÑтрировалÑÑ|ЗарегиÑтрировалиÑÑŒ|ЗарегиÑтрировалиÑÑŒ}} '''$1''' {{plural:$1|учаÑтник|учаÑтника|учаÑтников}}, из которых '''$2''' ($4 %) отноÑÑÑ‚ÑÑ Ðº группе «$5».",
'statistics-mostpopular' => 'Ðаиболее чаÑто проÑматриваемые Ñтраницы',
'disambiguations' => 'Страницы, опиÑывающие многозначные термины',
'disambiguationspage' => '{{ns:template}}:disambig',
'disambiguationstext' => 'Следующие Ñтатьи ÑÑылаютÑÑ Ð½Ð° <em>многозначные Ñтраницы</em>. ВмеÑто Ñтого они, вероÑтно, должны указывать на ÑоответÑтвующую конкретную Ñтатью.<br />Страница ÑчитаетÑÑ Ð¼Ð½Ð¾Ð³Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾Ð¹, еÑли на ней размещён $1.<br />СÑылки из других проÑтранÑтв имён здеÑÑŒ <em>не</em> приведены.',
'doubleredirects' => 'Двойные перенаправлениÑ',
-'doubleredirectstext' => 'ÐšÐ°Ð¶Ð´Ð°Ñ Ñтрока Ñодержит ÑÑылки на первое и второе перенаправлениÑ, а также первую Ñтрочку Ñтраницы второго перенаправлениÑ, в которой обычно указываетÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ Ñтраницы куда должно оÑущеÑтвлÑÑ‚ÑŒÑÑ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ. Ðужно чтобы и первое перенаправление ÑÑылалоÑÑŒ на Ñту Ñтраницу.',
+'doubleredirectstext' => 'ÐšÐ°Ð¶Ð´Ð°Ñ Ñтрока Ñодержит ÑÑылки на первое и второе перенаправлениÑ, а также первую Ñтрочку Ñтраницы второго перенаправлениÑ, в которой обычно указываетÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ Ñтраницы, куда должно оÑущеÑтвлÑÑ‚ÑŒÑÑ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ. Ðужно, чтобы и первое перенаправление ÑÑылалоÑÑŒ на Ñту Ñтраницу.',
'brokenredirects' => 'Разорванные перенаправлениÑ',
'brokenredirectstext' => 'Следующие Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°ÑŽÑ‚ на неÑущеÑтвующие Ñтатьи:',
@@ -1130,20 +1177,26 @@ $1',
'rclsub' => '(на Ñтраницах, ÑÑылки на которые еÑÑ‚ÑŒ на Ñтранице «$1»)',
'newpages' => 'Ðовые Ñтатьи',
'newpages-username' => 'УчаÑтник:',
-'ancientpages' => 'Самые Ñтарые Ñтатьи',
+'ancientpages' => 'Статьи по дате поÑледнего редактированиÑ',
'intl' => 'МежъÑзыковые ÑÑылки',
'move' => 'Переименовать',
'movethispage' => 'Переименовать Ñту Ñтраницу',
'unusedimagestext' => 'ПожалуйÑта, учтите, что другие веб-Ñайты могут иÑпользовать прÑмую ÑÑылку (URL) на Ñто изображение, и поÑтому изображение может активно иÑпользоватьÑÑ Ð½ÐµÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° его вхождение в Ñтот ÑпиÑок.',
'unusedcategoriestext' => 'СущеÑтвуют Ñледующие Ñтраницы категорий, не Ñодержащие Ñтатей или других категорий.',
+
+# Book sources
'booksources' => 'ИÑточники книг',
+'booksources-search-legend' => 'ПоиÑк информации о книге',
+'booksources-go' => 'Ðайти',
+'booksources-text' => 'Ðа Ñтой Ñтранице приведён ÑпиÑок ÑÑылок на Ñайты, где вы, возможно, найдёте дополнительную информацию о книге. Это интернет-магазины и ÑиÑтемы поиÑка в библиотечных каталогах.',
+
'categoriespagetext' => 'Ð’ вики имеютÑÑ Ñледующие категории.',
'data' => 'Данные',
'userrights' => 'Управление правами учаÑтников',
'groups' => 'Группы учаÑтников',
# FIXME: Other sites, of course, may have affiliate relations with the booksellers list
-'booksourcetext' => 'Ðиже приведён ÑпиÑок ÑÑылок на другие веб-Ñайты, на которых продаютÑÑ Ð½Ð¾Ð²Ñ‹Ðµ и бывшие в употреблении книги, а также на них может быть Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ книгах, которые вы ищете.',
+'booksourcetext' => '',
'isbn' => 'ISBN',
'alphaindexline' => 'от $1 до $2',
'version' => 'ВерÑÐ¸Ñ MediaWiki',
@@ -1154,16 +1207,16 @@ $1',
# Special:Allpages
'nextpage' => 'Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтраница ($1)',
+'prevpage' => 'ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñтраница ($1)',
'allpagesfrom' => 'ВывеÑти Ñтраницы, начинающиеÑÑ Ð½Ð°:',
'allarticles' => 'Ð’Ñе Ñтатьи',
-'allinnamespace' => 'Ð’Ñе Ñтраницы (проÑтранÑтва имён «$1»)',
'allnotinnamespace' => 'Ð’Ñе Ñтраницы (кроме проÑтранÑтва имён «$1»)',
'allpagesprev' => 'Предыдущие',
'allpagesnext' => 'Следующие',
-'allinnamespace' => 'Ð’Ñе Ñтраницы ($1 проÑтранÑтво имён)',
+'allinnamespace' => 'Ð’Ñе Ñтраницы (проÑтранÑтво имён «$1»)',
'allpagessubmit' => 'Выполнить',
'allpagesprefix' => 'Ðайти Ñтраницы, начинающиеÑÑ Ñ:',
-'allpagesbadtitle' => 'Заголовок данной Ñтраницы не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым либо Ñодержит интервики или межÑзыковый префикÑ. Возможно он Ñодержит Ñимволы запрещённые в заголовках.',
+'allpagesbadtitle' => 'Заголовок данной Ñтраницы не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым, он Ñодержит интервики, межÑзыковый Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¸Ð»Ð¸ запрещённые в заголовках Ñимволы.',
# Special:Listusers
'listusersfrom' => 'Показать учаÑтников, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ:',
@@ -1171,8 +1224,8 @@ $1',
# Email this user
#
'mailnologin' => 'ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ отÑутÑтвует',
-'mailnologintext' => 'Ð’Ñ‹ должны [[Special:Userlogin|предÑтавитьÑÑ ÑиÑтеме]]
-и иметь дейÑтвительный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в ваших [[Special:Preferences|наÑтройках]],
+'mailnologintext' => 'Ð’Ñ‹ должны [[{{ns:special}}:Userlogin|предÑтавитьÑÑ ÑиÑтеме]]
+и иметь дейÑтвительный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в ваших [[{{ns:special}}:Preferences|наÑтройках]],
чтобы иметь возможноÑÑ‚ÑŒ отправлÑÑ‚ÑŒ Ñлектронную почту другим учаÑтникам.',
'emailuser' => 'ПиÑьмо учаÑтнику',
'emailpage' => 'Отправить Ñлектронное пиÑьмо учаÑтнику',
@@ -1187,12 +1240,14 @@ $1',
'emailsubject' => 'Тема пиÑьма',
'emailmessage' => 'Сообщение',
'emailsend' => 'Отправить',
+'emailccme' => 'отправить мне копию Ñтого ÑообщениÑ',
+'emailccsubject'=> 'ÐšÐ¾Ð¿Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ $1: $2',
'emailsent' => 'ПиÑьмо отправлено',
'emailsenttext' => 'Ваше Ñлектронное Ñообщение отправлено.',
# Watchlist
-'watchlist' => 'CпиÑок наблюдениÑ',
+'watchlist' => 'СпиÑок наблюдениÑ',
'watchlistfor' => "(учаÑтника '''$1''')",
'nowatchlist' => 'Ваш ÑпиÑок Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ Ð¿ÑƒÑÑ‚.',
'watchlistanontext' => 'Ð’Ñ‹ должны $1, чтобы проÑмотреть или отредактировать ÑпиÑок наблюдениÑ.',
@@ -1200,9 +1255,9 @@ $1',
'clearwatchlist' => 'ОчиÑтить ÑпиÑок наблюдениÑ',
'watchlistcleartext' => 'Вы уверены, что хотите удалить их?',
'watchlistclearbutton' => 'ОчиÑтить ÑпиÑок наблюдениÑ',
-'watchlistcleardone' => 'Ваш ÑпиÑок Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½. $1 {{plural:$1|Ñтраница удалена|Ñтраницы удалено|Ñтраниц удалено}} из ÑпиÑка.',
+'watchlistcleardone' => 'Ваш ÑпиÑок Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½. $1 {{plural:$1|Ñтраница удалена|Ñтраницы удалены|Ñтраниц удалено}} из ÑпиÑка.',
'watchnologin' => 'Ðужно предÑтавитьÑÑ ÑиÑтеме',
-'watchnologintext' => 'Ð’Ñ‹ должны [[Special:Userlogin|предÑтавитьÑÑ ÑиÑтеме]], чтобы иметь возможноÑÑ‚ÑŒ изменÑÑ‚ÑŒ Ñвой ÑпиÑок наблюдениÑ',
+'watchnologintext' => 'Ð’Ñ‹ должны [[{{ns:special}}:Userlogin|предÑтавитьÑÑ ÑиÑтеме]], чтобы иметь возможноÑÑ‚ÑŒ изменÑÑ‚ÑŒ Ñвой ÑпиÑок наблюдениÑ',
'addedwatch' => 'Добавлена в ÑпиÑок наблюдениÑ',
'addedwatchtext' => "Страница «[[:$1]]» была добавлена в ваш [[{{ns:special}}:Watchlist|ÑпиÑок наблюдениÑ]]. ПоÑледующие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñтой Ñтраницы и ÑвÑзанной Ñ Ð½ÐµÐ¹ Ñтраницы обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ отмечатьÑÑ Ð² Ñтом ÑпиÑке, а также будут выделены жирным шрифтом на Ñтранице Ñо [[{{ns:special}}:Recentchanges|ÑпиÑком Ñвежих изменений]], чтобы их было легче заметить.
@@ -1216,8 +1271,8 @@ $1',
'notanarticle' => 'Ðе ÑтатьÑ',
'watchnochange' => 'Ðичто из ÑпиÑка Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ Ð½Ðµ изменÑлоÑÑŒ в раÑÑматриваемый период.',
'watchdetails' => '* Ð’ вашем ÑпиÑке Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ $1 {{plural:$1|Ñтраница|Ñтраницы|Ñтраниц}} (не ÑÑ‡Ð¸Ñ‚Ð°Ñ Ñтраниц обÑуждениÑ)
-* [[Special:Watchlist/edit|Показать и отредактировать полный ÑпиÑок]]
-* [[Special:Watchlist/clear|Удалить вÑе Ñтраницы из ÑпиÑка]]',
+* [[{{ns:special}}:Watchlist/edit|Показать и отредактировать полный ÑпиÑок]]
+* [[{{ns:special}}:Watchlist/clear|Удалить вÑе Ñтраницы из ÑпиÑка]]',
'wlheader-enotif' => '* Уведомление по Ñл. почте включено.',
'wlheader-showupdated' => "* Страницы, изменившиеÑÑ Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ поÑледнего их поÑещениÑ, выделены '''жирным''' шрифтом.",
'watchmethod-recent'=> 'проÑмотр поÑледних изменений Ð´Ð»Ñ Ð½Ð°Ð±Ð»ÑŽÐ´Ð°ÐµÐ¼Ñ‹Ñ… Ñтраниц',
@@ -1231,9 +1286,16 @@ $1',
'wlnote' => 'Ðиже Ñледуют поÑледние $1 {{plural:$1|изменение|изменениÑ|изменений}} за {{plural:$2|поÑледний|поÑледние|поÑледние}} <strong>$2</strong> {{plural:$2|чаÑ|чаÑа|чаÑов}}.',
'wlshowlast' => 'Показать за поÑледние $1 чаÑов $2 дней $3',
'wlsaved' => 'Это ÑÐ¾Ñ…Ñ€Ð°Ð½Ñ‘Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ÑпиÑка наблюдениÑ',
-'wlhideshowown' => '$1 ваши правки.',
-'wlhideshowbots' => '$1 правки ботов.',
+'watchlist-show-bots' => 'Показать правки ботов',
+'watchlist-hide-bots' => 'Скрыть правки ботов',
+'watchlist-show-own' => 'Показать Ñвои правки',
+'watchlist-hide-own' => 'Скрыть Ñвои правки',
+'watchlist-show-minor' => 'Показать малые правки',
+'watchlist-hide-minor' => 'Скрыть малые правки',
'wldone' => 'Сделано.',
+# Displayed when you click the "watch" button and it's in the process of watching
+'watching' => 'Добавление в ÑпиÑок наблюдениÑ…',
+'unwatching' => 'Удаление из ÑпиÑка наблюдениÑ…',
'enotif_mailer' => '{{SITENAME}} Служба извещений по почте',
'enotif_reset' => 'Отметить вÑе Ñтраницы как проÑмотренные',
@@ -1270,7 +1332,7 @@ $NEWPAGE
'deletepage' => 'Удалить Ñтраницу',
'confirm' => 'Подтверждение',
'excontent' => 'Ñодержимое: «$1»',
-'excontentauthor' => 'Ñодержимое: «$1» (единÑтвенным автором был $2)',
+'excontentauthor' => 'Ñодержимое: «$1» (единÑтвенным автором был [[{{ns:special}}:Contributions/$2|$2]])',
'exbeforeblank' => 'Ñодержимое до очиÑтки: «$1»',
'exblank' => 'Ñтраница была пуÑта',
'confirmdelete' => 'Подтвердить удаление',
@@ -1294,13 +1356,13 @@ $NEWPAGE
'rollbacklink' => 'откатить',
'rollbackfailed' => 'Ошибка при Ñовершении отката',
'cantrollback' => 'Ðевозможно откатить изменениÑ; поÑледний, кто вноÑил изменениÑ, ÑвлÑетÑÑ ÐµÐ´Ð¸Ð½Ñтвенным автором Ñтой Ñтатьи.',
-'alreadyrolled' => 'Ðевозможно откатить поÑледние Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ [[$1]],
+'alreadyrolled' => 'Ðевозможно откатить поÑледние Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ [[:$1]],
Ñделанные [[{{ns:user}}:$2|$2]] ([[{{ns:user_talk}}:$2|ОбÑуждение]]); кто-то другой уже отредактировал или откатил Ñту Ñтраницу.
ПоÑледние Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð½Ñ‘Ñ [[{{ns:user}}:$3|$3]] ([[{{ns:user_talk}}:$3|ОбÑуждение]]).',
# only shown if there is an edit comment
'editcomment' => 'Изменение было поÑÑнено так: <em>«$1»</em>.',
-'revertpage' => 'Правки [[Special:Contributions/$2|$2]] ([[User_talk:$2|обÑуждение]]) откачены к верÑии [[User:$1|$1]]',
+'revertpage' => 'Правки [[{{ns:special}}:Contributions/$2|$2]] ([[User_talk:$2|обÑуждение]]) откачены к верÑии [[User:$1|$1]]',
'sessionfailure' => 'Похоже, возникли проблемы Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼ ÑеанÑом работы;
Ñто дейÑтвие было отменено в целÑÑ… Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Â«Ð·Ð°Ñ…Ð²Ð°Ñ‚Ð° ÑеанÑа».
ПожалуйÑта, нажмите кнопку «Ðазад» и перезагрузите Ñтраницу, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ вы пришли.',
@@ -1321,7 +1383,7 @@ $NEWPAGE
'protect-text' => 'ЗдеÑÑŒ вы можете проÑмотреть и изменить уровень защиты Ð´Ð»Ñ Ñтраницы <strong>[[:$1]]</strong>.',
'protect-viewtext' => 'У Ð²Ð°Ñ Ð½ÐµÐ´Ð¾Ñтаточно прав Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ Ñтраницы. Текущие уÑтановки Ð´Ð»Ñ Ñтраницы <strong>[[:$1]]</strong>:',
'protect-default' => '(по умолчанию)',
-'protect-level-autoconfirmed' => 'Заблокировать незарегиÑтрированных учаÑтников',
+'protect-level-autoconfirmed' => 'Защитить от незарегиÑтрированных и новых учаÑтников',
'protect-level-sysop' => 'Только админиÑтраторы',
# restrictions (nouns)
@@ -1329,18 +1391,18 @@ $NEWPAGE
'restriction-move' => 'Переименование',
# Undelete
-'undelete' => 'ПроÑмотреть Ñтёртые Ñтраницы',
+'undelete' => 'ПроÑмотреть удалённые Ñтраницы',
'undeletepage' => 'ПроÑмотр и воÑÑтановление удалённых Ñтраниц',
-'viewdeletedpage' => 'ПроÑмотреть Ñтёртые Ñтраницы',
-'undeletepagetext' => 'Следующие Ñтраницы были Ñтёрты, но вÑÑ‘ ещё находÑÑ‚ÑÑ Ð² архиве и поÑтому могут быть воÑÑтановлены. Ðрхив периодичеÑки очищаетÑÑ.',
-'undeleteextrahelp' => "Ð”Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñтраницы оÑтавьте вÑе отметки пуÑтыми и нажмите '''«ВоÑÑтановить»'''. Ð”Ð»Ñ Ñ‡Ð°Ñтичного воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÑ‚ÑŒÑ‚Ðµ те верÑии Ñтраницы, которые нужно воÑтановить и нажмите '''«ВоÑÑтановить»'''. Ðажмите '''«ОчиÑтить»''', чтобы ÑнÑÑ‚ÑŒ вÑе отметки и очиÑтить поле комментариÑ.",
-'undeletearticle' => 'ВоÑÑтановить Ñтёртую Ñтатью',
+'viewdeletedpage' => 'ПроÑмотреть удалённые Ñтраницы',
+'undeletepagetext' => 'Следующие Ñтраницы были удалены, однако они вÑÑ‘ ещё находÑÑ‚ÑÑ Ð² архиве, и поÑтому могут быть воÑÑтановлены. Ðрхив периодичеÑки очищаетÑÑ.',
+'undeleteextrahelp' => "Ð”Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñтраницы оÑтавьте вÑе отметки пуÑтыми и нажмите '''«ВоÑÑтановить»'''. Ð”Ð»Ñ Ñ‡Ð°Ñтичного воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÑ‚ÑŒÑ‚Ðµ те верÑии Ñтраницы, которые нужно воÑÑтановить и нажмите '''«ВоÑÑтановить»'''. Ðажмите '''«ОчиÑтить»''', чтобы ÑнÑÑ‚ÑŒ вÑе отметки и очиÑтить поле комментариÑ.",
+'undeletearticle' => 'ВоÑÑтановить удалённую Ñтраницу',
'undeleterevisions' => 'Ð’ архиве $1 {{plural:$1|верÑиÑ|верÑии|верÑий}}',
-'undeletehistory' => 'ЕÑли вы воÑÑтановите Ñтраницу, вÑе верÑии будут также воÑÑтановлены, вмеÑте Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð¾Ð¼ изменений.
+'undeletehistory' => 'ЕÑли вы воÑÑтановите Ñтраницу, вÑе её верÑии будут также воÑÑтановлены вмеÑте Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð¾Ð¼ изменений.
ЕÑли Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð° Ñоздана Ð½Ð¾Ð²Ð°Ñ Ñтраница Ñ Ñ‚Ð°ÐºÐ¸Ð¼ же названием, воÑÑтановленные верÑии будут указаны в журнале изменений перед новыми запиÑÑми, и Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÑущеÑтвующей Ñтраницы автоматичеÑки заменена не будет.',
-'undeletehistorynoadmin' => 'Ð¡Ñ‚Ð°Ñ‚ÑŒÑ Ð±Ñ‹Ð»Ð° удалена. Причина ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸ ÑпиÑок учаÑтников редактировавших Ñтатью до её ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ‹ ниже.
-ТекÑÑ‚ удалённой Ñтатьи могут проÑмотреть только админиÑтраторы.',
+'undeletehistorynoadmin' => 'Ð¡Ñ‚Ð°Ñ‚ÑŒÑ Ð±Ñ‹Ð»Ð° удалена. Причина ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸ ÑпиÑок учаÑтников, редактировавших Ñтатью до её удалениÑ, показаны ниже. ТекÑÑ‚ удалённой Ñтатьи могут проÑмотреть только админиÑтраторы.',
'undeleterevision' => 'Ð¡Ñ‚Ñ‘Ñ€Ñ‚Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¾Ñ‚ $1',
+'undeleterevision-missing' => "ÐÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑиÑ. ÐžÑˆÐ¸Ð±Ð¾Ñ‡Ð½Ð°Ñ ÑÑылка, или ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñтраницы была удалена из архива.",
'undeletebtn' => 'ВоÑÑтановить',
'undeletereset' => 'ОчиÑтить',
'undeletecomment' => 'Комментарий:',
@@ -1351,7 +1413,7 @@ $NEWPAGE
'cannotundelete' => 'Ошибка воÑÑтановлениÑ. Возможно, кто-то другой уже воÑÑтановил Ñтраницу.',
'undeletedpage' => "<big>'''Страница «$1» была воÑÑтановлена.'''</big>
-Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра ÑпиÑка поÑледних удалений и воÑÑтановлений Ñм. [[Special:Log/delete|журнал удалений]].",
+Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра ÑпиÑка поÑледних удалений и воÑÑтановлений Ñм. [[{{ns:special}}:Log/delete|журнал удалений]].",
# Namespace form on various pages
'namespace' => 'ПроÑтранÑтво имён:',
@@ -1368,13 +1430,14 @@ $NEWPAGE
'uctop' => ' (поÑледнÑÑ)' ,
'newbies' => 'новичков',
-'sp-newimages-showfrom' => 'Показать новые изображениÑ, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ $1',
-
-'sp-contributions-newest' => 'Ðовейшие',
-'sp-contributions-oldest' => 'Старейшие',
-'sp-contributions-newer' => 'Более новые $1',
-'sp-contributions-older' => 'Более Ñтарые $1',
+'sp-contributions-newest' => 'недавние',
+'sp-contributions-oldest' => 'Ñтарейшие',
+'sp-contributions-newer' => 'Ñледующие $1',
+'sp-contributions-older' => 'предыдущие $1',
'sp-contributions-newbies-sub' => 'Вклад новичков',
+'sp-contributions-blocklog' => 'Журнал блокировок',
+
+'sp-newimages-showfrom' => 'Показать новые изображениÑ, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ $1',
# What links here
#
@@ -1400,11 +1463,12 @@ $NEWPAGE
'ipbreason' => 'Причина',
'ipbanononly' => 'Блокировать только анонимных учаÑтников',
'ipbcreateaccount' => 'Запретить Ñоздание новых учётных запиÑей',
+'ipbenableautoblock' => 'ÐвтоматичеÑки блокировать иÑпользованные учаÑтником IP-адреÑа',
'ipbsubmit' => 'Заблокировать Ñтот адреÑ/учаÑтника',
'ipbother' => 'Другое времÑ',
'ipboptions' => '15 минут:15 minutes,2 чаÑа:2 hours,6 чаÑов:6 hours,12 чаÑов:12 hours,1 день:1 day,3 днÑ:3 days,1 неделю:1 week,2 недели:2 weeks,1 меÑÑц:1 month,3 меÑÑца:3 months,6 меÑÑцев:6 months,1 год:1 year,не определено:infinite',
'ipbotheroption' => 'иное',
-'badipaddress' => 'IP-Ð°Ð´Ñ€ÐµÑ Ð·Ð°Ð¿Ð¸Ñан в неправильном формате или учаÑтника Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем не ÑущеÑтвует.',
+'badipaddress' => 'IP-Ð°Ð´Ñ€ÐµÑ Ð·Ð°Ð¿Ð¸Ñан в неправильном формате, или учаÑтника Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем не ÑущеÑтвует.',
'blockipsuccesssub' => 'Блокировка произведена',
'blockipsuccesstext' => '[[{{ns:Special}}:Contributions/$1|«$1»]] заблокирован.
<br />См. [[{{ns:special}}:Ipblocklist|ÑпиÑок заблокированных IP-адреÑов]].',
@@ -1418,6 +1482,7 @@ IP-адреÑа.',
'infiniteblock' => 'беÑÑÑ€Ð¾Ñ‡Ð½Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ°',
'expiringblock' => 'блокировка завершитÑÑ $1',
'anononlyblock' => 'только анонимов',
+'noautoblockblock' => 'автоблокировка отключена',
'createaccountblock' => 'Ñоздание учётных запиÑей заблокировано',
'ipblocklistempty' => 'СпиÑок блокировок пуÑÑ‚.',
'blocklink' => 'заблокировать',
@@ -1428,7 +1493,7 @@ IP-адреÑа.',
'blocklogentry' => '«[[$1]]» заблокирован на период $2',
'blocklogtext' => 'Это — журнал Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ Ñ€Ð°Ð·Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑƒÑ‡Ð°Ñтников. ÐвтоматичеÑки блокируемые IP-адреÑа здеÑÑŒ не указываютÑÑ. См. [[{{ns:special}}:Ipblocklist|СпиÑок текущих запретов и блокировок]].',
'unblocklogentry' => '«$1» разблокирован',
-'range_block_disabled' => 'СпоÑобноÑÑ‚ÑŒ админиÑтратора Ñоздавать диапазон Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°.',
+'range_block_disabled' => 'ÐдминиÑтраторам запрещено блокировать диапазоны.',
'ipb_expiry_invalid' => 'ÐедопуÑтимый период дейÑтвиÑ.',
'ipb_already_blocked' => '«$1» уже заблокирован.',
'ip_range_invalid' => 'ÐедопуÑтимый диапазон IP-адреÑов.\n',
@@ -1436,9 +1501,8 @@ IP-адреÑа.',
'ipb_cant_unblock' => 'Ошибка. Блокировка Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€Ð¾Ð¼ «$1» не найдена. Возможно, учаÑтника уже разблокировали.',
'proxyblockreason' => 'Ваш IP-Ð°Ð´Ñ€ÐµÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½ потому что Ñто открытый прокÑи. ПожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð²Ð°ÑˆÐ¸Ð¼ интернет-провайдером или Ñлужбой поддержки и Ñообщите им об Ñтой Ñерьёзной проблеме безопаÑноÑти.',
'proxyblocksuccess' => 'Выполнено.',
-'sorbs' => 'SORBS DNSBL',
-'sorbsreason' => 'Ваш IP-Ð°Ð´Ñ€ÐµÑ Ñ‡Ð¸ÑлитÑÑ ÐºÐ°Ðº открытый прокÑи в [http://www.sorbs.net SORBS] DNSBL.',
-'sorbs_create_account_reason' => 'Ваш IP-Ð°Ð´Ñ€ÐµÑ Ñ‡Ð¸ÑлитÑÑ ÐºÐ°Ðº открытый прокÑи в [http://www.sorbs.net SORBS] DNSBL. Ð’Ñ‹ не можете Ñоздать учётную запиÑÑŒ.',
+'sorbsreason' => 'Ваш IP-Ð°Ð´Ñ€ÐµÑ Ñ‡Ð¸ÑлитÑÑ ÐºÐ°Ðº открытый прокÑи в DNSBL.',
+'sorbs_create_account_reason' => 'Ваш IP-Ð°Ð´Ñ€ÐµÑ Ñ‡Ð¸ÑлитÑÑ ÐºÐ°Ðº открытый прокÑи в DNSBL. Ð’Ñ‹ не можете Ñоздать учётную запиÑÑŒ.',
# Developer tools
#
@@ -1460,7 +1524,7 @@ IP-адреÑа.',
'lockdbsuccesssub' => 'База данных заблокирована',
'unlockdbsuccesssub' => 'База данных разблокирована',
'lockdbsuccesstext' => 'База данных проекта была заблокирована.
-<br />Ðе забудьте [[Special:Unlockdb|убрать блокировку]] поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹ обÑлуживаниÑ.',
+<br />Ðе забудьте [[{{ns:special}}:Unlockdb|убрать блокировку]] поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹ обÑлуживаниÑ.',
'unlockdbsuccesstext' => 'База данных проекта была разблокирована.',
'lockfilenotwritable' => 'Ðет права на запиÑÑŒ в файл блокировки базы данных. Чтобы заблокировать или разблокировать БД, веб-Ñервер должен иметь разрешение на запиÑÑŒ в Ñтот файл.',
'databasenotlocked' => 'База данных не была заблокирована.',
@@ -1491,13 +1555,13 @@ IP-адреÑа.',
'movepage' => 'Переименовать Ñтраницу',
'movepagetext' => 'ВоÑпользовавшиÑÑŒ формой ниже, вы переименуете Ñтраницу, одновременно перемеÑтив на новое меÑто её журнал изменений.
Старое название Ñтанет перенаправлением на новое название.
-СÑылки на Ñтарое название не будут изменены (пожалуйÑта проверьте наличие [[Special:DoubleRedirects|двойных]] и [[Special:BrokenRedirects|разорванных]] перенаправлений).
+СÑылки на Ñтарое название не будут изменены (пожалуйÑта, проверьте наличие [[{{ns:special}}:DoubleRedirects|двойных]] и [[{{ns:special}}:BrokenRedirects|разорванных]] перенаправлений).
Ð’Ñ‹ обÑзаны убедитьÑÑ Ð² том, что ÑÑылки и далее указывают туда, куда предполагалоÑÑŒ.
-Обратите внимание, что Ñтраница \'\'\'не будет\'\'\' переименована, еÑли Ñтраница Ñ Ð½Ð¾Ð²Ñ‹Ð¼ названием уже ÑущеÑтвует (кроме Ñлучаев, еÑли она ÑвлÑетÑÑ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ или пуÑта и и не имеет иÑтории правок). Это означает, что вы можете переименовать Ñтраницу обратно в то название, которое у него только что было, еÑли вы переименовали по ошибке, но вы не можете Ñлучайно затереть ÑущеÑтвующую Ñтраницу.
+Обратите внимание, что Ñтраница \'\'\'не будет\'\'\' переименована, еÑли Ñтраница Ñ Ð½Ð¾Ð²Ñ‹Ð¼ названием уже ÑущеÑтвует (кроме Ñлучаев, еÑли она ÑвлÑетÑÑ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ или пуÑта и не имеет иÑтории правок). Это означает, что вы можете переименовать Ñтраницу обратно в то название, которое у него только что было, еÑли вы переименовали по ошибке, но вы не можете Ñлучайно затереть ÑущеÑтвующую Ñтраницу.
\'\'\'ПРЕДУПРЕЖДЕÐИЕ!\'\'\'
-Переименование может привеÑти к маÑштабным и неожиданным изменениÑм Ð´Ð»Ñ \'\'популÑрных\'\' Ñтраниц. ПожалуйÑта, прежде, чем вы продолжите, убедитеÑÑŒ, что вы понимаете вÑе возможные поÑледÑтвиÑ.',
+Переименование может привеÑти к маÑштабным и неожиданным изменениÑм Ð´Ð»Ñ \'\'популÑрных\'\' Ñтраниц. ПожалуйÑта, прежде чем вы продолжите, убедитеÑÑŒ, что вы понимаете вÑе возможные поÑледÑтвиÑ.',
'movepagetalktext' => 'ПриÑÐ¾ÐµÐ´Ð¸Ð½Ñ‘Ð½Ð½Ð°Ñ Ñтраница обÑуждениÑ, еÑли Ñ‚Ð°ÐºÐ¾Ð²Ð°Ñ ÐµÑÑ‚ÑŒ,
будет также автоматичеÑки переименована, \'\'\'кроме Ñлучаев, когда:\'\'\'
@@ -1508,7 +1572,7 @@ IP-адреÑа.',
еÑли Ñто нужно.',
'movearticle' => 'Переименовать Ñтраницу',
'movenologin' => 'Ð’Ñ‹ не предÑтавилиÑÑŒ ÑиÑтеме',
-'movenologintext' => 'Ð’Ñ‹ должны [[Special:Userlogin|предÑтавитьÑÑ ÑиÑтеме]],
+'movenologintext' => 'Ð’Ñ‹ должны [[{{ns:special}}:Userlogin|предÑтавитьÑÑ ÑиÑтеме]],
чтобы иметь возможноÑÑ‚ÑŒ переименовать Ñтраницы.',
'newtitle' => 'Ðовое название',
'movepagebtn' => 'Переименовать Ñтраницу',
@@ -1533,7 +1597,7 @@ IP-адреÑа.',
'delete_and_move_text' =>
'==ТребуетÑÑ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ðµ==
-Страница Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ [[$1|«$1»]] уже ÑущеÑтвует. Хотите ли вы удалить её, чтобы Ñделать возможным переименование?',
+Страница Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ [[$1|«$1»]] уже ÑущеÑтвует. Ð’Ñ‹ хотите её удалить, чтобы Ñделать возможным переименование?',
'delete_and_move_reason' => 'Удалено Ð´Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñти переименованиÑ',
'delete_and_move_confirm' => 'Да, удалить Ñту Ñтраницу',
'selfmove' => 'Ðевозможно переименовать Ñтраницу: иÑходное и новое Ð¸Ð¼Ñ Ñтраницы Ñовпадают.',
@@ -1542,14 +1606,14 @@ IP-адреÑа.',
# Export
'export' => 'ЭкÑпортирование Ñтатей',
-'exporttext' => 'Ð’Ñ‹ можете ÑкÑпортировать текÑÑ‚ и журнал изменений конкретной Ñтраницы или набора Ñтраниц в XML, который потом может быть импортирован в другой вики-проект, работающую на программном обеÑпечении MediaWiki.
+'exporttext' => 'Ð’Ñ‹ можете ÑкÑпортировать текÑÑ‚ и журнал изменений конкретной Ñтраницы или набора Ñтраниц в XML, который потом может быть импортирован в другой вики-проект, работающий на программном обеÑпечении MediaWiki.
Чтобы ÑкÑпортировать Ñтатьи, введите их Ð½Ð°Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² поле редактированиÑ, одно название на Ñтроку, и выберите хотите ли вы ÑкÑпортировать вÑÑŽ иÑторию изменений Ñтатей или только поÑледние верÑии Ñтатей.
Ð’Ñ‹ также можете иÑпользовать Ñпециальный Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ ÑкÑпорта только поÑледней верÑии. Ðапример Ð´Ð»Ñ Ñтраницы «{{int:mainpage}}» Ñто будет Ð°Ð´Ñ€ÐµÑ [[{{ns:Special}}:Export/{{int:mainpage}}]].',
'exportcuronly' => 'Включать только текущую верÑию, без полной предыÑтории',
'exportnohistory' => "----
-'''Замечание:''' ÑкÑпорт полной иÑтории изменений Ñтраниц отключён из-за проблем Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью.",
+'''Замечание:''' ÑкÑпорт полной иÑтории изменений Ñтраниц отключен из-за проблем Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью.",
'export-submit' => 'ЭкÑпортировать',
# Namespace 8 related
@@ -1560,8 +1624,8 @@ IP-адреÑа.',
'allmessagescurrent' => 'Текущий текÑÑ‚',
'allmessagestext' => 'Ðиже предÑтавлен ÑпиÑок ÑиÑтемных Ñообщений, доÑтупных в проÑтранÑтве имён «MediaWiki».',
'allmessagesnotsupportedUI' => 'Текущий уÑтановленный Ñзык <strong>$1</strong> не поддерживаетÑÑ Special:Allmessages на Ñтом Ñайте.',
-'allmessagesnotsupportedDB' => "'''Special:Allmessages''' не поддерживаетÑÑ Ñ‚Ð°Ðº как отключена Ð¾Ð¿Ñ†Ð¸Ñ '''wgUseDatabaseMessages'''.",
-'allmessagesfilter' => 'Фильтр по имени ÑообщениÑ:',
+'allmessagesnotsupportedDB' => "'''Special:Allmessages''' не поддерживаетÑÑ, так как отключена Ð¾Ð¿Ñ†Ð¸Ñ '''wgUseDatabaseMessages'''.",
+'allmessagesfilter' => 'Фильтр в формате регулÑрного выражениÑ:',
'allmessagesmodified' => 'Показать только изменённые',
# Thumbnails
@@ -1576,7 +1640,7 @@ IP-адреÑа.',
'importinterwiki' => 'Межвики импорт',
'import-interwiki-text' => 'Укажите вики и название импортируемой Ñтраницы.
Даты изменений и имена авторов будут Ñохранены.
-Ð’Ñе операции межвики импорта региÑтрируютÑÑ Ð² [[Special:Log/import|ÑоответÑтвующем журнале]].',
+Ð’Ñе операции межвики импорта региÑтрируютÑÑ Ð² [[{{ns:special}}:Log/import|ÑоответÑтвующем журнале]].',
'import-interwiki-history' => 'Копировать вÑÑŽ иÑторию изменений Ñтой Ñтраницы',
'import-interwiki-submit' => 'Импортировать',
'import-interwiki-namespace' => 'Помещать Ñтраницы в проÑтранÑтво имён:',
@@ -1599,7 +1663,7 @@ IP-адреÑа.',
# import log
'importlogpage' => 'Журнал импорта',
'importlogpagetext' => 'Импортирование админиÑтраторами Ñтраниц Ñ Ð¸Ñторией изменений из других вики.',
-'import-logentry-upload' => '«$1» — импорт из файла',
+'import-logentry-upload' => '«[[$1]]» — импорт из файла',
'import-logentry-upload-detail' => '$1 верÑий',
'import-logentry-interwiki' => '«$1» — межвики импорт',
'import-logentry-interwiki-detail' => '$1 верÑий из $2',
@@ -1623,8 +1687,8 @@ IP-адреÑа.',
'tooltip-watch' => 'Добавить текущую Ñтраницу в ÑпиÑок Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ [alt-w]',
# stylesheets
-'Common.css' => '/** Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ ÐºÐ¾ вÑем темам Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ */',
-'Monobook.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ Ðº теме Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Monobook */
+'common.css' => '/** Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ ÐºÐ¾ вÑем темам Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ */',
+'monobook.css' => '/* Размещённый здеÑÑŒ CSS будет применÑÑ‚ÑŒÑÑ Ðº теме Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Monobook */
/*
Это нужно чтобы в окошке поиÑка кнопки не разбивалиÑÑŒ на 2 Ñтроки
@@ -1637,7 +1701,7 @@ IP-адреÑа.',
padding-right: 0em;
font-weight: bold;
}',
-#'Monobook.js' => '/* edit this file to change js things in the monobook skin */',
+#'monobook.js' => '/* edit this file to change js things in the monobook skin */',
# Metadata
'nodublincore' => 'Метаданные Dublin Core RDF запрещены Ð´Ð»Ñ Ñтого Ñервера.',
@@ -1661,12 +1725,13 @@ The wiki server can\'t provide data in a format your client can read.',
'spamprotectiontitle' => 'Спам-фильтр',
'spamprotectiontext' => 'Страница, которую вы пытаетеÑÑŒ Ñохранить, заблокирована Ñпам-фильтром. ВероÑтнее вÑего она Ñодержит ÑÑылку на внешний Ñайт.',
-'spamprotectionmatch' => 'Следующее Ñообщение было получено от Ñпам-фильтра: $1',
-'subcategorycount' => 'Ð’ Ñтой категории $1 {{PLURAL:$1|подкатегориÑ|подкатегории|подкатегорий}}',
-'categoryarticlecount' => 'Ð’ Ñтой категории $1 {{PLURAL:$1|ÑтатьÑ|Ñтатьи|Ñтатей}}',
+'spamprotectionmatch' => 'Следующее Ñообщение было получено от Ñпам-фильтра: $1.',
+'subcategorycount' => 'Ð’ Ñтой категории $1 {{PLURAL:$1|подкатегориÑ|подкатегории|подкатегорий}}.',
+'category-media-count' => "Ð’ Ñтой категории $1 {{PLURAL:$1|файл|файла|файлов}}.",
+'categoryarticlecount' => 'Ð’ Ñтой категории $1 {{PLURAL:$1|ÑтатьÑ|Ñтатьи|Ñтатей}}.',
'listingcontinuesabbrev' => ' (продолжение)',
'spambot_username' => 'ЧиÑтка Ñпама',
-'spam_reverting' => 'Откат к поÑледней верÑии не Ñодержащей ÑÑылки на $1',
+'spam_reverting' => 'Откат к поÑледней верÑии, не Ñодержащей ÑÑылки на $1',
'spam_blanking' => 'Ð’Ñе верÑии Ñодержат ÑÑылки на $1, очиÑтка',
# Info page
@@ -1694,9 +1759,10 @@ The wiki server can\'t provide data in a format your client can read.',
'rcpatroldisabledtext' => 'ВозможноÑÑ‚ÑŒ Ð¿Ð°Ñ‚Ñ€ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñледних изменений в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°.',
'markedaspatrollederror' => "Ðевозможно отметить как проверенную",
'markedaspatrollederrortext' => "Ð’Ñ‹ должны указать редакцию, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ отмечена как провереннаÑ.",
+'markedaspatrollederror-noautopatrol' => 'Вам не разрешено отмечать ÑобÑтвенные правки как проверенные.',
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'ÐœÐ¾Ñ Ñтраница пользователÑ\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Страница Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¼Ð¾ÐµÐ³Ð¾ IP\');
@@ -1707,7 +1773,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'СпиÑок Ñтраниц моего
ta[\'pt-mycontris\'] = new Array(\'y\',\'СпиÑок Ñтраниц, которые Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð»\');
ta[\'pt-login\'] = new Array(\'o\',\'ЗдеÑÑŒ можно зарегиÑтрироватьÑÑ Ð² ÑиÑтеме, но Ñто необÑзательно\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'ЗдеÑÑŒ можно зарегиÑтрироватьÑÑ Ð² ÑиÑтеме, но Ñто необÑзательно\');
-ta[\'pt-logout\'] = new Array(\'o\',\'ОтказатьÑÑ Ð¾Ñ‚ региÑтрации\');
+ta[\'pt-logout\'] = new Array(\'\',\'ОтказатьÑÑ Ð¾Ñ‚ региÑтрации\');
ta[\'ca-talk\'] = new Array(\'t\',\'ОбÑуждение Ñтатьи\');
ta[\'ca-edit\'] = new Array(\'e\',\'Эту Ñтатью можно изменÑÑ‚ÑŒ. Перед Ñохранением изменений, пожалуйÑта, нажмите кнопку предварительного проÑмотра Ð´Ð»Ñ Ð²Ð¸Ð·ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð¹ проверки результата\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Добавить комментарий к обÑуждению\');
@@ -1749,12 +1815,15 @@ ta[\'ca-nstab-template\'] = new Array(\'c\',\'Страница шаблона\')
ta[\'ca-nstab-help\'] = new Array(\'c\',\'Страница Ñправки\');
ta[\'ca-nstab-category\'] = new Array(\'c\',\'Страница категории\');',
+# Common.js: contains nothing but a placeholder comment
+'common.js' => '/* Размещённый здеÑÑŒ код JavaScript будет загружен вÑем пользователÑм при обращении к какой-либо Ñтранице */',
+
# image deletion
'deletedrevision' => 'Удалена ÑÑ‚Ð°Ñ€Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ $1.',
# browsing diffs
'previousdiff' => '↠К предыдущему изменению',
-'nextdiff' => 'К Ñлед. изменению →',
+'nextdiff' => 'К Ñледующему изменению →',
'imagemaxsize' => 'Ограничивать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° Ñтранице изображений до:',
'thumbsize' => 'Размер уменьшенной верÑии изображениÑ:',
@@ -2075,20 +2144,29 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'Страница категориÐ
# E-mail address confirmation
'confirmemail' => 'Подтверждение адреÑа Ñлектронной почты',
-'confirmemail_noemail' => 'Ð’Ñ‹ не задали Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в [[Special:Preferences|наÑтройках]], либо он некорректен.',
+'confirmemail_noemail' => 'Ð’Ñ‹ не задали Ð°Ð´Ñ€ÐµÑ Ñлектронной почты в [[{{ns:special}}:Preferences|наÑтройках]], либо он некорректен.',
'confirmemail_text' => 'Вики-движок требует Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð°Ð´Ñ€ÐµÑа Ñлектронной почты перед тем, как начать Ñ Ð½Ð¸Ð¼ работать.
Ðажмите на кнопку, чтобы на указанный Ð°Ð´Ñ€ÐµÑ Ð±Ñ‹Ð»Ð¾ отправлено пиÑьмо, Ñодержащее ÑÑылку на Ñпециальную Ñтраницу, поÑле Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ в браузере Ð°Ð´Ñ€ÐµÑ Ñлектронной почты будет ÑчитаетÑÑ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´Ñ‘Ð½Ð½Ñ‹Ð¼.',
-
+'confirmemail_pending' => '<div class="error">
+ПиÑьмо Ñ ÐºÐ¾Ð´Ð¾Ð¼ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ ÑƒÐ¶Ðµ было отправлено.
+ЕÑли вы недавно Ñоздали учётную запиÑÑŒ, то, вероÑтно,
+вам Ñледует подождать неÑколько минут пока пиÑьмо придёт перед тем, как запроÑить код ещё раз.
+</div>',
'confirmemail_send' => 'Отправить пиÑьмо Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом на подтверждение',
'confirmemail_sent' => 'ПиÑьмо Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом на подтверждение отправлено.',
-'confirmemail_sendfailed' => 'Ðевозможно отправить пиÑьмо Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом на подтверждение. Проверьте правильноÑÑ‚ÑŒ адреÑа Ñлектронной почты.',
-'confirmemail_invalid' => 'Ðеправильный код подтверждениÑ, или Ñрок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ¾Ð´Ð° иÑтёк.',
+'confirmemail_oncreate' => 'ПиÑьмо Ñ ÐºÐ¾Ð´Ð¾Ð¼ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¾ отправлено на указанный вами почтовый Ñщик.
+Данный код не требуетÑÑ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в ÑиÑтему, однако вы должны указать его,
+прежде чем будет разрешено иÑпользование возможноÑтей Ñлектронной почты в Ñтом проекте.',
+'confirmemail_sendfailed' => 'Ðевозможно отправить пиÑьмо Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом на подтверждение. Проверьте правильноÑÑ‚ÑŒ адреÑа Ñлектронной почты.
+
+Ответ Ñервера: $1',
+'confirmemail_invalid' => 'Ðеправильный код Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ñрок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ¾Ð´Ð° иÑтёк.',
'confirmemail_needlogin' => 'Ð’Ñ‹ должны $1 Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ адреÑа Ñлектронной почты.',
'confirmemail_success' => 'Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты подтверждён.',
'confirmemail_loggedin' => 'Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты подтверждён.',
'confirmemail_error' => 'Во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð°Ð´Ñ€ÐµÑа Ñлектронной почты произошла ошибка.',
-'confirmemail_subject' => '{{SITENAME}}:Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð°Ð´Ñ€ÐµÑа Ñл. почты',
+'confirmemail_subject' => '{{SITENAME}}:Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° подтверждение адреÑа Ñл. почты',
'confirmemail_body' => 'Кто-то Ñ IP-адреÑом $1 зарегиÑтрировал на Ñервере проекта {{SITENAME}} учётную запиÑÑŒ
«$2», указав ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты.
@@ -2136,7 +2214,7 @@ $1
'confirm_purge_button' => 'OK',
'youhavenewmessagesmulti' => "Ð’Ñ‹ получили новые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° $1",
-'newtalkseperator' => ',_',
+
'searchcontaining' => "ПоиÑк Ñтатей, Ñодержащих «$1».",
'searchnamed' => "ПоиÑк Ñтатей называющихÑÑ Â«$1».",
'articletitles' => "Статьи, начинающиеÑÑ Ñ Â«$1»",
@@ -2163,6 +2241,19 @@ $1
'table_pager_limit' => 'Показать $1 Ñлементов на Ñтранице',
'table_pager_limit_submit' => 'Выполнить',
'table_pager_empty' => 'Ðе найдено',
+
+# Auto-summaries
+'autosumm-blank' => 'ПолноÑтью удалено Ñодержимое Ñтраницы',
+'autosumm-replace' => 'Содержимое Ñтраницы заменено на «$1»',
+'autoredircomment' => 'Перенаправление на [[$1]]',
+'autosumm-new' => 'ÐоваÑ: $1',
+
+# Size units
+'size-bytes' => '$1 байт',
+'size-kilobytes' => '$1 КБ',
+'size-megabytes' => '$1 МБ',
+'size-gigabytes' => '$1 ГБ',
+
);
?>
diff --git a/languages/messages/MessagesSk.php b/languages/messages/MessagesSk.php
index 264e4f79..825a33c2 100644
--- a/languages/messages/MessagesSk.php
+++ b/languages/messages/MessagesSk.php
@@ -170,7 +170,7 @@ $messages = array(
'tog-numberheadings' => 'Automaticky Äísluj odstavce',
'tog-showtoolbar' => 'Zobrazuj upravovací panel nástrojov',
'tog-editondblclick' => 'Upravuj stránky po dvojitom kliknutí (JavaScript)',
-'tog-editsection' => 'Umožni upravovať sekcie cez [uprav] odkazy',
+'tog-editsection' => 'Umožni upravovať sekcie cez odkazy [úprava]',
'tog-editsectiononrightclick'=> 'Umožni upravovaÅ¥ sekcie po kliknutí pravým tlaÄidlom na nadpisy sekcií (JavaScript)',
'tog-showtoc' => 'Zobraz obsah (pre stránky s viac ako 3 nadpismi)',
'tog-rememberpassword' => 'Pamätaj si heslo aj nabudúce',
@@ -191,10 +191,13 @@ $messages = array(
'tog-externaldiff' => 'Používaj štandardne externý diff',
'tog-showjumplinks' => 'Používaj odkazy „skoÄiÅ¥ na“ pre lepÅ¡iu dostupnosÅ¥',
'tog-uselivepreview' => 'Použitie živého náhľadu (JavaScript) (experimentálna funkcia)',
-'tog-autopatrol' => 'OznaÄ Ãºpravy, ktoré urobím ako strážené',
+'tog-autopatrol' => 'OznaÄ Ãºpravy, ktoré urobím, ako strážené',
'tog-forceeditsummary' => 'Upozorni ma, keÄ neuvádzam zhrnutie úprav',
'tog-watchlisthideown' => 'Skry moje úpravy zo zoznamu sledovaných',
'tog-watchlisthidebots' => 'Skry úpravy botov zo zoznamu sledovaných',
+'tog-nolangconversion' => 'Vypni konverziu variantov',
+'tog-ccmeonemails' => 'Pošli mi kópie mojich emailov, ktoré pošlem ostatným používateľom',
+
'underline-always' => 'Vždy',
'underline-never' => 'Nikdy',
'underline-default' => 'Å tandardné nastavenie prehliadaÄa',
@@ -206,6 +209,13 @@ $messages = array(
'thursday' => 'Å¡tvrtok',
'friday' => 'piatok',
'saturday' => 'sobota',
+'sun' => 'Ned',
+'mon' => 'Pon',
+'tue' => 'Uto',
+'wed' => 'Str',
+'thu' => 'Å tv',
+'fri' => 'Pia',
+'sat' => 'Sob',
'january' => 'január',
'february' => 'február',
'march' => 'marec',
@@ -243,8 +253,10 @@ $messages = array(
'nov' => 'nov',
'dec' => 'dec',
'categories' => '{{PLURAL:$1|Kategória|Kategórie|Kategórie}}',
-'category_header' => 'Älánky v kategórii „$1“',
+'pagecategories' => '{{PLURAL:$1|Kategória|Kategórie|Kategórie}}',
+'category_header' => 'stránky v kategórii „$1“',
'subcategories' => 'Podkategórie',
+'category-media-header' => 'Multimediálne súbory v kategórii "$1"',
'mainpage' => 'Hlavná stránka',
'mainpagetext' => 'Wiki softvér bol úspešne nainštalovaný.',
'mainpagedocfooter' => 'Pre pomoc a konfiguraÄné nastavenia prosím pozrite [http://meta.wikimedia.org/wiki/MediaWiki_i18n documentation on customizing the interface] a [http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide User\'s Guide].',
@@ -292,7 +304,7 @@ $messages = array(
'searchbutton' => 'Hľadaj',
'go' => 'ChoÄ',
'searcharticle' => 'ChoÄ',
-'history' => 'história Älánku',
+'history' => 'história stránky',
'history_short' => 'História',
'updatedmarker' => 'aktualizované od mojej poslednej návštevy',
'info_short' => 'Informácie',
@@ -302,31 +314,31 @@ $messages = array(
'edit' => 'úprava',
'editthispage' => 'Upravuj túto stránku',
'delete' => 'Vymaž',
-'deletethispage' => 'Vymaž tento Älánok',
+'deletethispage' => 'Vymaž túto stránku',
'undelete_short' => 'Obnov $1 úprav',
'protect' => 'Zamkni',
-'protectthispage' => 'Zamkni tento Älánok',
+'protectthispage' => 'Zamkni túto stránku',
'unprotect' => 'Odomkni',
-'unprotectthispage' => 'Odomkni tento Älánok',
-'newpage' => 'Nový Älánok',
-'talkpage' => 'Diskusia k Älánku',
+'unprotectthispage' => 'Odomkni túto stránku',
+'newpage' => 'Nová stránka',
+'talkpage' => 'Diskusia k stránke',
'specialpage' => 'Špeciálna stránka',
'personaltools' => 'Osobné nástroje',
'postcomment' => 'Pridaj komentár',
-'articlepage' => 'Zobraz Älánok',
+'articlepage' => 'Zobraz stránku',
'talk' => 'Diskusia',
'views' => 'Zobrazení',
'toolbox' => 'Nástroje',
'userpage' => 'Zobraz stránku redaktora',
'projectpage' => 'Zobraz projektovú stránku',
-'imagepage' => 'Zobraz stránku s obrázkom',
+'imagepage' => 'Zobraz popisnú stránku obrázka',
'mediawikipage' => 'Zobraz stránku so správou',
'templatepage' => 'Zobraziť stránku šablóny',
'viewhelppage' => 'Zobraziť stránku Pomocníka',
-'viewtalkpage' => 'Zobraz diskusiu k Älánku',
+'categorypage' => 'Zobraz stránku kategórie',
+'viewtalkpage' => 'Zobraz diskusiu k stránke',
'otherlanguages' => 'Iné jazyky',
'redirectedfrom' => '(Presmerované z $1)',
-'autoredircomment' => 'Presmerovanie na [[$1]]',
'redirectpagesub' => 'Presmerovacia stránka',
'lastmodifiedat' => 'Čas poslednej úpravy tejto stránky je $2, $1.',
'viewcount' => 'Táto stránka bola navštívená $1-krát.',
@@ -359,7 +371,7 @@ $messages = array(
'restorelink' => '{{PLURAL:$1|jedna zmazaná úprava|$1 zmazané úpravy|$1 zmazaných úprav}}',
'feedlinks' => 'Kanál:',
'feed-invalid' => 'Neplatný typ feedu.',
-'nstab-main' => 'Článok',
+'nstab-main' => 'Stránka',
'nstab-user' => 'Stránka redaktora',
'nstab-media' => 'Médiá',
'nstab-special' => 'Špeciálne',
@@ -393,15 +405,14 @@ $1',
'laggedslavemode' => 'Varovanie: Je možné, že stránka neobsahuje posledné aktualizácie.',
'readonly' => 'Databáza je zamknutá',
'enterlockreason' => 'Zadajte dôvod požadovaného zamknutia vrátane odhadu, kedy oÄakávate odomknutie',
-'readonlytext' => 'Databáza je momentálne zamknutá,
-nové Älánky a úpravy sú zablokované, pravdepodobne z dôvodu údržby databázy.
-Po skonÄení tejto údržby bude {{SITENAME}} opäť fungovaÅ¥ normálne.
-Administrátor, ktorý nariadil uzamknutie, uvádza tento dôvod: $1',
-'missingarticle' => 'Databáza nenaÅ¡la text Älánku, ktorý by mala nájsÅ¥, menovite "$1".
+'readonlytext' => 'Databáza je momentálne zamknutá, nové stránky a úpravy sú zablokované, pravdepodobne z dôvodu údržby databázy. Po skonÄení tejto údržby bude {{SITENAME}} opäť fungovaÅ¥ normálne.
-<p>Toto je zvyÄajne zapríÄinené odkazovaním na starÅ¡ie verzie, alebo odkazom na Älánok, ktorý bol zmazaný.
+Správca, ktorý nariadil uzamknutie, uvádza tento dôvod: $1',
+'missingarticle' => 'Databáza nenašla text stránky, ktorý by mala nájsť, menovite "$1".
-<p>Ak toto neplatí, pravdepodobne ste naÅ¡li chybu s softvéri. Prosím ohláste túto chybu správcovi, uveÄte aj meno Älánku - odkaz (URL).',
+Toto je zvyÄajne zapríÄinené odkazovaním na starÅ¡ie verzie alebo odkazom na stránku, ktorý bol zmazaný.
+
+Ak to nie je ten prípad, možno ste naÅ¡li chybu s softvéri. Prosím ohláste túto chybu správcovi, uveÄte aj názov stránky - odkaz (URL).',
'readonly_lag' => 'The databáza bola automaticky zamknutá pokým záložné databázové servery nedoženú hlavný server',
'internalerror' => 'Vnútorná chyba',
'filecopyerror' => 'Neviem skopírovať súbor "$1" na "$2".',
@@ -413,7 +424,7 @@ Administrátor, ktorý nariadil uzamknutie, uvádza tento dôvod: $1',
'badarticleerror' => 'Na tejto stránke túto akciu nemožno vykonať.',
'cannotdelete' => 'Neviem zmazať danú stránku alebo súbor. (Možno už bol zmazaný niekým iným.)',
'badtitle' => 'Neplatný nadpis',
-'badtitletext' => 'Požadovaný nadpis bol neplatný, nezadaný, alebo nesprávne odkazovaný z inej jazykovej verzie {{GRAMMAR:genitív|{{SITENAME}}}}.',
+'badtitletext' => 'Požadovaný nadpis bol neplatný, nezadaný, alebo nesprávne odkazovaný z inej jazykovej verzie {{GRAMMAR:genitív|{{SITENAME}}}}. Mohol tiež obsahovať jeden alebo viac znakov, ktoré nie je možné použiť v nadpisoch.',
'perfdisabled' => 'PrepáÄte! Táto funkcia bola doÄasne vypnutá,
pretože tak spomaľuje databázu, že nikto nemôže používať
wiki.',
@@ -468,16 +479,16 @@ Vaše konto je vytvorené. Nezabudnite si nastaviť vaše redaktorské nastaveni
'youremail' => 'Váš e-mail²',
'username' => 'Používateľské meno:',
'uid' => 'ID užívateľa:',
-'yourrealname' => 'VaÅ¡e skutoÄné meno*',
-'yourlanguage' => 'Jazyk',
+'yourrealname' => 'SkutoÄné meno *:',
+'yourlanguage' => 'Jazyk:',
'yourvariant' => 'Variant',
-'yournick' => 'Vaša prezývka',
+'yournick' => 'Prezývka:',
'badsig' => 'Neplatný podpis v pôvodnom tvare; skontrolujte HTML tagy.',
-'email' => 'e-mail',
+'email' => 'E-mail',
'prefs-help-email-enotif'=> 'Táto adresa sa používa aj na posielanie e-mailových upozornení, ak ste túto možnosť povolili.',
'prefs-help-realname' => '¹ SkutoÄné meno (nepovinné): ak sa rozhodnete ho poskytnúť, bude použité na oznaÄenie VaÅ¡ej práce.',
'loginerror' => 'Chyba pri prihlasovaní',
-'prefs-help-email' => '² E-mail (nepovinné): Uloženie e-mailovej adresy umožní iným ľuÄom kontaktovaÅ¥ Vás priamo pomocou web stránky, bez uverejňovania VaÅ¡ej e-mailovej adresy a môže byÅ¥ použité na poslanie nového hesla, ak zabudnete pôvodné.',
+'prefs-help-email' => '² E-mail (nepovinné): Umožní iným ľuÄom kontaktovaÅ¥ Vás z VaÅ¡ej užívateľskej a diskusnej, bez potreby uverejňovania VaÅ¡ej e-mailovej adresy a môže byÅ¥ použité na poslanie nového hesla, ak zabudnete pôvodné.',
'nocookiesnew' => 'Redaktorské konto bolo vytvorené, ale nie ste prihlásený. {{SITENAME}} používa koláÄiky (cookies) na prihlásenie. Vy máte koláÄiky (cookies) vypnuté. Zapnite ich a potom sa prihláste s vaším novým redaktorským menom a heslom.',
'nocookieslogin' => '{{SITENAME}} používa koláÄiky (cookies) na prihlásenie. Vy máte koláÄiky vypnuté. Prosíme, zapnite ich a skúste znovu.',
'noname' => 'Nezadali ste platné redaktorské meno.',
@@ -501,12 +512,15 @@ si ho zmeniÅ¥, môžete túto správu ignorovaÅ¥ a naÄalej používaÅ¥ svoje st
'passwordsent' => 'Nové heslo bolo zaslané na e-mailovú adresu
redaktora "$1".
Prosím, prihláste sa znovu, keÄ ho obdržíte.',
+'blocked-mailpassword' => 'Boli zablokované úpravy z vašej IP adresy, a tak nie je dovolené použiť funkciu znovuvyžiadania hesla, aby sa zabránilo zneužitiu.',
'eauthentsent' => 'Email s potvrdením bol zaslaný na uvedenú emailovú adresu.
Predtým ako sa na úÄet poÅ¡le akákoľvek ÄalÅ¡ia poÅ¡ta, musíte splniÅ¥ inÅ¡trukcie v emaili, aby sa potvrdilo, že úÄet je skutoÄne Váš.',
+'throttled-mailpassword'=> 'V priebehu posledných $1 hodín už došlo k vyžiadaniu hesla.
+Aby sa zabránilo zneužitiu, vyžiadanie hesla je možné vykonať iba raz za $1 hodín.',
'mailerror' => 'Chyba pri posielaní e-mailu: $1',
'acct_creation_throttle_hit'=> 'PrepáÄte, už máte vytvorených $1 úÄtov. Nemôžete ich z tejto IP adresy vytvoriÅ¥ za 24 hodín viac. Toto je opatrenie proti vandalizmu.',
'emailauthenticated' => 'Vaša e-mailová adresa bola overená na $1.',
-'emailnotauthenticated' => 'VaÅ¡a e-mailová adresa eÅ¡te nebola overená a pokroÄilé funkcie e-mailu sú "deaktivované až do overenia"(d.a.d.o).',
+'emailnotauthenticated' => 'Vaša e-mailová adresa ešte nebola overená. Preto nemôžete prijať emaily pre žiadnu z nasledovných funkcií.',
'noemailprefs' => '<strong>Nezadali ste žiadnu e-mailovú adresu</strong>, nasledujúce
nástroje nebudú prístupné.',
'emailconfirmlink' => 'PotvrÄte vaÅ¡u e-mailovú adresu',
@@ -537,7 +551,7 @@ nástroje nebudú prístupné.',
'subject' => 'Téma/nadpis',
'minoredit' => 'Toto je drobná úprava',
'watchthis' => 'Sleduj úpravy tejto stránky',
-'savearticle' => 'Ulož Älánok',
+'savearticle' => 'Ulož stránku',
'preview' => 'Náhľad',
'showpreview' => 'Zobraz náhľad',
'showlivepreview' => 'Živý náhľad',
@@ -545,6 +559,9 @@ nástroje nebudú prístupné.',
'anoneditwarning' => 'Nie ste [[Special:Userlogin|prihlásený]]. Vaša [[IP adresa]] bude zaznamenaná v <span class="plainlinks"> [{{fullurl:{{FULLPAGENAME}}|action=history}} histórii úprav]</span> tejto stránky.',
'missingsummary' => '\'\'\'Upozornenie:\'\'\' Neposkytli ste zhrnutie úprav. Ak kliknete znova na Uložiť, Vaše úpravy sa uložia bez zhrnutia úprav.',
'missingcommenttext' => 'Prosím, dolu napíšte komentár.',
+'missingcommentheader' => '\'\'\'Pripomienka:\'\'\' Neposkutli ste predmet/hlaviÄku tohto komentára. Ak znova kliknete na tlaÄidlo UložiÅ¥, vaÅ¡a úprava sa uloží bez nej.',
+'summary-preview' => 'Náhľad zhrnutia',
+'subject-preview' => 'Náhľad predmetu/hlaviÄky',
'blockedtitle' => 'Redaktor je zablokovaný',
'blockedtext' => 'Vaše redaktorské meno alebo IP adresu zablokoval $1.
Udáva tento dôvod:<br />\'\'$2\'\'
@@ -558,24 +575,23 @@ Vaša IP adresa je $3. Prosíme, zahrňte túto adresu do každého dotazu, ktor
'blockedoriginalsource' => 'Zdroj \'\'\'$1\'\'\' je zobrazený nižšie:',
'blockededitsource' => 'Text \'\'\'Vašich úprav\'\'\' stránky \'\'\'$1\'\'\' je zobrazený nižšie:',
'whitelistedittitle' => 'Na úpravu je nutné prihlásenie',
-'whitelistedittext' => 'Na úpravu Älánkov sa musíte najskôr $1.',
-'whitelistreadtitle' => 'Na Äítanie Älánkov je nutné prihlásenie',
-'whitelistreadtext' => 'Na Äítanie Älánkov musíte byÅ¥ [[Special:Userlogin|prihlásený/á]]',
+'whitelistedittext' => 'Na úpravu stránok sa musíte najskôr $1.',
+'whitelistreadtitle' => 'Je potrebné sa prihlásiÅ¥, aby ste mohli ÄítaÅ¥',
+'whitelistreadtext' => 'Na Äítanie stránok musíte byÅ¥ [[Special:Userlogin|prihlásený/á]]',
'whitelistacctitle' => 'Nemáte dovolené vytvorenie konta',
'whitelistacctext' => 'Na umožnenie vytvorenia konta v tomto Wiki musíte byť [[Special:Userlogin|prihlásený/á]] a mať primerané práva.',
'confirmedittitle' => 'Aby ste mohli upravovať je potrebné potvrdenie e-mailu',
'confirmedittext' => 'Pred úpravami stránok musíte potvrdiť vašu emailovú adresu. Prosím, nastavte a overte svoju emailovú adresu v [[Special:Preferences|používateľských nastaveniach]].',
'loginreqtitle' => 'Nutné prihlásenie',
'loginreqlink' => 'prihlásiť',
-'loginreqpagetext' => 'Na prezeranie Äalších Älánkov sa musíte $1.',
+'loginreqpagetext' => 'Na prezeranie Äalších stránok sa musíte $1.',
'accmailtitle' => 'Heslo odoslané.',
'accmailtext' => 'Heslo pre \'$1\' bolo poslané na $2.',
'newarticle' => '(Nový)',
-'newarticletext' => '<div style="border: 1px solid #ccc; padding: 7px;">\'\'\'{{SITENAME}} eÅ¡te neobsahuje Älánok s názvom {{PAGENAME}}.\'\'\'
-* Na vytvorenie nového Älánku, zaÄnite písaÅ¥ do dolného okna a potom kliknite "UložiÅ¥ Älánok". VaÅ¡e zmeny budú ihneÄ viditeľné.
-* Prosíme, nevytvárajte Älánok na prezentáciu samého seba, web stránky, produktu alebo podnikania (pozri [[Project:Zásady a smernice]]).
-* Ak ste vo {{GRAMMAR:lokál|{{SITENAME}}}} nový/á, prosím preÄítajte si [[Project:PríruÄka|PríruÄku]] pred tvorbou [[Project:Váš prvý Älánok|vášho prvého Älánku]], alebo použite na experimenty [[Project:Pieskovisko|pieskovisko]].
-</div>',
+'newarticletext' => 'Sledovali ste odkaz na stránku, ktorá zatiaľ neexistuje.
+Stránku vytvoríte tak, že zaÄnete písaÅ¥ do dolného poľa a potom stlaÄíte tlaÄidlo "Ulož stránku".
+(Viac informácií nájdete na stránkach [[{{ns:help}}:Obsah|Pomocníka]]).
+Ak ste sa sem dostali nechtiac, iba kliknite na tlaÄidlo \'\'\'späť\'\'\' vo svojom prehliadaÄi.',
'anontalkpagetext' => '<br />
----
\'\'Toto je diskusná stránka anonymného redaktora, ktorý nemá vytvorené svoje konto alebo ho nepoužíva. Preto musíme na jeho identifikáciu použiÅ¥ numerickú IP adresu. Je možné, že takúto IP adresu používajú viacerí redaktori. Ak ste anonymný redaktor a máte pocit, že vám boli adresované irelevantné diskusné príspevky, zriaÄte si konto alebo sa prihláste ([[Special:Userlogin|Zriadenie konta alebo prihlásenie]]), aby sa zamedzilo budúcim zámenám s inými anonymnými redaktormi\'\'',
@@ -587,10 +603,9 @@ Vaša IP adresa je $3. Prosíme, zahrňte túto adresu do každého dotazu, ktor
'userinvalidcssjstitle' => '\'\'\'Varovanie:\'\'\' Neexistuje skin "$1". Pamätajte, že vlastné .css a .js stránky používajú názov s malými písmenami, napr. Redaktor:Foo/monobook.css na rozdiel od Redaktor:Foo/Monobook.css.',
'updated' => '(Aktualizovaný)',
'note' => '<strong>Poznámka: </strong>',
-'previewnote' => 'Nezabudnite, toto je len náhľad vami upravovaného Älánku. ÄŒlánok eÅ¡te nie je uložený!',
+'previewnote' => 'Nezabudnite, toto je len náhľad vami upravovanej stránky. Zmeny ešte nie sú uložené!',
'session_fail_preview' => '<strong>PrepáÄte, nemohli sme spracovaÅ¥ Váš príspevok kvôli strate údajov relácie (session). Skúste to prosím eÅ¡te raz. Ak to nebude fungovaÅ¥, skúste sa odhlásiÅ¥ a znovu prihlásiÅ¥.</strong>',
-'previewconflict' => 'Tento náhľad upraveného Älánku zobrazuje
-text z horného okna na úpravy tak, ako sa zobrazí potom, keÄ ho uložíte.',
+'previewconflict' => 'Tento náhľad upravenej stránky zobrazuje text z horného poľa s textom tak, ako sa zobrazí potom, keÄ ju uložíte.',
'session_fail_preview_html'=> '<strong>PrepáÄte! Nemohli sme spracovaÅ¥ VaÅ¡u úpravu kvôli strate údajov relácie.</strong>
\'\'Pretože táto wiki má použitie HTML umožnené, náhľad sa nezobrazí (prevencia pred JavaScript útokmi).\'\'
@@ -608,11 +623,10 @@ Horné okno na úpravy obsahuje text stránky tak, ako je momentálne platný.
Vaše úpravy sú uvedené v dolnom okne na úpravy.
Budete musieÅ¥ zlúÄiÅ¥ vaÅ¡e zmeny s existujúcim textom.
<b>Iba</b> obsah horného okna sa uloží, keÄ
-stlaÄíte "Ulož Älánok".
-<p>',
+stlaÄíte "Ulož stránku".<br />',
'yourtext' => 'Váš text',
'storedversion' => 'Uložená verzia',
-'nonunicodebrowser' => '<strong>UPOZORNENIE: Váš prehliadaÄ nepodporuje unicode, prosím pred úpravou Älánku použite iný.</strong>',
+'nonunicodebrowser' => '<strong>UPOZORNENIE: Váš prehliadaÄ nepodporuje unicode. DoÄasným rieÅ¡ením ako bezpeÄne upravovaÅ¥ stránky je, že ne-ASCII znaky sa v upravovacom textovom poli zobrazia ako zodpovedajúce hexadecimálne hodnoty.</strong>',
'editingold' => '<div style="background: #FFBDBD; border: 1px solid #BB7979; color: #000000; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; clear: both;">POZOR: Upravujete starú
verziu tejto stránky. Ak vašu úpravu uložíte, prepíšete tým všetky úpravy, ktoré nasledovali po tejto starej verzii.</div>',
'yourdiff' => 'Rozdiely',
@@ -633,24 +647,32 @@ Zvážte, Äi by nebolo možné rozdeliÅ¥ stránku na menÅ¡ie sekcie.</strong>',
'readonlywarning' => '<strong>POZOR: Databáza bola poÄas upravovania stránky zamknutá z dôvodu údržby,
takže stránku momentálne nemôžete uložiť. Môžete skopírovať a vložiť
text do textového súboru a uložiť si ho na neskôr.</strong>',
-'protectedpagewarning' => '<strong>POZOR: Táto stránka bola zamknutá, takže ju môžu upravovať iba redaktori s oprávnením administrátor. Uistite sa, že rozumiete [[Project:Pravidlá zamykania stránok|pravidlám zamykania stránok]].</strong>',
+'protectedpagewarning' => '<strong>POZOR: Táto stránka bola zamknutá, takže ju môžu upravovať iba redaktori s oprávnením správcu. Uistite sa, že rozumiete [[Project:Pravidlá zamykania stránok|pravidlám zamykania stránok]].</strong>',
'semiprotectedpagewarning'=> '\'\'\'Poznámka:\'\'\' Táto stránka bola zamknutá tak, aby ju mohli upravovať iba registrovaní používatelia.',
-'templatesused' => 'Å ablóny použité v tomto Älánku:',
+'templatesused' => 'Šablóny použité na tejto stránke:',
+'templatesusedpreview' => 'Šablóny použité v tomto náhľade:',
+'templatesusedsection' => 'Šablóny použité v tejto sekcii:',
'edittools' => '<!-- Tento text sa zobrazí pod upravovacím a nahrávacím formulárom. -->',
'nocreatetitle' => 'Tvorba nových stránok bola obmedzená',
'nocreatetext' => 'Na tejto stránke je tvorba nových stránok obmedzená.
Teraz sa môžete vrátiÅ¥ späť a upravovaÅ¥ existujúcu stránku alebo [[Special:Userlogin|sa prihlásiÅ¥ alebo vytvoriÅ¥ úÄet]].',
+'undofailed' => 'Vrátenie sa nepodarilo',
+'explainundofailed' => 'Úpravu nie je možné vrátiÅ¥, pretože za ňou nasledujú ÄalÅ¡ie úpravy, Äo by spôsobilo konflikt. Prosím, vraÅ¥te zmeny ruÄne.',
+'undosucceeded' => 'Vrátenie úspešné',
+'explainundosucceeded' => 'Úprava bola úspeÅ¡ne vrátená. Prosím, kliknite na uložiÅ¥, Äím sa zmeny aplikujú.',
+'undo-summary' => 'Používateľ [[Special:Contributions/$2]] ([[User talk:$2]]) vrátil revíziu $1',
'cantcreateaccounttitle'=> 'Nedá sa vytvoriÅ¥ úÄet',
'cantcreateaccounttext' => 'Vytvorenie úÄtu z tejto IP adresy (<b>$1</b>) bolo zablokované. Pravdepodobne je to kvôli sústavnému vandalizmu z adresy vaÅ¡ej Å¡koly Äi poskytovateľa internetového poskytovateľa.',
'revhistory' => 'Predošlé verzie',
'viewpagelogs' => 'Zobraziť záznamy pre túto stránku',
-'nohistory' => 'Pre tento Älánok neexistuje história.',
+'nohistory' => 'Pre túto stránku neexistuje história.',
'revnotfound' => 'Predošlá verzia nebola nájdená',
-'revnotfoundtext' => 'Požadovaná starÅ¡ia verzia Älánku nebola nájdená.
+'revnotfoundtext' => 'Požadovaná staršia verzia stránky nebola nájdená.
Prosím skontrolujte URL adresu, ktorú ste použili na prístup k tejto stránke.',
'loadhist' => 'Sťahovanie histórie stránky',
'currentrev' => 'Aktuálna verzia',
'revisionasof' => 'Verzia zo dňa a Äasu $1',
+'revision-info' => 'Revízia z $1; $2',
'previousrevision' => '↠Staršia verzia',
'nextrevision' => 'Novšia verzia →',
'currentrevisionlink' => 'Zobrazenie aktuálnej úpravy',
@@ -671,7 +693,7 @@ Podrobnosti nájdete v [{{fullurl:Special:Log/delete|page={{PAGENAMEE}}}} zázna
</div>',
'rev-deleted-text-view' => '<div class="mw-warning plainlinks">
Táto revízia stránky bola odstránená z verejných archívov.
-Ako administrátor tohto projektu si ju môžete prezrieť;
+Ako správca tohto projektu si ju môžete prezrieť;
podrobnosti môžu byť v [{{fullurl:Special:Log/delete|page={{PAGENAMEE}}}} zázname mazaní].
</div>',
'rev-delundel' => 'ukáž/skry',
@@ -706,19 +728,20 @@ nie sú stanovené ÄakÅ¡ie obmedzenia.',
'selectnewerversionfordiff'=> 'Vybrať na porovnanie novšiu verziu',
'selectolderversionfordiff'=> 'Vybrať na porovnanie staršiu verziu',
'compareselectedversions'=> 'Porovnaj oznaÄené verzie',
+'editundo' => 'Vrátiť',
'searchresults' => 'Výsledky vyhľadávania',
'searchresulttext' => 'Viac informácií o vyhľadávaní vo {{GRAMMAR:lokál|{{SITENAME}}}} je uvedených na $1.',
'searchsubtitle' => 'Na vyhľadávací dotaz "[[:$1]]"',
'searchsubtitleinvalid' => 'Na vyhľadávací dotaz "$1"',
'badquery' => 'Nesprávne formulovaná požiadavka na vyhľadávanie',
'badquerytext' => 'Váš text na prehľadávanie sme nemohli spracovaÅ¥. Dôvodom je pravdepodobne to, že ste hľadali slovo kratÅ¡ie ako tri písmená, Äo zatiaľ {{SITENAME}} neumožňuje. Alebo ste možno výraz zle napísali, napríklad „dom a a záhrada“. Skúste iný text na prehľadávanie.',
-'matchtotals' => 'Výsledkom dotazu "$1" je $2 nadpisov Älánkov
-a text $3 Älánkov.',
-'noexactmatch' => 'Neexistuje Älánok s presne takýmto nadpisom; skúšam nájsÅ¥ podobné nadpisy. Chcete \'\'\'[[:$1|vytvoriÅ¥ nový Älánok]]\'\'\' s týmto nadpisom?',
-'titlematches' => 'Vyhovujúce nadpisy Älánkov',
-'notitlematches' => 'Niet vyhovujúcich nadpisov Älánkov',
-'textmatches' => 'Vyhovujúce texty Älánkov',
-'notextmatches' => 'Niet vyhovujúcich textov Älánkov',
+'matchtotals' => 'Výsledkom dotazu "$1" je {{plural:$2|jeden názov stránky|$3 názvy stránok|$3 názvov stránok}}
+a text {{plural:$3|jednej stránky|$3 názvy stránok|$3 názvov stránok}}.',
+'noexactmatch' => '\'\'\'Neexistuje stránka nazvaná "$1"\'\'\'. Chcete \'\'\'[[:$1|vytvoriť novú stránku]]\'\'\' s týmto názvom?',
+'titlematches' => 'Vyhovujúce názvy stránok',
+'notitlematches' => 'V názvoch stránok nebola nájdená zhoda',
+'textmatches' => 'Zhody v textoch stránok',
+'notextmatches' => 'V textoch stránok nebola nájdená zhoda',
'prevn' => 'predošlá $1',
'nextn' => 'ÄalÅ¡ia $1',
'viewprevnext' => 'Zobraz ($1) ($2) ($3).',
@@ -736,7 +759,7 @@ $2 Zoznam presmerovaní &nbsp; Hľadanie pre $3 $9',
'prefsnologin' => 'Nie ste prihlásený/á',
'prefsnologintext' => 'Musíte byť [[Special:Userlogin|prihlásený/á]], aby ste mohli zmeniť vaše nastavenia.',
'prefsreset' => 'Boli obnovené pôvodné nastavenia.',
-'qbsettings' => 'Nastavenia pre boÄné menu',
+'qbsettings' => 'BoÄný panel',
'changepassword' => 'Zmeniť heslo',
'skin' => 'Vzhľad',
'math' => 'Vykreslenie matematiky',
@@ -754,15 +777,15 @@ $2 Zoznam presmerovaní &nbsp; Hľadanie pre $3 $9',
'math_notexvc' => 'Chýbajúci program texvc; konfigurácia je popísaná v math/README.',
'prefs-personal' => 'Profil',
'prefs-rc' => 'Posledné úpravy',
-'prefs-watchlist' => 'Sledované Älánky',
-'prefs-watchlist-days' => 'Koľko dní zobrazovaÅ¥ v sledovaných Älánkoch:',
+'prefs-watchlist' => 'Sledované stránky',
+'prefs-watchlist-days' => 'Koľko dní zobrazovať v sledovaných stránkach:',
'prefs-watchlist-edits' => 'PoÄet úprav, ktorý sa zobrazí v rozšírenom zozname sledovaných:',
'prefs-misc' => 'Rôzne',
'saveprefs' => 'Ulož nastavenia',
'resetprefs' => 'Obnoviť pôvodné nastavenia',
-'oldpassword' => 'Staré heslo',
-'newpassword' => 'Nové heslo',
-'retypenew' => 'Nové heslo (ešte raz)',
+'oldpassword' => 'Staré heslo:',
+'newpassword' => 'Nové heslo:',
+'retypenew' => 'Nové heslo (ešte raz):',
'textboxsize' => 'Úpravy',
'rows' => 'Riadky',
'columns' => 'Stĺpce',
@@ -770,19 +793,18 @@ $2 Zoznam presmerovaní &nbsp; Hľadanie pre $3 $9',
'resultsperpage' => 'PoÄet vyhovujúcich výsledkov zobrazených na strane',
'contextlines' => 'PoÄet zobrazených riadkov z kažnej nájdenej stránky',
'contextchars' => 'PoÄet kontextových znakov v riadku',
-'stubthreshold' => 'Hranica pre zobrazenie nedokonÄených Älánkov',
+'stubthreshold' => 'Hranica pre zobrazenie nedokonÄených stránok (výhonkov):',
'recentchangescount' => 'PoÄet nadpisov uvedených v posledných úpravách',
'savedprefs' => 'Vaše nastavenia boli uložené.',
'timezonelegend' => 'Časové pásmo',
-'timezonetext' => 'Zadajte poÄet hodín, o ktorý sa váš miestny Äas odliÅ¡uje
-od Äasu na serveri (UTC).',
+'timezonetext' => 'PoÄet hodín, o ktorý sa váš miestny Äas odliÅ¡uje od Äasu na serveri (UTC).',
'localtime' => 'Miestny Äas',
'timezoneoffset' => 'Rozdiel¹',
'servertime' => 'Aktuálny Äas na serveri',
'guesstimezone' => 'PrevziaÅ¥ z prehliadaÄa',
'allowemail' => 'Povoľ prijímanie e-mailov od iných redaktorov',
'defaultns' => 'Štandardne vyhľadávaj v týchto menných priestoroch:',
-'default' => 'Å¡tandardne',
+'default' => 'predvolený',
'files' => 'Súbory',
'userrights-lookup-user'=> 'Spravuj skupiny redaktorov',
'userrights-user-editname'=> 'Napíš meno redaktora:',
@@ -802,12 +824,12 @@ odobraÅ¥ redaktora. NeoznaÄené skupiny nebudú zmenené. OdobraÅ¥ skupinu mož
'group-sysop-member' => 'Správca',
'group-bureaucrat-member'=> 'Byrokrat',
'grouppage-bot' => 'Project:Boti',
-'grouppage-sysop' => 'Project:Administrátori',
+'grouppage-sysop' => 'Project:Správcovia',
'grouppage-bureaucrat' => 'Project:Byrokrati',
'changes' => 'úpravy',
'recentchanges' => 'Posledné úpravy',
'recentchangestext' => 'Pomocou tejto stránky sledujete posledné úpravy stránok {{GRAMMAR:genitív|{{SITENAME}}}}.
-Pozrite si Älánky [[Project:Vitajte|Vitajte!]], [[Project:FAQ|{{SITENAME}} FAQ]].
+Pozrite si stránky [[Project:Vitajte|Vitajte!]], [[Project:FAQ|{{SITENAME}} FAQ]].
Ak chcete, aby {{SITENAME}} uspela, je veľmi dôležité, aby ste nepridávali
materiál obmedzený inými [[Project:Autorské právo|autorskými právami]].
@@ -843,7 +865,7 @@ Právne záväzky môžu projekt vážne poškodiť, takže Vás prosíme, aby s
'uploaderror' => 'Chyba pri nahrávaní',
'uploadtext' => 'Tento formulár použite na nahrávanie súborov, na zobrazenie alebo hľadanie už nahraných súborov choÄte na [[Special:Imagelist|zoznam nahraných súborov]], nahrávania a mazania sa tiež zaznamenávajú v [[Special:Log/upload|zázname nahrávaní]].
-Na zaÄlenenie obrázku v Älánku použite odkaz v tvare
+Na zaÄlenenie obrázku do stránky použite odkaz v tvare
* \'\'\'<nowiki>[[</nowiki>{{ns:Image}}<nowiki>:Súbor.jpg]]</nowiki>\'\'\'
* \'\'\'<nowiki>[[</nowiki>{{ns:Image}}<nowiki>:Súbor.png|alternatívny text]]</nowiki>\'\'\'
@@ -864,7 +886,7 @@ VÅ¡etky uvedené Äasy sú Äasy na serveri (UTC).',
'ignorewarning' => 'Ignorovať varovanie a súbor napriek tomu uložiť.',
'ignorewarnings' => 'Ignorovať všetky varovania',
'minlength' => 'Názvy obrázkov musia obsahovať najmenej tri písmená.',
-'illegalfilename' => 'Názov súboru "$1" obsahuje znaky, ktoré nie sú povolené v názvoch Älánkov. Prosím premenujte súbor a skúste ho nahraÅ¥ znovu.',
+'illegalfilename' => 'Názov súboru "$1" obsahuje znaky, ktoré nie sú povolené v názvoch stránok. Prosím premenujte súbor a skúste ho nahrať znovu.',
'badfilename' => 'Meno obrázka bolo zmenené na "$1".',
'badfiletype' => '".$1" nie je odporúÄaný formát obrázkového súboru.',
'largefile' => 'OdporúÄame, aby obrázky neprekroÄili veľkosÅ¥ $1 bajtov, veľkosÅ¥ tohto súboru je $2 bajtov',
@@ -875,7 +897,7 @@ VÅ¡etky uvedené Äasy sú Äasy na serveri (UTC).',
'fileexists-shared-forbidden'=> 'Súbor s týmto názvom už existuje v zdieľanom úložisku súborov; choÄte prosím späť a nahrajte tento súbor pod iným názvom. [[Image:$1|thumb|center|$1]]',
'successfulupload' => 'Nahranie bolo úspešné',
'fileuploaded' => 'Súbor "$1" bol úspešne nahraný.
-Nasledujte tento odkaz ($2) na stránku, na ktorej zadáte informácie na opis súboru, napríklad odkiaľ pochádza, kedy a kým bol vytvorený a vÅ¡etko ostatné, Äo o ňom prípadne viete. Ak je nahraný súbor obrázok, možno ho takto vložiÅ¥ do Älánku: <tt><nowiki>[[{{ns:Image}}:$1|thumb|Opis]]</nowiki></tt>',
+Nasledujte tento odkaz ($2) na stránku, na ktorej zadáte informácie na opis súboru, napríklad odkiaľ pochádza, kedy a kým bol vytvorený a vÅ¡etko ostatné, Äo o ňom prípadne viete. Ak je nahraný súbor obrázok, možno ho takto vložiÅ¥ do stránky: <tt><nowiki>[[{{ns:Image}}:$1|thumb|Opis]]</nowiki></tt>',
'uploadwarning' => 'Varovanie pri nahrávaní',
'savefile' => 'Ulož súbor',
'uploadedimage' => 'nahraný „[[$1]]“',
@@ -888,6 +910,16 @@ Nasledujte tento odkaz ($2) na stránku, na ktorej zadáte informácie na opis s
'destfilename' => 'Názov cieľového súboru',
'watchthisupload' => 'Sleduj túto stránku',
'filewasdeleted' => 'Súbor s týmto názvom bol už nahraný a následne zmazaný. Mali by ste skontrolovaÅ¥ $1 predtým, ako budete pokraÄovaÅ¥ na opätovné nahranie.',
+'upload-proto-error' => 'Nesprávny protokol',
+'upload-proto-error-text'=> 'Vzdialené nahrávanie vyžaduje, aby URL zaÄínali <code>http://</code> alebo <code>ftp://</code>.',
+'upload-file-error' => 'Vnútorná chyba',
+'upload-file-error-text'=> 'Vyskytla sa vnútorná chyba pri pokuse vytvoriÅ¥ doÄasný súbor na serveri. Prosím, kontaktujte správcu systému.',
+'upload-misc-error' => 'Neznáma chyba pri nahrávaní',
+'upload-misc-error-text'=> 'PoÄas nahrávania sa vyskytla neznáma chyba. Prosím, overte, že URL je platný a dostupný a skúste znova. Ak problém pretrváva, kontaktujte správcu systému.',
+'upload-curl-error6' => 'Nedostupný URL',
+'upload-curl-error6-text'=> 'Poskytnutý URL nebol dostupný. Prosím, skontrolujte znova, že URL je správny a lokalita je dostupná.',
+'upload-curl-error28' => 'VyprÅ¡al Äas vyhradený pre nahrávanie',
+'upload-curl-error28-text'=> 'Lokalite trvala odpoveÄ príliÅ¡ dlho. Prosím, skontrolujte, Äi je lokalita dopstupná, chvíľu poÄkajte a skúste znova. Možno je potrebné skúsiÅ¥ nahrávanie v Äase, kedy je lokalita menej zaÅ¥ažená.',
'license' => 'Licencovanie',
'nolicense' => 'NiÄ nebolo vybrané',
'upload_source_url' => ' (platný, verejne prístupný URL)',
@@ -913,8 +945,8 @@ Nasledujte tento odkaz ($2) na stránku, na ktorej zadáte informácie na opis s
túto starú verziu, (pôvodná) = vráť sa k tejto starej verzii.
<br /><i>Kliknite na dátum, aby sa zobrazil obrázok nahraný v ten deň</i>.',
'imagelinks' => 'Odkazy na obrázok',
-'linkstoimage' => 'Na tento obrázok odkazujú nasledujúce Älánky:',
-'nolinkstoimage' => 'Žiadne Älánky neobsahujú odkazy na tento obrázok.',
+'linkstoimage' => 'Na tento obrázok odkazujú nasledujúce stránky:',
+'nolinkstoimage' => 'Žiadne stránky neobsahujú odkazy na tento obrázok.',
'sharedupload' => 'Toto je zdieľaný súbor a je možné ho používať na iných projektoch.',
'shareduploadwiki' => 'Ďalšie informácie pozrite na $1.',
'shareduploadwiki-linktext'=> 'stránka opisu súboru',
@@ -939,13 +971,13 @@ túto starú verziu, (pôvodná) = vráť sa k tejto starej verzii.
'statistics' => 'Å tatistiky',
'sitestats' => 'Å tatistika webu',
'userstats' => 'Å tatistika k redaktorom',
-'sitestatstext' => '{{SITENAME}} momentálne má \'\'\'$2\'\'\' Älánkov.
-Do toho sa nezapoÄítavajú presmerovania, diskusné stránky, popisné stránky obrázkov, stránky používateľských profilov, Å¡ablóny, stránky Pomocníka, portály, Älánky bez odkazov na iné Älánky a stránky o {{GRAMMAR:lokál|{{SITENAME}}}}.
+'sitestatstext' => '{{SITENAME}} momentálne má \'\'\'$2\'\'\' stránok.
+Do toho sa nezapoÄítavajú presmerovania, diskusné stránky, popisné stránky obrázkov, stránky používateľských profilov, Å¡ablóny, stránky Pomocníka, portály, stránky bez odkazov na iné stránky a stránky o {{GRAMMAR:lokál|{{SITENAME}}}}.
Vrátane týchto máme spolu \'\'\'$1\'\'\' stránok.
Celkovo bolo nahraných \'\'\'$8\'\'\' súborov.
-Celkovo boli stránky navÅ¡tívené \'\'\'$3\'\'\'-krát a upravené \'\'\'$4\'\'\'-krát. To znamená, že pripadá priemerne \'\'\'$5\'\'\' úprav na každý Älánok a \'\'\'$6\'\'\' návÅ¡tev na každú úpravu (od posledného vylepÅ¡enia (upgrade) softvéru 20. júla 2002).
+Celkovo boli stránky navštívené \'\'\'$3\'\'\'-krát a upravené \'\'\'$4\'\'\'-krát. To znamená, že pripadá priemerne \'\'\'$5\'\'\' úprav na každú stránku a \'\'\'$6\'\'\' návštev na každú úpravu (od posledného vylepšenia (upgrade) softvéru 20. júla 2002).
[http://meta.wikimedia.org/wiki/Help:Job_queue Dĺžka frontu úloh] je momentálne \'\'\'$7\'\'\'.',
'userstatstext' => 'Celkovo je \'\'\'$1\'\'\' zaregistrovaných redaktorov,
@@ -953,38 +985,37 @@ z Äoho \'\'\'$2\'\'\' (alebo \'\'\'$4%\'\'\') sú administrátormi (pozri $5).'
'statistics-mostpopular'=> 'NajÄastejÅ¡ie prezerané stránky',
'disambiguations' => 'Stránky na rozlíšenie viacerých významov',
'disambiguationspage' => 'Šablóna:Rozlišovacia stránka',
-'disambiguationstext' => 'Tieto Älánky obsahujú odkazy na <i>stránku na rozlíšenie viacerých významov</i>. Namiesto toho by mali obsahovaÅ¥ odkazy na stránku s prísluÅ¡nou témou. <br>Stránka sa považuje za stránku na rozlíšenie viacerých významov, ak $1 na ňu obsahuje odkaz.<br>Odkazy z iných menných priestorov tu <i>nie</i> sú uvedené.',
+'disambiguationstext' => 'Tieto stránky obsahujú odkazy na <i>stránku na rozlíšenie viacerých významov</i>. Namiesto toho by mali obsahovať odkazy na stránku s príslušnou témou. <br>Stránka sa považuje za stránku na rozlíšenie viacerých významov, ak $1 na ňu obsahuje odkaz.<br>Odkazy z iných menných priestorov tu <i>nie</i> sú uvedené.',
'doubleredirects' => 'Dvojité presmerovania',
-'doubleredirectstext' => '<b>Pozor:</b> Tento zoznam môže byÅ¥ zavádzajúco spoľahlivý, Äo znamená, že pod prvým Presmerovaním sa nachádza eÅ¡te Äalší text s Äalšími odkazmi. <br>
-Každý riadok obsahuje odkaz na prvé a druhé Presmerovanie a tiež prvý riadok z textu na ktorý odkazuje druhé Presmerovanie, ktoré zvyÄajne odkazuje na "skutoÄný" cieľ, na ktorý má odkazovaÅ¥ prvé Presmerovanie.',
+'doubleredirectstext' => 'Každý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riadok z textu na ktorý odkazuje druhé presmerovanie, ktoré zvyÄajne odkazuje na "skutoÄný" cieľ, na ktorý má odkazovaÅ¥ prvé presmerovanie.',
'brokenredirects' => 'Pokazené presmerovania',
-'brokenredirectstext' => 'Tieto presmerovania odkazujú na neexistujúci Älánok.',
+'brokenredirectstext' => 'Tieto presmerovania odkazujú na neexistujúcu stránku.',
'nbytes' => '$1 {{PLURAL:$1|bajt|bajty|bajtov}}',
'ncategories' => '$1 {{PLURAL:$1|kategória|kategórie|kategórií}}',
'nlinks' => '$1 {{PLURAL:$1|odkaz|odkazy|odkazov}}',
'nmembers' => '$1 {{PLURAL:$1|Älen|Älenovia|Älenov}}',
'nrevisions' => '$1 {{PLURAL:$1|revízia|revízie|revízií}}',
'nviews' => '$1 {{PLURAL:$1|návšteva|návštevy|návštev}}',
-'lonelypages' => 'Opustené Älánky',
+'lonelypages' => 'Opustené stránky',
'lonelypagestext' => 'Na nasledujúce stránky neodkazujú žiadne iné stránky z tejto wiki.',
-'uncategorizedpages' => 'Nekategorizované Älánky',
+'uncategorizedpages' => 'Nekategorizované stránky',
'uncategorizedcategories'=> 'Nekategorizované kategórie',
'uncategorizedimages' => 'Nekategorizované obrázky',
'unusedcategories' => 'Nepoužité kategórie',
'unusedimages' => 'Opustené obrázky',
-'popularpages' => 'Populárne Älánky',
+'popularpages' => 'Populárne stránky',
'wantedcategories' => 'Žiadané kategórie',
-'wantedpages' => 'Žiadané Älánky',
+'wantedpages' => 'Žiadané stránky',
'mostlinked' => 'NajÄastejÅ¡ie odkazované stránky',
'mostlinkedcategories' => 'NajÄastejÅ¡ie odkazované kategórie',
-'mostcategories' => 'ÄŒlánky s najväÄším poÄtom kategórií',
+'mostcategories' => 'Stránky s najväÄším poÄtom kategórií',
'mostimages' => 'NajÄastejÅ¡ie odkazované obrázky',
-'mostrevisions' => 'ÄŒlánky s najväÄším poÄtom revízií',
+'mostrevisions' => 'Stránky s najväÄším poÄtom revízií',
'allpages' => 'Všetky stránky',
'prefixindex' => 'Index prefixu',
-'randompage' => 'Náhodný Älánok',
-'shortpages' => 'Krátke Älánky',
-'longpages' => 'Dlhé Älánky',
+'randompage' => 'Náhodná stránka',
+'shortpages' => 'Krátke stránky',
+'longpages' => 'Dlhé stránky',
'deadendpages' => 'Slepé stránky',
'deadendpagestext' => 'Nasledujúce stránky neodkazujú na žiadne iné stránky z tejto wiki.',
'listusers' => 'Zoznam redaktorov',
@@ -992,15 +1023,15 @@ Každý riadok obsahuje odkaz na prvé a druhé Presmerovanie a tiež prvý riad
'spheading' => 'Špeciálne stránky pre všetkých redaktorov',
'restrictedpheading' => 'Obmedzené špeciálne stránky',
'recentchangeslinked' => 'Súvisiace úpravy',
-'rclsub' => '(na Älánky, na ktoré odkazuje "$1")',
-'newpages' => 'Nové Älánky',
+'rclsub' => '(na stránky, na ktoré odkazuje "$1")',
+'newpages' => 'Nové stránky',
'newpages-username' => 'Meno používateľa:',
-'ancientpages' => 'NajdávnejÅ¡ie upravované Älánky',
+'ancientpages' => 'Najdávnejšie upravované stránky',
'intl' => 'Mezijazykové odkazy',
'move' => 'Presuň',
'movethispage' => 'Presuň túto stránku',
'unusedimagestext' => '<p>Prosím, uvedomte si, že iné web stránky môžu odkazovať na tento obrázok priamo URL adresou a tak tu môžu byť uvedené napriek tomu, že ich externé stránky používajú.</p>',
-'unusedcategoriestext' => 'Nasledovné stránky kategórií existujú napriek tomu, že ich nepoužíva žiaden iný Älánok ani kategória.',
+'unusedcategoriestext' => 'Nasledovné stránky kategórií existujú napriek tomu, že ich nepoužíva žiadna iná stránka ani kategória.',
'booksources' => 'Knižné zdroje',
'categoriespagetext' => 'Nasledujúce kategórie existujú vo wiki.',
'data' => 'Dáta',
@@ -1015,15 +1046,15 @@ Každý riadok obsahuje odkaz na prvé a druhé Presmerovanie a tiež prvý riad
Môžete zmenÅ¡iÅ¥ rozsah, ak zvolíte typ záznamu, meno redaktora alebo dotyÄnú stránku.',
'logempty' => 'V zázname neboli nájdené zodpovedajúce položky.',
'nextpage' => 'Ďalšia stránka ($1)',
-'allpagesfrom' => 'Zobraz Älánky od Älánku:',
-'allarticles' => 'VÅ¡etky Älánky',
+'allpagesfrom' => 'Zobraz stránky od:',
+'allarticles' => 'Všetky stránky',
'allinnamespace' => 'Všetky stránky (menný priestor $1)',
'allnotinnamespace' => 'Všetky stránky (nie z menného priestoru $1)',
'allpagesprev' => 'Predchádzajúci',
'allpagesnext' => 'Ďalší',
'allpagessubmit' => 'ChoÄ',
'allpagesprefix' => 'Zobraz stránky s predponou:',
-'allpagesbadtitle' => 'Zadaný názov stránky je neplatný alebo mal medzijazykový alebo interwiki prefix. Môže obsahovaÅ¥ jeden alebo viac znakov, ktoré nie je možné použiÅ¥ v názve Älánku.',
+'allpagesbadtitle' => 'Zadaný názov stránky je neplatný alebo mal medzijazykový alebo interwiki prefix. Môže obsahovať jeden alebo viac znakov, ktoré nie je možné použiť v názve stránky.',
'listusersfrom' => 'ZobraziÅ¥ používateľov poÄnúc:',
'mailnologin' => 'Žiadna adresa na zaslanie',
'mailnologintext' => 'Musíte byť [[Special:Userlogin|prihlásený]] a mať platnú e-mailovú adresu vo vašich [[Special:Preferences|nastaveniach]], aby ste mohli iným redaktorom posielať e-maily.',
@@ -1044,11 +1075,13 @@ alebo sa rozhodol, že nebude prijímať e-maily od druhých redaktorov.',
'emailsubject' => 'Vec',
'emailmessage' => 'Správa',
'emailsend' => 'Odoslať',
+'emailccme' => 'Pošli mi emailom kópiu mojej správy.',
+'emailccsubject' => 'Kópia správy pre $1: $2',
'emailsent' => 'E-mail bol odoslaný',
'emailsenttext' => 'Vaša e-mailová správa bola odoslaná.',
-'watchlist' => 'Sledované Älánky',
+'watchlist' => 'Sledované stránky',
'watchlistfor' => '(používateľa \'\'\'$1\'\'\')',
-'nowatchlist' => 'V sledovaných Älánkoch nemáte žiadne položky.',
+'nowatchlist' => 'V zozname sledovaných stránok nemáte žiadne položky.',
'watchlistanontext' => 'Prosím $1 pre prezeranie alebo úpravu Vášho zoznamu sledovaných stránok.',
'watchlistcount' => '\'\'\'Na zozname sledovaných máte $1 položiek (vrátane diskusných stránok).\'\'\'',
'clearwatchlist' => 'VyÄistiÅ¥ zoznam sledovaných',
@@ -1056,45 +1089,45 @@ alebo sa rozhodol, že nebude prijímať e-maily od druhých redaktorov.',
'watchlistclearbutton' => 'VyÄistiÅ¥ zoznam sledovaných',
'watchlistcleardone' => 'Váš zoznam sledovaných bol vyÄistený. $1 položiek bolo odstránených.',
'watchnologin' => 'Nie ste prihlásený/á',
-'watchnologintext' => 'Musíte byÅ¥ [[Special:Userlogin|prihlásený/á]], aby ste mohli modifikovaÅ¥ vaÅ¡e sledované Älánky.',
-'addedwatch' => 'Pridaný do sledovaných Älánkov',
-'addedwatchtext' => 'Stránka [[$1]] bola pridaná do [[Special:Watchlist|sledovaných Älánkov]]. Budú tam uvedené ÄalÅ¡ie úpravy tejto stránky a jej diskusie a stránka bude zobrazená \'\'\'tuÄne\'\'\' v [[Special:Recentchanges|zozname posledných úprav]], aby ste ju ľahÅ¡ie naÅ¡li.
+'watchnologintext' => 'Musíte byť [[Special:Userlogin|prihlásený/á]], aby ste mohli modifikovať vaše sledované stránky.',
+'addedwatch' => 'Pridaná do zoznamu sledovaných stránok',
+'addedwatchtext' => 'Stránka [[$1]] bola pridaná do [[Special:Watchlist|sledovaných stránok]]. Budú tam uvedené ÄalÅ¡ie úpravy tejto stránky a jej diskusie a stránka bude zobrazená \'\'\'tuÄne\'\'\' v [[Special:Recentchanges|zozname posledných úprav]], aby ste ju ľahÅ¡ie naÅ¡li.
Ak budete chcieť neskôr stránku odstrániť zo sledovaných stránok, kliknite na "nesleduj" v horných záložkách.',
-'removedwatch' => 'Odstránený zo sledovaných Älánkov',
-'removedwatchtext' => 'ÄŒlánok "$1" bol odstránený z vaÅ¡ich sledovaných Älánkov.',
+'removedwatch' => 'Odstránená zo zoznamu sledovaných stránok',
+'removedwatchtext' => 'Stránka "$1" bol odstránená z vášho zoznamu sledovaných stránok.',
'watch' => 'Sleduj',
'watchthispage' => 'Sleduj túto stránku',
'unwatch' => 'Nesleduj',
-'unwatchthispage' => 'Nesleduj tento Älánok',
-'notanarticle' => 'Toto nie je Älánok',
+'unwatchthispage' => 'Nesleduj túto stránku',
+'notanarticle' => 'Toto nie je stránka',
'watchnochange' => 'V rámci zobrazeného Äasu nebola upravená žiadna z VaÅ¡ich sledovaných stránok.',
'watchdetails' => '($1 sledovaných stránok, nepoÄítajúc stránky diskusie;
$2 úprav stránok spolu od ukonÄenia;
$3...
[[Special:Watchlist/edit|zobraz a upravuj úplný zoznam]].)',
'wlheader-enotif' => '* Upozorňovanie e-mailom je zapnuté.',
-'wlheader-showupdated' => '* ÄŒlánky, ktoré boli zmené od vaÅ¡ej poslednej návÅ¡tevy sú zobrazené \'\'\'tuÄne\'\'\'.',
-'watchmethod-recent' => 'kontrolujem posledné úpravy sledovaných Älánkov',
-'watchmethod-list' => 'kontrolujem sledované Älánky na posledné úpravy',
-'removechecked' => 'Odstráň vybrané položky zo sledovaných Älánkov',
-'watchlistcontains' => 'VaÅ¡e sledované Älánky obsahujú $1 Älánkov.',
+'wlheader-showupdated' => '* Stránky, ktoré boli zmené od vaÅ¡ej poslednej návÅ¡tevy sú zobrazené \'\'\'tuÄne\'\'\'.',
+'watchmethod-recent' => 'kontrolujem posledné úpravy sledovaných stránok',
+'watchmethod-list' => 'kontrolujem sledované stránky na posledné úpravy',
+'removechecked' => 'Odstráň vybrané položky zo zoznamu sledovaných stránok',
+'watchlistcontains' => 'Váš zoznam sledovaných stránok obsahuje $1 položiek.',
'watcheditlist' => 'Tu je abecedný zoznam vašich
-sledovaných Älánkov. OznaÄte Älánky, ktoré chcete odstrániÅ¥
-a kliknite na tlaÄidlo \'Odstráň vybrané\'
-na spodnej Äasti obrazovky.',
-'removingchecked' => 'Odstraňujem požadované položky zo sledovaných Älánkov ...',
+sledovaných stránok. OznaÄte stránky, ktoré chcete odstrániÅ¥ a kliknite na tlaÄidlo
+\'Odstráň vybrané\'
+na spodnej Äasti obrazovky (odstránie stránky v hlavnom mennom priestore tiež odstráni prísluÅ¡nú diskusnú stránku a naopak).',
+'removingchecked' => 'Odstraňujem požadované položky zo zoznamu sledovaných stránok...',
'couldntremove' => 'Nemôžem odstrániť položku \'$1\'...',
'iteminvalidname' => 'Problém s položkou \'$1\', neplatné meno...',
'wlnote' => 'Nižšie je posledných $1 zmien v posledných <b>$2</b> hodinách.',
'wlshowlast' => 'Zobraz posledných $1 hodín $2 dní $3',
-'wlsaved' => 'Toto je uložená verzia vaÅ¡ich sledovaných Älánkov.',
+'wlsaved' => 'Toto je uložená verzia zoznamu vašich sledovaných stránok.',
'wlhideshowown' => '$1 moje úpravy.',
'wlhideshowbots' => '$1 úprav botov.',
'wldone' => 'Hotovo.',
'enotif_mailer' => 'UpozorňovaÄ {{GRAMMAR:genitív|{{SITENAME}}}}',
'enotif_reset' => 'Vynulovať upozornenia (nastav ich status na "navštívené")',
-'enotif_newpagetext' => 'Toto je nový Älánok.',
+'enotif_newpagetext' => 'Toto je nová stránka.',
'changed' => 'zmene',
'created' => 'vytvorení',
'enotif_subject' => '{{SITENAME}} - stránka $PAGETITLE bola $CHANGEDORCREATED $PAGEEDITOR',
@@ -1110,12 +1143,12 @@ Kontaktujte redaktora:
mail $PAGEEDITOR_EMAIL
wiki $PAGEEDITOR_WIKI
-Nedostanete ÄalÅ¡ie upozornenia, aj ak bude Älánok znovu upravovaný, kým nenavÅ¡tivíte tento Älánok. Možete tiež vynulovaÅ¥ upozornenia pre vÅ¡etky vaÅ¡e sledované stránky.
+Nedostanete ÄalÅ¡ie upozornenia, aj ak bude stránka znovu upravovaná, kým nenavÅ¡tívíte túto stránku. Možete tiež vynulovaÅ¥ upozornenia pre vÅ¡etky vaÅ¡e sledované stránky.
Váš upozorňovací systém {{GRAMMAR:genitív|{{SITENAME}}}}
--
-Pre zmenu nastavenia vaÅ¡ich sledovaných Älánkov navÅ¡tívte
+Pre zmenu nastavenia vašich sledovaných stránok navštívte
{{fullurl:Special:Watchlist/edit}}
Návrhy a ÄalÅ¡ia pomoc:
@@ -1123,7 +1156,7 @@ Návrhy a ÄalÅ¡ia pomoc:
'deletepage' => 'Zmazať stránku',
'confirm' => 'Potvrdiť',
'excontent' => 'obsah bol: \'$1\'',
-'excontentauthor' => 'obsah bol: \'$1\' (a jediný autor bol \'$2\')',
+'excontentauthor' => 'obsah bol: \'$1\' (a jediný autor bol \'[[Special:Contributions/$2]]\')',
'exbeforeblank' => 'obsah pred vyÄistením stránky bol: \'$1\'',
'exblank' => 'stránka bola prázdna',
'confirmdelete' => 'Potvrdiť zmazanie',
@@ -1147,7 +1180,7 @@ VÅ¡etky zobrazené Äasy sú Äasy na serveri (UTC).
'rollback_short' => 'Rollback',
'rollbacklink' => 'rollback',
'rollbackfailed' => 'Rollback neúspešný',
-'cantrollback' => 'Nemôžem úpravu vrátiÅ¥ späť, posledný autor je jediný autor tohto Älánku.',
+'cantrollback' => 'Nemôžem úpravu vrátiť späť, posledný autor je jediný autor tejto stránky.',
'alreadyrolled' => 'Nemôžem vrátiÅ¥ späť poslednú úpravu [[$1]] od [[User:$2|$2]] ([[User talk:$2|Diskusia]]); niekto iný buÄ upravoval stránku, alebo už vrátil späť.
Autorom poslednej úpravy je [[User:$3|$3]] ([[User talk:$3|Diskusia]]).',
@@ -1179,22 +1212,23 @@ Uistite sa prosím, že dodržiavate [[Project:Chránená stránka|zásady proje
'protect-level-sysop' => 'Len pre správcov',
'restriction-edit' => 'Úprava',
'restriction-move' => 'Presun',
-'undelete' => 'Obnov zmazaný Älánok',
-'undeletepage' => 'Zobraz a obnov zmazané Älánky',
+'undelete' => 'Obnov zmazanú stránku',
+'undeletepage' => 'Zobraz a obnov zmazané stránky',
'viewdeletedpage' => 'Zobraz zmazané stránky',
-'undeletepagetext' => 'Tieto Älánky boli zmazané, ale sú stále v archíve a
+'undeletepagetext' => 'Tieto stránky boli zmazané, ale sú stále v archíve a
môžu byť obnovené. Archív môže byť pravidelne vyprázdnený.',
'undeleteextrahelp' => 'Ak chcete obnoviť celú stránku, nechajte všetky zaškrtávacie polia nezaškrtnuté a kliknite na \'\'\'\'\'Obnov!\'\'\'\'\'.
Ak chcete vykonať selektívnu obnovu, zašktrnite polia zodpovedajúce revíziám, ktoré sa majú obnoviť a kliknite na \'\'\'\'\'Obnov\'\'\'\'\'.
Kliknutie na \'\'\'\'\'Reset\'\'\'\'\' vyÄistí pole s komentárom a vÅ¡etky zaÅ¡krtávacie polia.',
-'undeletearticle' => 'Obnov zmazaný Älánok',
+'undeletearticle' => 'Obnov zmazanú stránku',
'undeleterevisions' => '$1 {{PLURAL:verzia je archivovaná|verzie sú archivované|verzií je archivovaných}}',
-'undeletehistory' => 'Ak obnovíte tento Älánok, obnovia sa aj vÅ¡etky predchádzajúce verzie do zoznamu predchádzajúcich verzií.
-Ak bol od zmazania vytvorený nový Älánok s tým istým menom, zobrazia sa
-obnovené verzie ako posledné úpravy nového Älánku a aktuálna verzia nového Älánku
+'undeletehistory' => 'Ak obnovíte túto stránku, obnovia sa aj všetky predchádzajúce verzie do zoznamu predchádzajúcich verzií.
+Ak bola od zmazania vytvorená nová stránka s rovnakým názvom, zobrazia sa
+obnovené verzie ako posledné úpravy novej stránky a aktuálna verzia novej stránky
nebude automaticky nahradená.',
-'undeletehistorynoadmin'=> 'Tento Älánok bol zmazaný. Dôvod zmazania je zobrazený dolu v zhrnutí spolu s podrobnosÅ¥ami o používateľoch, ktorí túto stránku upravovali pred zmazaním. Samotný text týchto zmazaných revízií je prístupný iba administrátorom.',
+'undeletehistorynoadmin'=> 'Táto stránka bola zmazaná. Dôvod zmazania je zobrazený dolu v zhrnutí spolu s podrobnosťami o používateľoch, ktorí túto stránku upravovali pred zmazaním. Samotný text týchto zmazaných revízií je prístupný iba správcom.',
'undeleterevision' => 'Zmazaná verzia zo dňa a Äasu $1',
+'undeleterevision-missing'=> 'Neplatná alebo chýbajúca revízia. Zrejme ste použili zlý odkaz alebo revízia bola obnovená alebo odstránená z histórie.',
'undeletebtn' => 'Obnov!',
'undeletereset' => 'Reset',
'undeletecomment' => 'Komentár:',
@@ -1222,13 +1256,14 @@ Zoznam posledných mazaní a obnovení nájdete v [[Special:Log/delete|Zázname
'sp-contributions-newer'=> 'Novších $1',
'sp-contributions-older'=> 'Starších $1',
'sp-contributions-newbies-sub'=> 'Pre nováÄikov',
-'whatlinkshere' => 'Odkazy na tento Älánok',
+'whatlinkshere' => 'Odkazy na túto stránku',
+'whatlinkshere-barrow' => '&lt;',
'notargettitle' => 'Nebol zadaný cieľ',
-'notargettext' => 'Nezadali ste cieľový Älánok alebo redaktora,
+'notargettext' => 'Nezadali ste cieľovú stránku alebo redaktora,
na ktorý/-ého chcete aplikovať túto funkciu.',
'linklistsub' => '(Zoznam odkazov)',
'linkshere' => 'Nasledujúce stránky odkazujú na \'\'\'[[:$1]]\'\'\':',
-'nolinkshere' => 'Žiadne Älánky neodkazujú na \'\'\'[[:$1]]\'\'\'.',
+'nolinkshere' => 'Žiadne stránky neodkazujú na \'\'\'[[:$1]]\'\'\'.',
'isredirect' => 'presmerovacia stránka',
'istemplate' => 'použitá',
'blockip' => 'Zablokovať redaktora',
@@ -1241,6 +1276,7 @@ Nižšie uveÄte konkrétny dôvod (napríklad uveÄte konkrétne stránky, ktor
'ipbreason' => 'Dôvod',
'ipbanononly' => 'Blokovať iba anonymných používateľov.',
'ipbcreateaccount' => 'Zabráň vytváraniu úÄtov',
+'ipbenableautoblock' => 'Automaticky blokovaÅ¥ poslednú IP adresu, ktorú tento používateľ použil, a vÅ¡etky ÄalÅ¡ie adresy, z ktorých sa pokúsi upravovaÅ¥.',
'ipbsubmit' => 'Zablokovať tohto redaktora',
'ipbother' => 'Iný Äas',
'ipboptions' => '2 hodiny:2 hours,1 deň:1 day,3 dni:3 days,1 týždeň:1 week,2 týždne:2 weeks,1 mesiac:1 month,3 mesiace:3 months,6 mesiacov:6 months,1 rok:1 year,na neurÄito:infinite',
@@ -1259,6 +1295,7 @@ z doteraz zablokovanej IP adresy alebo od redaktora.',
'infiniteblock' => 'na neurÄito',
'expiringblock' => 'ukonÄenie $1',
'anononlyblock' => 'iba anon.',
+'noautoblockblock' => 'automatické blokovanie vypnuté',
'createaccountblock' => 'tvorba úÄtov bola zablokovaná',
'ipblocklistempty' => 'Zoznam blokovaných je prázdny.',
'blocklink' => 'zablokovať',
@@ -1289,8 +1326,8 @@ redaktorov upravovať stránky, meniť svoje nastavenia, upravovať sledované s
iné veci vyžadujúce zmeny v databáze.
PotvrÄte, že to naozaj chcete urobiÅ¥, a že
odomknete databázu po ukonÄení údržby.',
-'unlockdbtext' => 'Odomknutie databázy obnoví možnosť všetkých
-redaktorov upravovaÅ¥ Älánky, meniÅ¥ svoje nastavenia, upravovaÅ¥ svoje sledovaných Älánky a
+'unlockdbtext' => 'Odomknutie databázy obnoví schopnosť všetkých
+redaktorov upravovať stránky, meniť svoje nastavenia, upravovať svoj zoznam sledovaných stránok a
iné veci vyžadujúce zmeny v databáze.
PotvrÄte, že to naozaj chcete urobiÅ¥.',
'lockconfirm' => 'Ãno, naozaj chcem zamknúť databázu.',
@@ -1323,43 +1360,43 @@ Do poľa napíšte meno redaktora a potvrÄte zmenu redaktora na správcu',
'already_sysop' => 'Tento redaktor už je správca',
'already_bureaucrat' => 'Tento redaktor už je byrokrat',
'rightsnone' => '(žiadne)',
-'movepage' => 'Presunúť Älánok',
-'movepagetext' => 'Pomocou tohto formulára premenujete Älánok a premiestnite vÅ¡etky jeho predchádzajúce verzie pod zadané nové meno.
-Starý názov sa stane presmerovacím Älánkom na nový názov.
-Odkazy na starý Älánok sa vÅ¡ak nezmenia, ubezpeÄte sa, že ste skontrolovali
+'movepage' => 'Presunúť stránku',
+'movepagetext' => 'Pomocou tohto formulára premenujete stránku a premiestnite všetky jej predchádzajúce verzie pod zadané nové meno.
+Starý názov sa stane presmerovacou stránkou na nový názov.
+Odkazy na starú stránku sa vÅ¡ak nezmenia, ubezpeÄte sa, že ste skontrolovali
výskyt dvojitých alebo pokazených presmerovaní.
Vy ste zodpovedný za to, aby odkazy naÄalej ukazovali
tam, kam majú.
-Uvedomte si, že Älánok sa nepremiestni, ak pod novým názvom
-už Älánok existuje. Toto neplatí iba ak je Älánok prázdny alebo presmerovací a nemá
-žiadne predchádzajúce verzie. To znamená, že môžete premenovaÅ¥ Älánok späť na meno,
-ktoré mal pred premenovaním, ak ste sa pomýlili, a že nemôžete prepísať
-existujúci Älánok.
+Uvedomte si, že stránka sa \'\'\'nepremiestni\'\'\', ak pod novým názvom
+už stránka existuje. Toto neplatí iba ak je stránka prázdna alebo presmerovacia a nemá
+žiadne predchádzajúce verzie. To znamená, že môžete premenovať stránku späť na názov,
+ktorý mala pred premenovaním, ak ste sa pomýlili, a že nemôžete prepísať
+existujúcu stránku.
-\'\'\'POZOR!\'\'\'
-Toto môže byÅ¥ drastická a neÄakaná zmena pre populárny Älánok;
+<b>POZOR!</b>
+Toto môže byÅ¥ drastická a neÄakaná zmena pre populárnu stránku;
ubezpeÄte sa preto, skôr ako budete pokraÄovaÅ¥, že chápete
dôsledky svojho Äinu.',
-'movepagetalktext' => 'PrísluÅ¡ná Diskusná stránka (ak vôbec existuje) bude premiestnená spolu so samotným Älánkom; \'\'\'nestane sa tak, iba ak:\'\'\'
-*premiestňujete Älánok do iného menného priestoru,
+'movepagetalktext' => 'Príslušná diskusná stránka (ak existuje) bude premiestnená spolu so samotnou stránkou; \'\'\'nestane sa tak, iba ak:\'\'\'
*už existuje Diskusná stránka pod týmto novým menom, alebo
*nezaÅ¡krtnete nižšie sa nachádzajúci textový rámÄek.
-V takých prípadoch budete musieÅ¥, ak si to želáte, premiestniÅ¥ alebo zlúÄiÅ¥ Älánok ruÄne.',
-'movearticle' => 'Presuň Älánok',
+V takých prípadoch budete musieÅ¥, ak si to želáte, premiestniÅ¥ alebo zlúÄiÅ¥ stránku ruÄne.',
+'movearticle' => 'Presuň stránku',
'movenologin' => 'Nie ste prihlásený',
-'movenologintext' => 'Musíte byÅ¥ registrovaný redaktor a [[Special:Userlogin|prihlásený]], aby ste mohli presunúť Älánok.',
+'movenologintext' => 'Musíte byť registrovaný redaktor a [[Special:Userlogin|prihlásený]], aby ste mohli presunúť stránku.',
'newtitle' => 'Na nový názov',
-'movepagebtn' => 'Presunúť Älánok',
+'movepagebtn' => 'Presunúť stránku',
'pagemovedsub' => 'Presun bol úspešný',
-'pagemovedtext' => 'Článok "[[$1]]" bol presunutý na "[[$2]]".',
+'pagemovedtext' => 'Stránka "[[$1]]" bola presunutá na "[[$2]]".',
'articleexists' => 'Stránka s týmto názvom už existuje alebo
vami zadaný názov je neplatný.
Prosím vyberte si iný názov.',
-'talkexists' => 'Samotný Älánok bol úspeÅ¡ne premiestnený,
-ale Diskusná stránka sa nedala premiestniť,
-pretože už jedna existuje pod zadaným novým názvom. ZlúÄte ich manuálne.',
+'talkexists' => '\'\'\'Samotná stránka bola úspešne premiestnená,
+ale diskusná stránka sa nedala premiestniť,
+pretože už jedna existuje pod zadaným novým názvom.
+Prosím, zlúÄte ich ruÄne.\'\'\'',
'movedto' => 'presunutý na',
'movetalk' => 'Premiestniť aj "diskusnú" stránku, ak je to možné.',
'talkpagemoved' => 'Príslušná diskusná stránka bola tiež premiestnená.',
@@ -1371,13 +1408,13 @@ pretože už jedna existuje pod zadaným novým názvom. ZlúÄte ich manuálne.
'movereason' => 'Dôvod',
'revertmove' => 'obnova',
'delete_and_move' => 'Vymaž a presuň',
-'delete_and_move_text' => '==Potreba zmazaÅ¥ Älánok==
+'delete_and_move_text' => '==Je potrebné zmazať stránku==
-Cieľový Älánok "[[$1]]" už existuje. Chcete ho vymazaÅ¥ a vytvoriÅ¥ tak priestor pre presun?',
+Cieľová stránka "[[$1]]" už existuje. Chcete ho vymazať a vytvoriť tak priestor pre presun?',
'delete_and_move_confirm'=> 'Ãno, zmaž stránku',
'delete_and_move_reason'=> 'Vymaž, aby sa umožnil presun',
-'selfmove' => 'Zdrojový a cieľový názov sú rovnaké; nemôžem presunúť Älánok na seba samého.',
-'immobile_namespace' => 'Cieľový názov je Å¡peciálneho typu; nemôžem presunúť Älánok do tohto menného priestoru.',
+'selfmove' => 'Zdrojový a cieľový názov sú rovnaké; nemôžem presunúť stránku na seba samú.',
+'immobile_namespace' => 'Cieľový názov je špeciálneho typu; nemôžem presunúť stránku do tohto menného priestoru.',
'export' => 'Export stránok',
'exporttext' => 'Môžete exportovať text a históriu úprav konkrétnej
stránky alebo množiny stránok do XML; tieto môžu byť potom importované do iného
@@ -1388,6 +1425,7 @@ Pre export stránok zadajte názvy do tohto poľa, jeden názov na riadok, a zvo
V druhom prípade môžete tiež použiť odkaz, napr. [[Special:Export/{{Mediawiki:Mainpage}}]] pre stránku {{Mediawiki:Mainpage}}.',
'exportcuronly' => 'Zahrň iba aktuálnu verziu, nie kompletnú históriu',
'exportnohistory' => '----',
+'export-submit' => 'Export',
'allmessages' => 'Všetky systémové správy',
'allmessagesname' => 'Názov',
'allmessagesdefault' => 'štandardný text',
@@ -1401,7 +1439,7 @@ V druhom prípade môžete tiež použiť odkaz, napr. [[Special:Export/{{Mediaw
'missingimage' => '<b>Chýbajúci obrázok</b><br /><i>$1</i>\n',
'filemissing' => 'Chýbajúci súbor',
'thumbnail_error' => 'Chyba pri vytváraní náhľadu: $1',
-'import' => 'Import Älánkov',
+'import' => 'Import stránok',
'importinterwiki' => 'Transwiki import',
'import-interwiki-text' => 'Zvoľte wiki a názov stránky, ktorá sa má importovať.
Dátumy revízií a mná redaktorov budú zachované.
@@ -1419,7 +1457,7 @@ Všetky transwiki importy sa zaznamenávajú v [[Special:Log/import|Zázname imp
'importbadinterwiki' => 'Zlý interwiki odkaz',
'importnotext' => 'Prázdny alebo žiadny text',
'importsuccess' => 'Import úspešný!',
-'importhistoryconflict' => 'Existujú konfliktné histórie revízií (možno už bol tento Älánok importovaný)',
+'importhistoryconflict' => 'Existujú konfliktné histórie revízií (možno už bola táto stránka importovaná)',
'importnosources' => 'Neboli definované žiadne zdroje pre transwiki import a priame nahranie histórie je vypnuté.',
'importnofile' => 'Nebol nahraný import súbor.',
'importuploaderror' => 'Nahrávanie importovaného súboru sa nepodarilo; možno súbor presahuje najväÄÅ¡iu povolenú veľkosÅ¥.',
@@ -1433,17 +1471,17 @@ Všetky transwiki importy sa zaznamenávajú v [[Special:Log/import|Zázname imp
'accesskey-minoredit' => 'i',
'accesskey-save' => 's',
'accesskey-preview' => 'p',
-'accesskey-diff' => 'd',
+'accesskey-diff' => 'v',
'accesskey-compareselectedversions'=> 'v',
'accesskey-watch' => 'w',
'tooltip-search' => 'Hľadaj v tomto wiki [alt-f]',
'tooltip-minoredit' => 'OznaÄ toto ako drobnú úpravu [alt-i]',
'tooltip-save' => 'Uloží vaše úpravy [alt-s]',
'tooltip-preview' => 'Náhľad úprav, prosím použite pred uložením! [alt-p]',
-'tooltip-diff' => 'Ukáž, aké zmeny ste urobili v texte. [alt-d]',
-'tooltip-compareselectedversions'=> 'Zobraz rozdiely medzi dvoma vybranými verziami tohto Älánku. [alt-v]',
+'tooltip-diff' => 'Ukáž, aké zmeny ste urobili v texte. [alt-v]',
+'tooltip-compareselectedversions'=> 'Zobraz rozdiely medzi dvoma vybranými verziami tejto stránky. [alt-v]',
'tooltip-watch' => 'Pridaj túto stránku k sledovaným. [alt-w]',
-'Monobook.css' => '/* úpravou tohto súboru si prispôsobíte skin monobook pre celú wiki */',
+'monobook.css' => '/* úpravou tohto súboru si prispôsobíte skin monobook pre celú wiki */',
'nodublincore' => 'Dublin Core RDF metadata sú pre tento server vypnuté.',
'nocreativecommons' => 'Creative Commons RDF metadata sú pre tento server vypnuté.',
'notacceptable' => 'Wiki server nedokáže poskytovaÅ¥ dáta vo formáte, v akom ich váš klient vie ÄítaÅ¥.',
@@ -1455,105 +1493,96 @@ Všetky transwiki importy sa zaznamenávajú v [[Special:Log/import|Zázname imp
'others' => 'iné',
'siteusers' => 'Redaktori {{GRAMMAR:genitív|{{SITENAME}}}} $1',
'creditspage' => 'Autori stránky',
-'nocredits' => 'Pre tento Älánok neexistujú žiadne dostupné ocenenia.',
+'nocredits' => 'Pre túto stránku neexistujú žiadne dostupné ocenenia.',
'spamprotectiontitle' => 'Filter na ochranu pred spamom',
-'spamprotectiontext' => 'Článok, ktorý ste chceli uložiť, bol blokovaný filtrom na spam. Pravdepodobne to spôsobil link na externú internetovú lokalitu (site).',
+'spamprotectiontext' => 'Stránka, ktorú ste chceli uložiť, bola blokovaná filtrom na spam. Pravdepodobne to spôsobil link na externú internetovú lokalitu (site).',
'spamprotectionmatch' => 'Nasledujúci text aktivoval náš spam filter: $1',
'subcategorycount' => 'V tejto kategórii {{PLURAL:$1|je jedna podkategória|sú $1 podkategórie|je $1 podkategórií}}.',
-'categoryarticlecount' => 'V tejto kategórii {{PLURAL:$1|je jeden Älánok|sú $1 Älánky|je $1 Älánkov}}.',
+'categoryarticlecount' => 'V tejto kategórii {{PLURAL:$1|je jedna stránka|sú $1 stránky|je $1 stránok}}.',
+'category-media-count' => 'V tejto kategórii {{PLURAL:$1|je jeden súbor|sú $1 súbory|je $1 súborov}}.',
'listingcontinuesabbrev'=> ' pokraÄ.',
'spambot_username' => 'MediaWiki Äistenie spamu',
'spam_reverting' => 'Revertujem na poslednú verziu, ktorá neobsahuje odkazy na $1',
'spam_blanking' => 'Všetky revízie obsahovali odkaz na $1, odstraňujem obsah',
'infosubtitle' => 'Informácie o stránke',
-'numedits' => 'PoÄet úprav (Älánok): $1',
-'numtalkedits' => 'PoÄet úprav (diskusia k Älánku): $1',
+'numedits' => 'PoÄet úprav (stránka): $1',
+'numtalkedits' => 'PoÄet úprav (diskusná stránka): $1',
'numwatchers' => 'PoÄet zobrazení: $1',
-'numauthors' => 'PoÄet odliÅ¡ných autorov (Älánok): $1',
-'numtalkauthors' => 'PoÄet odliÅ¡ných autorov (diskusia k Älánku): $1',
-'mw_math_png' => 'Vždy vytvor PNG',
+'numauthors' => 'PoÄet odliÅ¡ných autorov (stránka): $1',
+'numtalkauthors' => 'PoÄet odliÅ¡ných autorov (diskusná stránka): $1',
+'mw_math_png' => 'Vždy vykresľuj PNG',
'mw_math_simple' => 'Na jednoduché použi HTML, inak PNG',
'mw_math_html' => 'Ak sa dá, použi HTML, inak PNG',
'mw_math_source' => 'Ponechaj TeX (pre textové prehliadaÄe)',
-'mw_math_modern' => 'OdporúÄame pre moderné prehliadaÄe',
+'mw_math_modern' => 'OdporúÄané pre moderné prehliadaÄe',
'mw_math_mathml' => 'MathML (experimentálne)',
'markaspatrolleddiff' => 'OznaÄ ako strážený',
-'markaspatrolledtext' => 'OznaÄ tento Älánok ako strážený',
+'markaspatrolledtext' => 'OznaÄ túto stránku ako stráženú',
'markedaspatrolled' => 'OznaÄené ako strážené',
'markedaspatrolledtext' => 'Vybraná verzia bola oznaÄená na stráženie.',
'rcpatroldisabled' => 'Stráženie posledných zmien bolo vypnuté',
'rcpatroldisabledtext' => 'Funkcia stráženia posledných zmien je momentálne vypnutá.',
'markedaspatrollederror'=> 'Nie je možné oznaÄiÅ¥ ako strážený',
'markedaspatrollederrortext'=> 'Pre oznaÄenie ako strážený je potrebné uviesÅ¥ revíziu, ktorá sa má oznaÄiÅ¥ ako strážená.',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* bublinové tipy a prístupové klávesy */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Moja redaktorská stránka\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Stránka redaktora pre ip adresu, ktorú upravujete ako\');
ta[\'pt-mytalk\'] = new Array(\'n\',\'Moja diskusná stránka\');
ta[\'pt-anontalk\'] = new Array(\'n\',\'Diskusia o úpravách z tejto ip adresy\');
ta[\'pt-preferences\'] = new Array(\'\',\'Moje nastavenia\');
- ta[\'pt-watchlist\'] = new Array(\'l\',\'Zoznam Älánkov, na ktorých sledujete zmeny.\');
+ ta[\'pt-watchlist\'] = new Array(\'l\',\'Zoznam stránok, na ktorých sledujete zmeny.\');
ta[\'pt-mycontris\'] = new Array(\'y\',\'Zoznam mojich príspevkov\');
ta[\'pt-login\'] = new Array(\'o\',\'OdporúÄame Vám prihlásiÅ¥ sa, nie je to vÅ¡ak povinné.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'OdporúÄame Vám prihlásiÅ¥ sa, nie je to vÅ¡ak povinné.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Odhlásenie\');
- ta[\'ca-talk\'] = new Array(\'t\',\'Diskusia o obsahu Älánku\');
- ta[\'ca-edit\'] = new Array(\'e\',\'Môžete upravovaÅ¥ tento Älánok. Prosíme, použite tlaÄidlo náhľad pre uložením.\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Odhlásenie\');
+ ta[\'ca-talk\'] = new Array(\'t\',\'Diskusia o obsahu stránky\');
+ ta[\'ca-edit\'] = new Array(\'e\',\'Môžete upravovaÅ¥ túto stránku. Prosíme, pred uložením použite tlaÄidlo ZobraziÅ¥ náhľad.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Pridaj komentár k tejto diskusii.\');
- ta[\'ca-viewsource\'] = new Array(\'e\',\'Tento Älánok je zamknutý. Môžete vÅ¡ak vidieÅ¥ jeho zdrojový text.\');
- ta[\'ca-history\'] = new Array(\'h\',\'Minulé verzie tohto Älánku.\');
- ta[\'ca-protect\'] = new Array(\'=\',\'Zamkni tento Älánok\');
- ta[\'ca-delete\'] = new Array(\'d\',\'Vymaž tento Älánok\');
- ta[\'ca-undelete\'] = new Array(\'d\',\'Obnov úpravy tohto Älánku až po dobu jeho vymazania\');
- ta[\'ca-move\'] = new Array(\'m\',\'Presuň tento Älánok\');
- ta[\'ca-watch\'] = new Array(\'w\',\'PridaÅ¥ tento Älánok do sledovaných Älánkov\');
- ta[\'ca-unwatch\'] = new Array(\'w\',\'OdstrániÅ¥ tento Älánok zo sledovaných Älánkov\');
+ ta[\'ca-viewsource\'] = new Array(\'e\',\'Táto stránka je zamknutá. Môžete však vidieť jej zdrojový text.\');
+ ta[\'ca-history\'] = new Array(\'h\',\'Minulé verzie tejto stránky.\');
+ ta[\'ca-protect\'] = new Array(\'=\',\'Zamkni túto stránku\');
+ ta[\'ca-delete\'] = new Array(\'d\',\'Vymaž túto stránku\');
+ ta[\'ca-undelete\'] = new Array(\'d\',\'Obnov úpravy tejtoto stránky až po dobu jeho vymazania\');
+ ta[\'ca-move\'] = new Array(\'m\',\'Presuň túto stránku\');
+ ta[\'ca-watch\'] = new Array(\'w\',\'Pridať túto stránku do zoznamu sledovaných stránok\');
+ ta[\'ca-unwatch\'] = new Array(\'w\',\'Odstrániť túto stránku zo sledovaných stránok\');
ta[\'search\'] = new Array(\'f\',\'Prehľadávanie tejto wiki\');
ta[\'p-logo\'] = new Array(\'\',\'Hlavná stránka\');
ta[\'n-mainpage\'] = new Array(\'z\',\'Navštíviť Hlavnú stránku\');
ta[\'n-portal\'] = new Array(\'\',\'O projekte, ako môžete prispieÅ¥, kde Äo nájsÅ¥\');
ta[\'n-currentevents\'] = new Array(\'\',\'Aktuálne udalosti a ich pozadie\');
ta[\'n-recentchanges\'] = new Array(\'r\',\'Zoznam posledných úprav vo wiki.\');
- ta[\'n-randompage\'] = new Array(\'x\',\'Zobrazenie náhodného Älánku\');
+ ta[\'n-randompage\'] = new Array(\'x\',\'Zobrazenie náhodnej stránky\');
ta[\'n-help\'] = new Array(\'\',\'Pozrieť si pomoc.\');
ta[\'n-sitesupport\'] = new Array(\'\',\'Podporte nás\');
- ta[\'t-whatlinkshere\'] = new Array(\'j\',\'Zoznam vÅ¡etkých wiki Älánkov, ktoré sem odkazujú\');
- ta[\'t-recentchangeslinked\'] = new Array(\'k\',\'Posledné úpravy v Älánkoch, ktoré odkazujú na túto stránku\');
+ ta[\'t-whatlinkshere\'] = new Array(\'j\',\'Zoznam všetkých wiki stránok, ktoré sem odkazujú\');
+ ta[\'t-recentchangeslinked\'] = new Array(\'k\',\'Posledné úpravy v stránkach, ktoré odkazujú na túto stránku\');
ta[\'feed-rss\'] = new Array(\'\',\'RSS feed pre túto stránku\');
ta[\'feed-atom\'] = new Array(\'\',\'Atom feed pre túto stránku\');
ta[\'t-contributions\'] = new Array(\'\',\'Pozrieť si zoznam príspevkov od tohto redaktora\');
ta[\'t-emailuser\'] = new Array(\'\',\'Poslať e-mail tomuto redaktorovi\');
- ta[\'t-upload\'] = new Array(\'u\',\'Nahranie obrázkových alebo mediálnych súborov\');
+ ta[\'t-upload\'] = new Array(\'u\',\'Nahranie obrázkových alebo multimediálnych súborov\');
ta[\'t-specialpages\'] = new Array(\'q\',\'Zoznam všetkých špeciálnych stránok\');
- ta[\'ca-nstab-main\'] = new Array(\'c\',\'PozrieÅ¥ si obsah Älánku\');
+ ta[\'ca-nstab-main\'] = new Array(\'c\',\'Pozrieť si obsah stránky\');
ta[\'ca-nstab-user\'] = new Array(\'c\',\'Pozrieť si stránku redaktora\');
- ta[\'ca-nstab-media\'] = new Array(\'c\',\'Pozrieť si stránku médii\');
+ ta[\'ca-nstab-media\'] = new Array(\'c\',\'Pozrieť si stránku médií\');
ta[\'ca-nstab-special\'] = new Array(\'\',\'Toto je špeciálna stránka, nemôžete ju upravovať.\');
ta[\'ca-nstab-project\'] = new Array(\'c\',\'Pozrieť si stránku projektu\');
ta[\'ca-nstab-image\'] = new Array(\'c\',\'Pozrieť si stránku obrázku\');
ta[\'ca-nstab-mediawiki\'] = new Array(\'c\',\'Pozrieť si systémovú stránku\');
ta[\'ca-nstab-template\'] = new Array(\'c\',\'Pozrieť si šablónu\');
- ta[\'ca-nstab-help\'] = new Array(\'c\',\'Pozrieť si stránku s Pomocou\');
+ ta[\'ca-nstab-help\'] = new Array(\'c\',\'Pozrieť si stránku Pomocníka\');
ta[\'ca-nstab-category\'] = new Array(\'c\',\'Pozrieť si stránku s kategóriami\');',
'deletedrevision' => 'Zmazať staré verzie $1.',
'previousdiff' => '↠ChoÄ na predchádzajúcu verziu',
'nextdiff' => 'ChoÄ na ÄalÅ¡iu verziu →',
-'imagemaxsize' => 'Obmedz obrázky na stránke popisu s obrázkami na:',
+'imagemaxsize' => 'Obmedz obrázky na popisnej stránke obrázka na:',
'thumbsize' => 'Veľkosť náhľadu:',
'showbigimage' => 'StiahnuÅ¥ tento obrázok vo väÄÅ¡om rozlíšení ($1x$2, $3 KB)',
'newimages' => 'Galéria nových obrázkov',
'showhidebots' => '($1 botov)',
'noimages' => 'NiÄ na zobrazenie.',
-'variantname-zh-cn' => 'cn',
-'variantname-zh-tw' => 'tw',
-'variantname-zh-hk' => 'hk',
-'variantname-zh-sg' => 'sg',
-'variantname-zh' => 'zh',
-'variantname-sr-ec' => 'sr-ec',
-'variantname-sr-el' => 'sr-el',
-'variantname-sr-jc' => 'sr-jc',
-'variantname-sr-jl' => 'sr-jl',
-'variantname-sr' => 'sr',
'specialloguserlabel' => 'Redaktor:',
'speciallogtitlelabel' => 'Názov:',
'passwordtooshort' => 'Vaše heslo je príliš krátke. Musí mať dĺžku aspoň $1 znakov.',
@@ -1561,7 +1590,7 @@ Všetky transwiki importy sa zaznamenávajú v [[Special:Log/import|Zázname imp
<hr />',
'fileinfo' => '$1KB, MIME : <code>$2</code>',
'metadata' => 'Metadáta',
-'metadata-help' => 'Tento súbor obsahuje ÄalÅ¡ie informácie, pravdepodobne pochádzajúce z digitálneho fotoaparátu Äi scannera ktorý ho vytvoril alebo digitalizoval. Ak bol súbor zmenený, niektoré podrobnosti sa nemusia plne zhodovaÅ¥ so zmeneným obrázkom.',
+'metadata-help' => 'Tento súbor obsahuje ÄalÅ¡ie informácie, pravdepodobne pochádzajúce z digitálneho fotoaparátu Äi skenera ktorý ho vytvoril alebo digitalizoval. Ak bol súbor zmenený, niektoré podrobnosti sa nemusia plne zhodovaÅ¥ so zmeneným obrázkom.',
'metadata-expand' => 'Zobraz detaily EXIF',
'metadata-collapse' => 'Skry detaily EXIF',
'metadata-fields' => 'Polia EXIF metadát uvedených v tejto správe sa zobrazia na stránke obrázka vtedy, keÄ je tabuľka metadát zbalená. Ostatné sa Å¡tandardne nezobrazia.
@@ -1822,7 +1851,9 @@ e-mail. V e-maili bude aj odkaz obsahujúci kód; naÄítajte odkaz
do Vášho prehliadaÄa pre potvrdenie, že VaÅ¡a e-mailová adresa je platná.',
'confirmemail_send' => 'Odoslať potvrdzovací kód',
'confirmemail_sent' => 'Potvrdzovací e-mail odoslaný.',
-'confirmemail_sendfailed'=> 'Nebolo možné odoslať potvrdzovací e-mail. Skontrolujte neplatné znaky v adrese.',
+'confirmemail_sendfailed'=> 'Nebolo možné odoslať potvrdzovací e-mail. Skontrolujte neplatné znaky v adrese.
+
+Program, ktorý odosielal poštu vrátil: $1',
'confirmemail_invalid' => 'Neplatný potvrdzovací kód. Kód možno vypršal.',
'confirmemail_needlogin'=> 'Musíte sa $1 na potvrdenie Vašej emailovaj adresy.',
'confirmemail_success' => 'Vaša e-mailová adresa bola potvrdená. Môžete sa prihlásiť a využívať wiki.',
@@ -1841,19 +1872,19 @@ Ak ste to *neboli* Vy, neotvárajte odkaz. Tento potvrdzovací kód
vyprší o $4.',
'tryexact' => 'Skúste presné vyhľadávanie',
'searchfulltext' => 'Fulltextové vyhľadávanie',
-'createarticle' => 'VytvoriÅ¥ Älánok',
+'createarticle' => 'Vytvoriť stránku',
'scarytranscludedisabled'=> '[Transklúzia interwiki je vypnutá]',
'scarytranscludefailed' => '[Nepodarilo sa priniesÅ¥ Å¡ablónu pre $1; prepáÄte]',
'scarytranscludetoolong'=> '[URL je príliÅ¡ dlhé; prepáÄte]',
'trackbackbox' => '<div id="mw_trackbacks">
-Trackback pre tento Älánok:<br />
+Trackback pre túto stránku:<br />
$1
</div>',
'trackbackremove' => ' ([$1 Zmazať])',
'trackbacklink' => 'Trackback',
'trackbackdeleteok' => 'Trackback úspešne zmazaný.',
'deletedwhileediting' => 'Varovanie: Táto stránka bola zmazaná potom, ako ste zaÄali s úpravami!',
-'confirmrecreate' => 'Redaktor [[User:$1|$1]] ([[User talk:$1|diskusia]]) zmazal tento Älánok potom, ako ste ho zaÄal upravovaÅ¥ s odôvodnením:
+'confirmrecreate' => 'Redaktor [[User:$1|$1]] ([[User talk:$1|diskusia]]) zmazal túto stránku potom, ako ste ho zaÄal upravovaÅ¥ s odôvodnením:
: \'\'$2\'\'
Prosím potvrÄte, že ho chcete skutoÄne znovu vytvoriÅ¥.',
'recreate' => 'Znova vytvoriť',
@@ -1865,10 +1896,9 @@ Prosím potvrÄte, že ho chcete skutoÄne znovu vytvoriÅ¥.',
$1',
'confirm_purge_button' => 'OK',
'youhavenewmessagesmulti'=> 'Máte nové správy na $1',
-'newtalkseperator' => ',_',
-'searchcontaining' => 'Hľadaj Älánky obsahujúce \'\'$1\'\'.',
-'searchnamed' => 'Hľadaj Älánky s názvom \'\'$1\'\'.',
-'articletitles' => 'ÄŒlánky zaÄínajúce \'\'$1\'\'',
+'searchcontaining' => 'Hľadaj stránky obsahujúce \'\'$1\'\'.',
+'searchnamed' => 'Hľadaj stránky s názvom \'\'$1\'\'.',
+'articletitles' => 'Stránky zaÄínajúce na \'\'$1\'\'',
'hideresults' => 'Skry výsledky',
'displaytitle' => '(Odkazujte na túto stránku ako [[$1]])',
'loginlanguagelabel' => 'Jazyk: $1',
@@ -1885,5 +1915,10 @@ $1',
'table_pager_limit' => 'Zobraz $1 položiek na stránku',
'table_pager_limit_submit'=> 'Spusti',
'table_pager_empty' => 'Bez výsledkov',
+'autosumm-blank' => 'Odstraňujem obsah stránky',
+'autosumm-replace' => 'Nahrádzam stránku textom \'$1\'',
+'autoredircomment' => 'Presmerovanie na [[$1]]',
+'autosumm-new' => 'Nová stránka: $1',
);
+
?>
diff --git a/languages/messages/MessagesSl.php b/languages/messages/MessagesSl.php
index f8a6478c..3da314ee 100644
--- a/languages/messages/MessagesSl.php
+++ b/languages/messages/MessagesSl.php
@@ -130,13 +130,14 @@ $messages = array(
'october-gen' => 'oktobra',
'november-gen' => 'novembra',
'december-gen' => 'decembra',
-'categories' => '{{plural:$1|Kategorija|Kategoriji|Kategorije|Kategorije|Kategorije}}',
+'categories' => 'Kategorije',
+'pagecategories' => '{{plural:$1|Kategorija|Kategoriji|Kategorije|Kategorije|Kategorije}}',
'category_header' => 'Strani v kategoriji »$1«',
'subcategories' => 'Podkategorije',
'mainpage' => 'Glavna stran',
'mainpagetext' => 'Wikiprogramje ste uspešno naložili!',
-'mainpagedocfooter' => 'Za uporabo in pomoÄ pri nastavitvi, prosimo, preglejte [http://meta.wikipedia.org/wiki/MediaWiki_i18n dokumentacijo za prilagajanje vmesnika]
-in [http://meta.wikipedia.org/wiki/MediaWiki_User%27s_Guide UporabniÅ¡ki priroÄnik].',
+'mainpagedocfooter' => 'Za uporabo in pomoÄ pri nastavitvi, prosimo, preglejte [http://meta.wikimedia.org/wiki/MediaWiki_i18n dokumentacijo za prilagajanje vmesnika]
+in [http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide UporabniÅ¡ki priroÄnik].',
'portal' => 'Portal obÄestva',
'portal-url' => 'Project:Portal obÄestva',
'about' => 'O projektu',
@@ -951,7 +952,7 @@ Za zapise nedavnih brisanj glej $2.',
'rollbacklink' => 'vrni',
'rollbackfailed' => 'Vrnitev ni uspela.',
'cantrollback' => 'Urejanja ne morem vrniti; zadnji urejevalec je hkrati edini.',
-'alreadyrolled' => 'Ne morem vrniti zadnje spremembe [[$1]]
+'alreadyrolled' => 'Ne morem vrniti zadnje spremembe [[:$1]]
od uporabnika [[Uporabnik:$2|$2]] ([[Pogovor z uporabnikom:$2|Pogovor]]); nekdo drug je že spremenil ali vrnil Älanek.
Zadnja sprememba od uporabnika [[Uporabnik:$3|$3]] ([[Pogovor z uporabnikom:$3|Pogovor]]).',
@@ -1231,7 +1232,7 @@ Da boste stran lahko shranili, boste morali odstraniti vse na Ärni listi navede
'rcpatroldisabledtext' => 'Spremljanje zadnjih sprememb je zaÄasno onemogoÄeno.',
'markedaspatrollederror'=> 'Ni mogoÄe oznaÄiti kot pregledano',
'markedaspatrollederrortext'=> 'DoloÄite redakcijo, ki jo želite oznaÄiti kot pregledano.',
-'Monobook.js' => '/* plavajoÄa polja in bližnjiÄne tipke */
+'monobook.js' => '/* plavajoÄa polja in bližnjiÄne tipke */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Vaša uporabniška stran\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Uporabniška stran IP-naslova, ki ga uporabljate\');
@@ -1242,7 +1243,7 @@ Da boste stran lahko shranili, boste morali odstraniti vse na Ärni listi navede
ta[\'pt-mycontris\'] = new Array(\'y\',\'Seznam vaših prispevkov\');
ta[\'pt-login\'] = new Array(\'o\',\'Prijava ni obvezna, vendar je zaželena\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Prijava ni obvezna, vendar je zaželena\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Odjavite se\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Odjavite se\');
ta[\'ca-talk\'] = new Array(\'t\',\'Pogovor o strani\');
ta[\'ca-edit\'] = new Array(\'e\',\'Stran lahko uredite. Preden jo shranite, uporabite gumb za predogled.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'ZaÄnite novo razpravo\');
diff --git a/languages/messages/MessagesSq.php b/languages/messages/MessagesSq.php
index c12b9940..7e4b5603 100644
--- a/languages/messages/MessagesSq.php
+++ b/languages/messages/MessagesSq.php
@@ -124,7 +124,8 @@ $messages = array(
'oct' => 'Tet',
'nov' => 'Nën',
'dec' => 'Dhj',
-'categories' => '{{PLURAL:$1|Kategoria|Kategoritë}}',
+'categories' => 'Kategoritë',
+'pagecategories' => '{{PLURAL:$1|Kategoria|Kategoritë}}',
'category_header' => 'Artikuj në kategorinë "$1"',
'subcategories' => 'Nën-kategori',
'mainpage' => 'Faqja Kryesore',
@@ -959,7 +960,7 @@ Të gjitha kohët janë sipas orës së shërbyesit (UTC).
'rollbacklink' => 'riktheje',
'rollbackfailed' => 'Rikthimi dështoi',
'cantrollback' => 'Nuk munda ta kthejë redaktimin; redaktori i fundit është i vetmi autor i këtij artikulli.',
-'alreadyrolled' => 'Nuk munda ta rikthej redaktimin e fundit e [[$1]] nga [[User:$2|$2]] ([[User talk:$2|diskutim]]); dikush tjetër e ka redaktuar ose rikthyer këtë faqe.
+'alreadyrolled' => 'Nuk munda ta rikthej redaktimin e fundit e [[:$1]] nga [[User:$2|$2]] ([[User talk:$2|diskutim]]); dikush tjetër e ka redaktuar ose rikthyer këtë faqe.
Redaktimi i fundit është bërë nga [[User:$3|$3]] ([[User talk:$3|diskutim]]).',
'editcomment' => 'Komenti i redaktimit ishte: "<i>$1</i>".',
@@ -1190,10 +1191,10 @@ Për të eksportuar faqe, thjesht shtypni një emër për çdo rresht, ose krijo
'tooltip-minoredit' => 'Shënoje këtë redaktim të vogël [alt-i]',
'tooltip-save' => 'Kryej ndryshimet [alt-s]',
'tooltip-preview' => 'Shiko parapamjen e ndryshimeve, përdoreni këtë para se të kryeni ndryshimet! [alt-p]',
-'tooltip-diff' => 'Show which changes you made to the text. [alt-d]',
+'tooltip-diff' => 'Show which changes you made to the text. [alt-v]',
'tooltip-compareselectedversions'=> 'Shikoni krahasimin midis dy versioneve të zgjedhura të kësaj faqeje. [alt-v]',
'tooltip-watch' => 'Mbikqyre këtë faqe [alt-w]',
-'Monobook.css' => '/* redaktoni këtë faqe për të përshtatur pamjen Monobook për tëra faqet tuaja */',
+'monobook.css' => '/* redaktoni këtë faqe për të përshtatur pamjen Monobook për tëra faqet tuaja */',
'nodublincore' => 'Dublin Core RDF metadata nuk është i mundshëm për këtë server.',
'nocreativecommons' => 'Creative Commons RDF metadata nuk është i mundshëm për këtë server.',
'notacceptable' => 'Wiki server nuk mundet ti përgatit të dhënat për klintin tuaj.',
@@ -1235,7 +1236,7 @@ Për të eksportuar faqe, thjesht shtypni një emër për çdo rresht, ose krijo
'rcpatroldisabledtext' => 'Kontrollimi i ndryshimeve së fundmi nuk është i mundshëm për momentin.',
'markedaspatrollederror'=> 'Nuk munda ta shënoj të patrulluar',
'markedaspatrollederrortext'=> 'Duhet të përcaktoni versionin për tu shënuar i patrulluar.',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Faqja juaj e përdoruesit\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Faqja e përdoruesve anonim nga kjo adresë IP\');
@@ -1246,7 +1247,7 @@ Për të eksportuar faqe, thjesht shtypni një emër për çdo rresht, ose krijo
ta[\'pt-mycontris\'] = new Array(\'y\',\'Lista e kontributeve tuaja\');
ta[\'pt-login\'] = new Array(\'o\',\'Të hysh brenda nuk është e detyrueshme, por ka shumë përparësi.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Të hysh brenda nuk është e detyrueshme, por ka shumë përparësi.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Dalje\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Dalje\');
ta[\'ca-talk\'] = new Array(\'t\',\'Diskuto për përmbajtjen e faqes\');
ta[\'ca-edit\'] = new Array(\'e\',\'Ju mund ta redaktoni këtë faqe. Përdorni butonin >>Trego parapamjen<< para se t\'i kryeni ndryshimet.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Fillo një temë të re diskutimi.\');
@@ -1485,7 +1486,6 @@ Ju lutem konfirmoni nëse dëshironi me të vertetë ta ri-krijoni këtë artiku
$1',
'confirm_purge_button' => 'Shko',
'youhavenewmessagesmulti'=> 'Ju keni mesazh të ri në $1',
-'newtalkseperator' => ',_',
'searchcontaining' => 'Kërko për artikuj që përmbajnë \'\'$1\'\'.',
'searchnamed' => 'Kërko për artikuj të quajtur \'\'$1\'\'.',
'articletitles' => 'Artikuj që fillojnë me \'\'$1\'\'',
diff --git a/languages/messages/MessagesSr_ec.php b/languages/messages/MessagesSr_ec.php
index 87cb7bbd..9f99c9d8 100644
--- a/languages/messages/MessagesSr_ec.php
+++ b/languages/messages/MessagesSr_ec.php
@@ -39,7 +39,7 @@ $namespaceAliases = array(
'Å ablon' => NS_TEMPLATE,
'Razgovor_o_Å¡ablonu' => NS_TEMPLATE_TALK,
'Pomoć' => NS_HELP,
- 'Razgovor_o_pomoći ' => NS_HELP_TALK,
+ 'Razgovor_o_pomoći' => NS_HELP_TALK,
'Kategorija' => NS_CATEGORY,
'Razgovor_o_kategoriji' => NS_CATEGORY_TALK,
);
@@ -160,7 +160,7 @@ $magicWords = array(
'end' => array( 0, '__END__', '__КРÐЈ__' ),
'currentmonth' => array( 1, 'CURRENTMONTH', 'ТРЕÐУТÐИМЕСЕЦ' ),
'currentmonthname' => array( 1, 'CURRENTMONTHNAME', 'ТРЕÐУТÐИМЕСЕЦИМЕ' ),
- 'currentmonthnamegen' => array( 1, 'CURRENTMONTHNAMEGEN', 'ТРЕÐУТÐИМЕСЕЦРОД' ),
+ 'currentmonthnamegen' => array( 1, 'CURRENTMONTHNAMEGEN', 'ТРЕÐУТÐИМЕСЕЦГЕÐ' ),
'currentmonthabbrev' => array( 1, 'CURRENTMONTHABBREV', 'ТРЕÐУТÐИМЕСЕЦСКР' ),
'currentday' => array( 1, 'CURRENTDAY', 'ТРЕÐУТÐИДÐÐ' ),
'currentdayname' => array( 1, 'CURRENTDAYNAME', 'ТРЕÐУТÐИДÐÐИМЕ' ),
@@ -212,8 +212,8 @@ $separatorTransformTable = array(',' => '.', '.' => ',' );
$messages = array(
# stylesheets
-'Common.css' => '/** CSS koji važi za sve skinove */',
-'Monobook.css' => '/** Samo za MonoBook skin */',
+'common.css' => '/** CSS koji važi za sve skinove */',
+'monobook.css' => '/** Samo za MonoBook skin */',
# User preference toggles
'tog-underline' => 'Подвуци везе',
@@ -250,6 +250,7 @@ $messages = array(
'tog-forceeditsummary' => 'Упозори ме кад не унеÑем Ð¾Ð¿Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½Ðµ',
'tog-watchlisthideown' => 'Сакриј моје измене Ñа ÑпиÑка надгледања',
'tog-watchlisthidebots' => 'Сакриј измене ботова Ñа ÑпиÑка надгледања',
+'tog-nolangconversion' => 'ИÑкључи конверзију варијанти',
'underline-always' => 'Увек',
'underline-never' => 'Ðикад',
@@ -265,6 +266,13 @@ $messages = array(
'thursday' => 'четвртак',
'friday' => 'петак',
'saturday' => 'Ñубота',
+'sun' => 'нед',
+'mon' => 'пон',
+'tue' => 'уто',
+'wed' => 'Ñре',
+'thu' => 'чет',
+'fri' => 'пет',
+'sat' => 'Ñуб',
'january' => 'јануар',
'february' => 'фебруар',
'march' => 'март',
@@ -277,6 +285,18 @@ $messages = array(
'october' => 'октобар',
'november' => 'новембар',
'december' => 'децембар',
+'january-gen' => 'јануара',
+'february-gen' => 'фебруара',
+'march-gen' => 'марта',
+'april-gen' => 'априла',
+'may-gen' => 'маја',
+'june-gen' => 'јуна',
+'july-gen' => 'јула',
+'august-gen' => 'авгуÑта',
+'september-gen' => 'Ñептембра',
+'october-gen' => 'октобра',
+'november-gen' => 'новембра',
+'december-gen' => 'децембра',
'jan' => 'јан',
'feb' => 'феб',
'mar' => 'мар',
@@ -291,7 +311,8 @@ $messages = array(
'dec' => 'дец',
# Bits of text used by many pages:
#
-'categories' => '{{PLURAL:$1|Категорија|Категорије|Категорије}} Ñтраница',
+'categories' => 'Категорије Ñтраница',
+'pagecategories' => '{{PLURAL:$1|Категорија|Категорије|Категорије}} Ñтраница',
'category_header' => 'Чланака у категорији "$1"',
'subcategories' => 'Поткатегорије',
@@ -304,8 +325,8 @@ $messages = array(
* [http://www.mediawiki.org/wiki/Help:FAQ Ðајчешће поÑтављена питања]
* [http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce Мејлинг лиÑта о издањима МедијаВикија]",
-'portal' => 'Трг',
-'portal-url' => 'Project:Трг',
+'portal' => 'Радионица',
+'portal-url' => 'Project:Радионица',
'about' => 'О...',
'aboutsite' => 'О пројекту {{SITENAME}}',
'aboutpage' => 'Project:О',
@@ -380,6 +401,10 @@ $messages = array(
'userpage' => 'Погледај кориÑничку Ñтрану',
'projectpage' => 'Погледај Ñтрану пројекта',
'imagepage' => 'Погледај Ñтрану Ñлике',
+'mediawikipage' => 'Види Ñтраницу поруке',
+'templatepage' => 'Види Ñтраницу шаблона',
+'viewhelppage' => 'Види Ñтраницу помоћи',
+'categorypage' => 'Види Ñтраницу категорије',
'viewtalkpage' => 'Погледај разговор',
'otherlanguages' => 'ОÑтали језици',
'redirectedfrom' => '(ПреуÑмерено Ñа $1)',
@@ -394,6 +419,10 @@ $messages = array(
'jumptosearch' => 'претрага',
'badaccess' => 'Грешка у дозволама',
+'badaccess-group0' => 'Ðије вам дозвољено да извршите акцију коју Ñте покренули.',
+'badaccess-group1' => 'Ðкција коју Ñте покренули је резеревиÑана за кориÑнике у групи $1.',
+'badaccess-group2' => 'Ðкција коју Ñте покренули је резервиÑана за кориÑнике из једне од група $1.',
+'badaccess-groups' => 'Ðкција коју Ñте покренули је резервиÑана за кориÑнике из једне од група $1.',
'versionrequired' => 'Верзија $1 МедијаВикија је потребна',
'versionrequiredtext' => 'Верзија $1 МедијаВикија је потребна да би Ñе кориÑтила ова Ñтрана. Погледајте [[{{ns:special}}:Version|верзију]]',
@@ -415,6 +444,7 @@ $messages = array(
'restorelink' => '{{PLURAL:$1|једна обриÑана измена|$1 обриÑане измене|$1 обриÑаних измена}}',
'feedlinks' => 'Фид:',
'feed-invalid' => 'Лош тип фида пријаве.',
+'feed-atom' => 'Ðтом',
# Short words for each namespace, by default used in the 'article' tab in monobook
'nstab-main' => 'Чланак',
@@ -496,6 +526,7 @@ MySQL је вратио грешку "$3: $4".',
Можете гледати и копирати Ñадржај ове Ñтране:',
'protectedinterface' => '\'\'\'Упозорење:\'\'\' Мењате Ñтрану која Ñе кориÑти да пружи текÑÑ‚ интерфејÑа за Ñофтвер. Измене на овој Ñтрани ће утицати на изглед кориÑничког интерфејÑа за оÑтале кориÑнике.',
+'editinginterface' => "'''Упозорење:''' Уређујете Ñтраницу чија је намена упиÑивање текÑта за Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ Ñофтвера. Измене у овој Ñтраници ће променити изглед кориÑничког интефејÑа Ñвих кориÑника.",
'sqlhidden' => '(SQL претрага Ñакривена)',
# Login and logout pages
@@ -567,7 +598,9 @@ MySQL је вратио грешку "$3: $4".',
'noemail' => 'Ðе поÑтоји адреÑа е-поште за кориÑника "$1".',
'passwordsent' => 'Ðова шифра је поÑлата на адреÑу е-поште кориÑника "$1".
Молимо пријавите Ñе пошто је примите.',
+'blocked-mailpassword' => 'Вашој ИП адреÑи је блокиран приÑтуп уређивању, из ког разлога није могуће кориÑтити функцију подÑећања лозинке, ради превенције извршења недозвољене акције.',
'eauthentsent' => 'Е-пошта за потврду је поÑлата на назначену адреÑу е-поште. Пре него што Ñе било која друга е-пошта пошаље на налог, мораћете да пратите упутÑтва у е-пошти, да биÑте потврдили да је налог заиÑта ваш.',
+'throttled-mailpassword' => 'ПодÑетник лозинке вам је већ поÑлао једну поруку у задњих $1 Ñати. Ради превенције извршења недозвољене акције, подÑетник шаље Ñамо једну поруку у року од $1 Ñати.',
'mailerror' => 'Грешка при Ñлању е-поште: $1',
'acct_creation_throttle_hit' => 'Жао нам је, већ Ñте направили $1 кориÑничка имена. Више није дозвољено.',
'emailauthenticated' => 'Ваша адреÑа е-поште је потврђена: $1.',
@@ -614,6 +647,7 @@ MySQL је вратио грешку "$3: $4".',
'anoneditwarning' => 'ÐиÑте пријављени. Ваша ИП адреÑа ће бити забележена у иÑторији измена ове Ñтране.',
'missingsummary' => '\'\'\'ПодÑетник:\'\'\' ÐиÑте унели Ð¾Ð¿Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½Ðµ. Уколико кликнете Сними Ñтраницу поново, ваше измене ће бити Ñнимљене без опиÑа.',
'missingcommenttext' => 'Молимо унеÑтите коментар иÑпод.',
+'missingcommentheader' => "'''ПодÑетник:''' ÐиÑте навели наÑлов овог коментара. Уколико кликнете ''Сними поново'', ваш коментар ће бити Ñнимљен без наÑлова.",
'blockedtitle' => 'КориÑник је блокиран',
'blockedtext' => '<big>\'\'\'Ваше кориÑничко име или ИП адреÑа је блокирано.\'\'\'</big>
@@ -709,7 +743,7 @@ MySQL је вратио грешку "$3: $4".',
'loadhist' => 'Учитавам иÑторију Ñтранице',
'currentrev' => 'Тренутна ревизија',
'revisionasof' => 'Ревизија од $1',
-'old-revision-navigation' => 'Ревизија од $1; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'Ревизија од $1; $2',
'previousrevision' => '↠Претходна ревизија',
'nextrevision' => 'Следећа ревизија →',
'currentrevisionlink' => 'Тренутна ревизија',
@@ -746,6 +780,8 @@ MySQL је вратио грешку "$3: $4".',
# Revision deletion
#
'revisiondelete' => 'Обриши/врати ревизију',
+'revdelete-nooldid-title' => 'Ðема одабране ревизије',
+'revdelete-nooldid-text' => 'ÐиÑте одабрали жељену ревизију или ревизије како биÑте укључили ове функције.',
'revdelete-selected' => 'Изабрано ревизија од [[:$1]]:',
'revdelete-text' => 'ОбриÑане ревизије ће Ñе и даље појављивати на иÑторији Ñтранице,
али ће њихов Ñадржај бити Ñкривен јавноÑти.
@@ -808,6 +844,7 @@ MySQL је вратио грешку "$3: $4".',
# Preferences page
#
'preferences' => 'Подешавања',
+'mypreferences' => 'Моја подешавања',
'prefsnologin' => 'ÐиÑте пријављени',
'prefsnologintext' => 'Морате бити [[{{ns:special}}:Userlogin|пријављени]]
да биÑте подешавали кориÑничка подешавања.',
@@ -971,10 +1008,25 @@ MySQL је вратио грешку "$3: $4".',
'uploadvirus' => 'Фајл Ñадржи вируÑ! Детаљи: $1',
'sourcefilename' => 'Име фајла извора',
'destfilename' => 'Циљано име фајла',
+'watchthisupload' => 'Ðадгледај Ñтраницу',
'filewasdeleted' => 'Фајл Ñа овим именом је раније поÑлат, а каÑније обриÑан. Требало би да проверите $1 пре него што наÑтавите Ñа поновним Ñлањем.',
+'upload-proto-error' => 'Ðекоректни протокол',
+'upload-proto-error-text' => 'Слање екÑтерних фајлова захтева УРЛове који почињу Ñа <code>http://</code> или <code>ftp://</code>.',
+'upload-file-error' => 'Интерна грешка',
+'upload-file-error-text' => 'ДеÑила Ñе интерна грешка при покушају прављења привременог фајла на Ñерверу. Контактирајте ÑиÑтем админиÑтратора.',
+'upload-misc-error' => 'Ðепозната грешка при Ñлању фајла',
+'upload-misc-error-text' => 'Ðепозната грешка при Ñлању фајла. Проверите да ли је УРЛ иÑправан и покушајте поново. Ðко проблем оÑтане, контактирајте ÑиÑтем админиÑтратора.',
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => "УРЛ није доÑтупан",
+'upload-curl-error6-text' => 'УРЛ који Ñте унели није доÑтупан. Урадите дупли клик на УРЛ да проверите да ли је адреÑа доÑтупна.',
+'upload-curl-error28' => 'Тајмаут грешка',
+'upload-curl-error28-text' => 'Сајту је требало превише времена да одговори. Проверите да ли Ñајт ради, или Ñачекајте мало и покушајте поново.',
+
'license' => 'Лиценца',
'nolicense' => 'Ðема',
+'upload_source_url' => ' (валидан, јавно доÑтупан УРЛ)',
+'upload_source_file' => ' (фајл на вашем рачунару)',
# Image list
#
@@ -989,6 +1041,7 @@ MySQL је вратио грешку "$3: $4".',
'bysize' => 'по величини',
'imgdelete' => 'обр',
'imgdesc' => 'опиÑ',
+'imgfile' => 'фајл',
'imghistory' => 'иÑторија Ñлике',
'imglegend' => 'Објашњење: (опиÑ) = прикажи/измени Ð¾Ð¿Ð¸Ñ Ñлике.',
'revertimg' => 'врт',
@@ -1006,6 +1059,12 @@ MySQL је вратио грешку "$3: $4".',
'noimage' => 'Ðе поÑтоји фајл Ñа овим именом, можете га $1',
'noimage-linktext' => 'поÑлати',
'uploadnewversion-linktext' => 'Пошаљите новију верзију овог фајла',
+'imagelist_date' => 'Датум',
+'imagelist_name' => 'Име',
+'imagelist_user' => 'КориÑник',
+'imagelist_size' => 'Величина (бајтови)',
+'imagelist_description' => 'ÐžÐ¿Ð¸Ñ Ñлике',
+'imagelist_search_for' => 'Тражи име Ñлике:',
# Mime search
#
@@ -1063,6 +1122,7 @@ MySQL је вратио грешку "$3: $4".',
'nviews' => '$1 пута погледано',
'lonelypages' => 'Сирочићи',
+'lonelypagestext' => 'Следеће Ñтранице ниÑу повезане Ñа других Ñтраница на овом викију.',
'uncategorizedpages' => 'Странице без категорије',
'uncategorizedcategories' => 'Категорије без категорија',
'uncategorizedimages' => 'Слике без категорија',
@@ -1082,6 +1142,7 @@ MySQL је вратио грешку "$3: $4".',
'shortpages' => 'Кратке Ñтранице',
'longpages' => 'Дугачке Ñтранице',
'deadendpages' => 'Странице без интерних веза',
+'deadendpagestext' => 'Следеће Ñтранице не вежу на друге Ñтранице на овом викију.',
'listusers' => 'СпиÑак кориÑника',
'specialpages' => 'ПоÑебне Ñтранице',
'spheading' => 'ПоÑебне Ñтранице за Ñве кориÑнике',
@@ -1128,7 +1189,10 @@ MySQL је вратио грешку "$3: $4".',
'allpagesprefix' => 'Прикажи Ñтране Ñа префикÑом:',
'allpagesbadtitle' => 'Дати назив Ñтранице није добар или Ñадржи међујезички или интервики префикÑ. Могуће је да Ñадржи карактере који не могу да Ñе кориÑте у називима.',
-# E this user
+# Special:Listusers
+'listusersfrom' => 'Прикажи кориÑнике почевши од:',
+
+# Email this user
#
'mailnologin' => 'Ðема адреÑе за Ñлање',
'mailnologintext' => 'Морате бити [[{{ns:special}}:Userlogin|пријављени]]
@@ -1150,6 +1214,8 @@ MySQL је вратио грешку "$3: $4".',
'emailsubject' => 'Тема',
'emailmessage' => 'Порука',
'emailsend' => 'Пошаљи',
+'emailccme' => 'Пошаљи ми копију моје поруке у моје Ñандуче е-поште.',
+'emailccsubject' => 'Копија ваше поруке на $1: $2',
'emailsent' => 'Порука поÑлата',
'emailsenttext' => 'Ваша порука је поÑлата електронÑком поштом.',
@@ -1264,7 +1330,7 @@ $NEWPAGE
'rollbacklink' => 'врати',
'rollbackfailed' => 'Враћање није уÑпело',
'cantrollback' => 'Ðе могу да вратим измену; поÑледњи аутор је уједно и једини.',
-'alreadyrolled' => 'Ðе могу да вратим поÑледњу измену [[$1]]
+'alreadyrolled' => 'Ðе могу да вратим поÑледњу измену [[:$1]]
од кориÑника [[{{ns:user}}:$2|$2]] ([[{{ns:user_talk}}:$2|разговор]]); неко други је већ изменио или вратио чланак.
ПоÑледњу измену је направио кориÑник [[{{ns:user}}:$3|$3]] ([[{{ns:user_talk}}:$3|разговор]]).',
@@ -1314,6 +1380,7 @@ $NEWPAGE
неће бити аутоматÑки замењена.',
'undeletehistorynoadmin' => 'Ова Ñтрана је обриÑана. Разлог за бриÑање Ñе налази у опиÑу иÑпод, заједно Ñа детаљима о кориÑнику који је мењао ову Ñтрану пре бриÑања. Стварни текÑÑ‚ ових обриÑаних ревизија је доÑтупан Ñамо админиÑтраторима.',
'undeleterevision' => 'ОбриÑана ревизија од $1',
+'undeleterevision-missing' => 'Ðекоректна или непоÑтојећа ревизија. Можда је ваш линк погрешан, или је ревизија реÑтаурирана, или обриÑана из архиве.',
'undeletebtn' => 'Врати!',
'undeletereset' => 'Поништи',
'undeletecomment' => 'Коментар:',
@@ -1321,6 +1388,7 @@ $NEWPAGE
'undeletedrevisions' => '$1 ревизија враћено',
'undeletedrevisions-files' => '$1 {{plural:$1|ревизија|ревизије|ревизија}} и $2 {{plural:$2|фајл|фајла|фајлова}} враћено',
'undeletedfiles' => '$1 {{plural:$1|фајл враћен|фајла враћена|фајлова враћено}}',
+'cannotundelete' => 'Враћање обриÑане верзије није уÑпело; неко други је вратио Ñтраницу пре ваÑ.',
'undeletedpage' => '<big>\'\'\'Страна $1 је враћена\'\'\'</big>
Погледајте [[{{ns:special}}:Log/delete|иÑторију бриÑања]] за ÑпиÑак Ñкорашњих бриÑања и враћања.',
@@ -1375,6 +1443,7 @@ $NEWPAGE
'ipbreason' => 'Разлог',
'ipbanononly' => 'Блокирај Ñамо анонимне кориÑнике',
'ipbcreateaccount' => 'Спречи прављење налога',
+'ipbenableautoblock' => 'ÐутоматÑки блокирај поÑледњу ИП адреÑу овог кориÑника, и Ñваку Ñледећу адреÑу Ñа које Ñе покуша уређивање.',
'ipbsubmit' => 'Блокирај овог кориÑника',
'ipbother' => 'ОÑтало време',
'ipboptions' => '2 Ñата:2 hours,1 дан:1 day,3 дана:3 days,1 недеља:1 week,2 недеље:2 weeks,1 меÑец:1 month,3 меÑеца:3 months,6 меÑеци:6 months,1 година:1 year,беÑконачно:infinite',
@@ -1393,6 +1462,7 @@ $NEWPAGE
'infiniteblock' => 'беÑконачан',
'expiringblock' => 'иÑтиче $1',
'anononlyblock' => 'Ñамо анонимни',
+'noautoblockblock' => 'Ðутоблокирање је онемогућено',
'createaccountblock' => 'блокирано прављење налога',
'ipblocklistempty' => 'СпиÑак блокирања је празан.',
'blocklink' => 'блокирај',
@@ -1579,7 +1649,7 @@ $NEWPAGE
# import log
'importlogpage' => 'иÑторија увоза',
'importlogpagetext' => 'ÐдминиÑтративни увози Ñтраница Ñа иÑторијама измена Ñа других викија.',
-'import-logentry-upload' => 'увезао $1 путем Ñлања фајла',
+'import-logentry-upload' => 'увезао [[$1]] путем Ñлања фајла',
'import-logentry-upload-detail' => '$1 ревизија/е',
'import-logentry-interwiki' => 'премеÑтио Ñа другог викија: $1',
'import-logentry-interwiki-detail' => '$1 ревизија/е од $2',
@@ -1598,13 +1668,13 @@ $NEWPAGE
'tooltip-minoredit' => 'Ðазначите да Ñе ради о малој измени [alt-i]',
'tooltip-save' => 'Снимите Ваше измене [alt-s]',
'tooltip-preview' => 'Претпреглед Ваших измена, молимо кориÑтите ово пре Ñнимања! [alt-p]',
-'tooltip-diff' => 'Прикажи које промене Ñте направили на текÑту. [alt-d]',
+'tooltip-diff' => 'Прикажи које промене Ñте направили на текÑту. [alt-v]',
'tooltip-compareselectedversions' => 'Погледаj разлике између две одабране верзије ове Ñтранице. [alt-v]',
'tooltip-watch' => 'Додајте ову Ñтраницу на Ваш ÑпиÑак надгледања [alt-w]',
# stylesheets
-'Common.css' => '/** CSS Ñтављен овде ће Ñе одноÑити на Ñве коже */',
-'Monobook.css' => '/* CSS Ñтављен овде ће Ñе одноÑити на кориÑнике Монобук коже */',
+'common.css' => '/** CSS Ñтављен овде ће Ñе одноÑити на Ñве коже */',
+'monobook.css' => '/* CSS Ñтављен овде ће Ñе одноÑити на кориÑнике Монобук коже */',
# Metadata
'nodublincore' => 'Dublin Core RDF метаподаци онемогућени за овај Ñервер.',
@@ -1661,7 +1731,7 @@ $NEWPAGE
'markedaspatrollederrortext' => 'Морате изабрати ревизију да биÑте означили као патролирано.',
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Моја кориÑничка Ñтраница\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'КориÑничка Ñтраница ИП адреÑе Ñа које уређујете\');
@@ -1672,7 +1742,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'СпиÑак чланака које н
ta[\'pt-mycontris\'] = new Array(\'y\',\'СпиÑак мојих прилога\');
ta[\'pt-login\'] = new Array(\'o\',\'Препоручује Ñе да Ñе пријавите, али није обавезно\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Препоручује Ñе да Ñе пријавите, али није обавезно\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Одјави Ñе\');
+ta[\'pt-logout\'] = new Array(\'\',\'Одјави Ñе\');
ta[\'ca-talk\'] = new Array(\'t\',\'Разговор о чланку\');
ta[\'ca-edit\'] = new Array(\'e\',\'Можете уредити ову Ñтраницу. Молимо кориÑтите претпреглед пре Ñачувавања.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Додајте коментар на ову диÑкуÑију\');
@@ -2053,6 +2123,7 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'Погледајте ÑтраниÑ
# E-mail address confirmation
'confirmemail' => 'Потврдите адреÑу е-поште',
+'confirmemail_noemail' => 'Ðемате потврђену адреÑу ваше е-поште у вашим [[Special:Preferences|кориÑничким подешавањима интерфејÑа]].',
'confirmemail_text' => 'Ова вики захтева да потврдите адреÑу ваше е-поште пре него што кориÑтите могућноÑти е-поште. Ðктивирајте дугме иÑпод како биÑте поÑлали пошту за потврду на вашу адреÑу. Пошта укључује везу која Ñадржи код; учитајте ту везу у ваш браузер да биÑте потврдили да је адреÑа ваше е-поште валидна.',
'confirmemail_send' => 'Пошаљи код за потврду',
'confirmemail_sent' => 'Е-пошта за потврђивање поÑлата.',
@@ -2113,6 +2184,7 @@ $1',
'youhavenewmessagesmulti' => 'Имате нових порука на $1',
'searchcontaining' => 'Претражи чланке који Ñадрже \'\'$1\'\'.',
'searchnamed' => 'Претражи чланке који Ñе зову \'\'$1\'\'.',
+'articletitles' => 'Чланци почевши од \'\'$1\'\'',
'hideresults' => 'Сакриј резултате',
# DISPLAYTITLE
@@ -2120,6 +2192,23 @@ $1',
'loginlanguagelabel' => 'Језик: $1',
+# Multipage image navigation
+'imgmultipageprev' => '&larr; претходна Ñтраница',
+'imgmultipagenext' => 'Ñледећа Ñтраница &rarr;',
+'imgmultigo' => 'Иди!',
+'imgmultigotopre' => 'Иди на Ñтраницу',
+
+# Table pager
+'ascending_abbrev' => 'раÑÑ‚',
+'descending_abbrev' => 'опад',
+'table_pager_next' => 'Следећа Ñтраница',
+'table_pager_prev' => 'Претходна Ñтраница',
+'table_pager_first' => 'Прва Ñтраница',
+'table_pager_last' => 'ПоÑледња Ñтраница',
+'table_pager_limit' => 'Прикажи $1 делова информације по Ñтраници',
+'table_pager_limit_submit' => 'Иди',
+'table_pager_empty' => 'Без резултата',
+
);
?>
diff --git a/languages/messages/MessagesSr_el.php b/languages/messages/MessagesSr_el.php
index 5ae3302e..d97d6385 100644
--- a/languages/messages/MessagesSr_el.php
+++ b/languages/messages/MessagesSr_el.php
@@ -162,7 +162,7 @@ $magicWords = array(
'end' => array( 0, '__END__', '__KRAJ__' ),
'currentmonth' => array( 1, 'CURRENTMONTH', 'TRENUTNIMESEC' ),
'currentmonthname' => array( 1, 'CURRENTMONTHNAME', 'TRENUTNIMESECIME' ),
- 'currentmonthnamegen' => array( 1, 'CURRENTMONTHNAMEGEN', 'TRENUTNIMESECROD' ),
+ 'currentmonthnamegen' => array( 1, 'CURRENTMONTHNAMEGEN', 'TRENUTNIMESECGEN' ),
'currentmonthabbrev' => array( 1, 'CURRENTMONTHABBREV', 'TRENUTNIMESECSKR' ),
'currentday' => array( 1, 'CURRENTDAY', 'TRENUTNIDAN' ),
'currentdayname' => array( 1, 'CURRENTDAYNAME', 'TRENUTNIDANIME' ),
@@ -198,7 +198,7 @@ $magicWords = array(
'grammar' => array( 0, 'GRAMMAR:', 'GRAMATIKA:' ),
'notitleconvert' => array( 0, '__NOTITLECONVERT__', '__NOTC__', '__БЕЗКÐ__', '__BEZKN__' ),
'nocontentconvert' => array( 0, '__NOCONTENTCONVERT__', '__NOCC__', '__BEZCC__' ),
- 'currentweek' => array( 1, 'CURRENTWEEK', 'TRENUTNANEDELjA' ),
+ 'currentweek' => array( 1, 'CURRENTWEEK', 'TRENUTNANEDELJA' ),
'currentdow' => array( 1, 'CURRENTDOW', 'TRENUTNIDOV' ),
'revisionid' => array( 1, 'REVISIONID', 'IDREVIZIJE' ),
'plural' => array( 0, 'PLURAL:', 'MNOŽINA:' ),
@@ -215,8 +215,8 @@ $separatorTransformTable = array(',' => '.', '.' => ',' );
$messages = array(
# stylesheets
-'Common.css' => '/** CSS koji važi za sve skinove */',
-'Monobook.css' => '/** Samo za MonoBook skin */',
+'common.css' => '/** CSS koji važi za sve skinove */',
+'monobook.css' => '/** Samo za MonoBook skin */',
# User preference toggles
'tog-underline' => 'Podvuci veze',
@@ -253,6 +253,7 @@ $messages = array(
'tog-forceeditsummary' => 'Upozori me kad ne unesem opis izmene',
'tog-watchlisthideown' => 'Sakrij moje izmene sa spiska nadgledanja',
'tog-watchlisthidebots' => 'Sakrij izmene botova sa spiska nadgledanja',
+'tog-nolangconversion' => 'IskljuÄi konverziju varijanti',
'underline-always' => 'Uvek',
'underline-never' => 'Nikad',
@@ -268,6 +269,13 @@ $messages = array(
'thursday' => 'Äetvrtak',
'friday' => 'petak',
'saturday' => 'subota',
+'sun' => 'ned',
+'mon' => 'pon',
+'tue' => 'uto',
+'wed' => 'sre',
+'thu' => 'Äet',
+'fri' => 'pet',
+'sat' => 'sub',
'january' => 'januar',
'february' => 'februar',
'march' => 'mart',
@@ -280,6 +288,18 @@ $messages = array(
'october' => 'oktobar',
'november' => 'novembar',
'december' => 'decembar',
+'january-gen' => 'januara',
+'february-gen' => 'februara',
+'march-gen' => 'marta',
+'april-gen' => 'aprila',
+'may-gen' => 'maja',
+'june-gen' => 'juna',
+'july-gen' => 'jula',
+'august-gen' => 'avgusta',
+'september-gen' => 'septembra',
+'october-gen' => 'oktobra',
+'november-gen' => 'novembra',
+'december-gen' => 'decembra',
'jan' => 'jan',
'feb' => 'feb',
'mar' => 'mar',
@@ -294,7 +314,8 @@ $messages = array(
'dec' => 'dec',
# Bits of text used by many pages:
#
-'categories' => '{{PLURAL:$1|Kategorija|Kategorije|Kategorije}} stranica',
+'categories' => 'Kategorije stranica',
+'pagecategories' => '{{PLURAL:$1|Kategorija|Kategorije|Kategorije}} stranica',
'category_header' => 'ÄŒlanaka u kategoriji "$1"',
'subcategories' => 'Potkategorije',
@@ -307,8 +328,8 @@ $messages = array(
* [http://www.mediawiki.org/wiki/Help:FAQ NajÄešće postavljena pitanja]
* [http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce Mejling lista o izdanjima MedijaVikija]",
-'portal' => 'Trg',
-'portal-url' => 'Project:Trg',
+'portal' => 'Radionica',
+'portal-url' => 'Project:Radionica',
'about' => 'O...',
'aboutsite' => 'O projektu {{SITENAME}}',
'aboutpage' => 'Project:O',
@@ -383,6 +404,10 @@ $messages = array(
'userpage' => 'Pogledaj korisniÄku stranu',
'projectpage' => 'Pogledaj stranu projekta',
'imagepage' => 'Pogledaj stranu slike',
+'mediawikipage' => 'Vidi stranicu poruke',
+'templatepage' => 'Vidi stranicu Å¡ablona',
+'viewhelppage' => 'Vidi stranicu pomoći',
+'categorypage' => 'Vidi stranicu kategorije',
'viewtalkpage' => 'Pogledaj razgovor',
'otherlanguages' => 'Ostali jezici',
'redirectedfrom' => '(Preusmereno sa $1)',
@@ -397,6 +422,10 @@ $messages = array(
'jumptosearch' => 'pretraga',
'badaccess' => 'Greška u dozvolama',
+'badaccess-group0' => 'Nije vam dozvoljeno da izvršite akciju koju ste pokrenuli.',
+'badaccess-group1' => 'Akcija koju ste pokrenuli je rezerevisana za korisnike u grupi $1.',
+'badaccess-group2' => 'Akcija koju ste pokrenuli je rezervisana za korisnike iz jedne od grupa $1.',
+'badaccess-groups' => 'Akcija koju ste pokrenuli je rezervisana za korisnike iz jedne od grupa $1.',
'versionrequired' => 'Verzija $1 MedijaVikija je potrebna',
'versionrequiredtext' => 'Verzija $1 MedijaVikija je potrebna da bi se koristila ova strana. Pogledajte [[{{ns:special}}:Version|verziju]]',
@@ -418,6 +447,7 @@ $messages = array(
'restorelink' => '{{PLURAL:$1|jedna obrisana izmena|$1 obrisane izmene|$1 obrisanih izmena}}',
'feedlinks' => 'Fid:',
'feed-invalid' => 'Loš tip fida prijave.',
+'feed-atom' => 'Atom',
# Short words for each namespace, by default used in the 'article' tab in monobook
'nstab-main' => 'ÄŒlanak',
@@ -499,6 +529,7 @@ Pretraga: $2',
Možete gledati i kopirati sadržaj ove strane:',
'protectedinterface' => '\'\'\'Upozorenje:\'\'\' Menjate stranu koja se koristi da pruži tekst interfejsa za softver. Izmene na ovoj strani će uticati na izgled korisniÄkog interfejsa za ostale korisnike.',
+'editinginterface' => "'''Upozorenje:''' UreÄ‘ujete stranicu Äija je namena upisivanje teksta za interfejs softvera. Izmene u ovoj stranici će promeniti izgled korisniÄkog intefejsa svih korisnika.",
'sqlhidden' => '(SQL pretraga sakrivena)',
# Login and logout pages
@@ -570,7 +601,9 @@ Ako je neko drugi podneo ovaj zahtev ili ukoliko ste se setili svoje lozinke i v
'noemail' => 'Ne postoji adresa e-pošte za korisnika "$1".',
'passwordsent' => 'Nova šifra je poslata na adresu e-pošte korisnika "$1".
Molimo prijavite se pošto je primite.',
+'blocked-mailpassword' => 'Vašoj IP adresi je blokiran pristup uređivanju, iz kog razloga nije moguće koristiti funkciju podsećanja lozinke, radi prevencije izvršenja nedozvoljene akcije.',
'eauthentsent' => 'E-poÅ¡ta za potvrdu je poslata na naznaÄenu adresu e-poÅ¡te. Pre nego Å¡to se bilo koja druga e-poÅ¡ta poÅ¡alje na nalog, moraćete da pratite uputstva u e-poÅ¡ti, da biste potvrdili da je nalog zaista vaÅ¡.',
+'throttled-mailpassword' => 'Podsetnik lozinke vam je već poslao jednu poruku u zadnjih $1 sati. Radi prevencije izvršenja nedozvoljene akcije, podsetnik šalje samo jednu poruku u roku od $1 sati.',
'mailerror' => 'Greška pri slanju e-pošte: $1',
'acct_creation_throttle_hit' => 'Žao nam je, već ste napravili $1 korisniÄka imena. ViÅ¡e nije dozvoljeno.',
'emailauthenticated' => 'Vaša adresa e-pošte je potvrđena: $1.',
@@ -617,6 +650,7 @@ Molimo prijavite se pošto je primite.',
'anoneditwarning' => 'Niste prijavljeni. Vaša IP adresa će biti zabeležena u istoriji izmena ove strane.',
'missingsummary' => '\'\'\'Podsetnik:\'\'\' Niste uneli opis izmene. Ukoliko kliknete Snimi stranicu ponovo, vaše izmene će biti snimljene bez opisa.',
'missingcommenttext' => 'Molimo unestite komentar ispod.',
+'missingcommentheader' => "'''Podsetnik:''' Niste naveli naslov ovog komentara. Ukoliko kliknete ''Snimi ponovo'', vaš komentar će biti snimljen bez naslova.",
'blockedtitle' => 'Korisnik je blokiran',
'blockedtext' => '<big>\'\'\'VaÅ¡e korisniÄko ime ili IP adresa je blokirano.\'\'\'</big>
@@ -712,7 +746,7 @@ Molimo vas da proverite URL koji ste upotrebili da biste pristupili ovoj stranic
'loadhist' => 'UÄitavam istoriju stranice',
'currentrev' => 'Trenutna revizija',
'revisionasof' => 'Revizija od $1',
-'old-revision-navigation' => 'Revizija od $1; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'Revizija od $1; $2',
'previousrevision' => '↠Prethodna revizija',
'nextrevision' => 'Sledeća revizija →',
'currentrevisionlink' => 'Trenutna revizija',
@@ -749,6 +783,8 @@ Pokušajte [[Posebno:Search|da pretražite viki]] za relevantne nove strane.',
# Revision deletion
#
'revisiondelete' => 'Obriši/vrati reviziju',
+'revdelete-nooldid-title' => 'Nema odabrane revizije',
+'revdelete-nooldid-text' => 'Niste odabrali željenu reviziju ili revizije kako biste ukljuÄili ove funkcije.',
'revdelete-selected' => 'Izabrano revizija od [[:$1]]:',
'revdelete-text' => 'Obrisane revizije će se i dalje pojavljivati na istoriji stranice,
ali će njihov sadržaj biti skriven javnosti.
@@ -811,6 +847,7 @@ koje sadrže sve izraze koji se traže će se pojaviti u rezultatu).',
# Preferences page
#
'preferences' => 'Podešavanja',
+'mypreferences' => 'Moja podešavanja',
'prefsnologin' => 'Niste prijavljeni',
'prefsnologintext' => 'Morate biti [[{{ns:special}}:Userlogin|prijavljeni]]
da biste podeÅ¡avali korisniÄka podeÅ¡avanja.',
@@ -974,10 +1011,25 @@ Ako je ovo slika, možete je uneti ovako: <tt><nowiki>[[Image:$1|thumb|Opis]]</n
'uploadvirus' => 'Fajl sadrži virus! Detalji: $1',
'sourcefilename' => 'Ime fajla izvora',
'destfilename' => 'Ciljano ime fajla',
+'watchthisupload' => 'Nadgledaj stranicu',
'filewasdeleted' => 'Fajl sa ovim imenom je ranije poslat, a kasnije obrisan. Trebalo bi da proverite $1 pre nego Å¡to nastavite sa ponovnim slanjem.',
+'upload-proto-error' => 'Nekorektni protokol',
+'upload-proto-error-text' => 'Slanje eksternih fajlova zahteva URLove koji poÄinju sa <code>http://</code> ili <code>ftp://</code>.',
+'upload-file-error' => 'Interna greška',
+'upload-file-error-text' => 'Desila se interna greška pri pokušaju pravljenja privremenog fajla na serveru. Kontaktirajte sistem administratora.',
+'upload-misc-error' => 'Nepoznata greška pri slanju fajla',
+'upload-misc-error-text' => 'Nepoznata greška pri slanju fajla. Proverite da li je URL ispravan i pokušajte ponovo. Ako problem ostane, kontaktirajte sistem administratora.',
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => "URL nije dostupan",
+'upload-curl-error6-text' => 'URL koji ste uneli nije dostupan. Uradite dupli klik na URL da proverite da li je adresa dostupna.',
+'upload-curl-error28' => 'Tajmaut greška',
+'upload-curl-error28-text' => 'Sajtu je trebalo previÅ¡e vremena da odgovori. Proverite da li sajt radi, ili saÄekajte malo i pokuÅ¡ajte ponovo.',
+
'license' => 'Licenca',
'nolicense' => 'Nema',
+'upload_source_url' => ' (validan, javno dostupan URL)',
+'upload_source_file' => ' (fajl na vaÅ¡em raÄunaru)',
# Image list
#
@@ -992,6 +1044,7 @@ Ako je ovo slika, možete je uneti ovako: <tt><nowiki>[[Image:$1|thumb|Opis]]</n
'bysize' => 'po veliÄini',
'imgdelete' => 'obr',
'imgdesc' => 'opis',
+'imgfile' => 'fajl',
'imghistory' => 'istorija slike',
'imglegend' => 'Objašnjenje: (opis) = prikaži/izmeni opis slike.',
'revertimg' => 'vrt',
@@ -1009,6 +1062,12 @@ ovu staru verziju, (vrt) = vrati na ovu staru verziju.
'noimage' => 'Ne postoji fajl sa ovim imenom, možete ga $1',
'noimage-linktext' => 'poslati',
'uploadnewversion-linktext' => 'Pošaljite noviju verziju ovog fajla',
+'imagelist_date' => 'Datum',
+'imagelist_name' => 'Ime',
+'imagelist_user' => 'Korisnik',
+'imagelist_size' => 'VeliÄina (bajtovi)',
+'imagelist_description' => 'Opis slike',
+'imagelist_search_for' => 'Traži ime slike:',
# Mime search
#
@@ -1066,6 +1125,7 @@ Dužina reda za poslove iznosi \'\'\'$7\'\'\'',
'nviews' => '$1 puta pogledano',
'lonelypages' => 'SiroÄići',
+'lonelypagestext' => 'Sledeće stranice nisu povezane sa drugih stranica na ovom vikiju.',
'uncategorizedpages' => 'Stranice bez kategorije',
'uncategorizedcategories' => 'Kategorije bez kategorija',
'uncategorizedimages' => 'Slike bez kategorija',
@@ -1085,6 +1145,7 @@ Dužina reda za poslove iznosi \'\'\'$7\'\'\'',
'shortpages' => 'Kratke stranice',
'longpages' => 'DugaÄke stranice',
'deadendpages' => 'Stranice bez internih veza',
+'deadendpagestext' => 'Sledeće stranice ne vežu na druge stranice na ovom vikiju.',
'listusers' => 'Spisak korisnika',
'specialpages' => 'Posebne stranice',
'spheading' => 'Posebne stranice za sve korisnike',
@@ -1131,7 +1192,10 @@ Možete suziti pregled odabirom tipa istorije, korisniÄkog imena ili tražene s
'allpagesprefix' => 'Prikaži strane sa prefiksom:',
'allpagesbadtitle' => 'Dati naziv stranice nije dobar ili sadrži meÄ‘ujeziÄki ili interviki prefiks. Moguće je da sadrži karaktere koji ne mogu da se koriste u nazivima.',
-# E this user
+# Special:Listusers
+'listusersfrom' => 'Prikaži korisnike poÄevÅ¡i od:',
+
+# Email this user
#
'mailnologin' => 'Nema adrese za slanje',
'mailnologintext' => 'Morate biti [[{{ns:special}}:Userlogin|prijavljeni]]
@@ -1153,6 +1217,8 @@ ili je izabrao da ne prima e-poštu od drugih korisnika.',
'emailsubject' => 'Tema',
'emailmessage' => 'Poruka',
'emailsend' => 'Pošalji',
+'emailccme' => 'PoÅ¡alji mi kopiju moje poruke u moje sanduÄe e-poÅ¡te.',
+'emailccsubject' => 'Kopija vaše poruke na $1: $2',
'emailsent' => 'Poruka poslata',
'emailsenttext' => 'Vaša poruka je poslata elektronskom poštom.',
@@ -1267,7 +1333,7 @@ Pogledajte $2 za zapis o skorašnjim brisanjima.',
'rollbacklink' => 'vrati',
'rollbackfailed' => 'Vraćanje nije uspelo',
'cantrollback' => 'Ne mogu da vratim izmenu; poslednji autor je ujedno i jedini.',
-'alreadyrolled' => 'Ne mogu da vratim poslednju izmenu [[$1]]
+'alreadyrolled' => 'Ne mogu da vratim poslednju izmenu [[:$1]]
od korisnika [[{{ns:user}}:$2|$2]] ([[{{ns:user_talk}}:$2|razgovor]]); neko drugi je već izmenio ili vratio Älanak.
Poslednju izmenu je napravio korisnik [[{{ns:user}}:$3|$3]] ([[{{ns:user_talk}}:$3|razgovor]]).',
@@ -1317,6 +1383,7 @@ revizije će se pojaviti u ranijoj istoriji, a trenutna revizija sadašnje stran
neće biti automatski zamenjena.',
'undeletehistorynoadmin' => 'Ova strana je obrisana. Razlog za brisanje se nalazi u opisu ispod, zajedno sa detaljima o korisniku koji je menjao ovu stranu pre brisanja. Stvarni tekst ovih obrisanih revizija je dostupan samo administratorima.',
'undeleterevision' => 'Obrisana revizija od $1',
+'undeleterevision-missing' => 'Nekorektna ili nepostojeća revizija. Možda je vaš link pogrešan, ili je revizija restaurirana, ili obrisana iz arhive.',
'undeletebtn' => 'Vrati!',
'undeletereset' => 'Poništi',
'undeletecomment' => 'Komentar:',
@@ -1324,6 +1391,7 @@ neće biti automatski zamenjena.',
'undeletedrevisions' => '$1 revizija vraćeno',
'undeletedrevisions-files' => '$1 {{plural:$1|revizija|revizije|revizija}} i $2 {{plural:$2|fajl|fajla|fajlova}} vraćeno',
'undeletedfiles' => '$1 {{plural:$1|fajl vraćen|fajla vraćena|fajlova vraćeno}}',
+'cannotundelete' => 'Vraćanje obrisane verzije nije uspelo; neko drugi je vratio stranicu pre vas.',
'undeletedpage' => '<big>\'\'\'Strana $1 je vraćena\'\'\'</big>
Pogledajte [[{{ns:special}}:Log/delete|istoriju brisanja]] za spisak skorašnjih brisanja i vraćanja.',
@@ -1378,6 +1446,7 @@ stranice su vandalizovane).',
'ipbreason' => 'Razlog',
'ipbanononly' => 'Blokiraj samo anonimne korisnike',
'ipbcreateaccount' => 'SpreÄi pravljenje naloga',
+'ipbenableautoblock' => 'Automatski blokiraj poslednju IP adresu ovog korisnika, i svaku sledeću adresu sa koje se pokuša uređivanje.',
'ipbsubmit' => 'Blokiraj ovog korisnika',
'ipbother' => 'Ostalo vreme',
'ipboptions' => '2 sata:2 hours,1 dan:1 day,3 dana:3 days,1 nedelja:1 week,2 nedelje:2 weeks,1 mesec:1 month,3 meseca:3 months,6 meseci:6 months,1 godina:1 year,beskonaÄno:infinite',
@@ -1396,6 +1465,7 @@ ranije blokiranoj IP adresi ili korisniÄkom imenu.',
'infiniteblock' => 'beskonaÄan',
'expiringblock' => 'istiÄe $1',
'anononlyblock' => 'samo anonimni',
+'noautoblockblock' => 'Autoblokiranje je onemogućeno',
'createaccountblock' => 'blokirano pravljenje naloga',
'ipblocklistempty' => 'Spisak blokiranja je prazan.',
'blocklink' => 'blokiraj',
@@ -1582,7 +1652,7 @@ Svi transviki uvozi su zabeleženi u [[Posebno:Log/import|istoriji uvoza]].',
# import log
'importlogpage' => 'istorija uvoza',
'importlogpagetext' => 'Administrativni uvozi stranica sa istorijama izmena sa drugih vikija.',
-'import-logentry-upload' => 'uvezao $1 putem slanja fajla',
+'import-logentry-upload' => 'uvezao [[$1]] putem slanja fajla',
'import-logentry-upload-detail' => '$1 revizija/e',
'import-logentry-interwiki' => 'premestio sa drugog vikija: $1',
'import-logentry-interwiki-detail' => '$1 revizija/e od $2',
@@ -1601,13 +1671,13 @@ Svi transviki uvozi su zabeleženi u [[Posebno:Log/import|istoriji uvoza]].',
'tooltip-minoredit' => 'NaznaÄite da se radi o maloj izmeni [alt-i]',
'tooltip-save' => 'Snimite Vaše izmene [alt-s]',
'tooltip-preview' => 'Pretpregled Vaših izmena, molimo koristite ovo pre snimanja! [alt-p]',
-'tooltip-diff' => 'Prikaži koje promene ste napravili na tekstu. [alt-d]',
+'tooltip-diff' => 'Prikaži koje promene ste napravili na tekstu. [alt-v]',
'tooltip-compareselectedversions' => 'Pogledaj razlike između dve odabrane verzije ove stranice. [alt-v]',
'tooltip-watch' => 'Dodajte ovu stranicu na Vaš spisak nadgledanja [alt-w]',
# stylesheets
-'Common.css' => '/** CSS stavljen ovde će se odnositi na sve kože */',
-'Monobook.css' => '/* CSS stavljen ovde će se odnositi na korisnike Monobuk kože */',
+'common.css' => '/** CSS stavljen ovde će se odnositi na sve kože */',
+'monobook.css' => '/* CSS stavljen ovde će se odnositi na korisnike Monobuk kože */',
# Metadata
'nodublincore' => 'Dublin Core RDF metapodaci onemogućeni za ovaj server.',
@@ -1664,7 +1734,7 @@ Svi transviki uvozi su zabeleženi u [[Posebno:Log/import|istoriji uvoza]].',
'markedaspatrollederrortext' => 'Morate izabrati reviziju da biste oznaÄili kao patrolirano.',
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Moja korisniÄka stranica\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'KorisniÄka stranica IP adrese sa koje ureÄ‘ujete\');
@@ -1675,7 +1745,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Spisak Älanaka koje nadgledate\');
ta[\'pt-mycontris\'] = new Array(\'y\',\'Spisak mojih priloga\');
ta[\'pt-login\'] = new Array(\'o\',\'PreporuÄuje se da se prijavite, ali nije obavezno\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'PreporuÄuje se da se prijavite, ali nije obavezno\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Odjavi se\');
+ta[\'pt-logout\'] = new Array(\'\',\'Odjavi se\');
ta[\'ca-talk\'] = new Array(\'t\',\'Razgovor o Älanku\');
ta[\'ca-edit\'] = new Array(\'e\',\'Možete urediti ovu stranicu. Molimo koristite pretpregled pre saÄuvavanja.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Dodajte komentar na ovu diskusiju\');
@@ -2056,6 +2126,7 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'Pogledajte stranicu kategorije\');
# E-mail address confirmation
'confirmemail' => 'Potvrdite adresu e-pošte',
+'confirmemail_noemail' => 'Nemate potvrÄ‘enu adresu vaÅ¡e e-poÅ¡te u vaÅ¡im [[Special:Preferences|korisniÄkim podeÅ¡avanjima interfejsa]].',
'confirmemail_text' => 'Ova viki zahteva da potvrdite adresu vaÅ¡e e-poÅ¡te pre nego Å¡to koristite mogućnosti e-poÅ¡te. Aktivirajte dugme ispod kako biste poslali poÅ¡tu za potvrdu na vaÅ¡u adresu. PoÅ¡ta ukljuÄuje vezu koja sadrži kod; uÄitajte tu vezu u vaÅ¡ brauzer da biste potvrdili da je adresa vaÅ¡e e-poÅ¡te validna.',
'confirmemail_send' => 'Pošalji kod za potvrdu',
'confirmemail_sent' => 'E-pošta za potvrđivanje poslata.',
@@ -2116,6 +2187,7 @@ $1',
'youhavenewmessagesmulti' => 'Imate novih poruka na $1',
'searchcontaining' => 'Pretraži Älanke koji sadrže \'\'$1\'\'.',
'searchnamed' => 'Pretraži Älanke koji se zovu \'\'$1\'\'.',
+'articletitles' => 'ÄŒlanci poÄevÅ¡i od \'\'$1\'\'',
'hideresults' => 'Sakrij rezultate',
# DISPLAYTITLE
@@ -2123,6 +2195,23 @@ $1',
'loginlanguagelabel' => 'Jezik: $1',
+# Multipage image navigation
+'imgmultipageprev' => '&larr; prethodna stranica',
+'imgmultipagenext' => 'sledeća stranica &rarr;',
+'imgmultigo' => 'Idi!',
+'imgmultigotopre' => 'Idi na stranicu',
+
+# Table pager
+'ascending_abbrev' => 'rast',
+'descending_abbrev' => 'opad',
+'table_pager_next' => 'Sledeća stranica',
+'table_pager_prev' => 'Prethodna stranica',
+'table_pager_first' => 'Prva stranica',
+'table_pager_last' => 'Poslednja stranica',
+'table_pager_limit' => 'Prikaži $1 delova informacije po stranici',
+'table_pager_limit_submit' => 'Idi',
+'table_pager_empty' => 'Bez rezultata',
+
);
?>
diff --git a/languages/messages/MessagesSu.php b/languages/messages/MessagesSu.php
index f8ee1e95..3cf4fff1 100644
--- a/languages/messages/MessagesSu.php
+++ b/languages/messages/MessagesSu.php
@@ -69,8 +69,8 @@ $messages = array(
'1movedto2' => 'mindahkeun $1 ka $2',
'1movedto2_redir' => '$1 dipindahkeun ka $2',
-'Monobook.css' => ' /* édit koropak ieu pikeun nyaluyukeun kulit \'\'monobook\'\' pikeun sakabéh situs */',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.css' => ' /* édit koropak ieu pikeun nyaluyukeun kulit \'\'monobook\'\' pikeun sakabéh situs */',
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Kaca pamaké kuring\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Kaca pamaké pikeun IP nu ku anjeun keur diédit\');
@@ -81,7 +81,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Daptar kaca nu diawaskeun ku anjeun par
ta[\'pt-mycontris\'] = new Array(\'y\',\'Daptar kontribusi kuring\');
ta[\'pt-login\'] = new Array(\'o\',\'Anjeun leuwih hadé asup log, sanajan teu wajib.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Anjeun leuwih hadé asup log, sanajan teu wajib.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Kaluar log\');
+ta[\'pt-logout\'] = new Array(\'\',\'Kaluar log\');
ta[\'ca-talk\'] = new Array(\'t\',\'Sawala ngeunaan eusi kaca\');
ta[\'ca-edit\'] = new Array(\'e\',\'Anjeun bisa ngédit kaca ieu. Mangga pigunakeun tombol sawangan saméméh nyimpen.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Tambihan koméntar kana sawala ieu.\');
@@ -154,7 +154,7 @@ Jaga, parobahan na kaca ieu katut kaca obrolanana bakal dibéréndélkeun di din
'already_bureaucrat' => 'Pamaké ieu geus boga kalungguhan birokrat',
'already_sysop' => 'Pamaké ieu geus boga kalungguhan kuncén',
'alreadyloggedin' => '<strong>Pamaké $1, anjeun geus asup log!</strong><br />',
-'alreadyrolled' => 'Teu bisa mulangkeun édit ahir [[$1]] ku [[User:$2|$2]] ([[User talk:$2|Obrolan]]); geus aya nu ngédit atawa mulangkeun kacana.
+'alreadyrolled' => 'Teu bisa mulangkeun édit ahir [[:$1]] ku [[User:$2|$2]] ([[User talk:$2|Obrolan]]); geus aya nu ngédit atawa mulangkeun kacana.
Édit ahir ku [[User:$3|$3]] ([[User talk:$3|Obrolan]]).',
'ancientpages' => 'Kaca pangheubeulna',
@@ -536,7 +536,7 @@ Katerangan: (kiw) = bédana jeung vérsi kiwari,
'mailnologin' => 'Euweuh alamat ngirim',
'mailnologintext' => 'Anjeun kudu <a href="{{localurl:Special:Userlogin">asup log</a> sarta boga alamat surélék nu sah na <a href="{{localurl:Special:Preferences">préferénsi</a> anjeun sangkan bisa nyurélékan pamaké séjén.',
'mainpage' => 'Tepas',
-'mainpagedocfooter' => 'Mangga tingal \'\'[http://meta.wikipedia.org/wiki/MediaWiki_i18n documentation on customizing the interface]\'\' jeung [http://meta.wikipedia.org/wiki/MediaWiki_User%27s_Guide Tungtunan Pamaké] pikeun pitulung maké jeung konfigurasi.',
+'mainpagedocfooter' => 'Mangga tingal \'\'[http://meta.wikimedia.org/wiki/MediaWiki_i18n documentation on customizing the interface]\'\' jeung [http://meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Tungtunan Pamaké] pikeun pitulung maké jeung konfigurasi.',
'mainpagetext' => '\'\'Software\'\' Wiki geus diinstal.',
'makesysop' => 'Ngangkat pamaké jadi kuncén',
'makesysopfail' => '<b>Pamaké "$1" teu bisa dijadikeun kuncén. (Ngaran nu diasupkeun bener teu?)</b>',
@@ -691,6 +691,7 @@ Coba saksrak na téks lengkep, atawa \'\'\'[[<nowiki>$1</nowiki>|nyieun artikel
'othercontribs' => 'Dumasar karya $1.',
'otherlanguages' => 'Basa séjén',
'others' => 'Séjénna',
+'pagecategories' => 'Kategori',
'pagemovedsub' => 'Mindahkeun geus hasil!',
'pagemovedtext' => 'Kaca "[[$1]]" dipindahkeun ka "[[$2]]".',
'pagetitle' => '$1 - {{SITENAME}}',
@@ -886,7 +887,7 @@ jumlah-jamléh geus aya \'\'\'$3\'\'\' kaca ulasan sarta \'\'\'$4\'\'\' éditan
'tog-watchdefault' => 'Tambahkeun kaca nu diédit ku anjeun kana awaskeuneun anjeun',
'toolbox' => 'Kotak parabot',
'tooltip-compareselectedversions' => 'Tempo béda antara dua vérsi kaca ieu nu dipilih [alt-v].',
-'tooltip-diff' => 'Témbongkeun parobahan mana nu geus dijieun. [alt-d]',
+'tooltip-diff' => 'Témbongkeun parobahan mana nu geus dijieun. [alt-v]',
'tooltip-minoredit' => 'Tandaan ieu salaku éditan minor [alt-i]',
'tooltip-preview' => 'Sawang heula robahan anjeun, pami tos leres mangga simpen! [alt-p]',
'tooltip-save' => 'Simpen parobahan anjeun [alt-s]',
diff --git a/languages/messages/MessagesSv.php b/languages/messages/MessagesSv.php
index cdb1f67b..ae7d770d 100644
--- a/languages/messages/MessagesSv.php
+++ b/languages/messages/MessagesSv.php
@@ -7,10 +7,7 @@
*/
$quickbarSettings = array(
- "Ingen",
- "Fast vänster",
- "Fast höger",
- "Flytande vänster"
+ 'Ingen', 'Fast vänster', 'Fast höger', 'Flytande vänster'
);
$skinNames = array(
@@ -82,6 +79,7 @@ $messages = array(
'tog-editwidth' => 'Full bredd på redigeringsrutan',
'tog-watchcreations' => 'Lägg automatiskt till sidor du skapar till din övervakningslista.',
'tog-watchdefault' => 'Övervaka nya och ändrade artiklar',
+'tog-watchdeletion' => 'Lägg till sidor du raderar till din övervakningslista',
'tog-minordefault' => 'Markera automatiskt ändringar som mindre',
'tog-previewontop' => 'Visa förhandsgranskning före texten, istället för efter',
'tog-previewonfirst' => 'Visa förhandsgranskning vid första redigeringen',
@@ -96,10 +94,11 @@ $messages = array(
'tog-externaldiff' => 'Använd externt diff-verktyg',
'tog-showjumplinks' => 'Aktivera "hoppa till"-tillgänglighetslänkar',
'tog-uselivepreview' => 'Använd direktuppdaterad förhandsgranskning (Javascript, på försöksstadiet)',
-'tog-autopatrol' => 'Markera mina redigeringar som patrullerade',
'tog-forceeditsummary' => 'PÃ¥minn mig om jag inte fyller i en redigeringskommentar',
'tog-watchlisthideown' => 'Visa inte mina redigeringar på övervakningslistan',
'tog-watchlisthidebots' => 'Visa inte robotredigeringar på övervakningslistan',
+'tog-nolangconversion' => 'Konvertera inte mellan språkvarianter',
+'tog-ccmeonemails' => 'Skicka mig kopior av epost jag skickar till andra användare',
'underline-always' => 'Alltid',
'underline-never' => 'Aldrig',
'underline-default' => 'Webbläsarens standardinställning',
@@ -111,6 +110,13 @@ $messages = array(
'thursday' => 'torsdag',
'friday' => 'fredag',
'saturday' => 'lördag',
+'sun' => 'sön',
+'mon' => 'mån',
+'tue' => 'tis',
+'wed' => 'ons',
+'thu' => 'tor',
+'fri' => 'fre',
+'sat' => 'lör',
'january' => 'januari',
'february' => 'februari',
'march' => 'mars',
@@ -123,6 +129,18 @@ $messages = array(
'october' => 'oktober',
'november' => 'november',
'december' => 'december',
+'january-gen' => 'januaris',
+'february-gen' => 'februaris',
+'march-gen' => 'mars',
+'april-gen' => 'aprils',
+'may-gen' => 'majs',
+'june-gen' => 'junis',
+'july-gen' => 'julis',
+'august-gen' => 'augustis',
+'september-gen' => 'septembers',
+'october-gen' => 'oktobers',
+'november-gen' => 'novembers',
+'december-gen' => 'decembers',
'jan' => 'jan',
'feb' => 'feb',
'mar' => 'mar',
@@ -135,9 +153,11 @@ $messages = array(
'oct' => 'okt',
'nov' => 'nov',
'dec' => 'dec',
-'categories' => '{{PLURAL:$1|Kategori|Kategorier}}',
+'categories' => 'Kategorier',
+'pagecategories' => '{{PLURAL:$1|Kategori|Kategorier}}',
'category_header' => 'Artiklar i kategorin "$1"',
'subcategories' => 'Underkategorier',
+'category-media-header' => 'Media i kategorin "$1"',
'mainpage' => 'Huvudsida',
'mainpagetext' => 'Installation av wikimjukvara klar.',
'mainpagedocfooter' => 'För anpassning av användargränssnittet, se [http://meta.wikimedia.org/wiki/MediaWiki_localization dokumentation]. För hjälp med användning och konfiguration, se [http://meta.wikimedia.org/wiki/Help:Contents användarguiden] på Meta.',
@@ -213,10 +233,13 @@ $messages = array(
'userpage' => 'Visa användarsida',
'projectpage' => 'Visa projektsida',
'imagepage' => 'Visa bildsida',
+'mediawikipage' => 'Visa meddelandesida',
+'templatepage' => 'Visa mallsida',
+'viewhelppage' => 'Visa hjälpsida',
+'categorypage' => 'Visa kategorisida',
'viewtalkpage' => 'Visa diskussionssida',
'otherlanguages' => 'Andra språk',
'redirectedfrom' => '(Omdirigerad från $1)',
-'autoredircomment' => 'Omdirigerar till [[$1]]',
'redirectpagesub' => 'Omdirigeringssida',
'lastmodifiedat' => 'Sidan ändrades senast $2, $1.',
'viewcount' => 'Sidan har visats {{PLURAL:$1|en gång|$1 gånger}}.',
@@ -226,6 +249,10 @@ $messages = array(
'jumptonavigation' => 'navigering',
'jumptosearch' => 'sök',
'badaccess' => 'Behörighetsfel',
+'badaccess-group0' => 'Du har inte tillåtelse att utföra den åtgärd du har begärt.',
+'badaccess-group1' => 'Funktionen du vill använda är begränsad till användare i gruppen $1.',
+'badaccess-group2' => 'Funktionen du vill använda är begränsad till användare i grupperna $1.',
+'badaccess-groups' => 'Funktionen du vill använda är begränsad till användare i grupperna $1.',
'versionrequired' => 'Version $1 av MediaWiki krävs',
'versionrequiredtext' => 'För att kunna använda den här sidan, behövs version $1 av MediaWiki. Se [[Special:Version]].',
'ok' => 'OK',
@@ -244,10 +271,11 @@ $messages = array(
'viewdeleted' => 'Visa $1?',
'restorelink' => '{{PLURAL:$1|en raderad version|$1 raderade versioner}}',
'feedlinks' => 'Matning:',
+'feed-invalid' => 'Ogiltig matningstyp.',
'nstab-main' => 'Artikel',
'nstab-user' => 'Användarsida',
'nstab-media' => 'Media',
-'nstab-special' => 'Speciell',
+'nstab-special' => 'Special',
'nstab-project' => 'projektsida',
'nstab-image' => 'Bild',
'nstab-mediawiki' => 'systemmeddelande',
@@ -295,8 +323,8 @@ felaktigt länkad till.',
'wrong_wfQuery_params' => 'Felaktiga parametrar för wfQuery()<br /> Funktion: $1<br /> Förfrågan: $2',
'viewsource' => 'Visa wikitext',
'viewsourcefor' => 'för $1',
-'protectedtext' => '
-Denna sida har skrivskyddats, för att hindra redigering. Du kan se och kopiera källkoden, men inte ändra den.',
+'protectedpagetext' => 'Den här sidan har skrivskyddats för att förhindra redigering.',
+'viewsourcetext' => 'Du kan se och kopiera sidans wikikod:',
'protectedinterface' => 'Denna sida innehåller text för mjukvarans gränssnitt, och är skrivskyddad för att förebygga missbruk.',
'editinginterface' => '\'\'\'Varning:\'\'\' Du redigerar en sida som används till texten i gränssnittet. Ändringar på denna sida kommer att påverka gränssnittets utseende för alla användare.',
'sqlhidden' => '(gömd SQL-förfrågan)',
@@ -352,10 +380,21 @@ Kontrollera stavningen, eller använd formuläret nedan för att skapa ett nytt
'wrongpasswordempty' => 'Lösenordet som angavs var blankt. Var god försök igen.',
'mailmypassword' => 'Sänd mig ett nytt lösenord',
'passwordremindertitle' => 'Nytt lösenord från {{SITENAME}}',
-'passwordremindertext' => 'Någon - förmodligen du - har från IP-numret $1 bett oss sända dig ett nytt lösenord för ditt användarkonto på {{SITENAME}} ($4). Lösenordet för användaren "$2" är nu "$3". Du bör nu logga in, och byta lösenord.<br /><br />Om det inte var du som gjorde denna begäran, eller om du har kommit på ditt gamla lösenord och inte längre önskar ändra det så kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.',
+'passwordremindertext' =>
+'Någon - förmodligen du - har från IP-numret $1 bett oss sända dig ett
+nytt lösenord för ditt användarkonto på {{SITENAME}} ($4).
+Lösenordet för användaren "$2" är nu "$3".
+
+Du bör nu logga in, och byta lösenord.
+
+Om det inte var du som gjorde denna begäran, eller om du har kommit på
+ditt gamla lösenord och inte längre önskar ändra det så kan du ignorera
+detta meddelande och fortsätta använda ditt gamla lösenord.',
'noemail' => 'Användaren "$1" har inte registrerat någon e-postadress.',
'passwordsent' => 'Ett nytt lösenord har skickats till den e-postadress som användaren "$1" har registrerat. När du får meddelandet, var god logga in igen.',
+'blocked-mailpassword' => 'Din IP-adress är blockerad, därför kan den inte användas för att få ett nytt lösenord.',
'eauthentsent' => 'Ett e-brev för bekräftelse har skickats till den e-postadress som angivits. Du måste följa instruktionerna i e-brevet för att bekräfta att kontot verkligen är ditt, innan någon annan epost kan skickas härifrån till kontot,',
+'throttled-mailpassword' => 'Ett nytt lösenord har redan skickats under de senaste $1 timmarna. För att förhindra missbruk skickas bara ett nytt lösenord på under den tiden.',
'mailerror' => 'Fel vid skickande av e-post: $1',
'acct_creation_throttle_hit'=> 'Du har redan skapat $1 användare och kan inte göra fler.',
'emailauthenticated' => 'Din e-postadress bekräftades den $1.',
@@ -365,6 +404,14 @@ Kontrollera stavningen, eller använd formuläret nedan för att skapa ett nytt
'invalidemailaddress' => 'Denna e-postadressen kan inte godtas då formatet verkar vara felaktigt. Skriv in en adress på korrekt format, eller töm fältet.',
'accountcreated' => 'Användarkontot har skapats',
'accountcreatedtext' => 'Användarkontot $1 har skapats.',
+'resetpass' => 'Välj nytt lösenord',
+'resetpass_announce' => 'Du loggade in med ett temporärt lösenord. För att slutföra inloggningen måste du välja ett nytt lösenord.',
+'resetpass_header' => 'Välj nytt lösenord',
+'resetpass_submit' => 'Spara lösenord och logga in',
+'resetpass_success' => 'Ditt lösenord ändrades. Du är nu inloggad.',
+'resetpass_bad_temporary' => 'Ditt temporära lösenord är felaktigt. Du kanske redan har loggat in med det eller begärt att få ett nytt tillfälligt lösenord.',
+'resetpass_forbidden' => 'Lösenord kan inte ändras på den här wikin.',
+'resetpass_missing' => 'Formulärdata saknas.',
'bold_sample' => 'Fet text',
'bold_tip' => 'Fet stil',
'italic_sample' => 'Kursiv text',
@@ -397,6 +444,9 @@ Kontrollera stavningen, eller använd formuläret nedan för att skapa ett nytt
'anoneditwarning' => 'Du är inte inloggad. Därför kommer din IP-adress att synas i historiken för den här sidan när du sparar din redigering.',
'missingsummary' => '\'\'\'OBS:\'\'\' Du glömde att skriva en redigeringskommentar. Om du trycker på "Spara" igen så kommer din redigering att sparas utan redigeringskommentar.',
'missingcommenttext' => 'Var god och skriv in en kommentar nedan.',
+'missingcommentheader' => '\'\'\'OBS:\'\'\' Du har inte skrivit någon rubrik till den här kommentaren. Om du trycker på "Spara" igen, så sparas kommentaren utan någon rubrik.',
+'summary-preview' => 'Sammanfattningsförhandsgranskning',
+'subject-preview' => 'Rubrikförhandsgranskning',
'blockedtitle' => 'Användaren är spärrad',
'blockedtext' => 'Du har försökt redigera en sida på {{SITENAME}}, men för närvarande kan du inte redigera sidor. Ditt användarnamn eller din IP-adress har blivit blockerat av $1 med motiveringen: \'\'$2\'\'.<br />
Du kan kontakta $1 eller någon annan av [[Project:Administratörer|administratörerna]] för att diskutera blockeringen.<br />
@@ -468,9 +518,16 @@ dina ändringar just nu. Det kan vara klokt att kopiera över texten till din eg
Försäkra dig om att du följer riktlinjerna för redigering av skyddade sidor.</strong>',
'semiprotectedpagewarning'=> '\'\'\'Observera:\'\'\' Denna sida har delvis skrivskyddats, så att endast registrerade användare kan redigera den.',
'templatesused' => 'Mallar som används på den här sidan:',
+'templatesusedpreview' => 'Mallar som används i förhandsgranskningen:',
+'templatesusedsection' => 'Mallar som används i det här avsnittet:',
'edittools' => '<!-- Denna text kommer att visas nedanför redigeringsrutor och uppladdningsformulär. -->',
'nocreatetitle' => 'Skapande av sidor begränsat',
'nocreatetext' => 'Denna wiki har begränsat möjligheterna att skapa nya sidor. Du kan redigera existerande sidor, eller [[Special:Userlogin|logga in eller skapa ett användarkonto]].',
+'undo-success' => 'Ändringen kunde ogöras. Resultatet visas i redigeringsrutan, spara det genom att trycka på "spara".',
+'undo-failure' => 'På grund av senare redigeringar kunde inte ändringen ogöras.',
+'undo-summary' => 'Ogör ändring $1 av [[Special:Contributions/$2]] ([[Användardiskussion:$2]])',
+'cantcreateaccounttitle' => 'Kontot kan inte skapas',
+'cantcreateaccounttext' => 'Registrering av konton har blockerats för den här IP-adressen (<b>$1</b>). Det beror antagligen på återkommande klotter och vandalism från adressen.',
'revhistory' => 'Versionshistorik',
'viewpagelogs' => 'Visa loggar för denna sida',
'nohistory' => 'Den här sidan har ingen versionshistorik.',
@@ -479,7 +536,7 @@ Försäkra dig om att du följer riktlinjerna för redigering av skyddade sidor.
'loadhist' => 'Läser sidans versioner',
'currentrev' => 'Nuvarande version',
'revisionasof' => 'Versionen från $1',
-'old-revision-navigation'=> 'Version från den $1; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => 'Version från den $1; $2',
'previousrevision' => '↠Äldre version',
'nextrevision' => 'Nyare version →',
'currentrevisionlink' => 'Nuvarande version',
@@ -503,6 +560,8 @@ Försäkra dig om att du följer riktlinjerna för redigering av skyddade sidor.
Den kan ha tagits bort från wikin eller bytt namn.
Prova att [[Special:Search|söka på wikin]] för relevanta nya sidor.',
'revisiondelete' => 'Ta bort/återställ versioner',
+'revdelete-nooldid-title' => 'Ingen version angiven',
+'revdelete-nooldid-text' => 'Du angav inte vilken eller vilka versioner du vill utföra funktionen på.',
'revdelete-selected' => 'Vald version av [[:$1|$1]]:',
'revdelete-text' => 'Borttagna versioner kommer fortfarande att synas i historiken, men deras innehåll kommer ej att vara tillgängligt för allmänheten. Andra administratörer på denna wiki kommer fortfarande att kunna läsa det dolda innehållet och kan återställa artikeln genom samma gränssnitt, om inte en ytterligare begränsning har utfärdats av sajtens ägare.',
'revdelete-legend' => 'Ange begränsningar för version:',
@@ -520,6 +579,8 @@ Prova att [[Special:Search|söka på wikin]] för relevanta nya sidor.',
'selectnewerversionfordiff'=> 'Välj en nyare version för jämförelse',
'selectolderversionfordiff'=> 'Välj en äldre version för jämförelse',
'compareselectedversions'=> 'Jämför angivna versioner',
+'editundo' => 'ogör',
+'diff-multi' => '({{plural:$1|En mellanliggande version|$1 mellanliggande versioner}} visas inte.)',
'searchresults' => 'Sökresultat',
'searchresulttext' => 'Läs mera om [[Project:Sökning|sökning på {{SITENAME}}]].',
'searchsubtitle' => 'Du sökte efter [[:$1]]',
@@ -545,6 +606,7 @@ $2 Lista omdirigeringar &nbsp; Sök efter $3 $9',
'searchdisabled' => 'Fulltextssökning på {{SITENAME}} har tyvärr tillfälligt stängts av p.g.a. prestandaproblem. Tills detta har fixats, kan du använda Google-sökningen nedan. Resultaten därifrån kan dock vara något föråldrade.',
'blanknamespace' => '(Artiklar)',
'preferences' => 'Inställningar',
+'mypreferences' => 'Mina inställningar',
'prefsnologin' => 'Du är inte inloggad',
'prefsnologintext' => 'Du måste vara [[Special:Userlogin|inloggad]] för att kunna ändra i inställningar.',
'prefsreset' => 'Inställningarna har återställts till ursprungsvärdena.',
@@ -676,8 +738,8 @@ Alla tider visas efter serverns tid (UTC).
'largefileserver' => 'Denna fil är större än vad servern ställts in att tillåta.',
'emptyfile' => 'Filen du laddade upp verkar vara tom; felet kan bero på ett stavfel i filnamnet. Kontrollera om du verkligen vill ladda upp denna fil.',
'fileexists' => 'Det finns redan en fil med detta namn. Titta på $1, såvida du inte är säker på att du vill ändra den.',
-'fileexists-forbidden' => 'En fil med detta namn finns redan; vänligen backa och ladda upp denna fil under ett nytt namn [[Image:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden'=> 'En file med detta namn finns redan bland de delade filerna; vänligen backa och ladda upp denna fil under ett nytt namn. [[Image:$1|thumb|center|$1]]',
+'fileexists-forbidden' => 'En fil med detta namn finns redan; vänligen backa och ladda upp din fil under ett annat namn [[Image:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden'=> 'En fil med detta namn finns redan bland de delade filerna; vänligen backa och ladda upp din fil under ett annat namn. [[Image:$1|thumb|center|$1]]',
'successfulupload' => 'Uppladdningen lyckades',
'fileuploaded' => 'Filen "$1" laddades upp korrekt.
Följ länken ($2) till beskrivningssidan, och fyll där i
@@ -693,9 +755,22 @@ när den skapades, vem som gjort den, om själva innehållet, och så mycket om
'uploadvirus' => 'Filen innehåller virus! Detaljer: $1',
'sourcefilename' => 'Ursprungsfilens namn',
'destfilename' => 'Nytt filnamn',
+'watchthisupload' => 'Bevaka sidan',
'filewasdeleted' => 'En fil med detta namn har tidigare laddats upp och därefter tagits bort. Du bör kontrollera $1 innan du fortsätter att ladda upp den.',
+'upload-proto-error' => 'Felaktigt protokoll',
+'upload-proto-error-text' => 'Fjärruppladdning kräver URL:ar som börjar med <code>http://</code> eller <code>ftp://</code>.',
+'upload-file-error' => 'Internt fel',
+'upload-file-error-text' => 'Ett internt fel inträffade när en temporär fil skulle skapas på servern. Kontakta en systemadministratör.',
+'upload-misc-error' => 'Okänt uppladdningsfel',
+'upload-misc-error-text' => 'Ett okänt fel inträffade under uppladdningen. Kontrollera att URL:en giltig och frösök igen. Om problemet kvarstår, kontakta en systemadministratör.',
+'upload-curl-error6' => 'URL:en kunde inte nås',
+'upload-curl-error6-text' => 'Den angivna URL:en kunde inte nås. Kontrollera att den är korrekt och att webbplatsern fungerar.',
+'upload-curl-error28' => 'Timeout för uppladdningen',
+'upload-curl-error28-text' => 'Webbplatsen tog för lång tid på sig att svara. Kontrollera att den är uppe och försök igen om en liten stund.',
'license' => 'Licens',
'nolicense' => 'Ingen angiven',
+'upload_source_url' => ' (en giltig URL som är allmänt åtkomlig)',
+'upload_source_file' => ' (en fil på din dator)',
'imagelist' => 'Bildlista',
'imagelisttext' => 'Nedan finns en lista med <strong>$1</strong> {{plural:$1|bild|bilder}} sorterad <strong>$2</strong>.',
'imagelistforuser' => 'Listan visar endast bilder som är uppladdade av $1.',
@@ -707,6 +782,7 @@ när den skapades, vem som gjort den, om själva innehållet, och så mycket om
'bysize' => 'efter storlek',
'imgdelete' => 'ta bort',
'imgdesc' => 'beskrivning',
+'imgfile' => 'fil',
'imglegend' => 'Bildtext: (beskrivning) = visa/redigera bildtext.',
'imghistory' => 'Bildhistorik',
'revertimg' => 'återgå',
@@ -715,7 +791,7 @@ när den skapades, vem som gjort den, om själva innehållet, och så mycket om
'imghistlegend' => 'Beskrivning: (nuvarande) = detta är den nuvarande bilden,
(ta bort) = ta bort den gamla version, (återgå) = återgå till en gammal version.
<br /><i>Klicka på ett datum för att se bilden som laddades upp den dagen</i>.',
-'imagelinks' => 'Bildlänk',
+'imagelinks' => 'Bildlänkar',
'linkstoimage' => 'Följande sidor länkar till denna bild:',
'nolinkstoimage' => 'Inga sidor länkar till den här bilden.',
'sharedupload' => 'Denna fil är uppladdad som delad, och kan användas av andra projekt.',
@@ -724,6 +800,12 @@ när den skapades, vem som gjort den, om själva innehållet, och så mycket om
'noimage' => 'Det finns ingen fil med detta namn. Du kan $1.',
'noimage-linktext' => 'ladda upp den',
'uploadnewversion-linktext'=> 'Ladda upp en ny version av denna fil',
+'imagelist_date' => 'Datum',
+'imagelist_name' => 'Filnamn',
+'imagelist_user' => 'Användare',
+'imagelist_size' => 'Storlek (bytes)',
+'imagelist_description' => 'Filbeskrivning',
+'imagelist_search_for' => 'Sök efter bildnamn:',
'mimesearch' => 'MIME-sökning',
'mimetype' => 'MIME-typ:',
'download' => 'ladda ner',
@@ -743,7 +825,8 @@ när den skapades, vem som gjort den, om själva innehållet, och så mycket om
Sedan denna wiki startades har sidor visats totalt <b>$3</b> gånger, och <b>$4</b> sidor har ändrats. Detta är i genomsnitt <b>$5</b> ändringar per sida, och <b>$6</b> sidvisningar per ändring.
[http://meta.wikimedia.org/wiki/Help:Job_queue Jobbkön]s längd är för tillfället \'\'\'$7\'\'\'.',
-'userstatstext' => 'Det finns \'\'\'$1\'\'\' registrerade användare. Av dem är \'\'\'$2\'\'\' (eller \'\'\'$4%\'\'\') administratörer (se $3).',
+'userstatstext' => 'Det finns \'\'\'$1\'\'\' registrerade användare. Av dem är \'\'\'$2\'\'\' (eller \'\'\'$4%\'\'\') $5.',
+'statistics-mostpopular' => 'Mest besökta sidor',
'disambiguations' => 'Sidor som länkar till förgreningssidor',
'disambiguationspage' => 'Template:Förgrening',
'disambiguationstext' => 'Följande artiklar länkar till \'\'förgreningssidor\'\'. Länkarna behöver ofta ändras så att de länkar till en artikel istället.<br />En sida anses vara en förgreningssida om den länkar till $1. <br />Länkar från andra namnrymder är <i>inte</i> listade här.',
@@ -758,6 +841,7 @@ Sedan denna wiki startades har sidor visats totalt <b>$3</b> gånger, och <b>$4<
'nrevisions' => '$1 {{PLURAL:$1|ändring|ändringar}}',
'nviews' => '$1 {{PLURAL:$1|visning|visningar}}',
'lonelypages' => 'Föräldralösa sidor',
+'lonelypagestext' => 'Följande sidor länkas inte till från någon annan sida på den här wikin.',
'uncategorizedpages' => 'Ej kategoriserade sidor',
'uncategorizedcategories'=> 'Ej kategoriserade kategorier',
'uncategorizedimages' => 'Bilder utan kategori',
@@ -777,6 +861,7 @@ Sedan denna wiki startades har sidor visats totalt <b>$3</b> gånger, och <b>$4<
'shortpages' => 'Korta sidor',
'longpages' => 'LÃ¥nga sidor',
'deadendpages' => 'Sidor utan länkar',
+'deadendpagestext' => 'Följande sidor saknar länkar till andra sidor på den här wikin.',
'listusers' => 'Användarlista',
'specialpages' => 'Specialsidor',
'spheading' => 'Specialsidor för alla användare',
@@ -784,6 +869,7 @@ Sedan denna wiki startades har sidor visats totalt <b>$3</b> gånger, och <b>$4<
'recentchangeslinked' => 'Ändringar på angränsande sidor',
'rclsub' => '(som "$1" länkar till)',
'newpages' => 'Nya sidor',
+'newpages-username' => 'Användare:',
'ancientpages' => 'Äldsta artiklarna',
'intl' => 'Interwiki-länkar',
'move' => 'Flytta',
@@ -792,13 +878,13 @@ Sedan denna wiki startades har sidor visats totalt <b>$3</b> gånger, och <b>$4<
med en direkt URL, och kan därför bli listade här trots att de används kontinuerligt.',
'unusedcategoriestext' => 'Dessa existerande kategorier innehåller inga artiklar eller underkategorier.',
'booksources' => 'Bokkällor',
+'booksources-search-legend' => 'Sök efter bokkällor',
+'booksources-go' => 'Sök',
+'booksources-text' => 'Nedan följer en lista över länkar till webbplatser som säljer nya och begagnade böcker, och som kanske har ytterligare information om de böcker du söker.',
'categoriespagetext' => 'Följande kategorier finns på {{SITENAME}}.',
'data' => 'Data',
'userrights' => 'Användarrättigheter',
'groups' => 'Användargrupper',
-'booksourcetext' => 'Nedan följer en lista över länkar till hemsidor som säljer
-nya och begagnade böcker, och mycket annan information om de böcker du söker.
-{{SITENAME}} har <b>inget</b> affärssamarbete med ovanstående företag och ska inte heller tolkas som en rekommendation av dessa.',
'isbn' => 'ISBN',
'alphaindexline' => '$1 till $2',
'version' => 'Version',
@@ -806,6 +892,7 @@ nya och begagnade böcker, och mycket annan information om de böcker du söker.
'alllogstext' => 'Kombinerad visning av uppladdningar av bilder, raderinger och skrivskydd av sidor, blockeringar av IP-adresser/användare, och byråkratlogg. Du får ofta färre träffar om du väljer typ av logg, användarnamn, eller sida.',
'logempty' => 'Inga matchande träffar i loggen.',
'nextpage' => 'Nästa sida ($1)',
+'prevpage' => 'Föregående sida ($1)',
'allpagesfrom' => 'Visa sidor från och med:',
'allarticles' => 'Alla artiklar',
'allinnamespace' => 'Alla sidor (i namnrymden $1)',
@@ -815,6 +902,7 @@ nya och begagnade böcker, och mycket annan information om de böcker du söker.
'allpagessubmit' => 'Utför',
'allpagesprefix' => 'Visa sidor med prefixet:',
'allpagesbadtitle' => 'Den sökta sidtiteln var ogiltig eller så innehöll den ett prefix för annan språkversion eller interwiki-prefix. Titeln kan innehålla bokstäver som inte är tillåtna i sidtitlar.',
+'listusersfrom' => 'Visa användare från och med:',
'mailnologin' => 'Ingen adress att skicka till',
'mailnologintext' => 'För att kunna skicka e-post till andra användare, måste du vara [[Special:Userlogin|inloggad]] och ha angivit en korrekt e-postadress i dina [[Special:Preferences|användarinställningar]].',
'emailuser' => 'Skicka e-post till den här användaren',
@@ -832,6 +920,8 @@ i "Från"-fältet i detta meddelande, så mottagaren har möjlighet att svara.',
'emailsubject' => 'Ämne',
'emailmessage' => 'Meddelande',
'emailsend' => 'Skicka',
+'emailccme' => 'Skicka en kopia av meddelandet till mig.',
+'emailccsubject' => 'Kopia av ditt meddelande till $1: $2',
'emailsent' => 'E-post har nu skickats',
'emailsenttext' => 'Din e-post har skickats.',
'watchlist' => 'Min övervakningslista',
@@ -969,6 +1059,7 @@ Vill du skrivskydda denna sida?',
'undeletehistory' => 'Om du återställer sidan, kommer alla tidigare versioner att återfinnas i versionshistoriken. Om en ny sida med samma namn har skapats sedan sidan raderades, kommer den återskapade historiken automatiskt att återfinnas i den äldre historiken. Den nuvarande versionen kommer alltså inte att ersättas av de raderade och återskapade.',
'undeletehistorynoadmin'=> 'Den här artikeln har blivit raderad. Anledningen till detta anges i sammanfattningen nedan, tillsammans med uppgifter om de användare som redigerat sidan innan den raderades. Enbart administratörerna har tillgång till den raderade texten.',
'undeleterevision' => 'borttagen version från den $1',
+'undeleterevision-missing' => 'Versionen finns inte eller är felaktig. Versionen kan ha återställts eller tagits bort från arkivet, du kan också ha följt en felaktig länk.',
'undeletebtn' => 'Återställ',
'undeletereset' => 'Rensa',
'undeletecomment' => 'Kommentar:',
@@ -1000,8 +1091,8 @@ I [[Special:Log/delete|borttagningsloggen]] kan du hitta information om nyligen
'notargettitle' => 'Inget mål',
'notargettext' => 'Du har inte angivit någon sida eller användare att utföra denna funktion på.',
'linklistsub' => '(Länklista)',
-'linkshere' => 'Följande sidor länkar hit:',
-'nolinkshere' => 'Inga sidor länkar hit.',
+'linkshere' => 'Följande sidor länkar till [[:$1]]:',
+'nolinkshere' => 'Inga sidor länkar till [[:$1]].',
'isredirect' => 'transportsida',
'istemplate' => 'inkluderad som mall',
'blockip' => 'Blockera IP-adress',
@@ -1010,6 +1101,9 @@ I [[Special:Log/delete|borttagningsloggen]] kan du hitta information om nyligen
'ipadressorusername' => 'IP-adress eller användarnamn',
'ipbexpiry' => 'Varaktighet',
'ipbreason' => 'Anledning',
+'ipbanononly' => 'Blockera bara oinloggade användare',
+'ipbcreateaccount' => 'Förhindra registrering av användarkonton',
+'ipbenableautoblock' => 'Blockera automatiskt IP-adresser som användaren försöker redigera ifrån',
'ipbsubmit' => 'Blockera den här IP-adressen',
'ipbother' => 'Annan tidsperiod',
'ipboptions' => '2 timmar:2 hours,1 dag:1 day,3 dagar:3 days,1 vecka:1 week,2 veckor:2 weeks,1 månad:1 month,3 månader:3 months,6 månader:6 months,1 år:1 year,oändlig:infinite',
@@ -1027,19 +1121,24 @@ En logg över blockeringar och borttagningar av blockeringar finns på [[Special
'blocklistline' => '$1: $2 blockerar $3, blockeringen upphör $4',
'infiniteblock' => 'evig',
'expiringblock' => 'förfaller $1',
+'anononlyblock' => 'endast för oinloggade',
+'noautoblockblock' => 'utan automatisk blockering',
+'createaccountblock' => 'kontoregistrering blockerad',
'ipblocklistempty' => 'Listan över blockerade IP-adresser är tom',
'blocklink' => 'blockera',
'unblocklink' => 'ta bort blockering',
'contribslink' => 'bidrag',
-'autoblocker' => 'Automatiskt blockerad, eftersom du har samma IP-adress som "$1". Motivering till blockeringen: "$2".',
+'autoblocker' => 'Automatisk blockering eftersom du har samma IP-adress som "$1". Motivering till blockeringen: "$2".',
'blocklogpage' => 'Blockeringar',
'blocklogentry' => 'blockerade "$1" ($2)',
'blocklogtext' => 'Detta är en logg över blockeringar och avblockeringar. Automatiskt blockerade IP-adresser listas ej. En lista över IP-adresser och användare som för närvarande är blockerade finns på [[Special:Ipblocklist|IP-blocklistan]].',
'unblocklogentry' => 'tog bort blockering av "$1"',
'range_block_disabled' => 'Möjligheten för administratörer att blockera intervall av IP-adresser har stängts av.',
'ipb_expiry_invalid' => 'Förfallotiden ogiltig',
+'ipb_already_blocked' => '"$1" är redan blockerad',
'ip_range_invalid' => 'Ogiltigt IP-intervall.',
'proxyblocker' => 'Proxy-block',
+'ipb_cant_unblock' => 'Fel: Hittade inte blockering $1. Det är möjligt att den redan har upphävts.',
'proxyblockreason' => 'Din IP-adress har blivit blockerad eftersom den tillhör en öppen proxy. Kontakta din internetleverantör eller din organisations eller företags tekniska support, och informera dem om denna allvarliga säkerhetsrisk.',
'proxyblocksuccess' => 'Gjort.',
'sorbs' => 'SORBS DNSBL',
@@ -1060,6 +1159,8 @@ Bekräfta att du verkligen vill göra detta, och att du kommer att låsa upp dat
'lockdbsuccesstext' => 'Databasen är nu låst.
<br />Kom ihåg att ta bort låsningen när du är färdig med ditt underhåll.',
'unlockdbsuccesstext' => 'Databasen är upplåst.',
+'lockfilenotwritable' => 'Det går inte att skriva till databasens låsfil. För att låsa eller låsa upp databasen, så måste webbservern kunna skriva till den filen.',
+'databasenotlocked' => 'Databasen är inte låst.',
'makesysoptitle' => 'Gör en användare till administratör',
'makesysoptext' => 'Det här formuläret används av byråkrater för att göra vanliga användare till administratörer.
Skriv användarens namn i rutan och tryck på knappen för att göra användaren till administratör',
@@ -1090,7 +1191,9 @@ Skriv användarens namn i rutan och tryck på knappen för att göra användaren
'newtitle' => 'Till det nya uppslagsordet',
'movepagebtn' => 'Flytta sidan',
'pagemovedsub' => 'Flyttningen lyckades',
-'pagemovedtext' => 'Sidan "<span class="plainlinks">[{{fullurl:<nowiki>$1</nowiki>|redirect=no}} $1]</span>" flyttad till "[[:$2|$2]]". [[Special:Whatlinkshere/<nowiki>$2</nowiki>|Kontrollera]] gärna att flytten inte orsakat några dubbla omdirigeringar.',
+'pagemovedtext' => 'Sidan "[[$1]]" flyttad till "[[$2]]".
+
+[[{{ns:Special}}:Whatlinkshere/$2|Kontrollera]] gärna att flytten inte orsakat några dubbla omdirigeringar.',
'articleexists' => 'Antingen existerar redan en sida med det namnet, eller så har du valt ett namn som inte är tillåtet.
Välj något annat namn istället.',
'talkexists' => 'Sidan flyttades, men eftersom en annan diskussionssida redan fanns på destinationen kunde diskussionssidan inte flyttas med. Försök att manuellt sammanfoga de bägge diskusionssidornas innehåll till en sida.',
@@ -1108,9 +1211,9 @@ Välj något annat namn istället.',
'delete_and_move_text' => '==Radering krävs== Den titel du vill flytta artikeln till, "[[:$1|$1]]", finns redan. Vill du radera den för att möjliggöra flytt av denna sida dit?',
'delete_and_move_confirm'=> 'Ja, radera sidan',
'delete_and_move_reason'=> 'Raderad för att flytta hit en annan sida.',
-'selfmove' => 'Ursprungstitel och destinationstitel är identiska. Sidan kan inte flyttas till sig självt.',
+'selfmove' => 'Ursprungstitel och destinationstitel är identiska. Sidan kan inte flyttas till sig själv.',
'immobile_namespace' => 'Det går inte att flytta artiklar till den namnrymd du angivit, då denna ej kan utökas.',
-'export' => 'Exportsidor',
+'export' => 'Exportera sidor',
'exporttext' => 'Du kan exportera en eller flera sidors text och versionshistorik i XML-format. Filen kan sedan importeras till en annan MediaWiki-wiki m h a sidan Special:Import (importera).
För att exportera sidor skriv in artikeluppslagen i rutan nedan, en sida per rad. Välj om du vill exportera den nuvarande versionen tillsammans med alla de gamla, med sidans historik, eller bara den nuvarande versionen med information om den sista redigeringen.
@@ -1156,7 +1259,7 @@ All överföring mellan wikier (transwiki) listas i [[Special:Log/import|import
'importuploaderror' => 'Importfilen kunde inte laddas upp; kanske är den större än vad filer som skall laddas upp får vara.',
'importlogpage' => 'Importlogg',
'importlogpagetext' => 'Administrativa sidimporter med versionshistorik från andra wikier.',
-'import-logentry-upload'=> '$1 har importerats genom uppladdning av fil',
+'import-logentry-upload'=> '[[$1]] har importerats genom uppladdning av fil',
'import-logentry-upload-detail'=> '$1 {{plural:$1|version|versioner}}',
'import-logentry-interwiki'=> 'överförde $1 mellan wikier',
'import-logentry-interwiki-detail'=> '$1 {{plural:$1|version|versioner}} från $2',
@@ -1171,11 +1274,11 @@ All överföring mellan wikier (transwiki) listas i [[Special:Log/import|import
'tooltip-minoredit' => 'Markera som mindre ändring [alt-i]',
'tooltip-save' => 'Spara dina ändringar [alt-s]',
'tooltip-preview' => 'Det är bra om du förhandsgranskar dina ändringar innan du sparar! [alt-p]',
-'tooltip-diff' => 'Visa vilka förändringar du har gjort av texten. [alt-d]',
+'tooltip-diff' => 'Visa vilka förändringar du har gjort av texten. [alt-v]',
'tooltip-compareselectedversions'=> 'Visa skillnaden mellan de två markerade versionerna av den här sidan. [alt-v]',
'tooltip-watch' => 'Lägg till den här sidan i din bevakningslista [alt-w]',
-'Common.css' => '/** CSS som skrivs här nedan påverkar alla skal **/',
-'Monobook.css' => '/*CSS som skrivs in här kommer att påverka alla användare av skalet Monobook */',
+'common.css' => '/** CSS som skrivs här nedan påverkar alla skal **/',
+'monobook.css' => '/*CSS som skrivs in här kommer att påverka alla användare av skalet Monobook */',
'nodublincore' => 'Dublin Core RDF metadata avstängt på den här servern.',
'nocreativecommons' => 'Creative Commons RDF metadata avstängd på denna server.',
'notacceptable' => 'Den här wiki-servern kan inte erbjuda data i ett format som din klient kan läsa.',
@@ -1192,7 +1295,8 @@ All överföring mellan wikier (transwiki) listas i [[Special:Log/import|import
'spamprotectiontext' => 'Sidan du ville spara blockerades av spamfiltret. Detta orsakades troligen av en extern länk på sidan.',
'spamprotectionmatch' => 'Följande text aktiverade vårt spamfilter: $1',
'subcategorycount' => 'Det finns {{PLURAL:$1|en underkategori|$1 underkategorier}} till den här kategorin.',
-'categoryarticlecount' => 'Det finns {{PLURAL:$1|en artikel|$1 artiklar}} i den här kategorin.',
+'categoryarticlecount' => 'Det finns {{PLURAL:$1|en artikel|$1 artiklar}} i den här kategorin.',
+'category-media-count' => 'Det finns {{PLURAL:$1|en fil|$1 filer}} i den här kategorin.',
'listingcontinuesabbrev'=> ' forts.',
'spambot_username' => 'MediaWikis spampatrull',
'spam_reverting' => 'Återställer till den senaste versionen som inte innehåller länkar till $1',
@@ -1216,8 +1320,9 @@ All överföring mellan wikier (transwiki) listas i [[Special:Log/import|import
'rcpatroldisabled' => 'Patrullering av Senaste ändringar är avstängd.',
'rcpatroldisabledtext' => 'Funktionen "patrullering av Senaste ändringar" är tillfälligt avstängd.',
'markedaspatrollederror'=> 'Kan inte markera som patrullerad',
-'markedaspatrollederrortext'=> 'Du måste ange version för att kunna markera som patrullerad',
-'Monobook.js' => '/* redigera denna fil för att anpassa javascript för hela webbplatsen */
+'markedaspatrollederrortext'=> 'Du måste ange version för att kunna markera som patrullerad.',
+'markedaspatrollederror-noautopatrol' => 'Du har inte tillåtelse att markera dina egna redigeringar som patrullerade.',
+'monobook.js' => '/* redigera denna fil för att anpassa javascript för hela webbplatsen */
/* tooltips and access keys */
var ta = new Object();
@@ -1230,7 +1335,7 @@ All överföring mellan wikier (transwiki) listas i [[Special:Log/import|import
ta[\'pt-mycontris\'] = new Array(\'y\',\'Lista över mina bidrag\');
ta[\'pt-login\'] = new Array(\'o\',\'Du får gärna logga in, men det är inte nödvändigt\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Du får gärna logga in, men det är inte nödvändigt\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Logga ut\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Logga ut\');
ta[\'ca-talk\'] = new Array(\'t\',\'Diskussion om sidans innehåll\');
ta[\'ca-edit\'] = new Array(\'e\',\'Du kan redigera den här sidan. Var vänlig och förhandsgranska innan du sparar.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Lägg till en kommentar i den här diskussionen\');
@@ -1270,6 +1375,7 @@ All överföring mellan wikier (transwiki) listas i [[Special:Log/import|import
ta[\'ca-nstab-template\'] = new Array(\'c\',\'Se mallen\');
ta[\'ca-nstab-help\'] = new Array(\'c\',\'Se hjälpsidan\');
ta[\'ca-nstab-category\'] = new Array(\'c\',\'Se kategorisidan\');',
+'common.js' => '/* JavaScript som skrivs här körs varje gång en användare laddar en sida. */',
'deletedrevision' => 'Raderade gammal sidversion $1.',
'previousdiff' => '↠Gå till föregående ändring',
'nextdiff' => 'Gå till nästa ändring →',
@@ -1298,6 +1404,15 @@ All överföring mellan wikier (transwiki) listas i [[Special:Log/import|import
'metadata-help' => 'Det här filen innehåller extrainformation som troligen lades till när bilden togs av en digitalkamera eller när det digitaliserades av en scanner. Om filen har modifierats kan det hända att vissa detaljer inte överensstämmer med den modifierade bilden.',
'metadata-expand' => 'Visa utökade detaljer',
'metadata-collapse' => 'Dölj utökade detaljer',
+'metadata-fields' => 'EXIF-fält som listas i det här meddelandet visas på
+bildsidan när metadatatabellen är minimerad. Övriga fält
+är gömda som standard, men visas när tabellen expanderas.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* focallength',
'exif-imagewidth' => 'Bredd',
'exif-imagelength' => 'Höjd',
'exif-bitspersample' => 'Bitar per komponent',
@@ -1479,9 +1594,12 @@ All överföring mellan wikier (transwiki) listas i [[Special:Log/import|import
'watchlistall2' => 'alla',
'namespacesall' => 'alla',
'confirmemail' => 'Bekräfta e-postadress',
+'confirmemail_noemail' => 'Du har inte givit någon fungerande e-postadress i dina [[Special:Preferences|inställningar]].',
'confirmemail_text' => 'Innan du kan använda {{SITENAME}}s funktioner för e-post måste du bekräfta din e-postadress. Aktivera knappen nedan för att skicka en bekräftelsekod till din e-postadress. Mailet kommer att innehålla en länk, som innehåller en kod. Genom att klicka på den länken eller kopiera den till din webbläsares fönster för webbadresser, bekräftar du att din e-postadress fungerar.',
+'confirmemail_pending' => 'En bekräftelsekod har redan skickats till din epostadress. Om du skapade ditt konto nyligen, så kanske du vill vänta några minuter innan du begär en ny kod.',
'confirmemail_send' => 'Skicka bekräftelsekod',
'confirmemail_sent' => 'E-post med bekräftelse skickat.',
+'confirmemail_oncreate' => 'En bekräftelsekod skickades till din epostadress. Koden behövs inte för att logga in, men om du behöver koden om du vill få tillgång de epostbaserade funktionerna på wikin.',
'confirmemail_sendfailed'=> 'E-post med bekräftelse kunde inte skickas. Kontrollera om adressen innehåller ogiltiga tecken.',
'confirmemail_invalid' => 'Ogiltig bekräftelsekod. Dess giltighetstid kan ha löpt ut.',
'confirmemail_needlogin'=> 'Du behöver $1 för att bekräfta din e-postadress',
@@ -1497,6 +1615,7 @@ Om det \'\'\'inte\'\'\' är du som registrerat kontot, följ inte länken. Efter
'tryexact' => 'Försök hitta exakt matchning',
'searchfulltext' => 'Fulltextsökning',
'createarticle' => 'Skapa artikel',
+'scarytranscludedisabled' => '[Interwiki-inklusion är inte aktiverad]',
'scarytranscludefailed' => '[Beklagar, hämtning av mall för $1 misslyckades]',
'scarytranscludetoolong'=> '[Beklagar, URL:en är för lång]',
'trackbackbox' => '<div id="mw_trackbacks"> Till denna artikel finns följande trackback:<br /> $1 </div>',
@@ -1520,5 +1639,30 @@ $1',
'hideresults' => 'Göm resultat',
'displaytitle' => '(Länka till denna sida som [[:$1|$1]])',
'loginlanguagelabel' => 'Språk: $1',
+
+# Multipage image navigation
+'imgmultipageprev' => '&larr; föregående sida',
+'imgmultipagenext' => 'nästa sida &rarr;',
+'imgmultigo' => 'GÃ¥',
+'imgmultigotopre' => 'GÃ¥ till sida',
+
+# Table pager
+'ascending_abbrev' => 'stigande',
+'descending_abbrev' => 'fallande',
+'table_pager_next' => 'Nästa sida',
+'table_pager_prev' => 'Föregående sida',
+'table_pager_first' => 'Första sidan',
+'table_pager_last' => 'Sista sidan',
+'table_pager_limit' => 'Visa $1 poster per sida',
+'table_pager_limit_submit' => 'Utför',
+'table_pager_empty' => 'Inga resultat',
+
+# Auto-summaries
+'autosumm-blank' => 'Tar bort sidans innehåll',
+'autosumm-replace' => 'Ersätter sidans innehåll med \'$1\'',
+'autoredircomment' => 'Omdirigerar till [[$1]]',
+'autosumm-new' => 'Ny sida: $1',
+
);
+
?>
diff --git a/languages/messages/MessagesTa.php b/languages/messages/MessagesTa.php
index 1bcf5a9d..f663229a 100644
--- a/languages/messages/MessagesTa.php
+++ b/languages/messages/MessagesTa.php
@@ -109,6 +109,7 @@ $messages = array(
# Bits of text used by many pages:
#
"categories" => "பகà¯à®• வகைகளà¯",
+"pagecategories" => "பகà¯à®• வகைகளà¯",
"category_header" => "பகà¯à®ªà¯à®ªà¯à®•à®³à®¿à®²à¯à®³à¯à®³ கடà¯à®Ÿà¯à®°à¯ˆà®•à®³à¯ \"$1\"",
"subcategories" => "தà¯à®£à¯ˆ வகைகளà¯",
@@ -177,7 +178,7 @@ $messages = array(
# Main script and global functions
#
"nosuchaction" => "அவà¯à®µà®¿à®¤ செயறà¯à®ªà®¾à®Ÿà¯à®•à®³à¯ எதà¯à®µà¯à®®à®¿à®²à¯à®²à¯ˆ",
-"nosuchactiontext" => "யூஆரà¯à®Žà®²à¯(URL) இனால௠கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿ செயறà¯à®ªà®¾à®Ÿà¯ விகà¯à®•à®¿à®ªà¯€à®Ÿà®¿à®¯à®¾ மெனà¯à®ªà¯Šà®°à¯à®³à®¿à®©à®¾à®²à¯ அடையாளம௠காணபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ ",
+"nosuchactiontext" => "யூஆரà¯à®Žà®²à¯(URL) இனால௠கà¯à®±à®¿à®ªà¯à®ªà®¿à®Ÿà®ªà¯à®ªà®Ÿà¯à®Ÿ செயறà¯à®ªà®¾à®Ÿà¯ விகà¯à®•à®¿à®ªà¯€à®Ÿà®¿à®¯à®¾ மெனà¯à®ªà¯Šà®°à¯à®³à®¿à®©à®¾à®²à¯ அடையாளம௠காணபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ",
"nosuchspecialpage" => "அவà¯à®µà®¾à®±à®¾à®© சிறபà¯à®ªà¯à®ªà¯ பகà¯à®•à®™à¯à®•à®³à¯ எதà¯à®µà¯à®®à®¿à®²à¯à®²à¯ˆ",
"nospecialpagetext" => "நீஙà¯à®•à®³à¯ கோரிய விசேட பகà¯à®•à®®à¯ விகà¯à®•à®¿à®ªà¯€à®Ÿà®¿à®¯à®¾ மெனà¯à®ªà¯Šà®°à¯à®³à®¿à®©à®¾à®²à¯ அடையாளம௠காணபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ",
# General errors
@@ -193,7 +194,7 @@ MySQL returned error \"<tt>$3: $4</tt>\".",
கடைசியாக à®®à¯à®¯à®±à¯à®šà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ தரவà¯à®¤à¯à®¤à®³ வினவலà¯:
\"$1\"
செயலà¯à®•à¯à®•à¯à®³à¯(function) இரà¯à®¨à¯à®¤à¯ \"$2\".
-MySQL returned error \"$3: $4\".\n",
+MySQL returned error \"$3: $4\".",
"noconnect" => "மனà¯à®©à®¿à®•à¯à®•à®µà¯à®®à¯! இநà¯à®¤ விகà¯à®•à®¿ தளதà¯à®¤à®¿à®²à¯ தொழில௠நà¯à®Ÿà¯à®ªà®ªà¯ பிரசà¯à®šà®©à¯ˆ à®à®±à¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯, தரவà¯à®¤à¯à®¤à®³ வழஙà¯à®•à®©à¯à®Ÿà®©à¯ தொடரà¯à®ªà¯ கொளà¯à®³à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ.",
"nodb" => "தரவà¯à®¤à¯à®¤à®³ $1 தெரிவà¯à®šà¯†à®¯à¯à®¯ à®®à¯à®Ÿà®¿à®¯à®µà®¿à®²à¯à®²à¯ˆ",
"cachederror" => "கீழே இரà¯à®ªà¯à®ªà®¤à¯ கோரபà¯à®ªà®Ÿà¯à®Ÿ பகà¯à®•à®¤à¯à®¤à®¿à®©à¯à®Ÿà¯ˆà®¯ ஒர௠இடைமாறà¯à®±à¯ (cached) நகலாகà¯à®®à¯, இத௠நிகழà¯à®¨à®¿à®²à¯ˆà®•à¯à®•à¯à®šà¯ சரியாக (up to date) இலà¯à®²à®¾à®¤à®¿à®°à¯à®•à¯à®•à®•à¯ கூடà¯à®®à¯.",
@@ -232,7 +233,7 @@ MySQL returned error \"$3: $4\".\n",
#
"logouttitle" => "பயனர௠விடà¯à®ªà®¤à®¿à®•à¯ˆ",
"logouttext" => "நீஙà¯à®•à®³à¯ இபà¯à®ªà¯Šà®´à¯à®¤à¯ விடà¯à®ªà®¤à®¿à®•à¯ˆà®¯à®¿à®²à¯ உளà¯à®³à¯€à®°à¯à®•à®³à¯.
-நீஙà¯à®•à®³à¯ தொடரà¯à®¨à¯à®¤à¯à®®à¯ விகà¯à®•à®¿à®ªà¯€à®Ÿà®¿à®¯à®¾à®µà¯ˆ அடையாளமினà¯à®±à®¿ உபயோகிகà¯à®•à®²à®¾à®®à¯, அலà¯à®²à®¤à¯ அதே பயனராகவோ வேற௠பயனராகவோ மீணà¯à®Ÿà¯à®®à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯à®²à®¾à®®à¯. உஙà¯à®•à®³à¯ உலவியின௠இடைமாறà¯à®±à¯ (browser cache) அழிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯à®µà®°à¯ˆ சில பகà¯à®•à®™à¯à®•à®³à¯ தொடரà¯à®¨à¯à®¤à¯à®®à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆà®¯à®¿à®²à¯ உளà¯à®³à®¤à¯ போனà¯à®±à¯‡ காடà¯à®šà®¿ தரà¯à®®à¯ எனà¯à®ªà®¤à¯ˆà®•à¯ கவனிகà¯à®•à®µà¯à®®à¯\n",
+நீஙà¯à®•à®³à¯ தொடரà¯à®¨à¯à®¤à¯à®®à¯ விகà¯à®•à®¿à®ªà¯€à®Ÿà®¿à®¯à®¾à®µà¯ˆ அடையாளமினà¯à®±à®¿ உபயோகிகà¯à®•à®²à®¾à®®à¯, அலà¯à®²à®¤à¯ அதே பயனராகவோ வேற௠பயனராகவோ மீணà¯à®Ÿà¯à®®à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¯à®²à®¾à®®à¯. உஙà¯à®•à®³à¯ உலவியின௠இடைமாறà¯à®±à¯ (browser cache) அழிகà¯à®•à®ªà¯à®ªà®Ÿà¯à®®à¯à®µà®°à¯ˆ சில பகà¯à®•à®™à¯à®•à®³à¯ தொடரà¯à®¨à¯à®¤à¯à®®à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆà®¯à®¿à®²à¯ உளà¯à®³à®¤à¯ போனà¯à®±à¯‡ காடà¯à®šà®¿ தரà¯à®®à¯ எனà¯à®ªà®¤à¯ˆà®•à¯ கவனிகà¯à®•à®µà¯à®®à¯",
"welcomecreation" => "<h2>வரà¯à®•, $1!</h2><p>உஙà¯à®•à®³à¯ கணகà¯à®•à¯ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.
உஙà¯à®•à®³à¯ விகà¯à®•à®¿à®ªà¯€à®Ÿà®¿à®¯à®¾ விரà¯à®ªà¯à®ªà¯à®•à®³à¯ˆ சொநà¯à®¤à®®à®¯à®ªà¯ (personalize) படà¯à®¤à¯à®¤ மறவாதீரà¯à®•à®³à¯.",
@@ -243,8 +244,7 @@ MySQL returned error \"$3: $4\".\n",
"remembermypassword" => "எனத௠கடவà¯à®šà¯à®šà¯Šà®²à¯à®²à¯ˆ அமரà¯à®µà¯à®•à®³à®¿à®Ÿà¯ˆà®¯à¯‡ (across sessions) ஞாபகதà¯à®¤à®¿à®²à¯ வைதà¯à®¤à®¿à®°à¯à®•à¯à®•à®µà¯à®®à¯.",
"loginproblem" => "உஙà¯à®•à®³à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ தொடரà¯à®ªà®¿à®²à¯ பிரசà¯à®šà®¿à®©à¯ˆ உணà¯à®Ÿà¯.
திரà¯à®®à¯à®ª à®®à¯à®¯à®²à®µà¯à®®à¯!",
-"alreadyloggedin" => "பயனர௠$1, நீஙà¯à®•à®³à¯ à®à®±à¯à®•à¯†à®©à®µà¯‡ பà¯à®•à¯ பதிகையில௠உளà¯à®³à¯€à®°à¯à®•à®³à¯!
-\n",
+"alreadyloggedin" => "பயனர௠$1, நீஙà¯à®•à®³à¯ à®à®±à¯à®•à¯†à®©à®µà¯‡ பà¯à®•à¯ பதிகையில௠உளà¯à®³à¯€à®°à¯à®•à®³à¯!",
"login" => "பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ",
"userlogin" => "பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ",
"logout" => "விடà¯à®ªà®¤à®¿à®•à¯ˆ",
@@ -292,10 +292,11 @@ Note to AOL users
"accmailtext" => "'$1' உடைய கடவà¯à®šà¯à®šà¯Šà®²à¯ $2 கà¯à®•à¯ அனà¯à®ªà¯à®ªà®ªà¯à®ªà®Ÿà¯à®Ÿà¯à®³à¯à®³à®¤à¯.",
"newarticle" => "(பà¯à®¤à®¿à®¤à¯)",
"newarticletext" => "ஒர௠இணைபà¯à®ªà®¿à®©à¯‚டாக நீஙà¯à®•à®³à¯ வநà¯à®¤à¯à®³à¯à®³ இப௠பகà¯à®•à®®à¯ இனà¯à®©à¯à®®à¯ உரà¯à®µà®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ. பகà¯à®•à®¤à¯à®¤à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯à®µà®¤à®±à¯à®•à¯à®•à¯ கீழேயà¯à®³à¯à®³ கடà¯à®Ÿà®¤à¯à®¤à¯à®³à¯ தடà¯à®Ÿà®šà¯à®šà®¿à®Ÿà®¤à¯ தொடஙà¯à®•à¯à®™à¯à®•à®³à¯. (மேலதிக விபரஙà¯à®•à®³à¯à®•à¯à®•à¯ உதவிப௠பகà¯à®•à®™à¯à®•à®³à¯ˆà®ªà¯ பாரà¯à®•à¯à®•à®µà¯à®®à¯). நீஙà¯à®•à®³à¯ தவறà¯à®¤à®²à®¾à®• இஙà¯à®•à¯‡ வநà¯à®¤à®¿à®°à¯à®¨à¯à®¤à®¾à®²à¯, உஙà¯à®•à®³à¯ உலாவி (browser) யின௠பினà¯à®©à¯‡ (back) பொதà¯à®¤à®¾à®©à¯ˆà®šà¯ சொடà¯à®•à¯à®•à®µà¯à®®à¯.",
-"anontalkpagetext" => "---- இத௠இனà¯à®©à¯à®®à¯ கணகà¯à®•à¯Šà®©à¯à®±à¯ à®à®±à¯à®ªà®Ÿà¯à®¤à¯à®¤à®¾à®¤ அலà¯à®²à®¤à¯ இதனை வழமையாகப௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¾à®¤ பயனரà¯à®•à®³à¯à®•à¯à®•à¯à®°à®¿à®¯ கலநà¯à®¤à¯à®°à¯ˆà®¯à®¾à®Ÿà®²à¯ பகà¯à®•à®®à®¾à®•à¯à®®à¯. அதனால௠நாஙà¯à®•à®³à¯ இவரை அடையாளம௠காணà¯à®ªà®¤à®±à¯à®•à¯ எணà¯à®šà®¾à®°à¯à®¨à¯à®¤ à®à®ªà®¿ (IP) à®®à¯à®•à®µà®°à®¿ XXXயை உபயோகிகà¯à®•à®¿à®±à¯‹à®®à¯. இவà¯à®µà®¾à®±à®¾à®© à®à®ªà®¿ (IP) à®®à¯à®•à®µà®°à®¿à®•à®³à¯ பல பயனரà¯(user) களினால௠பகிரà¯à®¨à¯à®¤à¯à®•à¯Šà®³à¯à®³à®ªà¯à®ªà®Ÿà®²à®¾à®®à¯. நீஙà¯à®•à®³à¯ ஒர௠மà¯à®•à®µà®°à®¿à®¯à®±à¯à®± பயனராயிரà¯à®¨à¯à®¤à¯, தொடரà¯à®ªà®±à¯à®± கரà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯ உஙà¯à®•à®³à¯ˆà®•à¯ கà¯à®±à®¿à®¤à¯à®¤à¯à®šà¯ சொலà¯à®²à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®ªà¯à®ªà®¤à®¾à®• நீஙà¯à®•à®³à¯ உணரà¯à®¨à¯à®¤à®¾à®²à¯, à®®à¯à®•à®µà®°à®¿à®¯à®±à¯à®± à®à®©à¯ˆà®¯ பயனரà¯à®•à®³à¯à®Ÿà®©à®¾à®© கà¯à®´à®ªà¯à®ªà®™à¯à®•à®³à¯ˆ எதிரà¯à®•à®¾à®²à®¤à¯à®¤à®¿à®²à¯ தவிரà¯à®ªà¯à®ªà®¤à®±à¯à®•à¯, தயவà¯à®šà¯†à®¯à¯à®¤à¯ கணகà¯à®•à¯Šà®©à¯à®±à¯ˆ à®à®±à¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®™à¯à®•à®³à¯ அலà¯à®²à®¤à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ (login) செயà¯à®¯à¯à®™à¯à®•à®³à¯ </wiki/Special:Userlogin>. ",
+"anontalkpagetext" => "---- இத௠இனà¯à®©à¯à®®à¯ கணகà¯à®•à¯Šà®©à¯à®±à¯ à®à®±à¯à®ªà®Ÿà¯à®¤à¯à®¤à®¾à®¤ அலà¯à®²à®¤à¯ இதனை வழமையாகப௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¾à®¤ பயனரà¯à®•à®³à¯à®•à¯à®•à¯à®°à®¿à®¯ கலநà¯à®¤à¯à®°à¯ˆà®¯à®¾à®Ÿà®²à¯ பகà¯à®•à®®à®¾à®•à¯à®®à¯. அதனால௠நாஙà¯à®•à®³à¯ இவரை அடையாளம௠காணà¯à®ªà®¤à®±à¯à®•à¯ எணà¯à®šà®¾à®°à¯à®¨à¯à®¤ à®à®ªà®¿ (IP) à®®à¯à®•à®µà®°à®¿ XXXயை உபயோகிகà¯à®•à®¿à®±à¯‹à®®à¯. இவà¯à®µà®¾à®±à®¾à®© à®à®ªà®¿ (IP) à®®à¯à®•à®µà®°à®¿à®•à®³à¯ பல பயனரà¯(user) களினால௠பகிரà¯à®¨à¯à®¤à¯à®•à¯Šà®³à¯à®³à®ªà¯à®ªà®Ÿà®²à®¾à®®à¯. நீஙà¯à®•à®³à¯ ஒர௠மà¯à®•à®µà®°à®¿à®¯à®±à¯à®± பயனராயிரà¯à®¨à¯à®¤à¯, தொடரà¯à®ªà®±à¯à®± கரà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯ உஙà¯à®•à®³à¯ˆà®•à¯ கà¯à®±à®¿à®¤à¯à®¤à¯à®šà¯ சொலà¯à®²à®ªà¯à®ªà®Ÿà¯à®Ÿà®¿à®°à¯à®ªà¯à®ªà®¤à®¾à®• நீஙà¯à®•à®³à¯ உணரà¯à®¨à¯à®¤à®¾à®²à¯, à®®à¯à®•à®µà®°à®¿à®¯à®±à¯à®± à®à®©à¯ˆà®¯ பயனரà¯à®•à®³à¯à®Ÿà®©à®¾à®© கà¯à®´à®ªà¯à®ªà®™à¯à®•à®³à¯ˆ எதிரà¯à®•à®¾à®²à®¤à¯à®¤à®¿à®²à¯ தவிரà¯à®ªà¯à®ªà®¤à®±à¯à®•à¯, தயவà¯à®šà¯†à®¯à¯à®¤à¯ கணகà¯à®•à¯Šà®©à¯à®±à¯ˆ à®à®±à¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®™à¯à®•à®³à¯ அலà¯à®²à®¤à¯ பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ (login) செயà¯à®¯à¯à®™à¯à®•à®³à¯ </wiki/Special:Userlogin>.",
"noarticletext" => "(இப௠பகà¯à®•à®¤à¯à®¤à®¿à®²à¯ தறà¯à®ªà¯Šà®´à¯à®¤à¯ எழà¯à®¤à¯à®¤à¯à®•à¯à®•à®³à¯ எதà¯à®µà¯à®®à®¿à®²à¯à®²à¯ˆ)",
"updated" => "(இறà¯à®±à¯ˆà®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯ Updated)",
-"note" => "Note: ", "previewnote" => "இத௠ஒர௠மà¯à®©à¯à®¤à¯‹à®±à¯à®±à®®à¯ (preview) மடà¯à®Ÿà¯à®®à¯‡ எனà¯à®ªà®¤à¯ˆà®¯à¯à®®à¯, இனà¯à®©à¯à®®à¯ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ எனà¯à®ªà®¤à¯ˆà®¯à¯à®®à¯ ஞாபகதà¯à®¤à®¿à®²à¯ வைதà¯à®¤à®¿à®°à¯à®•à¯à®•à®µà¯à®®à¯!",
+"note" => "Note:",
+"previewnote" => "இத௠ஒர௠மà¯à®©à¯à®¤à¯‹à®±à¯à®±à®®à¯ (preview) மடà¯à®Ÿà¯à®®à¯‡ எனà¯à®ªà®¤à¯ˆà®¯à¯à®®à¯, இனà¯à®©à¯à®®à¯ சேமிகà¯à®•à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ எனà¯à®ªà®¤à¯ˆà®¯à¯à®®à¯ ஞாபகதà¯à®¤à®¿à®²à¯ வைதà¯à®¤à®¿à®°à¯à®•à¯à®•à®µà¯à®®à¯!",
"previewconflict" => "இநà¯à®¤ à®®à¯à®©à¯à®¤à¯‹à®±à¯à®±à®®à¯ உரை தொகà¯à®ªà¯à®ªà¯à®ªà¯ பகà¯à®¤à®¿à®¯à®¿à®©à¯ மேறà¯à®ªà®•à¯à®¤à®¿à®¯à®¿à®²à¯à®³à¯à®³ உரையைப௠பிரதிபலிகà¯à®•à®¿à®©à¯à®±à®¤à¯. நீஙà¯à®•à®³à¯ இபà¯à®ªà¯Šà®´à¯à®¤à¯ சேமிதà¯à®¤à®¾à®²à¯ மேறà¯à®ªà®Ÿà®¿ தோறà¯à®±à®®à¯‡ கிடைகà¯à®•à¯à®®à¯.",
"editing" => "தொகà¯à®¤à¯à®¤à®²à¯ (Editting) $1",
'editinguser' => "தொகà¯à®¤à¯à®¤à®²à¯ (Editting) $1",
@@ -326,10 +327,10 @@ Note to AOL users
"nohistory" => "இப௠பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯à®¤à¯ தொகà¯à®ªà¯à®ªà¯ வரலாற௠இலà¯à®²à¯ˆ.",
"revnotfound" => "திரà¯à®¤à¯à®¤à®®à¯(revision) காணபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ",
"revnotfoundtext" => "இப௠பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯à®°à®¿à®¯, நீஙà¯à®•à®³à¯ கோரிய பழைய திரà¯à®¤à¯à®¤à®®à¯ (revision) காணபà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ.
-இநà¯à®¤à®ªà¯ பகà¯à®•à®¤à¯à®¤à¯ˆ அணà¯à®•à¯à®µà®¤à®±à¯à®•à¯ நீஙà¯à®•à®³à¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®¯ URL à®à®¤à¯ தயவà¯à®šà¯†à®¯à¯à®¤à¯ சரி பாரà¯à®•à¯à®•à®µà¯à®®à¯.\n",
+இநà¯à®¤à®ªà¯ பகà¯à®•à®¤à¯à®¤à¯ˆ அணà¯à®•à¯à®µà®¤à®±à¯à®•à¯ நீஙà¯à®•à®³à¯ பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®¯ URL à®à®¤à¯ தயவà¯à®šà¯†à®¯à¯à®¤à¯ சரி பாரà¯à®•à¯à®•à®µà¯à®®à¯.",
"loadhist" => "பகà¯à®• வரலாற௠à®à®±à¯à®±à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯",
"currentrev" => "நடைமà¯à®±à¯ˆà®¯à®¿à®²à¯à®³à¯à®³ திரà¯à®¤à¯à®¤à®®à¯",
-"revisionasof" => "$1 இல௠நிலவà¯à®®à¯ திரà¯à®¤à¯à®¤à®®à¯ (Revision) ",
+"revisionasof" => "$1 இல௠நிலவà¯à®®à¯ திரà¯à®¤à¯à®¤à®®à¯ (Revision)",
"cur" => "நடபà¯à®ªà¯",
"next" => "அடà¯à®¤à¯à®¤",
"last" => "கடைசி",
@@ -433,7 +434,7 @@ $2 படà¯à®Ÿà®¿à®¯à®²à¯ &nbsp; $3 $9 கà¯à®•à®¾à®© தேடலை மீà
"uploadbtn" => "கோபà¯à®ªà¯ˆà®ªà¯ பதிவேறà¯à®±à¯ (Upload file)",
"reupload" => "மீளப௠பதிவேறà¯à®±à¯ (Re-upload)",
"reuploaddesc" => "பதிவேறà¯à®±à¯à®®à¯ படிவதà¯à®¤à¯à®•à¯à®•à¯ மீளச௠செலà¯.",
-"uploadnologin" => "பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ (login) செயà¯à®¯à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ ",
+"uploadnologin" => "பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ (login) செயà¯à®¯à®ªà¯à®ªà®Ÿà®µà®¿à®²à¯à®²à¯ˆ",
"uploadnologintext" => "கோபà¯à®ªà¯à®•à®³à¯ˆà®ªà¯ பதிவேறà¯à®±à®®à¯ செயà¯à®µà®¤à®±à¯à®•à¯ நீஙà¯à®•à®³à¯[[Special:Userlogin|பà¯à®•à¯à®ªà®¤à®¿à®•à¯ˆ செயà¯à®¤à®¿à®°à¯à®•à¯à®• வேணà¯à®Ÿà¯à®®à¯]].",
"uploaderror" => "à®à®±à¯à®±à¯à®¤à¯ தவறà¯",
"uploadtext" => "நிறà¯à®¤à¯à®¤à®µà¯à®®à¯! இஙà¯à®•à¯‡ பதிவேறà¯à®±à®®à¯ செயà¯à®¯à¯à®®à¯à®©à¯, விகà¯à®•à®¿à®ªà¯€à®Ÿà®¿à®¯à®¾à®µà®¿à®©à¯ [[Project:Image_use_policy|படிமம௠பயனà¯à®ªà®Ÿà¯à®¤à¯à®¤à®±à¯ கொளà¯à®•à¯ˆ]] யை வாசிதà¯à®¤à¯à®ªà¯ பினà¯à®ªà®±à¯à®±à¯à®µà®¤à¯ˆ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à®¿à®•à¯ கொளà¯à®³à®µà¯à®®à¯.
@@ -600,7 +601,7 @@ $2 படà¯à®Ÿà®¿à®¯à®²à¯ &nbsp; $3 $9 கà¯à®•à®¾à®© தேடலை மீà
"exblank" => "பகà¯à®•à®®à¯ வெறà¯à®®à¯ˆà®¯à®¾à®¯à¯ இரà¯à®¨à¯à®¤à®¤à¯",
"confirmdelete" => "நீகà¯à®•à¯à®¤à®²à¯ˆ உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯",
"deletesub" => "(\"$1\" நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®•à®¿à®±à®¤à¯)",
-"historywarning" => "எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ: நீஙà¯à®•à®³à¯ நீகà¯à®•à®µà¯à®³à¯à®³ பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯ ஒர௠வரலாற௠உணà¯à®Ÿà¯: ",
+"historywarning" => "எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ: நீஙà¯à®•à®³à¯ நீகà¯à®•à®µà¯à®³à¯à®³ பகà¯à®•à®¤à¯à®¤à¯à®•à¯à®•à¯ ஒர௠வரலாற௠உணà¯à®Ÿà¯:",
"actioncomplete" => "செயறà¯à®ªà®¾à®Ÿà¯ நிறைவà¯à®±à¯à®±à®¤à¯",
"deletedtext" => "\"$1\" நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ விடà¯à®Ÿà®¤à¯. அணà¯à®®à¯ˆà®¯ நீகà¯à®•à¯à®¤à®²à¯à®•à®³à®¿à®©à¯ பதிவà¯à®•à¯à®•à¯ $2 à®à®ªà¯ பாரà¯à®•à¯à®•.",
"deletedarticle" => "\"$1\" நீகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯",
@@ -614,8 +615,8 @@ $2 படà¯à®Ÿà®¿à®¯à®²à¯ &nbsp; $3 $9 கà¯à®•à®¾à®© தேடலை மீà
"rollbacklink" => "à®®à¯à®©à¯à®¨à®¿à®²à¯ˆà®¯à®¾à®•à¯à®•à¯",
"rollbackfailed" => "à®®à¯à®©à¯à®¨à®¿à®²à¯ˆà®¯à®¾à®•à¯à®•à®®à¯ (Rollback) தோலà¯à®µà®¿",
"cantrollback" => "தொகà¯à®ªà¯à®ªà¯ˆ மீழà¯à®µà®¿à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯; கடைசிப௠பஙà¯à®•à®³à®¿à®ªà¯à®ªà®¾à®³à®°à¯‡ (contributor) இக௠கடà¯à®Ÿà¯à®°à¯ˆà®¯à®¿à®©à¯ ஆசிரியராகà¯à®®à¯.",
-"alreadyrolled" => " ( [[User:$3|$3]] ([[User talk:$3|Talk]]) ஆல௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ [[$1]] திகதிய கடைசித௠தொகà¯à®ªà¯à®ªà¯ˆ à®®à¯à®©à¯à®¨à®¿à®²à¯ˆà®¯à®¾à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯; வேற௠யாரோ இக௠கடà¯à®Ÿà¯à®°à¯ˆà®¯à¯ˆ à®à®±à¯à®•à¯†à®©à®µà¯‡ தொகà¯à®¤à¯à®¤à¯‹ அலà¯à®²à®¤à¯ à®®à¯à®©à¯à®¨à®¿à®²à¯ˆà®¯à®¾à®•à¯à®•à®¿à®¯à¯‹ உளà¯à®³à®¾à®°à¯.
-கடைசியாகத௠தொகà¯à®¤à¯à®¤à®µà®°à¯[[User:$3|$3]] ([[User talk:$3|Talk]]). ",
+"alreadyrolled" => " ( [[User:$3|$3]] ([[User talk:$3|Talk]]) ஆல௠செயà¯à®¯à®ªà¯à®ªà®Ÿà¯à®Ÿ [[:$1]] திகதிய கடைசித௠தொகà¯à®ªà¯à®ªà¯ˆ à®®à¯à®©à¯à®¨à®¿à®²à¯ˆà®¯à®¾à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯; வேற௠யாரோ இக௠கடà¯à®Ÿà¯à®°à¯ˆà®¯à¯ˆ à®à®±à¯à®•à¯†à®©à®µà¯‡ தொகà¯à®¤à¯à®¤à¯‹ அலà¯à®²à®¤à¯ à®®à¯à®©à¯à®¨à®¿à®²à¯ˆà®¯à®¾à®•à¯à®•à®¿à®¯à¯‹ உளà¯à®³à®¾à®°à¯.
+கடைசியாகத௠தொகà¯à®¤à¯à®¤à®µà®°à¯[[User:$3|$3]] ([[User talk:$3|Talk]]).",
# only shown if there is an edit comment
"editcomment" => "தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à¯à®°à®¿à®¯ கரà¯à®¤à¯à®¤à¯à®°à¯ˆ (comment): \"$1\".",
"revertpage" => "$1 ஆல௠கடைசித௠தொகà¯à®ªà¯à®ªà¯à®•à¯à®•à¯ à®®à¯à®©à¯à®¨à®¿à®²à¯ˆà®¯à®¾à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯",
diff --git a/languages/messages/MessagesTe.php b/languages/messages/MessagesTe.php
index a73c9d37..41fb86f8 100644
--- a/languages/messages/MessagesTe.php
+++ b/languages/messages/MessagesTe.php
@@ -13,7 +13,7 @@ $namespaceNames = array(
NS_MAIN => '',
NS_TALK => 'à°šà°°à±à°š',
NS_USER => 'సభà±à°¯à±à°¡à±',
- NS_USER_TALK => 'సభà±à°¯à±à°¨à°¿à°ªà±ˆ_à°šà°°à±à°š',
+ NS_USER_TALK => 'సభà±à°¯à±à°²à°ªà±ˆ_à°šà°°à±à°š',
# NS_PROJECT set by $wgMetaNamespace
NS_PROJECT_TALK => '$1_à°šà°°à±à°š',
NS_IMAGE => 'బొమà±à°®',
@@ -27,6 +27,13 @@ $namespaceNames = array(
NS_CATEGORY => 'వరà±à°—à°‚',
NS_CATEGORY_TALK => 'వరà±à°—à°‚_à°šà°°à±à°š'
);
+
+$namespaceAliases = array(
+ 'సభà±à°¯à±à°¨à°¿à°ªà±ˆ_à°šà°°à±à°š' => NS_USER_TALK,
+ 'బొమà±à°®à°ªà±ˆ_à°šà°°à±à°š' => NS_IMAGE_TALK
+);
+
+
$linkTrail = "/^([\xE0\xB0\x81-\xE0\xB1\xAF]+)(.*)$/sDu";
// nobody seems to use these anymore
@@ -102,7 +109,8 @@ $messages = array(
'oct' => 'à°…à°•à±à°Ÿà±‹à°¬à°°à±',
'nov' => 'నవంబరà±',
'dec' => 'డిసెంబరà±â€Œ',
-'categories' => '{{PLURAL:$1|వరà±à°—à°‚|వరà±à°—ాలà±}}',
+'categories' => 'వరà±à°—ాలà±',
+'pagecategories' => '{{PLURAL:$1|వరà±à°—à°‚|వరà±à°—ాలà±}}',
'category_header' => '"$1" వరà±à°—ంలో à°µà±à°¯à°¾à°¸à°¾à°²à±',
'subcategories' => 'ఉపవరà±à°—à°®à±à°²à±',
'mainpage' => 'మొదటి పేజీ',
@@ -632,7 +640,7 @@ $1',
'deletecomment' => 'à°¤à±à°¡à°¿à°šà°¿à°µà±‡à°¤à°•à± కారణమà±',
'imagereverted' => 'విజయవంతంగా పాత సంచికకౠవెళà±à°³à°¿à°‚ది.',
'cantrollback' => 'రచననౠవెనకà±à°•à°¿ తీసà±à°•à±à°µà±†à°³à±à°³à°²à±‡à°®à±; à°ˆ పేజీకి ఇదొకà±à°•à°Ÿà±‡ à°°à°šà°¨.',
-'alreadyrolled' => '[[$1]]లో [[User:$2|$2]] ([[User talk:$2|à°šà°°à±à°š]]) చేసిన చివరి మారà±à°ªà±à°¨à± రోలà±â€Œà°¬à°¾à°•à± చెయà±à°¯à°²à±‡à°®à±; మరెవరో à°† పేజీని రోలà±â€Œà°¬à°¾à°•à± చేసారà±, లేదా మారà±à°šà°¾à°°à±.
+'alreadyrolled' => '[[:$1]]లో [[User:$2|$2]] ([[User talk:$2|à°šà°°à±à°š]]) చేసిన చివరి మారà±à°ªà±à°¨à± రోలà±â€Œà°¬à°¾à°•à± చెయà±à°¯à°²à±‡à°®à±; మరెవరో à°† పేజీని రోలà±â€Œà°¬à°¾à°•à± చేసారà±, లేదా మారà±à°šà°¾à°°à±.
చివరి మారà±à°ªà±à°²à± చేసినవారà±: [[User:$3|$3]] ([[User talk:$3|à°šà°°à±à°š]]).',
'revertpage' => '[[Special:Contributions/$2|$2]] ([[User_talk:$2|à°šà°°à±à°š]]) చేసిన మారà±à°ªà±à°²à°¨à± [[User:$1|$1]] వైనకà±à°•à± తేసà±à°•à±à°µà±†à°³à±à°³à°¾à°°à±',
diff --git a/languages/messages/MessagesTh.php b/languages/messages/MessagesTh.php
index eea06648..14dbaeec 100644
--- a/languages/messages/MessagesTh.php
+++ b/languages/messages/MessagesTh.php
@@ -100,6 +100,7 @@ $messages = array(
# Bits of text used by many pages:
#
"categories" => "ประเภทของหน้า",
+"pagecategories" => "ประเภทของหน้า",
"category_header" => "บทความในประเภท \"$1\"",
"subcategories" => "ประเภทย่อย",
diff --git a/languages/messages/MessagesTr.php b/languages/messages/MessagesTr.php
index 322de078..d83b2a3c 100644
--- a/languages/messages/MessagesTr.php
+++ b/languages/messages/MessagesTr.php
@@ -99,7 +99,8 @@ $messages = array(
'oct' => 'Ekim',
'nov' => 'Kasım',
'dec' => 'Aralık',
-'categories' => 'Sayfa {{PLURAL:$1|kategorisi|kategorileri}}',
+'categories' => 'Sayfa kategorileri',
+'pagecategories' => 'Sayfa {{PLURAL:$1|kategorisi|kategorileri}}',
'category_header' => '"$1" kategorisindeki sayfalar',
'subcategories' => 'Alt Kategoriler',
'mainpage' => 'Ana Sayfa',
@@ -558,11 +559,7 @@ Eğer bu bir resim ise <tt><nowiki>[[{{ns:Image}}:$1|thumb|açıklama]]</nowiki>
'uploadwarning' => 'Yükleme uyarısı',
'savefile' => 'Dosyayı kaydet',
'uploadedimage' => 'Yüklenen: "[[$1]]"',
-'uploaddisabled' => '{|
-|-
-| valign="top" | [[Image:Padlock.svg|45px|Şu anda dosya yüklenmez]]
-|Geçici olarak şu anda herhangi bir dosya yüklenmez. Biraz sonra bir daha deneyiniz.
-|}',
+'uploaddisabled' => 'Geçici olarak şu anda herhangi bir dosya yüklenmez. Biraz sonra bir daha deneyiniz.',
'uploaddisabledtext' => 'Bu wikide dosya yükleme özelliği iptal edilmiştir.',
'uploadvirus' => 'Bu dosya virüslüdür! Detayları: $1',
'sourcefilename' => 'Yüklemek istediğiniz dosya',
@@ -943,7 +940,7 @@ In the latter case you can also use a link, e.g. [[Special:Export/{{int:Mainpage
'tooltip-diff' => 'Metine yaptığınız değişiklikleri gösterir. [alt-v]',
'tooltip-compareselectedversions'=> 'Seçilmiş iki sürüm arasındaki farkları göster. [alt-v]',
'tooltip-watch' => 'Sayfayı izleme listene ekle [alt-w]',
-'Monobook.css' => '/* monobook temasının ayarlarını değiştirmek için burayı değiştirin. Tüm sitede etkili olur. */',
+'monobook.css' => '/* monobook temasının ayarlarını değiştirmek için burayı değiştirin. Tüm sitede etkili olur. */',
'siteuser' => '{{SITENAME}} kullanıcı $1',
'lastmodifiedatby' => 'Sayfa en son $3 tarafından $2, $1 tarihinde değiştirildi.',
'and' => 've',
@@ -961,7 +958,7 @@ In the latter case you can also use a link, e.g. [[Special:Export/{{int:Mainpage
'mw_math_source' => 'Değiştirmeden TeX olarak bırak (metin tabanlı tarayıcılar için)',
'mw_math_modern' => 'Modern tarayıcılar için tavsiye edilen',
'mw_math_mathml' => 'Mümkünse MathML (daha deneme aşamasında)',
-'Monobook.js' => '/* Kısa yol tuşları ve yardım balonları */
+'monobook.js' => '/* Kısa yol tuşları ve yardım balonları */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'KiÅŸisel sayfam\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'The user page for the ip you\'re editing as\');
@@ -972,7 +969,7 @@ In the latter case you can also use a link, e.g. [[Special:Export/{{int:Mainpage
ta[\'pt-mycontris\'] = new Array(\'y\',\'Yaptığım katkıların listesi\');
ta[\'pt-login\'] = new Array(\'o\',\'Oturum açmanız tavsiye olunur ama mecbur değilsiniz.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Oturum açmanız tavsiye olunur ama mecbur değilsiniz.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Sistemden çık\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Sistemden çık\');
ta[\'ca-talk\'] = new Array(\'t\',\'İçerik ile ilgili görüş belirt\');
ta[\'ca-edit\'] = new Array(\'e\',\'Bu sayfayı değiştirebilirsiniz. Kaydetmeden önce önizleme yapmayı unutmayın.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Bu tartışmaya yorum ekleyin.\');
diff --git a/languages/messages/MessagesTt.php b/languages/messages/MessagesTt.php
index 498a4b5c..31428403 100644
--- a/languages/messages/MessagesTt.php
+++ b/languages/messages/MessagesTt.php
@@ -1,119 +1,793 @@
<?php
/**
+ * Tatarish (Tatarça)
* @package MediaWiki
* @subpackage Language
*/
-#
-# Tatarish localisation for MediaWiki
-#
+
$namespaceNames = array(
- NS_MEDIA => 'Media',
- NS_SPECIAL => 'Maxsus',
- NS_MAIN => '',
- NS_TALK => 'Bäxäs',
- NS_USER => 'Äğzä',
- NS_USER_TALK => "Äğzä_bäxäse",
- # NS_PROJECT set by $wgMetaNamespace
- NS_PROJECT_TALK => '$1_bäxäse',
- NS_IMAGE => "Räsem",
- NS_IMAGE_TALK => "Räsem_bäxäse",
- NS_MEDIAWIKI => "MediaWiki",
- NS_MEDIAWIKI_TALK => "MediaWiki_bäxäse",
- NS_TEMPLATE => "Ürnäk",
- NS_TEMPLATE_TALK => "Ürnäk_bäxäse",
- NS_HELP => "Yärdäm",
- NS_HELP_TALK => "Yärdäm_bäxäse",
- NS_CATEGORY => "Törkem",
- NS_CATEGORY_TALK => "Törkem_bäxäse"
+ NS_MEDIA => 'Media',
+ NS_SPECIAL => 'Maxsus',
+ NS_MAIN => '',
+ NS_TALK => 'Bäxäs',
+ NS_USER => 'Äğzä',
+ NS_USER_TALK => "Äğzä_bäxäse",
+ # NS_PROJECT set by $wgMetaNamespace
+ NS_PROJECT_TALK => '$1_bäxäse',
+ NS_IMAGE => "Räsem",
+ NS_IMAGE_TALK => "Räsem_bäxäse",
+ NS_MEDIAWIKI => "MediaWiki",
+ NS_MEDIAWIKI_TALK => "MediaWiki_bäxäse",
+ NS_TEMPLATE => "Ürnäk",
+ NS_TEMPLATE_TALK => "Ürnäk_bäxäse",
+ NS_HELP => "Yärdäm",
+ NS_HELP_TALK => "Yärdäm_bäxäse",
+ NS_CATEGORY => "Törkem",
+ NS_CATEGORY_TALK => "Törkem_bäxäse"
);
$datePreferences = false;
+
$defaultDateFormat = 'dmy';
+
$dateFormats = array(
- 'dmy time' => 'H:i',
- 'dmy date' => 'j. M Y',
- 'dmy both' => 'j. M Y, H:i',
+ 'mdy time' => 'H:i',
+ 'mdy date' => 'M j, Y',
+ 'mdy both' => 'H:i, M j, Y',
+ 'dmy time' => 'H:i',
+ 'dmy date' => 'j. M Y',
+ 'dmy both' => 'j. M Y, H:i',
+ 'ymd time' => 'H:i',
+ 'ymd date' => 'Y M j',
+ 'ymd both' => 'H:i, Y M j',
+ 'ISO 8601 time' => 'xnH:xni:xns',
+ 'ISO 8601 date' => 'xnY-xnm-xnd',
+ 'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
);
-# Note to translators:
-# Please include the English words as synonyms. This allows people
-# from other wikis to contribute more easily.
-#
$magicWords = array(
# ID CASE SYNONYMS
- 'redirect' => array( 0, '#yünältü', '#REDIRECT'),
- 'notoc' => array( 0, '__ETYUQ__', '__NOTOC__'),
- 'forcetoc' => array( 0, '__ETTIQ__', '__FORCETOC__'),
- 'toc' => array( 0, '__ET__', '__TOC__'),
- 'noeditsection' => array( 0, '__BÜLEMTÖZÄTÜYUQ__', '__NOEDITSECTION__'),
- 'start' => array( 0, '__BAÅžLAW__', '__START__'),
- 'currentmonth' => array( 1, 'AÄžIMDAÄžI_AY', 'CURRENTMONTH'),
- 'currentmonthname' => array( 1, 'AÄžIMDAÄžI_AY_Ä°SEME', 'CURRENTMONTHNAME'),
- 'currentday' => array( 1, 'AĞIMDAĞI_KÖN', 'CURRENTDAY'),
- 'currentdayname' => array( 1, 'AĞIMDAĞI_KÖN_İSEME', 'CURRENTDAYNAME'),
- 'currentyear' => array( 1, 'AÄžIMDAÄžI_YIL', 'CURRENTYEAR'),
- 'currenttime' => array( 1, 'AÄžIMDAÄžI_WAQIT', 'CURRENTTIME'),
- 'numberofarticles' => array( 1, 'MÄQÄLÄ_SANI', 'NUMBEROFARTICLES'),
- 'currentmonthnamegen' => array( 1, 'AÄžIMDAÄžI_AY_Ä°SEME_GEN', 'CURRENTMONTHNAMEGEN'),
- 'pagename' => array( 1, 'BÄ°TÄ°SEME', 'PAGENAME'),
- 'namespace' => array( 1, 'Ä°SEMARA', 'NAMESPACE'),
- 'subst' => array( 0, 'TÖPÇEK:', 'SUBST:'),
- 'msgnw' => array( 0, 'MSGNW:' ),
- 'end' => array( 0, '__AZAQ__', '__END__'),
- 'img_thumbnail' => array( 1, 'thumbnail', 'thumb' ),
- 'img_right' => array( 1, 'uñda', 'right'),
- 'img_left' => array( 1, 'sulda', 'left'),
- 'img_none' => array( 1, 'yuq', 'none'),
- 'img_width' => array( 1, '$1px' ),
- 'img_center' => array( 1, 'center', 'centre' ),
- 'img_framed' => array( 1, 'framed', 'enframed', 'frame' ),
- 'int' => array( 0, 'EÇKE:', 'INT:'),
- 'sitename' => array( 1, 'SÄXİFÄİSEME', 'SITENAME'),
- 'ns' => array( 0, 'Ä°A:', 'NS:'),
- 'localurl' => array( 0, 'URINLIURL:', 'LOCALURL:'),
- 'localurle' => array( 0, 'URINLIURLE:', 'LOCALURLE:'),
- 'server' => array( 0, 'SERVER' )
+ 'redirect' => array( 0, '#yünältü', '#REDIRECT'),
+ 'notoc' => array( 0, '__ETYUQ__', '__NOTOC__'),
+ 'forcetoc' => array( 0, '__ETTIQ__', '__FORCETOC__'),
+ 'toc' => array( 0, '__ET__', '__TOC__'),
+ 'noeditsection' => array( 0, '__BÜLEMTÖZÄTÜYUQ__', '__NOEDITSECTION__'),
+ 'start' => array( 0, '__BAÅžLAW__', '__START__'),
+ 'currentmonth' => array( 1, 'AÄžIMDAÄžI_AY', 'CURRENTMONTH'),
+ 'currentmonthname' => array( 1, 'AÄžIMDAÄžI_AY_Ä°SEME', 'CURRENTMONTHNAME'),
+ 'currentday' => array( 1, 'AĞIMDAĞI_KÖN', 'CURRENTDAY'),
+ 'currentdayname' => array( 1, 'AĞIMDAĞI_KÖN_İSEME', 'CURRENTDAYNAME'),
+ 'currentyear' => array( 1, 'AÄžIMDAÄžI_YIL', 'CURRENTYEAR'),
+ 'currenttime' => array( 1, 'AÄžIMDAÄžI_WAQIT', 'CURRENTTIME'),
+ 'numberofarticles' => array( 1, 'MÄQÄLÄ_SANI', 'NUMBEROFARTICLES'),
+ 'currentmonthnamegen' => array( 1, 'AÄžIMDAÄžI_AY_Ä°SEME_GEN', 'CURRENTMONTHNAMEGEN'),
+ 'pagename' => array( 1, 'BÄ°TÄ°SEME', 'PAGENAME'),
+ 'namespace' => array( 1, 'Ä°SEMARA', 'NAMESPACE'),
+ 'subst' => array( 0, 'TÖPÇEK:', 'SUBST:'),
+ 'msgnw' => array( 0, 'MSGNW:' ),
+ 'end' => array( 0, '__AZAQ__', '__END__'),
+ 'img_thumbnail' => array( 1, 'thumbnail', 'thumb' ),
+ 'img_right' => array( 1, 'uñda', 'right'),
+ 'img_left' => array( 1, 'sulda', 'left'),
+ 'img_none' => array( 1, 'yuq', 'none'),
+ 'img_width' => array( 1, '$1px' ),
+ 'img_center' => array( 1, 'center', 'centre' ),
+ 'img_framed' => array( 1, 'framed', 'enframed', 'frame' ),
+ 'int' => array( 0, 'EÇKE:', 'INT:'),
+ 'sitename' => array( 1, 'SÄXİFÄİSEME', 'SITENAME'),
+ 'ns' => array( 0, 'Ä°A:', 'NS:'),
+ 'localurl' => array( 0, 'URINLIURL:', 'LOCALURL:'),
+ 'localurle' => array( 0, 'URINLIURLE:', 'LOCALURLE:'),
+ 'server' => array( 0, 'SERVER' )
);
$fallback8bitEncoding = "windows-1254";
+$linkTrail = '/^([a-zäçğıñöşü“»]+)(.*)$/sDu';
+
$messages = array(
+'skinpreview' => '(Küzläw)',
-# week days, months
-'sunday' => "Yäkşämbe",
-'monday' => "Düşämbe",
-'tuesday' => "Sişämbe",
-'wednesday' => "Çärşämbe",
-'thursday' => "Pänceşämbe",
-'friday' => "ComÄŸa",
-'saturday' => "Şimbä",
-'january' => "Ğínwar",
-'february' => "Febräl",
-'march' => "Mart",
-'april' => "Äpril",
-'may_long' => "May",
-'june' => "Yün",
-'july' => "Yül",
-'august' => "August",
-'september' => "Sentäber",
-'october' => "Öktäber",
-'november' => "Nöyäber",
-'december' => "Dekäber",
-'jan' => "Ğín",
-'feb' => "Feb",
-'mar' => "Mar",
-'apr' => "Äpr",
-'may' => "May",
-'jun' => "Yün",
-'jul' => "Yül",
-'aug' => "Aug",
-'sep' => "Sen",
-'oct' => "Ökt",
-'nov' => "Nöy",
-'dec' => "Dek",
+# Dates
+'sunday' => 'Yäkşämbe',
+'monday' => 'Düşämbe',
+'tuesday' => 'Sişämbe',
+'wednesday' => 'Çärşämbe',
+'thursday' => 'Pänceşämbe',
+'friday' => 'ComÄŸa',
+'saturday' => 'Şimbä',
+'sun' => 'Yäk',
+'mon' => 'Düş',
+'tue' => 'SiÅŸ',
+'wed' => 'Çär',
+'thu' => 'Pän',
+'fri' => 'Com',
+'sat' => 'Åžim',
+'january' => 'Ğínwar',
+'february' => 'Febräl',
+'march' => 'Mart',
+'april' => 'Äpril',
+'may_long' => 'May',
+'june' => 'Yün',
+'july' => 'Yül',
+'august' => 'August',
+'september' => 'Sentäber',
+'october' => 'Öktäber',
+'november' => 'Nöyäber',
+'december' => 'Dekäber',
+'jan' => 'Ğín',
+'feb' => 'Feb',
+'mar' => 'Mar',
+'apr' => 'Äpr',
+'may' => 'May',
+'jun' => 'Yün',
+'jul' => 'Yül',
+'aug' => 'Aug',
+'sep' => 'Sen',
+'oct' => 'Ökt',
+'nov' => 'Nöy',
+'dec' => 'Dek',
-);
+# Bits of text used by many pages
+'categories' => 'Cíıntıqlar',
+'pagecategories' => '{{PLURAL:$1|Cíıntıq|Cíıntıqlar}}',
+'pagecategorieslink' => '{{ns:special}}:Categories',
+'category_header' => '«$1» cíıntığınıñ mäqäläläre',
+'subcategories' => 'Eçke cíıntıqlar',
+
+'linkprefix' => '/^(.*?)([a-zäçğıñöşüA-ZÄÇĞİÑÖŞÜ«„]+)$/sDu',
+'mainpage' => 'Täwge Bit',
+'mainpagetext' => 'Wiki programı uñışlı quyıldı.',
+
+'portal' => 'Cämğiät üzäge',
+'portal-url' => '{{ns:project}}:Cämğiät Üzäge',
+'about' => 'Turında',
+'aboutsite' => '{{SITENAME}} Turında',
+'aboutpage' => '{{ns:project}}:Turında',
+'article' => 'Eçtälek bite',
+'help' => 'Yärdäm',
+'helppage' => '{{ns:help}}:Eçtälek',
+'bugreports' => 'Xatanamä',
+'bugreportspage' => '{{ns:project}}:Xata_yomğağı',
+'sitesupport' => 'Ximäyäçegä',
+'sitesupport-url' => '{{ns:project}}:Ximäyäçegä',
+'faq' => 'YBS',
+'faqpage' => '{{ns:project}}:YBS',
+'edithelp' => 'Üzgärtü xaqında',
+'newwindow' => '(yaña täräzädä açılır)',
+'edithelppage' => '{{ns:help}}:Üzgärtü',
+'cancel' => 'Kiräkmi',
+'qbfind' => 'Tap',
+'qbbrowse' => 'Qaraw',
+'qbedit' => 'Üzgärtü',
+'qbpageoptions' => 'Bu bit',
+'qbpageinfo' => 'Eçtälek',
+'qbmyoptions' => 'Bitlärem',
+'qbspecialpages' => 'Maxsus bitlär',
+'moredotdotdot' => 'Kübräk...',
+'mypage' => 'Bitem',
+'mytalk' => 'Bäxäsem',
+'anontalk' => 'Bu IP turında bäxäs',
+'navigation' => 'Küçü',
+
+'currentevents' => 'Xäzerge waqíğalar',
+'currentevents-url' => 'Xäzerge waqíğalar',
+
+'errorpagetitle' => 'Xata',
+'returnto' => '«$1» bitenä qaytu.',
+'tagline' => "{{SITENAME}}'dan",
+'search' => 'Ezläw',
+'searchbutton' => 'Ezläw',
+'go' => 'Küç',
+'searcharticle' => 'Küç',
+'history' => 'Bit taríxı',
+'history_short' => 'Taríx',
+'info_short' => 'Belem',
+'printableversion' => 'Bastırulı yurama',
+'edit' => 'Üzgärtü',
+'editthispage' => 'Bit üzgärtü',
+'delete' => 'Beter',
+'deletethispage' => 'Beter bu bitne',
+'undelete_short' => 'Torğız',
+'protect' => 'Yaqla',
+'protectthispage' => 'Yaqla bu bitne',
+'unprotect' => 'İreklä',
+'unprotectthispage' => 'İreklä bu biten',
+'newpage' => 'Yaña bit',
+'talkpage' => 'Bit turında bäxäs',
+'specialpage' => 'Maxsus Bit',
+'personaltools' => 'Şäxes qoralı',
+'postcomment' => 'Yazma qaldıru',
+'addsection' => '+',
+'articlepage' => 'Eçtälek biten kürü',
+'talk' => 'Bäxäs',
+'toolbox' => 'Äsbäptirä',
+'userpage' => 'Äğzä biten qaraw',
+'imagepage' => 'Räsem biten qaraw',
+'viewtalkpage' => 'Bäxäsen qaraw',
+'otherlanguages' => 'Başqa tellärdä',
+'redirectedfrom' => '(«$1» bitennän yünältelde)',
+'viewcount' => 'Bu bit $1 märtäbä qaralğan.',
+'copyright' => 'Eçtälek $1 buyınça ireşüle.',
+'protectedpage' => 'YaqlanÄŸan bit',
+'jumpto' => 'Küç:',
+'jumptosearch' => 'ezläw',
+
+'retrievedfrom' => 'Bu bitneñ çığanağı: "$1"',
+'newmessageslink' => 'yaña xäbär',
+'editsection' => 'üzgärtü',
+'editold' => 'üzgärtü',
+'toc' => 'Eçtälek tezmäse',
+'showtoc' => 'kürsät',
+'hidetoc' => 'yäşer',
+'thisisdeleted' => 'Qaraw/torğızu: $1',
+'restorelink' => '$1 beterelgän bit',
+'feedlinks' => 'Tasma:',
+
+# Short words for each namespace, by default used in the 'article' tab in monobook
+'nstab-main' => 'Mäqälä',
+'nstab-user' => 'Äğzä bite',
+'nstab-media' => 'Media bite',
+'nstab-special' => 'Maxsus',
+'nstab-project' => 'Proyekt bite',
+'nstab-image' => 'Räsem',
+'nstab-mediawiki' => 'Sätir',
+'nstab-template' => 'Äzerlämä',
+'nstab-help' => 'Yärdäm',
+'nstab-category' => 'Cíıntıq',
+
+# Main script and global functions
+'nosuchaction' => 'Andí ğämäl barlıqta yuq',
+'nosuchspecialpage' => 'Andí maxsus bit yuq',
+
+# General errors
+'error' => 'Xata',
+'databaseerror' => 'Biremlek xatası',
+'readonly' => 'Biremlek yabılğan ide',
+'internalerror' => 'Eçke xata',
+'filecopyerror' => 'Bu «$1» biremen «$2» iseme belän küpli almím.',
+'filerenameerror' => 'Bu «$1» biremen «$2» iseme belän küçerä almím.',
+'filedeleteerror' => 'Bu «$1» biremen beterep bulmí.',
+'filenotfound' => 'Bu «$1» biremen tabalmím.',
+'formerror' => 'Xata: formını künderä almím',
+'badtitle' => 'Yaraqsız başlıq',
+'badtitletext' => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title. It may contain one more characters which cannot be used in titles.',
+'perfdisabled' => 'Kiçer! Biremlekneñ äkren buluına säbäple, bu mömkinlek waqıtlıça sünderelgän ide.',
+'perfdisabledsub' => '$1 biteneñ saqlanğan yuraması bu:', # obsolete?
+'perfcached' => 'Astağı belem alxäterdän alındı wä anıñ xäzerge xäl belän turı kilmäwe bar:',
+'viewsource' => 'Mäqälä çığanağı',
+
+# Login and logout pages
+'logouttitle' => 'Äğzä çığuı',
+'welcomecreation' => "== Räxim it, $1! ==
+
+Sineñ xísabıñ yasaldı. {{SITENAME}}'dağı köyläwläreñne dä üzgärtergä onıtma.",
+'loginpagetitle' => 'Atama belän kerü',
+'yourname' => 'İreşü isemeñ',
+'yourpassword' => 'Sersüzeñ',
+'yourpasswordagain' => 'Sersüz qabat',
+'remembermypassword' => 'Tanı mine kergändä.',
+'loginproblem' => '<b>Kerüeñ waqıtında nindider qíınlıq bulıp çıqtı.</b><br />Qabat kerep qara!',
+'alreadyloggedin' => '<strong>«$1» atlı äğzä, sin kergänseñ iç inde!</strong><br />',
+'login' => 'İreşü',
+'userlogin' => 'Xísap yasaw yä ki kerü',
+'logout' => 'Çığış',
+'userlogout' => 'Çığış',
+'notloggedin' => 'Kermädeñ äle',
+'createaccount' => 'Yaña xísap yasaw',
+'createaccountmail' => 'email buyınça',
+'badretype' => 'Kertelgän sersüzeñ kileşmi.',
+'userexists' => 'Äle genä kertkäneñ äğzä iseme qullanıla inde. Başqa isem sayla zínhar.',
+'youremail' => "Email'ıñ*",
+'yourrealname' => 'Çın isemeñ*',
+'yournick' => 'Atamañ:',
+'loginerror' => 'Kerü xatası',
+'loginsuccesstitle' => 'Uñışlı kergänbez',
+'loginsuccess' => "Sin {{SITENAME}}'ğa «$1» atama belän kergän buldıñ.",
+'wrongpassword' => 'Sin kertän sersüz xatalı axrısı. Tağın kertep qara zínhar.',
+'mailmypassword' => 'Yaña sersüzne xat belän cibär',
+'passwordremindertitle' => '{{SITENAME}} sersüz xäterlätkeçe',
+'passwordsent' => 'Yaña sersüz «$1» terkälüendä kertelgän e-mail buyınça cibärelde.
+Anı alğaç monda tağın kerep qara.',
+'mailerror' => 'Xat künderü xatası: $1',
+
+# Edit page toolbar
+'bold_sample' => 'Qalın mäten',
+'bold_tip' => 'Qalın mäten',
+'italic_sample' => 'Awışlı mäten',
+'italic_tip' => 'Awışlı mäten',
+'link_sample' => 'Läñker başlığı',
+'link_tip' => 'Eçke läñker',
+'extlink_sample' => 'http://www.example.com läñker başlığı',
+'extlink_tip' => 'Tışqı läñker (alğı http:// quşımtasın onıtma)',
+'headline_sample' => 'Başlıq mätene',
+'headline_tip' => '2. däräcäle başlıq',
+'math_sample' => 'Formulnı monda kert',
+'math_tip' => 'İsäpläw formulı (LaTeX)',
+'nowiki_sample' => 'Taqır mäten urnaştıram',
+'nowiki_tip' => 'Wiki-qalıp eşkärtmäskä',
+'image_sample' => 'Example.jpg',
+'image_tip' => 'Quşılğan räsem',
+'media_sample' => 'Example.ogg',
+'sig_tip' => 'Ãmzañ belän zaman/waqıt tamÄŸası',
+'hr_tip' => 'Yatma sızıq (siräk qullan)',
+
+# Edit pages
+'summary' => 'YomÄŸaq',
+'subject' => 'Ni turında/başlıq',
+'minoredit' => 'Bu waq-töyäk üzgärmä genä',
+'watchthis' => 'Bitne küzätep torası',
+'savearticle' => 'Saqla biremne',
+'preview' => 'Küzläw',
+'showpreview' => 'Qarap alu...',
+'blockedtitle' => 'Qullanuçı tíıldı',
+'whitelistedittitle' => 'Üzgärtü öçen, kerü täläp itelä',
+'whitelistedittext' => 'Bitlärne üzgärtü öçen,
+säxifägä isem belän [[Special:Userlogin|keräse]].',
+'whitelistreadtitle' => 'Uqu öçen kerü täläp itelä',
+'whitelistreadtext' => 'Bitlärne uqu öçen,
+säxifägä isem belän [[Special:Userlogin|keräse]].',
+'whitelistacctitle' => 'Siña xísap yasaw tíılğan',
+'loginreqtitle' => 'Kerergä Kiräk',
+'loginreqlink' => 'keräse',
+'accmailtitle' => 'Sersüz künderelde.',
+'accmailtext' => "Bu '$1' öçen digän sersüz '$2' adrésına cibärelde.",
+'newarticle' => '(Yaña)',
+'newarticletext' => "Bulmağan bitkä kürsätkän läñker buyınça küçkänseñ.
+Bu bit başlaw öçen, eçtälegen astağı qırda cía başla
+(kübräge [[Yärdäm:Eçtälek|yärdäm bitendä]] tarwírlana).
+Xata çığuınnan monda eläkkänseñ ikän, browserıñnıñ '''kire''' sädäfenä genä basası.",
+'clearyourcache' => "'''İskärmä:''' Saqlawdan soñ, üzgärmälärne kürü öçen browserıñnıñ alxäteren buşatası bar: '''Mozilla:''' click ''reload''(yä ki ''ctrl-r''), '''IE / Opera:''' ''ctrl-f5'', '''Safari:''' ''cmd-r'', '''Konqueror''' ''ctrl-r''.",
+
+
+
+
+'updated' => '(Yañartıldı)',
+'note' => '<strong>İskärmä:</strong>',
+
+
+
+'editing' => 'Üzgärtü: $1',
+'editconflict' => 'Üzgärtü qíınlığı: $1',
+'yourtext' => 'Mäteneñ',
+'storedversion' => 'SaqlanÄŸan yurama',
+'editingold' => '<strong>KİSÄTMÄ: Sin bu bitneñ iskergän yuramasın üzgärtäsen.
+Ägär sin monı saqlísıñ ikän, şul yuramadan soñ yasalğan üzgärmälär yuğalır.</strong>',
+'yourdiff' => 'Ayırmalar',
+'longpagewarning' => "KİSÄTMÄ:</font> Bu bit zurlığı $1 KB; qayber browserlarda 32 KB'tan da zurraq bulğan bitlärne kürsätkändä qíınlıqlar bula.
+Zínhar, bu bitneñ wağraq kisäklärgä bülü turında uylap qara.",
+'protectedpagewarning' => 'KİSÄTMÄ: Bu bit yaqlanğan ide wä anı idäräçe xoquqı iä bulğan genä keşe üzgärtä ala. Kübrägen <a href="/wiki/{{SITENAME}}:Bit_yaqlaw_qullanması">bit yaqlaw qullanmasında</a> uqıp bula.',
+
+# History pages
+'loadhist' => 'Bit taríxın yökläw',
+'currentrev' => 'Ağımdağı yurama',
+'cur' => 'xäzer',
+'next' => 'kiläse',
+'last' => 'soñğı',
+'orig' => 'çığn',
+
+# Diffs
+'difference' => '(Yuramalar ayırması)',
+'lineno' => '$1. yul:',
+'editcurrent' => 'Bu bitneñ ağımdağı yuramanı üzgärtü',
+'compareselectedversions' => 'Saylanğan yurama çağıştıru',
+
+# Search results
+'searchresults' => 'Ezläw näticäse',
+'badquery' => 'Ezläw sorawı xata belän cíılğan',
+'titlematches' => 'Mäqälä başlığı kileşä',
+'notitlematches' => 'Kileşkän bit başlığı yuq',
+'notextmatches' => 'Kileşkän bit mätene yuq',
+'prevn' => 'uzÄŸan $1',
+'nextn' => 'kiläse $1',
+'showingresults' => 'Asta <b>$1</b> näticä kürsätelä <b>$2</b>. keremnän başlap.',
+'showingresultsnum' => 'Asta <b>$3</b> näticä kürsätelä <b>$2</b>. keremnän başlap.',
+'powersearch' => 'Ezläw',
+'blanknamespace' => '(Töp)',
+
+# Preferences page
+'preferences' => 'Köyläwlar',
+'mypreferences' => 'Köyläwem',
+'prefsnologin' => 'Kermägänseñ',
+'qbsettings' => 'Tiztirä caylawı',
+'changepassword' => 'Sersüz üzgärtü',
+'skin' => 'Tışlaw',
+'dateformat' => 'Waqıt qalıbı',
+'math_failure' => 'Uqí almadım',
+'math_unknown_error' => 'tanılmağan xata',
+'math_unknown_function' => 'tanılmağan funksí',
+'math_lexing_error' => 'nöhü xatası',
+'math_syntax_error' => 'nöhü xatası',
+'prefs-misc' => 'Başqa köyläwlär',
+'saveprefs' => 'Saqla köyläwlärne',
+'resetprefs' => 'Awdar köyläwne',
+'oldpassword' => 'İske sersüz',
+'newpassword' => 'Yaña sersüz',
+'retypenew' => 'Yaña sersüz (qabat)',
+'textboxsize' => 'Mätenqır ülçäme',
+'rows' => 'Yul:',
+'columns' => 'Buy:',
+'searchresultshead' => 'Ezläw',
+'resultsperpage' => 'Bit sayın näticä sanı',
+'recentchangescount' => 'Soñğı üzgärtmä tezmäsendä başlıq sanı',
+'savedprefs' => 'Köyläwläreñ saqlandı.',
+'timezonelegend' => 'Waqıt quşağı',
+'localtime' => 'Cirle waqıt belän kürsätäse',
+'timezoneoffset' => 'Çigenü',
+'servertime' => 'Serverda xäzerge waqıt',
+'guesstimezone' => 'Browserdan alası',
+'defaultns' => 'Ğädättä bu isemarada ezlise:',
+'files' => 'Fayllar',
+
+'group-bot-member' => 'Bot',
+
+# Recent changes
+'changes' => 'üzgärmä',
+'recentchanges' => 'Soñğı üzgärtmälär',
+'recentchangestext' => 'Bu bittä wikidä bulğan iñ soñğı üzgärtmäläre kürsätelä.',
+'rcnote' => 'Asta söñğı <strong>$2</strong> kön eçendä bulğan soñğı <strong>$1</strong> üzgärmä kürsätelä.',
+'rcnotefrom' => 'Asta <b>$2</b> zamanınnan soñ bulğan üzgärtmälär (<b>$1</b> tikle).',
+'rclistfrom' => '$1 zamannan soñ bulğan üzgärtmälär.',
+'rclinks' => 'Soñğı $2 kön eçendä bulğan $1 üzgärtmä<br />$3',
+'diff' => 'ayırma',
+'hist' => 'taríx',
+'hide' => 'yäşer',
+'show' => 'kürsät',
+'minoreditletter' => 'w',
+'newpageletter' => 'Y',
+'boteditletter' => 'b',
+'sectionlink' => '→',
+
+# Upload
+'upload' => 'Birem yökläw',
+'uploadbtn' => 'Yöklä biremne',
+'reupload' => 'Qabat yökläw',
+'reuploaddesc' => 'Yökläw bitenä qaytu.',
+'uploadnologin' => 'Kermädeñ',
+'uploadnologintext' => 'Birem yökläw öçen,
+säxifägä isem belän [[Special:Userlogin|keräse]].',
+'uploaderror' => 'Yökläw xatası',
+'uploadlog' => 'yökläw könlege',
+'uploadlogpage' => 'Yökläw_könlege',
+'uploadlogpagetext' => 'Asta soñğı arada yöklängän birem tezmäse kiterelä.',
+'filename' => 'Birem iseme',
+'filedesc' => 'YomÄŸaq',
+'fileuploadsummary' => 'YomÄŸaq:',
+'filestatus' => 'Qälämxaq xäläte',
+'filesource' => 'Çığanaq',
+'copyrightpage' => '{{ns:project}}:Qälämxaq',
+'copyrightpagename' => '{{SITENAME}} qälämxaqı',
+'uploadedfiles' => 'Yöklängän biremnär',
+'ignorewarning' => 'Kisätmägä qaramíçı biremne härxäldä saqla.',
+'minlength' => 'Räsem iseme iñ kimendä öç xäreftän bulırğa tieş.',
+'badfilename' => 'Räsem iseme «$1» itep üzgärtelde.',
+'badfiletype' => '«.$1» törendä räsemnärne qullanırğa kiñäş itelmi.',
+'successfulupload' => 'Yökläw uñışlı uzdı',
+'uploadwarning' => 'Yökläw kisätmäse',
+'savefile' => 'Saqla biremne',
+'uploadedimage' => 'yöklände "$1"',
+'uploaddisabled' => 'Ğafu it, yökläw sünderelgän kileş tora.',
+'uploadcorrupt' => 'Bu birem yä üze watıq, yä quşımtası yaraqsız. Birem tikşerüdän soñ qabat yöklä zínhar.',
+# Image list
+'imagelist' => 'Räsem tezmäse',
+'ilsubmit' => 'Ezläw',
+'showlast' => 'Soñğı $1 räsem kürsätäse, $2 tezep.',
+'byname' => 'isem buyınça',
+'bydate' => 'waqıt buyınça',
+'bysize' => 'zurlıq buyınça',
+'imgdelete' => 'beter',
+'imgdesc' => 'añlatma',
+'imgfile' => 'fayl',
+'imglegend' => 'Añlatma: (täsw) = räsem täswiren qaraw/üzgärtü.',
+'imghistory' => 'Räsem taríxı',
+'revertimg' => 'qayart',
+'deleteimg' => 'beter',
+'deleteimgcompletely' => 'Bar yuramalarnı beter',
+'imghistlegend' => 'Añlatma: (ağımdağı) = ağımdağı räsem, (beter) = iske
+yurama beterü, (qaytart) = iske yurama qaytartu.
+<br /><i>Fälän köndä yöklängän räsemne kürü öçen şul könne törtäse</i>.',
+'imagelinks' => 'Räsem läñkerläre',
+
+# Statistics
+'statistics' => 'Nöfüs',
+'sitestats' => '{{SITENAME}} nöfüse',
+'userstats' => 'Qullanuçı nöfüse',
+
+'disambiguations' => 'Saylaqbit tezmäse',
+'disambiguationspage' => '{{ns:template}}:Disambig',
+
+'doubleredirects' => 'Küpmälle yünältü',
+
+'brokenredirects' => 'Watıq Yünältülär',
+'brokenredirectstext' => 'Kiläse yünältülär bulmağan bitlärgä qarílar.',
+
+# Miscellaneous special pages
+'nbytes' => '$1 bayt',
+'nlinks' => '$1 läñker',
+'nviews' => '$1 qaraw',
+'lonelypages' => 'Yätim bitlär',
+'uncategorizedpages' => 'Cíıntıqlanmağan bitlär',
+'unusedimages' => 'Qullanılmağan räsemnär',
+'popularpages' => 'Ğämäli bitlär',
+'wantedpages' => 'Kiräkle bitlär',
+'allpages' => 'Bar bitlär',
+'randompage' => 'Berär bit kürü',
+'shortpages' => 'Qısqa bitlär',
+'longpages' => 'Ozın bitlär',
+'listusers' => 'Äğzä isemlege',
+'specialpages' => 'Maxsus bitlär',
+'spheading' => 'Bar keşelär öçen',
+'recentchangeslinked' => 'Bäyle üzgärmä',
+'rclsub' => '(«$1» bite belän bäyle bitlärgä)',
+'newpages' => 'Yaña bitlär',
+'ancientpages' => 'İñ iske bitlär',
+'intl' => 'Tel-ara läñker',
+'move' => 'Küçerü',
+'movethispage' => 'Bu bit küçerü',
+'booksources' => 'Kitap çığanağı',
+'categoriespagetext' => "Bu wiki'dä kiläse cíıntıqlar bar.",
+'version' => 'Yurama',
+
+# Special:Allpages
+'nextpage' => 'Kiläse bit ($1)',
+
+# E-mail user
+'emailuser' => 'E-mail künderü',
+'emailpage' => 'E-mail künderü',
+'noemailtitle' => 'E-mail adres kürsätelmäde',
+'emailfrom' => 'Kemnän',
+'emailto' => 'Kemgä',
+'emailsubject' => 'Ni turında',
+'emailmessage' => 'Xäbär',
+'emailsend' => 'Künder',
+'emailsent' => 'E-mail künderelde',
+'emailsenttext' => "E-mail'ıñ künderelde.",
+
+# Watchlist
+'watchlist' => 'Saqtezmäm',
+'nowatchlist' => 'Saqtezmäñdä kertemnär yuq.',
+'watchnologin' => 'Kermädeñ',
+'watchnologintext' => 'Saqtezmäñ üzgärtü öçen, säxifägä isem belän [[Special:Userlogin|keräse]].',
+'addedwatch' => 'Saqtezmägä quşıldı',
+'addedwatchtext' => '«[[:$1]]» isemle mäqälä [[{{ns:special}}:Saqtezmä|saqtezmäseñä]] salındı.
+Future changes to this page and its associated Talk page will be listed there,
+and the page will appear \'\'\'bolded\'\'\' in the [[Special:Recentchanges|list of recent changes]] to
+make it easier to pick out.
+
+If you want to remove the page from your watchlist later, click "Unwatch" in the sidebar.',
+'removedwatch' => 'Saqtezmädän salındı',
+'removedwatchtext' => '«[[:$1]]» atlı bit saqtezmäñnän töşerelde.',
+'watch' => 'Saqlaw',
+'watchthispage' => 'Bitne küzätep torası',
+'notanarticle' => 'Eçtälek belän bit tügel',
+'removechecked' => 'Tamğalanğan keremne saqtezmädän salası',
+'watchlistcontains' => 'Saqtezmäñ eçenä $1 bit kertelgän.',
+'removingchecked' => 'Tamğalanğan keremnärne saqtezmädän salu...',
+'couldntremove' => 'Bu «$1» keremne beterä almím...',
+'wlnote' => 'Asta soñğı <b>$2</b> säğät eçendä yasalğan $1 üzgärmä kürsätelä.',
+'wlsaved' => 'Bu yurama säqtezmäñdä saqlanğan buldı',
+
+# Delete/protect/revert
+'deletepage' => 'Beter bitne',
+'confirm' => 'Raslaw',
+'excontent' => 'eçtälege ide:',
+'exblank' => 'bit buÅŸ ide',
+'confirmdelete' => 'Beterüne raslaw',
+'deletesub' => '(«$1» beterü)',
+'historywarning' => 'ÃÄŸtíbar: Beterergä telägän biteneñ üz taríxı bar:',
+'actioncomplete' => 'Ğämäl tämam',
+'deletedtext' => '«$1» beterelgän buldı.
+Soñğı beterülär $2 bitendä terkälenä.',
+'deletedarticle' => '«$1» beterelde',
+'dellogpage' => 'Beterü_köndälege',
+'deletionlog' => 'beterü köndälege',
+'reverted' => 'Aldağı yuramanı qaytart',
+'deletecomment' => 'Beterü säbäbe',
+'imagereverted' => 'Aldağı yuramağa küçü uñışlı uzdı.',
+'editcomment' => 'Bu üzgärtü taswírı: "<i>$1</i>".', # only shown if there is an edit comment
+'protectlogpage' => 'Yaqlaw_köndälege',
+'protectedarticle' => '[[$1]] yaqlandı',
+'unprotectedarticle' => '[[$1]] ireklände',
+'protectsub' => '(«$1» yaqlaw)',
+'confirmprotect' => 'Yaqlawnı raslaw',
+'protectcomment' => 'Yaqlaw säbäbe',
+'confirmunprotect' => 'Yaqlaw töşerüen raslaw',
+'unprotectcomment' => 'İrekläw säbäbe',
+
+# Undelete
+'undelete' => 'Beterelgän bit torğızu',
+'undeletearticle' => 'Beterelgän bit torğızu',
+'undeletebtn' => 'Torğız!',
+'undeletedarticle' => '«$1» torğızıldı',
+
+# Contributions
+'contributions' => 'Äğzä qatnaşuı',
+'mycontris' => 'Qatnaşuım',
+'contribsub' => '$1 öçen',
+'uctop' => ' (öskä)',
+
+# What links here
+'whatlinkshere' => 'Kem bäyle moña',
+'notargettitle' => 'Maqsatsız',
+'linklistsub' => '(Läñker tezmäse)',
+'nolinkshere' => 'Moña bäyle bitlär yuq.',
+'isredirect' => 'küçerelü bite',
+
+# Block/unblock
+'blockip' => 'Qullanuçı tíu',
+'ipaddress' => 'IP Adres/äğzäisem',
+'ipbexpiry' => 'Ä°skerer',
+'ipbreason' => 'Säbäp',
+'ipbsubmit' => 'Bu keşene tíu',
+'badipaddress' => 'Xatalı IP adrésı',
+'blockipsuccesssub' => 'Tíu uzdı',
+'blockipsuccesstext' => '«$1» tíılğan buldı.
+<br />See [[Special:Ipblocklist|IP block list]] to review blocks.',
+'unblockip' => 'Äğzäne irekläw',
+'ipusubmit' => 'Bu adresnı irekläw',
+'ipblocklist' => 'Tíılğan IP/äğzä tezmäse',
+'blocklink' => 'tíu',
+'contribslink' => 'qatnaşuı',
+'blocklogpage' => 'Tíu_köndälege',
+'ipb_expiry_invalid' => 'İskärü waqıtı xatalı.',
+'ip_range_invalid' => 'Xatalı IP arası.',
+'proxyblocker' => 'Proxy tíu',
+'proxyblocksuccess' => 'Buldı.',
+'sorbs' => 'DNSBL',
+
+# Developer tools
+'lockdb' => 'Biremlekne yozaqlaw',
+'unlockdb' => 'Biremlek irekläw',
+'lockconfirm' => 'Äye, min biremlekne çınlap ta yozaqlarğa buldım.',
+'lockbtn' => 'Biremlekne yozaqlaw',
+'lockdbsuccesssub' => 'Biremlek yözaqlandı',
+'unlockdbsuccesssub' => 'Biremlek yozağı salındı',
+'unlockdbsuccesstext' => 'Bu biremlek yozağı salınğan ide.',
+
+# Make sysop
+'makesysoptitle' => 'Äğzäne idäräçe itep quyu',
+'makesysopname' => 'Bu äğzäne:',
+'makesysopsubmit' => 'Bu äğzäne idäräçe itep quy',
+'makesysopok' => '<b>«$1» isemle äğzä idäräçe buldı</b>',
+'setbureaucratflag' => 'Näzir itep quyası',
+'rights' => 'Xoquqlar:',
+'set_user_rights' => 'Äğzä xoquqın üzgärt',
+'user_rights_set' => '<b>«$1» atlı äğzä xoquqı yañartıldı</b>',
+'makesysop' => 'Äğzäne idäräçe itep quyu',
+
+# Move page
+'movepage' => 'Bit küçerü',
+'movepagetalktext' => "Bäyle bulğan bäxäs bite kiläse oçraqlarda töp bite belän beryulı '''küçerelmi qala''':
+* Töp bit [[Yärdäm:İsemara|isemara]] arqılı küçerelä;
+* Yaña başlıq astında buş bulmağan ikençe bit bulğanda;
+* Astağı tamğaqır sünderelgän bulsa.
+
+Bu äytelgän oçraqlarda bäxäs biten ayırım küçerergä turı kiler.",
+'movearticle' => 'Küçeräse bit',
+'movenologin' => 'Kermädeñ',
+'newtitle' => 'Yaña başlıq',
+'movepagebtn' => 'Küçer bitne',
+'pagemovedsub' => 'Küçerü uñışlı uzdı',
+'pagemovedtext' => 'Bu «[[$1]]» atlı bit «[[$2]]» iseme belän küçerelde.',
+'articleexists' => 'Andí atlı bit bar inde,
+yä isä saylanğan isem yaraqsız buldı. Başqa isem sayla zínhar.',
+'movedto' => 'küçerelde:',
+'movetalk' => 'Mömkin bulsa, «bäxäs» biten dä küçer.',
+'talkpagemoved' => 'Aña bäyle bäxäs bite şulay uq küçerelde.',
+'talkpagenotmoved' => 'Aña bäyle bäxäs bite <strong>küçerelmäde</strong>.',
+'1movedto2' => '$1 moña küçte: $2',
+'1movedto2_redir' => '$1 moña küçte: $2 (yünältü aşa)',
+
+# Namespace 8 related
+'allmessages' => 'Säxifäneñ bar sätirläre',
+'allmessagestext' => 'Bu säxifäneñ MediaWiki: atarasında bulğan yazmalar tezmäse.',
+
+# Thumbnails
+'thumbnail-more' => 'Zuraytası',
+'missingimage' => '<b>Bulmağan räsem</b><br /><i>$1</i>',
+
+# Special:Import
+'import' => 'Bitlärne yökläw',
+'importfailed' => 'Yökläw xatası: $1',
+'importnotext' => 'Buş yä ki mäten tügel',
+'importsuccess' => 'Yökläw uñışlı buldı!',
+
+# Keyboard access keys for power users
+'accesskey-search' => 'f',
+'accesskey-minoredit' => 'i',
+'accesskey-save' => 's',
+'accesskey-preview' => 'p',
+'accesskey-diff' => 'v',
+'accesskey-compareselectedversions' => 'v',
+'accesskey-watch' => 'w',
+
+# Tooltip help for some actions, most are in Monobook.js
+'tooltip-search' => "{{SITENAME}}'dä ezläw [alt-f]",
+'tooltip-minoredit' => 'Bu üzgärtmä waq-töyäk dip bilgelä [alt-i]',
+'tooltip-save' => 'Üzgärtüne saqlaw [alt-s]',
+
+# Stylesheets
+'common.css' => '/** CSS placed here will be applied to all skins */',
+'monobook.css' => '/* CSS placed here will affect users of the Monobook skin */',
+
+# Attribution
+'anonymous' => "{{SITENAME}}'nıñ tanılmağan kerüçe",
+'siteuser' => '{{SITENAME}} ägzäse $1',
+'and' => 'wä',
+'othercontribs' => '«$1» eşenä nigezlänä.',
+'others' => 'baÅŸqalar',
+'siteusers' => '{{SITENAME}} ägzäse $1',
+'creditspage' => 'Bit yasawında qatnaşqan',
+
+# Spam protection
+'spamprotectiontitle' => 'Çüpläwdän saqlanu eläge',
+'subcategorycount' => 'Bu cíıntıqnıñ $1 eçke cíıntıq bar.',
+'categoryarticlecount' => 'Bu cíıntıqqa $1 mäqälä kerä.',
+
+# Info page
+'infosubtitle' => 'Bit turında',
+'numedits' => 'Üzgärtü sanı (mäqälä):',
+'numtalkedits' => 'Üzgärtü sanı (bäxäs bite):',
+'numwatchers' => 'Küzätep toruçı sanı:',
+
+# Monobook.js: tooltips and access keys for monobook
+'monobook.js' => "/* äsbäpkiñäş wä ireşü töymäläre */
+ta = new Object();
+ta['pt-userpage'] = new Array('.','Şäxsi bitem');
+ta['pt-anonuserpage'] = new Array('.','The user page for the ip you're editing as');
+ta['pt-mytalk'] = new Array('n','Bäxäs bitem');
+ta['pt-anontalk'] = new Array('n','Discussion about edits from this ip address');
+ta['pt-preferences'] = new Array('','Köyläwlärem');
+ta['pt-watchlist'] = new Array('l','The list of pages you're monitoring for changes.');
+ta['pt-mycontris'] = new Array('y','Qatnaşuım tezmäse');
+ta['pt-login'] = new Array('o','You are encouraged to log in, it is not mandatory however.');
+ta['pt-anonlogin'] = new Array('o','You are encouraged to log in, it is not mandatory however.');
+ta['pt-logout'] = new Array('','Çığış');
+ta['ca-talk'] = new Array('t','Discussion about the content page');
+ta['ca-edit'] = new Array('e','You can edit Bu bit. Please use the preview button before saving.');
+ta['ca-addsection'] = new Array('+','Bu bäxästä yazma östäw.');
+ta['ca-viewsource'] = new Array('e','Bu bit yaqlanğan ide. Anıñ çığanağın kürä alasıñ.');
+ta['ca-history'] = new Array('h','Bu bitneñ soñğı yuramaları.');
+ta['ca-protect'] = new Array('=','Bu bit yaqlaw');
+ta['ca-delete'] = new Array('d','Bu bit beterü');
+ta['ca-undelete'] = new Array('d','Restore the edits done to Bu bit before it was deleted');
+ta['ca-move'] = new Array('m','Bu bit küçerü');
+ta['ca-nomove'] = new Array('','Bu bit küçerü öçen xoquqlarıñ citmi');
+ta['ca-watch'] = new Array('w','Bu bitne saqtezmägä östäw');
+ta['ca-unwatch'] = new Array('w','Bu bitne saqtezmädän töşerü');
+ta['search'] = new Array('e','Äydä, ezlä monı');
+ta['p-logo'] = new Array('','Täwge Bit');
+ta['n-mainpage'] = new Array('z','Täwge Bitkä küçü');
+ta['n-portal'] = new Array('','About the project, what you can do, where to find things');
+ta['n-currentevents'] = new Array('','Find background information on current events');
+ta['n-recentchanges'] = new Array('r','The list of recent changes in the wiki.');
+ta['n-randompage'] = new Array('x','Berär nindi bit kürsätä');
+ta['n-help'] = new Array('','The place to find out.');
+ta['n-sitesupport'] = new Array('','Ximäyäçe bul');
+ta['t-whatlinkshere'] = new Array('j','List of all wiki pages that link here');
+ta['t-recentchangeslinked'] = new Array('k','Recent changes in pages linking to Bu bit');
+ta['feed-rss'] = new Array('','Bu bitneñ RSS tasması');
+ta['feed-atom'] = new Array('','Bu bitneñ Atom tasması');
+ta['t-contributions'] = new Array('','View the list of contributions of this user');
+ta['t-emailuser'] = new Array('','Send a mail to this user');
+ta['t-upload'] = new Array('u','Upload images or media files');
+ta['t-specialpages'] = new Array('q','Bar maxsus bitlär tezmäse');
+ta['ca-nstab-main'] = new Array('c','Bu bit eçtälegen kürü');
+ta['ca-nstab-user'] = new Array('c','Bu äğzä biten kürü');
+ta['ca-nstab-media'] = new Array('c','Bu media biten kürü');
+ta['ca-nstab-special'] = new Array('','Bu bit maxsus, wä sin anı üzgärtä almísıñ.');
+ta['ca-nstab-project'] = new Array('a','Proékt biten kürü');
+ta['ca-nstab-image'] = new Array('c','Bu räsem biten kürü');
+ta['ca-nstab-mediawiki'] = new Array('c','Bu säxifä sätiren kürü');
+ta['ca-nstab-template'] = new Array('c','Bu qalıpnı kürü');
+ta['ca-nstab-help'] = new Array('c','Bu yärdäm biten kürü');
+ta['ca-nstab-category'] = new Array('c','View the category page');",
+
+# Common.js: contains nothing but a placeholder comment
+'common.js' => '/* Any JavaScript here will be loaded for all users on every page load. */',
+
+);
?>
diff --git a/languages/messages/MessagesTyv.php b/languages/messages/MessagesTyv.php
index 0abe30ae..dadacb39 100644
--- a/languages/messages/MessagesTyv.php
+++ b/languages/messages/MessagesTyv.php
@@ -98,6 +98,7 @@ $messages = array(
# Bits of text used by many pages:
#
'categories' => 'Бөлүктер', //Categories
+'pagecategories' => 'Бөлүктер', //{{PLURAL:$1|Category|Categories}}
'category_header' => '"$1" бөлүкте чүүлдер', //Articles in category $1
'subcategories' => 'Бичии бөлүктер', //Subcategories
@@ -300,7 +301,7 @@ $1', //Sorry! The wiki is experiencing some technical difficulties, and cannot c
'allmessagescurrent' => 'Ðмгы Ñөзүглел', //Current text
# labels for User: and Title: on Special:Log pages
-'specialloguserlabel' => 'Ðжыглакчы: ', //User:
+'specialloguserlabel' => 'Ðжыглакчы:', //User:
);
?>
diff --git a/languages/messages/MessagesUk.php b/languages/messages/MessagesUk.php
index a8e79408..59492e99 100644
--- a/languages/messages/MessagesUk.php
+++ b/languages/messages/MessagesUk.php
@@ -57,7 +57,7 @@ $messages = array(
"tog-editsectiononrightclick"=>"Редагувати Ñекції по правій кнопці миші на назві Ñекції (JavaScript)",
"tog-showtoc"=>"Показувати зміÑÑ‚ (Ð´Ð»Ñ Ñтатей з більше ніж 3-ма заголовками)",
"tog-rememberpassword" => "Запам'Ñтовувати пароль між ÑеанÑами",
-"tog-editwidth" => "РозширÑти вікно Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ меж вікна браузера ",
+"tog-editwidth" => "РозширÑти вікно Ð´Ð»Ñ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ меж вікна браузера",
"tog-watchdefault" => "Слідкувати за новими та зміненими ÑтаттÑми",
"tog-minordefault" => "Спочатку вважати вÑÑ– зміни незначними",
"tog-previewontop" => "Показувати попередній текÑÑ‚ до вікна редагуваннÑ, а не піÑле",
@@ -293,10 +293,10 @@ You can view and copy the source of this page:",
Щоб Ñтворити нову Ñтаттю, наберіть текÑÑ‚ в вікні нижче
(див. [[{{ns:project}}:Довідка|довідкову Ñтаттю]] щоб отримати більше інформації).
Якщо ви опинилиÑÑŒ тут помилково, проÑто натиÑніть кнопку браузера '''назад'''.",
-"anontalkpagetext" => "---- ''Це Ñторінка обговореннÑ, що належить анонімному кориÑтувачу, Ñкий ще не зареєÑтрувавÑÑ Ð°Ð±Ð¾ не ÑкориÑтавÑÑ Ð·Ð°Ñ€ÐµÑ”Ñтрованим ім'Ñм. Тому ми вимушені викориÑтовувати [[IP-адреÑу]] Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ ідентифікації. Одна IP-адреÑа може викориÑтовуватиÑÑ Ð´ÐµÐºÑ–Ð»ÑŒÐºÐ¾Ð¼Ð° кориÑтувачами. Якщо ви - анонімний кориÑтувач Ñ– вважаєте, що отримали коментарі, адреÑовані не вам, будь лаÑка [[Спеціальні:Вхід_в_ÑиÑтему|зареєÑтруйтеÑÑŒ або ввійдіть в ÑиÑтему Ñк зареєÑтрований кориÑтувач]], щоб в майбутньому уникнути можливої плутанини з іншими анонімними кориÑтувачами.'' ",
+"anontalkpagetext" => "---- ''Це Ñторінка обговореннÑ, що належить анонімному кориÑтувачу, Ñкий ще не зареєÑтрувавÑÑ Ð°Ð±Ð¾ не ÑкориÑтавÑÑ Ð·Ð°Ñ€ÐµÑ”Ñтрованим ім'Ñм. Тому ми вимушені викориÑтовувати [[IP-адреÑу]] Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ ідентифікації. Одна IP-адреÑа може викориÑтовуватиÑÑ Ð´ÐµÐºÑ–Ð»ÑŒÐºÐ¾Ð¼Ð° кориÑтувачами. Якщо ви - анонімний кориÑтувач Ñ– вважаєте, що отримали коментарі, адреÑовані не вам, будь лаÑка [[Спеціальні:Вхід_в_ÑиÑтему|зареєÑтруйтеÑÑŒ або ввійдіть в ÑиÑтему Ñк зареєÑтрований кориÑтувач]], щоб в майбутньому уникнути можливої плутанини з іншими анонімними кориÑтувачами.''",
"noarticletext" => "(Ðа даний момент текÑÑ‚ в цієї Ñтатті відÑутній)",
"updated" => "(Оновлена)",
-"note" => "<strong>ЗауваженнÑ:</strong> ",
+"note" => "<strong>ЗауваженнÑ:</strong>",
"previewnote" => "Зверніть увагу, - це тільки попередній переглÑд, Ñ– текÑÑ‚ ще не збережено!",
"previewconflict" => "Цей попередній переглÑд відображає текÑÑ‚ з вікна Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ðº, Ñк він буде виглÑдіти, Ñкщо ви вирішите запиÑати його.",
"editing" => "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ $1",
@@ -369,7 +369,7 @@ GNU Free Documentation License без незмінюваних Ñекцій
Можливо також, що ви допуÑтили опечатку в запиті.
Попробуйте інший запит.",
"matchtotals" => "Запиту \"$1\" відповідає(ÑŽÑ‚ÑŒ) $2 назва(и) Ñтатті(ей) й текÑти $3 Ñтатті(ей).",
-"noexactmatch" => "Статті з такою назвою не Ñ–Ñнує, проводитьÑÑ Ð¿Ð¾ÑˆÑƒÐº по вÑьому текÑту. ",
+"noexactmatch" => "Статті з такою назвою не Ñ–Ñнує, проводитьÑÑ Ð¿Ð¾ÑˆÑƒÐº по вÑьому текÑту.",
"titlematches" => "Збіг в назвах Ñтатей",
"notitlematches" => "Ðемає збігу в назвах Ñтатей",
"textmatches" => "Збіг в текÑтах Ñтатей",
@@ -402,7 +402,7 @@ $2 Показувати Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐŸÐ¾ÑˆÑƒÐº на $3 $9",
"dateformat" => "Формат дати",
"math_failure" => "Ðеможливо розібрати вираз",
"math_unknown_error" => "невідома помилка",
-"math_unknown_function" => "невідома Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ ",
+"math_unknown_function" => "невідома функціÑ",
"math_lexing_error" => "лекÑична помилка",
"math_syntax_error" => "ÑинтакÑична помилка",
"saveprefs" => "Зберегти наÑтройки",
@@ -654,7 +654,7 @@ $3...
"exblank" => "ÑÑ‚Ð°Ñ‚Ñ‚Ñ Ð±ÑƒÐ»Ð° пуÑта",
"confirmdelete" => "Підтвердити вилученнÑ",
"deletesub" => "(\"$1\" вилучаєтьÑÑ)",
-"historywarning" => "ПопередженнÑ: СтаттÑ, Ñку ви збираєтеÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸, має журнал редагувань: ",
+"historywarning" => "ПопередженнÑ: СтаттÑ, Ñку ви збираєтеÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸, має журнал редагувань:",
"confirmdeletetext" => "Ви оÑÑŒ-оÑÑŒ назавжди вилучите Ñтаттю чи файл Ñ– вÑÑ– Ñ—Ñ— журнали редагувань з бази даних.
Будь-лаÑка, підтвердіть, що ви бажаєте зробити це, що ви повніÑÑ‚ÑŽ розумієте наÑлідки й що ви робите це в відповідноÑÑ‚Ñ– з
[[{{ns:project}}:Правила|правилами {{SITENAME}}]].",
@@ -675,9 +675,9 @@ $3...
"rollbacklink" => "відкинути",
"cantrollback" => "Ðеможливо відкинути редагуваннÑ; оÑтанній хто редагував Ñ” єдиним автором цієї Ñтатті.",
"rollbackfailed" => "Відкинути зміни не вдалоÑÑ",
-"alreadyrolled" => "Ðеможливо відкинути оÑтанні Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ [[$1]],
+"alreadyrolled" => "Ðеможливо відкинути оÑтанні Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ [[:$1]],
зроблені [[User:$2|$2]] ([[User talk:$2|Talk]]); хтоÑÑŒ інший вже змінив чи відкинув Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— Ñтатті.
-ОÑтані Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ñ€Ð¾Ð±Ð¸Ð² [[User:$3|$3]] ([[User talk:$3|Talk]]). ",
+ОÑтані Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ñ€Ð¾Ð±Ð¸Ð² [[User:$3|$3]] ([[User talk:$3|Talk]]).",
# only shown if there is an edit comment
"editcomment" => "Ð ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð¾Ð²Ð°Ð½Ð¾ так: \"<i>$1</i>\".",
"revertpage" => "Відкинуть вÑÑ– Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ зробленого $1",
@@ -728,7 +728,7 @@ $3...
Ðище вкажіть конкретную причину (наприклад, процитуйте деÑкі Ñтатті з ознаками вандалізму).",
"ipaddress" => "IP-адреÑа/Ð†Ð¼Ñ ÐºÐ¾Ñ€Ð¸Ñтувача",
"ipbreason" => "Причина",
-"ipbsubmit" => "Заблокувати доÑтуп цьому кориÑтувачу ",
+"ipbsubmit" => "Заблокувати доÑтуп цьому кориÑтувачу",
"badipaddress" => "КориÑтувача з таким іменем не Ñ–Ñнує.",
"blockipsuccesssub" => "Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð²ÐµÐ´ÐµÐ½Ð¾",
"blockipsuccesstext" => "\"$1\" заблоковано.
diff --git a/languages/messages/MessagesVec.php b/languages/messages/MessagesVec.php
index 40168355..ddc2da78 100644
--- a/languages/messages/MessagesVec.php
+++ b/languages/messages/MessagesVec.php
@@ -77,7 +77,8 @@ $messages = array(
'oct' => 'Oto',
'nov' => 'Nov',
'dec' => 'Diç',
-'categories' => '{{PLURAL:$1|Categoria|Categorie}}',
+'categories' => 'Categorie',
+'pagecategories' => '{{PLURAL:$1|Categoria|Categorie}}',
'category_header' => 'Voçi n\'te ła categoria "$1"',
'mainpage' => 'Paxèna prinzsipałe',
'mainpagetext' => '\'\'\'MediaWiki xè stà instałà con sucesso.\'\'\'',
@@ -682,7 +683,7 @@ Par cortesia, conferma che l\'è to intenzsion proçedere a tałe scancełazsion
'rollback' => 'Usa una revisione precedente',
'rollbackfailed' => 'Rollback non riuzsio',
'cantrollback' => 'No xè mia possibiłe tornar a na verzsión precedente: l\'ultima modifica xè stà apportà da l\'unico utente che gà laorà a stò arthicoło.',
-'alreadyrolled' => 'Non xè mia possibile effettuare el rollback de [[$1]] da [[User:$2|$2]] ([[User talk:$2|discussion]]); qualcun altro gà xà modificà o effetuà el rollback de sta voçe. L\'ultima modefega l\'è stà fata da [[User:$3|$3]] ([[User talk:$3|discussion]]).',
+'alreadyrolled' => 'Non xè mia possibile effettuare el rollback de [[:$1]] da [[User:$2|$2]] ([[User talk:$2|discussion]]); qualcun altro gà xà modificà o effetuà el rollback de sta voçe. L\'ultima modefega l\'è stà fata da [[User:$3|$3]] ([[User talk:$3|discussion]]).',
'editcomment' => 'El commento a la modifica xera: "<i>$1</i>".',
'revertpage' => 'Anułate łe modifeghe de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]]), riportà a ła verzsion preçedente de [[User:$1|$1]]',
'protectlogpage' => 'Log de protezsión',
@@ -856,7 +857,7 @@ Tute łe operazsion de importazsion trans-wiki łe xè registrae nel [[Special:L
'importuploaderror' => 'El caricamento de le imamgini xè falío, forse parché el file l\'è pì grosso del quel che xè permesso.',
'importlogpage' => 'Importazsion',
'importlogpagetext' => 'Registro de łe importazsion d\'uffiçio de paxène provenienti da altre wiki, complete de cronołogia.',
-'import-logentry-upload'=> 'gà importà $1 tramite upload',
+'import-logentry-upload'=> 'gà importà [[$1]] tramite upload',
'import-logentry-upload-detail'=> '{{PLURAL:$1|una revixion importà|$1 revixion importae}}',
'import-logentry-interwiki'=> 'gà trasferio da altra wiki ła paxèna $1',
'import-logentry-interwiki-detail'=> '{{PLURAL:$1|una revixion importà|$1 revixion importae}} da $2',
@@ -865,7 +866,7 @@ Tute łe operazsion de importazsion trans-wiki łe xè registrae nel [[Special:L
'tooltip-minoredit' => 'Segnała come modifega minore [alt-i]',
'tooltip-save' => 'Salva Å‚e modifeghe [alt-s]',
'tooltip-preview' => 'Anteprima de łe modifeghe (consilià, prima de salvare!) [alt-p]',
-'tooltip-diff' => 'Varda Å‚e modifeghe apportae al testo. [alt-d]',
+'tooltip-diff' => 'Varda Å‚e modifeghe apportae al testo. [alt-v]',
'tooltip-compareselectedversions'=> 'Varda łe diferenzse tra łe do verzsion selezsionà de sta paxèna. [alt-v]',
'notacceptable' => 'El server wiki non xè in grado di fornire i dati in un formato łeggibiłe dal client utilixà.',
'anonymous' => 'Utente(/i) anonimo(/i) de {{SITENAME}}',
@@ -891,7 +892,7 @@ Tute łe operazsion de importazsion trans-wiki łe xè registrae nel [[Special:L
'rcpatroldisabled' => 'Recent Changes Patrol disabled',
'markedaspatrollederror'=> 'Impossibiłe contrassegnare ła voçe come verificà',
'markedaspatrollederrortext'=> 'Occorre speçificare na revixion da contrazsegnare come verificà.',
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'La me paxèna utente\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'La paxèna utente de l\'ip che te stè usando\');
@@ -902,7 +903,7 @@ Tute łe operazsion de importazsion trans-wiki łe xè registrae nel [[Special:L
ta[\'pt-mycontris\'] = new Array(\'y\',\'La lista de i me contributi\');
ta[\'pt-login\'] = new Array(\'o\',\'Te consigliemo de registrarte, ma non l\'è obbligatorio.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Te consigliemo de registrarte, ma non l\'è obbligatorio.\');
- ta[\'pt-logout\'] = new Array(\'o\',\'Log out (esci)\');
+ ta[\'pt-logout\'] = new Array(\'\',\'Log out (esci)\');
ta[\'ca-talk\'] = new Array(\'t\',\'Varda łe discussion rełative a la voçe\');
ta[\'ca-edit\'] = new Array(\'e\',\'Te podi modificar sta paxèna. Per favor usa el botton de anteprima prima de salvare.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Xonta un commento a sta discussion.\');
diff --git a/languages/messages/MessagesVi.php b/languages/messages/MessagesVi.php
index 77f0956a..db0e7316 100644
--- a/languages/messages/MessagesVi.php
+++ b/languages/messages/MessagesVi.php
@@ -88,15 +88,43 @@ $magicWords = array(
'revisionid' => array( 1, 'REVISIONID' , 'Sá»BẢN' ),
);
+$datePreferences = array(
+ 'default',
+ 'vi normal',
+ 'vi longmonth',
+ 'vi shortcolon',
+ 'vi short',
+ 'ISO 8601',
+);
+
+$defaultDateFormat = 'vi normal';
+
$dateFormats = array(
- MW_DATE_DEFAULT => 'Không lá»±a chá»n',
- 1 => '16:12, tháng 1 ngày 15 năm 2001',
- 2 => '16:12, ngày 15 tháng 1 năm 2001',
- 3 => '16:12, năm 2001 tháng 1 ngày 15',
- 4 => '',
- MW_DATE_ISO => '2001-01-15 16:12:34'
+ 'vi normal time' => 'H:i',
+ 'vi normal date' => '"ngày" j M "năm" Y',
+ 'vi normal both' => 'H:i, "ngày" j M "năm" Y',
+
+ 'vi longmonth time' => 'H:i',
+ 'vi longmonth date' => '"ngày" j F "năm" Y',
+ 'vi longmonth both' => 'H:i, "ngày" j F "năm" Y',
+
+ 'vi shortcolon time' => 'H:i',
+ 'vi shortcolon date' => 'j/n/Y',
+ 'vi shortcolon both' => 'H:i, j/n/Y',
+
+ 'vi short time' => 'H"h"i',
+ 'vi short date' => 'j/n/Y',
+ 'vi short both' => 'H"h"i, j/n/Y',
+);
+
+$datePreferenceMigrationMap = array(
+ 'default',
+ 'vi normal',
+ 'vi normal',
+ 'vi normal',
);
+
$linkTrail = "/^([a-zàâçéèêîôûäëïöüùÇÉÂÊÎÔÛÄËÃÖÜÀÈÙ]+)(.*)$/sDu";
$separatorTransformTable = array(',' => '.', '.' => ',' );
@@ -143,18 +171,18 @@ $messages = array(
'thursday' => 'thứ năm',
'friday' => 'thứ sáu',
'saturday' => 'thứ bảy',
-'january' => 'tháng 1',
-'february' => 'tháng 2',
-'march' => 'tháng 3',
-'april' => 'tháng 4',
-'may_long' => 'tháng 5',
-'june' => 'tháng 6',
-'july' => 'tháng 7',
-'august' => 'tháng 8',
-'september' => 'tháng 9',
-'october' => 'tháng 10',
-'november' => 'tháng 11',
-'december' => 'tháng 12',
+'january' => 'tháng Một',
+'february' => 'tháng Hai',
+'march' => 'tháng Ba',
+'april' => 'tháng Tư',
+'may_long' => 'tháng Năm',
+'june' => 'tháng Sáu',
+'july' => 'tháng Bảy',
+'august' => 'tháng Tám',
+'september' => 'tháng Chín',
+'october' => 'tháng MÆ°á»i',
+'november' => 'tháng MÆ°á»i má»™t',
+'december' => 'tháng MÆ°á»i hai',
'jan' => 'tháng 1',
'feb' => 'tháng 2',
'mar' => 'tháng 3',
@@ -170,6 +198,7 @@ $messages = array(
# Bits of text used by many pages:
'categories' => 'Thể loại',
+'pagecategories' => 'Thể loại',
'category_header' => 'Các bài trong Thể loại "$1"',
'subcategories' => 'Tiểu thể loại',
'subcategorycount' => 'Thể loại này có $1 tiểu thể loại.',
@@ -800,7 +829,7 @@ Những sửa đổi đối với trang này và trang thảo luận của nó s
'rollbacklink' => 'quay lại',
'rollbackfailed' => 'Không quay lại được',
'cantrollback' => 'Không quay lại được; trang này có 1 tác giả.',
-'alreadyrolled' => "Không thể quay lại phiên bản của [[$1]] bởi [[Thành_viên:$2|$2]] ([[Thảo_luận_thành_viên:$2|Thảo luận]]). Äã có sá»­a đổi lần cuối bởi [[Thành_viên:$3|$3]] ([[Thảo_luận_thành_viên:$3|Thảo luận]]).",
+'alreadyrolled' => "Không thể quay lại phiên bản của [[:$1]] bởi [[Thành_viên:$2|$2]] ([[Thảo_luận_thành_viên:$2|Thảo luận]]). Äã có sá»­a đổi lần cuối bởi [[Thành_viên:$3|$3]] ([[Thảo_luận_thành_viên:$3|Thảo luận]]).",
# only shown if there is an edit comment
'editcomment' => "Tóm lược sửa đổi: \"<i>$1</i>\".",
'revertpage' => "đã hủy sửa đổi của $2, quay vỠphiên bản của $1",
@@ -1080,9 +1109,9 @@ Nếu không phải bạn, đừng mở địa chỉ này. Mã xác nhận này
'userjspreview' => "'''Bạn đang xem thử trang Javascript và nó chưa được lưu !'''",
# stylesheets
-'Monobook.css' => '/* edit this file to customize the monobook skin for the entire site */',
+'monobook.css' => '/* edit this file to customize the monobook skin for the entire site */',
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* tooltips and access keys */
+'monobook.js' => '/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'Trang của tôi\');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'Trang của IP bạn đang dùng\');
@@ -1093,7 +1122,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Thay đổi của các trang tôi theo
ta[\'pt-mycontris\'] = new Array(\'y\',\'Äóng góp của tôi\');
ta[\'pt-login\'] = new Array(\'o\',\'Äăng nhập sẽ có lợi hÆ¡n, tuy nhiên không bắt buá»™c.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Không đăng nhập vẫn tham gia được, tuy nhiên đăng nhập sẽ lợi hơn.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Äăng xuất\');
+ta[\'pt-logout\'] = new Array(\'\',\'Äăng xuất\');
ta[\'ca-talk\'] = new Array(\'t\',\'Thảo luận vỠtrang này\');
ta[\'ca-edit\'] = new Array(\'e\',\'Bạn có thể sửa được trang này. Xin xem thử trước khi lưu.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Thêm bình luận vào đây.\');
@@ -1274,7 +1303,7 @@ Bài với tên "[[$1]]" đã tồn tại. Bạn có muốn xóa nó để di ch
'templatesused' => 'Các tiêu bản dùng trong trang này',
'thumbsize' => 'Kích thÆ°á»›c thu nhá»:&nbsp;',
-'tooltip-diff' => 'Xem thay đổi bạn đã thực hiện [alt-d]',
+'tooltip-diff' => 'Xem thay đổi bạn đã thực hiện [alt-v]',
'tryexact' => 'Thử tìm đoạn văn khớp chính xác với từ khóa',
'upload_directory_read_only' => 'Thư mục tải lên không ghi vào được',
'uploadvirus' => 'Tệp tin có virút: $1',
diff --git a/languages/messages/MessagesVls.php b/languages/messages/MessagesVls.php
new file mode 100644
index 00000000..48441838
--- /dev/null
+++ b/languages/messages/MessagesVls.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * West Flemish (West-Vlams)
+ *
+ * @package MediaWiki
+ * @subpackage Language
+*/
+
+$namespaceNames = array(
+ NS_MEDIA => 'Media',
+ NS_SPECIAL => 'Specioal',
+ NS_MAIN => '',
+ NS_TALK => 'Discuusje',
+ NS_USER => 'Gebruker',
+ NS_USER_TALK => 'Discuusje_gebruker',
+ # NS_PROJECT set by $wgMetaNamespace
+ NS_PROJECT_TALK => 'Discuusje_$1',
+ NS_IMAGE => 'Ofbeeldienge',
+ NS_IMAGE_TALK => 'Discuusje_ofbeeldienge',
+ NS_MEDIAWIKI => 'MediaWiki',
+ NS_MEDIAWIKI_TALK => 'Discuusje_MediaWiki',
+ NS_TEMPLATE => 'Patrôon',
+ NS_TEMPLATE_TALK => 'Discuusje_patrôon',
+ NS_HELP => 'Ulpe',
+ NS_HELP_TALK => 'Discuusje_ulpe',
+ NS_CATEGORY => 'Categorie',
+ NS_CATEGORY_TALK => 'Discuusje_categorie',
+);
+
+?>
diff --git a/languages/messages/MessagesWa.php b/languages/messages/MessagesWa.php
index 010290ba..282e350b 100644
--- a/languages/messages/MessagesWa.php
+++ b/languages/messages/MessagesWa.php
@@ -141,7 +141,8 @@ $messages = array(
# Bits of text used by many pages:
#
-'categories' => '{{PLURAL:$1|Categoreye|Categoreyes}}',
+'categories' => 'Categoreyes',
+'pagecategories' => '{{PLURAL:$1|Categoreye|Categoreyes}}',
'category_header' => 'Årtikes el categoreye «$1»',
'subcategories' => 'Dizo-categoreyes',
#'linkprefix' => '/^(.*?)([a-zA-Z\x80-\xff]+)$/sD',
@@ -1099,7 +1100,7 @@ djivêye des dierins disfaçaedjes.',
'deletecomment' => 'Råjhon do disfaçaedje',
'imagereverted' => 'Li rmetaedje del modêye di dvant a stî comifåt.',
'cantrollback' => 'Dji n\' sai disfé les candjmints; li dierin contribouweu est li seu oteur po cist årtike ci.',
-'alreadyrolled' => 'Dji n\' sai disfé li dierin candjmint di [[$1]]
+'alreadyrolled' => 'Dji n\' sai disfé li dierin candjmint di [[:$1]]
fwait pa [[{{ns:user}}:$2|$2]] ([[{{ns:user_talk}}:$2|Copene]]);
ene sakî d\' ôte a ddja candjî l\' årtike ou ddja rmetou l\' modêye di dvant.
@@ -1377,8 +1378,8 @@ Dins ç\' dierin cas, vos ploz eto eployî ene hårdêye, eg: [[{{ns:special}}:E
'tooltip-watch' => 'Radjouter cisse pådje ci a vosse djivêye des shuvous [alt-w]',
# stylesheets
-'Monobook.css' => '/* candjî ci fitchî ci po candjî l\' foye di stîle eyet l\' rivnance del waibe etire */',
-#'Monobook.js' => '/* candjî ci fitchî ci po candjî l\' javascripe do stîle monobook */',
+'monobook.css' => '/* candjî ci fitchî ci po candjî l\' foye di stîle eyet l\' rivnance del waibe etire */',
+#'monobook.js' => '/* candjî ci fitchî ci po candjî l\' javascripe do stîle monobook */',
# Metadata
'notacceptable' => 'Li sierveu wiki èn vos pout nén dner les dnêyes dins ene cogne ki vosse cliyint sait lére.',
@@ -1418,7 +1419,7 @@ Dins ç\' dierin cas, vos ploz eto eployî ene hårdêye, eg: [[{{ns:special}}:E
# NOTE: les apostrofes divèt esse escapêyes.
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* <pre> <nowiki> */
+'monobook.js' => '/* <pre> <nowiki> */
/* tooltips and access keys */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'PÃ¥dje d\\\' uzeu da minne\');
@@ -1430,7 +1431,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'Li djivêye des pådjes ki vos shujhoz
ta[\'pt-mycontris\'] = new Array(\'y\',\'Djivêye des ovraedjes da minne\');
ta[\'pt-login\'] = new Array(\'o\',\'Vos estoz ecoraedjî d\\\' vos elodjî, mins nerén, c\\\' est nén oblidjî.\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'Vos estoz ecoraedjî d\\\' vos elodjî, mins nerén, c\\\' est nén oblidjî.\');
-ta[\'pt-logout\'] = new Array(\'o\',\'Vos dislodjî\');
+ta[\'pt-logout\'] = new Array(\'\',\'Vos dislodjî\');
ta[\'ca-talk\'] = new Array(\'t\',\'Copene åd fwait do contnou del pådje\');
ta[\'ca-edit\'] = new Array(\'e\',\'Vos ploz candjî cisse pådje ci. S\\\' i vs plait, eployîz l\\\' boton «Vey divant» po vs acertiner k\\\' tot est comifåt dvant d\\\' schaper vos candjmints.\');
ta[\'ca-addsection\'] = new Array(\'+\',\'Radjouter on comintaire a cisse copene ci.\');
@@ -1738,7 +1739,6 @@ $1',
'confirm_purge_button' => '\'l est bon',
'youhavenewmessagesmulti' => 'Vos avoz des noveas messaedjes so $1',
-#'newtalkseperator' => ',_',
'searchcontaining' => 'Cweri après des årtikes k\' ont «\'\'$1\'\'» å dvins.',
'searchnamed' => 'Cweri après des årtikes lomés «\'\'$1\'\'».',
'articletitles' => 'Årtikes ki cmincèt avou «\'\'$1\'\'»',
diff --git a/languages/messages/MessagesYi.php b/languages/messages/MessagesYi.php
index 12c287de..19a307df 100644
--- a/languages/messages/MessagesYi.php
+++ b/languages/messages/MessagesYi.php
@@ -45,6 +45,122 @@ $defaultUserOptionOverrides = array(
'quickbar' => 2,
);
+/**
+ * Magic words.
+ * Disabling the Hebrew ones.
+ */
+$magicWords = array(
+ 'redirect' => array( 0, '#REDIRECT' ),
+ 'notoc' => array( 0, '__NOTOC__' ),
+ 'nogallery' => array( 0, '__NOGALLERY__' ),
+ 'forcetoc' => array( 0, '__FORCETOC__' ),
+ 'toc' => array( 0, '__TOC__' ),
+ 'noeditsection' => array( 0, '__NOEDITSECTION__' ),
+ 'start' => array( 0, '__START__' ),
+ 'currentmonth' => array( 1, 'CURRENTMONTH' ),
+ 'currentmonthname' => array( 1, 'CURRENTMONTHNAME' ),
+ 'currentmonthnamegen' => array( 1, 'CURRENTMONTHNAMEGEN' ),
+ 'currentmonthabbrev' => array( 1, 'CURRENTMONTHABBREV' ),
+ 'currentday' => array( 1, 'CURRENTDAY' ),
+ 'currentday2' => array( 1, 'CURRENTDAY2' ),
+ 'currentdayname' => array( 1, 'CURRENTDAYNAME' ),
+ 'currentyear' => array( 1, 'CURRENTYEAR' ),
+ 'currenttime' => array( 1, 'CURRENTTIME' ),
+ 'currenthour' => array( 1, 'CURRENTHOUR' ),
+ 'localmonth' => array( 1, 'LOCALMONTH' ),
+ 'localmonthname' => array( 1, 'LOCALMONTHNAME' ),
+ 'localmonthnamegen' => array( 1, 'LOCALMONTHNAMEGEN' ),
+ 'localmonthabbrev' => array( 1, 'LOCALMONTHABBREV' ),
+ 'localday' => array( 1, 'LOCALDAY' ),
+ 'localday2' => array( 1, 'LOCALDAY2' ),
+ 'localdayname' => array( 1, 'LOCALDAYNAME' ),
+ 'localyear' => array( 1, 'LOCALYEAR' ),
+ 'localtime' => array( 1, 'LOCALTIME' ),
+ 'localhour' => array( 1, 'LOCALHOUR' ),
+ 'numberofpages' => array( 1, 'NUMBEROFPAGES' ),
+ 'numberofarticles' => array( 1, 'NUMBEROFARTICLES' ),
+ 'numberoffiles' => array( 1, 'NUMBEROFFILES' ),
+ 'numberofusers' => array( 1, 'NUMBEROFUSERS' ),
+ 'pagename' => array( 1, 'PAGENAME' ),
+ 'pagenamee' => array( 1, 'PAGENAMEE' ),
+ 'namespace' => array( 1, 'NAMESPACE' ),
+ 'namespacee' => array( 1, 'NAMESPACEE' ),
+ 'talkspace' => array( 1, 'TALKSPACE' ),
+ 'talkspacee' => array( 1, 'TALKSPACEE' ),
+ 'subjectspace' => array( 1, 'SUBJECTSPACE', 'ARTICLESPACE' ),
+ 'subjectspacee' => array( 1, 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+ 'fullpagename' => array( 1, 'FULLPAGENAME' ),
+ 'fullpagenamee' => array( 1, 'FULLPAGENAMEE' ),
+ 'subpagename' => array( 1, 'SUBPAGENAME' ),
+ 'subpagenamee' => array( 1, 'SUBPAGENAMEE' ),
+ 'basepagename' => array( 1, 'BASEPAGENAME' ),
+ 'basepagenamee' => array( 1, 'BASEPAGENAMEE' ),
+ 'talkpagename' => array( 1, 'TALKPAGENAME' ),
+ 'talkpagenamee' => array( 1, 'TALKPAGENAMEE' ),
+ 'subjectpagename' => array( 1, 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+ 'subjectpagenamee' => array( 1, 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+ 'msg' => array( 0, 'MSG:' ),
+ 'subst' => array( 0, 'SUBST:' ),
+ 'msgnw' => array( 0, 'MSGNW:' ),
+ 'end' => array( 0, '__END__' ),
+ 'img_thumbnail' => array( 1, 'thumbnail', 'thumb' ),
+ 'img_manualthumb' => array( 1, 'thumbnail=$1', 'thumb=$1'),
+ 'img_right' => array( 1, 'right' ),
+ 'img_left' => array( 1, 'left' ),
+ 'img_none' => array( 1, 'none' ),
+ 'img_width' => array( 1, '$1px' ),
+ 'img_center' => array( 1, 'center', 'centre' ),
+ 'img_framed' => array( 1, 'framed', 'enframed', 'frame' ),
+ 'img_page' => array( 1, 'page=$1', 'page $1' ),
+ 'int' => array( 0, 'INT:' ),
+ 'sitename' => array( 1, 'SITENAME' ),
+ 'ns' => array( 0, 'NS:' ),
+ 'localurl' => array( 0, 'LOCALURL:' ),
+ 'localurle' => array( 0, 'LOCALURLE:' ),
+ 'server' => array( 0, 'SERVER' ),
+ 'servername' => array( 0, 'SERVERNAME' ),
+ 'scriptpath' => array( 0, 'SCRIPTPATH' ),
+ 'grammar' => array( 0, 'GRAMMAR:' ),
+ 'notitleconvert' => array( 0, '__NOTITLECONVERT__', '__NOTC__'),
+ 'nocontentconvert' => array( 0, '__NOCONTENTCONVERT__', '__NOCC__'),
+ 'currentweek' => array( 1, 'CURRENTWEEK' ),
+ 'currentdow' => array( 1, 'CURRENTDOW' ),
+ 'localweek' => array( 1, 'LOCALWEEK' ),
+ 'localdow' => array( 1, 'LOCALDOW' ),
+ 'revisionid' => array( 1, 'REVISIONID' ),
+ 'revisionday' => array( 1, 'REVISIONDAY' ),
+ 'revisionday2' => array( 1, 'REVISIONDAY2' ),
+ 'revisionmonth' => array( 1, 'REVISIONMONTH' ),
+ 'revisionyear' => array( 1, 'REVISIONYEAR' ),
+ 'revisiontimestamp' => array( 1, 'REVISIONTIMESTAMP' ),
+ 'plural' => array( 0, 'PLURAL:' ),
+ 'fullurl' => array( 0, 'FULLURL:' ),
+ 'fullurle' => array( 0, 'FULLURLE:' ),
+ 'lcfirst' => array( 0, 'LCFIRST:' ),
+ 'ucfirst' => array( 0, 'UCFIRST:' ),
+ 'lc' => array( 0, 'LC:' ),
+ 'uc' => array( 0, 'UC:' ),
+ 'raw' => array( 0, 'RAW:' ),
+ 'displaytitle' => array( 1, 'DISPLAYTITLE' ),
+ 'rawsuffix' => array( 1, 'R' ),
+ 'newsectionlink' => array( 1, '__NEWSECTIONLINK__' ),
+ 'currentversion' => array( 1, 'CURRENTVERSION' ),
+ 'urlencode' => array( 0, 'URLENCODE:' ),
+ 'anchorencode' => array( 0, 'ANCHORENCODE' ),
+ 'currenttimestamp' => array( 1, 'CURRENTTIMESTAMP' ),
+ 'localtimestamp' => array( 1, 'LOCALTIMESTAMP' ),
+ 'directionmark' => array( 1, 'DIRECTIONMARK', 'DIRMARK' ),
+ 'language' => array( 0, '#LANGUAGE:' ),
+ 'contentlanguage' => array( 1, 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+ 'pagesinnamespace' => array( 1, 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+ 'numberofadmins' => array( 1, 'NUMBEROFADMINS' ),
+ 'formatnum' => array( 0, 'FORMATNUM' ),
+ 'padleft' => array( 0, 'PADLEFT' ),
+ 'padright' => array( 0, 'PADRIGHT' ),
+ 'special' => array( 0, 'special', ),
+ 'defaultsort' => array( 1, 'DEFAULTSORT:' ),
+);
+
$messages = array(
'tog-usenewrc' => 'פֿ×ַרבעסערטע "לעצטע ענדערונגען" (JavaScript)',
'tog-watchdefault' => '× ×ָכפֿ×ָלג ×ױט×ָמ×ַטיש די װערטן ×°×ָס ×יך ב×Ö·×ַרבעט',
@@ -82,7 +198,8 @@ Raw signatures (without automatic link)',
'oct' => '×ָקט׳',
'nov' => '× ×ָװ׳',
'dec' => 'דעץ׳',
-'categories' => '{{PLURAL:$1|ק×ַטעג×ָריע|ק×ַטעג×ָריעס}}',
+'categories' => 'ק×ַטעג×ָריעס',
+'pagecategories' => '{{PLURAL:$1|ק×ַטעג×ָריע|ק×ַטעג×ָריעס}}',
'category_header' => '×ַרטיקלען ×ין ק×ַטעג×ָריע "$1"',
'subcategories' => '×ונטערק×ַטעג×ָריעס',
'mainpage' => 'ערשטע זײַט',
@@ -352,12 +469,12 @@ make it easier to pick out.
'revertmove' => 'צוריקדרייען',
'allmessagesname' => '× ×ָמען',
'tooltip-search' => 'זוכן {{SITENAME}} [alt-f]',
-'tooltip-diff' => 'Show which changes you made to the text. [alt-d]',
+'tooltip-diff' => 'Show which changes you made to the text. [alt-v]',
'lastmodifiedatby' => 'די לעצטע ענדערונג פון די בל×ט ××™×– געווען $2, $1 ביי $3.',
'and' => '×ון',
'subcategorycount' => 'ס\'××™×– ד×Ö¸ $1 ×ונטערק×ַטעג×ָריעס צו די ק×ַטעג×ָריע.',
'categoryarticlecount' => 'ס\'××™×– ד×Ö¸ $1 ×ַרטיקלען ×ין די ק×ַטעג×ָריע.',
-'Monobook.js' => '/* <div style="direction: ltr;"><pre> */
+'monobook.js' => '/* <div style="direction: ltr;"><pre> */
var ta = new Object();
ta["pt-userpage"] = [".", "מיין ב×ניצער בל×ט"];
ta["pt-anonuserpage"] = [".", "ב×ניצער בל×ט פון ×נינונימער ב×ניצער"];
@@ -368,7 +485,7 @@ ta["pt-watchlist"] = ["l", "×ויפפּ×סן בלעטער"];
ta["pt-mycontris"] = ["y", "מיינע ב×טייליגונגן"];
ta["pt-login"] = ["o", "ביטע ×יינשרייבן, ×בער עס ××™×– נישט קיין חוב"];
ta["pt-anonlogin"] = ["o", "סבעסער ×יינשרייבן, ×בער עס ××™×– נישט קיין חוב"];
-ta["pt-logout"] = ["o", "זיך ×ויסשרייבן"];
+ta["pt-logout"] = ["", "זיך ×ויסשרייבן"];
ta["ca-talk"] = ["t", "שמועס ×ויף ×“×¢× ×‘×œ×ט"];
ta["ca-edit"] = ["e", "קענסט פ×רעכטן ×“×¢× ×‘×œ×ט. ביטע זיך ב×ניצן מיט קנעפל \"פ×ר×ויסיגע ווייזונג\" בעפ×רן ×ויפהיטן."];
ta["ca-addsection"] = ["+", "לייג צו ×ייער וו×רט צו ×“×¢× ×©×ž×•×¢×¡"];
diff --git a/languages/messages/MessagesZh_cn.php b/languages/messages/MessagesZh_cn.php
index 67c3146c..ce4911bc 100644
--- a/languages/messages/MessagesZh_cn.php
+++ b/languages/messages/MessagesZh_cn.php
@@ -118,6 +118,7 @@ $messages = array(
# Bits of text used by many pages:
#
"categories" => "页é¢åˆ†ç±»",
+"pagecategories" => "页é¢åˆ†ç±»",
"category_header" => "类别â€$1“中的æ¡ç›®",
"subcategories" => "附分类",
"mainpage" => "首页",
@@ -297,7 +298,7 @@ MySQL返回错误 \"<tt>$3: $4</tt>\"。",
"anontalkpagetext" => "---- ''这是一个还未建立å¸å·çš„匿å用户的对è¯é¡µã€‚我们因此åªèƒ½ç”¨[[IP地å€]]æ¥ä¸Žä»–ï¼å¥¹è”络。该IP地å€å¯èƒ½ç”±å‡ å用户共享。如果您是一å匿å用户并认为本页上的评语与您无关,请[[Special:Userlogin|创建新å¸å·æˆ–登录]]以é¿å…在未æ¥äºŽå…¶ä»–匿å用户混淆。''",
"noarticletext" => "(本页目å‰æ²¡æœ‰å†…容)",
"updated" => "(已更新)",
-"note" => "<strong>注æ„:</strong> ",
+"note" => "<strong>注æ„:</strong>",
"previewnote" => "请记ä½è¿™åªæ˜¯é¢„览,内容还未ä¿å­˜ï¼",
"previewconflict" => "这个预览显示了上é¢æ–‡å­—编辑区中的内容。它将在你选择ä¿å­˜åŽå‡ºçŽ°ã€‚",
"editing" => "正在编辑$1",
diff --git a/languages/messages/MessagesZh_tw.php b/languages/messages/MessagesZh_tw.php
index bfa4c37b..74fe1f8d 100644
--- a/languages/messages/MessagesZh_tw.php
+++ b/languages/messages/MessagesZh_tw.php
@@ -81,6 +81,7 @@ $messages = array(
# Bits of text used by many pages:
#
"categories" => "é é¢åˆ†é¡ž",
+"pagecategories" => "é é¢åˆ†é¡ž",
"category_header" => "類別â€$1“中的æ¢ç›®",
"subcategories" => "å­åˆ†é¡ž",
"mainpage" => "首é ",
@@ -202,13 +203,13 @@ MySQL返回錯誤 \"<tt>$3: $4</tt>\"。",
"readonlytext" => "{{SITENAME}}數據庫目å‰ç¦æ­¢è¼¸å…¥æ–°å…§å®¹åŠæ›´æ”¹ï¼Œ
這很å¯èƒ½æ˜¯ç”±æ–¼æ•¸æ“šåº«æ­£åœ¨ç¶­ä¿®ï¼Œä¹‹å¾Œå³å¯æ¢å¾©ã€‚
管ç†å“¡æœ‰å¦‚下解釋:
-<p>$1",
+<p>$1</p>",
"missingarticle" => "數據庫找ä¸åˆ°æ–‡å­—\"$1\"。
-<p>通常這是由於修訂歷å²é ä¸ŠéŽæ™‚çš„éˆæŽ¥åˆ°å·²ç¶“被刪除的é é¢æ‰€å°Žè‡´çš„。
+<p>通常這是由於修訂歷å²é ä¸ŠéŽæ™‚çš„éˆæŽ¥åˆ°å·²ç¶“被刪除的é é¢æ‰€å°Žè‡´çš„。</p>
<p>如果情æ³ä¸æ˜¯é€™æ¨£ï¼Œæ‚¨å¯èƒ½æ‰¾åˆ°äº†è»Ÿä»¶å…§çš„一個臭蟲。
-請記錄下URL地å€ï¼Œä¸¦å‘管ç†å“¡å ±å‘Šã€‚",
+請記錄下URL地å€ï¼Œä¸¦å‘管ç†å“¡å ±å‘Šã€‚</p>",
"internalerror" => "內部錯誤",
"filecopyerror" => "無法複製文件\"$1\"到\"$2\"。",
"filerenameerror" => "無法é‡å‘½å文件\"$1\"到\"$2\"。",
@@ -229,7 +230,7 @@ MySQL返回錯誤 \"<tt>$3: $4</tt>\"。",
"logouttext" => "您ç¾åœ¨å·²ç¶“退出。
您å¯ä»¥ç¹¼çºŒä»¥åŒ¿åæ–¹å¼ä½¿ç”¨{{SITENAME}},或å†æ¬¡ä»¥ç›¸åŒæˆ–ä¸åŒç”¨æˆ¶èº«ä»½ç™»éŒ„。",
-"welcomecreation" => "<h2>歡迎,$1!</h2><p>您的帳號已經建立,ä¸è¦å¿˜è¨˜è¨­ç½®{{SITENAME}}個人åƒæ•¸ã€‚",
+"welcomecreation" => "<h2>歡迎,$1!</h2><p>您的帳號已經建立,ä¸è¦å¿˜è¨˜è¨­ç½®{{SITENAME}}個人åƒæ•¸ã€‚</p>",
"loginpagetitle" => "用戶登錄",
"yourname" => "您的用戶å",
@@ -276,7 +277,7 @@ MySQL返回錯誤 \"<tt>$3: $4</tt>\"。",
"showpreview" => "顯示é è¦½",
"blockedtitle" => "用戶被å°",
"blockedtext" => "您的用戶å或網å€å·²è¢«$1å°ã€‚
-ç†ç”±æ˜¯ï¼š<br />'''$2'''<p>您å¯ä»¥èˆ‡$1å‘其他任何[[{{ns:project}}:管ç†å“¡|管ç†å“¡]]è©¢å•ã€‚",
+ç†ç”±æ˜¯ï¼š<br />'''$2'''<p>您å¯ä»¥èˆ‡$1å‘其他任何[[{{ns:project}}:管ç†å“¡|管ç†å“¡]]è©¢å•ã€‚</p>",
"whitelistedittitle" => "登錄後æ‰å¯ç·¨è¼¯",
"whitelistedittext" => "您必須先[[特殊:登錄]]æ‰å¯ç·¨è¼¯é é¢ã€‚",
"whitelistreadtitle" => "登錄後æ‰å¯é–±è®€",
@@ -294,7 +295,7 @@ MySQL返回錯誤 \"<tt>$3: $4</tt>\"。",
"anontalkpagetext" => "---- ''這是一個還未建立帳號的匿å用戶的å°è©±é ã€‚我們因此åªèƒ½ç”¨[[網å€]]來與他ï¼å¥¹è¯çµ¡ã€‚該網å€å¯èƒ½ç”±å¹¾å用戶共享。如果您是一å匿å用戶並èªç‚ºæœ¬é ä¸Šçš„評語與您無關,請[[特殊:登錄|創建新帳號或登錄]]以é¿å…在未來於其他匿å用戶混淆。''",
"noarticletext" => "(本é ç›®å‰æ²’有內容)",
"updated" => "(已更新)",
-"note" => "<strong>注æ„:</strong> ",
+"note" => "<strong>注æ„:</strong>",
"previewnote" => "請記ä½é€™åªæ˜¯é è¦½ï¼Œå…§å®¹é‚„未ä¿å­˜ï¼",
"previewconflict" => "這個é è¦½é¡¯ç¤ºäº†ä¸Šé¢æ–‡å­—編輯å€ä¸­çš„內容。它將在你é¸æ“‡ä¿å­˜å¾Œå‡ºç¾ã€‚",
"editing" => "正在編輯$1",
@@ -378,7 +379,7 @@ MySQL返回錯誤 \"<tt>$3: $4</tt>\"。",
"searchdisabled" => "<p>{{SITENAME}}內部æœç´¢åŠŸèƒ½ç”±æ–¼é«˜å³°æ™‚段æœå‹™å™¨è¶…載而åœæ­¢ä½¿ç”¨ã€‚
您å¯ä»¥æš«æ™‚通éŽ
<a href=\"http://google.com.tw/\">google</a>æœç´¢{{SITENAME}}。
-è¬è¬æ‚¨çš„è€å¿ƒã€‚",
+è¬è¬æ‚¨çš„è€å¿ƒã€‚</p>",
# Preferences page
#
@@ -457,20 +458,20 @@ MySQL返回錯誤 \"<tt>$3: $4</tt>\"。",
請到<a href=\"" . "{{localurle:Special:Imagelist}}" .
"\">已上載圖åƒåˆ—表</a>.
所有上載與刪除行為都被記錄在<a href=\"" .
-"{{localurle:Project:Upload image}}\">上載紀錄</a>內。
+"{{localurle:Project:Upload image}}\">上載紀錄</a>內。</p>
<p>使用下é¢çš„表單來上載用在æ¢ç›®å…§æ–°çš„圖åƒæ–‡ä»¶ã€‚
在絕大多數ç€è¦½å™¨å…§ï¼Œä½ æœƒçœ‹åˆ°ä¸€å€‹\"ç€è¦½...\"按鈕,點擊它後就會跳出一個打開文件å°è©±æ¡†ã€‚
é¸æ“‡ä¸€å€‹æ–‡ä»¶å¾Œæ–‡ä»¶å將出ç¾åœ¨æŒ‰éˆ•æ—邊的文字框中。
您也必須點擊æ—邊的複é¸æ¡†ç¢ºèªæ‚¨æ‰€ä¸Šè¼‰çš„文件並沒有é•å相關版權法律。
點擊\"上載\" 按鈕完æˆä¸Šè¼‰ç¨‹åºã€‚
-如果您使用的是較慢的網絡連接的話那麼這個上載éŽç¨‹æœƒéœ€è¦ä¸€äº›æ™‚間。
+如果您使用的是較慢的網絡連接的話那麼這個上載éŽç¨‹æœƒéœ€è¦ä¸€äº›æ™‚間。</p>
<p>我們建議照相圖片使用JPEGæ ¼å¼ï¼Œç¹ªåœ–åŠå…¶ä»–圖標圖åƒä½¿ç”¨PNGæ ¼å¼ï¼ŒéŸ³åƒå‰‡ä½¿ç”¨OGGæ ¼å¼ã€‚
請使用具有æ述性的語言來命å您的文件以é¿å…混亂。
è¦åœ¨æ–‡ç« ä¸­åŠ å…¥åœ–åƒï¼Œä½¿ç”¨ä»¥ä¸‹å½¢å¼çš„連接:
<b>[[圖åƒ:檔案.jpg]]</b>或者<b>[[圖åƒ:檔案.png|解釋文字]]</b>
-或<b>[[媒體:檔案.ogg]]</b>來連接音åƒæ–‡ä»¶ã€‚
+或<b>[[媒體:檔案.ogg]]</b>來連接音åƒæ–‡ä»¶ã€‚</p>
<p>請注æ„在{{SITENAME}}é é¢ä¸­ï¼Œå…¶ä»–人å¯èƒ½æœƒç‚ºäº†ç™¾ç§‘全書的利益而編輯或刪除您的上載文件,
-而如果您濫用上載系統,您則有å¯èƒ½è¢«ç¦æ­¢ä½¿ç”¨ä¸Šè¼‰åŠŸèƒ½ã€‚",
+而如果您濫用上載系統,您則有å¯èƒ½è¢«ç¦æ­¢ä½¿ç”¨ä¸Šè¼‰åŠŸèƒ½ã€‚</p>",
"uploadlog" => "上載紀錄",
"uploadlogpage" => "上載紀錄",
"uploadlogpagetext" => "以下是最近上載的文件的一覽表。
@@ -528,7 +529,7 @@ MySQL返回錯誤 \"<tt>$3: $4</tt>\"。",
以åŠæœªé”到æ¢ç›®è³ªé‡çš„é é¢ï¼›é™¤æ­¤ä¹‹å¤–還有 <b>$2</b> é å¯èƒ½æ˜¯åˆä¹Žæ¨™æº–çš„æ¢ç›®ã€‚
<p>從系統軟件å‡ç´šä»¥ä¾†ï¼Œå…¨ç«™é»žå…±æœ‰é é¢ç€è¦½ <b>$3</b> 次,
é é¢ç·¨è¼¯ <b>$4</b> 次,æ¯é å¹³å‡ç·¨è¼¯ <b>$5</b> 次,
-å„次編輯後é é¢çš„æ¯å€‹ç‰ˆæœ¬å¹³å‡ç€è¦½ <b>$6</b> 次。",
+å„次編輯後é é¢çš„æ¯å€‹ç‰ˆæœ¬å¹³å‡ç€è¦½ <b>$6</b> 次。</p>",
# Maintenance Page
#
@@ -564,7 +565,7 @@ MySQL返回錯誤 \"<tt>$3: $4</tt>\"。",
"intl" => "跨語言éˆæŽ¥",
"movethispage" => "移動本é ",
"unusedimagestext" => "<p>請注æ„其他網站(例如其他語言版本的{{SITENAME}})
-有å¯èƒ½ç›´æŽ¥éˆæŽ¥æœ¬åœ–åƒï¼Œæ‰€ä»¥é€™è£åˆ—出的圖åƒæœ‰å¯èƒ½ä¾ç„¶è¢«ä½¿ç”¨ã€‚",
+有å¯èƒ½ç›´æŽ¥éˆæŽ¥æœ¬åœ–åƒï¼Œæ‰€ä»¥é€™è£åˆ—出的圖åƒæœ‰å¯èƒ½ä¾ç„¶è¢«ä½¿ç”¨ã€‚</p>",
"booksources" => "戰外書æº",
"booksourcetext" => "以下是éˆæŽ¥åˆ°éŠ·å”®æ›¸ç±çš„網站列表,
因此有å¯èƒ½æ“有您所尋找的圖書的進一步資料。
@@ -601,14 +602,14 @@ MySQL返回錯誤 \"<tt>$3: $4</tt>\"。",
"watchnologintext" => "您必須先[[Special:Userlogin|登錄]]
æ‰èƒ½æ›´æ”¹æ‚¨çš„監視列表",
"addedwatch" => "加入到監視列表",
-"addedwatchtext" => "本é ï¼ˆâ€œ$1â€ï¼‰å·²ç¶“被加入到您的<a href=\"" .
+"addedwatchtext" => "<p>本é ï¼ˆâ€œ$1â€ï¼‰å·²ç¶“被加入到您的<a href=\"" .
"{{localurle:Special:Watchlist}}\">監視列表</a>中。
未來有關它或它的å°è©±é çš„任何修改將會在本é ä¸­åˆ—出,
而且還會在<a href=\"" .
"{{localurle:Special:Recentchanges}}\">最近更改列表</a>中
以<b>ç²—é«”</b>å½¢å¼åˆ—出。</p>
-<p>如果您之後想將該é é¢å¾žç›£è¦–列表中刪除,點擊導航æ¢ä¸­çš„“åœæ­¢ç›£è¦–â€éˆæŽ¥ã€‚",
+<p>如果您之後想將該é é¢å¾žç›£è¦–列表中刪除,點擊導航æ¢ä¸­çš„“åœæ­¢ç›£è¦–â€éˆæŽ¥ã€‚</p>",
"removedwatch" => "åœæ­¢ç›£è¦–",
"removedwatchtext" => "é é¢â€œ$1â€å·²ç¶“從您的監視é é¢ä¸­ç§»é™¤ã€‚",
"watchthispage" => "監視本é ",
diff --git a/languages/messages/MessagesZh_yue.php b/languages/messages/MessagesZh_yue.php
index f0167244..62fe2a94 100644
--- a/languages/messages/MessagesZh_yue.php
+++ b/languages/messages/MessagesZh_yue.php
@@ -161,10 +161,11 @@ $messages = array(
'tog-editsection' => 'å¯ä»¥ç”¨ [修改] 掣更改個別段è½',
'tog-editsectiononrightclick' => 'å¯ä»¥æ’³å³æŽ£æ›´æ”¹å€‹åˆ¥æ®µè½ï¼ˆJavaScript)',
'tog-showtoc' => '喺多éŽä¸‰å€‹æ®µè½å˜…時候顯示目錄',
-'tog-rememberpassword' => '記ä½å¯†ç¢¼',
+'tog-rememberpassword' => '響呢部電腦度記ä½æˆ‘嘅密碼',
'tog-editwidth' => '全螢幕å’闊嘅修改欄',
'tog-watchcreations' => '將我開嘅é é¢åŠ å…¥ç›£è¦–清單',
'tog-watchdefault' => '將我修改嘅é é¢åŠ å…¥ç›£è¦–清單',
+'tog-watchdeletion' => '將我刪除嘅é é¢åŠ å…¥ç›£è¦–清單',
'tog-minordefault' => '所有編輯é è¨­ç‚ºå°ä¿®æ”¹',
'tog-previewontop' => '喺修改欄上方顯示é è¦½',
'tog-previewonfirst' => '第一次修改時顯示é è¦½',
@@ -179,10 +180,12 @@ $messages = array(
'tog-externaldiff' => 'é è¨­ç”¨å¤–掛比較器',
'tog-showjumplinks' => '啟用 "跳至" å”助連çµ',
'tog-uselivepreview' => '用å³æ™‚é è¦½ï¼ˆJavaScript)(實驗緊)',
-'tog-autopatrol' => '標示我嘅編輯為已經巡查嘅',
'tog-forceeditsummary' => '我冇入修改註解時通知我',
'tog-watchlisthideown' => '響監視清單度隱è—我嘅編輯',
'tog-watchlisthidebots' => '響監視清單度隱è—機械人嘅編輯',
+'tog-watchlisthideminor' => '響監視清單度隱è—å°ä¿®æ”¹',
+'tog-nolangconversion' => 'å””è¦ç”¨å­—轉æ›',
+'tog-ccmeonemails' => '當我寄電郵畀其他人嗰陣寄返å°å‰¯æœ¬ç•€æˆ‘',
'underline-always' => '全部',
'underline-never' => 'æ°¸ä¸',
@@ -244,9 +247,10 @@ $messages = array(
# Bits of text used by many pages:
#
'categories' => '分類',
+'pagecategories' => '分類',
'category_header' => '"$1" 分類中嘅文章',
'subcategories' => '次分類',
-
+'category-media-header' => '響 "$1" 分類嘅媒體',
'mainpage' => '頭版',
'mainpagetext' => "<big>'''MediaWiki 已經æˆåŠŸåœ°å®‰è£ã€‚'''</big>",
@@ -299,14 +303,14 @@ $messages = array(
'privacy' => 'ç§éš±æ”¿ç­–',
'privacypage' => 'Project:ç§éš±æ”¿ç­–',
'errorpagetitle' => '錯誤',
-'returnto' => '返到去$1 。',
+'returnto' => '返去$1 。',
'tagline' => '出自{{SITENAME}}',
'whatlinkshere' => '連çµåšŸå‘¢é“嘅é é¢',
'help' => '幫助',
'search' => 'æµå˜¢',
'searchbutton' => 'æµå˜¢',
'go' => '去',
-'searcharticle' => '去',
+'searcharticle' => '去',
'history' => 'é é¢æ­·å²',
'history_short' => 'æ­·å²',
'updatedmarker' => '我上次到訪之後嘅修改',
@@ -342,7 +346,6 @@ $messages = array(
'viewtalkpage' => 'ç‡è¨Žè«–',
'otherlanguages' => '其它語言',
'redirectedfrom' => '(ç”± $1 é‡æ–°å®šå‘)', //REDIRECT
-'autoredircomment' => 'é‡æ–°å®šå‘緊到[[$1]]',
'redirectpagesub' => 'é‡æ–°å®šå‘é ',
'lastmodifiedat' => '呢一é å˜…最後修改係響$1 $2。',
'viewcount' => '呢一é å·²ç¶“有$1人次ç‡éŽã€‚',
@@ -367,7 +370,7 @@ $messages = array(
'retrievedfrom' => '由 "$1" 接收',
'youhavenewmessages' => '你有$1($2)。',
'newmessageslink' => 'æ–°ä¿¡æ¯',
-'newmessagesdifflink' => 'åŒå‰æ¬¡ä¿®è¨‚嘅差異',
+'newmessagesdifflink' => '上次更改',
'editsection' => '編輯',
'editold' => '編輯',
'editsectionhint' => '編輯å°ç¯€: $1',
@@ -389,27 +392,27 @@ $messages = array(
'nstab-image' => '檔案',
'nstab-mediawiki' => 'ä¿¡æ¯',
'nstab-template' => '模',
-'nstab-help' => '幫助',
+'nstab-help' => '幫助é ',
'nstab-category' => '分類',
# Main script and global functions
#
'nosuchaction' => '冇呢個動作',
'nosuchactiontext' => '呢個 URL 嘅指定動作 wiki 識別唔到',
-'nosuchspecialpage' => '冇呢個特別é ',
-'nospecialpagetext' => '您所è¦æ±‚嘅特別é å””正確,喺 [[{{ns:special}}:Specialpages]] å¯ä»¥æµåˆ°æ‰€æœ‰å¯ç”¨å˜…特別é ä¸€è¦§è¡¨ã€‚',
+'nosuchspecialpage' => '冇呢é ç‰¹åˆ¥é ',
+'nospecialpagetext' => '您所è¦æ±‚嘅特別é å””啱,喺 [[{{ns:special}}:Specialpages]] å¯ä»¥æµåˆ°æ‰€æœ‰ç”¨å¾—嘅特別é ã€‚',
# General errors
#
'error' => '錯誤',
'databaseerror' => '資料庫錯誤',
-'dberrortext' => '資料庫查詢語法發生咗錯誤。
+'dberrortext' => '資料庫查詢語法錯咗。
å’ä¿‚å¯èƒ½æŒ‡å‡ºè»Ÿä»¶ä¸­å¯èƒ½æœ‰è‡­èŸ²ã€‚
最後一次資料庫嘅嘗試係:
<blockquote><tt>$1</tt></blockquote>
於 "<tt>$2</tt>" 功能中。
MySQL 嘅錯誤回應 "<tt>$3: $4</tt>"。',
-'dberrortextcl' => '資料庫查詢語法發生咗錯誤。
+'dberrortextcl' => '資料庫查詢語法錯咗。
最後一次資料庫嘅嘗試係:
"$1"
於 "$2"功能中。
@@ -450,9 +453,8 @@ MySQL 嘅錯誤回應 "$3: $4"',
查詢: $2',
'viewsource' => 'ç‡å“原始碼',
'viewsourcefor' => '$1嘅原始碼',
-'protectedtext' => '呢一é å·²ç¶“鎖咗唔畀改。
-
-ä½ å¯ä»¥ç‡å“或者複製呢一é å˜…原始碼:',
+'protectedpagetext' => '呢一é å·²ç¶“鎖咗唔畀改。',
+'viewsourcetext' => 'ä½ å¯ä»¥ç‡å“或者複製呢一é å˜…原始碼:',
'protectedinterface' => '呢一é æ供軟件嘅介é¢æ–‡å­—,呢一é å·²ç¶“鎖上以é é˜²æ¿«ç”¨ã€‚',
'editinginterface' => "'''警告:'''你而家編輯緊嘅呢一個用嚟æ供介é¢æ–‡å­—嘅é é¢ã€‚響呢一é å˜…更改會影響到其他用戶使用中嘅介é¢å¤–觀。",
'sqlhidden' => '(SQL 查詢隱è—)',
@@ -472,7 +474,7 @@ MySQL 嘅錯誤回應 "$3: $4"',
'yourname' => '用戶å',
'yourpassword' => '密碼',
'yourpasswordagain' => 'å†è¼¸å…¥å¯†ç¢¼',
-'remembermypassword' => '記ä½æˆ‘個密碼',
+'remembermypassword' => '響呢部電腦度記ä½æˆ‘嘅密碼',
'yourdomainname' => '你嘅網域',
'externaldberror' => '外部驗證資料庫出錯,或者唔å…許你更新你嘅外部帳戶。',
'loginproblem' => '<b>你嘅登入手續出咗å•é¡Œã€‚</b><br />唔該å†è©¦å“登入。',
@@ -484,7 +486,7 @@ MySQL 嘅錯誤回應 "$3: $4"',
'logout' => '登出',
'userlogout' => '登出',
'notloggedin' => '未登入',
-'nologin' => '仲未有戶å£ï¼Ÿ $1。',
+'nologin' => 'é‡æœªæœ‰æˆ¶å£ï¼Ÿ $1。',
'nologinlink' => '開一個新嘅戶å£',
'createaccount' => '建立戶å£',
'gotaccount' => '已經有戶å£ï¼Ÿ $1 。',
@@ -527,8 +529,11 @@ MySQL 嘅錯誤回應 "$3: $4"',
'noemail' => '呢度冇用戶 "$1" 嘅電郵地å€è¨˜éŒ„。',
'passwordsent' => '新嘅密碼已經寄咗畀呢ä½ç”¨æˆ¶ "$1" 嘅電郵地å€ã€‚
收到之後請é‡æ–°ç™»å…¥ã€‚',
+'blocked-mailpassword' => '你嘅IP地å€è€Œå®¶è¢«å°éŽ–緊,唔å¯ä»¥ç”¨å¯†ç¢¼å¾©åŽŸåŠŸèƒ½ä»¥é˜²æ­¢æ¿«ç”¨ã€‚',
'eauthentsent' => '確èªé›»éƒµå·²ç¶“傳é€åˆ°æŒ‡å®šå˜…電郵地å€ã€‚
喺其它嘅郵件傳é€åˆ°å‘¢å€‹æˆ¶å£ä¹‹å‰ï¼Œä½ éœ€è¦æŒ‰é›»éƒµå˜…指示,嚟確èªå‘¢å€‹æˆ¶å£çœŸä¿‚屬於你嘅。',
+'throttled-mailpassword' => '一個密碼æ醒已經響$1個é˜é ­ä¹‹å‰ç™¼é€å’—。
+為咗防止濫用,響$1個é˜é ­ä¹‹å…§åªå¯ä»¥ç™¼é€ä¸€å€‹å¯†ç¢¼æ醒。',
'mailerror' => '傳é€é›»éƒµéŒ¯èª¤ï¼š $1',
'acct_creation_throttle_hit' => 'å°å””ä½ï¼Œä½ å·²ç¶“é–‹å’— $1 個戶å£ï¼Œå””å¯ä»¥å†é–‹å¤šå€‹æˆ¶å£ã€‚',
'emailauthenticated' => '你嘅電郵地å€å·²ç¶“å–º $1 確èªã€‚',
@@ -540,6 +545,16 @@ MySQL 嘅錯誤回應 "$3: $4"',
'accountcreated' => '戶å£å·²ç¶“建立咗',
'accountcreatedtext' => '$1 嘅用戶戶å£å·²ç¶“建立好。',
+# Password reset dialog
+'resetpass' => 'é‡è¨­æˆ¶å£å¯†ç¢¼',
+'resetpass_announce' => '你已經用咗一個臨時電郵碼登入。è¦å®Œæˆç™»å…¥ï¼Œä½ ä¸€å®šè¦éŸ¿å‘¢åº¦å®šä¸€å€‹æ–°å˜…密碼:',
+'resetpass_header' => 'é‡è¨­å¯†ç¢¼',
+'resetpass_submit' => '設定密碼åŒç™»å…¥',
+'resetpass_success' => '你嘅密碼已經æˆåŠŸå’更改ï¼è€Œå®¶å¹«ä½ ç™»å…¥ç·Š...',
+'resetpass_bad_temporary' => '唔啱嘅臨時密碼。你å¯èƒ½å·²ç¶“æˆåŠŸå’更改你嘅密碼,åˆæˆ–者é‡æ–°è«‹æ±‚éŽä¸€å€‹æ–°å˜…臨時密碼。',
+'resetpass_forbidden' => '響呢個wiki度唔å¯ä»¥æ›´æ”¹å¯†ç¢¼',
+'resetpass_missing' => '響資料度æµå””到嘢。',
+
# Edit page toolbar
'bold_sample' => '粗體字',
'bold_tip' => '粗體字',
@@ -566,16 +581,19 @@ MySQL 嘅錯誤回應 "$3: $4"',
#
'summary' => '摘è¦',
'subject' => '主題ï¼æ¨™é¡Œ',
-'minoredit' => '呢個係一個å°ä¿®æ”¹',
+'minoredit' => '呢個係å°ä¿®æ”¹',
'watchthis' => 'ç‡å¯¦å‘¢ä¸€é ',
-'savearticle' => '儲存é é¢',
+'savearticle' => '儲存呢é ',
'preview' => 'é è¦½',
'showpreview' => '顯示é è¦½',
'showlivepreview' => '實時é è¦½',
-'showdiff' => '顥示差異',
-'anoneditwarning' => "'''警告:'''你仲未登入。你嘅 IP ä½å€æœƒå–ºå‘¢å€‹é é¢å˜…修訂歷å²ä¸­è¨˜éŒ„è½åšŸã€‚",
-'missingsummary' => "'''æ醒:''' 你未有æ供一個編輯摘è¦ã€‚如果你å†å™¤å¤šä¸€ä¸‹å„²å­˜å˜…話,å’你嘅編輯就會喺唔包括編輯摘è¦ä¸‹å„²å­˜ã€‚",
+'showdiff' => '顯示差異',
+'anoneditwarning' => "'''警告:'''ä½ é‡æœªç™»å…¥ã€‚你嘅 IP ä½å€æœƒå–ºå‘¢å€‹é é¢å˜…修訂歷å²ä¸­è¨˜éŒ„è½åšŸã€‚",
+'missingsummary' => "'''æ醒:''' 你未æ供編輯摘è¦ã€‚如果你å†æ’³å¤šä¸€ä¸‹å„²å­˜å˜…話,å’你儲存嘅編輯就會無摘è¦ã€‚",
'missingcommenttext' => '請輸入一個註解。',
+'missingcommentheader' => "'''æ醒:'''你響呢個註解度並無æ供一個主題ï¼æ¨™é¡Œã€‚如果你å†æ’³ä¸€æ¬¡å„²å­˜ï¼Œä½ å˜…編輯就會無題。",
+'summary-preview' => '摘è¦é è¦½',
+'subject-preview' => '標題ï¼é ­æ¢é è¦½',
'blockedtitle' => '用戶已經å°éŽ–',
'blockedtext' => "<big>你嘅用戶å或者 IP ä½å€å·²ç¶“被 $1 å°å’—。</big>
@@ -584,7 +602,7 @@ MySQL 嘅錯誤回應 "$3: $4"',
ä½ å¯ä»¥è¯çµ¡ $1 或者其他嘅[[Project:管ç†å“¡|管ç†å“¡]],討論呢次å°éŽ–。
除éžä½ å·²ç¶“響你嘅[[Special:Preferences|戶å£å–œå¥½è¨­å®š]]å…¥é¢è¨­å®šå’—有效嘅電郵地å€ï¼Œ
-å¦å‰‡ä½ ä¿‚å””å¯ä»¥ç”¨ã€Œé›»éƒµå‘¢å€‹ç”¨æˆ¶ã€å˜…功能。你嘅 IP ä½å€ä¿‚ $3 。 請你喺所有查詢都註明呢個ä½å€ã€‚",
+å¦å‰‡ä½ ä¿‚å””å¯ä»¥ç”¨ã€Œé›»éƒµå‘¢å€‹ç”¨æˆ¶ã€å˜…功能。你嘅 IP ä½å€ä¿‚ $3 ,而個å°éŽ– ID ä¿‚ #$5。 請你喺所有查詢都註明呢個ä½å€åŒåŸ‹ï¼æˆ–者個å°éŽ– ID 。",
'blockedoriginalsource' => "有關'''$1'''嘅原始碼響下é¢åˆ—示:",
'blockededitsource' => "有關'''ä½ '''å°'''$1'''嘅'''編輯'''文字響下é¢åˆ—示:",
'whitelistedittitle' => '需è¦ç™»å…¥ä¹‹å¾Œå…ˆè‡³å¯ä»¥ç·¨è¼¯',
@@ -602,20 +620,20 @@ MySQL 嘅錯誤回應 "$3: $4"',
'accmailtext' => '「$1ã€å˜…密碼已經寄咗去 $2。',
'newarticle' => '(æ–°)',
'newarticletext' =>
-"你連連éŽåšŸå˜…é é¢ä»²æœªå­˜åœ¨ã€‚
+"你連連éŽåšŸå˜…é é¢é‡æœªå­˜åœ¨ã€‚
è¦èµ·ç‰ˆæ–°å˜…,請您喺下é¢å—°æ ¼åº¦è¼¸å…¥ã€‚
(ç‡ç‡[[{{ns:help}}:目錄|自助版]]拎多啲資料。)
如果你係唔覺æ„嚟到呢度,撳一次你個ç€è¦½å™¨'''返轉頭'''個掣。",
-'anontalkpagetext' => "----''呢度係匿å用戶嘅討論é ï¼Œä½¢å¯èƒ½ä¿‚仲未開戶å£ï¼Œæˆ–者佢仲唔識開戶å£ã€‚我哋會用數字表示嘅IP地å€åšŸä»£è¡¨ä½¢ã€‚一個IP地å€ä¿‚å¯ä»¥ç”±å¹¾å€‹ç”¨æˆ¶å¤¾ä¾†ç”¨ã€‚如果你係匿å用戶,åŒè¦ºå¾—呢啲留言係åŒä½ å†‡é—œä¿‚嘅話,唔該去[[Apecial:Userlogin|開一個新戶å£æˆ–登入]],é¿å…喺以後嘅留言會åŒåŸ‹å…¶å®ƒç”¨æˆ¶æ··æ·†ã€‚''",
+'anontalkpagetext' => "----''呢度係匿å用戶嘅討論é ï¼Œä½¢å¯èƒ½ä¿‚é‡æœªé–‹æˆ¶å£ï¼Œæˆ–者佢é‡å””識開戶å£ã€‚我哋會用數字表示嘅IP地å€åšŸä»£è¡¨ä½¢ã€‚一個IP地å€ä¿‚å¯ä»¥ç”±å¹¾å€‹ç”¨æˆ¶å¤¾ä¾†ç”¨ã€‚如果你係匿å用戶,åŒè¦ºå¾—呢啲留言係åŒä½ å†‡é—œä¿‚嘅話,唔該去[[Special:Userlogin|開一個新戶å£æˆ–登入]],é¿å…喺以後嘅留言會åŒåŸ‹å…¶å®ƒç”¨æˆ¶æ··æ·†ã€‚''",
'noarticletext' => '喺呢一é è€Œå®¶ä¸¦å†‡ä»»ä½•å˜…文字,你å¯ä»¥å–ºå…¶å®ƒå˜…é é¢ä¸­[[{{ns:special}}:Search/{{PAGENAME}}|æµå‘¢ä¸€é å˜…標題]]或者[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編輯呢一é ]。',
'clearyourcache' => "'''注æ„:'''喺儲存之後,你å¯èƒ½è¦å…ˆç•¥éŽä½ å˜…ç€è¦½å™¨å¿«å–去ç‡åˆ°æ›´æ”¹ã€‚'''Mozilla / Firefox / Safari:''' ã©’ä½''Shift''掣å†æ’³''é‡æ–°è¼‰å…¥'',åˆæˆ–者㩒''Ctrl-Shift-R''(喺蘋果Mac中㩒''Cmd-Shift-R''掣); '''IE:''' ã©’ä½''Ctrl''掣å†æ’³''é‡æ–°æ•´ç†'',åˆæˆ–者㩒''Ctrl-F5''掣; '''Konqueror:''' å°±å’以撳個''é‡è¼‰''掣,åˆæˆ–者㩒''F5''ï¼› '''Opera'''嘅用戶å¯èƒ½éœ€è¦å…ˆå–º''工具→喜好設定''之中清佢哋嘅快å–。",
'usercssjsyoucanpreview' => '<strong>æ示:</strong>響儲存å‰ï¼Œç”¨ã€Œé¡¯ç¤ºé è¦½ã€å€‹æŽ£åšŸæ¸¬è©¦ä½ å˜…æ–°CSS/JS。',
'usercsspreview' => '\'\'\'請注æ„你而家åªä¿‚é è¦½ç·Šä½ å˜…用戶CSS樣å¼è¡¨ï¼Œå…§å®¹ä»æœªå„²å­˜ï¼\'\'\'',
-'userjspreview' => '\'\'\'請注æ„你而家åªä¿‚測試ï¼é è¦½ç·Šä½ å®šç¾©å˜…JavaScript,佢嘅內容仲未儲存ï¼\'\'\'',
+'userjspreview' => '\'\'\'請注æ„你而家åªä¿‚測試ï¼é è¦½ç·Šä½ å®šç¾©å˜…JavaScript,佢嘅內容é‡æœªå„²å­˜ï¼\'\'\'',
'userinvalidcssjstitle' => "'''警告:''' 未有å稱 \"$1\" 嘅皮。請記ä½è‡ªè¨‚介é¢çš„ .css å’Œ .js é é¢æ™‚應使用細楷,例如:User:Foo/monobook.css 而唔係 User:Foo/Monobook.css 。",
'updated' => '(Updated)',
'note' => '<strong>Note:</strong>',
-'previewnote' => '<strong>請記ä½å‘¢å€‹åªä¿‚é è¦½ï¼›æ›´æ”¹å˜…内容仲未儲存ï¼</strong>',
+'previewnote' => '<strong>請記ä½å‘¢å€‹åªä¿‚é è¦½ï¼›æ›´æ”¹å˜…内容é‡æœªå„²å­˜ï¼</strong>',
'session_fail_preview' => '<strong>å°å””ä½ï¼ç”±æ–¼å°ç¯€å˜…資料唔見咗,我哋唔能夠處ç†ä½ å˜…編輯。
è«‹å†è©¦éŽå–‡ã€‚如果ä»ç„¶å””得嘅話,試下登出,然後é‡æ–°ç™»å…¥ã€‚</strong>',
'previewconflict' => '呢個é è¦½ä¿‚å映如果你é¸æ“‡å„²å­˜å˜…話,嘅上é¢å˜…文字編輯å€è£é¢å˜…字會儲存è½åšŸã€‚',
@@ -623,10 +641,10 @@ MySQL 嘅錯誤回應 "$3: $4"',
\'\'由於哩個 wiki 已經開放咗原 HTML 碼,é è¦½å·²ç¶“éš±è—è½åšŸä»¥é é˜² JavaScript 嘅攻擊。\'\'
-<strong>如果呢個係正當嘅編輯嘗試,請å†è©¦éŽã€‚如果仲係唔得嘅話,請先登出然後å†ç™»å…¥ã€‚</strong>',
+<strong>如果呢個係正當嘅編輯嘗試,請å†è©¦éŽã€‚如果é‡ä¿‚唔得嘅話,請先登出然後å†ç™»å…¥ã€‚</strong>',
'importing' => '而家喺度滙入$1',
'editing' => '而家喺度編輯$1',
-'editinguser' => '而家喺度編輯$1',
+'editinguser' => '而家喺度編輯用戶<b>$1</b>',
'editingsection' => '而家喺度編輯$1 (å°ç¯€ï¼‰',
'editingcomment' => '而家喺度編輯$1 (評論)',
'editconflict' => '編輯è¡çªï¼š$1',
@@ -656,10 +674,19 @@ MySQL 嘅錯誤回應 "$3: $4"',
'protectedpagewarning' => "<strong>警告:呢版已經å—到ä¿è­·ï¼Œæœ‰ç®¡ç†å“¡æ¬Šé™å˜…用戶先至å¯ä»¥æ”¹ã€‚</strong>",
'semiprotectedpagewarning' => "'''注æ„:'''呢一é å·²ç¶“鎖咗,åªæœ‰å·²ç¶“註冊嘅用戶先至å¯ä»¥æ”¹ã€‚",
'templatesused' => '喺呢一é æ‰€ç”¨å˜…模:',
+'templatesusedpreview' => '喺呢一次é è¦½æ‰€ç”¨å˜…模:',
+'templatesusedsection' => '喺呢一å°ç¯€æ‰€ç”¨å˜…模:',
'edittools' => '<!-- 喺呢度嘅文字會喺編輯框下é¢åŒåŸ‹ä¸Šè¼‰è¡¨æ ¼ä¸­é¡¯ç¤ºã€‚ -->',
'nocreatetitle' => 'é é¢å»ºç«‹è¢«é™åˆ¶',
'nocreatetext' => '呢個網站已經é™åˆ¶å’—起新版嘅能力。
ä½ å¯ä»¥ç•ªè½‰é ­åŽ»ç·¨è¼¯ä¸€å•²å·²ç¶“存在嘅é é¢ï¼Œæˆ–者[[Special:Userlogin|登入或開個新戶å£]]。',
+
+# "Undo" feature
+'undo-success' => '呢個編輯已經å–消。請確èªä¸€ä¸‹ï¼Œè·Ÿä½å„²å­˜ä¸‹é¢å˜…更改。',
+'undo-failure' => '呢個編輯唔能夠å–消,由於åŒé€”中嘅編輯有è¡çªã€‚',
+'undo-summary' => 'å–消由[[Special:Contributions/$2|$2]] ([[User talk:$2|å°è©±]])所åšå˜…修訂 $1',
+
+# Account creation failure
'cantcreateaccounttitle' => 'å””å¯ä»¥é–‹æ–°æˆ¶å£',
'cantcreateaccounttext' => '由呢個IPåœ°å€ (<b>$1</b>) 嘅新戶å£å·²ç¶“被å°éŽ–。
å’å¯èƒ½ä¿‚你嘅學校或者網絡供應商 (ISP) 所用嘅 IP地å€æŒçºŒå’進行破壞。',
@@ -675,7 +702,7 @@ MySQL 嘅錯誤回應 "$3: $4"',
'loadhist' => '攞緊版嘅歷å²',
'currentrev' => '家下嘅版本',
'revisionasof' => '喺$1嘅修訂',
-'old-revision-navigation' => '喺$1嘅修訂; $5<br />($6) $3 | $2 | $4 ($7)',
+'revision-info' => '喺$1嘅修訂;修訂自$2',
'previousrevision' => 'â†ä¹‹å‰å˜…修訂',
'nextrevision' => '新啲嘅修訂→',
'currentrevisionlink' => '家下嘅修訂版本',
@@ -713,7 +740,7 @@ MySQL 嘅錯誤回應 "$3: $4"',
#
'revisiondelete' => '刪除ï¼å刪除修訂',
'revdelete-nooldid-title' => '無目標修訂',
-'revdelete-nooldid-text' => '你仲未指定一個或多個修訂去進行呢個功能。',
+'revdelete-nooldid-text' => 'ä½ é‡æœªæŒ‡å®šä¸€å€‹æˆ–多個修訂去進行呢個功能。',
'revdelete-selected' => 'æ€[[:$1]]嘅修訂:',
'revdelete-text' => "刪除咗嘅修訂係會ä»ç„¶å‡ºç¾å–ºå€‹é é¢æ­·å²åº¦ï¼Œ
但係佢哋嘅文字內容係唔å¯ä»¥ä¾›å…¬çœ¾ç€è¦½ã€‚
@@ -738,6 +765,8 @@ MySQL 嘅錯誤回應 "$3: $4"',
'selectnewerversionfordiff' => 'é¸æ“‡ä¸€å€‹æ–°å•²å˜…版本åšå€‹æ¯”較',
'selectolderversionfordiff' => 'é¸æ“‡ä¸€å€‹èˆŠå•²å˜…版本åšå€‹æ¯”較',
'compareselectedversions' => '比較被é¸å˜…版本',
+'editundo' => '復原',
+'diff-multi' => "(當中有$1次嘅修訂唔會顯示。)",
# Search results
#
@@ -773,7 +802,7 @@ MySQL 嘅錯誤回應 "$3: $4"',
#
'preferences' => '喜好設定',
'mypreferences' => '我嘅喜好設定',
-'prefsnologin' => '仲未登入',
+'prefsnologin' => 'é‡æœªç™»å…¥',
'prefsnologintext' => "你一定è¦åŽ»[[Special:Userlogin|登入]]設定好用戶喜好值先。",
'prefsreset' => '喜好設定已經從儲存空間中é‡è¨­ã€‚',
'qbsettings' => 'å¿«æ·åˆ—',
@@ -884,7 +913,7 @@ MySQL 嘅錯誤回應 "$3: $4"',
'uploadbtn' => '上載檔案',
'reupload' => 'å†ä¸Šè¼‰',
'reuploaddesc' => '返到去上載表格。',
-'uploadnologin' => '仲未登入',
+'uploadnologin' => 'é‡æœªç™»å…¥',
'uploadnologintext' => "你必須先[[Special:Userlogin|登入]]去上載檔案。",
'upload_directory_read_only' => '嗰個上載嘅目錄 ($1) 而家唔能夠被網é ä¼ºæœå™¨å¯«å…¥ã€‚',
'uploaderror' => '上載錯誤',
@@ -911,7 +940,7 @@ MySQL 嘅錯誤回應 "$3: $4"',
'illegalfilename' => '檔å「$1ã€å«æœ‰é é¢æ¨™é¡Œæ‰€å””å…許嘅字。請試下改檔åå†ä¸Šè¼‰ã€‚',
'badfilename' => '檔å已經更改æˆã€Œ$1ã€ã€‚',
'badfiletype' => "「.$1ã€å””係建議使用嘅圖åƒæª”案格å¼ã€‚",
-'largefile' => '建議檔案嘅大細唔好超éŽ$1bytes,呢個檔案有$2bytes',
+'largefile' => '建議檔案嘅大細唔好大éŽ$1bytes,呢個檔案有$2bytes',
'largefileserver' => '呢個檔案超éŽå’—伺æœå™¨è¨­å®šå…許嘅大細。',
'emptyfile' => '你上載嘅檔案似乎係空嘅。噉樣å¯èƒ½ä¿‚因為你打錯咗個檔å。請檢查å“你係唔係真係è¦ä¸Šè¼‰å‘¢å€‹æª”案。',
'fileexists' => '呢個檔å已經存在,如果您唔肯定係唔係è¦æ›´æ”¹$1,請先檢查佢。',
@@ -934,6 +963,16 @@ MySQL 嘅錯誤回應 "$3: $4"',
'destfilename' => '目標檔å',
'watchthisupload' => '監視呢é ',
'filewasdeleted' => '呢個檔案所使用嘅å曾經上載後,跟ä½å°±åˆªé™¤å’—。你應該響é‡æ–°ä¸Šè¼‰ä½¢ä¹‹å‰æª¢æŸ¥å“$1。',
+'upload-proto-error' => '唔正確嘅å”è­°',
+'upload-proto-error-text' => 'é™é ä¸Šè¼‰éœ€è¦ä¸€å€‹ä»¥ <code>http://</code> 或者 <code>ftp://</code> 作為開頭嘅URL。',
+'upload-file-error' => '內部錯誤',
+'upload-file-error-text' => '當響伺æœå™¨åº¦å»ºç«‹ä¸€å€‹æš«å­˜æª”時發生咗一個內部錯誤。請è¯çµ¡ä¸€ä½ç³»çµ±ç®¡ç†å“¡ã€‚',
+'upload-misc-error' => '未知嘅上載錯誤',
+'upload-misc-error-text' => '響上載時發生咗未知嘅錯誤。請確èªè¼¸å…¥å’—嘅URLä¿‚å¯ä»¥è¨ªå•å˜…,之後å†è©¦å¤šä¸€æ¬¡ã€‚如果é‡æœ‰å•é¡Œå˜…話,請è¯çµ¡ä¸€ä½ç³»çµ±ç®¡ç†å“¡ã€‚',
+'upload-curl-error6' => "å””å¯ä»¥åˆ°å—°å€‹URL",
+'upload-curl-error6-text' => '輸入嘅URL唔能夠去到。請é‡æ–°æª¢æŸ¥å€‹URL係正確嘅åŒåŸ‹å€‹ç¶²ç«™ä¿‚已經上綫。',
+'upload-curl-error28' => '上載é‡æ™‚',
+'upload-curl-error28-text' => '個網站用咗太多時間回應。請檢查個網站已經係上咗綫,等多一陣然後å†è©¦éŽã€‚ä½ å¯ä»¥éŸ¿å†‡å’ç¹å¿™å˜…時間å†è©¦ã€‚',
'license' => 'å”è­°',
'nolicense' => '未æ€',
@@ -1004,10 +1043,10 @@ MySQL 嘅錯誤回應 "$3: $4"',
'statistics' => '統計',
'sitestats' => '{{SITENAME}}嘅統計',
'userstats' => '用戶統計',
-'sitestatstext' => "資料庫中而家有'''$1'''個é é¢ã€‚
-其中包括咗「討論ã€é é¢ã€é—œæ–¼{{SITENAME}}嘅é é¢ã€ç´°å°å˜…「楔ä½ã€
-文章ã€é‡æ–°å®šå‘, 以åŠå…¶ä»–唔計入內容é å˜…é é¢ã€‚
-唔計éžå…§å®¹é åœ¨å…§ï¼Œå‰‡ç¸½å…±æœ‰'''$2'''個é é¢å¯èƒ½æœƒè¨ˆå…¥æ­£è¦å˜…內容é ã€‚
+'sitestatstext' => "資料庫中而家有'''$1'''é ã€‚
+其中包括咗「討論ã€é ã€é—œæ–¼{{SITENAME}}嘅é ã€å¥½çŸ­å˜…「楔ä½ã€
+文章ã€é‡æ–°å®šå‘, 以åŠå…¶ä»–唔計入內容嘅é ã€‚
+唔計éžå…§å®¹é åœ¨å…§ï¼Œå‰‡ç¸½å…±æœ‰'''$2'''é å¯èƒ½æœƒè¨ˆå…¥æ­£è¦å˜…內容。
'''$8''' 個檔案已經上載。
@@ -1018,7 +1057,7 @@ MySQL 嘅錯誤回應 "$3: $4"',
'userstatstext' => "ç›®å‰æœ‰'''$1'''個註冊用戶,其中有'''$2'''人(å³'''$4%''')係$5。",
'statistics-mostpopular' => '最多人ç‡å˜…é ',
-'disambiguations' => '分æµ(消除多é‡æ„義)é ',
+'disambiguations' => '分æµ(一辭多義辨別)é ',
'disambiguationspage' => 'Template:disambig',
'disambiguationstext' => "以下呢啲é é¢é€£çµåŽ»ä¸€å€‹<i>分æµé </i>。佢哋先至應該指去正確嘅主題。<br />如果一個é é¢é€£çµè‡ª$1,噉就會當佢係分æµé ã€‚<br />其它空間å嘅連çµ<i>唔會</i>列到喺呢度。",
@@ -1065,7 +1104,7 @@ MySQL 嘅錯誤回應 "$3: $4"',
'spheading' => '所有用戶嘅特別é ',
'restrictedpheading' => '有é™åˆ¶å˜…特別é ',
'recentchangeslinked' => '連çµé å˜…更改',
-'rclsub' => "(ç”±\"$1\"己經連çµå˜…é é¢)",
+'rclsub' => "(ç”±\"$1\"已經連çµå˜…é é¢)",
'newpages' => 'æ–°é é¢',
'newpages-username' => '用戶å:',
'ancientpages' => '舊é é¢',
@@ -1076,14 +1115,18 @@ MySQL 嘅錯誤回應 "$3: $4"',
因此喺呢度用緊嘅圖åƒå¯èƒ½æœƒä»ç„¶å–ºå‘¢åº¦åˆ—示。</p>',
'unusedcategoriestext' => '以下ç¾å­˜åˆ†é¡žé é¢å­˜åœ¨ï¼Œä½†æœªæœ‰å…¶å®ƒå˜…é é¢æˆ–者分類去用佢哋。',
+# Book sources
'booksources' => '書ç±ä¾†æº',
+'booksources-search-legend' => 'æµæ›¸æº',
+'booksources-isbn' => 'ISBN:',
+'booksources-go' => '去',
+'booksources-text' => '以下嘅連çµæ¸…單列出其它一啲賣新書åŒäºŒæ‰‹æ›¸å˜…網站,
+å¯èƒ½å¯ä»¥æ供到有關你想æµå˜…書嘅更多資料:',
+
'categoriespagetext' => '喺呢個 wiki 中存在ä½ä»¥ä¸‹å˜…分類。',
'data' => '資料',
'userrights' => '用戶權é™ç®¡ç†',
'groups' => '用戶組',
-
-'booksourcetext' => "以下嘅連çµæ¸…單列出其它一啲賣新書åŒäºŒæ‰‹æ›¸å˜…網站,
-å¯èƒ½å¯ä»¥æ供到有關你想æµå˜…書嘅更多資料。",
'isbn' => 'ISBN',
'alphaindexline' => "$1到$2",
'version' => '版本',
@@ -1095,6 +1138,7 @@ MySQL 嘅錯誤回應 "$3: $4"',
# Special:Allpages
'nextpage' => 'ä¸‹ä¸€é  ($1)',
+'prevpage' => 'ä¸Šä¸€é  ($1)',
'allpagesfrom' => '顯示以下ä½ç½®é–‹å§‹å˜…é é¢ï¼š',
'allarticles' => '所有文章',
'allinnamespace' => '所有é é¢ï¼ˆå–º$1空間åå…¥é¢ï¼‰', //“namespaceâ€å¤§é™¸è¬›æ³•ä¿‚“å稱空間
@@ -1108,7 +1152,7 @@ MySQL 嘅錯誤回應 "$3: $4"',
# Special:Listusers
'listusersfrom' => '顯示由呢個字開始嘅用戶:',
-# E this user
+# Email this user
#
'mailnologin' => '冇傳é€åœ°å€',
'mailnologintext' => "你一定è¦[[Special:Userlogin|登入咗]]
@@ -1119,21 +1163,23 @@ MySQL 嘅錯誤回應 "$3: $4"',
'emailpagetext' => '如果呢ä½ç”¨æˆ¶å·²ç¶“喺佢嘅用戶使用å好入邊填咗個åˆæ³•å˜…電郵地å€ï¼Œä»¥ä¸‹è¡¨æ ¼æœƒç™¼é€å–®å–®ä¸€æ¢è¨Šæ¯ã€‚
你喺你嘅用戶喜好設定入é¢å¡«å¯«å˜…電郵地å€æœƒå‡ºç¾å–ºå‘¢å°é›»éƒµã€Œç”±ã€å˜…地å€åº¦ï¼Œä»¥ä¾¿æ”¶ä»¶äººå¯ä»¥å›žè¦†åˆ°ã€‚',
'usermailererror' => '目標郵件地å€è¿”回錯誤:',
-'defemailsubject' => "{{SITENAME}} e-mail",
-'noemailtitle' => 'No e-mail address',
-'noemailtext' => '呢個用戶仲指指定一個有效嘅電郵電å€ï¼Œ
+'defemailsubject' => "{{SITENAME}} 電郵",
+'noemailtitle' => '無電郵地å€',
+'noemailtext' => '呢個用戶é‡æŒ‡æŒ‡å®šä¸€å€‹æœ‰æ•ˆå˜…電郵電å€ï¼Œ
åˆæˆ–者佢æ€å’—唔收其他用戶畀佢嘅電郵。',
'emailfrom' => 'ç”±',
'emailto' => '到',
'emailsubject' => '主題',
'emailmessage' => 'ä¿¡æ¯',
'emailsend' => '傳é€',
+'emailccme' => '傳é€ä¸€å€‹æˆ‘嘅信æ¯é›»éƒµç•€æˆ‘。',
+'emailccsubject' => '複製你嘅信æ¯åˆ° $1: $2',
'emailsent' => '電郵已傳é€',
'emailsenttext' => '你嘅電郵訊æ¯å·²å‚³é€ã€‚',
# Watchlist
'watchlist' => '我張監視清單',
-'watchlistfor' => "(用戶「'''$1'''ã€å˜…監視清單) ",
+'watchlistfor' => "(用戶「'''$1'''ã€å˜…監視清單)",
'nowatchlist' => '你嘅監視清單度並冇任何項目。',
'watchlistanontext' => 'è«‹å…ˆ$1去ç‡æˆ–者改響你監視清單度嘅項目。',
'watchlistcount' => "'''你有 $1 個項目喺你嘅監視清單度,包括埋å°è©±é ã€‚'''",
@@ -1173,9 +1219,16 @@ MySQL 嘅錯誤回應 "$3: $4"',
'wlnote' => '以下係最近<b>$2</b>å°æ™‚å…¥é¢å˜…最新$1次修改。',
'wlshowlast' => '顯示最近 $1 å€‹é˜ $2 æ—¥ $3 嘅修改',
'wlsaved' => '呢個係您嘅監視清單入é¢å„²å­˜å’—嘅版本。',
-'wlhideshowown' => '$1我嘅編輯。',
-'wlhideshowbots' => '$1機械人嘅編輯。',
+'watchlist-show-bots' => '顯示機械人嘅編輯',
+'watchlist-hide-bots' => 'éš±è—機械人嘅編輯',
+'watchlist-show-own' => '顯示我嘅編輯',
+'watchlist-hide-own' => 'éš±è—我嘅編輯',
+'watchlist-show-minor' => '顯示å°ä¿®æ”¹',
+'watchlist-hide-minor' => 'éš±è—å°ä¿®æ”¹',
'wldone' => '完æˆã€‚',
+# Displayed when you click the "watch" button and it's in the process of watching
+'watching' => '監視緊...',
+'unwatching' => 'å””å†ç›£è¦–ç·Š...',
'enotif_mailer' => '{{SITENAME}}通知郵éžå“¡',
'enotif_reset' => '將所有é é¢æ¨™æˆå·²è¦–察',
@@ -1211,7 +1264,7 @@ wiki: $PAGEEDITOR_WIKI
'deletepage' => '刪除é é¢',
'confirm' => '確èª',
'excontent' => "內容係:'$1'",
-'excontentauthor' => "內容係:'$1' (而且唯一嘅貢ç»è€…ä¿‚'$2')",
+'excontentauthor' => "內容係:'$1' (而且唯一嘅貢ç»è€…ä¿‚'[[Special:Contributions/$2|$2]]')",
'exbeforeblank' => "喺清空之å‰å˜…內容係:'$1'",
'exblank' => 'é é¢ä¹‹å‰ä¿‚空嘅',
'confirmdelete' => '確èªåˆªé™¤',
@@ -1234,7 +1287,7 @@ wiki: $PAGEEDITOR_WIKI
'rollbacklink' => '還原',
'rollbackfailed' => '還原失敗',
'cantrollback' => '還原唔到;上一ä½è²¢ç»è€…係唯一修改éŽå‘¢ç‰ˆå˜…人。',
-'alreadyrolled' => "無法å轉[[User:$2|$2]]([[User talk:$2|留言]])å°[[$1]]嘅最後編輯;
+'alreadyrolled' => "無法å轉[[User:$2|$2]]([[User talk:$2|留言]])å°[[:$1]]嘅最後編輯;
有人已經修改éŽæˆ–者å轉咗呢個é é¢ã€‚
上次編輯係由[[User:$3|$3]]([[User talk:$3|留言]])åšå˜…。",
@@ -1280,11 +1333,13 @@ wiki: $PAGEEDITOR_WIKI
è¦æ¢å¾©å·²ç¶“é¸æ“‡å’—嘅修訂,將è¦æ¢å¾©ä»£è¡¨æœ‰é—œä¿®è¨‚嘅核é¸ç›’剔上,å†æ’³'''''æ¢å¾©'''''。撳'''''é‡è¨­'''''會清除註解文字åŒåŸ‹å…¨éƒ¨å˜…æ ¸é¸ç›’。",
'undeletearticle' => 'æ¢å¾©åˆªé™¤å’—嘅é é¢',
'undeleterevisions' => "$1嘅修改都已經存檔",
+'undeleterevision-missing' => "唔正確或者éºå¤±å’—修訂。你å¯èƒ½æœ‰ä¸€å€‹å£žé€£çµï¼Œ
+或者嗰個修訂已經響存檔度æ¢å¾©å’—或者刪除咗。",
'undeletehistory' => '如果你æ¢å¾©å‘¢å€‹é é¢ï¼Œä½¢å˜…所有修改歷å²éƒ½æœƒæ¢å¾©è¿”到嗰篇é é¢å˜…æ­·å²åº¦ã€‚
如果喺佢刪除之後åˆæ–°é–‹å’—åŒå嘅é é¢ï¼Œä½ æ¢å¾©å˜…修改歷å²æœƒé¡¯ç¤ºå–ºå…ˆå‰æ­·å²åº¦ï¼Œ
æ–°é é¢è€Œå®¶å˜…修改唔會自動覆蓋咗去。',
'undeletehistorynoadmin' => '呢篇文已經刪咗。刪除嘅原因喺下é¢å˜…摘è¦åº¦ï¼Œ
-連åŒä»²æœ‰åˆªé™¤ä¹‹å‰ç·¨è¼¯éŽå‘¢å€‹é é¢å˜…用戶嘅詳細資料。
+連åŒé‡æœ‰åˆªé™¤ä¹‹å‰ç·¨è¼¯éŽå‘¢å€‹é é¢å˜…用戶嘅詳細資料。
所刪除嘅版本嘅實際內容得管ç†å“¡å¯ä»¥ç‡åˆ°ã€‚',
'undeleterevision' => "已經刪除咗$1嘅修訂",
'undeletebtn' => 'æ¢å¾©',
@@ -1345,6 +1400,7 @@ wiki: $PAGEEDITOR_WIKI
'ipbreason' => '原因',
'ipbanononly' => 'åªä¿‚å°åŒ¿å用戶',
'ipbcreateaccount' => '防止開新戶å£',
+'ipbenableautoblock' => '自動å°éŽ–呢個用戶上次用éŽå˜…IP地å€ï¼ŒåŒåŸ‹ä½¢åœ°åšéŽç·¨è¼¯å˜…地å€',
'ipbsubmit' => 'å°éŽ–å‘¢ä½ç”¨æˆ¶',
'ipbother' => '其它時間',
'ipboptions' => '兩個é˜é ­:2 hours,一日:1 day,三日:3 days,一個禮拜:1 week,兩個禮拜:2 weeks,一個月:1 month,三個月:3 months,六個月:6 months,一年:1 year,終身:infinite',
@@ -1362,6 +1418,7 @@ wiki: $PAGEEDITOR_WIKI
'infiniteblock' => 'ä¸è¨­æœŸé™',
'expiringblock' => '$1 期滿',
'anononlyblock' => 'åªé™åŒ¿å',
+'noautoblockblock' => '自動å°éŽ–已經åœç”¨',
'createaccountblock' => 'å°å’—開新戶å£',
'ipblocklistempty' => 'å°éŽ–å單係空嘅。',
'blocklink' => 'å°',
@@ -1380,9 +1437,9 @@ wiki: $PAGEEDITOR_WIKI
'ipb_cant_unblock' => '錯誤:æµå””到å°éŽ–ID$1。å¯èƒ½å·²ç¶“解å°å’—。',
'proxyblockreason' => '你嘅IP係一個公開(指任何人都å¯ä»¥ç”¨ï¼Œç„¡é ˆèº«ä»½èªè­‰ï¼Ÿï¼‰å˜…代ç†åœ°å€ï¼Œå› æ­¤è¢«å°éŽ–。請è¯çµ¡ä½ å˜…Internetæœå‹™æ供商或技術支æ´ï¼Œå‘佢哋報告呢個嚴é‡å˜…安全å•é¡Œã€‚',
'proxyblocksuccess' => '完æˆã€‚',
-'sorbs' => 'SORBS DNSBL',
-'sorbsreason' => '你嘅IP地å€å·²ç¶“ç•€[http://www.sorbs.net SORBS] DNSBL列咗åšå…¬é–‹ä»£ç†ã€‚',
-'sorbs_create_account_reason' => '你嘅IP地å€å·²ç¶“ç•€[http://www.sorbs.net SORBS] DNSBL列咗åšå…¬é–‹ä»£ç†ã€‚ä½ å””å¯ä»¥é–‹æ–°æˆ¶å£ã€‚',
+'sorbs' => 'DNSBL',
+'sorbsreason' => '你嘅IP地å€å·²ç¶“畀響呢個網站度用嘅DNSBL列咗åšå…¬é–‹ä»£ç†ã€‚',
+'sorbs_create_account_reason' => '你嘅IP地å€å·²ç¶“畀響呢個網站度用嘅DNSBL列咗åšå…¬é–‹ä»£ç†ã€‚ä½ å””å¯ä»¥é–‹æ–°æˆ¶å£ã€‚',
# Developer tools
@@ -1456,7 +1513,7 @@ wiki: $PAGEEDITOR_WIKI
'newtitle' => '到新標題',
'movepagebtn' => 'æ¬é ',
'pagemovedsub' => 'æ¬é æˆåŠŸ',
-'pagemovedtext' => "é é¢\"[[$1]]\"已經般到去\"[[$2]]\"。",
+'pagemovedtext' => "é é¢\"[[$1]]\"已經æ¬åˆ°åŽ»\"[[$2]]\"。",
'articleexists' => '已經有é é¢å«å—°å€‹å,或者你æ€å˜…åå””åˆæ³•ã€‚
è«‹æ€éŽç¬¬äºŒå€‹å。',
'talkexists' => "'''é é¢æœ¬èº«å·²ç¶“æˆåŠŸæ¬å’—,但係個討論é æ¬å””到,因為已經有一個åŒå嘅討論é ã€‚請手工åˆä½µä½¢å“‹ã€‚'''",
@@ -1544,7 +1601,7 @@ wiki: $PAGEEDITOR_WIKI
# import log
'importlogpage' => '倒入日誌',
'importlogpagetext' => '管ç†å“¡ç”±å…¶å®ƒå˜… wiki 倒入é é¢åŒåŸ‹ä½¢å“‹å˜…編輯歷å²è¨˜éŒ„。',
-'import-logentry-upload' => '由檔案上載倒入咗 $1',
+'import-logentry-upload' => '由檔案上載倒入咗 [[$1]]',
'import-logentry-upload-detail' => '$1個修訂',
'import-logentry-interwiki' => 'transwikiå’— $1',
'import-logentry-interwiki-detail' => '由$2嘅$1個修訂',
@@ -1568,8 +1625,8 @@ wiki: $PAGEEDITOR_WIKI
'tooltip-watch' => '將呢é åŠ åˆ°åŽ»ä½ å˜…監視清單度[alt-w]',
# stylesheets
-'Common.css' => '/* 響呢度放 CSS 碼去改æˆå€‹ç¶²ç«™å˜…çš® */',
-'Monobook.css' => '/* 響呢度放 CSS 碼去改用戶用嘅 Monobook 皮 */',
+'common.css' => '/* 響呢度放 CSS 碼去改æˆå€‹ç¶²ç«™å˜…çš® */',
+'monobook.css' => '/* 響呢度放 CSS 碼去改用戶用嘅 Monobook 皮 */',
# Metadata
# 元數據(大陸)
@@ -1596,6 +1653,7 @@ wiki: $PAGEEDITOR_WIKI
'spamprotectionmatch' => '以下係觸發我哋嘅å垃圾éŽæ¿¾å™¨å˜…文字:$1',
'subcategorycount' => "呢個類別入邊有$1個細類別。",
'categoryarticlecount' => "呢個類別入邊有$1篇文章。",
+'category-media-count' => "呢個類別入邊有$1個檔案。",
'listingcontinuesabbrev' => " 續",
'spambot_username' => 'MediaWiki垃圾清除',
'spam_reverting' => 'æ¢å¾©è¿”去最後一個唔包å«æŒ‡åŽ»$1嘅連çµå˜…嗰個版本。',
@@ -1625,10 +1683,11 @@ wiki: $PAGEEDITOR_WIKI
'rcpatroldisabled' => "最近修改巡查已經åœç”¨",
'rcpatroldisabledtext' => "最近修改嘅巡查功能ç¾æ™‚åœç”¨ä¸­ã€‚",
'markedaspatrollederror' => "å””å¯ä»¥æ¨™ç¤ºåšå·²å·¡æŸ¥å˜…",
-'markedaspatrollederrortext' => "您需è¦æŒ‡å®šä¸€å€‹ä¿®è¨‚用嚟將佢標示åšå·²å·¡æŸ¥å˜…。",
+'markedaspatrollederrortext' => "你需è¦æŒ‡å®šä¸€å€‹ä¿®è¨‚用嚟將佢標示åšå·²å·¡æŸ¥å˜…。",
+'markedaspatrollederror-noautopatrol' => '你係唔准去標示你自己嘅更改åšå·²å·¡æŸ¥å˜…。',
# Monobook.js: tooltips and access keys for monobook
-'Monobook.js' => '/* 工具æ示åŒåŸ‹å¿«é€Ÿéµ */
+'monobook.js' => '/* 工具æ示åŒåŸ‹å¿«é€Ÿéµ */
var ta = new Object();
ta[\'pt-userpage\'] = new Array(\'.\',\'我嘅用戶é \');
ta[\'pt-anonuserpage\'] = new Array(\'.\',\'您編輯呢個IP嘅å°æ‡‰ç”¨æˆ¶é \');
@@ -1639,7 +1698,7 @@ ta[\'pt-watchlist\'] = new Array(\'l\',\'你所監視嘅é é¢æ›´æ”¹ä¸€è¦½\');
ta[\'pt-mycontris\'] = new Array(\'y\',\'我嘅貢ç»ä¸€è¦½\');
ta[\'pt-login\'] = new Array(\'o\',\'登入係唔需è¦å˜…,但會帶嚟好多嘅好處\');
ta[\'pt-anonlogin\'] = new Array(\'o\',\'登入係唔需è¦å˜…,但會帶嚟好多嘅好處\');
-ta[\'pt-logout\'] = new Array(\'o\',\'登出\');
+ta[\'pt-logout\'] = new Array(\'\',\'登出\');
ta[\'ca-talk\'] = new Array(\'t\',\'關於內容é å˜…討論\');
ta[\'ca-edit\'] = new Array(\'e\',\'ä½ å¯ä»¥ç·¨è¼¯å‘¢ä¸€é ã€‚請在儲存之å‰å…ˆé è¦½ä¸€å“。\');
ta[\'ca-addsection\'] = new Array(\'+\',\'開始新嘅討論\');
@@ -1681,6 +1740,9 @@ ta[\'ca-nstab-template\'] = new Array(\'c\',\'ç‡å“個模\');
ta[\'ca-nstab-help\'] = new Array(\'c\',\'ç‡å“幫助é \');
ta[\'ca-nstab-category\'] = new Array(\'c\',\'ç‡å“分類é \');',
+# Common.js: contains nothing but a placeholder comment
+'common.js' => '/* 響æ¯ä¸€æ¬¡å€‹é é¢è¼‰å…¥æ™‚,所有用戶都會載入呢度所有嘅JavaScript。 */',
+
# image deletion
'deletedrevision' => '刪除咗$1嘅舊有修訂。',
@@ -2034,9 +2096,18 @@ ta[\'ca-nstab-category\'] = new Array(\'c\',\'ç‡å“分類é \');',
啟用下邊個掣嚟發å°ç¢ºèªä¿¡åŽ»ä½ å€‹åœ°å€åº¦ã€‚
å°ä¿¡å…¥é¢æœƒé™„帶一æ¢åŒ…å«ä»£ç¢¼å˜…連çµï¼›
喺你個ç€è¦½å™¨åº¦æ‰“é–‹æ¢é€£çµåšŸç¢ºèªä½ å˜…電郵地å€ä¿‚有效嘅。",
+'confirmemail_pending' => '<div class="error">
+一個確èªç¢¼å·²ç¶“電郵咗畀你;
+如果你係啱啱開咗個新戶å£å˜…,
+ä½ å¯ä»¥éŸ¿è«‹æ±‚一個新嘅確èªç¢¼ä¹‹å‰ç­‰å¤šå¹¾åˆ†é˜ç­‰ä½¢å¯„畀你。
+</div>',
'confirmemail_send' => '寄出確èªç¢¼ã€‚',
'confirmemail_sent' => '確èªé›»éƒµå·²ç¶“寄出。',
-'confirmemail_sendfailed' => '發唔到確èªä¿¡ã€‚請檢查å“個地å€æœ‰å†‡ç„¡æ•ˆå˜…字。',
+'confirmemail_oncreate' => '一個確èªç¢¼å·²ç¶“寄é€å’—到嘅嘅電郵地å€ã€‚
+呢個代碼唔係登入嗰陣去用,但係你需è¦ä½¢åŽ»é–‹éŸ¿å‘¢å€‹wiki度,任何åŒé›»éƒµæœ‰é—œå˜…功能。',
+'confirmemail_sendfailed' => '發唔到確èªä¿¡ã€‚請檢查å“個地å€æœ‰å†‡ç„¡æ•ˆå˜…字。
+
+郵件éžé€å“¡å›žæ‡‰å’—:$1',
'confirmemail_invalid' => '無效嘅確èªç¢¼ã€‚個代碼å¯èƒ½å·²ç¶“éŽå’—期。',
'confirmemail_needlogin' => '你需è¦å…ˆ$1去確èªä½ å˜…電郵地å€ã€‚',
'confirmemail_success' => '你嘅電郵地å€å·²ç¶“得到確èªã€‚你而家å¯ä»¥ç™»å…¥åŒç›¡æƒ…享å—wiki啦。',
@@ -2093,7 +2164,7 @@ $1
'confirm_purge_button' => '肯定',
'youhavenewmessagesmulti' => "你響 $1 有一個新信æ¯",
-'newtalkseperator' => ',_',
+
'searchcontaining' => "æµå«æœ‰''$1''嘅文章。",
'searchnamed' => "æµå€‹åä¿‚''$1''嘅文章。",
'articletitles' => "以''$1''開頭嘅文章",
@@ -2122,6 +2193,12 @@ $1
'table_pager_limit_submit' => '去',
'table_pager_empty' => 'ç„¡çµæžœ',
+# Auto-summaries
+'autosumm-blank' => '移除緊響嗰一版嘅全部內容',
+'autosumm-replace' => '用 \'$1\' å–代緊嗰一版',
+'autoredircomment' => 'é‡æ–°å®šå‘緊到[[$1]]', # This should be changed to the new naming convention, but existed beforehand.
+'autosumm-new' => 'æ–°é ï¼š $1',
+
);
?>
diff --git a/maintenance/FiveUpgrade.inc b/maintenance/FiveUpgrade.inc
index 4bbf0733..d21d8b43 100644
--- a/maintenance/FiveUpgrade.inc
+++ b/maintenance/FiveUpgrade.inc
@@ -98,7 +98,7 @@ class FiveUpgrade {
# http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT
static $cp1252 = array(
0x80 => 0x20AC, #EURO SIGN
- 0x81 => UNICODE_REPLACEMENT,
+ 0x81 => 0xFFFD, #REPLACEMENT CHARACTER (no mapping)
0x82 => 0x201A, #SINGLE LOW-9 QUOTATION MARK
0x83 => 0x0192, #LATIN SMALL LETTER F WITH HOOK
0x84 => 0x201E, #DOUBLE LOW-9 QUOTATION MARK
@@ -110,10 +110,10 @@ class FiveUpgrade {
0x8A => 0x0160, #LATIN CAPITAL LETTER S WITH CARON
0x8B => 0x2039, #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
0x8C => 0x0152, #LATIN CAPITAL LIGATURE OE
- 0x8D => UNICODE_REPLACEMENT,
+ 0x8D => 0xFFFD, #REPLACEMENT CHARACTER (no mapping)
0x8E => 0x017D, #LATIN CAPITAL LETTER Z WITH CARON
- 0x8F => UNICODE_REPLACEMENT,
- 0x90 => UNICODE_REPLACEMENT,
+ 0x8F => 0xFFFD, #REPLACEMENT CHARACTER (no mapping)
+ 0x90 => 0xFFFD, #REPLACEMENT CHARACTER (no mapping)
0x91 => 0x2018, #LEFT SINGLE QUOTATION MARK
0x92 => 0x2019, #RIGHT SINGLE QUOTATION MARK
0x93 => 0x201C, #LEFT DOUBLE QUOTATION MARK
@@ -126,7 +126,7 @@ class FiveUpgrade {
0x9A => 0x0161, #LATIN SMALL LETTER S WITH CARON
0x9B => 0x203A, #SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
0x9C => 0x0153, #LATIN SMALL LIGATURE OE
- 0x9D => UNICODE_REPLACEMENT,
+ 0x9D => 0xFFFD, #REPLACEMENT CHARACTER (no mapping)
0x9E => 0x017E, #LATIN SMALL LETTER Z WITH CARON
0x9F => 0x0178, #LATIN CAPITAL LETTER Y WITH DIAERESIS
);
diff --git a/maintenance/archives/patch-backlinkindexes.sql b/maintenance/archives/patch-backlinkindexes.sql
new file mode 100644
index 00000000..5facd9ea
--- /dev/null
+++ b/maintenance/archives/patch-backlinkindexes.sql
@@ -0,0 +1,19 @@
+--
+-- patch-backlinkindexes.sql
+--
+-- Per bug 6440 / http://bugzilla.wikimedia.org/show_bug.cgi?id=6440
+--
+-- Improve performance of the "what links here"-type queries
+--
+
+ALTER TABLE /*$wgDBprefix*/pagelinks
+ DROP INDEX pl_namespace,
+ ADD INDEX pl_namespace(pl_namespace, pl_title, pl_from);
+
+ALTER TABLE /*$wgDBprefix*/templatelinks
+ DROP INDEX tl_namespace,
+ ADD INDEX tl_namespace(tl_namespace, tl_title, tl_from);
+
+ALTER TABLE /*$wgDBprefix*/imagelinks
+ DROP INDEX il_to,
+ ADD INDEX il_to(il_to, il_from);
diff --git a/maintenance/archives/patch-externallinks.sql b/maintenance/archives/patch-externallinks.sql
index d1aa5764..52fb5bae 100644
--- a/maintenance/archives/patch-externallinks.sql
+++ b/maintenance/archives/patch-externallinks.sql
@@ -3,8 +3,8 @@
--
CREATE TABLE /*$wgDBprefix*/externallinks (
el_from int(8) unsigned NOT NULL default '0',
- el_to blob NOT NULL default '',
- el_index blob NOT NULL default '',
+ el_to blob NOT NULL,
+ el_index blob NOT NULL,
KEY (el_from, el_to(40)),
KEY (el_to(60), el_from),
diff --git a/maintenance/archives/patch-filearchive.sql b/maintenance/archives/patch-filearchive.sql
index 4bf09366..cc50f2ae 100644
--- a/maintenance/archives/patch-filearchive.sql
+++ b/maintenance/archives/patch-filearchive.sql
@@ -37,7 +37,7 @@ CREATE TABLE /*$wgDBprefix*/filearchive (
fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") default "unknown",
fa_minor_mime varchar(32) default "unknown",
- fa_description tinyblob default '',
+ fa_description tinyblob,
fa_user int(5) unsigned default '0',
fa_user_text varchar(255) binary default '',
fa_timestamp char(14) binary default '',
diff --git a/maintenance/archives/patch-ipb_anon_only.sql b/maintenance/archives/patch-ipb_anon_only.sql
index 709308a2..b3738168 100644
--- a/maintenance/archives/patch-ipb_anon_only.sql
+++ b/maintenance/archives/patch-ipb_anon_only.sql
@@ -11,17 +11,17 @@ DROP TABLE IF EXISTS /*$wgDBprefix*/ipblocks_newunique;
CREATE TABLE /*$wgDBprefix*/ipblocks_newunique (
ipb_id int(8) NOT NULL auto_increment,
- ipb_address tinyblob NOT NULL default '',
+ ipb_address tinyblob NOT NULL,
ipb_user int(8) unsigned NOT NULL default '0',
ipb_by int(8) unsigned NOT NULL default '0',
- ipb_reason tinyblob NOT NULL default '',
+ ipb_reason tinyblob NOT NULL,
ipb_timestamp char(14) binary NOT NULL default '',
ipb_auto bool NOT NULL default 0,
ipb_anon_only bool NOT NULL default 0,
ipb_create_account bool NOT NULL default 1,
ipb_expiry char(14) binary NOT NULL default '',
- ipb_range_start tinyblob NOT NULL default '',
- ipb_range_end tinyblob NOT NULL default '',
+ ipb_range_start tinyblob NOT NULL,
+ ipb_range_end tinyblob NOT NULL,
PRIMARY KEY ipb_id (ipb_id),
UNIQUE INDEX ipb_address_unique (ipb_address(255), ipb_user, ipb_auto),
diff --git a/maintenance/archives/patch-ipb_optional_autoblock.sql b/maintenance/archives/patch-ipb_optional_autoblock.sql
new file mode 100644
index 00000000..f31b8359
--- /dev/null
+++ b/maintenance/archives/patch-ipb_optional_autoblock.sql
@@ -0,0 +1,3 @@
+-- Add an extra option field "ipb_enable_autoblock" into the ipblocks table. This allows a block to be placed that does not trigger any autoblocks.
+
+ALTER TABLE /*$wgDBprefix*/ipblocks ADD COLUMN ipb_enable_autoblock bool NOT NULL default '1';
diff --git a/maintenance/archives/patch-job.sql b/maintenance/archives/patch-job.sql
index 89918456..d904fbeb 100644
--- a/maintenance/archives/patch-job.sql
+++ b/maintenance/archives/patch-job.sql
@@ -13,7 +13,7 @@ CREATE TABLE /*$wgDBprefix*/job (
-- Any other parameters to the command
-- Presently unused, format undefined
- job_params blob NOT NULL default '',
+ job_params blob NOT NULL,
PRIMARY KEY job_id (job_id),
KEY (job_cmd, job_namespace, job_title)
diff --git a/maintenance/archives/patch-log_params.sql b/maintenance/archives/patch-log_params.sql
index aa00a673..ff6527ec 100644
--- a/maintenance/archives/patch-log_params.sql
+++ b/maintenance/archives/patch-log_params.sql
@@ -1 +1 @@
-ALTER TABLE /*$wgDBprefix*/logging ADD log_params blob NOT NULL default '';
+ALTER TABLE /*$wgDBprefix*/logging ADD log_params blob NOT NULL;
diff --git a/maintenance/archives/patch-logging.sql b/maintenance/archives/patch-logging.sql
index 79bb53b5..54146fb7 100644
--- a/maintenance/archives/patch-logging.sql
+++ b/maintenance/archives/patch-logging.sql
@@ -23,7 +23,7 @@ CREATE TABLE /*$wgDBprefix*/logging (
log_comment varchar(255) NOT NULL default '',
-- LF separated list of miscellaneous parameters
- log_params blob NOT NULL default '',
+ log_params blob NOT NULL,
KEY type_time (log_type, log_timestamp),
KEY user_time (log_user, log_timestamp),
diff --git a/maintenance/archives/patch-querycachetwo.sql b/maintenance/archives/patch-querycachetwo.sql
new file mode 100644
index 00000000..cda5b90d
--- /dev/null
+++ b/maintenance/archives/patch-querycachetwo.sql
@@ -0,0 +1,22 @@
+-- Used for caching expensive grouped queries that need two links (for example double-redirects)
+
+CREATE TABLE /*$wgDBprefix*/querycachetwo (
+ -- A key name, generally the base name of of the special page.
+ qcc_type char(32) NOT NULL,
+
+ -- Some sort of stored value. Sizes, counts...
+ qcc_value int(5) unsigned NOT NULL default '0',
+
+ -- Target namespace+title
+ qcc_namespace int NOT NULL default '0',
+ qcc_title char(255) binary NOT NULL default '',
+
+ -- Target namespace+title2
+ qcc_namespacetwo int NOT NULL default '0',
+ qcc_titletwo char(255) binary NOT NULL default '',
+
+ KEY qcc_type (qcc_type,qcc_value),
+ KEY qcc_title (qcc_type,qcc_namespace,qcc_title),
+ KEY qcc_titletwo (qcc_type,qcc_namespacetwo,qcc_titletwo)
+
+) TYPE=InnoDB;
diff --git a/maintenance/archives/patch-rc_len.sql b/maintenance/archives/patch-rc_len.sql
new file mode 100644
index 00000000..920f755b
--- /dev/null
+++ b/maintenance/archives/patch-rc_len.sql
@@ -0,0 +1,9 @@
+--
+-- patch-rc_len.sql
+-- Adds two rows to recentchanges to hold the text size befor and after the edit
+-- 2006-12-03
+--
+
+ALTER TABLE /*$wgDBprefix*/recentchanges
+ ADD COLUMN rc_old_len int(10), ADD COLUMN rc_new_len int(10);
+
diff --git a/maintenance/archives/patch-rc_user_text-index.sql b/maintenance/archives/patch-rc_user_text-index.sql
new file mode 100644
index 00000000..f6acc992
--- /dev/null
+++ b/maintenance/archives/patch-rc_user_text-index.sql
@@ -0,0 +1,7 @@
+-- Add an index to recentchanges on rc_user_text
+--
+-- Added 2006-11-08
+--
+
+ ALTER TABLE /*$wgDBprefix*/recentchanges
+ADD INDEX rc_user_text(rc_user_text, rc_timestamp); \ No newline at end of file
diff --git a/maintenance/archives/patch-redirect.sql b/maintenance/archives/patch-redirect.sql
new file mode 100644
index 00000000..d377f1b1
--- /dev/null
+++ b/maintenance/archives/patch-redirect.sql
@@ -0,0 +1,28 @@
+--
+-- Create the new redirect table.
+-- For each redirect, this table contains exactly one row defining its target
+--
+CREATE TABLE /*$wgDBprefix*/redirect (
+ -- Key to the page_id of the redirect page
+ rd_from int(8) unsigned NOT NULL default '0',
+
+ -- Key to page_namespace/page_title of the target page.
+ -- The target page may or may not exist, and due to renames
+ -- and deletions may refer to different page records as time
+ -- goes by.
+ rd_namespace int NOT NULL default '0',
+ rd_title varchar(255) binary NOT NULL default '',
+
+ PRIMARY KEY rd_from (rd_from),
+ KEY rd_ns_title (rd_namespace,rd_title,rd_from)
+) TYPE=InnoDB;
+
+-- Import existing redirects
+-- Using ignore because some of the redirect pages contain more than one link
+INSERT IGNORE
+ INTO /*$wgDBprefix*/redirect (rd_from,rd_namespace,rd_title)
+ SELECT pl_from,pl_namespace,pl_title
+ FROM /*$wgDBprefix*/pagelinks, /*$wgDBprefix*/page
+ WHERE pl_from=page_id AND page_is_redirect=1;
+
+
diff --git a/maintenance/archives/patch-rename-user_groups-and_rights.sql b/maintenance/archives/patch-rename-user_groups-and_rights.sql
index abd59319..650f2604 100644
--- a/maintenance/archives/patch-rename-user_groups-and_rights.sql
+++ b/maintenance/archives/patch-rename-user_groups-and_rights.sql
@@ -5,5 +5,5 @@ ALTER TABLE /*$wgDBprefix*/user_groups
ALTER TABLE /*$wgDBprefix*/user_rights
CHANGE user_id ur_user INT(5) UNSIGNED NOT NULL,
- CHANGE user_rights ur_rights TINYBLOB NOT NULL DEFAULT '';
+ CHANGE user_rights ur_rights TINYBLOB NOT NULL;
diff --git a/maintenance/archives/patch-restructure.sql b/maintenance/archives/patch-restructure.sql
index 53f1836b..acf306c2 100644
--- a/maintenance/archives/patch-restructure.sql
+++ b/maintenance/archives/patch-restructure.sql
@@ -13,7 +13,7 @@ CREATE TABLE /*$wgDBprefix*/page (
page_id int(8) unsigned NOT NULL auto_increment,
page_namespace tinyint NOT NULL,
page_title varchar(255) binary NOT NULL,
- page_restrictions tinyblob NOT NULL default '',
+ page_restrictions tinyblob NOT NULL,
page_counter bigint(20) unsigned NOT NULL default '0',
page_is_redirect tinyint(1) unsigned NOT NULL default '0',
page_is_new tinyint(1) unsigned NOT NULL default '0',
@@ -31,7 +31,7 @@ CREATE TABLE /*$wgDBprefix*/page (
CREATE TABLE /*$wgDBprefix*/revision (
rev_id int(8) unsigned NOT NULL auto_increment,
rev_page int(8) unsigned NOT NULL,
- rev_comment tinyblob NOT NULL default '',
+ rev_comment tinyblob NOT NULL,
rev_user int(5) unsigned NOT NULL default '0',
rev_user_text varchar(255) binary NOT NULL default '',
rev_timestamp char(14) binary NOT NULL default '',
@@ -51,8 +51,8 @@ CREATE TABLE /*$wgDBprefix*/revision (
--
-- CREATE TABLE /*$wgDBprefix*/text (
-- old_id int(8) unsigned NOT NULL auto_increment,
--- old_text mediumtext NOT NULL default '',
--- old_flags tinyblob NOT NULL default '',
+-- old_text mediumtext NOT NULL,
+-- old_flags tinyblob NOT NULL,
--
-- PRIMARY KEY old_id (old_id)
-- );
diff --git a/maintenance/archives/patch-searchindex.sql b/maintenance/archives/patch-searchindex.sql
index fb54dbbe..2b9b6702 100644
--- a/maintenance/archives/patch-searchindex.sql
+++ b/maintenance/archives/patch-searchindex.sql
@@ -15,7 +15,7 @@ CREATE TABLE /*$wgDBprefix*/searchindex (
si_title varchar(255) NOT NULL default '',
-- Munged version of body text
- si_text mediumtext NOT NULL default '',
+ si_text mediumtext NOT NULL,
UNIQUE KEY (si_page)
diff --git a/maintenance/archives/patch-user_editcount.sql b/maintenance/archives/patch-user_editcount.sql
new file mode 100644
index 00000000..cdde36dc
--- /dev/null
+++ b/maintenance/archives/patch-user_editcount.sql
@@ -0,0 +1,5 @@
+ALTER TABLE /*$wgDBprefix*/user
+ ADD COLUMN user_editcount int;
+
+-- Don't initialize values immediately... or should we?
+-- They will be lazy-evaluated, or batch-filled via maintenance/initEditCount.php
diff --git a/maintenance/archives/patch-user_newpass_time.sql b/maintenance/archives/patch-user_newpass_time.sql
new file mode 100644
index 00000000..47b332ba
--- /dev/null
+++ b/maintenance/archives/patch-user_newpass_time.sql
@@ -0,0 +1,4 @@
+-- Timestamp of the last time when a new password was
+-- sent, for throttling purposes
+ALTER TABLE /*$wgDBprefix*/user ADD user_newpass_time char(14) binary;
+
diff --git a/maintenance/archives/patch-user_rights.sql b/maintenance/archives/patch-user_rights.sql
index 36f0102a..a32ef457 100644
--- a/maintenance/archives/patch-user_rights.sql
+++ b/maintenance/archives/patch-user_rights.sql
@@ -10,7 +10,7 @@ CREATE TABLE /*$wgDBprefix*/user_rights (
ur_user int(5) unsigned NOT NULL,
-- Comma-separated list of permission keys
- ur_rights tinyblob NOT NULL default '',
+ ur_rights tinyblob NOT NULL,
UNIQUE KEY ur_user (ur_user)
diff --git a/maintenance/backup.inc b/maintenance/backup.inc
index 8b4b6726..1a8ff4fe 100644
--- a/maintenance/backup.inc
+++ b/maintenance/backup.inc
@@ -175,7 +175,7 @@ class BackupDumper {
$this->initProgress( $history );
$db =& $this->backupDb();
- $exporter = new WikiExporter( $db, $history, MW_EXPORT_STREAM, $text );
+ $exporter = new WikiExporter( $db, $history, WikiExporter::STREAM, $text );
$wrapper = new ExportProgressFilter( $this->sink, $this );
$exporter->setOutputSink( $wrapper );
diff --git a/maintenance/checkUsernames.php b/maintenance/checkUsernames.php
index 4c0ecdce..60e52181 100644
--- a/maintenance/checkUsernames.php
+++ b/maintenance/checkUsernames.php
@@ -7,7 +7,6 @@ class checkUsernames {
function checkUsernames() {
$this->stderr = fopen( 'php://stderr', 'wt' );
- $this->log = fopen( '/home/wikipedia/logs/checkUsernames.log', 'at' );
}
function main() {
$fname = 'checkUsernames::main';
@@ -24,7 +23,7 @@ class checkUsernames {
if ( ! User::isValidUserName( $row->user_name ) ) {
$out = sprintf( "%s: %6d: '%s'\n", wfWikiID(), $row->user_id, $row->user_name );
fwrite( $this->stderr, $out );
- fwrite( $this->log, $out );
+ wfDebugLog( 'checkUsernames', $out );
}
}
}
diff --git a/maintenance/commandLine.inc b/maintenance/commandLine.inc
index 2549057e..18a1d712 100644
--- a/maintenance/commandLine.inc
+++ b/maintenance/commandLine.inc
@@ -14,6 +14,15 @@ if ( isset( $_SERVER ) && array_key_exists( 'REQUEST_METHOD', $_SERVER ) ) {
exit();
}
+if( version_compare( PHP_VERSION, '5.0.0' ) < 0 ) {
+ print "Sorry! This version of MediaWiki requires PHP 5; you are running " .
+ PHP_VERSION . ".\n\n" .
+ "If you are sure you already have PHP 5 installed, it may be " .
+ "installed\n" .
+ "in a different path from PHP 4. Check with your system administrator.\n";
+ die( -1 );
+}
+
define('MEDIAWIKI',true);
# Process command line arguments
@@ -179,7 +188,9 @@ if ( file_exists( '/home/wikipedia/common/langlist' ) ) {
}
# Turn off output buffering again, it might have been turned on in the settings files
-@ob_end_flush();
+if( ob_get_level() ) {
+ ob_end_flush();
+}
# Same with these
$wgCommandLineMode = true;
diff --git a/maintenance/deleteBatch.php b/maintenance/deleteBatch.php
index 234744c3..14da6d84 100644
--- a/maintenance/deleteBatch.php
+++ b/maintenance/deleteBatch.php
@@ -3,11 +3,10 @@
# delete a batch of pages
# Usage: php deleteBatch.php [-u <user>] [-r <reason>] [-i <interval>] <listfile>
# where
-# <listfile> is a file where each line has two titles separated by a pipe
-# character. The first title is the source, the second is the destination.
+# <listfile> is a file where each line contains the title of a page to be deleted.
# <user> is the username
-# <reason> is the move reason
-# <interval> is the number of seconds to sleep for after each move
+# <reason> is the delete reason
+# <interval> is the number of seconds to sleep for after each delete
$oldCwd = getcwd();
$optionsWithArgs = array( 'u', 'r', 'i' );
@@ -50,8 +49,8 @@ $dbw =& wfGetDB( DB_MASTER );
for ( $linenum = 1; !feof( $file ); $linenum++ ) {
$line = trim( fgets( $file ) );
- if ( $line === false ) {
- break;
+ if ( $line == '' ) {
+ continue;
}
$page = Title::newFromText( $line );
if ( is_null( $page ) ) {
diff --git a/maintenance/deleteDefaultMessages.php b/maintenance/deleteDefaultMessages.php
new file mode 100644
index 00000000..76924002
--- /dev/null
+++ b/maintenance/deleteDefaultMessages.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * Deletes all pages in the MediaWiki namespace which were last edited by
+ * "MediaWiki default".
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+ require_once( 'commandLine.inc' );
+ deleteDefaultMessages();
+}
+
+function deleteDefaultMessages() {
+ $user = 'MediaWiki default';
+ $reason = 'No longer required';
+
+ global $wgUser;
+ $wgUser = User::newFromName( $user );
+ $wgUser->addGroup( 'bot' );
+
+ $dbr =& wfGetDB( DB_SLAVE );
+ $res = $dbr->select( array( 'page', 'revision' ),
+ array( 'page_namespace', 'page_title' ),
+ array(
+ 'page_namespace' => NS_MEDIAWIKI,
+ 'page_latest=rev_id',
+ 'rev_user_text' => 'MediaWiki default',
+ )
+ );
+
+ $dbw =& wfGetDB( DB_MASTER );
+
+ while ( $row = $dbr->fetchObject( $res ) ) {
+ if ( function_exists( 'wfWaitForSlaves' ) ) {
+ wfWaitForSlaves( 5 );
+ }
+ $dbw->ping();
+ $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+ $article = new Article( $title );
+ $dbw->begin();
+ $article->doDeleteArticle( $reason );
+ $dbw->commit();
+ }
+}
+?>
diff --git a/maintenance/dumpHTML.inc b/maintenance/dumpHTML.inc
index ca2a62dc..702c7df9 100644
--- a/maintenance/dumpHTML.inc
+++ b/maintenance/dumpHTML.inc
@@ -38,6 +38,9 @@ class DumpHTML {
# Make a copy of all images encountered
var $makeSnapshot = false;
+ # Don't image description pages in doEverything()
+ var $noSharedDesc = false;
+
# Make links assuming the script path is in the same directory as
# the destination
var $alternateScriptPath = false;
@@ -67,6 +70,9 @@ class DumpHTML {
# Max page ID, lazy initialised
var $maxPageID = false;
+ # UDP profiling
+ var $udpProfile, $udpProfileCounter = 0, $udpProfileInit = false;
+
function DumpHTML( $settings = array() ) {
foreach ( $settings as $var => $value ) {
$this->$var = $value;
@@ -124,13 +130,16 @@ class DumpHTML {
return;
}
$this->doArticles();
- $this->doLocalImageDescriptions();
- $this->doSharedImageDescriptions();
$this->doCategories();
$this->doRedirects();
if ( $this->sliceNumerator == 1 ) {
$this->doSpecials();
}
+ $this->doLocalImageDescriptions();
+
+ if ( !$this->noSharedDesc ) {
+ $this->doSharedImageDescriptions();
+ }
$this->setCheckpoint( 'everything', 'done' );
}
@@ -179,7 +188,8 @@ class DumpHTML {
$title = Title::newFromID( $id );
if ( $title ) {
$ns = $title->getNamespace() ;
- if ( $ns != NS_CATEGORY && $title->getPrefixedDBkey() != $mainPage ) {
+ if ( $ns != NS_CATEGORY && $ns != NS_MEDIAWIKI &&
+ $title->getPrefixedDBkey() != $mainPage ) {
$this->doArticle( $title );
}
}
@@ -193,7 +203,7 @@ class DumpHTML {
$this->setupGlobals();
print "Special:Categories...";
- $this->doArticle( Title::makeTitle( NS_SPECIAL, 'Categories' ) );
+ $this->doArticle( SpecialPage::getTitleFor( 'Categories' ) );
print "\n";
}
@@ -224,7 +234,9 @@ class DumpHTML {
function doImageDescriptions() {
$this->doLocalImageDescriptions();
- $this->doSharedImageDescriptions();
+ if ( !$this->noSharedDesc ) {
+ $this->doSharedImageDescriptions();
+ }
}
/**
@@ -309,19 +321,23 @@ class DumpHTML {
for ( $hash = $start; $hash <= $end; $hash++ ) {
$this->setCheckpoint( 'shared image', $hash );
- $dir = sprintf( "%01x/%02x", intval( $hash / 16 ), $hash );
- $paths = array_merge( glob( "{$this->sharedStaticDirectory}/$dir/*" ),
- glob( "{$this->sharedStaticDirectory}/thumb/$dir/*" ) );
-
- foreach ( $paths as $path ) {
- $file = wfBaseName( $path );
+ $dir = sprintf( "%s/%01x/%02x", $this->sharedStaticDirectory,
+ intval( $hash / 16 ), $hash );
+ $handle = @opendir( $dir );
+ while ( $handle && $file = readdir( $handle ) ) {
+ if ( $file[0] == '.' ) {
+ continue;
+ }
if ( !(++$i % REPORTING_INTERVAL ) ) {
print "$i\r";
}
- $title = Title::makeTitle( NS_IMAGE, $file );
+ $title = Title::makeTitleSafe( NS_IMAGE, $file );
$this->doArticle( $title );
}
+ if ( $handle ) {
+ closedir( $handle );
+ }
}
$this->setCheckpoint( 'shared image', 'done' );
print "\n";
@@ -437,6 +453,8 @@ class DumpHTML {
}
}
+ $this->profile();
+
$this->rawPages = array();
$text = $this->getArticleHTML( $title );
@@ -473,11 +491,26 @@ class DumpHTML {
fclose( $file );
}
}
+
+ wfIncrStats( 'dumphtml_article' );
}
/** Write the given text to the file identified by the given title object */
function writeArticle( &$title, $text ) {
$filename = $this->getHashedFilename( $title );
+
+ # Temporary hack for current dump, this should be moved to
+ # getFriendlyName() at the earliest opportunity.
+ #
+ # Limit filename length to 255 characters, so it works on ext3.
+ # Titles are in fact limited to 255 characters, but dumpHTML
+ # adds a suffix which may put them over the limit.
+ $length = strlen( $filename );
+ if ( $length > 255 ) {
+ print "Warning: Filename too long ($length bytes). Skipping.\n";
+ return;
+ }
+
$fullName = "{$this->dest}/$filename";
$fullDir = dirname( $fullName );
@@ -579,13 +612,11 @@ class DumpHTML {
$wgUser->setOption( 'skin', $this->skin );
$wgUser->setOption( 'editsection', 0 );
- if ( $this->makeSnapshot ) {
- $this->destUploadDirectory = "{$this->dest}/{$this->imageRel}";
- if ( realpath( $this->destUploadDirectory == $wgUploadDirectory ) ) {
- $this->makeSnapshot = false;
- }
+ $this->destUploadDirectory = "{$this->dest}/{$this->imageRel}";
+ if ( realpath( $this->destUploadDirectory ) == realpath( $wgUploadDirectory ) ) {
+ print "Disabling image snapshot because the destination is the same as the source\n";
+ $this->makeSnapshot = false;
}
-
$this->sharedStaticDirectory = "{$this->destUploadDirectory}/shared";
$this->setupDone = true;
@@ -683,9 +714,13 @@ ENDTEXT;
if ( !file_exists( $destLoc ) ) {
wfMkdirParents( dirname( $destLoc ), 0755 );
if ( function_exists( 'symlink' ) && !$this->forceCopy ) {
- symlink( $sourceLoc, $destLoc );
+ if ( !symlink( $sourceLoc, $destLoc ) ) {
+ print "Warning: unable to create symlink at $destLoc\n";
+ }
} else {
- copy( $sourceLoc, $destLoc );
+ if ( !copy( $sourceLoc, $destLoc ) ) {
+ print "Warning: unable to copy $sourceLoc to $destLoc\n";
+ }
}
}
}
@@ -928,7 +963,33 @@ ENDTEXT;
}
return $this->maxPageID;
}
-
+
+ function profile() {
+ global $wgProfiler;
+
+ if ( !$this->udpProfile ) {
+ return;
+ }
+ if ( !$this->udpProfileInit ) {
+ $this->udpProfileInit = true;
+ } elseif ( $this->udpProfileCounter == 1 % $this->udpProfile ) {
+ $wgProfiler->getFunctionReport();
+ $wgProfiler = new DumpHTML_ProfilerStub;
+ }
+ if ( $this->udpProfileCounter == 0 ) {
+ $wgProfiler = new ProfilerSimpleUDP;
+ $wgProfiler->setProfileID( 'dumpHTML' );
+ }
+ $this->udpProfileCounter = ( $this->udpProfileCounter + 1 ) % $this->udpProfile;
+ }
+}
+
+class DumpHTML_ProfilerStub {
+ function profileIn() {}
+ function profileOut() {}
+ function getOutput() {}
+ function close() {}
+ function getFunctionReport() {}
}
/** XML parser callback */
diff --git a/maintenance/dumpHTML.php b/maintenance/dumpHTML.php
index 5e347e4b..2c0c29c4 100644
--- a/maintenance/dumpHTML.php
+++ b/maintenance/dumpHTML.php
@@ -17,6 +17,8 @@
* --checkpoint <file> use a checkpoint file to allow restarting of interrupted dumps
* --slice <n/m> split the job into m segments and do the n'th one
* --images only do image description pages
+ * --shared-desc only do shared (commons) image description pages
+ * --no-shared-desc don't do shared image description pages
* --categories only do category pages
* --redirects only do redirects
* --special only do miscellaneous stuff
@@ -24,10 +26,11 @@
* --interlang allow interlanguage links
* --image-snapshot copy all images used to the destination directory
* --compress generate compressed version of the html pages
+ * --udp-profile <N> profile 1/N rendering operations using ProfilerSimpleUDP
*/
-$optionsWithArgs = array( 's', 'd', 'e', 'k', 'checkpoint', 'slice' );
+$optionsWithArgs = array( 's', 'd', 'e', 'k', 'checkpoint', 'slice', 'udp-profile' );
$profiling = false;
@@ -41,6 +44,10 @@ if ( $profiling ) {
}
}
+if ( in_array( '--udp-profile', $argv ) ) {
+ define( 'MW_FORCE_PROFILE', 1 );
+}
+
require_once( "commandLine.inc" );
require_once( "dumpHTML.inc" );
@@ -93,6 +100,8 @@ $wgHTMLDump = new DumpHTML( array(
'sliceDenominator' => $sliceDenominator,
'noOverwrite' => $options['no-overwrite'],
'compress' => $options['compress'],
+ 'noSharedDesc' => $options['no-shared-desc'],
+ 'udpProfile' => $options['udp-profile'],
));
@@ -104,6 +113,8 @@ if ( $options['special'] ) {
$wgHTMLDump->doCategories();
} elseif ( $options['redirects'] ) {
$wgHTMLDump->doRedirects();
+} elseif ( $options['shared-desc'] ) {
+ $wgHTMLDump->doSharedImageDescriptions();
} else {
print "Creating static HTML dump in directory $dest. \n";
$dbr =& wfGetDB( DB_SLAVE );
diff --git a/maintenance/edit.php b/maintenance/edit.php
new file mode 100644
index 00000000..33e0607b
--- /dev/null
+++ b/maintenance/edit.php
@@ -0,0 +1,68 @@
+<?php
+
+$optionsWithArgs = array( 'u', 's' );
+
+require_once( 'commandLine.inc' );
+
+if ( count( $args ) == 0 || isset( $options['help'] ) ) {
+ print <<<EOT
+Edit an article from the command line
+
+Usage: php edit.php [options...] <title>
+
+Options:
+ -u <user> Username
+ -s <summary> Edit summary
+ -m Minor edit
+ -b Bot (hidden) edit
+ -a Enable autosummary
+ --no-rc Do not show the change in recent changes
+
+If the specified user does not exist, it will be created.
+The text for the edit will be read from stdin.
+
+EOT;
+ exit( 1 );
+}
+
+$userName = isset( $options['u'] ) ? $options['u'] : 'Maintenance script';
+$summary = isset( $options['s'] ) ? $options['s'] : '';
+$minor = isset( $options['m'] );
+$bot = isset( $options['b'] );
+$autoSummary = isset( $options['a'] );
+$noRC = isset( $options['no-rc'] );
+
+$wgUser = User::newFromName( $userName );
+if ( !$wgUser ) {
+ print "Invalid username\n";
+ exit( 1 );
+}
+if ( $wgUser->isAnon() ) {
+ $wgUser->addToDatabase();
+}
+
+$wgTitle = Title::newFromText( $args[0] );
+if ( !$wgTitle ) {
+ print "Invalid title\n";
+ exit( 1 );
+}
+
+$wgArticle = new Article( $wgTitle );
+
+# Read the text
+$text = file_get_contents( 'php://stdin' );
+
+# Do the edit
+print "Saving... ";
+$success = $wgArticle->doEdit( $text, $summary,
+ ( $minor ? EDIT_MINOR : 0 ) |
+ ( $bot ? EDIT_FORCE_BOT : 0 ) |
+ ( $autoSummary ? EDIT_AUTOSUMMARY : 0 ) |
+ ( $noRC ? EDIT_SUPPRESS_RC : 0 ) );
+if ( $success ) {
+ print "done\n";
+} else {
+ print "failed\n";
+ exit( 1 );
+}
+?>
diff --git a/maintenance/fuzz-tester.php b/maintenance/fuzz-tester.php
index 23c3cd7c..0ee052b2 100644
--- a/maintenance/fuzz-tester.php
+++ b/maintenance/fuzz-tester.php
@@ -694,7 +694,7 @@ class wikiFuzz {
);
/**
- ** @desc: Randomly returns one element of the input array.
+ ** Randomly returns one element of the input array.
*/
static public function chooseInput(array $input) {
$randindex = wikiFuzz::randnum(count($input) - 1);
@@ -705,14 +705,14 @@ class wikiFuzz {
static private $maxparams = 10;
/**
- ** @desc: Returns random number between finish and start.
+ ** Returns random number between finish and start.
*/
static public function randnum($finish,$start=0) {
return mt_rand($start,$finish);
}
/**
- ** @desc: Returns a mix of random text and random wiki syntax.
+ ** Returns a mix of random text and random wiki syntax.
*/
static private function randstring() {
$thestring = "";
@@ -740,7 +740,7 @@ class wikiFuzz {
}
/**
- ** @desc: Returns either random text, or random wiki syntax, or random data from "ints",
+ ** Returns either random text, or random wiki syntax, or random data from "ints",
** or random data from "other".
*/
static private function makestring() {
@@ -758,7 +758,7 @@ class wikiFuzz {
/**
- ** @desc: Strips out the stuff that Mediawiki balks at in a page's title.
+ ** Strips out the stuff that Mediawiki balks at in a page's title.
** Implementation copied/pasted from cleanupTable.inc & cleanupImages.php
*/
static public function makeTitleSafe($str) {
@@ -775,7 +775,7 @@ class wikiFuzz {
}
/**
- ** @desc: Returns a string of fuzz text.
+ ** Returns a string of fuzz text.
*/
static private function loop() {
switch ( wikiFuzz::randnum(3) ) {
@@ -803,7 +803,7 @@ class wikiFuzz {
}
/**
- ** @desc: Returns one of the three styles of random quote: ', ", and nothing.
+ ** Returns one of the three styles of random quote: ', ", and nothing.
*/
static private function getRandQuote() {
switch ( wikiFuzz::randnum(3) ) {
@@ -814,7 +814,7 @@ class wikiFuzz {
}
/**
- ** @desc: Returns fuzz text, with the parameter indicating approximately how many lines of text you want.
+ ** Returns fuzz text, with the parameter indicating approximately how many lines of text you want.
*/
static public function makeFuzz($maxtypes = 2) {
$page = "";
@@ -829,7 +829,7 @@ class wikiFuzz {
//////// MEDIAWIKI PAGES TO TEST, AND HOW TO TEST THEM ///////
/**
- ** @desc: A page test has just these things:
+ ** A page test has just these things:
** 1) Form parameters.
** 2) the URL we are going to test those parameters on.
** 3) Any cookies required for the test.
@@ -856,7 +856,7 @@ abstract class pageTest {
/**
- ** @desc: a page test for the "Edit" page. Tests Parser.php and Sanitizer.php.
+ ** a page test for the "Edit" page. Tests Parser.php and Sanitizer.php.
*/
class editPageTest extends pageTest {
function __construct() {
@@ -888,7 +888,7 @@ class editPageTest extends pageTest {
/**
- ** @desc: a page test for "Special:Listusers".
+ ** a page test for "Special:Listusers".
*/
class listusersTest extends pageTest {
function __construct() {
@@ -907,7 +907,7 @@ class listusersTest extends pageTest {
/**
- ** @desc: a page test for "Special:Search".
+ ** a page test for "Special:Search".
*/
class searchTest extends pageTest {
function __construct() {
@@ -942,7 +942,7 @@ class searchTest extends pageTest {
/**
- ** @desc: a page test for "Special:Recentchanges".
+ ** a page test for "Special:Recentchanges".
*/
class recentchangesTest extends pageTest {
function __construct() {
@@ -971,7 +971,7 @@ class recentchangesTest extends pageTest {
/**
- ** @desc: a page test for "Special:Prefixindex".
+ ** a page test for "Special:Prefixindex".
*/
class prefixindexTest extends pageTest {
function __construct() {
@@ -997,7 +997,7 @@ class prefixindexTest extends pageTest {
/**
- ** @desc: a page test for "Special:MIMEsearch".
+ ** a page test for "Special:MIMEsearch".
*/
class mimeSearchTest extends pageTest {
function __construct() {
@@ -1014,7 +1014,7 @@ class mimeSearchTest extends pageTest {
/**
- ** @desc: a page test for "Special:Log".
+ ** a page test for "Special:Log".
*/
class specialLogTest extends pageTest {
function __construct() {
@@ -1034,7 +1034,7 @@ class specialLogTest extends pageTest {
/**
- ** @desc: a page test for "Special:Userlogin", with a successful login.
+ ** a page test for "Special:Userlogin", with a successful login.
*/
class successfulUserLoginTest extends pageTest {
function __construct() {
@@ -1053,7 +1053,7 @@ class successfulUserLoginTest extends pageTest {
/**
- ** @desc: a page test for "Special:Userlogin".
+ ** a page test for "Special:Userlogin".
*/
class userLoginTest extends pageTest {
function __construct() {
@@ -1084,7 +1084,7 @@ class userLoginTest extends pageTest {
/**
- ** @desc: a page test for "Special:Ipblocklist" (also includes unblocking)
+ ** a page test for "Special:Ipblocklist" (also includes unblocking)
*/
class ipblocklistTest extends pageTest {
function __construct() {
@@ -1117,7 +1117,7 @@ class ipblocklistTest extends pageTest {
/**
- ** @desc: a page test for "Special:Newimages".
+ ** a page test for "Special:Newimages".
*/
class newImagesTest extends pageTest {
function __construct() {
@@ -1138,7 +1138,7 @@ class newImagesTest extends pageTest {
/**
- ** @desc: a page test for the "Special:Imagelist" page.
+ ** a page test for the "Special:Imagelist" page.
*/
class imagelistTest extends pageTest {
function __construct() {
@@ -1155,7 +1155,7 @@ class imagelistTest extends pageTest {
/**
- ** @desc: a page test for "Special:Export".
+ ** a page test for "Special:Export".
*/
class specialExportTest extends pageTest {
function __construct() {
@@ -1180,7 +1180,7 @@ class specialExportTest extends pageTest {
/**
- ** @desc: a page test for "Special:Booksources".
+ ** a page test for "Special:Booksources".
*/
class specialBooksourcesTest extends pageTest {
function __construct() {
@@ -1196,7 +1196,7 @@ class specialBooksourcesTest extends pageTest {
/**
- ** @desc: a page test for "Special:Allpages".
+ ** a page test for "Special:Allpages".
*/
class specialAllpagesTest extends pageTest {
function __construct() {
@@ -1212,7 +1212,7 @@ class specialAllpagesTest extends pageTest {
/**
- ** @desc: a page test for the page History.
+ ** a page test for the page History.
*/
class pageHistoryTest extends pageTest {
function __construct() {
@@ -1232,7 +1232,7 @@ class pageHistoryTest extends pageTest {
/**
- ** @desc: a page test for the Special:Contributions".
+ ** a page test for the Special:Contributions".
*/
class contributionsTest extends pageTest {
function __construct() {
@@ -1250,7 +1250,7 @@ class contributionsTest extends pageTest {
/**
- ** @desc: a page test for viewing a normal page, whilst posting various params.
+ ** a page test for viewing a normal page, whilst posting various params.
*/
class viewPageTest extends pageTest {
function __construct() {
@@ -1317,7 +1317,7 @@ class viewPageTest extends pageTest {
/**
- ** @desc: a page test for "Special:Allmessages".
+ ** a page test for "Special:Allmessages".
*/
class specialAllmessagesTest extends pageTest {
function __construct() {
@@ -1331,7 +1331,7 @@ class specialAllmessagesTest extends pageTest {
}
/**
- ** @desc: a page test for "Special:Newpages".
+ ** a page test for "Special:Newpages".
*/
class specialNewpages extends pageTest {
function __construct() {
@@ -1351,7 +1351,7 @@ class specialNewpages extends pageTest {
}
/**
- ** @desc: a page test for "redirect.php"
+ ** a page test for "redirect.php"
*/
class redirectTest extends pageTest {
function __construct() {
@@ -1368,7 +1368,7 @@ class redirectTest extends pageTest {
/**
- ** @desc: a page test for "Special:Confirmemail"
+ ** a page test for "Special:Confirmemail"
*/
class confirmEmail extends pageTest {
function __construct() {
@@ -1383,7 +1383,7 @@ class confirmEmail extends pageTest {
/**
- ** @desc: a page test for "Special:Watchlist"
+ ** a page test for "Special:Watchlist"
** Note: this test would be better if we were logged in.
*/
class watchlistTest extends pageTest {
@@ -1409,7 +1409,7 @@ class watchlistTest extends pageTest {
/**
- ** @desc: a page test for "Special:Blockme"
+ ** a page test for "Special:Blockme"
*/
class specialBlockmeTest extends pageTest {
function __construct() {
@@ -1426,7 +1426,7 @@ class specialBlockmeTest extends pageTest {
/**
- ** @desc: a page test for "Special:Movepage"
+ ** a page test for "Special:Movepage"
*/
class specialMovePage extends pageTest {
function __construct() {
@@ -1459,7 +1459,7 @@ class specialMovePage extends pageTest {
/**
- ** @desc: a page test for "Special:Undelete"
+ ** a page test for "Special:Undelete"
*/
class specialUndelete extends pageTest {
function __construct() {
@@ -1486,7 +1486,7 @@ class specialUndelete extends pageTest {
/**
- ** @desc: a page test for "Special:Unlockdb"
+ ** a page test for "Special:Unlockdb"
*/
class specialUnlockdb extends pageTest {
function __construct() {
@@ -1507,7 +1507,7 @@ class specialUnlockdb extends pageTest {
/**
- ** @desc: a page test for "Special:Lockdb"
+ ** a page test for "Special:Lockdb"
*/
class specialLockdb extends pageTest {
function __construct() {
@@ -1529,7 +1529,7 @@ class specialLockdb extends pageTest {
/**
- ** @desc: a page test for "Special:Userrights"
+ ** a page test for "Special:Userrights"
*/
class specialUserrights extends pageTest {
function __construct() {
@@ -1552,7 +1552,7 @@ class specialUserrights extends pageTest {
/**
- ** @desc: a test for page protection and unprotection.
+ ** a test for page protection and unprotection.
*/
class pageProtectionForm extends pageTest {
function __construct() {
@@ -1576,7 +1576,7 @@ class pageProtectionForm extends pageTest {
/**
- ** @desc: a page test for "Special:Blockip".
+ ** a page test for "Special:Blockip".
*/
class specialBlockip extends pageTest {
function __construct() {
@@ -1615,7 +1615,7 @@ class specialBlockip extends pageTest {
/**
- ** @desc: a test for the imagepage.
+ ** a test for the imagepage.
*/
class imagepageTest extends pageTest {
function __construct() {
@@ -1638,7 +1638,7 @@ class imagepageTest extends pageTest {
/**
- ** @desc: a test for page deletion form.
+ ** a test for page deletion form.
*/
class pageDeletion extends pageTest {
function __construct() {
@@ -1660,7 +1660,7 @@ class pageDeletion extends pageTest {
/**
- ** @desc: a test for Revision Deletion.
+ ** a test for Revision Deletion.
*/
class specialRevisionDelete extends pageTest {
function __construct() {
@@ -1691,7 +1691,7 @@ class specialRevisionDelete extends pageTest {
/**
- ** @desc: a test for Special:Import.
+ ** a test for Special:Import.
*/
class specialImport extends pageTest {
function __construct() {
@@ -1724,7 +1724,7 @@ class specialImport extends pageTest {
/**
- ** @desc: a test for thumb.php
+ ** a test for thumb.php
*/
class thumbTest extends pageTest {
function __construct() {
@@ -1745,7 +1745,7 @@ class thumbTest extends pageTest {
/**
- ** @desc: a test for trackback.php
+ ** a test for trackback.php
*/
class trackbackTest extends pageTest {
function __construct() {
@@ -1767,7 +1767,7 @@ class trackbackTest extends pageTest {
/**
- ** @desc: a test for profileinfo.php
+ ** a test for profileinfo.php
*/
class profileInfo extends pageTest {
function __construct() {
@@ -1787,7 +1787,7 @@ class profileInfo extends pageTest {
/**
- ** @desc: a test for Special:Cite (extension Special page).
+ ** a test for Special:Cite (extension Special page).
*/
class specialCite extends pageTest {
function __construct() {
@@ -1806,7 +1806,7 @@ class specialCite extends pageTest {
/**
- ** @desc: a test for Special:Filepath (extension Special page).
+ ** a test for Special:Filepath (extension Special page).
*/
class specialFilepath extends pageTest {
function __construct() {
@@ -1820,7 +1820,7 @@ class specialFilepath extends pageTest {
/**
- ** @desc: a test for Special:Makebot (extension Special page).
+ ** a test for Special:Makebot (extension Special page).
*/
class specialMakebot extends pageTest {
function __construct() {
@@ -1843,7 +1843,7 @@ class specialMakebot extends pageTest {
/**
- ** @desc: a test for Special:Makesysop (extension Special page).
+ ** a test for Special:Makesysop (extension Special page).
*/
class specialMakesysop extends pageTest {
function __construct() {
@@ -1866,7 +1866,7 @@ class specialMakesysop extends pageTest {
/**
- ** @desc: a test for Special:Renameuser (extension Special page).
+ ** a test for Special:Renameuser (extension Special page).
*/
class specialRenameuser extends pageTest {
function __construct() {
@@ -1882,7 +1882,7 @@ class specialRenameuser extends pageTest {
/**
- ** @desc: a test for Special:Linksearch (extension Special page).
+ ** a test for Special:Linksearch (extension Special page).
*/
class specialLinksearch extends pageTest {
function __construct() {
@@ -1899,7 +1899,7 @@ class specialLinksearch extends pageTest {
/**
- ** @desc: a test for Special:CategoryTree (extension Special page).
+ ** a test for Special:CategoryTree (extension Special page).
*/
class specialCategoryTree extends pageTest {
function __construct() {
@@ -1921,7 +1921,7 @@ class specialCategoryTree extends pageTest {
/**
- ** @desc: selects a page test to run.
+ ** selects a page test to run.
*/
function selectPageTest($count) {
@@ -1987,7 +1987,7 @@ function selectPageTest($count) {
/////////////////////// SAVING OUTPUT /////////////////////////
/**
- ** @desc: Utility function for saving a file. Currently has no error checking.
+ ** Utility function for saving a file. Currently has no error checking.
*/
function saveFile($data, $name) {
file_put_contents($name, $data);
@@ -1995,7 +1995,7 @@ function saveFile($data, $name) {
/**
- ** @desc: Returns a test as an experimental GET-to-POST URL.
+ ** Returns a test as an experimental GET-to-POST URL.
** This doesn't seem to always work though, and sometimes the output is too long
** to be a valid GET URL, so we also save in other formats.
*/
@@ -2017,7 +2017,7 @@ function getAsURL(pageTest $test) {
/**
- ** @desc: Saves a plain-text human-readable version of a test.
+ ** Saves a plain-text human-readable version of a test.
*/
function saveTestAsText(pageTest $test, $filename) {
$str = "Test: " . $test->getPagePath();
@@ -2030,7 +2030,7 @@ function saveTestAsText(pageTest $test, $filename) {
/**
- ** @desc: Saves a test as a standalone basic PHP script that shows this one problem.
+ ** Saves a test as a standalone basic PHP script that shows this one problem.
** Resulting script requires PHP-Curl be installed in order to work.
*/
function saveTestAsPHP(pageTest $test, $filename) {
@@ -2051,7 +2051,7 @@ function saveTestAsPHP(pageTest $test, $filename) {
/**
- ** @desc: Escapes a value so that it can be used on the command line by Curl.
+ ** Escapes a value so that it can be used on the command line by Curl.
** Specifically, "<" and "@" need to be escaped if they are the first character,
** otherwise curl interprets these as meaning that we want to insert a file.
*/
@@ -2068,7 +2068,7 @@ function escapeForCurl(array $input_params) {
/**
- ** @desc: Saves a test as a standalone CURL shell script that shows this one problem.
+ ** Saves a test as a standalone CURL shell script that shows this one problem.
** Resulting script requires standalone Curl be installed in order to work.
*/
function saveTestAsCurl(pageTest $test, $filename) {
@@ -2086,7 +2086,7 @@ function saveTestAsCurl(pageTest $test, $filename) {
/**
- ** @desc: Saves the internal data structure to file.
+ ** Saves the internal data structure to file.
*/
function saveTestData (pageTest $test, $filename) {
saveFile(serialize($test), $filename);
@@ -2094,7 +2094,7 @@ function saveTestData (pageTest $test, $filename) {
/**
- ** @desc: saves a test in the various formats.
+ ** saves a test in the various formats.
*/
function saveTest(pageTest $test, $testname) {
$base_name = DIRECTORY . "/" . $testname;
@@ -2108,7 +2108,7 @@ function saveTest(pageTest $test, $testname) {
//////////////////// MEDIAWIKI OUTPUT /////////////////////////
/**
- ** @desc: Asks MediaWiki for the HTML output of a test.
+ ** Asks MediaWiki for the HTML output of a test.
*/
function wikiTestOutput(pageTest $test) {
@@ -2141,7 +2141,7 @@ function wikiTestOutput(pageTest $test) {
//////////////////// HTML VALIDATION /////////////////////////
/*
- ** @desc: Asks the validator whether this is valid HTML, or not.
+ ** Asks the validator whether this is valid HTML, or not.
*/
function validateHTML($text) {
@@ -2172,7 +2172,7 @@ function validateHTML($text) {
/**
- ** @desc: Get tidy to check for no HTML errors in the output file (e.g. unescaped strings).
+ ** Get tidy to check for no HTML errors in the output file (e.g. unescaped strings).
*/
function tidyCheckFile($name) {
$file = DIRECTORY . "/" . $name;
@@ -2193,7 +2193,7 @@ function tidyCheckFile($name) {
/**
- ** @desc: Returns whether or not an database error log file has changed in size since
+ ** Returns whether or not an database error log file has changed in size since
** the last time this was run. This is used to tell if a test caused a DB error.
*/
function dbErrorLogged() {
@@ -2222,7 +2222,7 @@ function dbErrorLogged() {
////////////////// TOP-LEVEL PROBLEM-FINDING FUNCTION ////////////////////////
/**
- ** @desc: takes a page test, and runs it and tests it for problems in the output.
+ ** takes a page test, and runs it and tests it for problems in the output.
** Returns: False on finding a problem, or True on no problems being found.
*/
function runWikiTest(pageTest $test, &$testname, $can_overwrite = false) {
@@ -2315,7 +2315,7 @@ function runWikiTest(pageTest $test, &$testname, $can_overwrite = false) {
/////////////////// RERUNNING OLD TESTS ///////////////////
/**
- ** @desc: We keep our failed tests so that they can be rerun.
+ ** We keep our failed tests so that they can be rerun.
** This function does that retesting.
*/
function rerunPreviousTests() {
diff --git a/maintenance/generateSitemap.php b/maintenance/generateSitemap.php
index a0b6979d..b8d6a5d6 100644
--- a/maintenance/generateSitemap.php
+++ b/maintenance/generateSitemap.php
@@ -264,6 +264,16 @@ class GenerateSitemap {
$entry = $this->fileEntry( $title->getFullURL(), $date, $this->priority( $namespace ) );
$length += strlen( $entry );
$this->write( $this->file, $entry );
+ // generate pages for language variants
+ if($wgContLang->hasVariants()){
+ $variants = $wgContLang->getVariants();
+ foreach($variants as $vCode){
+ if($vCode==$wgContLang->getCode()) continue; // we don't want default variant
+ $entry = $this->fileEntry( $title->getFullURL('',$vCode), $date, $this->priority( $namespace ) );
+ $length += strlen( $entry );
+ $this->write( $this->file, $entry );
+ }
+ }
}
if ( $this->file ) {
$this->write( $this->file, $this->closeFile() );
diff --git a/maintenance/getLagTimes.php b/maintenance/getLagTimes.php
new file mode 100644
index 00000000..f2c06f6a
--- /dev/null
+++ b/maintenance/getLagTimes.php
@@ -0,0 +1,23 @@
+<?php
+
+require 'commandLine.inc';
+
+if( empty( $wgDBservers ) ) {
+ echo "This script dumps replication lag times, but you don't seem to have\n";
+ echo "a multi-host db server configuration.\n";
+} else {
+ $lags = $wgLoadBalancer->getLagTimes();
+ foreach( $lags as $n => $lag ) {
+ $host = $wgDBservers[$n]["host"];
+ if( IP::isValid( $host ) ) {
+ $ip = $host;
+ $host = gethostbyaddr( $host );
+ } else {
+ $ip = gethostbyname( $host );
+ }
+ $stars = str_repeat( '*', intval( $lag ) );
+ printf( "%10s %20s %3d %s\n", $ip, $host, $lag, $stars );
+ }
+}
+
+?> \ No newline at end of file
diff --git a/maintenance/getSlaveServer.php b/maintenance/getSlaveServer.php
new file mode 100644
index 00000000..ebeddc4c
--- /dev/null
+++ b/maintenance/getSlaveServer.php
@@ -0,0 +1,7 @@
+<?php
+
+require_once( dirname(__FILE__).'/commandLine.inc' );
+$i = $wgLoadBalancer->getReaderIndex();
+print $wgDBservers[$i]['host'] . "\n";
+
+?>
diff --git a/maintenance/importDump.php b/maintenance/importDump.php
index 1bca3296..22709f64 100644
--- a/maintenance/importDump.php
+++ b/maintenance/importDump.php
@@ -136,6 +136,8 @@ if( WikiError::isError( $result ) ) {
echo $result->getMessage() . "\n";
} else {
echo "Done!\n";
+ echo "You might want to run rebuildrecentchanges.php to regenerate\n";
+ echo "the recentchanges page.";
}
?>
diff --git a/maintenance/importImages.php b/maintenance/importImages.php
index 2cf8bd19..abf0ec09 100644
--- a/maintenance/importImages.php
+++ b/maintenance/importImages.php
@@ -30,7 +30,9 @@ if( count( $args ) > 1 ) {
$wgUser = User::newFromName( $options['user'] );
} else {
$wgUser = User::newFromName( 'Image import script' );
- $wgUser->setLoaded( true );
+ }
+ if ( $wgUser->isAnon() ) {
+ $wgUser->addToDatabase();
}
# Get the upload comment
@@ -119,4 +121,4 @@ END;
exit();
}
-?> \ No newline at end of file
+?>
diff --git a/maintenance/importTextFile.php b/maintenance/importTextFile.php
index 625763be..92c31fd0 100644
--- a/maintenance/importTextFile.php
+++ b/maintenance/importTextFile.php
@@ -1,111 +1,84 @@
<?php
/**
- * Maintenance script to insert an article, importing text from a file
+ * Maintenance script allows creating or editing pages using
+ * the contents of a text file
*
* @package MediaWiki
* @subpackage Maintenance
* @author Rob Church <robchur@gmail.com>
*/
-
-$options = array( 'help', 'norc' );
+
+$options = array( 'help', 'nooverwrite' );
$optionsWithArgs = array( 'title', 'user', 'comment' );
require_once( 'commandLine.inc' );
-require_once( 'importTextFile.inc' );
echo( "Import Text File\n\n" );
-if( !isset( $options['help'] ) || !$options['help'] ) {
+if( isset( $options['help'] ) ) {
+ showHelp();
+} else {
- # Check file existence
$filename = $args[0];
- echo( "Using file '{$filename}'..." );
- if( file_exists( $filename ) ) {
- echo( "found.\n" );
-
- # Work out the title for the page
- if( isset( $option['title'] ) || trim( $options['title'] ) != '' ) {
- $titleText = $options['title'];
- # Use the supplied title
- echo( "Using title '{$titleText}'..." );
- $title = Title::newFromText( $options['title'] );
- } else {
- # Attempt to make a title out of the filename
- echo( "Using title from filename..." );
- $title = titleFromFilename( $filename );
- }
+ echo( "Using {$filename}..." );
+ if( is_file( $filename ) ) {
- # Check the title's valid
- if( !is_null( $title ) && is_object( $title ) ) {
- echo( "ok.\n" );
+ $title = isset( $options['title'] ) ? $options['title'] : titleFromFilename( $filename );
+ $title = Title::newFromUrl( $title );
+ echo( "\nUsing title '" . $title->getPrefixedText() . "'..." );
- # Read in the text
- $text = file_get_contents( $filename );
-
- # Check the supplied user and fall back to a default if needed
- if( isset( $options['user'] ) && trim( $options['user'] ) != '' ) {
- $username = $options['user'];
- } else {
- $username = 'MediaWiki default';
- }
- echo( "Using user '{$username}'..." );
- $user = User::newFromName( $username );
-
- # Check the user's valid
- if( !is_null( $user ) && is_object( $user ) ) {
- echo( "ok.\n" );
- $wgUser =& $user;
+ if( is_object( $title ) ) {
- # If a comment was supplied, use it (replace _ with spaces ) else use a default
- if( isset( $options['comment'] ) || trim( $options['comment'] != '' ) ) {
- $comment = str_replace( '_', ' ', $options['comment'] );
- } else {
- $comment = 'Importing text file';
- }
- echo( "Using edit summary '{$comment}'.\n" );
+ if( !$title->exists() || !isset( $options['nooverwrite'] ) ) {
- # Do we need to update recent changes?
- if( isset( $options['norc'] ) && $options['norc'] ) {
- $rc = false;
- } else {
- $rc = true;
- }
-
- # Attempt the insertion
- echo( "Attempting to insert page..." );
- $success = insertNewArticle( $title, $text, $user, $comment, $rc );
- if( $success ) {
+ $text = file_get_contents( $filename );
+ $user = isset( $options['user'] ) ? $options['user'] : 'MediaWiki default';
+ $user = User::newFromName( $user );
+ echo( "\nUsing username '" . $user->getName() . "'..." );
+
+ if( is_object( $user ) ) {
+
+ $wgUser =& $user;
+ $comment = isset( $options['comment'] ) ? $options['comment'] : 'Importing text file';
+ $comment = str_replace( '_', ' ', $comment );
+
+ echo( "\nPerforming edit..." );
+ $article = new Article( $title );
+ $article->doEdit( $text, $comment );
echo( "done.\n" );
+
} else {
- echo( "failed. Title exists.\n" );
+ echo( "invalid username.\n" );
}
} else {
- # Dud user
- echo( "invalid username.\n" );
+ echo( "page exists.\n" );
}
} else {
- # Dud title
echo( "invalid title.\n" );
}
} else {
- # File not found
- echo( "not found.\n" );
+ echo( "does not exist.\n" );
}
-} else {
- # Show help
- echo( "Imports the contents of a text file into a wiki page.\n\n" );
- echo( "USAGE: php importTextFile.php [--help|--title <title>|--user <user>|--comment <comment>|--norc] <filename>\n\n" );
+}
+
+function titleFromFilename( $filename ) {
+ $parts = explode( '/', $filename );
+ $parts = explode( '.', $parts[ count( $parts ) - 1 ] );
+ return $parts[0];
+}
+
+function showHelp() {
+ echo( "Import the contents of a text file into a wiki page.\n\n" );
+ echo( "USAGE: php importTextFile.php [--help|--title <title>|--user <user>|--comment <comment>|--nooverwrite] <filename>\n\n" );
echo( " --help: Show this help information\n" );
echo( " --title <title> : Title for the new page; if not supplied, the filename is used as a base for the title\n" );
echo( " --user <user> : User to be associated with the edit; if not supplied, a default is used\n" );
echo( "--comment <comment> : Edit summary to be associated with the edit; underscores are transformed into spaces; if not supplied, a default is used\n" );
- echo( " <filename> : Path to the file containing the wikitext to import\n" );
- echo( " --norc : Do not add a page creation event to recent changes\n" );
-
+ echo( " --nooverwrite : Don't overwrite existing page content\n" );
+ echo( " <filename> : Path to the file containing the wikitext to import\n\n" );
}
-echo( "\n" );
?> \ No newline at end of file
diff --git a/maintenance/initEditCount.php b/maintenance/initEditCount.php
new file mode 100644
index 00000000..9d165cfb
--- /dev/null
+++ b/maintenance/initEditCount.php
@@ -0,0 +1,85 @@
+<?php
+
+require_once "commandLine.inc";
+
+if( isset( $options['help'] ) ) {
+ die( "Batch-recalculate user_editcount fields from the revision table.
+Options:
+ --quick Force the update to be done in a single query.
+ --background Force replication-friendly mode; may be inefficient but
+ avoids locking tables or lagging slaves with large updates;
+ calculates counts on a slave if possible.
+
+Background mode will be automatically used if the server is MySQL 4.0
+(which does not support subqueries) or if multiple servers are listed
+in \$wgDBservers, usually indicating a replication environment.
+
+");
+}
+$dbw = wfGetDB( DB_MASTER );
+$user = $dbw->tableName( 'user' );
+$revision = $dbw->tableName( 'revision' );
+
+$dbver = $dbw->getServerVersion();
+
+// Autodetect mode...
+$backgroundMode = count( $wgDBservers ) > 1 ||
+ ($dbw instanceof DatabaseMySql && version_compare( $dbver, '4.1' ) < 0);
+
+if( isset( $options['background'] ) ) {
+ $backgroundMode = true;
+} elseif( isset( $options['quick'] ) ) {
+ $backgroundMode = false;
+}
+
+if( $backgroundMode ) {
+ echo "Using replication-friendly background mode...\n";
+
+ $dbr = wfGetDB( DB_SLAVE );
+ $chunkSize = 100;
+ $lastUser = $dbr->selectField( 'user', 'MAX(user_id)', '', __FUNCTION__ );
+
+ $start = microtime( true );
+ $migrated = 0;
+ for( $min = 0; $min <= $lastUser; $min += $chunkSize ) {
+ $max = $min + $chunkSize;
+ $result = $dbr->query(
+ "SELECT
+ user_id,
+ COUNT(rev_user) AS user_editcount
+ FROM $user
+ LEFT OUTER JOIN $revision ON user_id=rev_user
+ WHERE user_id > $min AND user_id <= $max
+ GROUP BY user_id",
+ __FUNCTION__ );
+
+ while( $row = $dbr->fetchObject( $result ) ) {
+ $dbw->update( 'user',
+ array( 'user_editcount' => $row->user_editcount ),
+ array( 'user_id' => $row->user_id ),
+ __FUNCTION__ );
+ ++$migrated;
+ }
+ $dbr->freeResult( $result );
+
+ $delta = microtime( true ) - $start;
+ $rate = ($delta == 0.0) ? 0.0 : $migrated / $delta;
+ printf( "%s %d (%0.1f%%) done in %0.1f secs (%0.3f accounts/sec).\n",
+ $wgDBname,
+ $migrated,
+ min( $max, $lastUser ) / $lastUser * 100.0,
+ $delta,
+ $rate );
+
+ wfWaitForSlaves( 10 );
+ }
+} else {
+ // Subselect should work on modern MySQLs etc
+ echo "Using single-query mode...\n";
+ $sql = "UPDATE $user SET user_editcount=(SELECT COUNT(*) FROM $revision WHERE rev_user=user_id)";
+ $dbw->query( $sql );
+}
+
+echo "Done!\n";
+
+?>
diff --git a/maintenance/initStats.php b/maintenance/initStats.php
index b622c3f0..291de1ee 100644
--- a/maintenance/initStats.php
+++ b/maintenance/initStats.php
@@ -23,6 +23,7 @@ if( isset( $options['help'] ) ) {
echo( "Counting total edits..." );
$edits = $dbr->selectField( 'revision', 'COUNT(*)', '', $fname );
+$edits += $dbr->selectField( 'archive', 'COUNT(*)', '', $fname );
echo( "{$edits}\nCounting number of articles..." );
global $wgContentNamespaces;
diff --git a/maintenance/interwiki.sql b/maintenance/interwiki.sql
index ca656e46..b0df5557 100644
--- a/maintenance/interwiki.sql
+++ b/maintenance/interwiki.sql
@@ -147,7 +147,7 @@ REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local) VALUES
('twistedwiki','http://purl.net/wiki/twisted/$1',0),
('uea','http://www.tejo.org/uea/$1',0),
('unreal','http://wiki.beyondunreal.com/wiki/$1',0),
-('ursine','http://ursine.ca/$1',0),
+('ursine','http://wiki.ursine.ca/$1',0),
('usej','http://www.tejo.org/usej/$1',0),
('usemod','http://www.usemod.com/cgi-bin/wiki.pl?$1',0),
('visualworks','http://wiki.cs.uiuc.edu/VisualWorks/$1',0),
@@ -157,10 +157,11 @@ REPLACE INTO /*$wgDBprefix*/interwiki (iw_prefix,iw_url,iw_local) VALUES
('webseitzwiki','http://webseitz.fluxent.com/wiki/$1',0),
('why','http://clublet.com/c/c/why?$1',0),
('wiki','http://c2.com/cgi/wiki?$1',0),
-('wikia','http://www.wikia.com/wiki/index.php/$1',0),
+('wikia','http://www.wikia.com/wiki/$1',0),
('wikibooks','http://en.wikibooks.org/wiki/$1',1),
('wikicities','http://www.wikicities.com/index.php/$1',0),
('wikif1','http://www.wikif1.org/$1',0),
+('wikihow','http://www.wikihow.com/$1',0),
('wikinfo','http://www.wikinfo.org/wiki.php?title=$1',0),
('wikimedia','http://wikimediafoundation.org/wiki/$1',0),
('wikiquote','http://en.wikiquote.org/wiki/$1',1),
diff --git a/maintenance/language/langmemusage.php b/maintenance/language/langmemusage.php
index 974bb0d8..54b6a58c 100644
--- a/maintenance/language/langmemusage.php
+++ b/maintenance/language/langmemusage.php
@@ -18,7 +18,7 @@ $memlast = $memstart = memory_get_usage();
print 'Base memory usage: '.$memstart."\n";
foreach ( $langtool->getLanguages() as $langcode ) {
- require_once( Language::getClassFileName( $langcode ) );
+ Language::factory( $langcode );
$memstep = memory_get_usage();
printf( "%12s: %d\n", $langcode, ($memstep- $memlast) );
$memlast = $memstep;
diff --git a/maintenance/language/languages.inc b/maintenance/language/languages.inc
index 86cd0869..946c6cb2 100644
--- a/maintenance/language/languages.inc
+++ b/maintenance/language/languages.inc
@@ -6,328 +6,15 @@
* @subpackage Maintenance
*/
+require_once( 'messageTypes.inc' );
+
class languages {
private $mLanguages; # List of languages
private $mRawMessages; # Raw list of the messages in each language
private $mMessages; # Messages in each language (except for English), divided to groups
private $mGeneralMessages; # General messages in English, divided to groups
- private $mIgnoredMessages = array(
- 'sidebar',
- 'addsection',
- 'anonnotice',
- 'catseparator',
- 'googlesearch',
- 'exif-make-value',
- 'exif-model-value',
- 'exif-software-value',
- 'history_copyright',
- 'licenses',
- 'loginend',
- 'loginlanguagelinks',
- 'markaspatrolledlink',
- 'newarticletextanon',
- 'noarticletextanon',
- 'number_of_watching_users_RCview',
- 'pubmedurl',
- 'randompage-url',
- 'recentchanges-url',
- 'rfcurl',
- 'shareddescriptionfollows',
- 'signupend',
- 'sitenotice',
- 'sitesubtitle',
- 'sitetitle',
- 'talkpagetext',
- 'trackback',
- 'trackbackexcerpt',
- 'widthheight',
- ); # All the messages which should be exist only in the English file
- private $mOptionalMessages = array(
- 'imgmultigotopost',
- 'linkprefix',
- 'allpages-summary',
- 'booksources-summary',
- 'ipblocklist-summary',
- 'listusers-summary',
- 'longpages-summary',
- 'preferences-summary',
- 'specialpages-summary',
- 'whatlinkshere-summary',
- 'whatlinkshere-barrow',
- 'imagelist-summary',
- 'mimesearch-summary',
- 'listredirects-summary',
- 'uncategorizedpages-summary',
- 'uncategorizedcategories-summary',
- 'uncategorizedimages-summary',
- 'popularpages-summary',
- 'wantedcategories-summary',
- 'wantedpages-summary',
- 'mostlinked-summary',
- 'mostlinkedcategories-summary',
- 'mostcategories-summary',
- 'mostimages-summary',
- 'mostrevisions-summary',
- 'prefixindex-summary',
- 'shortpages-summary',
- 'newpages-summary',
- 'ancientpages-summary',
- 'newimages-summary',
- 'unwatchedpages-summary',
- 'userrights-summary',
- 'variantname-zh-cn',
- 'variantname-zh-tw',
- 'variantname-zh-hk',
- 'variantname-zh-sg',
- 'variantname-zh',
- 'variantname-sr-ec',
- 'variantname-sr-el',
- 'variantname-sr-jc',
- 'variantname-sr-jl',
- 'variantname-sr',
- 'variantname-kk-tr',
- 'variantname-kk-kz',
- 'variantname-kk-cn',
- 'variantname-kk',
- ); # All the messages which may be translated or not, depending on the language
- private $mEXIFMessages = array(
- 'exif-imagewidth',
- 'exif-imagelength',
- 'exif-bitspersample',
- 'exif-compression',
- 'exif-photometricinterpretation',
- 'exif-orientation',
- 'exif-samplesperpixel',
- 'exif-planarconfiguration',
- 'exif-ycbcrsubsampling',
- 'exif-ycbcrpositioning',
- 'exif-xresolution',
- 'exif-yresolution',
- 'exif-resolutionunit',
- 'exif-stripoffsets',
- 'exif-rowsperstrip',
- 'exif-stripbytecounts',
- 'exif-jpeginterchangeformat',
- 'exif-jpeginterchangeformatlength',
- 'exif-transferfunction',
- 'exif-whitepoint',
- 'exif-primarychromaticities',
- 'exif-ycbcrcoefficients',
- 'exif-referenceblackwhite',
- 'exif-datetime',
- 'exif-imagedescription',
- 'exif-make',
- 'exif-model',
- 'exif-software',
- 'exif-artist',
- 'exif-copyright',
- 'exif-exifversion',
- 'exif-flashpixversion',
- 'exif-colorspace',
- 'exif-componentsconfiguration',
- 'exif-compressedbitsperpixel',
- 'exif-pixelydimension',
- 'exif-pixelxdimension',
- 'exif-makernote',
- 'exif-usercomment',
- 'exif-relatedsoundfile',
- 'exif-datetimeoriginal',
- 'exif-datetimedigitized',
- 'exif-subsectime',
- 'exif-subsectimeoriginal',
- 'exif-subsectimedigitized',
- 'exif-exposuretime',
- 'exif-exposuretime-format',
- 'exif-fnumber',
- 'exif-fnumber-format',
- 'exif-exposureprogram',
- 'exif-spectralsensitivity',
- 'exif-isospeedratings',
- 'exif-oecf',
- 'exif-shutterspeedvalue',
- 'exif-aperturevalue',
- 'exif-brightnessvalue',
- 'exif-exposurebiasvalue',
- 'exif-maxaperturevalue',
- 'exif-subjectdistance',
- 'exif-meteringmode',
- 'exif-lightsource',
- 'exif-flash',
- 'exif-focallength',
- 'exif-focallength-format',
- 'exif-subjectarea',
- 'exif-flashenergy',
- 'exif-spatialfrequencyresponse',
- 'exif-focalplanexresolution',
- 'exif-focalplaneyresolution',
- 'exif-focalplaneresolutionunit',
- 'exif-subjectlocation',
- 'exif-exposureindex',
- 'exif-sensingmethod',
- 'exif-filesource',
- 'exif-scenetype',
- 'exif-cfapattern',
- 'exif-customrendered',
- 'exif-exposuremode',
- 'exif-whitebalance',
- 'exif-digitalzoomratio',
- 'exif-focallengthin35mmfilm',
- 'exif-scenecapturetype',
- 'exif-gaincontrol',
- 'exif-contrast',
- 'exif-saturation',
- 'exif-sharpness',
- 'exif-devicesettingdescription',
- 'exif-subjectdistancerange',
- 'exif-imageuniqueid',
- 'exif-gpsversionid',
- 'exif-gpslatituderef',
- 'exif-gpslatitude',
- 'exif-gpslongituderef',
- 'exif-gpslongitude',
- 'exif-gpsaltituderef',
- 'exif-gpsaltitude',
- 'exif-gpstimestamp',
- 'exif-gpssatellites',
- 'exif-gpsstatus',
- 'exif-gpsmeasuremode',
- 'exif-gpsdop',
- 'exif-gpsspeedref',
- 'exif-gpsspeed',
- 'exif-gpstrackref',
- 'exif-gpstrack',
- 'exif-gpsimgdirectionref',
- 'exif-gpsimgdirection',
- 'exif-gpsmapdatum',
- 'exif-gpsdestlatituderef',
- 'exif-gpsdestlatitude',
- 'exif-gpsdestlongituderef',
- 'exif-gpsdestlongitude',
- 'exif-gpsdestbearingref',
- 'exif-gpsdestbearing',
- 'exif-gpsdestdistanceref',
- 'exif-gpsdestdistance',
- 'exif-gpsprocessingmethod',
- 'exif-gpsareainformation',
- 'exif-gpsdatestamp',
- 'exif-gpsdifferential',
- 'exif-compression-1',
- 'exif-compression-6',
- 'exif-photometricinterpretation-2',
- 'exif-photometricinterpretation-6',
- 'exif-orientation-1',
- 'exif-orientation-2',
- 'exif-orientation-3',
- 'exif-orientation-4',
- 'exif-orientation-5',
- 'exif-orientation-6',
- 'exif-orientation-7',
- 'exif-orientation-8',
- 'exif-planarconfiguration-1',
- 'exif-planarconfiguration-2',
- 'exif-xyresolution-i',
- 'exif-xyresolution-c',
- 'exif-colorspace-1',
- 'exif-colorspace-ffff.h',
- 'exif-componentsconfiguration-0',
- 'exif-componentsconfiguration-1',
- 'exif-componentsconfiguration-2',
- 'exif-componentsconfiguration-3',
- 'exif-componentsconfiguration-4',
- 'exif-componentsconfiguration-5',
- 'exif-componentsconfiguration-6',
- 'exif-exposureprogram-0',
- 'exif-exposureprogram-1',
- 'exif-exposureprogram-2',
- 'exif-exposureprogram-3',
- 'exif-exposureprogram-4',
- 'exif-exposureprogram-5',
- 'exif-exposureprogram-6',
- 'exif-exposureprogram-7',
- 'exif-exposureprogram-8',
- 'exif-subjectdistance-value',
- 'exif-meteringmode-0',
- 'exif-meteringmode-1',
- 'exif-meteringmode-2',
- 'exif-meteringmode-3',
- 'exif-meteringmode-4',
- 'exif-meteringmode-5',
- 'exif-meteringmode-6',
- 'exif-meteringmode-255',
- 'exif-lightsource-0',
- 'exif-lightsource-1',
- 'exif-lightsource-2',
- 'exif-lightsource-3',
- 'exif-lightsource-4',
- 'exif-lightsource-9',
- 'exif-lightsource-10',
- 'exif-lightsource-11',
- 'exif-lightsource-12',
- 'exif-lightsource-13',
- 'exif-lightsource-14',
- 'exif-lightsource-15',
- 'exif-lightsource-17',
- 'exif-lightsource-18',
- 'exif-lightsource-19',
- 'exif-lightsource-20',
- 'exif-lightsource-21',
- 'exif-lightsource-22',
- 'exif-lightsource-23',
- 'exif-lightsource-24',
- 'exif-lightsource-255',
- 'exif-focalplaneresolutionunit-2',
- 'exif-sensingmethod-1',
- 'exif-sensingmethod-2',
- 'exif-sensingmethod-3',
- 'exif-sensingmethod-4',
- 'exif-sensingmethod-5',
- 'exif-sensingmethod-7',
- 'exif-sensingmethod-8',
- 'exif-filesource-3',
- 'exif-scenetype-1',
- 'exif-customrendered-0',
- 'exif-customrendered-1',
- 'exif-exposuremode-0',
- 'exif-exposuremode-1',
- 'exif-exposuremode-2',
- 'exif-whitebalance-0',
- 'exif-whitebalance-1',
- 'exif-scenecapturetype-0',
- 'exif-scenecapturetype-1',
- 'exif-scenecapturetype-2',
- 'exif-scenecapturetype-3',
- 'exif-gaincontrol-0',
- 'exif-gaincontrol-1',
- 'exif-gaincontrol-2',
- 'exif-gaincontrol-3',
- 'exif-gaincontrol-4',
- 'exif-contrast-0',
- 'exif-contrast-1',
- 'exif-contrast-2',
- 'exif-saturation-0',
- 'exif-saturation-1',
- 'exif-saturation-2',
- 'exif-sharpness-0',
- 'exif-sharpness-1',
- 'exif-sharpness-2',
- 'exif-subjectdistancerange-0',
- 'exif-subjectdistancerange-1',
- 'exif-subjectdistancerange-2',
- 'exif-subjectdistancerange-3',
- 'exif-gpslatitude-n',
- 'exif-gpslatitude-s',
- 'exif-gpslongitude-e',
- 'exif-gpslongitude-w',
- 'exif-gpsstatus-a',
- 'exif-gpsstatus-v',
- 'exif-gpsmeasuremode-2',
- 'exif-gpsmeasuremode-3',
- 'exif-gpsspeed-k',
- 'exif-gpsspeed-m',
- 'exif-gpsspeed-n',
- 'exif-gpsdirection-t',
- 'exif-gpsdirection-m',
- ); # All the EXIF messages, may be set as optional if defined as such
+ private $mIgnoredMessages; # All the messages which should be exist only in the English file
+ private $mOptionalMessages; # All the messages which may be translated or not, depending on the language
/**
* Load the list of languages: all the Messages*.php
@@ -336,11 +23,16 @@ class languages {
* @param $exif Treat the EXIF messages?
*/
function __construct( $exif = true ) {
+ global $wgIgnoredMessages, $wgOptionalMessages, $wgEXIFMessages;
+ $this->mIgnoredMessages = $wgIgnoredMessages;
+ if ( $exif ) {
+ $this->mOptionalMessages = array_merge( $wgOptionalMessages );
+ } else {
+ $this->mOptionalMessages = array_merge( $wgOptionalMessages, $wgEXIFMessages );
+ }
+
$this->mLanguages = array_keys( Language::getLanguageNames( true ) );
sort( $this->mLanguages );
- if ( !$exif ) {
- $this->mOptionalMessages = array_merge( $this->mOptionalMessages, $this->mEXIFMessages );
- }
}
/**
@@ -353,6 +45,24 @@ class languages {
}
/**
+ * Get the ignored messages list.
+ *
+ * @return The ignored messages list.
+ */
+ public function getIgnoredMessages() {
+ return $this->mIgnoredMessages;
+ }
+
+ /**
+ * Get the optional messages list.
+ *
+ * @return The optional messages list.
+ */
+ public function getOptionalMessages() {
+ return $this->mOptionalMessages;
+ }
+
+ /**
* Load the raw messages for a specific langauge from the messages file.
*
* @param $code The langauge code.
diff --git a/maintenance/language/messageTypes.inc b/maintenance/language/messageTypes.inc
new file mode 100644
index 00000000..f7f1ffeb
--- /dev/null
+++ b/maintenance/language/messageTypes.inc
@@ -0,0 +1,346 @@
+<?php
+/**
+ * Several types of messages.
+ *
+ * @package MediaWiki
+ * @subpackage Maintenance
+ */
+
+/** Ignored messages, which should be exist only in the English messages file. */
+$wgIgnoredMessages = array(
+ 'sidebar',
+ 'addsection',
+ 'anonnotice',
+ 'autoblock_whitelist',
+ 'catseparator',
+ 'googlesearch',
+ 'exif-make-value',
+ 'exif-model-value',
+ 'exif-software-value',
+ 'history_copyright',
+ 'licenses',
+ 'loginend',
+ 'loginlanguagelinks',
+ 'markaspatrolledlink',
+ 'newarticletextanon',
+ 'newtalkseperator',
+ 'noarticletextanon',
+ 'number_of_watching_users_RCview',
+ 'pagecategorieslink',
+ 'pubmedurl',
+ 'randompage-url',
+ 'rc-change-size',
+ 'recentchanges-url',
+ 'revision-nav',
+ 'rfcurl',
+ 'shareddescriptionfollows',
+ 'signupend',
+ 'sitenotice',
+ 'sitesubtitle',
+ 'sitetitle',
+ 'talkpagetext',
+ 'trackback',
+ 'trackbackexcerpt',
+ 'widthheight',
+);
+
+/** Optional messages, which may be translated only if changed in the other language. */
+$wgOptionalMessages = array(
+ 'imgmultigotopost',
+ 'linkprefix',
+ 'feed-atom',
+ 'feed-rss',
+ 'allpages-summary',
+ 'booksources-summary',
+ 'ipblocklist-summary',
+ 'listusers-summary',
+ 'longpages-summary',
+ 'preferences-summary',
+ 'specialpages-summary',
+ 'whatlinkshere-summary',
+ 'whatlinkshere-barrow',
+ 'imagelist-summary',
+ 'mimesearch-summary',
+ 'listredirects-summary',
+ 'uncategorizedpages-summary',
+ 'uncategorizedcategories-summary',
+ 'uncategorizedimages-summary',
+ 'popularpages-summary',
+ 'wantedcategories-summary',
+ 'wantedpages-summary',
+ 'mostlinked-summary',
+ 'mostlinkedcategories-summary',
+ 'mostcategories-summary',
+ 'mostimages-summary',
+ 'mostrevisions-summary',
+ 'prefixindex-summary',
+ 'shortpages-summary',
+ 'newpages-summary',
+ 'ancientpages-summary',
+ 'newimages-summary',
+ 'unwatchedpages-summary',
+ 'userrights-summary',
+ 'brokenredirects-summary',
+ 'deadendpages-summary',
+ 'disambiguations-summary',
+ 'doubleredirects-summary',
+ 'lonelypages-summary',
+ 'unusedtemplates-summary',
+ 'variantname-zh-cn',
+ 'variantname-zh-tw',
+ 'variantname-zh-hk',
+ 'variantname-zh-sg',
+ 'variantname-zh',
+ 'variantname-sr-ec',
+ 'variantname-sr-el',
+ 'variantname-sr-jc',
+ 'variantname-sr-jl',
+ 'variantname-sr',
+ 'variantname-kk-tr',
+ 'variantname-kk-kz',
+ 'variantname-kk-cn',
+ 'variantname-kk',
+);
+
+/** EXIF messages, which may be set as optional in several checks, but are generally mandatory */
+$wgEXIFMessages = array(
+ 'exif-imagewidth',
+ 'exif-imagelength',
+ 'exif-bitspersample',
+ 'exif-compression',
+ 'exif-photometricinterpretation',
+ 'exif-orientation',
+ 'exif-samplesperpixel',
+ 'exif-planarconfiguration',
+ 'exif-ycbcrsubsampling',
+ 'exif-ycbcrpositioning',
+ 'exif-xresolution',
+ 'exif-yresolution',
+ 'exif-resolutionunit',
+ 'exif-stripoffsets',
+ 'exif-rowsperstrip',
+ 'exif-stripbytecounts',
+ 'exif-jpeginterchangeformat',
+ 'exif-jpeginterchangeformatlength',
+ 'exif-transferfunction',
+ 'exif-whitepoint',
+ 'exif-primarychromaticities',
+ 'exif-ycbcrcoefficients',
+ 'exif-referenceblackwhite',
+ 'exif-datetime',
+ 'exif-imagedescription',
+ 'exif-make',
+ 'exif-model',
+ 'exif-software',
+ 'exif-artist',
+ 'exif-copyright',
+ 'exif-exifversion',
+ 'exif-flashpixversion',
+ 'exif-colorspace',
+ 'exif-componentsconfiguration',
+ 'exif-compressedbitsperpixel',
+ 'exif-pixelydimension',
+ 'exif-pixelxdimension',
+ 'exif-makernote',
+ 'exif-usercomment',
+ 'exif-relatedsoundfile',
+ 'exif-datetimeoriginal',
+ 'exif-datetimedigitized',
+ 'exif-subsectime',
+ 'exif-subsectimeoriginal',
+ 'exif-subsectimedigitized',
+ 'exif-exposuretime',
+ 'exif-exposuretime-format',
+ 'exif-fnumber',
+ 'exif-fnumber-format',
+ 'exif-exposureprogram',
+ 'exif-spectralsensitivity',
+ 'exif-isospeedratings',
+ 'exif-oecf',
+ 'exif-shutterspeedvalue',
+ 'exif-aperturevalue',
+ 'exif-brightnessvalue',
+ 'exif-exposurebiasvalue',
+ 'exif-maxaperturevalue',
+ 'exif-subjectdistance',
+ 'exif-meteringmode',
+ 'exif-lightsource',
+ 'exif-flash',
+ 'exif-focallength',
+ 'exif-focallength-format',
+ 'exif-subjectarea',
+ 'exif-flashenergy',
+ 'exif-spatialfrequencyresponse',
+ 'exif-focalplanexresolution',
+ 'exif-focalplaneyresolution',
+ 'exif-focalplaneresolutionunit',
+ 'exif-subjectlocation',
+ 'exif-exposureindex',
+ 'exif-sensingmethod',
+ 'exif-filesource',
+ 'exif-scenetype',
+ 'exif-cfapattern',
+ 'exif-customrendered',
+ 'exif-exposuremode',
+ 'exif-whitebalance',
+ 'exif-digitalzoomratio',
+ 'exif-focallengthin35mmfilm',
+ 'exif-scenecapturetype',
+ 'exif-gaincontrol',
+ 'exif-contrast',
+ 'exif-saturation',
+ 'exif-sharpness',
+ 'exif-devicesettingdescription',
+ 'exif-subjectdistancerange',
+ 'exif-imageuniqueid',
+ 'exif-gpsversionid',
+ 'exif-gpslatituderef',
+ 'exif-gpslatitude',
+ 'exif-gpslongituderef',
+ 'exif-gpslongitude',
+ 'exif-gpsaltituderef',
+ 'exif-gpsaltitude',
+ 'exif-gpstimestamp',
+ 'exif-gpssatellites',
+ 'exif-gpsstatus',
+ 'exif-gpsmeasuremode',
+ 'exif-gpsdop',
+ 'exif-gpsspeedref',
+ 'exif-gpsspeed',
+ 'exif-gpstrackref',
+ 'exif-gpstrack',
+ 'exif-gpsimgdirectionref',
+ 'exif-gpsimgdirection',
+ 'exif-gpsmapdatum',
+ 'exif-gpsdestlatituderef',
+ 'exif-gpsdestlatitude',
+ 'exif-gpsdestlongituderef',
+ 'exif-gpsdestlongitude',
+ 'exif-gpsdestbearingref',
+ 'exif-gpsdestbearing',
+ 'exif-gpsdestdistanceref',
+ 'exif-gpsdestdistance',
+ 'exif-gpsprocessingmethod',
+ 'exif-gpsareainformation',
+ 'exif-gpsdatestamp',
+ 'exif-gpsdifferential',
+ 'exif-compression-1',
+ 'exif-compression-6',
+ 'exif-unknowndate',
+ 'exif-photometricinterpretation-2',
+ 'exif-photometricinterpretation-6',
+ 'exif-orientation-1',
+ 'exif-orientation-2',
+ 'exif-orientation-3',
+ 'exif-orientation-4',
+ 'exif-orientation-5',
+ 'exif-orientation-6',
+ 'exif-orientation-7',
+ 'exif-orientation-8',
+ 'exif-planarconfiguration-1',
+ 'exif-planarconfiguration-2',
+ 'exif-xyresolution-i',
+ 'exif-xyresolution-c',
+ 'exif-colorspace-1',
+ 'exif-colorspace-ffff.h',
+ 'exif-componentsconfiguration-0',
+ 'exif-componentsconfiguration-1',
+ 'exif-componentsconfiguration-2',
+ 'exif-componentsconfiguration-3',
+ 'exif-componentsconfiguration-4',
+ 'exif-componentsconfiguration-5',
+ 'exif-componentsconfiguration-6',
+ 'exif-exposureprogram-0',
+ 'exif-exposureprogram-1',
+ 'exif-exposureprogram-2',
+ 'exif-exposureprogram-3',
+ 'exif-exposureprogram-4',
+ 'exif-exposureprogram-5',
+ 'exif-exposureprogram-6',
+ 'exif-exposureprogram-7',
+ 'exif-exposureprogram-8',
+ 'exif-subjectdistance-value',
+ 'exif-meteringmode-0',
+ 'exif-meteringmode-1',
+ 'exif-meteringmode-2',
+ 'exif-meteringmode-3',
+ 'exif-meteringmode-4',
+ 'exif-meteringmode-5',
+ 'exif-meteringmode-6',
+ 'exif-meteringmode-255',
+ 'exif-lightsource-0',
+ 'exif-lightsource-1',
+ 'exif-lightsource-2',
+ 'exif-lightsource-3',
+ 'exif-lightsource-4',
+ 'exif-lightsource-9',
+ 'exif-lightsource-10',
+ 'exif-lightsource-11',
+ 'exif-lightsource-12',
+ 'exif-lightsource-13',
+ 'exif-lightsource-14',
+ 'exif-lightsource-15',
+ 'exif-lightsource-17',
+ 'exif-lightsource-18',
+ 'exif-lightsource-19',
+ 'exif-lightsource-20',
+ 'exif-lightsource-21',
+ 'exif-lightsource-22',
+ 'exif-lightsource-23',
+ 'exif-lightsource-24',
+ 'exif-lightsource-255',
+ 'exif-focalplaneresolutionunit-2',
+ 'exif-sensingmethod-1',
+ 'exif-sensingmethod-2',
+ 'exif-sensingmethod-3',
+ 'exif-sensingmethod-4',
+ 'exif-sensingmethod-5',
+ 'exif-sensingmethod-7',
+ 'exif-sensingmethod-8',
+ 'exif-filesource-3',
+ 'exif-scenetype-1',
+ 'exif-customrendered-0',
+ 'exif-customrendered-1',
+ 'exif-exposuremode-0',
+ 'exif-exposuremode-1',
+ 'exif-exposuremode-2',
+ 'exif-whitebalance-0',
+ 'exif-whitebalance-1',
+ 'exif-scenecapturetype-0',
+ 'exif-scenecapturetype-1',
+ 'exif-scenecapturetype-2',
+ 'exif-scenecapturetype-3',
+ 'exif-gaincontrol-0',
+ 'exif-gaincontrol-1',
+ 'exif-gaincontrol-2',
+ 'exif-gaincontrol-3',
+ 'exif-gaincontrol-4',
+ 'exif-contrast-0',
+ 'exif-contrast-1',
+ 'exif-contrast-2',
+ 'exif-saturation-0',
+ 'exif-saturation-1',
+ 'exif-saturation-2',
+ 'exif-sharpness-0',
+ 'exif-sharpness-1',
+ 'exif-sharpness-2',
+ 'exif-subjectdistancerange-0',
+ 'exif-subjectdistancerange-1',
+ 'exif-subjectdistancerange-2',
+ 'exif-subjectdistancerange-3',
+ 'exif-gpslatitude-n',
+ 'exif-gpslatitude-s',
+ 'exif-gpslongitude-e',
+ 'exif-gpslongitude-w',
+ 'exif-gpsstatus-a',
+ 'exif-gpsstatus-v',
+ 'exif-gpsmeasuremode-2',
+ 'exif-gpsmeasuremode-3',
+ 'exif-gpsspeed-k',
+ 'exif-gpsspeed-m',
+ 'exif-gpsspeed-n',
+ 'exif-gpsdirection-t',
+ 'exif-gpsdirection-m',
+);
+
+?>
diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc
new file mode 100644
index 00000000..4fbe2ed1
--- /dev/null
+++ b/maintenance/language/messages.inc
@@ -0,0 +1,2081 @@
+<?php
+/**
+ * Define the messages structure in the messages file, for a future automated rewriting.
+ *
+ * @package MediaWiki
+ * @subpackage Maintenance
+ */
+
+/** The structure of the messages, divided to blocks */
+$wgMessageStrucutre = array(
+ 'sidebar' => array(
+ 'sidebar',
+ ),
+ 'toggles' => array(
+ 'tog-underline',
+ 'tog-highlightbroken',
+ 'tog-justify',
+ 'tog-hideminor',
+ 'tog-extendwatchlist',
+ 'tog-usenewrc',
+ 'tog-numberheadings',
+ 'tog-showtoolbar',
+ 'tog-editondblclick',
+ 'tog-editsection',
+ 'tog-editsectiononrightclick',
+ 'tog-showtoc',
+ 'tog-rememberpassword',
+ 'tog-editwidth',
+ 'tog-watchcreations',
+ 'tog-watchdefault',
+ 'tog-watchmoves',
+ 'tog-watchdeletion',
+ 'tog-minordefault',
+ 'tog-previewontop',
+ 'tog-previewonfirst',
+ 'tog-nocache',
+ 'tog-enotifwatchlistpages',
+ 'tog-enotifusertalkpages',
+ 'tog-enotifminoredits',
+ 'tog-enotifrevealaddr',
+ 'tog-shownumberswatching',
+ 'tog-fancysig',
+ 'tog-externaleditor',
+ 'tog-externaldiff',
+ 'tog-showjumplinks',
+ 'tog-uselivepreview',
+ 'tog-forceeditsummary',
+ 'tog-watchlisthideown',
+ 'tog-watchlisthidebots',
+ 'tog-watchlisthideminor',
+ 'tog-nolangconversion',
+ 'tog-ccmeonemails',
+ ),
+ 'underline' => array(
+ 'underline-always',
+ 'underline-never',
+ 'underline-default',
+ ),
+ 'skinpreview' => array(
+ 'skinpreview',
+ ),
+ 'dates' => array(
+ 'sunday',
+ 'monday',
+ 'tuesday',
+ 'wednesday',
+ 'thursday',
+ 'friday',
+ 'saturday',
+ 'sun',
+ 'mon',
+ 'tue',
+ 'wed',
+ 'thu',
+ 'fri',
+ 'sat',
+ 'january',
+ 'february',
+ 'march',
+ 'april',
+ 'may_long',
+ 'june',
+ 'july',
+ 'august',
+ 'september',
+ 'october',
+ 'november',
+ 'december',
+ 'january-gen',
+ 'february-gen',
+ 'march-gen',
+ 'april-gen',
+ 'may-gen',
+ 'june-gen',
+ 'july-gen',
+ 'august-gen',
+ 'september-gen',
+ 'october-gen',
+ 'november-gen',
+ 'december-gen',
+ 'jan',
+ 'feb',
+ 'mar',
+ 'apr',
+ 'may',
+ 'jun',
+ 'jul',
+ 'aug',
+ 'sep',
+ 'oct',
+ 'nov',
+ 'dec',
+ ),
+ 'categories' => array(
+ 'categories',
+ 'pagecategories',
+ 'pagecategorieslink',
+ 'category_header',
+ 'subcategories',
+ 'category-media-header',
+ ),
+ 'mainpage' => array(
+ 'linkprefix',
+ 'mainpage',
+ 'mainpagetext',
+ 'mainpagedocfooter',
+ ),
+ 'miscellaneous1' => array(
+ 'portal',
+ 'portal-url',
+ 'about',
+ 'aboutsite',
+ 'aboutpage',
+ 'article',
+ 'help',
+ 'helppage',
+ 'bugreports',
+ 'bugreportspage',
+ 'sitesupport',
+ 'sitesupport-url',
+ 'faq',
+ 'faqpage',
+ 'edithelp',
+ 'newwindow',
+ 'edithelppage',
+ 'cancel',
+ 'qbfind',
+ 'qbbrowse',
+ 'qbedit',
+ 'qbpageoptions',
+ 'qbpageinfo',
+ 'qbmyoptions',
+ 'qbspecialpages',
+ 'moredotdotdot',
+ 'mypage',
+ 'mytalk',
+ 'anontalk',
+ 'navigation',
+ ),
+ 'metadata_help' => array(
+ 'metadata_help',
+ ),
+ 'currentevents' => array(
+ 'currentevents',
+ 'currentevents-url',
+ ),
+ 'miscellaneous2' => array(
+ 'disclaimers',
+ 'disclaimerpage',
+ 'privacy',
+ 'privacypage',
+ 'errorpagetitle',
+ 'returnto',
+ 'tagline',
+ 'help',
+ 'search',
+ 'searchbutton',
+ 'go',
+ 'searcharticle',
+ 'history',
+ 'history_short',
+ 'updatedmarker',
+ 'info_short',
+ 'printableversion',
+ 'permalink',
+ 'print',
+ 'edit',
+ 'editthispage',
+ 'delete',
+ 'deletethispage',
+ 'undelete_short',
+ 'protect',
+ 'protectthispage',
+ 'unprotect',
+ 'unprotectthispage',
+ 'newpage',
+ 'talkpage',
+ 'specialpage',
+ 'personaltools',
+ 'postcomment',
+ 'addsection',
+ 'articlepage',
+ 'talk',
+ 'views',
+ 'toolbox',
+ 'userpage',
+ 'projectpage',
+ 'imagepage',
+ 'mediawikipage',
+ 'templatepage',
+ 'viewhelppage',
+ 'categorypage',
+ 'viewtalkpage',
+ 'otherlanguages',
+ 'redirectedfrom',
+ 'redirectpagesub',
+ 'lastmodifiedat',
+ 'viewcount',
+ 'copyright',
+ 'protectedpage',
+ 'jumpto',
+ 'jumptonavigation',
+ 'jumptosearch',
+ ),
+ 'badaccess' => array(
+ 'badaccess',
+ 'badaccess-group0',
+ 'badaccess-group1',
+ 'badaccess-group2',
+ 'badaccess-groups',
+ ),
+ 'versionrequired' => array(
+ 'versionrequired',
+ 'versionrequiredtext',
+ ),
+ 'miscellaneous3' => array(
+ 'widthheight',
+ 'ok',
+ 'sitetitle',
+ 'pagetitle',
+ 'sitesubtitle',
+ 'retrievedfrom',
+ 'youhavenewmessages',
+ 'newmessageslink',
+ 'newmessagesdifflink',
+ 'editsection',
+ 'editold',
+ 'editsectionhint',
+ 'toc',
+ 'showtoc',
+ 'hidetoc',
+ 'thisisdeleted',
+ 'viewdeleted',
+ 'restorelink',
+ 'feedlinks',
+ 'feed-invalid',
+ 'feed-atom',
+ 'feed-rss',
+ 'sitenotice',
+ 'anonnotice',
+ ),
+ 'nstab' => array(
+ 'nstab-main',
+ 'nstab-user',
+ 'nstab-media',
+ 'nstab-special',
+ 'nstab-project',
+ 'nstab-image',
+ 'nstab-mediawiki',
+ 'nstab-template',
+ 'nstab-help',
+ 'nstab-category',
+ ),
+ 'main' => array(
+ 'nosuchaction',
+ 'nosuchactiontext',
+ 'nosuchspecialpage',
+ 'nospecialpagetext',
+ ),
+ 'errors' => array(
+ 'error',
+ 'databaseerror',
+ 'dberrortext',
+ 'dberrortextcl',
+ 'noconnect',
+ 'nodb',
+ 'cachederror',
+ 'laggedslavemode',
+ 'readonly',
+ 'enterlockreason',
+ 'readonlytext',
+ 'missingarticle',
+ 'readonly_lag',
+ 'internalerror',
+ 'filecopyerror',
+ 'filerenameerror',
+ 'filedeleteerror',
+ 'filenotfound',
+ 'unexpected',
+ 'formerror',
+ 'badarticleerror',
+ 'cannotdelete',
+ 'badtitle',
+ 'badtitletext',
+ 'perfdisabled',
+ 'perfdisabledsub',
+ 'perfcached',
+ 'perfcachedts',
+ 'querypage-no-updates',
+ 'wrong_wfQuery_params',
+ 'viewsource',
+ 'viewsourcefor',
+ 'protectedpagetext',
+ 'viewsourcetext',
+ 'protectedinterface',
+ 'editinginterface',
+ 'sqlhidden',
+ ),
+ 'login' => array(
+ 'logouttitle',
+ 'logouttext',
+ 'welcomecreation',
+ 'loginpagetitle',
+ 'yourname',
+ 'yourpassword',
+ 'yourpasswordagain',
+ 'remembermypassword',
+ 'yourdomainname',
+ 'externaldberror',
+ 'loginproblem',
+ 'alreadyloggedin',
+ 'login',
+ 'loginprompt',
+ 'userlogin',
+ 'logout',
+ 'userlogout',
+ 'notloggedin',
+ 'nologin',
+ 'nologinlink',
+ 'createaccount',
+ 'gotaccount',
+ 'gotaccountlink',
+ 'createaccountmail',
+ 'badretype',
+ 'userexists',
+ 'youremail',
+ 'username',
+ 'uid',
+ 'yourrealname',
+ 'yourlanguage',
+ 'yourvariant',
+ 'yournick',
+ 'badsig',
+ 'email',
+ 'prefs-help-email-enotif',
+ 'prefs-help-realname',
+ 'loginerror',
+ 'prefs-help-email',
+ 'nocookiesnew',
+ 'nocookieslogin',
+ 'noname',
+ 'loginsuccesstitle',
+ 'loginsuccess',
+ 'nosuchuser',
+ 'nosuchusershort',
+ 'nouserspecified',
+ 'wrongpassword',
+ 'wrongpasswordempty',
+ 'mailmypassword',
+ 'passwordremindertitle',
+ 'passwordremindertext',
+ 'noemail',
+ 'passwordsent',
+ 'blocked-mailpassword',
+ 'eauthentsent',
+ 'throttled-mailpassword',
+ 'loginend',
+ 'signupend',
+ 'mailerror',
+ 'acct_creation_throttle_hit',
+ 'emailauthenticated',
+ 'emailnotauthenticated',
+ 'noemailprefs',
+ 'emailconfirmlink',
+ 'invalidemailaddress',
+ 'accountcreated',
+ 'accountcreatedtext',
+ ),
+ 'resetpass' => array(
+ 'resetpass',
+ 'resetpass_announce',
+ 'resetpass_text',
+ 'resetpass_header',
+ 'resetpass_submit',
+ 'resetpass_success',
+ 'resetpass_bad_temporary',
+ 'resetpass_forbidden',
+ 'resetpass_missing',
+ ),
+ 'toolbar' => array(
+ 'bold_sample',
+ 'bold_tip',
+ 'italic_sample',
+ 'italic_tip',
+ 'link_sample',
+ 'link_tip',
+ 'extlink_sample',
+ 'extlink_tip',
+ 'headline_sample',
+ 'headline_tip',
+ 'math_sample',
+ 'math_tip',
+ 'nowiki_sample',
+ 'nowiki_tip',
+ 'image_sample',
+ 'image_tip',
+ 'media_sample',
+ 'media_tip',
+ 'sig_tip',
+ 'hr_tip',
+ ),
+ 'edit' => array(
+ 'summary',
+ 'subject',
+ 'minoredit',
+ 'watchthis',
+ 'savearticle',
+ 'preview',
+ 'showpreview',
+ 'showlivepreview',
+ 'showdiff',
+ 'anoneditwarning',
+ 'missingsummary',
+ 'missingcommenttext',
+ 'missingcommentheader',
+ 'summary-preview',
+ 'subject-preview',
+ 'blockedtitle',
+ 'blockedtext',
+ 'blockedoriginalsource',
+ 'blockededitsource',
+ 'whitelistedittitle',
+ 'whitelistedittext',
+ 'whitelistreadtitle',
+ 'whitelistreadtext',
+ 'whitelistacctitle',
+ 'whitelistacctext',
+ 'confirmedittitle',
+ 'confirmedittext',
+ 'loginreqtitle',
+ 'loginreqlink',
+ 'loginreqpagetext',
+ 'accmailtitle',
+ 'accmailtext',
+ 'newarticle',
+ 'newarticletext',
+ 'newarticletextanon',
+ 'talkpagetext',
+ 'anontalkpagetext',
+ 'noarticletext',
+ 'noarticletextanon',
+ 'clearyourcache',
+ 'usercssjsyoucanpreview',
+ 'usercsspreview',
+ 'userjspreview',
+ 'userinvalidcssjstitle',
+ 'updated',
+ 'note',
+ 'previewnote',
+ 'previewconflict',
+ 'session_fail_preview',
+ 'session_fail_preview_html',
+ 'importing',
+ 'editing',
+ 'editinguser',
+ 'editingsection',
+ 'editingcomment',
+ 'editconflict',
+ 'explainconflict',
+ 'yourtext',
+ 'storedversion',
+ 'nonunicodebrowser',
+ 'editingold',
+ 'yourdiff',
+ 'copyrightwarning',
+ 'copyrightwarning2',
+ 'longpagewarning',
+ 'longpageerror',
+ 'readonlywarning',
+ 'protectedpagewarning',
+ 'semiprotectedpagewarning',
+ 'templatesused',
+ 'templatesusedpreview',
+ 'templatesusedsection',
+ 'template-protected',
+ 'template-semiprotected',
+ 'edittools',
+ 'nocreatetitle',
+ 'nocreatetext',
+ ),
+ 'undo' => array(
+ 'undo-success',
+ 'undo-failure',
+ 'undo-summary',
+ ),
+ 'cantcreateaccount' => array(
+ 'cantcreateaccounttitle',
+ 'cantcreateaccounttext',
+ ),
+ 'history' => array(
+ 'revhistory',
+ 'viewpagelogs',
+ 'nohistory',
+ 'revnotfound',
+ 'revnotfoundtext',
+ 'loadhist',
+ 'currentrev',
+ 'revisionasof',
+ 'revision-info',
+ 'revision-nav',
+ 'previousrevision',
+ 'nextrevision',
+ 'currentrevisionlink',
+ 'cur',
+ 'next',
+ 'last',
+ 'orig',
+ 'histlegend',
+ 'history_copyright',
+ 'deletedrev',
+ 'histfirst',
+ 'histlast',
+ 'rev-deleted-comment',
+ 'rev-deleted-user',
+ 'rev-deleted-text-permission',
+ 'rev-deleted-text-view',
+ 'rev-delundel',
+ ),
+ 'history-feed' => array(
+ 'history-feed-title',
+ 'history-feed-description',
+ 'history-feed-item-nocomment',
+ 'history-feed-empty',
+ ),
+ 'revdelete' => array(
+ 'revisiondelete',
+ 'revdelete-nooldid-title',
+ 'revdelete-nooldid-text',
+ 'revdelete-selected',
+ 'revdelete-text',
+ 'revdelete-legend',
+ 'revdelete-hide-text',
+ 'revdelete-hide-comment',
+ 'revdelete-hide-user',
+ 'revdelete-hide-restricted',
+ 'revdelete-log',
+ 'revdelete-submit',
+ 'revdelete-logentry',
+ ),
+ 'diffs' => array(
+ 'difference',
+ 'loadingrev',
+ 'lineno',
+ 'editcurrent',
+ 'selectnewerversionfordiff',
+ 'selectolderversionfordiff',
+ 'compareselectedversions',
+ 'editundo',
+ 'diff-multi',
+ ),
+ 'search' => array(
+ 'searchresults',
+ 'searchresulttext',
+ 'searchsubtitle',
+ 'searchsubtitleinvalid',
+ 'badquery',
+ 'badquerytext',
+ 'matchtotals',
+ 'noexactmatch',
+ 'titlematches',
+ 'notitlematches',
+ 'textmatches',
+ 'notextmatches',
+ 'prevn',
+ 'nextn',
+ 'viewprevnext',
+ 'showingresults',
+ 'showingresultsnum',
+ 'nonefound',
+ 'powersearch',
+ 'powersearchtext',
+ 'searchdisabled',
+ 'googlesearch',
+ 'blanknamespace',
+ ),
+ 'preferences' => array(
+ 'preferences',
+ 'preferences-summary',
+ 'mypreferences',
+ 'prefsnologin',
+ 'prefsnologintext',
+ 'prefsreset',
+ 'qbsettings',
+ 'changepassword',
+ 'skin',
+ 'math',
+ 'dateformat',
+ 'datedefault',
+ 'datetime',
+ 'math_failure',
+ 'math_unknown_error',
+ 'math_unknown_function',
+ 'math_lexing_error',
+ 'math_syntax_error',
+ 'math_image_error',
+ 'math_bad_tmpdir',
+ 'math_bad_output',
+ 'math_notexvc',
+ 'prefs-personal',
+ 'prefs-rc',
+ 'prefs-watchlist',
+ 'prefs-watchlist-days',
+ 'prefs-watchlist-edits',
+ 'prefs-misc',
+ 'saveprefs',
+ 'resetprefs',
+ 'oldpassword',
+ 'newpassword',
+ 'retypenew',
+ 'textboxsize',
+ 'rows',
+ 'columns',
+ 'searchresultshead',
+ 'resultsperpage',
+ 'contextlines',
+ 'contextchars',
+ 'stubthreshold',
+ 'recentchangescount',
+ 'savedprefs',
+ 'timezonelegend',
+ 'timezonetext',
+ 'localtime',
+ 'timezoneoffset',
+ 'servertime',
+ 'guesstimezone',
+ 'allowemail',
+ 'defaultns',
+ 'default',
+ 'files',
+ ),
+ 'userrights' => array(
+ 'userrights-lookup-user',
+ 'userrights-user-editname',
+ 'editusergroup',
+ 'userrights-editusergroup',
+ 'saveusergroups',
+ 'userrights-groupsmember',
+ 'userrights-groupsavailable',
+ 'userrights-groupshelp',
+ ),
+ 'group' => array(
+ 'group',
+ 'group-bot',
+ 'group-sysop',
+ 'group-bureaucrat',
+ 'group-all',
+ ),
+ 'group-member' => array(
+ 'group-bot-member',
+ 'group-sysop-member',
+ 'group-bureaucrat-member',
+ ),
+ 'grouppage' => array(
+ 'grouppage-bot',
+ 'grouppage-sysop',
+ 'grouppage-bureaucrat',
+ ),
+ 'recentchanges' => array(
+ 'changes',
+ 'recentchanges',
+ 'recentchanges-url',
+ 'recentchangestext',
+ 'recentchanges-feed-description',
+ 'rcnote',
+ 'rcnotefrom',
+ 'rclistfrom',
+ 'rcshowhideminor',
+ 'rcshowhidebots',
+ 'rcshowhideliu',
+ 'rcshowhideanons',
+ 'rcshowhidepatr',
+ 'rcshowhidemine',
+ 'rclinks',
+ 'diff',
+ 'hist',
+ 'hide',
+ 'show',
+ 'minoreditletter',
+ 'newpageletter',
+ 'boteditletter',
+ 'sectionlink',
+ 'number_of_watching_users_RCview',
+ 'number_of_watching_users_pageview',
+ 'rc_categories',
+ 'rc_categories_any',
+ 'rc-change-size',
+ ),
+ 'upload' => array(
+ 'upload',
+ 'uploadbtn',
+ 'reupload',
+ 'reuploaddesc',
+ 'uploadnologin',
+ 'uploadnologintext',
+ 'upload_directory_read_only',
+ 'uploaderror',
+ 'uploadtext',
+ 'uploadlog',
+ 'uploadlogpage',
+ 'uploadlogpagetext',
+ 'filename',
+ 'filedesc',
+ 'fileuploadsummary',
+ 'filestatus',
+ 'filesource',
+ 'copyrightpage',
+ 'copyrightpagename',
+ 'uploadedfiles',
+ 'ignorewarning',
+ 'ignorewarnings',
+ 'minlength',
+ 'illegalfilename',
+ 'badfilename',
+ 'badfiletype',
+ 'large-file',
+ 'largefileserver',
+ 'emptyfile',
+ 'fileexists',
+ 'fileexists-forbidden',
+ 'fileexists-shared-forbidden',
+ 'successfulupload',
+ 'fileuploaded',
+ 'uploadwarning',
+ 'savefile',
+ 'uploadedimage',
+ 'uploaddisabled',
+ 'uploaddisabledtext',
+ 'uploadscripted',
+ 'uploadcorrupt',
+ 'uploadvirus',
+ 'sourcefilename',
+ 'destfilename',
+ 'watchthisupload',
+ 'filewasdeleted',
+ ),
+ 'upload-errors' => array(
+ 'upload-proto-error',
+ 'upload-proto-error-text',
+ 'upload-file-error',
+ 'upload-file-error-text',
+ 'upload-misc-error',
+ 'upload-misc-error-text',
+ ),
+ 'upload-curl-errors' => array(
+ 'upload-curl-error6',
+ 'upload-curl-error6-text',
+ 'upload-curl-error28',
+ 'upload-curl-error28-text',
+ ),
+ 'licenses' => array(
+ 'license',
+ 'nolicense',
+ 'licenses',
+ 'upload_source_url',
+ 'upload_source_file',
+ ),
+ 'imagelist' => array(
+ 'imagelist',
+ 'imagelist-summary',
+ 'imagelisttext',
+ 'imagelistforuser',
+ 'getimagelist',
+ 'ilsubmit',
+ 'showlast',
+ 'byname',
+ 'bydate',
+ 'bysize',
+ 'imgdelete',
+ 'imgdesc',
+ 'imgfile',
+ 'imglegend',
+ 'imghistory',
+ 'revertimg',
+ 'deleteimg',
+ 'deleteimgcompletely',
+ 'imghistlegend',
+ 'imagelinks',
+ 'linkstoimage',
+ 'nolinkstoimage',
+ 'sharedupload',
+ 'shareduploadwiki',
+ 'shareduploadwiki-linktext',
+ 'shareddescriptionfollows',
+ 'noimage',
+ 'noimage-linktext',
+ 'uploadnewversion-linktext',
+ 'imagelist_date',
+ 'imagelist_name',
+ 'imagelist_user',
+ 'imagelist_size',
+ 'imagelist_description',
+ 'imagelist_search_for',
+ ),
+ 'mimesearch' => array(
+ 'mimesearch',
+ 'mimesearch-summary',
+ 'mimetype',
+ 'download',
+ ),
+ 'unwatchedpages' => array(
+ 'unwatchedpages',
+ 'unwatchedpages-summary',
+ ),
+ 'listredirects' => array(
+ 'listredirects',
+ 'listredirects-summary',
+ ),
+ 'unusedtemplates' => array(
+ 'unusedtemplates',
+ 'unusedtemplates-summary',
+ 'unusedtemplatestext',
+ 'unusedtemplateswlh',
+ ),
+ 'randomredirect' => array(
+ 'randomredirect',
+ ),
+ 'statistics' => array(
+ 'statistics',
+ 'sitestats',
+ 'userstats',
+ 'sitestatstext',
+ 'userstatstext',
+ 'statistics-mostpopular',
+ ),
+ 'disambiguations' => array(
+ 'disambiguations',
+ 'disambiguations-summary',
+ 'disambiguationspage',
+ 'disambiguationstext',
+ ),
+ 'doubleredirects' => array(
+ 'doubleredirects',
+ 'doubleredirects-summary',
+ 'doubleredirectstext',
+ ),
+ 'brokenredirects' => array(
+ 'brokenredirects',
+ 'brokenredirects-summary',
+ 'brokenredirectstext',
+ ),
+ 'specialpages' => array(
+ 'nbytes',
+ 'ncategories',
+ 'nlinks',
+ 'nmembers',
+ 'nrevisions',
+ 'nviews',
+ 'lonelypages',
+ 'lonelypages-summary',
+ 'lonelypagestext',
+ 'uncategorizedpages',
+ 'uncategorizedpages-summary',
+ 'uncategorizedcategories',
+ 'uncategorizedcategories-summary',
+ 'uncategorizedimages',
+ 'uncategorizedimages-summary',
+ 'unusedcategories',
+ 'unusedimages',
+ 'popularpages',
+ 'popularpages-summary',
+ 'wantedcategories',
+ 'wantedcategories-summary',
+ 'wantedpages',
+ 'wantedpages-summary',
+ 'mostlinked',
+ 'mostlinked-summary',
+ 'mostlinkedcategories',
+ 'mostlinkedcategories-summary',
+ 'mostcategories',
+ 'mostcategories-summary',
+ 'mostimages',
+ 'mostimages-summary',
+ 'mostrevisions',
+ 'mostrevisions-summary',
+ 'allpages',
+ 'allpages-summary',
+ 'prefixindex',
+ 'prefixindex-summary',
+ 'randompage',
+ 'randompage-url',
+ 'shortpages',
+ 'shortpages-summary',
+ 'longpages',
+ 'longpages-summary',
+ 'deadendpages',
+ 'deadendpages-summary',
+ 'deadendpagestext',
+ 'listusers',
+ 'listusers-summary',
+ 'specialpages',
+ 'specialpages-summary',
+ 'spheading',
+ 'restrictedpheading',
+ 'recentchangeslinked',
+ 'rclsub',
+ 'newpages',
+ 'newpages-summary',
+ 'newpages-username',
+ 'ancientpages',
+ 'ancientpages-summary',
+ 'intl',
+ 'move',
+ 'movethispage',
+ 'unusedimagestext',
+ 'unusedcategoriestext',
+ ),
+ 'booksources' => array(
+ 'booksources',
+ 'booksources-summary',
+ 'booksources-search-legend',
+ 'booksources-isbn',
+ 'booksources-go',
+ 'booksources-text',
+ ),
+ 'specialpages2' => array(
+ 'categoriespagetext',
+ 'data',
+ 'userrights',
+ 'userrights-summary',
+ 'groups',
+ 'isbn',
+ 'rfcurl',
+ 'pubmedurl',
+ 'alphaindexline',
+ 'version',
+ 'log',
+ 'alllogstext',
+ 'logempty',
+ ),
+ 'allpages' => array(
+ 'nextpage',
+ 'prevpage',
+ 'allpagesfrom',
+ 'allarticles',
+ 'allinnamespace',
+ 'allnotinnamespace',
+ 'allpagesprev',
+ 'allpagesnext',
+ 'allpagessubmit',
+ 'allpagesprefix',
+ 'allpagesbadtitle',
+ ),
+ 'listusers' => array(
+ 'listusersfrom',
+ ),
+ 'emailuser' => array(
+ 'mailnologin',
+ 'mailnologintext',
+ 'emailuser',
+ 'emailpage',
+ 'emailpagetext',
+ 'usermailererror',
+ 'defemailsubject',
+ 'noemailtitle',
+ 'noemailtext',
+ 'emailfrom',
+ 'emailto',
+ 'emailsubject',
+ 'emailmessage',
+ 'emailsend',
+ 'emailccme',
+ 'emailccsubject',
+ 'emailsent',
+ 'emailsenttext',
+ ),
+ 'watchlist' => array(
+ 'watchlist',
+ 'watchlistfor',
+ 'nowatchlist',
+ 'watchlistanontext',
+ 'watchlistcount',
+ 'clearwatchlist',
+ 'watchlistcleartext',
+ 'watchlistclearbutton',
+ 'watchlistcleardone',
+ 'watchnologin',
+ 'watchnologintext',
+ 'addedwatch',
+ 'addedwatchtext',
+ 'removedwatch',
+ 'removedwatchtext',
+ 'watch',
+ 'watchthispage',
+ 'unwatch',
+ 'unwatchthispage',
+ 'notanarticle',
+ 'watchnochange',
+ 'watchdetails',
+ 'wlheader-enotif',
+ 'wlheader-showupdated',
+ 'watchmethod-recent',
+ 'watchmethod-list',
+ 'removechecked',
+ 'watchlistcontains',
+ 'watcheditlist',
+ 'removingchecked',
+ 'couldntremove',
+ 'iteminvalidname',
+ 'wlnote',
+ 'wlshowlast',
+ 'wlsaved',
+ 'watchlist-show-bots',
+ 'watchlist-hide-bots',
+ 'watchlist-show-own',
+ 'watchlist-hide-own',
+ 'watchlist-show-minor',
+ 'watchlist-hide-minor',
+ 'wldone',
+ ),
+ 'watching' => array(
+ 'watching',
+ 'unwatching',
+ ),
+ 'enotif' => array(
+ 'enotif_mailer',
+ 'enotif_reset',
+ 'enotif_newpagetext',
+ 'changed',
+ 'created',
+ 'enotif_subject',
+ 'enotif_lastvisited',
+ 'enotif_body',
+ ),
+ 'deleteprotectrev' => array(
+ 'deletepage',
+ 'confirm',
+ 'excontent',
+ 'excontentauthor',
+ 'exbeforeblank',
+ 'exblank',
+ 'confirmdelete',
+ 'deletesub',
+ 'historywarning',
+ 'confirmdeletetext',
+ 'actioncomplete',
+ 'deletedtext',
+ 'deletedarticle',
+ 'dellogpage',
+ 'dellogpagetext',
+ 'deletionlog',
+ 'reverted',
+ 'deletecomment',
+ 'imagereverted',
+ 'rollback',
+ 'rollback_short',
+ 'rollbacklink',
+ 'rollbackfailed',
+ 'cantrollback',
+ 'alreadyrolled',
+ 'editcomment',
+ 'revertpage',
+ 'sessionfailure',
+ 'protectlogpage',
+ 'protectlogtext',
+ 'protectedarticle',
+ 'unprotectedarticle',
+ 'protectsub',
+ 'confirmprotecttext',
+ 'confirmprotect',
+ 'protectmoveonly',
+ 'protectcomment',
+ 'unprotectsub',
+ 'confirmunprotecttext',
+ 'confirmunprotect',
+ 'unprotectcomment',
+ 'protect-unchain',
+ 'protect-text',
+ 'protect-viewtext',
+ 'protect-default',
+ 'protect-level-autoconfirmed',
+ 'protect-level-sysop',
+ ),
+ 'restrictions' => array(
+ 'restriction-edit',
+ 'restriction-move',
+ ),
+ 'undelete' => array(
+ 'undelete',
+ 'undeletepage',
+ 'viewdeletedpage',
+ 'undeletepagetext',
+ 'undeleteextrahelp',
+ 'undeletearticle',
+ 'undeleterevisions',
+ 'undeletehistory',
+ 'undeletehistorynoadmin',
+ 'undeleterevision',
+ 'undeleterevision-missing',
+ 'undeletebtn',
+ 'undeletereset',
+ 'undeletecomment',
+ 'undeletedarticle',
+ 'undeletedrevisions',
+ 'undeletedrevisions-files',
+ 'undeletedfiles',
+ 'cannotundelete',
+ 'undeletedpage',
+ ),
+ 'nsform' => array(
+ 'namespace',
+ 'invert',
+ ),
+ 'contributions' => array(
+ 'contributions',
+ 'mycontris',
+ 'contribsub',
+ 'nocontribs',
+ 'ucnote',
+ 'uclinks',
+ 'uctop',
+ 'newbies',
+ ),
+ 'sp-contributions' => array(
+ 'sp-contributions-newest',
+ 'sp-contributions-oldest',
+ 'sp-contributions-newer',
+ 'sp-contributions-older',
+ 'sp-contributions-newbies-sub',
+ 'sp-contributions-blocklog',
+ ),
+ 'newimages-showfrom' => array(
+ 'sp-newimages-showfrom',
+ ),
+ 'whatlinkshere' => array(
+ 'whatlinkshere',
+ 'whatlinkshere-summary',
+ 'whatlinkshere-barrow',
+ 'notargettitle',
+ 'notargettext',
+ 'linklistsub',
+ 'linkshere',
+ 'nolinkshere',
+ 'isredirect',
+ 'istemplate',
+ ),
+ 'block' => array(
+ 'blockip',
+ 'blockiptext',
+ 'ipaddress',
+ 'ipadressorusername',
+ 'ipbexpiry',
+ 'ipbreason',
+ 'ipbanononly',
+ 'ipbcreateaccount',
+ 'ipbenableautoblock',
+ 'ipbsubmit',
+ 'ipbother',
+ 'ipboptions',
+ 'ipbotheroption',
+ 'badipaddress',
+ 'blockipsuccesssub',
+ 'blockipsuccesstext',
+ 'unblockip',
+ 'unblockiptext',
+ 'ipusubmit',
+ 'unblocked',
+ 'ipblocklist',
+ 'ipblocklist-summary',
+ 'blocklistline',
+ 'infiniteblock',
+ 'expiringblock',
+ 'anononlyblock',
+ 'noautoblockblock',
+ 'createaccountblock',
+ 'ipblocklistempty',
+ 'blocklink',
+ 'unblocklink',
+ 'contribslink',
+ 'autoblocker',
+ 'blocklogpage',
+ 'blocklogentry',
+ 'blocklogtext',
+ 'unblocklogentry',
+ 'range_block_disabled',
+ 'ipb_expiry_invalid',
+ 'ipb_already_blocked',
+ 'ip_range_invalid',
+ 'proxyblocker',
+ 'ipb_cant_unblock',
+ 'proxyblockreason',
+ 'proxyblocksuccess',
+ 'sorbs',
+ 'sorbsreason',
+ 'sorbs_create_account_reason',
+ ),
+ 'developertools' => array(
+ 'lockdb',
+ 'unlockdb',
+ 'lockdbtext',
+ 'unlockdbtext',
+ 'lockconfirm',
+ 'unlockconfirm',
+ 'lockbtn',
+ 'unlockbtn',
+ 'locknoconfirm',
+ 'lockdbsuccesssub',
+ 'unlockdbsuccesssub',
+ 'lockdbsuccesstext',
+ 'unlockdbsuccesstext',
+ 'lockfilenotwritable',
+ 'databasenotlocked',
+ ),
+ 'makesysop' => array(
+ 'makesysoptitle',
+ 'makesysoptext',
+ 'makesysopname',
+ 'makesysopsubmit',
+ 'makesysopok',
+ 'makesysopfail',
+ 'setbureaucratflag',
+ 'rightslog',
+ 'rightslogtext',
+ 'rightslogentry',
+ 'rights',
+ 'set_user_rights',
+ 'user_rights_set',
+ 'set_rights_fail',
+ 'makesysop',
+ 'already_sysop',
+ 'already_bureaucrat',
+ 'rightsnone',
+ ),
+ 'movepage' => array(
+ 'movepage',
+ 'movepagetext',
+ 'movepagetalktext',
+ 'movearticle',
+ 'movenologin',
+ 'movenologintext',
+ 'newtitle',
+ 'move-watch',
+ 'movepagebtn',
+ 'pagemovedsub',
+ 'pagemovedtext',
+ 'articleexists',
+ 'talkexists',
+ 'movedto',
+ 'movetalk',
+ 'talkpagemoved',
+ 'talkpagenotmoved',
+ '1movedto2',
+ '1movedto2_redir',
+ 'movelogpage',
+ 'movelogpagetext',
+ 'movereason',
+ 'revertmove',
+ 'delete_and_move',
+ 'delete_and_move_text',
+ 'delete_and_move_confirm',
+ 'delete_and_move_reason',
+ 'selfmove',
+ 'immobile_namespace',
+ ),
+ 'export' => array(
+ 'export',
+ 'exporttext',
+ 'exportcuronly',
+ 'exportnohistory',
+ 'export-submit',
+ ),
+ 'allmessages' => array(
+ 'allmessages',
+ 'allmessagesname',
+ 'allmessagesdefault',
+ 'allmessagescurrent',
+ 'allmessagestext',
+ 'allmessagesnotsupportedUI',
+ 'allmessagesnotsupportedDB',
+ 'allmessagesfilter',
+ 'allmessagesmodified',
+ ),
+ 'thumbnails' => array(
+ 'thumbnail-more',
+ 'missingimage',
+ 'filemissing',
+ 'thumbnail_error',
+ ),
+ 'import' => array(
+ 'import',
+ 'importinterwiki',
+ 'import-interwiki-text',
+ 'import-interwiki-history',
+ 'import-interwiki-submit',
+ 'import-interwiki-namespace',
+ 'importtext',
+ 'importstart',
+ 'import-revision-count',
+ 'importnopages',
+ 'importfailed',
+ 'importunknownsource',
+ 'importcantopen',
+ 'importbadinterwiki',
+ 'importnotext',
+ 'importsuccess',
+ 'importhistoryconflict',
+ 'importnosources',
+ 'importnofile',
+ 'importuploaderror',
+ ),
+ 'importlog' => array(
+ 'importlogpage',
+ 'importlogpagetext',
+ 'import-logentry-upload',
+ 'import-logentry-upload-detail',
+ 'import-logentry-interwiki',
+ 'import-logentry-interwiki-detail',
+ ),
+ 'accesskeys' => array(
+ 'accesskey-search',
+ 'accesskey-minoredit',
+ 'accesskey-save',
+ 'accesskey-preview',
+ 'accesskey-diff',
+ 'accesskey-compareselectedversions',
+ 'accesskey-watch',
+ ),
+ 'tooltips' => array(
+ 'tooltip-search',
+ 'tooltip-minoredit',
+ 'tooltip-save',
+ 'tooltip-preview',
+ 'tooltip-diff',
+ 'tooltip-compareselectedversions',
+ 'tooltip-watch',
+ ),
+ 'stylesheets' => array(
+ 'common.css',
+ 'monobook.css',
+ ),
+ 'metadata_cc' => array(
+ 'nodublincore',
+ 'nocreativecommons',
+ 'notacceptable',
+ ),
+ 'attribution' => array(
+ 'anonymous',
+ 'siteuser',
+ 'lastmodifiedatby',
+ 'and',
+ 'othercontribs',
+ 'others',
+ 'siteusers',
+ 'creditspage',
+ 'nocredits',
+ ),
+ 'spamprotection' => array(
+ 'spamprotectiontitle',
+ 'spamprotectiontext',
+ 'spamprotectionmatch',
+ 'subcategorycount',
+ 'categoryarticlecount',
+ 'category-media-count',
+ 'listingcontinuesabbrev',
+ 'spambot_username',
+ 'spam_reverting',
+ 'spam_blanking',
+ ),
+ 'info' => array(
+ 'infosubtitle',
+ 'numedits',
+ 'numtalkedits',
+ 'numwatchers',
+ 'numauthors',
+ 'numtalkauthors',
+ ),
+ 'math' => array(
+ 'mw_math_png',
+ 'mw_math_simple',
+ 'mw_math_html',
+ 'mw_math_source',
+ 'mw_math_modern',
+ 'mw_math_mathml',
+ ),
+ 'patrolling' => array(
+ 'markaspatrolleddiff',
+ 'markaspatrolledlink',
+ 'markaspatrolledtext',
+ 'markedaspatrolled',
+ 'markedaspatrolledtext',
+ 'rcpatroldisabled',
+ 'rcpatroldisabledtext',
+ 'markedaspatrollederror',
+ 'markedaspatrollederrortext',
+ 'markedaspatrollederror-noautopatrol',
+ ),
+ 'monobook.js' => array(
+ 'monobook.js',
+ ),
+ 'common.js' => array(
+ 'common.js',
+ ),
+ 'imagedeletion' => array(
+ 'deletedrevision',
+ ),
+ 'browsediffs' => array(
+ 'previousdiff',
+ 'nextdiff',
+ ),
+ 'imagesize' => array(
+ 'imagemaxsize',
+ 'thumbsize',
+ 'showbigimage',
+ ),
+ 'newimages' => array(
+ 'newimages',
+ 'newimages-summary',
+ 'showhidebots',
+ 'noimages',
+ ),
+ 'variantname-zh' => array(
+ 'variantname-zh-cn',
+ 'variantname-zh-tw',
+ 'variantname-zh-hk',
+ 'variantname-zh-sg',
+ 'variantname-zh',
+ ),
+ 'variantname-sr' => array(
+ 'variantname-sr-ec',
+ 'variantname-sr-el',
+ 'variantname-sr-jc',
+ 'variantname-sr-jl',
+ 'variantname-sr',
+ ),
+ 'variantname-kk' => array(
+ 'variantname-kk-tr',
+ 'variantname-kk-kz',
+ 'variantname-kk-cn',
+ 'variantname-kk',
+ ),
+ 'specialloglabels' => array(
+ 'specialloguserlabel',
+ 'speciallogtitlelabel',
+ ),
+ 'passwordtooshort' => array(
+ 'passwordtooshort',
+ ),
+ 'mediawarning' => array(
+ 'mediawarning',
+ ),
+ 'fileinfo' => array(
+ 'fileinfo',
+ ),
+ 'metadata' => array(
+ 'metadata',
+ 'metadata-help',
+ 'metadata-expand',
+ 'metadata-collapse',
+ 'metadata-fields',
+ ),
+ 'exif' => array(
+ 'exif-imagewidth',
+ 'exif-imagelength',
+ 'exif-bitspersample',
+ 'exif-compression',
+ 'exif-photometricinterpretation',
+ 'exif-orientation',
+ 'exif-samplesperpixel',
+ 'exif-planarconfiguration',
+ 'exif-ycbcrsubsampling',
+ 'exif-ycbcrpositioning',
+ 'exif-xresolution',
+ 'exif-yresolution',
+ 'exif-resolutionunit',
+ 'exif-stripoffsets',
+ 'exif-rowsperstrip',
+ 'exif-stripbytecounts',
+ 'exif-jpeginterchangeformat',
+ 'exif-jpeginterchangeformatlength',
+ 'exif-transferfunction',
+ 'exif-whitepoint',
+ 'exif-primarychromaticities',
+ 'exif-ycbcrcoefficients',
+ 'exif-referenceblackwhite',
+ 'exif-datetime',
+ 'exif-imagedescription',
+ 'exif-make',
+ 'exif-model',
+ 'exif-software',
+ 'exif-artist',
+ 'exif-copyright',
+ 'exif-exifversion',
+ 'exif-flashpixversion',
+ 'exif-colorspace',
+ 'exif-componentsconfiguration',
+ 'exif-compressedbitsperpixel',
+ 'exif-pixelydimension',
+ 'exif-pixelxdimension',
+ 'exif-makernote',
+ 'exif-usercomment',
+ 'exif-relatedsoundfile',
+ 'exif-datetimeoriginal',
+ 'exif-datetimedigitized',
+ 'exif-subsectime',
+ 'exif-subsectimeoriginal',
+ 'exif-subsectimedigitized',
+ 'exif-exposuretime',
+ 'exif-exposuretime-format',
+ 'exif-fnumber',
+ 'exif-fnumber-format',
+ 'exif-exposureprogram',
+ 'exif-spectralsensitivity',
+ 'exif-isospeedratings',
+ 'exif-oecf',
+ 'exif-shutterspeedvalue',
+ 'exif-aperturevalue',
+ 'exif-brightnessvalue',
+ 'exif-exposurebiasvalue',
+ 'exif-maxaperturevalue',
+ 'exif-subjectdistance',
+ 'exif-meteringmode',
+ 'exif-lightsource',
+ 'exif-flash',
+ 'exif-focallength',
+ 'exif-focallength-format',
+ 'exif-subjectarea',
+ 'exif-flashenergy',
+ 'exif-spatialfrequencyresponse',
+ 'exif-focalplanexresolution',
+ 'exif-focalplaneyresolution',
+ 'exif-focalplaneresolutionunit',
+ 'exif-subjectlocation',
+ 'exif-exposureindex',
+ 'exif-sensingmethod',
+ 'exif-filesource',
+ 'exif-scenetype',
+ 'exif-cfapattern',
+ 'exif-customrendered',
+ 'exif-exposuremode',
+ 'exif-whitebalance',
+ 'exif-digitalzoomratio',
+ 'exif-focallengthin35mmfilm',
+ 'exif-scenecapturetype',
+ 'exif-gaincontrol',
+ 'exif-contrast',
+ 'exif-saturation',
+ 'exif-sharpness',
+ 'exif-devicesettingdescription',
+ 'exif-subjectdistancerange',
+ 'exif-imageuniqueid',
+ 'exif-gpsversionid',
+ 'exif-gpslatituderef',
+ 'exif-gpslatitude',
+ 'exif-gpslongituderef',
+ 'exif-gpslongitude',
+ 'exif-gpsaltituderef',
+ 'exif-gpsaltitude',
+ 'exif-gpstimestamp',
+ 'exif-gpssatellites',
+ 'exif-gpsstatus',
+ 'exif-gpsmeasuremode',
+ 'exif-gpsdop',
+ 'exif-gpsspeedref',
+ 'exif-gpsspeed',
+ 'exif-gpstrackref',
+ 'exif-gpstrack',
+ 'exif-gpsimgdirectionref',
+ 'exif-gpsimgdirection',
+ 'exif-gpsmapdatum',
+ 'exif-gpsdestlatituderef',
+ 'exif-gpsdestlatitude',
+ 'exif-gpsdestlongituderef',
+ 'exif-gpsdestlongitude',
+ 'exif-gpsdestbearingref',
+ 'exif-gpsdestbearing',
+ 'exif-gpsdestdistanceref',
+ 'exif-gpsdestdistance',
+ 'exif-gpsprocessingmethod',
+ 'exif-gpsareainformation',
+ 'exif-gpsdatestamp',
+ 'exif-gpsdifferential',
+ ),
+ 'exif-values' => array(
+ 'exif-make-value',
+ 'exif-model-value',
+ 'exif-software-value',
+ ),
+ 'exif-compression' => array(
+ 'exif-compression-1',
+ 'exif-compression-6',
+ ),
+ 'exif-photometricinterpretation' => array(
+ 'exif-photometricinterpretation-2',
+ 'exif-photometricinterpretation-6',
+ ),
+ 'exif-unknowndate' => array(
+ 'exif-unknowndate',
+ ),
+ 'exif-orientation' => array(
+ 'exif-orientation-1',
+ 'exif-orientation-2',
+ 'exif-orientation-3',
+ 'exif-orientation-4',
+ 'exif-orientation-5',
+ 'exif-orientation-6',
+ 'exif-orientation-7',
+ 'exif-orientation-8',
+ ),
+ 'exif-planarconfiguration' => array(
+ 'exif-planarconfiguration-1',
+ 'exif-planarconfiguration-2',
+ ),
+ 'exif-xyresolution' => array(
+ 'exif-xyresolution-i',
+ 'exif-xyresolution-c',
+ ),
+ 'exif-colorspace' => array(
+ 'exif-colorspace-1',
+ 'exif-colorspace-ffff.h',
+ ),
+ 'exif-componentsconfiguration' => array(
+ 'exif-componentsconfiguration-0',
+ 'exif-componentsconfiguration-1',
+ 'exif-componentsconfiguration-2',
+ 'exif-componentsconfiguration-3',
+ 'exif-componentsconfiguration-4',
+ 'exif-componentsconfiguration-5',
+ 'exif-componentsconfiguration-6',
+ ),
+ 'exif-exposureprogram' => array(
+ 'exif-exposureprogram-0',
+ 'exif-exposureprogram-1',
+ 'exif-exposureprogram-2',
+ 'exif-exposureprogram-3',
+ 'exif-exposureprogram-4',
+ 'exif-exposureprogram-5',
+ 'exif-exposureprogram-6',
+ 'exif-exposureprogram-7',
+ 'exif-exposureprogram-8',
+ ),
+ 'exif-subjectdistance-value' => array(
+ 'exif-subjectdistance-value',
+ ),
+ 'exif-meteringmode' => array(
+ 'exif-meteringmode-0',
+ 'exif-meteringmode-1',
+ 'exif-meteringmode-2',
+ 'exif-meteringmode-3',
+ 'exif-meteringmode-4',
+ 'exif-meteringmode-5',
+ 'exif-meteringmode-6',
+ 'exif-meteringmode-255',
+ ),
+ 'exif-lightsource' => array(
+ 'exif-lightsource-0',
+ 'exif-lightsource-1',
+ 'exif-lightsource-2',
+ 'exif-lightsource-3',
+ 'exif-lightsource-4',
+ 'exif-lightsource-9',
+ 'exif-lightsource-10',
+ 'exif-lightsource-11',
+ 'exif-lightsource-12',
+ 'exif-lightsource-13',
+ 'exif-lightsource-14',
+ 'exif-lightsource-15',
+ 'exif-lightsource-17',
+ 'exif-lightsource-18',
+ 'exif-lightsource-19',
+ 'exif-lightsource-20',
+ 'exif-lightsource-21',
+ 'exif-lightsource-22',
+ 'exif-lightsource-23',
+ 'exif-lightsource-24',
+ 'exif-lightsource-255',
+ ),
+ 'exif-focalplaneresolutionunit' => array(
+ 'exif-focalplaneresolutionunit-2',
+ ),
+ 'exif-sensingmethod' => array(
+ 'exif-sensingmethod-1',
+ 'exif-sensingmethod-2',
+ 'exif-sensingmethod-3',
+ 'exif-sensingmethod-4',
+ 'exif-sensingmethod-5',
+ 'exif-sensingmethod-7',
+ 'exif-sensingmethod-8',
+ ),
+ 'exif-filesource' => array(
+ 'exif-filesource-3',
+ ),
+ 'exif-scenetype' => array(
+ 'exif-scenetype-1',
+ ),
+ 'exif-customrendered' => array(
+ 'exif-customrendered-0',
+ 'exif-customrendered-1',
+ ),
+ 'exif-exposuremode' => array(
+ 'exif-exposuremode-0',
+ 'exif-exposuremode-1',
+ 'exif-exposuremode-2',
+ ),
+ 'exif-whitebalance' => array(
+ 'exif-whitebalance-0',
+ 'exif-whitebalance-1',
+ ),
+ 'exif-scenecapturetype' => array(
+ 'exif-scenecapturetype-0',
+ 'exif-scenecapturetype-1',
+ 'exif-scenecapturetype-2',
+ 'exif-scenecapturetype-3',
+ ),
+ 'exif-gaincontrol' => array(
+ 'exif-gaincontrol-0',
+ 'exif-gaincontrol-1',
+ 'exif-gaincontrol-2',
+ 'exif-gaincontrol-3',
+ 'exif-gaincontrol-4',
+ ),
+ 'exif-contrast' => array(
+ 'exif-contrast-0',
+ 'exif-contrast-1',
+ 'exif-contrast-2',
+ ),
+ 'exif-saturation' => array(
+ 'exif-saturation-0',
+ 'exif-saturation-1',
+ 'exif-saturation-2',
+ ),
+ 'exif-sharpness' => array(
+ 'exif-sharpness-0',
+ 'exif-sharpness-1',
+ 'exif-sharpness-2',
+ ),
+ 'exif-subjectdistancerange' => array(
+ 'exif-subjectdistancerange-0',
+ 'exif-subjectdistancerange-1',
+ 'exif-subjectdistancerange-2',
+ 'exif-subjectdistancerange-3',
+ ),
+ 'exif-gpslatitude' => array(
+ 'exif-gpslatitude-n',
+ 'exif-gpslatitude-s',
+ ),
+ 'exif-gpslongitude' => array(
+ 'exif-gpslongitude-e',
+ 'exif-gpslongitude-w',
+ ),
+ 'exif-gpsstatus' => array(
+ 'exif-gpsstatus-a',
+ 'exif-gpsstatus-v',
+ ),
+ 'exif-gpsmeasuremode' => array(
+ 'exif-gpsmeasuremode-2',
+ 'exif-gpsmeasuremode-3',
+ ),
+ 'exif-gpsspeed' => array(
+ 'exif-gpsspeed-k',
+ 'exif-gpsspeed-m',
+ 'exif-gpsspeed-n',
+ ),
+ 'exif-gpsdirection' => array(
+ 'exif-gpsdirection-t',
+ 'exif-gpsdirection-m',
+ ),
+ 'edit-externally' => array(
+ 'edit-externally',
+ 'edit-externally-help',
+ ),
+ 'all' => array(
+ 'recentchangesall',
+ 'imagelistall',
+ 'watchlistall1',
+ 'watchlistall2',
+ 'namespacesall',
+ ),
+ 'confirmemail' => array(
+ 'confirmemail',
+ 'confirmemail_noemail',
+ 'confirmemail_text',
+ 'confirmemail_pending',
+ 'confirmemail_send',
+ 'confirmemail_sent',
+ 'confirmemail_oncreate',
+ 'confirmemail_sendfailed',
+ 'confirmemail_invalid',
+ 'confirmemail_needlogin',
+ 'confirmemail_success',
+ 'confirmemail_loggedin',
+ 'confirmemail_error',
+ 'confirmemail_subject',
+ 'confirmemail_body',
+ ),
+ 'inputbox' => array(
+ 'tryexact',
+ 'searchfulltext',
+ 'createarticle',
+ ),
+ 'scarytransclusion' => array(
+ 'scarytranscludedisabled',
+ 'scarytranscludefailed',
+ 'scarytranscludetoolong',
+ ),
+ 'trackbacks' => array(
+ 'trackbackbox',
+ 'trackback',
+ 'trackbackexcerpt',
+ 'trackbackremove',
+ 'trackbacklink',
+ 'trackbackdeleteok',
+ ),
+ 'deleteconflict' => array(
+ 'deletedwhileediting',
+ 'confirmrecreate',
+ 'recreate',
+ 'tooltip-recreate',
+ ),
+ 'unit-pixel' => array(
+ 'unit-pixel',
+ ),
+ 'htmldump' => array(
+ 'redirectingto',
+ ),
+ 'purge' => array(
+ 'confirm_purge',
+ 'confirm_purge_button',
+ ),
+ 'newmessagesmulti' => array(
+ 'youhavenewmessagesmulti',
+ 'newtalkseperator',
+ ),
+ 'search2' => array(
+ 'searchcontaining',
+ 'searchnamed',
+ 'articletitles',
+ 'hideresults',
+ ),
+ 'displaytitle' => array(
+ 'displaytitle',
+ ),
+ 'catseparator' => array(
+ 'catseparator',
+ ),
+ 'loginlanguage' => array(
+ 'loginlanguagelabel',
+ 'loginlanguagelinks',
+ ),
+ 'imgmulti' => array(
+ 'imgmultipageprev',
+ 'imgmultipagenext',
+ 'imgmultigo',
+ 'imgmultigotopre',
+ 'imgmultigotopost',
+ ),
+ 'tablepager' => array(
+ 'ascending_abbrev',
+ 'descending_abbrev',
+ 'table_pager_next',
+ 'table_pager_prev',
+ 'table_pager_first',
+ 'table_pager_last',
+ 'table_pager_limit',
+ 'table_pager_limit_submit',
+ 'table_pager_empty',
+ ),
+ 'autosumm' => array(
+ 'autosumm-blank',
+ 'autosumm-replace',
+ 'autoredircomment',
+ 'autosumm-new',
+ ),
+ 'autoblock_whitelist' => array(
+ 'autoblock_whitelist',
+ ),
+ 'sizeunits' => array(
+ 'size-bytes',
+ 'size-kilobytes',
+ 'size-megabytes',
+ 'size-gigabytes',
+ ),
+);
+/** Comments for each block */
+$wgBlockComments = array(
+ 'sidebar' => "The sidebar for MonoBook is generated from this message, lines that do not
+begin with * or ** are discarded, furthermore lines that do begin with ** and
+do not contain | are also discarded, but don't depend on this behaviour for
+future releases. Also note that since each list value is wrapped in a unique
+XHTML id it should only appear once and include characters that are legal
+XHTML id names.",
+ 'toggles' => 'User preference toggles',
+ 'underline' => '',
+ 'skinpreview' => '',
+ 'dates' => 'Dates',
+ 'categories' => 'Bits of text used by many pages',
+ 'mainpage' => '',
+ 'miscellaneous1' => '',
+ 'metadata_help' => 'Metadata in edit box',
+ 'currentevents' => '',
+ 'miscellaneous2' => '',
+ 'badaccess' => '',
+ 'versionrequired' => '',
+ 'miscellaneous3' => '',
+ 'nstab' => "Short words for each namespace, by default used in the 'article' tab in monobook",
+ 'main' => 'Main script and global functions',
+ 'errors' => 'General errors',
+ 'login' => 'Login and logout pages',
+ 'resetpass' => 'Password reset dialog',
+ 'toolbar' => 'Edit page toolbar',
+ 'edit' => 'Edit pages',
+ 'undo' => '"Undo" feature',
+ 'cantcreateaccount' => 'Account creation failure',
+ 'history' => 'History pages',
+ 'history-feed' => '',
+ 'revdelete' => 'Revision deletion',
+ 'diffs' => 'Diffs',
+ 'search' => 'Search results',
+ 'preferences' => 'Preferences page',
+ 'userrights' => 'User rights',
+ 'group' => 'Groups',
+ 'group-member' => '',
+ 'grouppage' => '',
+ 'recentchanges' => 'Recent changes',
+ 'upload' => 'Upload',
+ 'upload-errors' => '',
+ 'upload-curl-errors' => 'Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>',
+ 'licenses' => '',
+ 'imagelist' => 'Image list',
+ 'mimesearch' => 'MIME search',
+ 'unwatchedpages' => 'Unwatched pages',
+ 'listredirects' => 'List redirects',
+ 'unusedtemplates' => 'Unused templates',
+ 'randomredirect' => 'Random redirect',
+ 'statistics' => 'Statistics',
+ 'disambiguations' => '',
+ 'doubleredirects' => '',
+ 'brokenredirects' => '',
+ 'specialpages' => 'Miscellaneous special pages',
+ 'booksources' => 'Book sources',
+ 'specialpages2' => '',
+ 'allpages' => 'Special:Allpages',
+ 'listusers' => 'Special:Listusers',
+ 'emailuser' => 'E-mail user',
+ 'watchlist' => 'Watchlist',
+ 'watching' => 'Displayed when you click the "watch" button and it\'s in the process of watching',
+ 'enotif' => '',
+ 'deleteprotectrev' => 'Delete/protect/revert',
+ 'restrictions' => 'Restrictions (nouns)',
+ 'undelete' => 'Undelete',
+ 'nsform' => 'Namespace form on various pages',
+ 'contributions' => 'Contributions',
+ 'sp-contributions' => '',
+ 'newimages-showfrom' => '',
+ 'whatlinkshere' => 'What links here',
+ 'block' => 'Block/unblock',
+ 'developertools' => 'Developer tools',
+ 'makesysop' => 'Make sysop',
+ 'movepage' => 'Move page',
+ 'export' => 'Export',
+ 'allmessages' => 'Namespace 8 related',
+ 'thumbnails' => 'Thumbnails',
+ 'import' => 'Special:Import',
+ 'importlog' => 'Import log',
+ 'accesskeys' => 'Keyboard access keys for power users',
+ 'tooltips' => 'Tooltip help for some actions, most are in Monobook.js',
+ 'stylesheets' => 'Stylesheets',
+ 'metadata_cc' => 'Metadata',
+ 'attribution' => 'Attribution',
+ 'spamprotection' => 'Spam protection',
+ 'info' => 'Info page',
+ 'math' => 'Math options',
+ 'patrolling' => 'Patrolling',
+ 'monobook.js' => 'Monobook.js: tooltips and access keys for monobook',
+ 'common.js' => 'Common.js: contains nothing but a placeholder comment',
+ 'imagedeletion' => 'Image deletion',
+ 'browsediffs' => 'Browsing diffs',
+ 'imagesize' => '',
+ 'newimages' => '',
+ 'variantname-zh' => "Short names for language variants used for language conversion links.
+To disable showing a particular link, set it to 'disable', e.g.
+'variantname-zh-sg' => 'disable',
+Variants for Chinese language",
+ 'variantname-sr' => 'Variants for Serbian language',
+ 'variantname-kk' => 'Variants for Kazakh language',
+ 'specialloglabels' => 'Labels for User: and Title: on Special:Log pages',
+ 'passwordtooshort' => '',
+ 'mediawarning' => 'Media Warning',
+ 'fileinfo' => '',
+ 'metadata' => 'Metadata',
+ 'exif' => 'EXIF tags',
+ 'exif-values' => 'Make & model, can be wikified in order to link to the camera and model name',
+ 'exif-compression' => 'EXIF attributes',
+ 'exif-unknowndate' => '',
+ 'exif-photometricinterpretation' => '',
+ 'exif-orientation' => '',
+ 'exif-planarconfiguration' => '',
+ 'exif-xyresolution' => '',
+ 'exif-colorspace' => '',
+ 'exif-componentsconfiguration' => '',
+ 'exif-exposureprogram' => '',
+ 'exif-subjectdistance-value' => '',
+ 'exif-meteringmode' => '',
+ 'exif-lightsource' => '',
+ 'exif-focalplaneresolutionunit' => '',
+ 'exif-sensingmethod' => '',
+ 'exif-filesource' => '',
+ 'exif-scenetype' => '',
+ 'exif-customrendered' => '',
+ 'exif-exposuremode' => '',
+ 'exif-whitebalance' => '',
+ 'exif-scenecapturetype' => '',
+ 'exif-gaincontrol' => '',
+ 'exif-contrast' => '',
+ 'exif-saturation' => '',
+ 'exif-sharpness' => '',
+ 'exif-subjectdistancerange' => '',
+ 'exif-gpslatitude' => 'Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef',
+ 'exif-gpslongitude' => 'Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef',
+ 'exif-gpsstatus' => '',
+ 'exif-gpsmeasuremode' => '',
+ 'exif-gpsspeed' => 'Pseudotags used for GPSSpeedRef and GPSDestDistanceRef',
+ 'exif-gpsdirection' => 'Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef',
+ 'edit-externally' => 'External editor support',
+ 'all' => "'all' in various places, this might be different for inflected languages",
+ 'confirmemail' => 'E-mail address confirmation',
+ 'inputbox' => 'Inputbox extension, may be useful in other contexts as well',
+ 'scarytransclusion' => 'Scary transclusion',
+ 'trackbacks' => 'Trackbacks',
+ 'deleteconflict' => 'Delete conflict',
+ 'unit-pixel' => '',
+ 'htmldump' => 'HTML dump',
+ 'purge' => 'action=purge',
+ 'newmessagesmulti' => '',
+ 'search2' => '',
+ 'displaytitle' => 'DISPLAYTITLE',
+ 'catseparator' => 'Separator for categories in page lists',
+ 'loginlanguage' => '',
+ 'imgmulti' => 'Multipage image navigation',
+ 'tablepager' => 'Table pager',
+ 'autosumm' => 'Auto-summaries',
+ 'autoblock_whitelist' => 'Autoblock whitelist',
+ 'sizeunits' => 'Size units',
+);
+
+/** Short comments for standalone messages */
+$wgMessageComments = array(
+ 'lastmodifiedat' => '$1 date, $2 time',
+ 'sitenotice' => 'the equivalent to wgSiteNotice',
+ 'perfdisabledsub' => 'obsolete?',
+ 'history-feed-item-nocomment' => 'user at time',
+ 'editcomment' => 'only shown if there is an edit comment',
+ 'lastmodifiedatby' => '$1 date, $2 time, $3 user',
+ 'exif-orientation-1' => '0th row: top; 0th column: left',
+ 'exif-orientation-2' => '0th row: top; 0th column: right',
+ 'exif-orientation-3' => '0th row: bottom; 0th column: right',
+ 'exif-orientation-4' => '0th row: bottom; 0th column: left',
+ 'exif-orientation-5' => '0th row: left; 0th column: top',
+ 'exif-orientation-6' => '0th row: right; 0th column: top',
+ 'exif-orientation-7' => '0th row: right; 0th column: bottom',
+ 'exif-orientation-8' => '0th row: left; 0th column: bottom',
+ 'autoredircomment' => 'This should be changed to the new naming convention, but existed beforehand',
+);
+
+/** Messages which contain dollar signs (which are not followed by numbers), and therefore should use a single apostrophe */
+$wgMessagseWithDollarSigns = array(
+ 'linkprefix',
+ 'enotif_subject',
+ 'enotif_body',
+ 'allmessagesnotsupportedDB',
+);
+
+?>
diff --git a/maintenance/language/rebuildLanguage.php b/maintenance/language/rebuildLanguage.php
new file mode 100644
index 00000000..1643d30b
--- /dev/null
+++ b/maintenance/language/rebuildLanguage.php
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Rewrite the messages array in the files languages/messages/MessagesXX.php.
+ *
+ * @package MediaWiki
+ * @subpackage Maintenance
+ */
+
+require_once( dirname(__FILE__).'/../commandLine.inc' );
+require_once( 'languages.inc' );
+require_once( 'writeMessagesArray.inc' );
+
+/**
+ * Rewrite a messages array.
+ *
+ * @param $code The language code.
+ * @param $write Write to the messages file?
+ */
+function rebuildLanguage( $code, $write ) {
+ global $wgLanguages, $wg;
+
+ # Get messages
+ $messages = $wgLanguages->getMessages( $code );
+ $messages = $messages['all'];
+
+ # Rewrite messages array
+ $messagesText = writeMessagesArray( $messages, $code == 'en' );
+
+ # Write to the file
+ if ( $write ) {
+ $filename = Language::getMessagesFileName( $code );
+ $contents = file_get_contents( $filename );
+ if ( strpos( $contents, '$messages' ) !== false ) {
+ $new = explode( '$messages', $contents );
+ $new = $new[0];
+ $new .= $messagesText;
+ $new .= "\n?>\n";
+ file_put_contents( $filename, $new );
+ echo "Generated and wrote messages in language $code.\n";
+ }
+ } else {
+ echo "Generated messages in language $code.\n";
+ }
+}
+
+# Show help
+if ( isset( $options['help'] ) ) {
+ echo <<<END
+Run this script to rewrite the messages array in the files languages/messages/MessagesXX.php.
+Parameters:
+ * lang: Language code (default: the installation default language). You can also specify "all" to check all the languages.
+ * help: Show this help.
+Options:
+ * dry-run: Don't write the array to the file.
+
+END;
+ exit();
+}
+
+# Get the language code
+if ( isset( $options['lang'] ) ) {
+ $wgCode = $options['lang'];
+} else {
+ $wgCode = $wgContLang->getCode();
+}
+
+# Get the write options
+$wgWriteToFile = !isset( $options['dry-run'] );
+
+# Get language objects
+$wgLanguages = new languages();
+
+# Write all the language
+if ( $wgCode == 'all' ) {
+ foreach ( $wgLanguages->getLanguages() as $language ) {
+ rebuildLanguage( $language, $wgWriteToFile );
+ }
+} else {
+ rebuildLanguage( $wgCode, $wgWriteToFile );
+}
+
+?>
diff --git a/maintenance/language/splitLanguageFiles.inc b/maintenance/language/splitLanguageFiles.inc
index c2500778..500d2cdc 100644
--- a/maintenance/language/splitLanguageFiles.inc
+++ b/maintenance/language/splitLanguageFiles.inc
@@ -1124,7 +1124,7 @@ $commonMsg = array (
'thumbnail-more',
'missingimage',
'filemissing',
-'Monobook.css',
+'monobook.css',
'nodublincore',
'nocreativecommons',
'notacceptable',
@@ -1154,7 +1154,7 @@ $commonMsg = array (
'rcpatroldisabled', // not used ?
'rcpatroldisabledtext', // not used ?
-'Monobook.js',
+'monobook.js',
'newimages',
'noimages',
'variantname-zh-cn',
diff --git a/maintenance/language/transstat.php b/maintenance/language/transstat.php
index 590da121..e1b67274 100644
--- a/maintenance/language/transstat.php
+++ b/maintenance/language/transstat.php
@@ -12,7 +12,7 @@
* http://meta.wikimedia.org/wiki/Localization_statistics
*/
-require_once( 'maintenance/commandLine.inc' );
+require_once( dirname(__FILE__).'/../commandLine.inc' );
require_once( 'languages.inc' );
if ( isset( $options['help'] ) ) {
@@ -67,7 +67,7 @@ class wikiStatsOutput extends statsOutput {
echo "'''Statistics are based on:''' <code>" . $version . "</code>\n\n";
echo "'''Note:''' These statistics can be generated by running <code>php maintenance/language/transstat.php</code>.\n\n";
echo "For additional information on specific languages (the message names, the actual problems, etc.), run <code>php maintenance/language/checkLanguage.php --lang=foo</code>.\n\n";
- echo '{| border="2" cellpadding="4" cellspacing="0" style="background-color: #F9F9F9; border: 1px #AAAAAA solid; border-collapse: collapse;" width="100%"'."\n";
+ echo '{| class="sortable wikitable" border="2" cellpadding="4" cellspacing="0" style="background-color: #F9F9F9; border: 1px #AAAAAA solid; border-collapse: collapse;" width="100%"'."\n";
}
function footer() {
echo "|}\n";
@@ -160,6 +160,7 @@ $wgLanguages = new languages();
$wgOut->heading();
$wgOut->blockstart();
$wgOut->element( 'Language', true );
+$wgOut->element( 'Code', true );
$wgOut->element( 'Translated', true );
$wgOut->element( '%', true );
$wgOut->element( 'Obsolete', true );
@@ -195,7 +196,8 @@ foreach ( $wgLanguages->getLanguages() as $code ) {
# Output them
$wgOut->blockstart();
- $wgOut->element( "$language ($code)" );
+ $wgOut->element( "$language" );
+ $wgOut->element( "$code" );
$wgOut->element( "$requiredMessagesNumber/$wgRequiredMessagesNumber" );
$wgOut->element( $requiredMessagesPercent );
$wgOut->element( "$obsoleteMessagesNumber/$messagesNumber" );
diff --git a/maintenance/language/writeMessagesArray.inc b/maintenance/language/writeMessagesArray.inc
new file mode 100644
index 00000000..b0d17c59
--- /dev/null
+++ b/maintenance/language/writeMessagesArray.inc
@@ -0,0 +1,145 @@
+<?php
+/**
+ * Write a messages array as a PHP text.
+ *
+ * @package MediaWiki
+ * @subpackage Maintenance
+ */
+
+require_once( 'messages.inc' );
+require_once( 'messageTypes.inc' );
+
+/**
+ * Write a messages array as a PHP text.
+ *
+ * @param $messages The messages array.
+ * @param $ignoredComments Show comments about ignored and optional messages? (For English.)
+ *
+ * @return The PHP text.
+ */
+function writeMessagesArray( $messages, $ignoredComments = false ) {
+ global $wgMessageStrucutre, $wgBlockComments, $wgMessageComments;
+
+ # Sort messages to blocks
+ $sortedMessages['unknown'] = $messages;
+ foreach ( $wgMessageStrucutre as $blockName => $block ) {
+ foreach ( $block as $key ) {
+ if ( array_key_exists( $key, $sortedMessages['unknown'] ) ) {
+ $sortedMessages[$blockName][$key] = $sortedMessages['unknown'][$key];
+ unset( $sortedMessages['unknown'][$key] );
+ }
+ }
+ }
+
+ # Write all the messages
+ $messagesText = "\$messages = array(\n";
+ foreach( $sortedMessages as $block => $messages ) {
+ # Skip if it's the block of unknown messages - handle that in the end of file
+ if ( $block == 'unknown' ) {
+ continue;
+ }
+
+ # Write the block
+ $messagesText .= writeMessagesBlock( $block, $wgBlockComments[$block], $messages, $ignoredComments );
+ }
+ ksort( $sortedMessages['unknown'] );
+ $messagesText .= writeMessagesBlock( 'unknown', 'Unknown messages', $sortedMessages['unknown'], $ignoredComments ); # Write the unknown messages, alphabetically sorted
+ $messagesText .= ");\n";
+
+ return $messagesText;
+}
+
+/**
+ * Write a block of messages to PHP.
+ *
+ * @param $name The block name.
+ * @param $comment The block comment.
+ * @param $messages The block messages.
+ * @param $ignoredComments Show comments about ignored and optional messages? (For English.)
+ *
+ * @return The block, formatted in PHP.
+ */
+function writeMessagesBlock( $name, $comment, $messages, $ignoredComments ) {
+ global $wgMessageComments, $wgMessagseWithDollarSigns;
+ global $wgIgnoredMessages, $wgOptionalMessages;
+ $blockText = '';
+
+ # Skip the block if it includes no messages
+ if ( empty( $messages ) ) {
+ return '';
+ }
+
+ # Format the block comment (if exists); check for multiple lines comments
+ if ( !empty( $comment ) ) {
+ if ( strpos( $comment, "\n" ) === false ) {
+ $blockText .= "# $comment\n";
+ } else {
+ $blockText .= "/*\n$comment\n*/\n";
+ }
+ }
+
+ # Get max key length
+ $maxKeyLength = 0;
+ foreach( array_keys( $messages ) as $key ) {
+ if ( strlen( $key ) > $maxKeyLength ) {
+ $maxKeyLength = strlen( $key );
+ }
+ }
+
+ # Format the messages
+ foreach( $messages as $key => $value ) {
+ # Add the key name
+ $blockText .= "'$key'";
+
+ # Add the appropriate block whitespace
+ for ( $i = 1; $i <= ( $maxKeyLength - strlen( $key ) ); $i++ ) {
+ $blockText .= ' ';
+ }
+
+ # Refer to the value
+ $blockText .= ' => ';
+
+ # Check for the appropriate apostrophe and add the value
+ if ( strpos( $value, "'" ) === false ) {
+ $blockText .= "'$value'";
+ } elseif ( strpos( $value, '"' ) === false && !in_array( $key, $wgMessagseWithDollarSigns ) ) {
+ $blockText .= "\"$value\"";
+ } else {
+ $blockText .= "'" . str_replace( "'", "\'", $value ) . "'";
+ }
+
+ # Comma
+ $blockText .= ',';
+
+ $ignoredComment = "don't translate or duplicate this message to other languages";
+ $optionalComment = "only translate this message to other languages if you have to change it";
+ $showIgnoredOrOptionalComment = in_array( $key, $wgIgnoredMessages ) || in_array( $key, $wgOptionalMessages );
+ if ( $ignoredComments ) {
+ if ( array_key_exists( $key, $wgMessageComments ) ) {
+ $blockText .= ' # ' . $wgMessageComments[$key];
+ if ( $showIgnoredOrOptionalComment ) {
+ $blockText .= '; ';
+ }
+ } elseif ( $showIgnoredOrOptionalComment ) {
+ $blockText .= ' # ';
+ }
+ if ( in_array( $key, $wgIgnoredMessages ) ) {
+ $blockText .= $ignoredComment;
+ } elseif ( in_array( $key, $wgOptionalMessages ) ) {
+ $blockText .= $optionalComment;
+ }
+ } elseif ( array_key_exists( $key, $wgMessageComments ) ) {
+ $blockText .= ' # ' . $wgMessageComments[$key];
+ }
+
+ # Newline
+ $blockText .= "\n";
+ }
+
+ # Newline to end the block
+ $blockText .= "\n";
+
+ return $blockText;
+}
+
+?>
diff --git a/maintenance/moveBatch.php b/maintenance/moveBatch.php
index 8d7141cd..4b0abf7f 100644
--- a/maintenance/moveBatch.php
+++ b/maintenance/moveBatch.php
@@ -1,13 +1,23 @@
<?php
-# Move a batch of pages
-# Usage: php moveBatch.php [-u <user>] [-r <reason>] [-i <interval>] <listfile>
-# where
-# <listfile> is a file where each line has two titles separated by a pipe
-# character. The first title is the source, the second is the destination.
-# <user> is the username
-# <reason> is the move reason
-# <interval> is the number of seconds to sleep for after each move
+/**
+ * Maintenance script to move a batch of pages
+ *
+ * @package MediaWiki
+ * @subpackage Maintenance
+ * @author Tim Starling
+ *
+ * USAGE: php moveBatch.php [-u <user>] [-r <reason>] [-i <interval>] <listfile>
+ *
+ * <listfile> - file with two titles per line, separated with pipe characters;
+ * the first title is the source, the second is the destination
+ * <user> - username to perform moves as
+ * <reason> - reason to be given for moves
+ * <interval> - number of seconds to sleep after each move
+ *
+ * This will print out error codes from Title::moveTo() if something goes wrong,
+ * e.g. immobile_namespace for namespaces which can't be moved
+ */
$oldCwd = getcwd();
$optionsWithArgs = array( 'u', 'r', 'i' );
@@ -66,7 +76,7 @@ for ( $linenum = 1; !feof( $file ); $linenum++ ) {
}
- print $source->getPrefixedText();
+ print $source->getPrefixedText() . ' --> ' . $dest->getPrefixedText();
$dbw->begin();
$err = $source->moveTo( $dest, false, $reason );
if( $err !== true ) {
diff --git a/maintenance/mysql5/tables-binary.sql b/maintenance/mysql5/tables-binary.sql
new file mode 100644
index 00000000..2ab36546
--- /dev/null
+++ b/maintenance/mysql5/tables-binary.sql
@@ -0,0 +1,1095 @@
+-- Experimental table definitions for MySQL 4.1 and 5.0 with
+-- content-holding fields switched to explicit binary charset.
+--
+-- Binary is used instead of UTF-8 or UCS-2 so that all of
+-- Unicode may be used as UTF-8 (MySQL still does not allow
+-- use of characters outside the BMP in UTF-8 and has no UTF-16
+-- support).
+--
+-- This should provide compatibility with our current MySQL 4.0
+-- behavior (safe for full UTF-8, but ugly sorting) on newer
+-- versions of MySQL server, without the conversion surprises
+-- you get from piggybacking on "Latin-1" fields.
+--
+-- UTF-8 is used for the searchindex fields, as the fulltext index
+-- doesn't seem to like the binary encoding.
+--
+-- Not fully tested, may have surprises!
+--
+-- TODO: Test various fields
+
+-- ------------------------------------------------------------
+
+-- SQL to create the initial tables for the MediaWiki database.
+-- This is read and executed by the install script; you should
+-- not have to run it by itself unless doing a manual install.
+
+--
+-- General notes:
+--
+-- If possible, create tables as InnoDB to benefit from the
+-- superior resiliency against crashes and ability to read
+-- during writes (and write during reads!)
+--
+-- Only the 'searchindex' table requires MyISAM due to the
+-- requirement for fulltext index support, which is missing
+-- from InnoDB.
+--
+--
+-- The MySQL table backend for MediaWiki currently uses
+-- 14-character CHAR or VARCHAR fields to store timestamps.
+-- The format is YYYYMMDDHHMMSS, which is derived from the
+-- text format of MySQL's TIMESTAMP fields.
+--
+-- Historically TIMESTAMP fields were used, but abandoned
+-- in early 2002 after a lot of trouble with the fields
+-- auto-updating.
+--
+-- The Postgres backend uses DATETIME fields for timestamps,
+-- and we will migrate the MySQL definitions at some point as
+-- well.
+--
+--
+-- The /*$wgDBprefix*/ comments in this and other files are
+-- replaced with the defined table prefix by the installer
+-- and updater scripts. If you are installing or running
+-- updates manually, you will need to manually insert the
+-- table prefix if any when running these scripts.
+--
+
+
+--
+-- The user table contains basic account information,
+-- authentication keys, etc.
+--
+-- Some multi-wiki sites may share a single central user table
+-- between separate wikis using the $wgSharedDB setting.
+--
+-- Note that when a external authentication plugin is used,
+-- user table entries still need to be created to store
+-- preferences and to key tracking information in the other
+-- tables.
+--
+CREATE TABLE /*$wgDBprefix*/user (
+ user_id int(5) unsigned NOT NULL auto_increment,
+
+ -- Usernames must be unique, must not be in the form of
+ -- an IP address. _Shouldn't_ allow slashes or case
+ -- conflicts. Spaces are allowed, and are _not_ converted
+ -- to underscores like titles. See the User::newFromName() for
+ -- the specific tests that usernames have to pass.
+ user_name varchar(255) binary NOT NULL default '',
+
+ -- Optional 'real name' to be displayed in credit listings
+ user_real_name varchar(255) binary NOT NULL default '',
+
+ -- Password hashes, normally hashed like so:
+ -- MD5(CONCAT(user_id,'-',MD5(plaintext_password))), see
+ -- wfEncryptPassword() in GlobalFunctions.php
+ user_password tinyblob NOT NULL,
+
+ -- When using 'mail me a new password', a random
+ -- password is generated and the hash stored here.
+ -- The previous password is left in place until
+ -- someone actually logs in with the new password,
+ -- at which point the hash is moved to user_password
+ -- and the old password is invalidated.
+ user_newpassword tinyblob NOT NULL,
+
+ -- Timestamp of the last time when a new password was
+ -- sent, for throttling purposes
+ user_newpass_time char(14) binary,
+
+ -- Note: email should be restricted, not public info.
+ -- Same with passwords.
+ user_email tinytext NOT NULL,
+
+ -- Newline-separated list of name=value defining the user
+ -- preferences
+ user_options blob NOT NULL,
+
+ -- This is a timestamp which is updated when a user
+ -- logs in, logs out, changes preferences, or performs
+ -- some other action requiring HTML cache invalidation
+ -- to ensure that the UI is updated.
+ user_touched char(14) binary NOT NULL default '',
+
+ -- A pseudorandomly generated value that is stored in
+ -- a cookie when the "remember password" feature is
+ -- used (previously, a hash of the password was used, but
+ -- this was vulnerable to cookie-stealing attacks)
+ user_token char(32) binary NOT NULL default '',
+
+ -- Initially NULL; when a user's e-mail address has been
+ -- validated by returning with a mailed token, this is
+ -- set to the current timestamp.
+ user_email_authenticated char(14) binary,
+
+ -- Randomly generated token created when the e-mail address
+ -- is set and a confirmation test mail sent.
+ user_email_token char(32) binary,
+
+ -- Expiration date for the user_email_token
+ user_email_token_expires char(14) binary,
+
+ -- Timestamp of account registration.
+ -- Accounts predating this schema addition may contain NULL.
+ user_registration char(14) binary,
+
+ -- Count of edits and edit-like actions.
+ --
+ -- *NOT* intended to be an accurate copy of COUNT(*) WHERE rev_user=user_id
+ -- May contain NULL for old accounts if batch-update scripts haven't been
+ -- run, as well as listing deleted edits and other myriad ways it could be
+ -- out of sync.
+ --
+ -- Meant primarily for heuristic checks to give an impression of whether
+ -- the account has been used much.
+ --
+ user_editcount int,
+
+ PRIMARY KEY user_id (user_id),
+ UNIQUE INDEX user_name (user_name),
+ INDEX (user_email_token)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+--
+-- User permissions have been broken out to a separate table;
+-- this allows sites with a shared user table to have different
+-- permissions assigned to a user in each project.
+--
+-- This table replaces the old user_rights field which used a
+-- comma-separated blob.
+--
+CREATE TABLE /*$wgDBprefix*/user_groups (
+ -- Key to user_id
+ ug_user int(5) unsigned NOT NULL default '0',
+
+ -- Group names are short symbolic string keys.
+ -- The set of group names is open-ended, though in practice
+ -- only some predefined ones are likely to be used.
+ --
+ -- At runtime $wgGroupPermissions will associate group keys
+ -- with particular permissions. A user will have the combined
+ -- permissions of any group they're explicitly in, plus
+ -- the implicit '*' and 'user' groups.
+ ug_group char(16) NOT NULL default '',
+
+ PRIMARY KEY (ug_user,ug_group),
+ KEY (ug_group)
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+-- Stores notifications of user talk page changes, for the display
+-- of the "you have new messages" box
+CREATE TABLE /*$wgDBprefix*/user_newtalk (
+ -- Key to user.user_id
+ user_id int(5) NOT NULL default '0',
+ -- If the user is an anonymous user hir IP address is stored here
+ -- since the user_id of 0 is ambiguous
+ user_ip varchar(40) NOT NULL default '',
+ INDEX user_id (user_id),
+ INDEX user_ip (user_ip)
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+
+--
+-- Core of the wiki: each page has an entry here which identifies
+-- it by title and contains some essential metadata.
+--
+CREATE TABLE /*$wgDBprefix*/page (
+ -- Unique identifier number. The page_id will be preserved across
+ -- edits and rename operations, but not deletions and recreations.
+ page_id int(8) unsigned NOT NULL auto_increment,
+
+ -- A page name is broken into a namespace and a title.
+ -- The namespace keys are UI-language-independent constants,
+ -- defined in includes/Defines.php
+ page_namespace int NOT NULL,
+
+ -- The rest of the title, as text.
+ -- Spaces are transformed into underscores in title storage.
+ page_title varchar(255) binary NOT NULL,
+
+ -- Comma-separated set of permission keys indicating who
+ -- can move or edit the page.
+ page_restrictions tinyblob NOT NULL,
+
+ -- Number of times this page has been viewed.
+ page_counter bigint(20) unsigned NOT NULL default '0',
+
+ -- 1 indicates the article is a redirect.
+ page_is_redirect tinyint(1) unsigned NOT NULL default '0',
+
+ -- 1 indicates this is a new entry, with only one edit.
+ -- Not all pages with one edit are new pages.
+ page_is_new tinyint(1) unsigned NOT NULL default '0',
+
+ -- Random value between 0 and 1, used for Special:Randompage
+ page_random real unsigned NOT NULL,
+
+ -- This timestamp is updated whenever the page changes in
+ -- a way requiring it to be re-rendered, invalidating caches.
+ -- Aside from editing this includes permission changes,
+ -- creation or deletion of linked pages, and alteration
+ -- of contained templates.
+ page_touched char(14) binary NOT NULL default '',
+
+ -- Handy key to revision.rev_id of the current revision.
+ -- This may be 0 during page creation, but that shouldn't
+ -- happen outside of a transaction... hopefully.
+ page_latest int(8) unsigned NOT NULL,
+
+ -- Uncompressed length in bytes of the page's current source text.
+ page_len int(8) unsigned NOT NULL,
+
+ PRIMARY KEY page_id (page_id),
+ UNIQUE INDEX name_title (page_namespace,page_title),
+
+ -- Special-purpose indexes
+ INDEX (page_random),
+ INDEX (page_len)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+--
+-- Every edit of a page creates also a revision row.
+-- This stores metadata about the revision, and a reference
+-- to the text storage backend.
+--
+CREATE TABLE /*$wgDBprefix*/revision (
+ rev_id int(8) unsigned NOT NULL auto_increment,
+
+ -- Key to page_id. This should _never_ be invalid.
+ rev_page int(8) unsigned NOT NULL,
+
+ -- Key to text.old_id, where the actual bulk text is stored.
+ -- It's possible for multiple revisions to use the same text,
+ -- for instance revisions where only metadata is altered
+ -- or a rollback to a previous version.
+ rev_text_id int(8) unsigned NOT NULL,
+
+ -- Text comment summarizing the change.
+ -- This text is shown in the history and other changes lists,
+ -- rendered in a subset of wiki markup by Linker::formatComment()
+ rev_comment tinyblob NOT NULL,
+
+ -- Key to user.user_id of the user who made this edit.
+ -- Stores 0 for anonymous edits and for some mass imports.
+ rev_user int(5) unsigned NOT NULL default '0',
+
+ -- Text username or IP address of the editor.
+ rev_user_text varchar(255) binary NOT NULL default '',
+
+ -- Timestamp
+ rev_timestamp char(14) binary NOT NULL default '',
+
+ -- Records whether the user marked the 'minor edit' checkbox.
+ -- Many automated edits are marked as minor.
+ rev_minor_edit tinyint(1) unsigned NOT NULL default '0',
+
+ -- Not yet used; reserved for future changes to the deletion system.
+ rev_deleted tinyint(1) unsigned NOT NULL default '0',
+
+ PRIMARY KEY rev_page_id (rev_page, rev_id),
+ UNIQUE INDEX rev_id (rev_id),
+ INDEX rev_timestamp (rev_timestamp),
+ INDEX page_timestamp (rev_page,rev_timestamp),
+ INDEX user_timestamp (rev_user,rev_timestamp),
+ INDEX usertext_timestamp (rev_user_text,rev_timestamp)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+
+--
+-- Holds text of individual page revisions.
+--
+-- Field names are a holdover from the 'old' revisions table in
+-- MediaWiki 1.4 and earlier: an upgrade will transform that
+-- table into the 'text' table to minimize unnecessary churning
+-- and downtime. If upgrading, the other fields will be left unused.
+--
+CREATE TABLE /*$wgDBprefix*/text (
+ -- Unique text storage key number.
+ -- Note that the 'oldid' parameter used in URLs does *not*
+ -- refer to this number anymore, but to rev_id.
+ --
+ -- revision.rev_text_id is a key to this column
+ old_id int(8) unsigned NOT NULL auto_increment,
+
+ -- Depending on the contents of the old_flags field, the text
+ -- may be convenient plain text, or it may be funkily encoded.
+ old_text mediumblob NOT NULL,
+
+ -- Comma-separated list of flags:
+ -- gzip: text is compressed with PHP's gzdeflate() function.
+ -- utf8: text was stored as UTF-8.
+ -- If $wgLegacyEncoding option is on, rows *without* this flag
+ -- will be converted to UTF-8 transparently at load time.
+ -- object: text field contained a serialized PHP object.
+ -- The object either contains multiple versions compressed
+ -- together to achieve a better compression ratio, or it refers
+ -- to another row where the text can be found.
+ old_flags tinyblob NOT NULL,
+
+ PRIMARY KEY old_id (old_id)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+--
+-- Holding area for deleted articles, which may be viewed
+-- or restored by admins through the Special:Undelete interface.
+-- The fields generally correspond to the page, revision, and text
+-- fields, with several caveats.
+--
+CREATE TABLE /*$wgDBprefix*/archive (
+ ar_namespace int NOT NULL default '0',
+ ar_title varchar(255) binary NOT NULL default '',
+
+ -- Newly deleted pages will not store text in this table,
+ -- but will reference the separately existing text rows.
+ -- This field is retained for backwards compatibility,
+ -- so old archived pages will remain accessible after
+ -- upgrading from 1.4 to 1.5.
+ -- Text may be gzipped or otherwise funky.
+ ar_text mediumblob NOT NULL,
+
+ -- Basic revision stuff...
+ ar_comment tinyblob NOT NULL,
+ ar_user int(5) unsigned NOT NULL default '0',
+ ar_user_text varchar(255) binary NOT NULL,
+ ar_timestamp char(14) binary NOT NULL default '',
+ ar_minor_edit tinyint(1) NOT NULL default '0',
+
+ -- See ar_text note.
+ ar_flags tinyblob NOT NULL,
+
+ -- When revisions are deleted, their unique rev_id is stored
+ -- here so it can be retained after undeletion. This is necessary
+ -- to retain permalinks to given revisions after accidental delete
+ -- cycles or messy operations like history merges.
+ --
+ -- Old entries from 1.4 will be NULL here, and a new rev_id will
+ -- be created on undeletion for those revisions.
+ ar_rev_id int(8) unsigned,
+
+ -- For newly deleted revisions, this is the text.old_id key to the
+ -- actual stored text. To avoid breaking the block-compression scheme
+ -- and otherwise making storage changes harder, the actual text is
+ -- *not* deleted from the text table, merely hidden by removal of the
+ -- page and revision entries.
+ --
+ -- Old entries deleted under 1.2-1.4 will have NULL here, and their
+ -- ar_text and ar_flags fields will be used to create a new text
+ -- row upon undeletion.
+ ar_text_id int(8) unsigned,
+
+ KEY name_title_timestamp (ar_namespace,ar_title,ar_timestamp)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+
+--
+-- Track page-to-page hyperlinks within the wiki.
+--
+CREATE TABLE /*$wgDBprefix*/pagelinks (
+ -- Key to the page_id of the page containing the link.
+ pl_from int(8) unsigned NOT NULL default '0',
+
+ -- Key to page_namespace/page_title of the target page.
+ -- The target page may or may not exist, and due to renames
+ -- and deletions may refer to different page records as time
+ -- goes by.
+ pl_namespace int NOT NULL default '0',
+ pl_title varchar(255) binary NOT NULL default '',
+
+ UNIQUE KEY pl_from (pl_from,pl_namespace,pl_title),
+ KEY (pl_namespace,pl_title,pl_from)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+
+--
+-- Track template inclusions.
+--
+CREATE TABLE /*$wgDBprefix*/templatelinks (
+ -- Key to the page_id of the page containing the link.
+ tl_from int(8) unsigned NOT NULL default '0',
+
+ -- Key to page_namespace/page_title of the target page.
+ -- The target page may or may not exist, and due to renames
+ -- and deletions may refer to different page records as time
+ -- goes by.
+ tl_namespace int NOT NULL default '0',
+ tl_title varchar(255) binary NOT NULL default '',
+
+ UNIQUE KEY tl_from (tl_from,tl_namespace,tl_title),
+ KEY (tl_namespace,tl_title,tl_from)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+
+--
+-- Track links to images *used inline*
+-- We don't distinguish live from broken links here, so
+-- they do not need to be changed on upload/removal.
+--
+CREATE TABLE /*$wgDBprefix*/imagelinks (
+ -- Key to page_id of the page containing the image / media link.
+ il_from int(8) unsigned NOT NULL default '0',
+
+ -- Filename of target image.
+ -- This is also the page_title of the file's description page;
+ -- all such pages are in namespace 6 (NS_IMAGE).
+ il_to varchar(255) binary NOT NULL default '',
+
+ UNIQUE KEY il_from (il_from,il_to),
+ KEY (il_to,il_from)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+--
+-- Track category inclusions *used inline*
+-- This tracks a single level of category membership
+-- (folksonomic tagging, really).
+--
+CREATE TABLE /*$wgDBprefix*/categorylinks (
+ -- Key to page_id of the page defined as a category member.
+ cl_from int(8) unsigned NOT NULL default '0',
+
+ -- Name of the category.
+ -- This is also the page_title of the category's description page;
+ -- all such pages are in namespace 14 (NS_CATEGORY).
+ cl_to varchar(255) binary NOT NULL default '',
+
+ -- The title of the linking page, or an optional override
+ -- to determine sort order. Sorting is by binary order, which
+ -- isn't always ideal, but collations seem to be an exciting
+ -- and dangerous new world in MySQL...
+ --
+ -- For MySQL 4.1+ with charset set to utf8, the sort key *index*
+ -- needs cut to be smaller than 1024 bytes (at 3 bytes per char).
+ -- To sort properly on the shorter key, this field needs to be
+ -- the same shortness.
+ cl_sortkey varchar(86) binary NOT NULL default '',
+
+ -- This isn't really used at present. Provided for an optional
+ -- sorting method by approximate addition time.
+ cl_timestamp timestamp NOT NULL,
+
+ UNIQUE KEY cl_from (cl_from,cl_to),
+
+ -- We always sort within a given category...
+ KEY cl_sortkey (cl_to,cl_sortkey),
+
+ -- Not really used?
+ KEY cl_timestamp (cl_to,cl_timestamp)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+--
+-- Track links to external URLs
+--
+CREATE TABLE /*$wgDBprefix*/externallinks (
+ -- page_id of the referring page
+ el_from int(8) unsigned NOT NULL default '0',
+
+ -- The URL
+ el_to blob NOT NULL,
+
+ -- In the case of HTTP URLs, this is the URL with any username or password
+ -- removed, and with the labels in the hostname reversed and converted to
+ -- lower case. An extra dot is added to allow for matching of either
+ -- example.com or *.example.com in a single scan.
+ -- Example:
+ -- http://user:password@sub.example.com/page.html
+ -- becomes
+ -- http://com.example.sub./page.html
+ -- which allows for fast searching for all pages under example.com with the
+ -- clause:
+ -- WHERE el_index LIKE 'http://com.example.%'
+ el_index blob NOT NULL,
+
+ KEY (el_from, el_to(40)),
+ KEY (el_to(60), el_from),
+ KEY (el_index(60))
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+--
+-- Track interlanguage links
+--
+CREATE TABLE /*$wgDBprefix*/langlinks (
+ -- page_id of the referring page
+ ll_from int(8) unsigned NOT NULL default '0',
+
+ -- Language code of the target
+ ll_lang varchar(10) binary NOT NULL default '',
+
+ -- Title of the target, including namespace
+ ll_title varchar(255) binary NOT NULL default '',
+
+ UNIQUE KEY (ll_from, ll_lang),
+ KEY (ll_lang, ll_title)
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+--
+-- Contains a single row with some aggregate info
+-- on the state of the site.
+--
+CREATE TABLE /*$wgDBprefix*/site_stats (
+ -- The single row should contain 1 here.
+ ss_row_id int(8) unsigned NOT NULL,
+
+ -- Total number of page views, if hit counters are enabled.
+ ss_total_views bigint(20) unsigned default '0',
+
+ -- Total number of edits performed.
+ ss_total_edits bigint(20) unsigned default '0',
+
+ -- An approximate count of pages matching the following criteria:
+ -- * in namespace 0
+ -- * not a redirect
+ -- * contains the text '[['
+ -- See Article::isCountable() in includes/Article.php
+ ss_good_articles bigint(20) unsigned default '0',
+
+ -- Total pages, theoretically equal to SELECT COUNT(*) FROM page; except faster
+ ss_total_pages bigint(20) default '-1',
+
+ -- Number of users, theoretically equal to SELECT COUNT(*) FROM user;
+ ss_users bigint(20) default '-1',
+
+ -- Deprecated, no longer updated as of 1.5
+ ss_admins int(10) default '-1',
+
+ -- Number of images, equivalent to SELECT COUNT(*) FROM image
+ ss_images int(10) default '0',
+
+ UNIQUE KEY ss_row_id (ss_row_id)
+
+) ENGINE=InnoDB;
+
+--
+-- Stores an ID for every time any article is visited;
+-- depending on $wgHitcounterUpdateFreq, it is
+-- periodically cleared and the page_counter column
+-- in the page table updated for the all articles
+-- that have been visited.)
+--
+CREATE TABLE /*$wgDBprefix*/hitcounter (
+ hc_id int unsigned NOT NULL
+) ENGINE=HEAP MAX_ROWS=25000;
+
+
+--
+-- The internet is full of jerks, alas. Sometimes it's handy
+-- to block a vandal or troll account.
+--
+CREATE TABLE /*$wgDBprefix*/ipblocks (
+ -- Primary key, introduced for privacy.
+ ipb_id int(8) NOT NULL auto_increment,
+
+ -- Blocked IP address in dotted-quad form or user name.
+ ipb_address tinyblob NOT NULL,
+
+ -- Blocked user ID or 0 for IP blocks.
+ ipb_user int(8) unsigned NOT NULL default '0',
+
+ -- User ID who made the block.
+ ipb_by int(8) unsigned NOT NULL default '0',
+
+ -- Text comment made by blocker.
+ ipb_reason tinyblob NOT NULL,
+
+ -- Creation (or refresh) date in standard YMDHMS form.
+ -- IP blocks expire automatically.
+ ipb_timestamp char(14) binary NOT NULL default '',
+
+ -- Indicates that the IP address was banned because a banned
+ -- user accessed a page through it. If this is 1, ipb_address
+ -- will be hidden, and the block identified by block ID number.
+ ipb_auto bool NOT NULL default '0',
+
+ -- If set to 1, block applies only to logged-out users
+ ipb_anon_only bool NOT NULL default 0,
+
+ -- Block prevents account creation from matching IP addresses
+ ipb_create_account bool NOT NULL default 1,
+
+ -- Block triggers autoblocks
+ ipb_enable_autoblock bool NOT NULL default '1',
+
+ -- Time at which the block will expire.
+ ipb_expiry char(14) binary NOT NULL default '',
+
+ -- Start and end of an address range, in hexadecimal
+ -- Size chosen to allow IPv6
+ ipb_range_start varchar(32) NOT NULL default '',
+ ipb_range_end varchar(32) NOT NULL default '',
+
+ PRIMARY KEY ipb_id (ipb_id),
+
+ -- Unique index to support "user already blocked" messages
+ -- Any new options which prevent collisions should be included
+ UNIQUE INDEX ipb_address (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only),
+
+ INDEX ipb_user (ipb_user),
+ INDEX ipb_range (ipb_range_start(8), ipb_range_end(8)),
+ INDEX ipb_timestamp (ipb_timestamp),
+ INDEX ipb_expiry (ipb_expiry)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+
+--
+-- Uploaded images and other files.
+--
+CREATE TABLE /*$wgDBprefix*/image (
+ -- Filename.
+ -- This is also the title of the associated description page,
+ -- which will be in namespace 6 (NS_IMAGE).
+ img_name varchar(255) binary NOT NULL default '',
+
+ -- File size in bytes.
+ img_size int(8) unsigned NOT NULL default '0',
+
+ -- For images, size in pixels.
+ img_width int(5) NOT NULL default '0',
+ img_height int(5) NOT NULL default '0',
+
+ -- Extracted EXIF metadata stored as a serialized PHP array.
+ img_metadata mediumblob NOT NULL,
+
+ -- For images, bits per pixel if known.
+ img_bits int(3) NOT NULL default '0',
+
+ -- Media type as defined by the MEDIATYPE_xxx constants
+ img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
+
+ -- major part of a MIME media type as defined by IANA
+ -- see http://www.iana.org/assignments/media-types/
+ img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
+
+ -- minor part of a MIME media type as defined by IANA
+ -- the minor parts are not required to adher to any standard
+ -- but should be consistent throughout the database
+ -- see http://www.iana.org/assignments/media-types/
+ img_minor_mime varchar(32) NOT NULL default "unknown",
+
+ -- Description field as entered by the uploader.
+ -- This is displayed in image upload history and logs.
+ img_description tinyblob NOT NULL,
+
+ -- user_id and user_name of uploader.
+ img_user int(5) unsigned NOT NULL default '0',
+ img_user_text varchar(255) binary NOT NULL default '',
+
+ -- Time of the upload.
+ img_timestamp char(14) binary NOT NULL default '',
+
+ PRIMARY KEY img_name (img_name),
+
+ -- Used by Special:Imagelist for sort-by-size
+ INDEX img_size (img_size),
+
+ -- Used by Special:Newimages and Special:Imagelist
+ INDEX img_timestamp (img_timestamp)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+--
+-- Previous revisions of uploaded files.
+-- Awkwardly, image rows have to be moved into
+-- this table at re-upload time.
+--
+CREATE TABLE /*$wgDBprefix*/oldimage (
+ -- Base filename: key to image.img_name
+ oi_name varchar(255) binary NOT NULL default '',
+
+ -- Filename of the archived file.
+ -- This is generally a timestamp and '!' prepended to the base name.
+ oi_archive_name varchar(255) binary NOT NULL default '',
+
+ -- Other fields as in image...
+ oi_size int(8) unsigned NOT NULL default 0,
+ oi_width int(5) NOT NULL default 0,
+ oi_height int(5) NOT NULL default 0,
+ oi_bits int(3) NOT NULL default 0,
+ oi_description tinyblob NOT NULL,
+ oi_user int(5) unsigned NOT NULL default '0',
+ oi_user_text varchar(255) binary NOT NULL default '',
+ oi_timestamp char(14) binary NOT NULL default '',
+
+ INDEX oi_name (oi_name(10))
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+
+--
+-- Record of deleted file data
+--
+CREATE TABLE /*$wgDBprefix*/filearchive (
+ -- Unique row id
+ fa_id int NOT NULL auto_increment,
+
+ -- Original base filename; key to image.img_name, page.page_title, etc
+ fa_name varchar(255) binary NOT NULL default '',
+
+ -- Filename of archived file, if an old revision
+ fa_archive_name varchar(255) binary default '',
+
+ -- Which storage bin (directory tree or object store) the file data
+ -- is stored in. Should be 'deleted' for files that have been deleted;
+ -- any other bin is not yet in use.
+ fa_storage_group varchar(16),
+
+ -- SHA-1 of the file contents plus extension, used as a key for storage.
+ -- eg 8f8a562add37052a1848ff7771a2c515db94baa9.jpg
+ --
+ -- If NULL, the file was missing at deletion time or has been purged
+ -- from the archival storage.
+ fa_storage_key varchar(64) binary default '',
+
+ -- Deletion information, if this file is deleted.
+ fa_deleted_user int,
+ fa_deleted_timestamp char(14) binary default '',
+ fa_deleted_reason text,
+
+ -- Duped fields from image
+ fa_size int(8) unsigned default '0',
+ fa_width int(5) default '0',
+ fa_height int(5) default '0',
+ fa_metadata mediumblob,
+ fa_bits int(3) default '0',
+ fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
+ fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") default "unknown",
+ fa_minor_mime varchar(32) default "unknown",
+ fa_description tinyblob,
+ fa_user int(5) unsigned default '0',
+ fa_user_text varchar(255) binary default '',
+ fa_timestamp char(14) binary default '',
+
+ PRIMARY KEY (fa_id),
+ INDEX (fa_name, fa_timestamp), -- pick out by image name
+ INDEX (fa_storage_group, fa_storage_key), -- pick out dupe files
+ INDEX (fa_deleted_timestamp), -- sort by deletion time
+ INDEX (fa_deleted_user) -- sort by deleter
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+--
+-- Primarily a summary table for Special:Recentchanges,
+-- this table contains some additional info on edits from
+-- the last few days, see Article::editUpdates()
+--
+CREATE TABLE /*$wgDBprefix*/recentchanges (
+ rc_id int(8) NOT NULL auto_increment,
+ rc_timestamp varchar(14) binary NOT NULL default '',
+ rc_cur_time varchar(14) binary NOT NULL default '',
+
+ -- As in revision
+ rc_user int(10) unsigned NOT NULL default '0',
+ rc_user_text varchar(255) binary NOT NULL default '',
+
+ -- When pages are renamed, their RC entries do _not_ change.
+ rc_namespace int NOT NULL default '0',
+ rc_title varchar(255) binary NOT NULL default '',
+
+ -- as in revision...
+ rc_comment varchar(255) binary NOT NULL default '',
+ rc_minor tinyint(3) unsigned NOT NULL default '0',
+
+ -- Edits by user accounts with the 'bot' rights key are
+ -- marked with a 1 here, and will be hidden from the
+ -- default view.
+ rc_bot tinyint(3) unsigned NOT NULL default '0',
+
+ rc_new tinyint(3) unsigned NOT NULL default '0',
+
+ -- Key to page_id (was cur_id prior to 1.5).
+ -- This will keep links working after moves while
+ -- retaining the at-the-time name in the changes list.
+ rc_cur_id int(10) unsigned NOT NULL default '0',
+
+ -- rev_id of the given revision
+ rc_this_oldid int(10) unsigned NOT NULL default '0',
+
+ -- rev_id of the prior revision, for generating diff links.
+ rc_last_oldid int(10) unsigned NOT NULL default '0',
+
+ -- These may no longer be used, with the new move log.
+ rc_type tinyint(3) unsigned NOT NULL default '0',
+ rc_moved_to_ns tinyint(3) unsigned NOT NULL default '0',
+ rc_moved_to_title varchar(255) binary NOT NULL default '',
+
+ -- If the Recent Changes Patrol option is enabled,
+ -- users may mark edits as having been reviewed to
+ -- remove a warning flag on the RC list.
+ -- A value of 1 indicates the page has been reviewed.
+ rc_patrolled tinyint(3) unsigned NOT NULL default '0',
+
+ -- Recorded IP address the edit was made from, if the
+ -- $wgPutIPinRC option is enabled.
+ rc_ip char(15) NOT NULL default '',
+
+ -- Text length in characters before
+ -- and after the edit
+ rc_old_len int(10) default '0',
+ rc_new_len int(10) default '0',
+
+ PRIMARY KEY rc_id (rc_id),
+ INDEX rc_timestamp (rc_timestamp),
+ INDEX rc_namespace_title (rc_namespace, rc_title),
+ INDEX rc_cur_id (rc_cur_id),
+ INDEX new_name_timestamp (rc_new,rc_namespace,rc_timestamp),
+ INDEX rc_ip (rc_ip),
+ INDEX rc_ns_usertext ( rc_namespace, rc_user_text )
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+CREATE TABLE /*$wgDBprefix*/watchlist (
+ -- Key to user.user_id
+ wl_user int(5) unsigned NOT NULL,
+
+ -- Key to page_namespace/page_title
+ -- Note that users may watch pages which do not exist yet,
+ -- or existed in the past but have been deleted.
+ wl_namespace int NOT NULL default '0',
+ wl_title varchar(255) binary NOT NULL default '',
+
+ -- Timestamp when user was last sent a notification e-mail;
+ -- cleared when the user visits the page.
+ wl_notificationtimestamp varchar(14) binary,
+
+ UNIQUE KEY (wl_user, wl_namespace, wl_title),
+ KEY namespace_title (wl_namespace,wl_title)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+
+--
+-- Used by the math module to keep track
+-- of previously-rendered items.
+--
+CREATE TABLE /*$wgDBprefix*/math (
+ -- Binary MD5 hash of the latex fragment, used as an identifier key.
+ math_inputhash varbinary(16) NOT NULL,
+
+ -- Not sure what this is, exactly...
+ math_outputhash varbinary(16) NOT NULL,
+
+ -- texvc reports how well it thinks the HTML conversion worked;
+ -- if it's a low level the PNG rendering may be preferred.
+ math_html_conservativeness tinyint(1) NOT NULL,
+
+ -- HTML output from texvc, if any
+ math_html text,
+
+ -- MathML output from texvc, if any
+ math_mathml text,
+
+ UNIQUE KEY math_inputhash (math_inputhash)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+--
+-- When using the default MySQL search backend, page titles
+-- and text are munged to strip markup, do Unicode case folding,
+-- and prepare the result for MySQL's fulltext index.
+--
+-- This table must be MyISAM; InnoDB does not support the needed
+-- fulltext index.
+--
+CREATE TABLE /*$wgDBprefix*/searchindex (
+ -- Key to page_id
+ si_page int(8) unsigned NOT NULL,
+
+ -- Munged version of title
+ si_title varchar(255) NOT NULL default '',
+
+ -- Munged version of body text
+ si_text mediumtext NOT NULL,
+
+ UNIQUE KEY (si_page),
+ FULLTEXT si_title (si_title),
+ FULLTEXT si_text (si_text)
+
+) ENGINE=MyISAM, DEFAULT CHARSET=utf8;
+
+--
+-- Recognized interwiki link prefixes
+--
+CREATE TABLE /*$wgDBprefix*/interwiki (
+ -- The interwiki prefix, (e.g. "Meatball", or the language prefix "de")
+ iw_prefix char(32) NOT NULL,
+
+ -- The URL of the wiki, with "$1" as a placeholder for an article name.
+ -- Any spaces in the name will be transformed to underscores before
+ -- insertion.
+ iw_url char(127) NOT NULL,
+
+ -- A boolean value indicating whether the wiki is in this project
+ -- (used, for example, to detect redirect loops)
+ iw_local bool NOT NULL,
+
+ -- Boolean value indicating whether interwiki transclusions are allowed.
+ iw_trans tinyint(1) NOT NULL default 0,
+
+ UNIQUE KEY iw_prefix (iw_prefix)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+--
+-- Used for caching expensive grouped queries
+--
+CREATE TABLE /*$wgDBprefix*/querycache (
+ -- A key name, generally the base name of of the special page.
+ qc_type char(32) NOT NULL,
+
+ -- Some sort of stored value. Sizes, counts...
+ qc_value int(5) unsigned NOT NULL default '0',
+
+ -- Target namespace+title
+ qc_namespace int NOT NULL default '0',
+ qc_title char(255) binary NOT NULL default '',
+
+ KEY (qc_type,qc_value)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+--
+-- For a few generic cache operations if not using Memcached
+--
+CREATE TABLE /*$wgDBprefix*/objectcache (
+ keyname char(255) binary NOT NULL default '',
+ value mediumblob,
+ exptime datetime,
+ UNIQUE KEY (keyname),
+ KEY (exptime)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+--
+-- Cache of interwiki transclusion
+--
+CREATE TABLE /*$wgDBprefix*/transcache (
+ tc_url varchar(255) NOT NULL,
+ tc_contents text,
+ tc_time int NOT NULL,
+ UNIQUE INDEX tc_url_idx (tc_url)
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+CREATE TABLE /*$wgDBprefix*/logging (
+ -- Symbolic keys for the general log type and the action type
+ -- within the log. The output format will be controlled by the
+ -- action field, but only the type controls categorization.
+ log_type char(10) NOT NULL default '',
+ log_action char(10) NOT NULL default '',
+
+ -- Timestamp. Duh.
+ log_timestamp char(14) NOT NULL default '19700101000000',
+
+ -- The user who performed this action; key to user_id
+ log_user int unsigned NOT NULL default 0,
+
+ -- Key to the page affected. Where a user is the target,
+ -- this will point to the user page.
+ log_namespace int NOT NULL default 0,
+ log_title varchar(255) binary NOT NULL default '',
+
+ -- Freeform text. Interpreted as edit history comments.
+ log_comment varchar(255) NOT NULL default '',
+
+ -- LF separated list of miscellaneous parameters
+ log_params blob NOT NULL,
+
+ KEY type_time (log_type, log_timestamp),
+ KEY user_time (log_user, log_timestamp),
+ KEY page_time (log_namespace, log_title, log_timestamp)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+CREATE TABLE /*$wgDBprefix*/trackbacks (
+ tb_id int auto_increment,
+ tb_page int REFERENCES page(page_id) ON DELETE CASCADE,
+ tb_title varchar(255) NOT NULL,
+ tb_url varchar(255) NOT NULL,
+ tb_ex text,
+ tb_name varchar(255),
+
+ PRIMARY KEY (tb_id),
+ INDEX (tb_page)
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+-- Jobs performed by parallel apache threads or a command-line daemon
+CREATE TABLE /*$wgDBprefix*/job (
+ job_id int(9) unsigned NOT NULL auto_increment,
+
+ -- Command name, currently only refreshLinks is defined
+ job_cmd varchar(255) NOT NULL default '',
+
+ -- Namespace and title to act on
+ -- Should be 0 and '' if the command does not operate on a title
+ job_namespace int NOT NULL,
+ job_title varchar(255) binary NOT NULL,
+
+ -- Any other parameters to the command
+ -- Presently unused, format undefined
+ job_params blob NOT NULL,
+
+ PRIMARY KEY job_id (job_id),
+ KEY (job_cmd, job_namespace, job_title)
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+-- Details of updates to cached special pages
+CREATE TABLE /*$wgDBprefix*/querycache_info (
+
+ -- Special page name
+ -- Corresponds to a qc_type value
+ qci_type varchar(32) NOT NULL default '',
+
+ -- Timestamp of last update
+ qci_timestamp char(14) NOT NULL default '19700101000000',
+
+ UNIQUE KEY ( qci_type )
+
+) ENGINE=InnoDB;
+
+-- For each redirect, this table contains exactly one row defining its target
+CREATE TABLE /*$wgDBprefix*/redirect (
+ -- Key to the page_id of the redirect page
+ rd_from int(8) unsigned NOT NULL default '0',
+
+ -- Key to page_namespace/page_title of the target page.
+ -- The target page may or may not exist, and due to renames
+ -- and deletions may refer to different page records as time
+ -- goes by.
+ rd_namespace int NOT NULL default '0',
+ rd_title varchar(255) binary NOT NULL default '',
+
+ PRIMARY KEY rd_from (rd_from),
+ KEY rd_ns_title (rd_namespace,rd_title,rd_from)
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
+
+-- Used for caching expensive grouped queries that need two links (for example double-redirects)
+
+CREATE TABLE /*$wgDBprefix*/querycachetwo (
+ -- A key name, generally the base name of of the special page.
+ qcc_type char(32) NOT NULL,
+
+ -- Some sort of stored value. Sizes, counts...
+ qcc_value int(5) unsigned NOT NULL default '0',
+
+ -- Target namespace+title
+ qcc_namespace int NOT NULL default '0',
+ qcc_title char(255) binary NOT NULL default '',
+
+ -- Target namespace+title2
+ qcc_namespacetwo int NOT NULL default '0',
+ qcc_titletwo char(255) binary NOT NULL default '',
+
+ KEY qcc_type (qcc_type,qcc_value),
+ KEY qcc_title (qcc_type,qcc_namespace,qcc_title),
+ KEY qcc_titletwo (qcc_type,qcc_namespacetwo,qcc_titletwo)
+
+) ENGINE=InnoDB, DEFAULT CHARSET=binary;
diff --git a/maintenance/mysql5/tables.sql b/maintenance/mysql5/tables.sql
index 81a4690a..356f3bbf 100644
--- a/maintenance/mysql5/tables.sql
+++ b/maintenance/mysql5/tables.sql
@@ -36,7 +36,7 @@
-- in early 2002 after a lot of trouble with the fields
-- auto-updating.
--
--- The PostgreSQL backend uses DATETIME fields for timestamps,
+-- The Postgres backend uses DATETIME fields for timestamps,
-- and we will migrate the MySQL definitions at some point as
-- well.
--
@@ -77,7 +77,7 @@ CREATE TABLE /*$wgDBprefix*/user (
-- Password hashes, normally hashed like so:
-- MD5(CONCAT(user_id,'-',MD5(plaintext_password))), see
-- wfEncryptPassword() in GlobalFunctions.php
- user_password tinyblob NOT NULL default '',
+ user_password tinyblob NOT NULL,
-- When using 'mail me a new password', a random
-- password is generated and the hash stored here.
@@ -85,15 +85,19 @@ CREATE TABLE /*$wgDBprefix*/user (
-- someone actually logs in with the new password,
-- at which point the hash is moved to user_password
-- and the old password is invalidated.
- user_newpassword tinyblob NOT NULL default '',
+ user_newpassword tinyblob NOT NULL,
+
+ -- Timestamp of the last time when a new password was
+ -- sent, for throttling purposes
+ user_newpass_time char(14) binary,
-- Note: email should be restricted, not public info.
-- Same with passwords.
- user_email tinytext NOT NULL default '',
+ user_email tinytext NOT NULL,
-- Newline-separated list of name=value defining the user
-- preferences
- user_options blob NOT NULL default '',
+ user_options blob NOT NULL,
-- This is a timestamp which is updated when a user
-- logs in, logs out, changes preferences, or performs
@@ -110,24 +114,36 @@ CREATE TABLE /*$wgDBprefix*/user (
-- Initially NULL; when a user's e-mail address has been
-- validated by returning with a mailed token, this is
-- set to the current timestamp.
- user_email_authenticated CHAR(14) BINARY,
+ user_email_authenticated char(14) binary,
-- Randomly generated token created when the e-mail address
-- is set and a confirmation test mail sent.
- user_email_token CHAR(32) BINARY,
+ user_email_token char(32) binary,
-- Expiration date for the user_email_token
- user_email_token_expires CHAR(14) BINARY,
+ user_email_token_expires char(14) binary,
-- Timestamp of account registration.
-- Accounts predating this schema addition may contain NULL.
- user_registration CHAR(14) BINARY,
+ user_registration char(14) binary,
+
+ -- Count of edits and edit-like actions.
+ --
+ -- *NOT* intended to be an accurate copy of COUNT(*) WHERE rev_user=user_id
+ -- May contain NULL for old accounts if batch-update scripts haven't been
+ -- run, as well as listing deleted edits and other myriad ways it could be
+ -- out of sync.
+ --
+ -- Meant primarily for heuristic checks to give an impression of whether
+ -- the account has been used much.
+ --
+ user_editcount int,
PRIMARY KEY user_id (user_id),
UNIQUE INDEX user_name (user_name),
INDEX (user_email_token)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
-- User permissions have been broken out to a separate table;
@@ -153,7 +169,7 @@ CREATE TABLE /*$wgDBprefix*/user_groups (
PRIMARY KEY (ug_user,ug_group),
KEY (ug_group)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
-- Stores notifications of user talk page changes, for the display
-- of the "you have new messages" box
@@ -165,7 +181,7 @@ CREATE TABLE /*$wgDBprefix*/user_newtalk (
user_ip varchar(40) NOT NULL default '',
INDEX user_id (user_id),
INDEX user_ip (user_ip)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
@@ -188,7 +204,7 @@ CREATE TABLE /*$wgDBprefix*/page (
-- Comma-separated set of permission keys indicating who
-- can move or edit the page.
- page_restrictions tinyblob NOT NULL default '',
+ page_restrictions tinyblob NOT NULL,
-- Number of times this page has been viewed.
page_counter bigint(20) unsigned NOT NULL default '0',
@@ -225,7 +241,7 @@ CREATE TABLE /*$wgDBprefix*/page (
INDEX (page_random),
INDEX (page_len)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
-- Every edit of a page creates also a revision row.
@@ -247,7 +263,7 @@ CREATE TABLE /*$wgDBprefix*/revision (
-- Text comment summarizing the change.
-- This text is shown in the history and other changes lists,
-- rendered in a subset of wiki markup by Linker::formatComment()
- rev_comment tinyblob NOT NULL default '',
+ rev_comment tinyblob NOT NULL,
-- Key to user.user_id of the user who made this edit.
-- Stores 0 for anonymous edits and for some mass imports.
@@ -273,7 +289,7 @@ CREATE TABLE /*$wgDBprefix*/revision (
INDEX user_timestamp (rev_user,rev_timestamp),
INDEX usertext_timestamp (rev_user_text,rev_timestamp)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
@@ -294,7 +310,7 @@ CREATE TABLE /*$wgDBprefix*/text (
-- Depending on the contents of the old_flags field, the text
-- may be convenient plain text, or it may be funkily encoded.
- old_text mediumblob NOT NULL default '',
+ old_text mediumblob NOT NULL,
-- Comma-separated list of flags:
-- gzip: text is compressed with PHP's gzdeflate() function.
@@ -305,11 +321,11 @@ CREATE TABLE /*$wgDBprefix*/text (
-- The object either contains multiple versions compressed
-- together to achieve a better compression ratio, or it refers
-- to another row where the text can be found.
- old_flags tinyblob NOT NULL default '',
+ old_flags tinyblob NOT NULL,
PRIMARY KEY old_id (old_id)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
-- Holding area for deleted articles, which may be viewed
@@ -327,17 +343,17 @@ CREATE TABLE /*$wgDBprefix*/archive (
-- so old archived pages will remain accessible after
-- upgrading from 1.4 to 1.5.
-- Text may be gzipped or otherwise funky.
- ar_text mediumblob NOT NULL default '',
+ ar_text mediumblob NOT NULL,
-- Basic revision stuff...
- ar_comment tinyblob NOT NULL default '',
+ ar_comment tinyblob NOT NULL,
ar_user int(5) unsigned NOT NULL default '0',
ar_user_text varchar(255) binary NOT NULL,
ar_timestamp char(14) binary NOT NULL default '',
ar_minor_edit tinyint(1) NOT NULL default '0',
-- See ar_text note.
- ar_flags tinyblob NOT NULL default '',
+ ar_flags tinyblob NOT NULL,
-- When revisions are deleted, their unique rev_id is stored
-- here so it can be retained after undeletion. This is necessary
@@ -361,7 +377,7 @@ CREATE TABLE /*$wgDBprefix*/archive (
KEY name_title_timestamp (ar_namespace,ar_title,ar_timestamp)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
@@ -378,10 +394,10 @@ CREATE TABLE /*$wgDBprefix*/pagelinks (
pl_namespace int NOT NULL default '0',
pl_title varchar(255) binary NOT NULL default '',
- UNIQUE KEY pl_from(pl_from,pl_namespace,pl_title),
- KEY (pl_namespace,pl_title)
+ UNIQUE KEY pl_from (pl_from,pl_namespace,pl_title),
+ KEY (pl_namespace,pl_title,pl_from)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
@@ -398,10 +414,10 @@ CREATE TABLE /*$wgDBprefix*/templatelinks (
tl_namespace int NOT NULL default '0',
tl_title varchar(255) binary NOT NULL default '',
- UNIQUE KEY tl_from(tl_from,tl_namespace,tl_title),
- KEY (tl_namespace,tl_title)
+ UNIQUE KEY tl_from (tl_from,tl_namespace,tl_title),
+ KEY (tl_namespace,tl_title,tl_from)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
@@ -418,10 +434,10 @@ CREATE TABLE /*$wgDBprefix*/imagelinks (
-- all such pages are in namespace 6 (NS_IMAGE).
il_to varchar(255) binary NOT NULL default '',
- UNIQUE KEY il_from(il_from,il_to),
- KEY (il_to)
+ UNIQUE KEY il_from (il_from,il_to),
+ KEY (il_to,il_from)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
-- Track category inclusions *used inline*
@@ -452,15 +468,15 @@ CREATE TABLE /*$wgDBprefix*/categorylinks (
-- sorting method by approximate addition time.
cl_timestamp timestamp NOT NULL,
- UNIQUE KEY cl_from(cl_from,cl_to),
+ UNIQUE KEY cl_from (cl_from,cl_to),
-- We always sort within a given category...
- KEY cl_sortkey(cl_to,cl_sortkey),
+ KEY cl_sortkey (cl_to,cl_sortkey),
-- Not really used?
- KEY cl_timestamp(cl_to,cl_timestamp)
+ KEY cl_timestamp (cl_to,cl_timestamp)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
-- Track links to external URLs
@@ -470,7 +486,7 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
el_from int(8) unsigned NOT NULL default '0',
-- The URL
- el_to blob NOT NULL default '',
+ el_to blob NOT NULL,
-- In the case of HTTP URLs, this is the URL with any username or password
-- removed, and with the labels in the hostname reversed and converted to
@@ -483,12 +499,12 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
-- which allows for fast searching for all pages under example.com with the
-- clause:
-- WHERE el_index LIKE 'http://com.example.%'
- el_index blob NOT NULL default '',
+ el_index blob NOT NULL,
KEY (el_from, el_to(40)),
KEY (el_to(60), el_from),
KEY (el_index(60))
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
-- Track interlanguage links
@@ -542,7 +558,7 @@ CREATE TABLE /*$wgDBprefix*/site_stats (
UNIQUE KEY ss_row_id (ss_row_id)
-) TYPE=InnoDB;
+) ENGINE=InnoDB;
--
-- Stores an ID for every time any article is visited;
@@ -552,8 +568,8 @@ CREATE TABLE /*$wgDBprefix*/site_stats (
-- that have been visited.)
--
CREATE TABLE /*$wgDBprefix*/hitcounter (
- hc_id INTEGER UNSIGNED NOT NULL
-) TYPE=HEAP MAX_ROWS=25000;
+ hc_id int unsigned NOT NULL
+) ENGINE=HEAP MAX_ROWS=25000;
--
@@ -565,7 +581,7 @@ CREATE TABLE /*$wgDBprefix*/ipblocks (
ipb_id int(8) NOT NULL auto_increment,
-- Blocked IP address in dotted-quad form or user name.
- ipb_address varchar(40) binary NOT NULL default '',
+ ipb_address tinyblob NOT NULL,
-- Blocked user ID or 0 for IP blocks.
ipb_user int(8) unsigned NOT NULL default '0',
@@ -574,7 +590,7 @@ CREATE TABLE /*$wgDBprefix*/ipblocks (
ipb_by int(8) unsigned NOT NULL default '0',
-- Text comment made by blocker.
- ipb_reason tinyblob NOT NULL default '',
+ ipb_reason tinyblob NOT NULL,
-- Creation (or refresh) date in standard YMDHMS form.
-- IP blocks expire automatically.
@@ -590,6 +606,9 @@ CREATE TABLE /*$wgDBprefix*/ipblocks (
-- Block prevents account creation from matching IP addresses
ipb_create_account bool NOT NULL default 1,
+
+ -- Block triggers autoblocks
+ ipb_enable_autoblock bool NOT NULL default '1',
-- Time at which the block will expire.
ipb_expiry char(14) binary NOT NULL default '',
@@ -610,7 +629,7 @@ CREATE TABLE /*$wgDBprefix*/ipblocks (
INDEX ipb_timestamp (ipb_timestamp),
INDEX ipb_expiry (ipb_expiry)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
@@ -626,14 +645,14 @@ CREATE TABLE /*$wgDBprefix*/image (
img_size int(8) unsigned NOT NULL default '0',
-- For images, size in pixels.
- img_width int(5) NOT NULL default '0',
- img_height int(5) NOT NULL default '0',
+ img_width int(5) NOT NULL default '0',
+ img_height int(5) NOT NULL default '0',
-- Extracted EXIF metadata stored as a serialized PHP array.
img_metadata mediumblob NOT NULL,
-- For images, bits per pixel if known.
- img_bits int(3) NOT NULL default '0',
+ img_bits int(3) NOT NULL default '0',
-- Media type as defined by the MEDIATYPE_xxx constants
img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
@@ -650,7 +669,7 @@ CREATE TABLE /*$wgDBprefix*/image (
-- Description field as entered by the uploader.
-- This is displayed in image upload history and logs.
- img_description tinyblob NOT NULL default '',
+ img_description tinyblob NOT NULL,
-- user_id and user_name of uploader.
img_user int(5) unsigned NOT NULL default '0',
@@ -667,7 +686,7 @@ CREATE TABLE /*$wgDBprefix*/image (
-- Used by Special:Newimages and Special:Imagelist
INDEX img_timestamp (img_timestamp)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
-- Previous revisions of uploaded files.
@@ -687,14 +706,14 @@ CREATE TABLE /*$wgDBprefix*/oldimage (
oi_width int(5) NOT NULL default 0,
oi_height int(5) NOT NULL default 0,
oi_bits int(3) NOT NULL default 0,
- oi_description tinyblob NOT NULL default '',
+ oi_description tinyblob NOT NULL,
oi_user int(5) unsigned NOT NULL default '0',
oi_user_text varchar(255) binary NOT NULL default '',
oi_timestamp char(14) binary NOT NULL default '',
INDEX oi_name (oi_name(10))
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
@@ -702,7 +721,7 @@ CREATE TABLE /*$wgDBprefix*/oldimage (
--
CREATE TABLE /*$wgDBprefix*/filearchive (
-- Unique row id
- fa_id int not null auto_increment,
+ fa_id int NOT NULL auto_increment,
-- Original base filename; key to image.img_name, page.page_title, etc
fa_name varchar(255) binary NOT NULL default '',
@@ -729,14 +748,14 @@ CREATE TABLE /*$wgDBprefix*/filearchive (
-- Duped fields from image
fa_size int(8) unsigned default '0',
- fa_width int(5) default '0',
- fa_height int(5) default '0',
+ fa_width int(5) default '0',
+ fa_height int(5) default '0',
fa_metadata mediumblob,
- fa_bits int(3) default '0',
+ fa_bits int(3) default '0',
fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") default "unknown",
fa_minor_mime varchar(32) default "unknown",
- fa_description tinyblob default '',
+ fa_description tinyblob,
fa_user int(5) unsigned default '0',
fa_user_text varchar(255) binary default '',
fa_timestamp char(14) binary default '',
@@ -747,7 +766,7 @@ CREATE TABLE /*$wgDBprefix*/filearchive (
INDEX (fa_deleted_timestamp), -- sort by deletion time
INDEX (fa_deleted_user) -- sort by deleter
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
-- Primarily a summary table for Special:Recentchanges,
@@ -804,15 +823,20 @@ CREATE TABLE /*$wgDBprefix*/recentchanges (
-- $wgPutIPinRC option is enabled.
rc_ip char(15) NOT NULL default '',
+ -- Text length in characters before
+ -- and after the edit
+ rc_old_len int(10) default '0',
+ rc_new_len int(10) default '0',
+
PRIMARY KEY rc_id (rc_id),
INDEX rc_timestamp (rc_timestamp),
INDEX rc_namespace_title (rc_namespace, rc_title),
INDEX rc_cur_id (rc_cur_id),
- INDEX new_name_timestamp(rc_new,rc_namespace,rc_timestamp),
+ INDEX new_name_timestamp (rc_new,rc_namespace,rc_timestamp),
INDEX rc_ip (rc_ip),
INDEX rc_ns_usertext ( rc_namespace, rc_user_text )
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
CREATE TABLE /*$wgDBprefix*/watchlist (
-- Key to user.user_id
@@ -831,7 +855,7 @@ CREATE TABLE /*$wgDBprefix*/watchlist (
UNIQUE KEY (wl_user, wl_namespace, wl_title),
KEY namespace_title (wl_namespace,wl_title)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
@@ -857,7 +881,7 @@ CREATE TABLE /*$wgDBprefix*/math (
UNIQUE KEY math_inputhash (math_inputhash)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
-- When using the default MySQL search backend, page titles
@@ -875,13 +899,13 @@ CREATE TABLE /*$wgDBprefix*/searchindex (
si_title varchar(255) NOT NULL default '',
-- Munged version of body text
- si_text mediumtext NOT NULL default '',
+ si_text mediumtext NOT NULL,
UNIQUE KEY (si_page),
FULLTEXT si_title (si_title),
FULLTEXT si_text (si_text)
-) TYPE=MyISAM, DEFAULT CHARSET=utf8;
+) ENGINE=MyISAM, DEFAULT CHARSET=utf8;
--
-- Recognized interwiki link prefixes
@@ -897,14 +921,14 @@ CREATE TABLE /*$wgDBprefix*/interwiki (
-- A boolean value indicating whether the wiki is in this project
-- (used, for example, to detect redirect loops)
- iw_local BOOL NOT NULL,
+ iw_local bool NOT NULL,
-- Boolean value indicating whether interwiki transclusions are allowed.
- iw_trans TINYINT(1) NOT NULL DEFAULT 0,
+ iw_trans tinyint(1) NOT NULL default 0,
UNIQUE KEY iw_prefix (iw_prefix)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
-- Used for caching expensive grouped queries
@@ -922,29 +946,29 @@ CREATE TABLE /*$wgDBprefix*/querycache (
KEY (qc_type,qc_value)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
-- For a few generic cache operations if not using Memcached
--
CREATE TABLE /*$wgDBprefix*/objectcache (
- keyname char(255) binary not null default '',
+ keyname char(255) binary NOT NULL default '',
value mediumblob,
exptime datetime,
- unique key (keyname),
- key (exptime)
+ UNIQUE KEY (keyname),
+ KEY (exptime)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
--
-- Cache of interwiki transclusion
--
CREATE TABLE /*$wgDBprefix*/transcache (
- tc_url VARCHAR(255) NOT NULL,
- tc_contents TEXT,
- tc_time INT NOT NULL,
- UNIQUE INDEX tc_url_idx(tc_url)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+ tc_url varchar(255) NOT NULL,
+ tc_contents text,
+ tc_time int NOT NULL,
+ UNIQUE INDEX tc_url_idx (tc_url)
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
CREATE TABLE /*$wgDBprefix*/logging (
-- Symbolic keys for the general log type and the action type
@@ -968,24 +992,25 @@ CREATE TABLE /*$wgDBprefix*/logging (
log_comment varchar(255) NOT NULL default '',
-- LF separated list of miscellaneous parameters
- log_params blob NOT NULL default '',
+ log_params blob NOT NULL,
KEY type_time (log_type, log_timestamp),
KEY user_time (log_user, log_timestamp),
KEY page_time (log_namespace, log_title, log_timestamp)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
CREATE TABLE /*$wgDBprefix*/trackbacks (
- tb_id integer AUTO_INCREMENT PRIMARY KEY,
- tb_page integer REFERENCES page(page_id) ON DELETE CASCADE,
- tb_title varchar(255) NOT NULL,
- tb_url varchar(255) NOT NULL,
- tb_ex text,
- tb_name varchar(255),
-
- INDEX (tb_page)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+ tb_id int auto_increment,
+ tb_page int REFERENCES page(page_id) ON DELETE CASCADE,
+ tb_title varchar(255) NOT NULL,
+ tb_url varchar(255) NOT NULL,
+ tb_ex text,
+ tb_name varchar(255),
+
+ PRIMARY KEY (tb_id),
+ INDEX (tb_page)
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
-- Jobs performed by parallel apache threads or a command-line daemon
CREATE TABLE /*$wgDBprefix*/job (
@@ -1001,22 +1026,61 @@ CREATE TABLE /*$wgDBprefix*/job (
-- Any other parameters to the command
-- Presently unused, format undefined
- job_params blob NOT NULL default '',
+ job_params blob NOT NULL,
PRIMARY KEY job_id (job_id),
KEY (job_cmd, job_namespace, job_title)
-) TYPE=InnoDB, DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
-- Details of updates to cached special pages
CREATE TABLE /*$wgDBprefix*/querycache_info (
- -- Special page name
- -- Corresponds to a qc_type value
- qci_type varchar(32) NOT NULL default '',
+ -- Special page name
+ -- Corresponds to a qc_type value
+ qci_type varchar(32) NOT NULL default '',
+
+ -- Timestamp of last update
+ qci_timestamp char(14) NOT NULL default '19700101000000',
+
+ UNIQUE KEY ( qci_type )
+
+) ENGINE=InnoDB;
+
+-- For each redirect, this table contains exactly one row defining its target
+CREATE TABLE /*$wgDBprefix*/redirect (
+ -- Key to the page_id of the redirect page
+ rd_from int(8) unsigned NOT NULL default '0',
+
+ -- Key to page_namespace/page_title of the target page.
+ -- The target page may or may not exist, and due to renames
+ -- and deletions may refer to different page records as time
+ -- goes by.
+ rd_namespace int NOT NULL default '0',
+ rd_title varchar(255) binary NOT NULL default '',
+
+ PRIMARY KEY rd_from (rd_from),
+ KEY rd_ns_title (rd_namespace,rd_title,rd_from)
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
- -- Timestamp of last update
- qci_timestamp char(14) NOT NULL default '19700101000000',
+-- Used for caching expensive grouped queries that need two links (for example double-redirects)
- UNIQUE KEY ( qci_type )
+CREATE TABLE /*$wgDBprefix*/querycachetwo (
+ -- A key name, generally the base name of of the special page.
+ qcc_type char(32) NOT NULL,
+
+ -- Some sort of stored value. Sizes, counts...
+ qcc_value int(5) unsigned NOT NULL default '0',
+
+ -- Target namespace+title
+ qcc_namespace int NOT NULL default '0',
+ qcc_title char(255) binary NOT NULL default '',
+
+ -- Target namespace+title2
+ qcc_namespacetwo int NOT NULL default '0',
+ qcc_titletwo char(255) binary NOT NULL default '',
+
+ KEY qcc_type (qcc_type,qcc_value),
+ KEY qcc_title (qcc_type,qcc_namespace,qcc_title),
+ KEY qcc_titletwo (qcc_type,qcc_namespacetwo,qcc_titletwo)
-) TYPE=InnoDB;
+) ENGINE=InnoDB, DEFAULT CHARSET=utf8;
diff --git a/maintenance/namespace2sql.php b/maintenance/namespace2sql.php
index 8084bfec..081f6099 100644
--- a/maintenance/namespace2sql.php
+++ b/maintenance/namespace2sql.php
@@ -6,8 +6,8 @@
require_once( "commandLine.inc" );
for ($i = -2; $i < 16; ++$i) {
- $nsname = wfStrencode( $wgLang->getNsText( $i ) );
- $dbname = wfStrencode( $wgDBname );
+ $nsname = mysql_escape_string( $wgLang->getNsText( $i ) );
+ $dbname = mysql_escape_string( $wgDBname );
print "INSERT INTO ns_name(ns_db, ns_num, ns_name) VALUES('$dbname', $i, '$nsname');\n";
}
diff --git a/maintenance/oracle/tables.sql b/maintenance/oracle/tables.sql
index 6733f950..030f427f 100644
--- a/maintenance/oracle/tables.sql
+++ b/maintenance/oracle/tables.sql
@@ -109,14 +109,14 @@ CREATE TABLE pagelinks (
pl_title VARCHAR2(255) NOT NULL
);
CREATE UNIQUE INDEX pl_from ON pagelinks(pl_from, pl_namespace, pl_title);
-CREATE INDEX pl_namespace ON pagelinks(pl_namespace, pl_title);
+CREATE INDEX pl_namespace ON pagelinks(pl_namespace, pl_title, pl_from);
CREATE TABLE imagelinks (
il_from NUMBER(8) NOT NULL REFERENCES page(page_id) ON DELETE CASCADE,
il_to VARCHAR2(255) NOT NULL
);
CREATE UNIQUE INDEX il_from ON imagelinks(il_from, il_to);
-CREATE INDEX il_to ON imagelinks(il_to);
+CREATE INDEX il_to ON imagelinks(il_to, il_from);
CREATE TABLE categorylinks (
cl_from NUMBER(8) NOT NULL REFERENCES page(page_id) ON DELETE CASCADE,
@@ -229,6 +229,8 @@ CREATE TABLE recentchanges (
rc_moved_to_title VARCHAR2(255),
rc_patrolled NUMBER(3) DEFAULT 0 NOT NULL,
rc_ip VARCHAR2(40),
+ rc_old_len NUMBER(10) DEFAULT 0,
+ rc_new_len NUMBER(10) DEFAULT 0,
CONSTRAINT rc_pk PRIMARY KEY (rc_id)
);
CREATE INDEX rc_timestamp ON recentchanges (rc_timestamp);
diff --git a/maintenance/ourusers.php b/maintenance/ourusers.php
index b50519d2..9b7af605 100644
--- a/maintenance/ourusers.php
+++ b/maintenance/ourusers.php
@@ -59,28 +59,6 @@ foreach( $hosts as $host ) {
print "GRANT SELECT, INSERT, UPDATE, DELETE ON `$db`.* TO 'wikiuser'@'$host' IDENTIFIED BY '$wikiuser_pass';\n";
}
-/*
- print "\n-- wikisql\n\n";
- foreach ( $databases as $db ) {
-print <<<EOS
-GRANT SELECT ON `$db`.`old` TO 'wikisql'@'$host' IDENTIFIED BY '$wikisql_pass';
-GRANT SELECT ON `$db`.`imagelinks` TO 'wikisql'@'$host' IDENTIFIED BY '$wikisql_pass';
-GRANT SELECT ON `$db`.`image` TO 'wikisql'@'$host' IDENTIFIED BY '$wikisql_pass';
-GRANT SELECT ON `$db`.`watchlist` TO 'wikisql'@'$host' IDENTIFIED BY '$wikisql_pass';
-GRANT SELECT ON `$db`.`site_stats` TO 'wikisql'@'$host' IDENTIFIED BY '$wikisql_pass';
-GRANT SELECT ON `$db`.`archive` TO 'wikisql'@'$host' IDENTIFIED BY '$wikisql_pass';
-GRANT SELECT ON `$db`.`links` TO 'wikisql'@'$host' IDENTIFIED BY '$wikisql_pass';
-GRANT SELECT ON `$db`.`ipblocks` TO 'wikisql'@'$host' IDENTIFIED BY '$wikisql_pass';
-GRANT SELECT ON `$db`.`cur` TO 'wikisql'@'$host' IDENTIFIED BY '$wikisql_pass';
-GRANT SELECT (user_rights, user_id, user_name, user_options) ON `$db`.`user` TO 'wikisql'@'$host' IDENTIFIED BY '$wikisql_pass';
-GRANT SELECT ON `$db`.`oldimage` TO 'wikisql'@'$host' IDENTIFIED BY '$wikisql_pass';
-GRANT SELECT ON `$db`.`recentchanges` TO 'wikisql'@'$host' IDENTIFIED BY '$wikisql_pass';
-GRANT SELECT ON `$db`.`math` TO 'wikisql'@'$host' IDENTIFIED BY '$wikisql_pass';
-GRANT SELECT ON `$db`.`brokenlinks` TO 'wikisql'@'$host' IDENTIFIED BY '$wikisql_pass';
-
-EOS;
- }*/
-
print "\n-- wikiadmin\n\n";
print "GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'wikiadmin'@'$host' IDENTIFIED BY '$wikiadmin_pass';\n";
print "GRANT ALL PRIVILEGES ON `boardvote%`.* TO wikiadmin@'$host' IDENTIFIED BY '$wikiadmin_pass';\n";
diff --git a/maintenance/parserTests.inc b/maintenance/parserTests.inc
index 0aabd27b..c85220d0 100644
--- a/maintenance/parserTests.inc
+++ b/maintenance/parserTests.inc
@@ -25,7 +25,7 @@
*/
/** */
-$options = array( 'quick', 'color', 'quiet', 'help' );
+$options = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record' );
$optionsWithArgs = array( 'regex' );
require_once( 'commandLine.inc' );
@@ -54,6 +54,11 @@ class ParserTest {
var $lightcolor;
/**
+ * boolean $showOutput Show test output
+ */
+ var $showOutput;
+
+ /**
* Sets terminal colorization and diff/quick modes depending on OS and
* command-line options (--color and --quick).
*
@@ -80,10 +85,14 @@ class ParserTest {
break;
}
}
+ $this->term = $this->color
+ ? new AnsiTermColorer( $this->lightcolor )
+ : new DummyTermColorer();
$this->showDiffs = !isset( $options['quick'] );
-
$this->quiet = isset( $options['quiet'] );
+ $this->showOutput = isset( $options['show-output'] );
+
if (isset($options['regex'])) {
$this->regex = $options['regex'];
@@ -92,7 +101,14 @@ class ParserTest {
$this->regex = '';
}
+ if( isset( $options['record'] ) ) {
+ $this->recorder = new DbTestRecorder( $this->term );
+ } else {
+ $this->recorder = new TestRecorder( $this->term );
+ }
+
$this->hooks = array();
+ $this->functionHooks = array();
}
/**
@@ -109,38 +125,53 @@ class ParserTest {
}
/**
- * Run a series of tests listed in the given text file.
+ * Run a series of tests listed in the given text files.
* Each test consists of a brief description, wikitext input,
* and the expected HTML output.
*
* Prints status updates on stdout and counts up the total
* number and percentage of passed tests.
*
- * @param string $filename
+ * @param array of strings $filenames
* @return bool True if passed all tests, false if any tests failed.
* @public
*/
- function runTestsFromFile( $filename ) {
+ function runTestsFromFiles( $filenames ) {
+ $this->recorder->start();
+ $ok = true;
+ foreach( $filenames as $filename ) {
+ $ok = $this->runFile( $filename ) && $ok;
+ }
+ $this->recorder->end();
+ $this->recorder->report();
+ return $ok;
+ }
+
+ private function runFile( $filename ) {
$infile = fopen( $filename, 'rt' );
if( !$infile ) {
wfDie( "Couldn't open $filename\n" );
+ } else {
+ print $this->term->color( 1 ) .
+ "Reading tests from \"$filename\"..." .
+ $this->term->reset() .
+ "\n";
}
$data = array();
$section = null;
- $success = 0;
- $total = 0;
$n = 0;
+ $ok = true;
while( false !== ($line = fgets( $infile ) ) ) {
$n++;
if( preg_match( '/^!!\s*(\w+)/', $line, $matches ) ) {
$section = strtolower( $matches[1] );
if( $section == 'endarticle') {
if( !isset( $data['text'] ) ) {
- wfDie( "'endarticle' without 'text' at line $n\n" );
+ wfDie( "'endarticle' without 'text' at line $n of $filename\n" );
}
if( !isset( $data['article'] ) ) {
- wfDie( "'endarticle' without 'article' at line $n\n" );
+ wfDie( "'endarticle' without 'article' at line $n of $filename\n" );
}
$this->addArticle($this->chomp($data['article']), $this->chomp($data['text']), $n);
$data = array();
@@ -149,7 +180,7 @@ class ParserTest {
}
if( $section == 'endhooks' ) {
if( !isset( $data['hooks'] ) ) {
- wfDie( "'endhooks' without 'hooks' at line $n\n" );
+ wfDie( "'endhooks' without 'hooks' at line $n of $filename\n" );
}
foreach( explode( "\n", $data['hooks'] ) as $line ) {
$line = trim( $line );
@@ -161,15 +192,29 @@ class ParserTest {
$section = null;
continue;
}
+ if( $section == 'endfunctionhooks' ) {
+ if( !isset( $data['functionhooks'] ) ) {
+ wfDie( "'endfunctionhooks' without 'functionhooks' at line $n of $filename\n" );
+ }
+ foreach( explode( "\n", $data['functionhooks'] ) as $line ) {
+ $line = trim( $line );
+ if( $line ) {
+ $this->requireFunctionHook( $line );
+ }
+ }
+ $data = array();
+ $section = null;
+ continue;
+ }
if( $section == 'end' ) {
if( !isset( $data['test'] ) ) {
- wfDie( "'end' without 'test' at line $n\n" );
+ wfDie( "'end' without 'test' at line $n of $filename\n" );
}
if( !isset( $data['input'] ) ) {
- wfDie( "'end' without 'input' at line $n\n" );
+ wfDie( "'end' without 'input' at line $n of $filename\n" );
}
if( !isset( $data['result'] ) ) {
- wfDie( "'end' without 'result' at line $n\n" );
+ wfDie( "'end' without 'result' at line $n of $filename\n" );
}
if( !isset( $data['options'] ) ) {
$data['options'] = '';
@@ -184,20 +229,19 @@ class ParserTest {
$section = null;
continue;
}
- if( $this->runTest(
+ $result = $this->runTest(
$this->chomp( $data['test'] ),
$this->chomp( $data['input'] ),
$this->chomp( $data['result'] ),
- $this->chomp( $data['options'] ) ) ) {
- $success++;
- }
- $total++;
+ $this->chomp( $data['options'] ) );
+ $ok = $ok && $result;
+ $this->recorder->record( $this->chomp( $data['test'] ), $result );
$data = array();
$section = null;
continue;
}
if ( isset ($data[$section] ) ) {
- wfDie( "duplicate section '$section' at line $n\n" );
+ wfDie( "duplicate section '$section' at line $n of $filename\n" );
}
$data[$section] = '';
continue;
@@ -206,19 +250,8 @@ class ParserTest {
$data[$section] .= $line;
}
}
- if( $total > 0 ) {
- $ratio = wfPercent( 100 * $success / $total );
- print $this->termColor( 1 ) . "\nPassed $success of $total tests ($ratio) ";
- if( $success == $total ) {
- print $this->termColor( 32 ) . "PASSED!";
- } else {
- print $this->termColor( 31 ) . "FAILED!";
- }
- print $this->termReset() . "\n";
- return ($success == $total);
- } else {
- wfDie( "No tests found.\n" );
- }
+ print "\n";
+ return $ok;
}
/**
@@ -258,6 +291,9 @@ class ParserTest {
foreach( $this->hooks as $tag => $callback ) {
$parser->setHook( $tag, $callback );
}
+ foreach( $this->functionHooks as $tag => $callback ) {
+ $parser->setFunctionHook( $tag, $callback );
+ }
wfRunHooks( 'ParserTestParser', array( &$parser ) );
$title =& Title::makeTitle( NS_MAIN, $titleText );
@@ -320,6 +356,12 @@ class ParserTest {
$lang = 'en';
}
+ if( preg_match( '/variant=([a-z]+(?:-[a-z]+)?)/', $opts, $m ) )
+ $variant = $m[1];
+ else
+ $variant = false;
+
+
$settings = array(
'wgServer' => 'http://localhost',
'wgScript' => '/index.php',
@@ -334,7 +376,7 @@ class ParserTest {
'wgLanguageCode' => $lang,
'wgContLanguageCode' => $lang,
'wgDBprefix' => 'parsertest_',
-
+ 'wgRawHtml' => preg_match('/\\brawhtml\\b/i', $opts),
'wgLang' => null,
'wgContLang' => null,
'wgNamespacesWithSubpages' => array( 0 => preg_match('/\\bsubpage\\b/i', $opts)),
@@ -345,6 +387,9 @@ class ParserTest {
'wgUseTeX' => false,
'wgLocaltimezone' => 'UTC',
'wgAllowExternalImages' => true,
+ 'wgUseTidy' => false,
+ 'wgDefaultLanguageVariant' => $variant,
+ 'wgVariantArticlePath' => false,
);
$this->savedGlobals = array();
foreach( $settings as $var => $val ) {
@@ -374,7 +419,8 @@ class ParserTest {
'recentchanges',
'watchlist', 'math', 'searchindex',
'interwiki', 'querycache',
- 'objectcache', 'job'
+ 'objectcache', 'job', 'redirect',
+ 'querycachetwo'
);
// FIXME manually adding additional table for the tasks extension
@@ -477,6 +523,7 @@ class ParserTest {
'img_media_type' => MEDIATYPE_BITMAP,
'img_major_mime' => "image",
'img_minor_mime' => "jpeg",
+ 'img_metadata' => serialize( array() ),
) );
# Update certain things in site_stats
@@ -532,22 +579,57 @@ class ParserTest {
* @private
*/
function teardownUploadDir( $dir ) {
- unlink( "$dir/3/3a/Foobar.jpg" );
- rmdir( "$dir/3/3a" );
- rmdir( "$dir/3" );
- @rmdir( "$dir/thumb/6/65" );
- @rmdir( "$dir/thumb/6" );
-
- @unlink( "$dir/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" );
- @rmdir( "$dir/thumb/3/3a/Foobar.jpg" );
- @rmdir( "$dir/thumb/3/3a" );
- @rmdir( "$dir/thumb/3/39" ); # wtf?
- @rmdir( "$dir/thumb/3" );
- @rmdir( "$dir/thumb" );
- @rmdir( "$dir" );
+ // delete the files first, then the dirs.
+ self::deleteFiles(
+ array (
+ "$dir/3/3a/Foobar.jpg",
+ "$dir/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg",
+ "$dir/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg",
+ "$dir/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg",
+ "$dir/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg",
+ )
+ );
+
+ self::deleteDirs(
+ array (
+ "$dir/3/3a",
+ "$dir/3",
+ "$dir/thumb/6/65",
+ "$dir/thumb/6",
+ "$dir/thumb/3/3a/Foobar.jpg",
+ "$dir/thumb/3/3a",
+ "$dir/thumb/3",
+ "$dir/thumb",
+ "$dir",
+ )
+ );
}
/**
+ * @desc delete the specified files, if they exist.
+ * @param array $files full paths to files to delete.
+ */
+ private static function deleteFiles( $files ) {
+ foreach( $files as $file ) {
+ if( file_exists( $file ) ) {
+ unlink( $file );
+ }
+ }
+ }
+
+ /**
+ * @desc delete the specified directories, if they exist. Must be empty.
+ * @param array $dirs full paths to directories to delete.
+ */
+ private static function deleteDirs( $dirs ) {
+ foreach( $dirs as $dir ) {
+ if( is_dir( $dir ) ) {
+ rmdir( $dir );
+ }
+ }
+ }
+
+ /**
* "Running test $desc..."
* @private
*/
@@ -564,7 +646,7 @@ class ParserTest {
*/
function showSuccess( $desc ) {
if( !$this->quiet ) {
- print $this->termColor( '1;32' ) . 'PASSED' . $this->termReset() . "\n";
+ print $this->term->color( '1;32' ) . 'PASSED' . $this->term->reset() . "\n";
}
return true;
}
@@ -585,7 +667,10 @@ class ParserTest {
# test, in case it succeeded. Show it now:
$this->showTesting( $desc );
}
- print $this->termColor( '1;31' ) . 'FAILED!' . $this->termReset() . "\n";
+ print $this->term->color( '1;31' ) . 'FAILED!' . $this->term->reset() . "\n";
+ if ( $this->showOutput ) {
+ print "--- Expected ---\n$result\n--- Actual ---\n$html\n";
+ }
if( $this->showDiffs ) {
print $this->quickDiff( $result, $html );
if( !$this->wellFormed( $html ) ) {
@@ -636,33 +721,6 @@ class ParserTest {
}
/**
- * Return ANSI terminal escape code for changing text attribs/color,
- * or empty string if color output is disabled.
- *
- * @param string $color Semicolon-separated list of attribute/color codes
- * @return string
- * @private
- */
- function termColor( $color ) {
- if($this->lightcolor) {
- return $this->color ? "\x1b[1;{$color}m" : '';
- } else {
- return $this->color ? "\x1b[{$color}m" : '';
- }
- }
-
- /**
- * Return ANSI terminal escape code for restoring default text attributes,
- * or empty string if color output is disabled.
- *
- * @return string
- * @private
- */
- function termReset() {
- return $this->color ? "\x1b[0m" : '';
- }
-
- /**
* Colorize unified diff output if set for ANSI color output.
* Subtractions are colored blue, additions red.
*
@@ -673,8 +731,8 @@ class ParserTest {
function colorDiff( $text ) {
return preg_replace(
array( '/^(-.*)$/m', '/^(\+.*)$/m' ),
- array( $this->termColor( 34 ) . '$1' . $this->termReset(),
- $this->termColor( 31 ) . '$1' . $this->termReset() ),
+ array( $this->term->color( 34 ) . '$1' . $this->term->reset(),
+ $this->term->color( 31 ) . '$1' . $this->term->reset() ),
$text );
}
@@ -717,6 +775,22 @@ class ParserTest {
}
}
+
+ /**
+ * Steal a callback function from the primary parser, save it for
+ * application to our scary parser. If the hook is not installed,
+ * die a painful dead to warn the others.
+ * @param string $name
+ */
+ private function requireFunctionHook( $name ) {
+ global $wgParser;
+ if( isset( $wgParser->mFunctionHooks[$name] ) ) {
+ $this->functionHooks[$name] = $wgParser->mFunctionHooks[$name];
+ } else {
+ wfDie( "This test suite requires the '$name' function hook extension.\n" );
+ }
+ }
+
/*
* Run the "tidy" command on text if the $wgUseTidy
* global is true
@@ -762,25 +836,241 @@ class ParserTest {
$start = max( 0, $position - 10 );
$before = $position - $start;
$fragment = '...' .
- $this->termColor( 34 ) .
+ $this->term->color( 34 ) .
substr( $text, $start, $before ) .
- $this->termColor( 0 ) .
- $this->termColor( 31 ) .
- $this->termColor( 1 ) .
+ $this->term->color( 0 ) .
+ $this->term->color( 31 ) .
+ $this->term->color( 1 ) .
substr( $text, $position, 1 ) .
- $this->termColor( 0 ) .
- $this->termColor( 34 ) .
+ $this->term->color( 0 ) .
+ $this->term->color( 34 ) .
substr( $text, $position + 1, 9 ) .
- $this->termColor( 0 ) .
+ $this->term->color( 0 ) .
'...';
$display = str_replace( "\n", ' ', $fragment );
$caret = ' ' .
str_repeat( ' ', $before ) .
- $this->termColor( 31 ) .
+ $this->term->color( 31 ) .
'^' .
- $this->termColor( 0 );
+ $this->term->color( 0 );
return "$display\n$caret";
}
+
+}
+
+class AnsiTermColorer {
+ function __construct( $light ) {
+ $this->light = $light;
+ }
+
+ /**
+ * Return ANSI terminal escape code for changing text attribs/color
+ *
+ * @param string $color Semicolon-separated list of attribute/color codes
+ * @return string
+ * @private
+ */
+ function color( $color ) {
+ $light = $this->light ? "1;" : "";
+ return "\x1b[{$light}{$color}m";
+ }
+
+ /**
+ * Return ANSI terminal escape code for restoring default text attributes
+ *
+ * @return string
+ * @private
+ */
+ function reset() {
+ return "\x1b[0m";
+ }
+}
+
+/* A colour-less terminal */
+class DummyTermColorer {
+ function color( $color ) {
+ return '';
+ }
+
+ function reset() {
+ return '';
+ }
+}
+
+class TestRecorder {
+ function __construct( $term ) {
+ $this->term = $term;
+ }
+
+ function start() {
+ $this->total = 0;
+ $this->success = 0;
+ }
+
+ function record( $test, $result ) {
+ $this->total++;
+ $this->success += ($result ? 1 : 0);
+ }
+
+ function end() {
+ // dummy
+ }
+
+ function report() {
+ if( $this->total > 0 ) {
+ $this->reportPercentage( $this->success, $this->total );
+ } else {
+ wfDie( "No tests found.\n" );
+ }
+ }
+
+ function reportPercentage( $success, $total ) {
+ $ratio = wfPercent( 100 * $success / $total );
+ print $this->term->color( 1 ) . "Passed $success of $total tests ($ratio)... ";
+ if( $success == $total ) {
+ print $this->term->color( 32 ) . "PASSED!";
+ } else {
+ print $this->term->color( 31 ) . "FAILED!";
+ }
+ print $this->term->reset() . "\n";
+ return ($success == $total);
+ }
+}
+
+class DbTestRecorder extends TestRecorder {
+ private $db; ///< Database connection to the main DB
+ private $curRun; ///< run ID number for the current run
+ private $prevRun; ///< run ID number for the previous run, if any
+
+ function __construct( $term ) {
+ parent::__construct( $term );
+ $this->db = wfGetDB( DB_MASTER );
+ }
+
+ /**
+ * Set up result recording; insert a record for the run with the date
+ * and all that fun stuff
+ */
+ function start() {
+ parent::start();
+
+ $this->db->begin();
+
+ // We'll make comparisons against the previous run later...
+ $this->prevRun = $this->db->selectField( 'testrun', 'MAX(tr_id)' );
+
+ $this->db->insert( 'testrun',
+ array(
+ 'tr_date' => $this->db->timestamp(),
+ 'tr_mw_version' => SpecialVersion::getVersion(),
+ 'tr_php_version' => phpversion(),
+ 'tr_db_version' => $this->db->getServerVersion(),
+ 'tr_uname' => php_uname()
+ ),
+ __METHOD__ );
+ $this->curRun = $this->db->insertId();
+ }
+
+ /**
+ * Record an individual test item's success or failure to the db
+ * @param string $test
+ * @param bool $result
+ */
+ function record( $test, $result ) {
+ parent::record( $test, $result );
+ $this->db->insert( 'testitem',
+ array(
+ 'ti_run' => $this->curRun,
+ 'ti_name' => $test,
+ 'ti_success' => $result ? 1 : 0,
+ ),
+ __METHOD__ );
+ }
+
+ /**
+ * Commit transaction and clean up for result recording
+ */
+ function end() {
+ $this->db->commit();
+ parent::end();
+ }
+
+ function report() {
+ if( $this->prevRun ) {
+ $table = array(
+ array( 'previously failing test(s) now PASSING! :)', 0, 1 ),
+ array( 'previously PASSING test(s) removed o_O', 1, null ),
+ array( 'new PASSING test(s) :)', null, 1 ),
+
+ array( 'previously passing test(s) now FAILING! :(', 1, 0 ),
+ array( 'previously FAILING test(s) removed O_o', 0, null ),
+ array( 'new FAILING test(s) :(', null, 0 ),
+ );
+ foreach( $table as $criteria ) {
+ list( $label, $before, $after ) = $criteria;
+ $differences = $this->compareResult( $before, $after );
+ if( $differences ) {
+ $count = count($differences);
+ printf( "%4d %s\n", $count, $label );
+ foreach ($differences as $differing_test_name) {
+ print " * $differing_test_name\n";
+ }
+ }
+ }
+ } else {
+ print "No previous test runs to compare against.\n";
+ }
+ parent::report();
+ }
+
+ /**
+ ** @desc: Returns an array of the test names with changed results, based on the specified
+ ** before/after criteria.
+ */
+ private function compareResult( $before, $after ) {
+ $testitem = $this->db->tableName( 'testitem' );
+ $prevRun = intval( $this->prevRun );
+ $curRun = intval( $this->curRun );
+ $prevStatus = $this->condition( $before );
+ $curStatus = $this->condition( $after );
+
+ // note: requires mysql >= ver 4.1 for subselects
+ if( is_null( $after ) ) {
+ $sql = "
+ select prev.ti_name as t from $testitem as prev
+ where prev.ti_run=$prevRun and
+ prev.ti_success $prevStatus and
+ (select current.ti_success from $testitem as current
+ where current.ti_run=$curRun
+ and prev.ti_name=current.ti_name) $curStatus";
+ } else {
+ $sql = "
+ select current.ti_name as t from $testitem as current
+ where current.ti_run=$curRun and
+ current.ti_success $curStatus and
+ (select prev.ti_success from $testitem as prev
+ where prev.ti_run=$prevRun
+ and prev.ti_name=current.ti_name) $prevStatus";
+ }
+ $result = $this->db->query( $sql, __METHOD__ );
+ $retval = array();
+ while ($row = $this->db->fetchObject( $result )) {
+ $retval[] = $row->t;
+ }
+ $this->db->freeResult( $result );
+ return $retval;
+ }
+
+ /**
+ ** @desc: Helper function for compareResult() database querying.
+ */
+ private function condition( $value ) {
+ if( is_null( $value ) ) {
+ return 'IS NULL';
+ } else {
+ return '=' . intval( $value );
+ }
+ }
}
diff --git a/maintenance/parserTests.php b/maintenance/parserTests.php
index 309bf2e0..bd147788 100644
--- a/maintenance/parserTests.php
+++ b/maintenance/parserTests.php
@@ -26,22 +26,24 @@
require('parserTests.inc');
if( isset( $options['help'] ) ) {
- echo <<<END
+ echo <<<ENDS
MediaWiki $wgVersion parser test suite
-Usage: php parserTests.php [--quick] [--quiet] [--color[=(yes|no|light)]]
+Usage: php parserTests.php [--quick] [--quiet] [--show-output]
+ [--color[=(yes|no|light)]]
[--regex=<expression>] [--file=<testfile>]
[--help]
Options:
- --quick Suppress diff output of failed tests
- --quiet Suppress notification of passed tests (shows only failed tests)
- --color Override terminal detection and force color output on or off
- 'light' option is similar to 'yes' but with color for dark backgrounds
- --regex Only run tests whose descriptions which match given regex
- --file Run test cases from a custom file instead of parserTests.txt
- --help Show this help message
+ --quick Suppress diff output of failed tests
+ --quiet Suppress notification of passed tests (shows only failed tests)
+ --show-output Show expected and actual output
+ --color Override terminal detection and force color output on or off
+ 'light' option is similar to 'yes' but with color for dark backgrounds
+ --regex Only run tests whose descriptions which match given regex
+ --file Run test cases from a custom file instead of parserTests.txt
+ --help Show this help message
-END;
+ENDS;
exit( 0 );
}
@@ -52,13 +54,16 @@ $wgTitle = Title::newFromText( 'Parser test script do not use' );
$tester = new ParserTest();
if( isset( $options['file'] ) ) {
- $file = $options['file'];
+ $files = array( $options['file'] );
} else {
- # Note: the command line setup changes the current working directory
- # to the parent, which is why we have to put the subdir here:
- $file = $IP.'/maintenance/parserTests.txt';
+ // Default parser tests and any set from extensions or local config
+ $files = $wgParserTestFiles;
}
-$ok = $tester->runTestsFromFile( $file );
+
+# Print out software version to assist with locating regressions
+$version = SpecialVersion::getVersion();
+echo( "This is MediaWiki version {$version}.\n" );
+$ok = $tester->runTestsFromFiles( $files );
exit ($ok ? 0 : -1);
?>
diff --git a/maintenance/parserTests.txt b/maintenance/parserTests.txt
index 66b46a53..3d748aef 100644
--- a/maintenance/parserTests.txt
+++ b/maintenance/parserTests.txt
@@ -18,7 +18,8 @@
# subpage enable subpages (disabled by default)
# noxml don't check for XML well formdness
# title=[[XXX]] run test using article title XXX
-# language=XXX set content language to XXX for this test
+# language=XXX set content language to XXX for this test
+# variant=XXX set the variant of language for this test (eg zh-tw)
# disabled do not run test
#
# For testing purposes, temporary articles can created:
@@ -377,7 +378,7 @@ Simple definition
!! end
!! test
-Simple definition
+Definition list for indentation only
!! input
: Indented text
!! result
@@ -428,7 +429,7 @@ Definition list with wikilink containing colon
# At Brion's and JeLuF's insistence... :)
!! test
-Definition list with wikilink containing colon
+Definition list with news link containing colon
!! input
; news:alt.wikipedia.rox: This isn't even a real newsgroup!
!! result
@@ -2170,12 +2171,12 @@ Template with complex template as argument
!! end
!! test
-TODO: Template with thumb image (with link in description)
+Template with thumb image (with link in description)
!! input
{{paramtest|
param =[[Image:noimage.png|thumb|[[no link|link]] [[no link|caption]]]]}}
!! result
-This is a test template with parameter <div class="thumb tright"><div style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Noimage.png" class="new" title="Image:Noimage.png">Image:Noimage.png</a> <div class="thumbcaption"><a href="/index.php?title=No_link&amp;action=edit" class="new" title="No link">link</a> <a href="/index.php?title=No_link&amp;action=edit" class="new" title="No link">caption</a></div></div></div>
+This is a test template with parameter <div class="thumb tright"><div class="thumbinner" style="width:122px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Noimage.png" class="new" title="Image:Noimage.png">Image:Noimage.png</a> <div class="thumbcaption"><a href="/index.php?title=No_link&amp;action=edit" class="new" title="No link">link</a> <a href="/index.php?title=No_link&amp;action=edit" class="new" title="No link">caption</a></div></div></div>
!! end
@@ -2284,7 +2285,7 @@ Template infinite loop
!! input
{{loop1}}
!! result
-<p>{{loop1}}<!-- WARNING: template loop detected -->
+<p><a href="/index.php?title=Loop1&amp;action=edit" class="new" title="Loop1">loop1</a><!-- WARNING: template loop detected -->
</p>
!! end
@@ -2826,6 +2827,25 @@ msg
Foo
!! end
+!! test
+{{#special:}} page name, known
+!! options
+msg
+!! input
+{{#special:Recentchanges}}
+!! result
+Special:Recentchanges
+!! end
+
+!! test
+{{#special:}} page name, unknown
+!! options
+msg
+!! input
+{{#special:foobarnonexistent}}
+!! result
+No such special page
+!! end
###
### Images
@@ -2862,7 +2882,7 @@ Image with frame and link
!! input
[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]]]
!! result
-<div class="thumb tleft"><div style="width:1943px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="This is a test image Main Page"><img src="http://example.com/images/3/3a/Foobar.jpg" alt="This is a test image Main Page" width="1941" height="220" longdesc="/wiki/Image:Foobar.jpg" /></a> <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="This is a test image Main Page"><img src="http://example.com/images/3/3a/Foobar.jpg" alt="This is a test image Main Page" width="1941" height="220" longdesc="/wiki/Image:Foobar.jpg" class="thumbimage" /></a> <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
!! end
@@ -2891,16 +2911,16 @@ Thumbnail image caption with a free URL
!! input
[[Image:foobar.jpg|thumb|http://example.com]]
!! result
-<div class="thumb tright"><div style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="http://example.com"><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" alt="http://example.com" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="Enlarge" /></a></div><a href="http://example.com" class="external free" title="http://example.com" rel="nofollow">http://example.com</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="http://example.com"><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" alt="http://example.com" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a href="http://example.com" class="external free" title="http://example.com" rel="nofollow">http://example.com</a></div></div></div>
!! end
!! test
BUG 1887: A ISBN with a thumbnail
!! input
-[[Image:foobar.jpg|thumb|ISBN 12354]]
+[[Image:foobar.jpg|thumb|ISBN 1235467890]]
!! result
-<div class="thumb tright"><div style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="ISBN 12354"><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" alt="ISBN 12354" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="Enlarge" /></a></div><a href="/index.php?title=Special:Booksources&amp;isbn=12354" class="internal">ISBN 12354</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="ISBN 1235467890"><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" alt="ISBN 1235467890" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a href="/index.php?title=Special:Booksources&amp;isbn=1235467890" class="internal">ISBN 1235467890</a></div></div></div>
!! end
@@ -2909,7 +2929,7 @@ BUG 1887: A RFC with a thumbnail
!! input
[[Image:foobar.jpg|thumb|This is RFC 12354]]
!! result
-<div class="thumb tright"><div style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="This is RFC 12354"><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" alt="This is RFC 12354" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="Enlarge" /></a></div>This is <a href="http://www.ietf.org/rfc/rfc12354.txt" class="external" title="http://www.ietf.org/rfc/rfc12354.txt">RFC 12354</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="This is RFC 12354"><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" alt="This is RFC 12354" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is <a href="http://www.ietf.org/rfc/rfc12354.txt" class="external" title="http://www.ietf.org/rfc/rfc12354.txt">RFC 12354</a></div></div></div>
!! end
@@ -2918,7 +2938,7 @@ BUG 1887: A mailto link with a thumbnail
!! input
[[Image:foobar.jpg|thumb|Please mailto:nobody@example.com]]
!! result
-<div class="thumb tright"><div style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Please mailto:nobody@example.com"><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" alt="Please mailto:nobody@example.com" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="Enlarge" /></a></div>Please <a href="mailto:nobody@example.com" class="external free" title="mailto:nobody@example.com" rel="nofollow">mailto:nobody@example.com</a></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Please mailto:nobody@example.com"><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" alt="Please mailto:nobody@example.com" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Please <a href="mailto:nobody@example.com" class="external free" title="mailto:nobody@example.com" rel="nofollow">mailto:nobody@example.com</a></div></div></div>
!! end
@@ -2928,7 +2948,7 @@ so math is not stripped and turns up as escaped &lt;math&gt; tags.
!! input
[[Image:foobar.jpg|thumb|<math>2+2</math>]]
!! result
-<div class="thumb tright"><div style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="&lt;math&gt;2+2&lt;/math&gt;"><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" alt="&lt;math&gt;2+2&lt;/math&gt;" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="Enlarge" /></a></div>&lt;math&gt;2+2&lt;/math&gt;</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="&lt;math&gt;2+2&lt;/math&gt;"><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" alt="&lt;math&gt;2+2&lt;/math&gt;" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>&lt;math&gt;2+2&lt;/math&gt;</div></div></div>
!! end
@@ -2939,7 +2959,7 @@ math
!! input
[[Image:foobar.jpg|thumb|<math>2+2</math>]]
!! result
-<div class="thumb tright"><div style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="2 + 2"><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" alt="2 + 2" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="Enlarge" /></a></div><span class="texhtml">2 + 2</span></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="2 + 2"><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" alt="2 + 2" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><span class="texhtml">2 + 2</span></div></div></div>
!! end
@@ -3012,7 +3032,7 @@ Image caption containing another image
!! input
[[Image:Foobar.jpg|thumb|This is a caption with another [[Image:icon.png|image]] inside it!]]
!! result
-<div class="thumb tright"><div style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="This is a caption with another Image:Icon.png inside it!"><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" alt="This is a caption with another Image:Icon.png inside it!" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="Enlarge" /></a></div>This is a caption with another <a href="/index.php?title=Special:Upload&amp;wpDestFile=Icon.png" class="new" title="Image:Icon.png">Image:Icon.png</a> inside it!</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="This is a caption with another Image:Icon.png inside it!"><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" alt="This is a caption with another Image:Icon.png inside it!" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption with another <a href="/index.php?title=Special:Upload&amp;wpDestFile=Icon.png" class="new" title="Image:Icon.png">Image:Icon.png</a> inside it!</div></div></div>
!! end
@@ -3032,7 +3052,7 @@ Bug 3090: External links other than http: in image captions
!! input
[[Image:Foobar.jpg|thumb|200px|This caption has [irc://example.net irc] and [https://example.com Secure] ext links in it.]]
!! result
-<div class="thumb tright"><div style="width:202px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="This caption has irc and Secure ext links in it."><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" alt="This caption has irc and Secure ext links in it." width="200" height="23" longdesc="/wiki/Image:Foobar.jpg" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="Enlarge" /></a></div>This caption has <a href="irc://example.net" class="external text" title="irc://example.net" rel="nofollow">irc</a> and <a href="https://example.com" class="external text" title="https://example.com" rel="nofollow">Secure</a> ext links in it.</div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="This caption has irc and Secure ext links in it."><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" alt="This caption has irc and Secure ext links in it." width="200" height="23" longdesc="/wiki/Image:Foobar.jpg" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This caption has <a href="irc://example.net" class="external text" title="irc://example.net" rel="nofollow">irc</a> and <a href="https://example.com" class="external text" title="https://example.com" rel="nofollow">Secure</a> ext links in it.</div></div></div>
!! end
@@ -3136,8 +3156,6 @@ es:Alimento fr:Nourriture zh:食å“
###
!! test
Basic section headings
-!! options
-title=[[Parser test script]]
!! input
== Headline 1 ==
Some text
@@ -3147,21 +3165,19 @@ More
===Smaller headline===
Blah blah
!! result
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test_script&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</div><a name="Headline_1"></a><h2> Headline 1 </h2>
+<a name="Headline_1"></a><h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline"> Headline 1 </span></h2>
<p>Some text
</p>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test_script&amp;action=edit&amp;section=2" title="Edit section: Headline 2">edit</a>]</div><a name="Headline_2"></a><h2>Headline 2</h2>
+<a name="Headline_2"></a><h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline">Headline 2</span></h2>
<p>More
</p>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test_script&amp;action=edit&amp;section=3" title="Edit section: Smaller headline">edit</a>]</div><a name="Smaller_headline"></a><h3>Smaller headline</h3>
+<a name="Smaller_headline"></a><h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Smaller headline">edit</a>]</span> <span class="mw-headline">Smaller headline</span></h3>
<p>Blah blah
</p>
!! end
!! test
Section headings with TOC
-!! options
-title=[[Parser test script]]
!! input
== Headline 1 ==
=== Subheadline 1 ===
@@ -3194,14 +3210,14 @@ Some text
</li>
</ul>
</td></tr></table><script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test_script&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</div><a name="Headline_1"></a><h2> Headline 1 </h2>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test_script&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a>]</div><a name="Subheadline_1"></a><h3> Subheadline 1 </h3>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test_script&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a>]</div><a name="Skipping_a_level"></a><h5> Skipping a level </h5>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test_script&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a>]</div><a name="Skipping_a_level_2"></a><h6> Skipping a level </h6>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test_script&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a>]</div><a name="Headline_2"></a><h2> Headline 2 </h2>
+<a name="Headline_1"></a><h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline"> Headline 1 </span></h2>
+<a name="Subheadline_1"></a><h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a>]</span> <span class="mw-headline"> Subheadline 1 </span></h3>
+<a name="Skipping_a_level"></a><h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline"> Skipping a level </span></h5>
+<a name="Skipping_a_level_2"></a><h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline"> Skipping a level </span></h6>
+<a name="Headline_2"></a><h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline"> Headline 2 </span></h2>
<p>Some text
</p>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test_script&amp;action=edit&amp;section=6" title="Edit section: Another headline">edit</a>]</div><a name="Another_headline"></a><h3>Another headline</h3>
+<a name="Another_headline"></a><h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Another headline">edit</a>]</span> <span class="mw-headline">Another headline</span></h3>
!! end
@@ -3249,29 +3265,27 @@ Handling of sections up to level 6 and beyond
</li>
</ul>
</td></tr></table><script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Level 1 Heading">edit</a>]</div><a name="Level_1_Heading"></a><h1> Level 1 Heading</h1>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a>]</div><a name="Level_2_Heading"></a><h2> Level 2 Heading</h2>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a>]</div><a name="Level_3_Heading"></a><h3> Level 3 Heading</h3>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a>]</div><a name="Level_4_Heading"></a><h4> Level 4 Heading</h4>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a>]</div><a name="Level_5_Heading"></a><h5> Level 5 Heading</h5>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a>]</div><a name="Level_6_Heading"></a><h6> Level 6 Heading</h6>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=7" title="Edit section: = Level 7 Heading=">edit</a>]</div><a name=".3D_Level_7_Heading.3D"></a><h6>= Level 7 Heading=</h6>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=8" title="Edit section: == Level 8 Heading==">edit</a>]</div><a name=".3D.3D_Level_8_Heading.3D.3D"></a><h6>== Level 8 Heading==</h6>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=9" title="Edit section: === Level 9 Heading===">edit</a>]</div><a name=".3D.3D.3D_Level_9_Heading.3D.3D.3D"></a><h6>=== Level 9 Heading===</h6>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=10" title="Edit section: ==== Level 10 Heading====">edit</a>]</div><a name=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D"></a><h6>==== Level 10 Heading====</h6>
+<a name="Level_1_Heading"></a><h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Level 1 Heading">edit</a>]</span> <span class="mw-headline"> Level 1 Heading</span></h1>
+<a name="Level_2_Heading"></a><h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a>]</span> <span class="mw-headline"> Level 2 Heading</span></h2>
+<a name="Level_3_Heading"></a><h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a>]</span> <span class="mw-headline"> Level 3 Heading</span></h3>
+<a name="Level_4_Heading"></a><h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a>]</span> <span class="mw-headline"> Level 4 Heading</span></h4>
+<a name="Level_5_Heading"></a><h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a>]</span> <span class="mw-headline"> Level 5 Heading</span></h5>
+<a name="Level_6_Heading"></a><h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a>]</span> <span class="mw-headline"> Level 6 Heading</span></h6>
+<a name=".3D_Level_7_Heading.3D"></a><h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=7" title="Edit section: = Level 7 Heading=">edit</a>]</span> <span class="mw-headline">= Level 7 Heading=</span></h6>
+<a name=".3D.3D_Level_8_Heading.3D.3D"></a><h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=8" title="Edit section: == Level 8 Heading==">edit</a>]</span> <span class="mw-headline">== Level 8 Heading==</span></h6>
+<a name=".3D.3D.3D_Level_9_Heading.3D.3D.3D"></a><h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=9" title="Edit section: === Level 9 Heading===">edit</a>]</span> <span class="mw-headline">=== Level 9 Heading===</span></h6>
+<a name=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D"></a><h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=10" title="Edit section: ==== Level 10 Heading====">edit</a>]</span> <span class="mw-headline">==== Level 10 Heading====</span></h6>
!! end
!! test
Resolving duplicate section names
-!! options
-title=[[Parser test script]]
!! input
== Foo bar ==
== Foo bar ==
!! result
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test_script&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</div><a name="Foo_bar"></a><h2> Foo bar </h2>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test_script&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a>]</div><a name="Foo_bar_2"></a><h2> Foo bar </h2>
+<a name="Foo_bar"></a><h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline"> Foo bar </span></h2>
+<a name="Foo_bar_2"></a><h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline"> Foo bar </span></h2>
!! end
@@ -3284,18 +3298,16 @@ Template:sections
!! test
Template with sections, __NOTOC__
-!! options
-title=[[Parser test script]]
!! input
__NOTOC__
==Section 0==
{{sections}}
==Section 4==
!! result
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test_script&amp;action=edit&amp;section=1" title="Edit section: Section 0">edit</a>]</div><a name="Section_0"></a><h2>Section 0</h2>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=1" title="Template:Sections">edit</a>]</div><a name="Section_1"></a><h3>Section 1</h3>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=2" title="Template:Sections">edit</a>]</div><a name="Section_2"></a><h2>Section 2</h2>
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test_script&amp;action=edit&amp;section=2" title="Edit section: Section 4">edit</a>]</div><a name="Section_4"></a><h2>Section 4</h2>
+<a name="Section_0"></a><h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 0">edit</a>]</span> <span class="mw-headline">Section 0</span></h2>
+<a name="Section_1"></a><h3><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=1" title="Template:Sections">edit</a>]</span> <span class="mw-headline">Section 1</span></h3>
+<a name="Section_2"></a><h2><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=2" title="Template:Sections">edit</a>]</span> <span class="mw-headline">Section 2</span></h2>
+<a name="Section_4"></a><h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 4">edit</a>]</span> <span class="mw-headline">Section 4</span></h2>
!! end
@@ -3306,19 +3318,17 @@ __NOEDITSECTION__
==Section 1==
==Section 2==
!! result
-<a name="Section_1"></a><h2>Section 1</h2>
-<a name="Section_2"></a><h2>Section 2</h2>
+<a name="Section_1"></a><h2> <span class="mw-headline">Section 1</span></h2>
+<a name="Section_2"></a><h2> <span class="mw-headline">Section 2</span></h2>
!! end
!! test
Link inside a section heading
-!! options
-title=[[Parser test script]]
!! input
==Section with a [[Main Page|link]] in it==
!! result
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test_script&amp;action=edit&amp;section=1" title="Edit section: Section with a link in it">edit</a>]</div><a name="Section_with_a_link_in_it"></a><h2>Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</h2>
+<a name="Section_with_a_link_in_it"></a><h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section with a link in it">edit</a>]</span> <span class="mw-headline">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</span></h2>
!! end
@@ -3909,7 +3919,7 @@ Expansion of multi-line templates in attribute values (bug 6255 sanity check)
!! end
!! test
-Expansion of multi-line templates in attribute values (bug 6255 sanity check)
+Expansion of multi-line templates in attribute values (bug 6255 sanity check 2)
!! input
<div style="background: &#10;#00FF00">-</div>
!! result
@@ -4459,7 +4469,7 @@ Fuzz testing: Parser14
== onmouseover= ==
http://__TOC__
!! result
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a>]</div><a name="onmouseover.3D"></a><h2> onmouseover= </h2>
+<a name="onmouseover.3D"></a><h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a>]</span> <span class="mw-headline"> onmouseover= </span></h2>
http://<table id="toc" class="toc" summary="Contents"><tr><td><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
@@ -4474,7 +4484,7 @@ Fuzz testing: Parser14-table
==a==
{| STYLE=__TOC__
!! result
-<div class="editsection" style="float:right;margin-left:5px;">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: a">edit</a>]</div><a name="a"></a><h2>a</h2>
+<a name="a"></a><h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: a">edit</a>]</span> <span class="mw-headline">a</span></h2>
<table style="&#95;_TOC&#95;_">
<tr><td></td></tr>
</table>
@@ -4612,7 +4622,7 @@ Fuzz testing: image with bogus manual thumbnail
!!input
[[Image:foobar.jpg|thumbnail= ]]
!!result
-<div class="thumb tright"><div style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title=""><img src="http://example.com/images/3/3a/Foobar.jpg" alt="" width="180" height="-1" longdesc="/wiki/Image:Foobar.jpg" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="Enlarge" /></a></div></div></div></div>
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title=""><img src="http://example.com/images/3/3a/Foobar.jpg" alt="" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div></div></div></div>
!!end
@@ -4750,6 +4760,42 @@ Special page transclusion twice (bug 5021)
!! end
!! test
+Transclusion of default MediaWiki message
+!! input
+{{MediaWiki:Mainpage}}
+!!result
+<p>Main Page
+</p>
+!! end
+
+!! test
+Transclusion of nonexistent MediaWiki message
+!! input
+{{MediaWiki:Mainpagexxx}}
+!!result
+<p><a href="/index.php?title=MediaWiki:Mainpagexxx&amp;action=edit" class="new" title="MediaWiki:Mainpagexxx">MediaWiki:Mainpagexxx</a>
+</p>
+!! end
+
+!! test
+Transclusion of MediaWiki message with underscore
+!! input
+{{MediaWiki:history_short}}
+!! result
+<p>History
+</p>
+!! end
+
+!! test
+Transclusion of MediaWiki message with space
+!! input
+{{MediaWiki:history short}}
+!! result
+<p>History
+</p>
+!! end
+
+!! test
Invalid header with following text
!! input
= x = y
@@ -5723,11 +5769,11 @@ image4 |300px| centre
!! end
!! test
-TODO: HTML Hex character encoding.
+HTML Hex character encoding (spells the word "JavaScript")
!! input
&#x4A;&#x061;&#x0076;&#x00061;&#x000053;&#x0000063;&#114;&#x0000069;&#00000112;&#x0000000074;
!! result
-<p>JavaScript
+<p>&#x4a;&#x61;&#x76;&#x61;&#x53;&#x63;&#114;&#x69;&#112;&#x74;
</p>
!! end
@@ -5744,9 +5790,9 @@ __FORCETOC__
!! test
ISBN code coverage
!! input
-ISBN 983&#x20;987
+ISBN 978-0-1234-56&#x20;789
!! result
-<p><a href="/index.php?title=Special:Booksources&amp;isbn=983" class="internal">ISBN 983</a>&#x20;987
+<p><a href="/index.php?title=Special:Booksources&amp;isbn=9780123456" class="internal">ISBN 978-0-1234-56</a>&#x20;789
</p>
!! end
@@ -5761,12 +5807,10 @@ ISBN
!! test
Double ISBN
-!! options
-disabled # Disabled until Bug 6560 resolved
!! input
-ISBN ISBN 1234
+ISBN ISBN 1234567890
!! result
-<p>ISBN <a href="/wiki/index.php?title=Special:Booksources&amp;isbn=1234" class="internal">ISBN 1234</a>
+<p>ISBN <a href="/index.php?title=Special:Booksources&amp;isbn=1234567890" class="internal">ISBN 1234567890</a>
</p>
!! end
@@ -5851,6 +5895,521 @@ TODO: dt/dd/dl test
!!end
+
+# Images with the "|" character in external URLs in comment tags; Eats half the comment, leaves unmatched "</a>" tag.
+!! test
+TODO: Images with the "|" character in the comment
+!! input
+[[image:Foobar.jpg|thumb|An [http://test/?param1=|left|&param2=|x external] URL]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/Image:Foobar.jpg" class="internal" title="An external URL"><img src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" alt="An external URL" width="180" height="20" longdesc="/wiki/Image:Foobar.jpg" class="thumbimage" /></a> <div class="thumbcaption"><div class="magnify" style="float:right"><a href="/wiki/Image:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>An <a href="http://test/?param1=|left|&amp;param2=|x" class="external text" title="http://test/?param1=|left|&amp;param2=|x" rel="nofollow">external</a> URL</div></div></div>
+
+!!end
+
+!! test
+[Before] HTML without raw HTML enabled ($wgRawHtml==false)
+!! input
+<html><script>alert(1);</script></html>
+!! result
+<p>&lt;html&gt;&lt;script&gt;alert(1);&lt;/script&gt;&lt;/html&gt;
+</p>
+!! end
+
+!! test
+HTML with raw HTML ($wgRawHtml==true)
+!! options
+rawhtml
+!! input
+<html><script>alert(1);</script></html>
+!! result
+<p><script>alert(1);</script>
+</p>
+!! end
+
+!! test
+Parents of subpages, one level up
+!! options
+subpage title=[[Subpage test/L1/L2/L3]]
+!! input
+[[../|L2]]
+!! result
+<p><a href="/index.php?title=Subpage_test/L1/L2&amp;action=edit" class="new" title="Subpage test/L1/L2">L2</a>
+</p>
+!! end
+
+
+!! test
+Parents of subpages, one level up, not named
+!! options
+subpage title=[[Subpage test/L1/L2/L3]]
+!! input
+[[../]]
+!! result
+<p><a href="/index.php?title=Subpage_test/L1/L2&amp;action=edit" class="new" title="Subpage test/L1/L2">Subpage test/L1/L2</a>
+</p>
+!! end
+
+
+
+!! test
+Parents of subpages, two levels up
+!! options
+disabled
+subpage title=[[Subpage test/L1/L2/L3]]
+!! input
+[[../../|L1]]2
+!! result
+<p><a href="/index.php?title=Subpage_test/L1&amp;action=edit" class="new" title="Subpage test/L1">L1</a>
+</p>
+!! end
+
+
+# Question: should result be "/index.php?title=Subpage_test/L1&amp;action=edit" instead?
+!! test
+TODO: Parents of subpages, two levels up, without trailing slash or name.
+!! options
+subpage title=[[Subpage test/L1/L2/L3]]
+!! input
+[[../..]]
+!! result
+<p><a href="/index.php?title=Subpage_test/L1/L2/..&amp;action=edit" class="new" title="Subpage test/L1">../..</a>
+</p>
+!! end
+
+# Question: Why should the link text in the above test be "../..", yet in this test the "../.." part is silently dropped?
+# Current result: <p><a href="/index.php?title=Subpage_test/L1////&amp;action=edit" class="new" title="Subpage test/L1////">///
+!! test
+TODO: Parents of subpages, two levels up, with lots of extra trailing slashes.
+!! options
+subpage title=[[Subpage test/L1/L2/L3]]
+!! input
+[[../../////]]
+!! result
+<p><a href="/index.php?title=Subpage_test/L1&amp;action=edit" class="new" title="Subpage test/L1">Subpage test/L1</a>
+</p>
+!! end
+
+!! test
+Definition list code coverage
+!! input
+; title : def
+; title : def
+;title: def
+!! result
+<dl><dt> title &nbsp;</dt><dd> def
+</dd><dt> title&nbsp;</dt><dd> def
+</dd><dt>title</dt><dd> def
+</dd></dl>
+
+!! end
+
+!! test
+TODO: Don't fall for the self-closing div
+!! input
+<div>hello world</div/>
+!! result
+<div>hello world</div>
+
+!! end
+
+!! test
+MSGNW magic word
+!! input
+{{MSGNW:msg}}
+!! result
+<p>&#91;&#91;:Template:Msg]]
+</p>
+!! end
+
+!! test
+RAW magic word
+!! input
+{{RAW:QUERTY}}
+!! result
+<p><a href="/index.php?title=Template:QUERTY&amp;action=edit" class="new" title="Template:QUERTY">Template:QUERTY</a>
+</p>
+!! end
+
+# This isn't needed for XHTML conformance, but would be handy as a fallback security measure
+!! test
+TODO: Always escape literal '>' in output, not just after '<'
+!! input
+><>
+!! result
+<p>&gt;&lt;&gt;
+</p>
+!! end
+
+!! test
+Template caching
+!! input
+{{Test}}
+{{Test}}
+!! result
+<p>This is a test template
+This is a test template
+</p>
+!! end
+
+
+!! article
+MediaWiki:Fake
+!! text
+==header==
+!! endarticle
+
+!! test
+Inclusion of !userCanEdit() content
+!! input
+{{MediaWiki:Fake}}
+!! result
+<a name="header"></a><h2><span class="editsection">[<a href="/index.php?title=MediaWiki:Fake&amp;action=edit&amp;section=1" title="MediaWiki:Fake">edit</a>]</span> <span class="mw-headline">header</span></h2>
+
+!! end
+
+
+!! test
+Out-of-order TOC heading levels
+!! input
+==2==
+======6======
+===3===
+=1=
+=====5=====
+==2==
+!! result
+<table id="toc" class="toc" summary="Contents"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1"><a href="#2"><span class="tocnumber">1</span> <span class="toctext">2</span></a>
+<ul>
+<li class="toclevel-2"><a href="#6"><span class="tocnumber">1.1</span> <span class="toctext">6</span></a></li>
+<li class="toclevel-2"><a href="#3"><span class="tocnumber">1.2</span> <span class="toctext">3</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1"><a href="#1_7"><span class="tocnumber">2</span> <span class="toctext">1</span></a>
+<ul>
+<li class="toclevel-2"><a href="#5"><span class="tocnumber">2.1</span> <span class="toctext">5</span></a></li>
+<li class="toclevel-2"><a href="#2_4"><span class="tocnumber">2.2</span> <span class="toctext">2</span></a></li>
+</ul>
+</li>
+</ul>
+</td></tr></table><script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
+<a name="2"></a><h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: 2">edit</a>]</span> <span class="mw-headline">2</span></h2>
+<a name="6"></a><h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: 6">edit</a>]</span> <span class="mw-headline">6</span></h6>
+<a name="3"></a><h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: 3">edit</a>]</span> <span class="mw-headline">3</span></h3>
+<a name="1_7"></a><h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: 1">edit</a>]</span> <span class="mw-headline">1</span></h1>
+<a name="5"></a><h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: 5">edit</a>]</span> <span class="mw-headline">5</span></h5>
+<a name="2_4"></a><h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: 2">edit</a>]</span> <span class="mw-headline">2</span></h2>
+
+!! end
+
+
+!! test
+ISBN with a dummy number
+!! input
+ISBN ---
+!! result
+<p>ISBN ---
+</p>
+!! end
+
+
+!! test
+ISBN with space-delimited number
+!! input
+ISBN 92 9017 032 8
+!! result
+<p><a href="/index.php?title=Special:Booksources&amp;isbn=9290170328" class="internal">ISBN 92 9017 032 8</a>
+</p>
+!! end
+
+
+!! test
+ISBN with multiple spaces, no number
+!! input
+ISBN foo
+!! result
+<p>ISBN foo
+</p>
+!! end
+
+
+!! test
+ISBN length
+!! input
+ISBN 123456789
+
+ISBN 1234567890
+
+ISBN 12345678901
+!! result
+<p>ISBN 123456789
+</p><p><a href="/index.php?title=Special:Booksources&amp;isbn=1234567890" class="internal">ISBN 1234567890</a>
+</p><p>ISBN 12345678901
+</p>
+!! end
+
+
+!! test
+ISBN with trailing year (bug 8110)
+!! input
+ISBN 1-234-56789-0 - 2006
+
+ISBN 1 234 56789 0 - 2006
+!! result
+<p><a href="/index.php?title=Special:Booksources&amp;isbn=1234567890" class="internal">ISBN 1-234-56789-0</a> - 2006
+</p><p><a href="/index.php?title=Special:Booksources&amp;isbn=1234567890" class="internal">ISBN 1 234 56789 0</a> - 2006
+</p>
+!! end
+
+
+!! test
+Pages in namespace (Magic word disabled currently)
+!! input
+{{PAGESINNAMESPACE:}}
+!! result
+
+!! end
+
+
+!! test
+anchorencode
+!! input
+{{anchorencode:foo bar©#%n}}
+!! result
+<p>foo_bar.C2.A9.23.25n
+</p>
+!! end
+
+
+!! test
+Bug 8293: Use of center tag ruins paragraph formatting
+!! input
+<center>
+foo
+</center>
+
+bar
+
+ baz
+!! result
+<center>
+<p>foo
+</p>
+</center>
+<p>bar
+</p>
+<pre>baz
+</pre>
+!! end
+
+
+###
+### Language variants related tests
+###
+!! test
+Self-link in language variants
+!! options
+title=[[Dunav]] language=sr
+!! input
+Both [[Dunav]] and [[Дунав]] are names for this river.
+!! result
+<p>Both <strong class="selflink">Dunav</strong> and <strong class="selflink">Дунав</strong> are names for this river.
+</p>
+!!end
+
+
+!! test
+Link to pages in language variants
+!! options
+language=sr
+!! input
+Main Page can be written as [[Маин Паге]]
+!! result
+<p>Main Page can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>
+</p>
+!!end
+
+
+!! test
+Multiple links to pages in language variants
+!! options
+language=sr
+!! input
+[[Main Page]] can be written as [[Маин Паге]] same as [[Маин Паге]].
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a> can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a> same as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>.
+</p>
+!!end
+
+
+!! test
+Simple template in language variants
+!! options
+language=sr
+!! input
+{{теÑÑ‚}}
+!! result
+<p>This is a test template
+</p>
+!! end
+
+
+!! test
+Template with explicit namespace in language variants
+!! options
+language=sr
+!! input
+{{Template:теÑÑ‚}}
+!! result
+<p>This is a test template
+</p>
+!! end
+
+
+!! test
+Basic test for template parameter in language variants
+!! options
+language=sr
+!! input
+{{парамтеÑÑ‚|param=foo}}
+!! result
+<p>This is a test template with parameter foo
+</p>
+!! end
+
+
+!! test
+Simple category in language variants
+!! options
+language=sr cat
+!! input
+[[:Category:МедиаWики УÑер'Ñ Ð“ÑƒÐ¸Ð´Ðµ]]
+!! result
+<a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
+!! end
+
+
+!! test
+Stripping -{}- tags (language variants)
+!! options
+language=sr
+!! input
+Latin proverb: -{Ne nuntium necare}-
+!! result
+<p>Latin proverb: Ne nuntium necare
+</p>
+!! end
+
+
+!! test
+Prevent conversion with -{}- tags (language variants)
+!! options
+language=sr variant=sr-ec
+!! input
+Latinski: -{Ne nuntium necare}-
+!! result
+<p>ЛатинÑки: Ne nuntium necare
+</p>
+!! end
+
+
+!! test
+Prevent conversion of text with -{}- tags (language variants)
+!! options
+language=sr variant=sr-ec
+!! input
+Latinski: -{Ne nuntium necare}-
+!! result
+<p>ЛатинÑки: Ne nuntium necare
+</p>
+!! end
+
+
+!! test
+Prevent conversion of links with -{}- tags (language variants)
+!! options
+language=sr variant=sr-ec
+!! input
+-{[[Main Page]]}-
+!! result
+<p><a href="/index.php?title=Main_Page&amp;variant=sr-ec" title="Main Page">Main Page</a>
+</p>
+!! end
+
+
+!! test
+-{}- tags within headlines (within html for parserConvert())
+!! options
+language=sr variant=sr-ec
+!! input
+== -{Naslov}- ==
+!! result
+<a name="-.7BNaslov.7D-"></a><h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Уреди део: Naslov">уреди</a>]</span> <span class="mw-headline"> Naslov </span></h2>
+
+!! end
+
+
+!! test
+Explicit definition of language variant alternatives
+!! options
+language=zh variant=zh-tw
+!! input
+-{zh:China;zh-tw:Taiwan}-, not China
+!! result
+<p>Taiwan, not China
+</p>
+!! end
+
+
+!! test
+Adding explicit session-wise language variant mapping (A flag)
+!! options
+language=zh variant=zh-tw
+!! input
+-{A|zh:China;zh-tw:Taiwan}- is China
+!! result
+<p>Taiwan is Taiwan
+</p>
+!! end
+
+
+!! test
+Adding explicit conversion rule for title (T flag)
+!! options
+language=zh variant=zh-tw
+!! input
+Should be stripped-{T|zh:China;zh-tw:Taiwan}-!
+!! result
+<p>Should be stripped!
+</p>
+!! end
+
+
+!! test
+Raw output of variant escape tags (R flag)
+!! options
+language=zh variant=zh-tw
+!! input
+Raw: -{R|zh:China;zh-tw:Taiwan}-
+!! result
+<p>Raw: zh:China;zh-tw:Taiwan
+</p>
+!! end
+
+
+!! test
+Do not convert roman numbers to language variants
+!! options
+language=sr variant=sr-ec
+!! input
+Fridrih IV je car.
+!! result
+<p>Фридрих IV је цар.
+</p>
+!! end
+
+
#
#
#
diff --git a/maintenance/postgres/compare_schemas.pl b/maintenance/postgres/compare_schemas.pl
index 4a76b270..cdbbdf41 100644
--- a/maintenance/postgres/compare_schemas.pl
+++ b/maintenance/postgres/compare_schemas.pl
@@ -7,8 +7,9 @@ use strict;
use warnings;
use Data::Dumper;
-my @old = ("../tables.sql");
+my @old = ("../tables.sql", "../mysql5/tables.sql", "../mysql5/tables-binary.sql");
my $new = "tables.sql";
+my @xfile;
## Read in exceptions and other metadata
my %ok;
@@ -23,7 +24,7 @@ while (<DATA>) {
next;
}
if ($name eq 'XFILE') {
- push @old, $val;
+ push @xfile, $val;
next;
}
for (split(/\s+/ => $val)) {
@@ -31,12 +32,10 @@ while (<DATA>) {
}
}
-open my $newfh, "<", $new or die qq{Could not open $new: $!\n};
-
my $datatype = join '|' => qw(
bool
tinyint int bigint real float
-tinytext mediumtext text char varchar
+tinytext mediumtext text char varchar varbinary
timestamp datetime
tinyblob mediumblob blob
);
@@ -50,12 +49,43 @@ my $typeval2 = qr{ unsigned| binary| NOT NULL| NULL| auto_increment| default ['\
my $indextype = join '|' => qw(INDEX KEY FULLTEXT), "PRIMARY KEY", "UNIQUE INDEX", "UNIQUE KEY";
$indextype = qr{$indextype};
+my $engine = qr{TYPE|ENGINE};
+
my $tabletype = qr{InnoDB|MyISAM|HEAP|HEAP MAX_ROWS=\d+};
+my $charset = qr{utf8|binary};
+
+open my $newfh, "<", $new or die qq{Could not open $new: $!\n};
+
+
my ($table,%old);
-for my $old (@old) {
- open my $oldfh, "<", $old or die qq{Could not open $old: $!\n};
+## Read in the xfiles
+my %xinfo;
+for my $xfile (@xfile) {
+ print "Loading $xfile\n";
+ my $info = &parse_sql($xfile);
+ for (keys %$info) {
+ $xinfo{$_} = $info->{$_};
+ }
+}
+
+for my $oldfile (@old) {
+ print "Loading $oldfile\n";
+ my $info = &parse_sql($oldfile);
+ for (keys %xinfo) {
+ $info->{$_} = $xinfo{$_};
+ }
+ $old{$oldfile} = $info;
+}
+
+sub parse_sql {
+
+ my $oldfile = shift;
+
+ open my $oldfh, "<", $oldfile or die qq{Could not open $oldfile: $!\n};
+
+ my %info;
while (<$oldfh>) {
next if /^\s*\-\-/ or /^\s+$/;
s/\s*\-\- [\w ]+$//;
@@ -63,37 +93,66 @@ for my $old (@old) {
if (/CREATE\s*TABLE/i) {
m{^CREATE TABLE /\*\$wgDBprefix\*/(\w+) \($}
- or die qq{Invalid CREATE TABLE at line $. of $old\n};
+ or die qq{Invalid CREATE TABLE at line $. of $oldfile\n};
$table = $1;
- $old{$table}{name}=$table;
+ $info{$table}{name}=$table;
+ }
+ elsif (/^\) ($engine)=($tabletype);$/) {
+ $info{$table}{engine}=$1;
+ $info{$table}{type}=$2;
}
- elsif (/^\) TYPE=($tabletype);$/) {
- $old{$table}{type}=$1;
+ elsif (/^\) ($engine)=($tabletype), DEFAULT CHARSET=($charset);$/) {
+ $info{$table}{engine}=$1;
+ $info{$table}{type}=$2;
+ $info{$table}{charset}=$3;
}
elsif (/^ (\w+) $datatype$typeval$typeval2{0,3},?$/) {
- $old{$table}{column}{$1} = $2;
+ $info{$table}{column}{$1} = $2;
}
elsif (/^ ($indextype)(?: (\w+))? \(([\w, \(\)]+)\),?$/) {
- $old{$table}{lc $1."_name"} = $2 ? $2 : "";
- $old{$table}{lc $1."pk_target"} = $3;
+ $info{$table}{lc $1."_name"} = $2 ? $2 : "";
+ $info{$table}{lc $1."pk_target"} = $3;
}
else {
- die "Cannot parse line $. of $old:\n$_\n";
+ die "Cannot parse line $. of $oldfile:\n$_\n";
}
+
}
close $oldfh;
+
+ return \%info;
+
+} ## end of parse_sql
+
+for my $oldfile (@old) {
+
+## Begin non-standard indent
+
+## MySQL sanity checks
+for my $table (sort keys %{$old{$oldfile}}) {
+ my $t = $old{$oldfile}{$table};
+ if (($oldfile =~ /5/ and $t->{engine} ne 'ENGINE')
+ or
+ ($oldfile !~ /5/ and $t->{engine} ne 'TYPE')) {
+ die "Invalid engine for $oldfile: $t->{engine}\n" unless $t->{name} eq 'profiling';
+ }
+ my $charset = $t->{charset} || '';
+ if ($oldfile !~ /binary/ and $charset eq 'binary') {
+ die "Invalid charset for $oldfile: $charset\n";
+ }
}
-$datatype = join '|' => qw(
+my $dtype = join '|' => qw(
SMALLINT INTEGER BIGINT NUMERIC SERIAL
TEXT CHAR VARCHAR
BYTEA
TIMESTAMPTZ
CIDR
);
-$datatype = qr{($datatype)};
+$dtype = qr{($dtype)};
my %new;
my ($infunction,$inview,$inrule) = (0,0,0);
+seek $newfh, 0, 0;
while (<$newfh>) {
next if /^\s*\-\-/ or /^\s*$/;
s/\s*\-\- [\w ']+$//;
@@ -130,24 +189,23 @@ while (<$newfh>) {
}
elsif (/^\);$/) {
}
- elsif (/^ (\w+) +$datatype/) {
+ elsif (/^ (\w+) +$dtype/) {
$new{$table}{column}{$1} = $2;
}
else {
die "Cannot parse line $. of $new:\n$_\n";
}
}
-close $newfh;
## Old but not new
-for my $t (sort keys %old) {
+for my $t (sort keys %{$old{$oldfile}}) {
if (!exists $new{$t} and !exists $ok{OLD}{$t}) {
print "Table not in $new: $t\n";
next;
}
next if exists $ok{OLD}{$t} and !$ok{OLD}{$t};
my $newt = exists $ok{OLD}{$t} ? $ok{OLD}{$t} : $t;
- my $oldcol = $old{$t}{column};
+ my $oldcol = $old{$oldfile}{$t}{column};
my $newcol = $new{$newt}{column};
for my $c (keys %$oldcol) {
if (!exists $newcol->{$c}) {
@@ -164,12 +222,16 @@ for my $t (sort keys %old) {
}
## New but not old:
for (sort keys %new) {
- if (!exists $old{$_} and !exists $ok{NEW}{$_}) {
+ if (!exists $old{$oldfile}{$_} and !exists $ok{NEW}{$_}) {
print "Not in old: $_\n";
next;
}
}
+
+} ## end each file to be parsed
+
+
__DATA__
## Known exceptions
OLD: searchindex ## We use tsearch2 directly on the page table instead
diff --git a/maintenance/postgres/tables.sql b/maintenance/postgres/tables.sql
index 9ac329d8..e6cbbe2a 100644
--- a/maintenance/postgres/tables.sql
+++ b/maintenance/postgres/tables.sql
@@ -17,6 +17,7 @@ CREATE TABLE mwuser ( -- replace reserved word 'user'
user_real_name TEXT,
user_password TEXT,
user_newpassword TEXT,
+ user_newpass_time TIMESTAMPTZ,
user_token CHAR(32),
user_email TEXT,
user_email_token CHAR(32),
@@ -24,7 +25,8 @@ CREATE TABLE mwuser ( -- replace reserved word 'user'
user_email_authenticated TIMESTAMPTZ,
user_options TEXT,
user_touched TIMESTAMPTZ,
- user_registration TIMESTAMPTZ
+ user_registration TIMESTAMPTZ,
+ user_editcount INTEGER
);
CREATE INDEX user_email_token_idx ON mwuser (user_email_token);
@@ -86,7 +88,7 @@ CREATE TABLE revision (
rev_page INTEGER NULL REFERENCES page (page_id) ON DELETE CASCADE,
rev_text_id INTEGER NULL, -- FK
rev_comment TEXT,
- rev_user INTEGER NOT NULL REFERENCES mwuser(user_id),
+ rev_user INTEGER NOT NULL REFERENCES mwuser(user_id) ON DELETE RESTRICT,
rev_user_text TEXT NOT NULL,
rev_timestamp TIMESTAMPTZ NOT NULL,
rev_minor_edit CHAR NOT NULL DEFAULT '0',
@@ -137,6 +139,14 @@ DO INSTEAD INSERT INTO archive2 VALUES (
);
+CREATE TABLE redirect (
+ rd_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE,
+ rd_namespace SMALLINT NOT NULL,
+ rd_title TEXT NOT NULL
+);
+CREATE INDEX redirect_ns_title ON redirect (rd_namespace,rd_title,rd_from);
+
+
CREATE TABLE pagelinks (
pl_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE,
pl_namespace SMALLINT NOT NULL,
@@ -201,18 +211,19 @@ CREATE TABLE hitcounter (
CREATE SEQUENCE ipblocks_ipb_id_val;
CREATE TABLE ipblocks (
- ipb_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('ipblocks_ipb_id_val'),
- ipb_address CIDR NULL,
- ipb_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL,
- ipb_by INTEGER NOT NULL REFERENCES mwuser(user_id) ON DELETE CASCADE,
- ipb_reason TEXT NOT NULL,
- ipb_timestamp TIMESTAMPTZ NOT NULL,
- ipb_auto CHAR NOT NULL DEFAULT '0',
- ipb_anon_only CHAR NOT NULL DEFAULT '0',
- ipb_create_account CHAR NOT NULL DEFAULT '1',
- ipb_expiry TIMESTAMPTZ NOT NULL,
- ipb_range_start TEXT,
- ipb_range_end TEXT
+ ipb_id INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('ipblocks_ipb_id_val'),
+ ipb_address TEXT NULL,
+ ipb_user INTEGER NULL REFERENCES mwuser(user_id) ON DELETE SET NULL,
+ ipb_by INTEGER NOT NULL REFERENCES mwuser(user_id) ON DELETE CASCADE,
+ ipb_reason TEXT NOT NULL,
+ ipb_timestamp TIMESTAMPTZ NOT NULL,
+ ipb_auto CHAR NOT NULL DEFAULT '0',
+ ipb_anon_only CHAR NOT NULL DEFAULT '0',
+ ipb_create_account CHAR NOT NULL DEFAULT '1',
+ ipb_enable_autoblock CHAR NOT NULL DEFAULT '1',
+ ipb_expiry TIMESTAMPTZ NOT NULL,
+ ipb_range_start TEXT,
+ ipb_range_end TEXT
);
CREATE INDEX ipb_address ON ipblocks (ipb_address);
CREATE INDEX ipb_user ON ipblocks (ipb_user);
@@ -300,7 +311,9 @@ CREATE TABLE recentchanges (
rc_moved_to_ns SMALLINT,
rc_moved_to_title TEXT,
rc_patrolled CHAR NOT NULL DEFAULT '0',
- rc_ip CIDR
+ rc_ip CIDR,
+ rc_old_len INTEGER,
+ rc_new_len INTEGER
);
CREATE INDEX rc_timestamp ON recentchanges (rc_timestamp);
CREATE INDEX rc_namespace_title ON recentchanges (rc_namespace, rc_title);
@@ -348,6 +361,19 @@ CREATE TABLE querycache_info (
qci_timestamp TIMESTAMPTZ NULL
);
+CREATE TABLE querycachetwo (
+ qcc_type TEXT NOT NULL,
+ qcc_value SMALLINT NOT NULL DEFAULT 0,
+ qcc_namespace INTEGER NOT NULL DEFAULT 0,
+ qcc_title TEXT NOT NULL DEFAULT '',
+ qcc_namespacetwo INTEGER NOT NULL DEFAULT 0,
+ qcc_titletwo TEXT NOT NULL DEFAULT ''
+);
+CREATE INDEX querycachetwo_type_value ON querycachetwo (qcc_type, qcc_value);
+CREATE INDEX querycachetwo_title ON querycachetwo (qcc_type,qcc_namespace,qcc_title);
+CREATE INDEX querycachetwo_titletwo ON querycachetwo (qcc_type,qcc_namespacetwo,qcc_titletwo);
+
+
CREATE TABLE objectcache (
keyname CHAR(255) UNIQUE,
value BYTEA NOT NULL DEFAULT '',
@@ -470,7 +496,7 @@ CREATE TABLE mediawiki_version (
);
INSERT INTO mediawiki_version (type,mw_version,sql_version,sql_date)
- VALUES ('Creation','??','$LastChangedRevision: 16747 $','$LastChangedDate: 2006-10-02 17:55:26 -0700 (Mon, 02 Oct 2006) $');
+ VALUES ('Creation','??','$LastChangedRevision: 18326 $','$LastChangedDate: 2006-12-14 07:34:56 -0800 (Thu, 14 Dec 2006) $');
COMMIT;
diff --git a/maintenance/postgres/wp_mysql2postgres.pl b/maintenance/postgres/wp_mysql2postgres.pl
index 788d9e0b..981d99f3 100644
--- a/maintenance/postgres/wp_mysql2postgres.pl
+++ b/maintenance/postgres/wp_mysql2postgres.pl
@@ -1,7 +1,7 @@
#!/usr/bin/perl
## Convert data from a MySQL mediawiki database into a Postgres mediawiki database
-## svn: $Id: wp_mysql2postgres.pl 16088 2006-08-16 01:12:20Z greg $
+## svn: $Id: wp_mysql2postgres.pl 18836 2007-01-05 03:37:19Z brion $
use strict;
use warnings;
@@ -160,7 +160,7 @@ $MYSQLSOCKET and $conninfo .= "\n-- socket $MYSQLSOCKET";
print qq{
-- Dump of MySQL Mediawiki tables for import into a Postgres Mediawiki schema
-- Performed by the program: $0
--- Version: $VERSION (subversion }.q{$LastChangedRevision: 16088 $}.qq{)
+-- Version: $VERSION (subversion }.q{$LastChangedRevision: 18836 $}.qq{)
-- Author: Greg Sabino Mullane <greg\@turnstep.com> Comments welcome
--
-- This file was created: $now
diff --git a/maintenance/purgeList.php b/maintenance/purgeList.php
new file mode 100644
index 00000000..9bf7c1bf
--- /dev/null
+++ b/maintenance/purgeList.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * Send purge requests for listed pages to squid
+ */
+
+require_once( "commandLine.inc" );
+
+$stdin = fopen( "php://stdin", "rt" );
+$urls = array();
+
+while( !feof( $stdin ) ) {
+ $page = trim( fgets( $stdin ) );
+ if ( substr( $page, 0, 7 ) == 'http://' ) {
+ $urls[] = $page;
+ } elseif( $page !== '' ) {
+ $title = Title::newFromText( $page );
+ if( $title ) {
+ $url = $title->getFullUrl();
+ echo "$url\n";
+ $urls[] = $url;
+ } else {
+ echo "(Invalid title '$page')\n";
+ }
+ }
+}
+
+echo "Purging " . count( $urls ) . " urls...\n";
+$u = new SquidUpdate( $urls );
+$u->doUpdate();
+
+echo "Done!\n";
+
+?>
diff --git a/maintenance/showStats.php b/maintenance/showStats.php
new file mode 100644
index 00000000..27f9be6b
--- /dev/null
+++ b/maintenance/showStats.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * Maintenance script to show the cached statistics.
+ * Give out the same output as [[Special:Statistics]]
+ *
+ * @author Ashar Voultoiz <hashar@altern.org>
+ * Based on initStats.php by:
+ * @author Brion Vibber
+ * @author Rob Church <robchur@gmail.com>
+ *
+ * @licence GNU General Public License 2.0 or later
+ */
+
+require_once( 'commandLine.inc' );
+
+#
+# Configuration
+#
+$fields = array(
+ 'ss_total_views' => 'Total views',
+ 'ss_total_edits' => 'Total edits',
+ 'ss_good_articles' => 'Number of articles',
+ 'ss_total_pages' => 'Total pages',
+ 'ss_users' => 'Number of users',
+ 'ss_admins' => 'Number of admins',
+ 'ss_images' => 'Number of images',
+);
+
+// Get cached stats from slave database
+$dbr =& wfGetDB( DB_SLAVE );
+$fname = 'showStats';
+$stats = $dbr->selectRow( 'site_stats', '*', '' );
+
+// Get maximum size for each column
+$max_length_value = $max_length_desc = 0;
+foreach( $fields as $field => $desc ) {
+ $max_length_value = max( $max_length_value, strlen( $stats->$field ) );
+ $max_length_desc = max( $max_length_desc , strlen( $desc )) ;
+}
+
+// Show them
+foreach( $fields as $field => $desc ) {
+ printf( "%-{$max_length_desc}s: %{$max_length_value}d\n", $desc, $stats->$field );
+}
+?>
diff --git a/maintenance/stats.php b/maintenance/stats.php
index bb19e671..25bb9cc7 100644
--- a/maintenance/stats.php
+++ b/maintenance/stats.php
@@ -1,6 +1,10 @@
<?php
require_once('commandLine.inc');
+if( get_class( $wgMemc ) == 'FakeMemCachedClient' ) {
+ die("You are running FakeMemCachedClient, I can not provide any statistics.\n");
+}
+
print "Requests\n";
$session = intval($wgMemc->get(wfMemcKey('stats','request_with_session')));
$noSession = intval($wgMemc->get(wfMemcKey('stats','request_without_session')));
diff --git a/maintenance/tables.sql b/maintenance/tables.sql
index 3ffa5e5f..188ca63e 100644
--- a/maintenance/tables.sql
+++ b/maintenance/tables.sql
@@ -64,7 +64,7 @@ CREATE TABLE /*$wgDBprefix*/user (
-- Password hashes, normally hashed like so:
-- MD5(CONCAT(user_id,'-',MD5(plaintext_password))), see
-- wfEncryptPassword() in GlobalFunctions.php
- user_password tinyblob NOT NULL default '',
+ user_password tinyblob NOT NULL,
-- When using 'mail me a new password', a random
-- password is generated and the hash stored here.
@@ -72,15 +72,19 @@ CREATE TABLE /*$wgDBprefix*/user (
-- someone actually logs in with the new password,
-- at which point the hash is moved to user_password
-- and the old password is invalidated.
- user_newpassword tinyblob NOT NULL default '',
+ user_newpassword tinyblob NOT NULL,
+ -- Timestamp of the last time when a new password was
+ -- sent, for throttling purposes
+ user_newpass_time char(14) binary,
+
-- Note: email should be restricted, not public info.
-- Same with passwords.
- user_email tinytext NOT NULL default '',
+ user_email tinytext NOT NULL,
-- Newline-separated list of name=value defining the user
-- preferences
- user_options blob NOT NULL default '',
+ user_options blob NOT NULL,
-- This is a timestamp which is updated when a user
-- logs in, logs out, changes preferences, or performs
@@ -109,6 +113,18 @@ CREATE TABLE /*$wgDBprefix*/user (
-- Timestamp of account registration.
-- Accounts predating this schema addition may contain NULL.
user_registration char(14) binary,
+
+ -- Count of edits and edit-like actions.
+ --
+ -- *NOT* intended to be an accurate copy of COUNT(*) WHERE rev_user=user_id
+ -- May contain NULL for old accounts if batch-update scripts haven't been
+ -- run, as well as listing deleted edits and other myriad ways it could be
+ -- out of sync.
+ --
+ -- Meant primarily for heuristic checks to give an impression of whether
+ -- the account has been used much.
+ --
+ user_editcount int,
PRIMARY KEY user_id (user_id),
UNIQUE INDEX user_name (user_name),
@@ -176,7 +192,7 @@ CREATE TABLE /*$wgDBprefix*/page (
-- Comma-separated set of permission keys indicating who
-- can move or edit the page.
- page_restrictions tinyblob NOT NULL default '',
+ page_restrictions tinyblob NOT NULL,
-- Number of times this page has been viewed.
page_counter bigint(20) unsigned NOT NULL default '0',
@@ -235,7 +251,7 @@ CREATE TABLE /*$wgDBprefix*/revision (
-- Text comment summarizing the change.
-- This text is shown in the history and other changes lists,
-- rendered in a subset of wiki markup by Linker::formatComment()
- rev_comment tinyblob NOT NULL default '',
+ rev_comment tinyblob NOT NULL,
-- Key to user.user_id of the user who made this edit.
-- Stores 0 for anonymous edits and for some mass imports.
@@ -282,7 +298,7 @@ CREATE TABLE /*$wgDBprefix*/text (
-- Depending on the contents of the old_flags field, the text
-- may be convenient plain text, or it may be funkily encoded.
- old_text mediumblob NOT NULL default '',
+ old_text mediumblob NOT NULL,
-- Comma-separated list of flags:
-- gzip: text is compressed with PHP's gzdeflate() function.
@@ -293,7 +309,7 @@ CREATE TABLE /*$wgDBprefix*/text (
-- The object either contains multiple versions compressed
-- together to achieve a better compression ratio, or it refers
-- to another row where the text can be found.
- old_flags tinyblob NOT NULL default '',
+ old_flags tinyblob NOT NULL,
PRIMARY KEY old_id (old_id)
@@ -315,17 +331,17 @@ CREATE TABLE /*$wgDBprefix*/archive (
-- so old archived pages will remain accessible after
-- upgrading from 1.4 to 1.5.
-- Text may be gzipped or otherwise funky.
- ar_text mediumblob NOT NULL default '',
+ ar_text mediumblob NOT NULL,
-- Basic revision stuff...
- ar_comment tinyblob NOT NULL default '',
+ ar_comment tinyblob NOT NULL,
ar_user int(5) unsigned NOT NULL default '0',
ar_user_text varchar(255) binary NOT NULL,
ar_timestamp char(14) binary NOT NULL default '',
ar_minor_edit tinyint(1) NOT NULL default '0',
-- See ar_text note.
- ar_flags tinyblob NOT NULL default '',
+ ar_flags tinyblob NOT NULL,
-- When revisions are deleted, their unique rev_id is stored
-- here so it can be retained after undeletion. This is necessary
@@ -367,7 +383,7 @@ CREATE TABLE /*$wgDBprefix*/pagelinks (
pl_title varchar(255) binary NOT NULL default '',
UNIQUE KEY pl_from (pl_from,pl_namespace,pl_title),
- KEY (pl_namespace,pl_title)
+ KEY (pl_namespace,pl_title,pl_from)
) TYPE=InnoDB;
@@ -387,7 +403,7 @@ CREATE TABLE /*$wgDBprefix*/templatelinks (
tl_title varchar(255) binary NOT NULL default '',
UNIQUE KEY tl_from (tl_from,tl_namespace,tl_title),
- KEY (tl_namespace,tl_title)
+ KEY (tl_namespace,tl_title,tl_from)
) TYPE=InnoDB;
@@ -406,7 +422,7 @@ CREATE TABLE /*$wgDBprefix*/imagelinks (
il_to varchar(255) binary NOT NULL default '',
UNIQUE KEY il_from (il_from,il_to),
- KEY (il_to)
+ KEY (il_to,il_from)
) TYPE=InnoDB;
@@ -458,7 +474,7 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
el_from int(8) unsigned NOT NULL default '0',
-- The URL
- el_to blob NOT NULL default '',
+ el_to blob NOT NULL,
-- In the case of HTTP URLs, this is the URL with any username or password
-- removed, and with the labels in the hostname reversed and converted to
@@ -471,7 +487,7 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
-- which allows for fast searching for all pages under example.com with the
-- clause:
-- WHERE el_index LIKE 'http://com.example.%'
- el_index blob NOT NULL default '',
+ el_index blob NOT NULL,
KEY (el_from, el_to(40)),
KEY (el_to(60), el_from),
@@ -553,7 +569,7 @@ CREATE TABLE /*$wgDBprefix*/ipblocks (
ipb_id int(8) NOT NULL auto_increment,
-- Blocked IP address in dotted-quad form or user name.
- ipb_address tinyblob NOT NULL default '',
+ ipb_address tinyblob NOT NULL,
-- Blocked user ID or 0 for IP blocks.
ipb_user int(8) unsigned NOT NULL default '0',
@@ -562,7 +578,7 @@ CREATE TABLE /*$wgDBprefix*/ipblocks (
ipb_by int(8) unsigned NOT NULL default '0',
-- Text comment made by blocker.
- ipb_reason tinyblob NOT NULL default '',
+ ipb_reason tinyblob NOT NULL,
-- Creation (or refresh) date in standard YMDHMS form.
-- IP blocks expire automatically.
@@ -578,14 +594,17 @@ CREATE TABLE /*$wgDBprefix*/ipblocks (
-- Block prevents account creation from matching IP addresses
ipb_create_account bool NOT NULL default 1,
+
+ -- Block triggers autoblocks
+ ipb_enable_autoblock bool NOT NULL default '1',
-- Time at which the block will expire.
ipb_expiry char(14) binary NOT NULL default '',
-- Start and end of an address range, in hexadecimal
-- Size chosen to allow IPv6
- ipb_range_start tinyblob NOT NULL default '',
- ipb_range_end tinyblob NOT NULL default '',
+ ipb_range_start tinyblob NOT NULL,
+ ipb_range_end tinyblob NOT NULL,
PRIMARY KEY ipb_id (ipb_id),
@@ -638,11 +657,11 @@ CREATE TABLE /*$wgDBprefix*/image (
-- Description field as entered by the uploader.
-- This is displayed in image upload history and logs.
- img_description tinyblob NOT NULL default '',
+ img_description tinyblob NOT NULL,
-- user_id and user_name of uploader.
img_user int(5) unsigned NOT NULL default '0',
- img_user_text varchar(255) binary NOT NULL default '',
+ img_user_text varchar(255) binary NOT NULL,
-- Time of the upload.
img_timestamp char(14) binary NOT NULL default '',
@@ -675,9 +694,9 @@ CREATE TABLE /*$wgDBprefix*/oldimage (
oi_width int(5) NOT NULL default 0,
oi_height int(5) NOT NULL default 0,
oi_bits int(3) NOT NULL default 0,
- oi_description tinyblob NOT NULL default '',
+ oi_description tinyblob NOT NULL,
oi_user int(5) unsigned NOT NULL default '0',
- oi_user_text varchar(255) binary NOT NULL default '',
+ oi_user_text varchar(255) binary NOT NULL,
oi_timestamp char(14) binary NOT NULL default '',
INDEX oi_name (oi_name(10))
@@ -723,9 +742,9 @@ CREATE TABLE /*$wgDBprefix*/filearchive (
fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") default "unknown",
fa_minor_mime varchar(32) default "unknown",
- fa_description tinyblob default '',
+ fa_description tinyblob,
fa_user int(5) unsigned default '0',
- fa_user_text varchar(255) binary default '',
+ fa_user_text varchar(255) binary,
fa_timestamp char(14) binary default '',
PRIMARY KEY (fa_id),
@@ -748,7 +767,7 @@ CREATE TABLE /*$wgDBprefix*/recentchanges (
-- As in revision
rc_user int(10) unsigned NOT NULL default '0',
- rc_user_text varchar(255) binary NOT NULL default '',
+ rc_user_text varchar(255) binary NOT NULL,
-- When pages are renamed, their RC entries do _not_ change.
rc_namespace int NOT NULL default '0',
@@ -791,13 +810,19 @@ CREATE TABLE /*$wgDBprefix*/recentchanges (
-- $wgPutIPinRC option is enabled.
rc_ip char(15) NOT NULL default '',
+ -- Text length in characters before
+ -- and after the edit
+ rc_old_len int(10),
+ rc_new_len int(10),
+
PRIMARY KEY rc_id (rc_id),
INDEX rc_timestamp (rc_timestamp),
INDEX rc_namespace_title (rc_namespace, rc_title),
INDEX rc_cur_id (rc_cur_id),
INDEX new_name_timestamp (rc_new,rc_namespace,rc_timestamp),
INDEX rc_ip (rc_ip),
- INDEX rc_ns_usertext (rc_namespace, rc_user_text)
+ INDEX rc_ns_usertext (rc_namespace, rc_user_text),
+ INDEX rc_user_text (rc_user_text, rc_timestamp)
) TYPE=InnoDB;
@@ -862,7 +887,7 @@ CREATE TABLE /*$wgDBprefix*/searchindex (
si_title varchar(255) NOT NULL default '',
-- Munged version of body text
- si_text mediumtext NOT NULL default '',
+ si_text mediumtext NOT NULL,
UNIQUE KEY (si_page),
FULLTEXT si_title (si_title),
@@ -955,7 +980,7 @@ CREATE TABLE /*$wgDBprefix*/logging (
log_comment varchar(255) NOT NULL default '',
-- LF separated list of miscellaneous parameters
- log_params blob NOT NULL default '',
+ log_params blob NOT NULL,
KEY type_time (log_type, log_timestamp),
KEY user_time (log_user, log_timestamp),
@@ -991,7 +1016,7 @@ CREATE TABLE /*$wgDBprefix*/job (
-- Any other parameters to the command
-- Presently unused, format undefined
- job_params blob NOT NULL default '',
+ job_params blob NOT NULL,
PRIMARY KEY job_id (job_id),
KEY (job_cmd, job_namespace, job_title)
@@ -1012,4 +1037,42 @@ CREATE TABLE /*$wgDBprefix*/querycache_info (
) TYPE=InnoDB;
+-- For each redirect, this table contains exactly one row defining its target
+CREATE TABLE /*$wgDBprefix*/redirect (
+ -- Key to the page_id of the redirect page
+ rd_from int(8) unsigned NOT NULL default '0',
+
+ -- Key to page_namespace/page_title of the target page.
+ -- The target page may or may not exist, and due to renames
+ -- and deletions may refer to different page records as time
+ -- goes by.
+ rd_namespace int NOT NULL default '0',
+ rd_title varchar(255) binary NOT NULL default '',
+
+ PRIMARY KEY rd_from (rd_from),
+ KEY rd_ns_title (rd_namespace,rd_title,rd_from)
+) TYPE=InnoDB;
+
+-- Used for caching expensive grouped queries that need two links (for example double-redirects)
+CREATE TABLE /*$wgDBprefix*/querycachetwo (
+ -- A key name, generally the base name of of the special page.
+ qcc_type char(32) NOT NULL,
+
+ -- Some sort of stored value. Sizes, counts...
+ qcc_value int(5) unsigned NOT NULL default '0',
+
+ -- Target namespace+title
+ qcc_namespace int NOT NULL default '0',
+ qcc_title char(255) binary NOT NULL default '',
+
+ -- Target namespace+title2
+ qcc_namespacetwo int NOT NULL default '0',
+ qcc_titletwo char(255) binary NOT NULL default '',
+
+ KEY qcc_type (qcc_type,qcc_value),
+ KEY qcc_title (qcc_type,qcc_namespace,qcc_title),
+ KEY qcc_titletwo (qcc_type,qcc_namespacetwo,qcc_titletwo)
+
+) TYPE=InnoDB;
+
-- vim: sw=2 sts=2 et
diff --git a/maintenance/testRunner.sql b/maintenance/testRunner.sql
new file mode 100644
index 00000000..8591d81d
--- /dev/null
+++ b/maintenance/testRunner.sql
@@ -0,0 +1,35 @@
+--
+-- Optional tables for parserTests recording mode
+-- With --record option, success data will be saved to these tables,
+-- and comparisons of what's changed from the previous run will be
+-- displayed at the end of each run.
+--
+-- These tables currently require MySQL 5 (or maybe 4.1?) for subselects.
+--
+
+drop table if exists /*$wgDBprefix*/testitem;
+drop table if exists /*$wgDBprefix*/testrun;
+
+create table /*$wgDBprefix*/testrun (
+ tr_id int not null auto_increment,
+
+ tr_date char(14) binary,
+ tr_mw_version blob,
+ tr_php_version blob,
+ tr_db_version blob,
+ tr_uname blob,
+
+ primary key (tr_id)
+) engine=InnoDB;
+
+create table /*$wgDBprefix*/testitem (
+ ti_run int not null,
+ ti_name varchar(255),
+ ti_success bool,
+
+ unique key (ti_run, ti_name),
+ key (ti_run, ti_success),
+
+ foreign key (ti_run) references /*$wgDBprefix*/testrun(tr_id)
+ on delete cascade
+) engine=InnoDB;
diff --git a/maintenance/update.php b/maintenance/update.php
index 402818ce..490c3f63 100644
--- a/maintenance/update.php
+++ b/maintenance/update.php
@@ -10,7 +10,7 @@ require_once 'counter.php';
/** */
$wgUseMasterForMaintenance = true;
-$options = array( 'quick' );
+$options = array( 'quick', 'nopurge' );
require_once( "commandLine.inc" );
require_once( "updaters.inc" );
$wgTitle = Title::newFromText( "MediaWiki database updater" );
@@ -54,13 +54,10 @@ if( !isset( $options['quick'] ) ) {
echo "\n";
}
-if ( isset( $options['doshared'] ) ) {
- $doShared = true;
-} else {
- $doShared = false;
-}
+$shared = isset( $options['doshared'] );
+$purge = !isset( $options['nopurge'] );
-do_all_updates( $doShared );
+do_all_updates( $shared, $purge );
print "Done.\n";
diff --git a/maintenance/updateArticleCount.inc.php b/maintenance/updateArticleCount.inc.php
index 20546a78..7eaea749 100644
--- a/maintenance/updateArticleCount.inc.php
+++ b/maintenance/updateArticleCount.inc.php
@@ -39,12 +39,9 @@ class ArticleCounter {
function makeSql() {
extract( $this->dbr->tableNames( 'page', 'pagelinks' ) );
$nsset = $this->makeNsSet();
- return "SELECT COUNT(*) AS count FROM {$page}
- LEFT JOIN {$pagelinks} ON pl_from = page_id
- WHERE page_namespace IN ( $nsset )
- AND page_is_redirect = 0
- AND page_len > 0
- AND pl_namespace IS NOT NULL";
+ return "SELECT DISTINCT page_namespace,page_title FROM $page,$pagelinks " .
+ "WHERE pl_from=page_id and page_namespace IN ( $nsset ) " .
+ "AND page_is_redirect = 0 AND page_len > 0";
}
/**
@@ -55,14 +52,16 @@ class ArticleCounter {
function count() {
$res = $this->dbr->query( $this->makeSql(), __METHOD__ );
if( $res ) {
- $row = $this->dbr->fetchObject( $res );
+ $count = $this->dbr->numRows( $res );
$this->dbr->freeResult( $res );
- return (int)$row->count;
+ return $count;
} else {
- return false; # Look out for this when handling the result
+ # Look out for this when handling the result
+ # - Actually it's unreachable, !$res throws an exception -- TS
+ return false;
}
}
}
-?> \ No newline at end of file
+?>
diff --git a/maintenance/updateSpecialPages.php b/maintenance/updateSpecialPages.php
index a7a72b58..89b5aa94 100644
--- a/maintenance/updateSpecialPages.php
+++ b/maintenance/updateSpecialPages.php
@@ -28,6 +28,11 @@ foreach ( $wgQueryPages as $page ) {
continue;
}
+ if ( in_array( $special, $wgDisableQueryPageUpdate ) ) {
+ printf("%-30s disabled\n", $special);
+ continue;
+ }
+
$specialObj = SpecialPage::getPage( $special );
if ( !$specialObj ) {
print "No such special page: $special\n";
@@ -40,12 +45,12 @@ foreach ( $wgQueryPages as $page ) {
$queryPage = new $class;
if( !(isset($options['only'])) or ($options['only'] == $queryPage->getName()) ) {
- printf( '%-30s', $special );
+ printf( '%-30s ', $special );
if ( $queryPage->isExpensive() ) {
$t1 = explode( ' ', microtime() );
# Do the query
- $num = $queryPage->recache( $limit === null ? 1000 : $limit );
+ $num = $queryPage->recache( $limit === null ? $wgQueryCacheLimit : $limit );
$t2 = explode( ' ', microtime() );
if ( $num === false ) {
@@ -80,12 +85,15 @@ foreach ( $wgQueryPages as $page ) {
}
# Wait for the slave to catch up
+ /*
$slaveDB =& wfGetDB( DB_SLAVE, array('QueryPage::recache', 'vslow' ) );
while( $slaveDB->getLag() > 600 ) {
print "Slave lagged, waiting...\n";
sleep(30);
}
+ */
+ wfWaitForSlaves( 5 );
} else {
print "cheap, skipped\n";
diff --git a/maintenance/updaters.inc b/maintenance/updaters.inc
index d334660e..7909b13d 100644
--- a/maintenance/updaters.inc
+++ b/maintenance/updaters.inc
@@ -6,9 +6,14 @@
/** */
+if ( !defined( 'MEDIAWIKI' ) ) {
+ echo "This file is not a valid entry point\n";
+ exit( 1 );
+}
+
require_once 'convertLinks.inc';
-require_once 'InitialiseMessages.inc';
require_once 'userDupes.inc';
+require_once 'deleteDefaultMessages.php';
$wgRenamedTables = array(
# from to patch file
@@ -30,16 +35,20 @@ $wgNewTables = array(
array( 'langlinks', 'patch-langlinks.sql' ),
array( 'querycache_info', 'patch-querycacheinfo.sql' ),
array( 'filearchive', 'patch-filearchive.sql' ),
+ array( 'redirect', 'patch-redirect.sql' ),
+ array( 'querycachetwo', 'patch-querycachetwo.sql' ),
);
$wgNewFields = array(
# table field patch file (in maintenance/archives)
array( 'ipblocks', 'ipb_id', 'patch-ipblocks.sql' ),
array( 'ipblocks', 'ipb_expiry', 'patch-ipb_expiry.sql' ),
+ array( 'ipblocks', 'ipb_enable_autoblock', 'patch-ipb_optional_autoblock.sql' ),
array( 'recentchanges', 'rc_type', 'patch-rc_type.sql' ),
array( 'recentchanges', 'rc_ip', 'patch-rc_ip.sql' ),
array( 'recentchanges', 'rc_id', 'patch-rc_id.sql' ),
array( 'recentchanges', 'rc_patrolled', 'patch-rc-patrol.sql' ),
+ array( 'recentchanges', 'rc_old_len', 'patch-rc_len.sql' ),
array( 'user', 'user_real_name', 'patch-user-realname.sql' ),
array( 'user', 'user_token', 'patch-user_token.sql' ),
array( 'user', 'user_email_token', 'patch-user_email_token.sql' ),
@@ -57,6 +66,8 @@ $wgNewFields = array(
array( 'ipblocks', 'ipb_range_start', 'patch-ipb_range_start.sql' ),
array( 'site_stats', 'ss_images', 'patch-ss_images.sql' ),
array( 'ipblocks', 'ipb_anon_only', 'patch-ipb_anon_only.sql' ),
+ array( 'user', 'user_newpass_time','patch-user_newpass_time.sql' ),
+ array( 'user', 'user_editcount', 'patch-user_editcount.sql' ),
);
function rename_table( $from, $to, $patch ) {
@@ -379,7 +390,7 @@ function do_schema_restructuring() {
page_id int(8) unsigned NOT NULL auto_increment,
page_namespace int NOT NULL,
page_title varchar(255) binary NOT NULL,
- page_restrictions tinyblob NOT NULL default '',
+ page_restrictions tinyblob NOT NULL,
page_counter bigint(20) unsigned NOT NULL default '0',
page_is_redirect tinyint(1) unsigned NOT NULL default '0',
page_is_new tinyint(1) unsigned NOT NULL default '0',
@@ -396,7 +407,7 @@ function do_schema_restructuring() {
$wgDatabase->query("CREATE TABLE $revision (
rev_id int(8) unsigned NOT NULL auto_increment,
rev_page int(8) unsigned NOT NULL,
- rev_comment tinyblob NOT NULL default '',
+ rev_comment tinyblob NOT NULL,
rev_user int(5) unsigned NOT NULL default '0',
rev_user_text varchar(255) binary NOT NULL default '',
rev_timestamp char(14) binary NOT NULL default '',
@@ -775,12 +786,59 @@ function do_rc_indices_update() {
dbsource( archive( 'patch-recentchanges-utindex.sql' ) );
} else {
# Index seems to exist
- echo( "...seems to be ok\n" );
+ echo( "...index on ( rc_namespace, rc_user_text ) seems to be ok\n" );
+ }
+
+ #Add (rc_user_text, rc_timestamp) index [A. Garrett], November 2006
+ # See if we can find the index we want
+ $info = $wgDatabase->indexInfo( 'recentchanges', 'rc_user_text', __METHOD__ );
+ if( !$info ) {
+ # None, so create
+ echo( "...index on ( rc_user_text, rc_timestamp ) not found; creating\n" );
+ dbsource( archive( 'patch-rc_user_text-index.sql' ) );
+ } else {
+ # Index seems to exist
+ echo( "...index on ( rc_user_text, rc_timestamp ) seems to be ok\n" );
+ }
+}
+
+function index_has_field($table, $index, $field) {
+ global $wgDatabase;
+ echo( "Checking if $table index $index includes field $field...\n" );
+ $info = $wgDatabase->indexInfo( $table, $index, __METHOD__ );
+ if( $info ) {
+ foreach($info as $row) {
+ if($row->Column_name == $field) {
+ echo( "...index $index on table $table seems to be ok\n" );
+ return true;
+ }
+ }
}
+ echo( "...index $index on table $table has no field $field; adding\n" );
+ return false;
}
-function do_all_updates( $doShared = false ) {
- global $wgNewTables, $wgNewFields, $wgRenamedTables, $wgSharedDB, $wgDatabase, $wgDBtype;
+function do_backlinking_indices_update() {
+ echo( "Checking for backlinking indices...\n" );
+ if (!index_has_field('pagelinks', 'pl_namespace', 'pl_from') ||
+ !index_has_field('templatelinks', 'tl_namespace', 'tl_from') ||
+ !index_has_field('imagelinks', 'il_to', 'il_from'))
+ {
+ dbsource( archive( 'patch-backlinkindexes.sql' ) );
+ }
+}
+
+function purge_cache() {
+ global $wgDatabase;
+ # We can't guarantee that the user will be able to use TRUNCATE,
+ # but we know that DELETE is available to us
+ echo( "Purging caches..." );
+ $wgDatabase->delete( 'objectcache', '*', __METHOD__ );
+ echo( "done.\n" );
+}
+
+function do_all_updates( $shared = false, $purge = true ) {
+ global $wgNewTables, $wgNewFields, $wgRenamedTables, $wgSharedDB, $wgDatabase, $wgDBtype, $IP;
$doUser = !$wgSharedDB || $doShared;
@@ -844,8 +902,17 @@ function do_all_updates( $doShared = false ) {
do_page_random_update(); flush();
do_rc_indices_update(); flush();
+
+ do_backlinking_indices_update(); flush();
- initialiseMessages(); flush();
+ echo "Deleting old default messages..."; flush();
+ deleteDefaultMessages();
+ echo "Done\n"; flush();
+
+ if( $purge ) {
+ purge_cache();
+ flush();
+ }
}
function archive($name) {
@@ -861,20 +928,28 @@ function archive($name) {
function do_postgres_updates() {
global $wgDatabase, $wgVersion, $wgDBmwschema;
- $version = "1.7.1";
-
# Just in case their LocalSetings.php does not have this:
if ( !isset( $wgDBmwschema ))
$wgDBmwschema = 'mediawiki';
+ ## Default to the oldest supported version
+ $version = 1.7;
+
if ($wgDatabase->tableExists("mediawiki_version")) {
$version = "1.8";
+ $sql = "SELECT mw_version FROM mediawiki_version ORDER BY cdate DESC LIMIT 1";
+ $tempversion = pg_fetch_result($wgDatabase->doQuery($sql),0,0);
+ $thisver = array();
+ if (preg_match('/(\d+\.\d+)/', $tempversion, $thisver)) {
+ $version = $thisver[1];
+ }
}
- if ($version == '1.7.1') {
- $upgrade = <<<PGEND
+ print " Detected version: $version ";
+ $upgrade = '';
-BEGIN;
+ if ($version <= 1.7) {
+ $upgrade = <<<PGEND
-- Type tweaking:
ALTER TABLE oldimage ALTER oi_size TYPE INTEGER;
@@ -927,9 +1002,6 @@ CREATE TABLE mediawiki_version (
cdate TIMESTAMPTZ NOT NULL DEFAULT now()
);
-INSERT INTO mediawiki_version (type,mw_version,notes)
-VALUES ('Upgrade','MWVERSION','Upgrade from older version 1.7.1');
-
-- Special modifications
ALTER TABLE archive RENAME to archive2;
CREATE VIEW archive AS
@@ -957,20 +1029,69 @@ END;
CREATE TRIGGER page_deleted AFTER DELETE ON page
FOR EACH ROW EXECUTE PROCEDURE page_deleted();
-COMMIT;
-
PGEND;
- $upgrade = str_replace( 'MWVERSION', $wgVersion, $upgrade );
+ } ## end version 1.7
+
+ else if ($version <= 1.8) {
+ $upgrade = <<<PGEND
+
+-- Tighten up restrictions on the revision table so we don't lose data:
+ALTER TABLE revision DROP CONSTRAINT revision_rev_user_fkey;
+ALTER TABLE revision ADD CONSTRAINT revision_rev_user_fkey
+ FOREIGN KEY (rev_user) REFERENCES mwuser(user_id) ON DELETE RESTRICT;
+
+-- New columns for better password tracking:
+ALTER TABLE mwuser ADD user_newpass_time TIMESTAMPTZ;
+ALTER TABLE mwuser ADD user_editcount INTEGER;
- $res = $wgDatabase->query($upgrade);
+-- New column for autoblocking problem users
+ALTER TABLE ipblocks ADD ipb_enable_autoblock CHAR NOT NULL DEFAULT '1';
- } ## end version 1.7.1 upgrade
+-- Despite it's name, ipb_address does not necessarily contain IP addresses :)
+ALTER TABLE ipblocks ALTER ipb_address TYPE TEXT USING ipb_address::TEXT;
- else {
- print "No updates needed\n";
+-- New tables:
+CREATE TABLE redirect (
+ rd_from INTEGER NOT NULL REFERENCES page(page_id) ON DELETE CASCADE,
+ rd_namespace SMALLINT NOT NULL,
+ rd_title TEXT NOT NULL
+);
+CREATE INDEX redirect_ns_title ON redirect (rd_namespace,rd_title,rd_from);
+
+CREATE TABLE querycachetwo (
+ qcc_type TEXT NOT NULL,
+ qcc_value SMALLINT NOT NULL DEFAULT 0,
+ qcc_namespace INTEGER NOT NULL DEFAULT 0,
+ qcc_title TEXT NOT NULL DEFAULT '',
+ qcc_namespacetwo INTEGER NOT NULL DEFAULT 0,
+ qcc_titletwo TEXT NOT NULL DEFAULT ''
+);
+CREATE INDEX querycachetwo_type_value ON querycachetwo (qcc_type, qcc_value);
+CREATE INDEX querycachetwo_title ON querycachetwo (qcc_type,qcc_namespace,qcc_title);
+CREATE INDEX querycachetwo_titletwo ON querycachetwo (qcc_type,qcc_namespacetwo,qcc_titletwo);
+
+-- New columns for fancy recentchanges display
+ALTER TABLE recentchanges ADD rc_old_len INT;
+ALTER TABLE recentchanges ADD rc_new_len INT;
+
+-- Note this upgrade
+INSERT INTO mediawiki_version (type,mw_version,notes)
+VALUES ('Upgrade','MWVERSION','Upgrade from older version THISVERSION');
+
+PGEND;
+
+ }
+
+ if ( !strlen($upgrade)) {
+ print "No updates needed for version $version\n";
+ return;
}
+ $upgrade = str_replace( 'MWVERSION', $wgVersion, $upgrade );
+ $upgrade = str_replace( 'THISVERSION', $version, $upgrade );
+ $res = $wgDatabase->query("BEGIN;\n\n $upgrade\n\nCOMMIT;\n");
+
return;
}
diff --git a/maintenance/userDupes.inc b/maintenance/userDupes.inc
index e632f737..9af66f11 100644
--- a/maintenance/userDupes.inc
+++ b/maintenance/userDupes.inc
@@ -46,7 +46,7 @@ class UserDupes {
# Confusingly, 'Non_unique' is 0 for *unique* indexes,
# and 1 for *non-unique* indexes. Pass the crack, MySQL,
# it's obviously some good stuff!
- return ( $info->Non_unique == 0 );
+ return ( $info[0]->Non_unique == 0 );
}
/**
diff --git a/math/html.ml b/math/html.ml
index 6a24b114..e880f073 100644
--- a/math/html.ml
+++ b/math/html.ml
@@ -47,10 +47,17 @@ let rec html_render_flat ctx = function
match html_render_size ctx a with
true, s -> raise Too_difficult_for_html
| false, s -> s^"<sub>"^bs^"</sub><sup>"^cs^"</sup>")^html_render_flat ctx r)
+ | TEX_DQN (a)::r -> (html_liberal ();
+ let bs = html_render_flat ctx [a] in "<sub>"^bs^"</sub>")^html_render_flat ctx r
+ | TEX_UQN (a)::r -> (html_liberal ();
+ let bs = html_render_flat ctx [a] in "<sup>"^bs^"</sup>")^html_render_flat ctx r
+ | TEX_FQN (a,b)::r -> (html_liberal ();
+ (let bs = html_render_flat ctx [a] in let cs = html_render_flat ctx [b] in "<sub>"^bs^"</sub><sup>"^cs^"</sup>")^html_render_flat ctx r)
| TEX_BOX (_,s)::r -> s^html_render_flat ctx r
| TEX_LITERAL (TEX_ONLY _)::_ -> raise Too_difficult_for_html
| TEX_FUN1 _::_ -> raise Too_difficult_for_html
| TEX_FUN2 _::_ -> raise Too_difficult_for_html
+ | TEX_FUN2nb _::_ -> raise Too_difficult_for_html
| TEX_FUN2h _::_ -> raise Too_difficult_for_html
| TEX_FUN2sq _::_ -> raise Too_difficult_for_html
| TEX_INFIX _::_ -> raise Too_difficult_for_html
@@ -73,16 +80,21 @@ let rec html_render_deep ctx = function
| TEX_INFIXh (_,f,a,b)::r -> (html_liberal (); (f a b)::html_render_deep ctx r)
| TEX_CURLY ls::r -> html_render_deep ctx (ls @ r)
| TEX_DQ (a,b)::r -> (let bs = html_render_flat ctx [b] in match html_render_size ctx a with
- true, s -> "","<font size='+2'>"^s^"</font>",bs
+ true, s -> "","<span style='font-size: x-large; font-family: serif;'>"^s^"</span>",bs
| false, s -> "",(s^"<sub>"^bs^"</sub>"),"")::html_render_deep ctx r
| TEX_UQ (a,b)::r -> (let bs = html_render_flat ctx [b] in match html_render_size ctx a with
- true, s -> bs,"<font size='+2'>"^s^"</font>",""
+ true, s -> bs,"<span style='font-size: x-large; font-family: serif;'>"^s^"</span>",""
| false, s -> "",(s^"<sup>"^bs^"</sup>"),"")::html_render_deep ctx r
| TEX_FQ (a,b,c)::r -> (html_liberal ();
(let bs = html_render_flat ctx [b] in let cs = html_render_flat ctx [c] in
match html_render_size ctx a with
- true, s -> (cs,"<font size='+2'>"^s^"</font>",bs)
+ true, s -> (cs,"<span style='font-size: x-large; font-family: serif;'>"^s^"</span>",bs)
| false, s -> ("",(s^"<sub>"^bs^"</sub><sup>"^cs^"</sup>"),""))::html_render_deep ctx r)
+ | TEX_DQN (a)::r -> (let bs = html_render_flat ctx [a] in "",("<sub>"^bs^"</sub>"),"")::html_render_deep ctx r
+ | TEX_UQN (a)::r -> (let bs = html_render_flat ctx [a] in "",("<sup>"^bs^"</sup>"),"")::html_render_deep ctx r
+ | TEX_FQN (a,b)::r -> (html_liberal ();
+ (let bs = html_render_flat ctx [a] in let cs = html_render_flat ctx [b] in
+ ("",("<sub>"^bs^"</sub><sup>"^cs^"</sup>"),""))::html_render_deep ctx r)
| TEX_FUN1hl (_,(f1,f2),a)::r -> ("",f1,"")::(html_render_deep ctx [a]) @ ("",f2,"")::html_render_deep ctx r
| TEX_FUN1hf (_,ff,a)::r -> (html_render_deep (new_ctx ff) [a]) @ html_render_deep ctx r
| TEX_DECLh (_,ff,a)::r -> (html_render_deep (new_ctx ff) a) @ html_render_deep ctx r
@@ -90,6 +102,7 @@ let rec html_render_deep ctx = function
| TEX_LITERAL (TEX_ONLY _)::_ -> raise Too_difficult_for_html
| TEX_FUN1 _::_ -> raise Too_difficult_for_html
| TEX_FUN2 _::_ -> raise Too_difficult_for_html
+ | TEX_FUN2nb _::_ -> raise Too_difficult_for_html
| TEX_FUN2sq _::_ -> raise Too_difficult_for_html
| TEX_INFIX _::_ -> raise Too_difficult_for_html
| TEX_MATRIX _::_ -> raise Too_difficult_for_html
@@ -106,13 +119,23 @@ let rec html_render_table = function
| sf,false,false,[] -> mapjoin (function (u,m,d) -> m) (List.rev sf)
| sf,true,false,[] -> let ustr,mstr = List.fold_left (fun (us,ms) (u,m,d) -> (us^"<td>"^u^"</td>",ms^"<td>"^u^"</td>"))
("","") (List.rev sf) in
- "<table><tr align='center' valign='bottom'>" ^ ustr ^ "</tr><tr align='center'>" ^ mstr ^ "</tr></table>"
+ "\n<table>\n" ^
+ "\t\t<tr style='text-align: center; vertical-align: bottom;'>" ^ ustr ^ "</tr>\n" ^
+ "\t\t<tr style='text-align: center;'>" ^ mstr ^ "</tr>\n" ^
+ "</table>\n"
| sf,false,true,[] -> let mstr,dstr = List.fold_left (fun (ms,ds) (u,m,d) -> (ms^"<td>"^m^"</td>",ds^"<td>"^d^"</td>"))
("","") (List.rev sf) in
- "<table><tr align='center'>" ^ mstr ^ "</tr><tr align='center' valign='top'>" ^ dstr ^ "</tr></table>"
+ "\n<table>\n" ^
+ "\t\t<tr style='text-align: center;'>" ^ mstr ^ "</tr>\n" ^
+ "\t\t<tr style='text-align: center; vertical-align: top;'>" ^ dstr ^ "</tr>\n" ^
+ "</table>\n"
| sf,true,true,[] -> let ustr,mstr,dstr = List.fold_left (fun (us,ms,ds) (u,m,d) ->
(us^"<td>"^u^"</td>",ms^"<td>"^m^"</td>",ds^"<td>"^d^"</td>")) ("","","") (List.rev sf) in
- "<table><tr align='center' valign='bottom'>" ^ ustr ^ "</tr><tr align='center'>" ^ mstr ^ "</tr><tr align='center' valign='top'>" ^ dstr ^ "</tr></table>"
+ "\n<table>\n" ^
+ "\t\t<tr style='text-align: center; vertical-align: bottom;'>" ^ ustr ^ "</tr>\n" ^
+ "\t\t<tr style='text-align: center;'>" ^ mstr ^ "</tr>\n" ^
+ "\t\t<tr style='text-align: center; vertical-align: top;'>" ^ dstr ^ "</tr>\n" ^
+ "</table>\n"
let html_render tree = html_render_table ([],false,false,html_render_deep CTX_NORMAL tree)
diff --git a/math/lexer.mll b/math/lexer.mll
index e5bb1ddf..4dd31e0e 100644
--- a/math/lexer.mll
+++ b/math/lexer.mll
@@ -16,6 +16,10 @@ let aboxchars = ['0'-'9' 'a'-'z' 'A'-'Z' '+' '-' '*' ',' '=' '(' ')' ':' '/' ';'
rule token = parse
space + { token lexbuf }
+ | "\\text" space * '{' boxchars + '}'
+ { Texutil.tex_use_ams (); let str = Lexing.lexeme lexbuf in
+ let n = String.index str '{' + 1 in
+ BOX ("\\text", String.sub str n (String.length str - n - 1)) }
| "\\mbox" space * '{' aboxchars + '}'
{ let str = Lexing.lexeme lexbuf in
let n = String.index str '{' + 1 in
@@ -52,6 +56,8 @@ rule token = parse
| delimiter_uf_op { let str = Lexing.lexeme lexbuf in DELIMITER (MHTMLABLEC (FONT_UFH, str," "^str^" ",MO,str)) }
| "\\" alpha + { Texutil.find (Lexing.lexeme lexbuf) }
| "\\sqrt" space * "[" { FUN_AR1opt "\\sqrt" }
+ | "\\xleftarrow" space * "[" { Texutil.tex_use_ams(); FUN_AR1opt "\\xleftarrow" }
+ | "\\xrightarrow" space * "[" { Texutil.tex_use_ams(); FUN_AR1opt "\\xrightarrow" }
| "\\," { LITERAL (HTMLABLE (FONT_UF, "\\,","&nbsp;")) }
| "\\ " { LITERAL (HTMLABLE (FONT_UF, "\\ ","&nbsp;")) }
| "\\;" { LITERAL (HTMLABLE (FONT_UF, "\\;","&nbsp;")) }
@@ -77,6 +83,14 @@ rule token = parse
| "\\end{vmatrix}" { END_VMATRIX }
| "\\begin{Vmatrix}" { Texutil.tex_use_ams(); BEGIN_VVMATRIX }
| "\\end{Vmatrix}" { END_VVMATRIX }
+ | "\\begin{array}" { Texutil.tex_use_ams(); BEGIN_ARRAY }
+ | "\\end{array}" { END_ARRAY }
+ | "\\begin{align}" { Texutil.tex_use_ams(); BEGIN_ALIGN }
+ | "\\end{align}" { END_ALIGN }
+ | "\\begin{alignat}" { Texutil.tex_use_ams(); BEGIN_ALIGNAT }
+ | "\\end{alignat}" { END_ALIGNAT }
+ | "\\begin{smallmatrix}" { Texutil.tex_use_ams(); BEGIN_SMALLMATRIX }
+ | "\\end{smallmatrix}" { END_SMALLMATRIX }
| "\\begin{cases}" { Texutil.tex_use_ams(); BEGIN_CASES }
| "\\end{cases}" { END_CASES }
| '>' { LITERAL (HTMLABLEC(FONT_UFH,">"," &gt; ")) }
diff --git a/math/parser.mly b/math/parser.mly
index 4787db37..29882fb4 100644
--- a/math/parser.mly
+++ b/math/parser.mly
@@ -5,17 +5,16 @@
let sq_close_ri = HTMLABLEC(FONT_UFH,"]", "]")
%}
%token <Render_info.t> LITERAL DELIMITER
-%token <string> FUN_AR2 FUN_INFIX FUN_AR1 DECL FUN_AR1opt BIG
+%token <string> FUN_AR2 FUN_INFIX FUN_AR1 DECL FUN_AR1opt BIG FUN_AR2nb
%token <string*string> BOX
%token <string*(string*string)> FUN_AR1hl
%token <string*Render_info.font_force> FUN_AR1hf DECLh
%token <string*(Tex.t->Tex.t->string*string*string)> FUN_AR2h
%token <string*(Tex.t list->Tex.t list->string*string*string)> FUN_INFIXh
%token EOF CURLY_OPEN CURLY_CLOSE SUB SUP SQ_CLOSE NEXT_CELL NEXT_ROW
-%token BEGIN__MATRIX BEGIN_PMATRIX BEGIN_BMATRIX BEGIN_BBMATRIX BEGIN_VMATRIX BEGIN_VVMATRIX BEGIN_CASES
-%token END__MATRIX END_PMATRIX END_BMATRIX END_BBMATRIX END_VMATRIX END_VVMATRIX END_CASES
-%token LEFT RIGHT
-
+%token BEGIN__MATRIX BEGIN_PMATRIX BEGIN_BMATRIX BEGIN_BBMATRIX BEGIN_VMATRIX BEGIN_VVMATRIX BEGIN_CASES BEGIN_ARRAY BEGIN_ALIGN BEGIN_ALIGNAT BEGIN_SMALLMATRIX
+%token END__MATRIX END_PMATRIX END_BMATRIX END_BBMATRIX END_VMATRIX END_VVMATRIX END_CASES END_ARRAY END_ALIGN END_ALIGNAT END_SMALLMATRIX
+%token LEFT RIGHT
%type <Tex.t list> tex_expr
%start tex_expr
@@ -54,14 +53,25 @@ lit_aq:
lit { $1 }
| lit_dq { let base,downi = $1 in TEX_DQ(base,downi) }
| lit_uq { let base,upi = $1 in TEX_UQ(base,upi)}
+ | lit_dqn { TEX_DQN($1) }
+ | lit_uqn { TEX_UQN($1) }
| lit_fq { $1 }
+
lit_fq:
lit_dq SUP lit { let base,downi = $1 in TEX_FQ(base,downi,$3) }
| lit_uq SUB lit { let base,upi = $1 in TEX_FQ(base,$3,upi) }
+ | lit_dqn SUP lit { TEX_FQN($1, $3) }
+
lit_uq:
lit SUP lit { $1,$3 }
lit_dq:
lit SUB lit { $1,$3 }
+lit_uqn:
+ SUP lit { $2 }
+lit_dqn:
+ SUB lit { $2 }
+
+
left:
LEFT DELIMITER { $2 }
| LEFT SQ_CLOSE { sq_close_ri }
@@ -79,6 +89,7 @@ lit:
| FUN_AR1hf lit { let t,h=$1 in TEX_FUN1hf(t,h,$2) }
| FUN_AR1opt expr_nosqc SQ_CLOSE lit { TEX_FUN2sq($1,TEX_CURLY $2,$4) }
| FUN_AR2 lit lit { TEX_FUN2($1,$2,$3) }
+ | FUN_AR2nb lit lit { TEX_FUN2nb($1,$2,$3) }
| FUN_AR2h lit lit { let t,h=$1 in TEX_FUN2h(t,h,$2,$3) }
| BOX { let bt,s = $1 in TEX_BOX (bt,s) }
| CURLY_OPEN expr CURLY_CLOSE
@@ -93,6 +104,10 @@ lit:
| BEGIN_BBMATRIX matrix END_BBMATRIX { TEX_MATRIX ("Bmatrix", $2) }
| BEGIN_VMATRIX matrix END_VMATRIX { TEX_MATRIX ("vmatrix", $2) }
| BEGIN_VVMATRIX matrix END_VVMATRIX { TEX_MATRIX ("Vmatrix", $2) }
+ | BEGIN_ARRAY matrix END_ARRAY { TEX_MATRIX ("array", $2) }
+ | BEGIN_ALIGN matrix END_ALIGN { TEX_MATRIX ("aligned", $2) }
+ | BEGIN_ALIGNAT matrix END_ALIGNAT { TEX_MATRIX ("alignedat", $2) }
+ | BEGIN_SMALLMATRIX matrix END_SMALLMATRIX { TEX_MATRIX ("smallmatrix", $2) }
| BEGIN_CASES matrix END_CASES { TEX_MATRIX ("cases", $2) }
matrix:
line { [$1] }
diff --git a/math/tex.mli b/math/tex.mli
index 9e6013df..f2ed37cf 100644
--- a/math/tex.mli
+++ b/math/tex.mli
@@ -4,11 +4,15 @@ type t =
| TEX_FQ of t * t * t
| TEX_DQ of t * t
| TEX_UQ of t * t
+ | TEX_FQN of t * t
+ | TEX_DQN of t
+ | TEX_UQN of t
| TEX_LR of Render_info.t * Render_info.t * t list
| TEX_BOX of string * string
| TEX_BIG of string * Render_info.t
| TEX_FUN1 of string * t
| TEX_FUN2 of string * t * t
+ | TEX_FUN2nb of string * t * t
| TEX_INFIX of string * t list * t list
| TEX_FUN2sq of string * t * t
| TEX_FUN1hl of string * (string * string) * t
diff --git a/math/texutil.ml b/math/texutil.ml
index b4cd268c..f9ebb258 100644
--- a/math/texutil.ml
+++ b/math/texutil.ml
@@ -14,12 +14,16 @@ let rec render_tex = function
TEX_FQ (a,b,c) -> (render_tex a) ^ "_{" ^ (render_tex b) ^ "}^{" ^ (render_tex c) ^ "}"
| TEX_DQ (a,b) -> (render_tex a) ^ "_{" ^ (render_tex b) ^ "}"
| TEX_UQ (a,b) -> (render_tex a) ^ "^{" ^ (render_tex b) ^ "}"
+ | TEX_FQN (a,b) -> "_{" ^ (render_tex a) ^ "}^{" ^ (render_tex b) ^ "}"
+ | TEX_DQN (a) -> "_{" ^ (render_tex a) ^ "}"
+ | TEX_UQN (a) -> "^{" ^ (render_tex a) ^ "}"
| TEX_LITERAL s -> tex_part s
| TEX_FUN1 (f,a) -> "{" ^ f ^ " " ^ (render_tex a) ^ "}"
| TEX_FUN1hl (f,_,a) -> "{" ^ f ^ " " ^ (render_tex a) ^ "}"
| TEX_FUN1hf (f,_,a) -> "{" ^ f ^ " " ^ (render_tex a) ^ "}"
| TEX_DECLh (f,_,a) -> "{" ^ f ^ "{" ^ (mapjoin render_tex a) ^ "}}"
| TEX_FUN2 (f,a,b) -> "{" ^ f ^ " " ^ (render_tex a) ^ (render_tex b) ^ "}"
+ | TEX_FUN2nb (f,a,b) -> f ^ (render_tex a) ^ (render_tex b)
| TEX_FUN2h (f,_,a,b) -> "{" ^ f ^ " " ^ (render_tex a) ^ (render_tex b) ^ "}"
| TEX_FUN2sq (f,a,b) -> "{" ^ f ^ "[ " ^ (render_tex a) ^ "]" ^ (render_tex b) ^ "}"
| TEX_CURLY (tl) -> "{" ^ (mapjoin render_tex tl) ^ "}"
@@ -30,6 +34,7 @@ let rec render_tex = function
| TEX_MATRIX (t,rows) -> "{\\begin{"^t^"}"^(mapjoine "\\\\" (mapjoine "&" (mapjoin render_tex)) rows)^"\\end{"^t^"}}"
| TEX_LR (l,r,tl) -> "\\left "^(tex_part l)^(mapjoin render_tex tl)^"\\right "^(tex_part r)
+
(* Dynamic loading*)
type encoding_t = LATIN1 | LATIN2 | UTF8
@@ -66,59 +71,71 @@ exception Illegal_tex_function of string
let find = function
"\\alpha" -> LITERAL (HTMLABLEC (FONT_UF, "\\alpha ", "&alpha;"))
- | "\\Alpha" -> LITERAL (HTMLABLEC (FONT_RTI, "A", "&Alpha;"))
+ | "\\Alpha" -> (tex_use_ams (); LITERAL (HTMLABLEC (FONT_UF,
+ "\\mathrm{A}", "&Alpha;")))
| "\\beta" -> LITERAL (HTMLABLEC (FONT_UF, "\\beta ", "&beta;"))
- | "\\Beta" -> LITERAL (HTMLABLEC (FONT_RTI, "B", "&Beta;"))
+ | "\\Beta" -> (tex_use_ams (); LITERAL (HTMLABLEC (FONT_UF,
+ "\\mathrm{B}", "&Beta;")))
| "\\gamma" -> LITERAL (HTMLABLEC (FONT_UF, "\\gamma ", "&gamma;"))
- | "\\Gamma" -> LITERAL (HTMLABLEC (FONT_RTI, "\\Gamma ", "&Gamma;"))
+ | "\\Gamma" -> LITERAL (HTMLABLEC (FONT_UF, "\\Gamma ", "&Gamma;"))
| "\\delta" -> LITERAL (HTMLABLEC (FONT_UF, "\\delta ", "&delta;"))
- | "\\Delta" -> LITERAL (HTMLABLEC (FONT_RTI, "\\Delta ", "&Delta;"))
+ | "\\Delta" -> LITERAL (HTMLABLEC (FONT_UF, "\\Delta ", "&Delta;"))
| "\\epsilon" -> LITERAL (HTMLABLEC (FONT_UF, "\\epsilon ", "&epsilon;"))
- | "\\Epsilon" -> LITERAL (HTMLABLEC (FONT_RTI, "E", "&Epsilon;"))
+ | "\\Epsilon" -> (tex_use_ams (); LITERAL (HTMLABLEC (FONT_UF,
+ "\\mathrm{E}", "&Epsilon;")))
| "\\varepsilon" -> LITERAL (TEX_ONLY "\\varepsilon ")
| "\\zeta" -> LITERAL (HTMLABLEC (FONT_UF, "\\zeta ", "&zeta;"))
- | "\\Zeta" -> LITERAL (HTMLABLEC (FONT_RTI, "Z", "&Zeta;"))
+ | "\\Zeta" -> (tex_use_ams (); LITERAL (HTMLABLEC (FONT_UF,
+ "\\mathrm{Z}", "&Zeta;")))
| "\\eta" -> LITERAL (HTMLABLEC (FONT_UF, "\\eta ", "&eta;"))
- | "\\Eta" -> LITERAL (HTMLABLEC (FONT_RTI, "H", "&Eta;"))
+ | "\\Eta" -> (tex_use_ams (); LITERAL (HTMLABLEC (FONT_UF,
+ "\\mathrm{H}", "&Eta;")))
| "\\theta" -> LITERAL (HTMLABLEC (FONT_UF, "\\theta ", "&theta;"))
- | "\\Theta" -> LITERAL (HTMLABLEC (FONT_RTI, "\\Theta ", "&Theta;"))
+ | "\\Theta" -> LITERAL (HTMLABLEC (FONT_UF, "\\Theta ", "&Theta;"))
| "\\vartheta" -> LITERAL (HTMLABLE (FONT_UF, "\\vartheta ", "&thetasym;"))
| "\\thetasym" -> LITERAL (HTMLABLE (FONT_UF, "\\vartheta ", "&thetasym;"))
| "\\iota" -> LITERAL (HTMLABLEC (FONT_UF, "\\iota ", "&iota;"))
- | "\\Iota" -> LITERAL (HTMLABLEC (FONT_RTI, "I", "&Iota;"))
+ | "\\Iota" -> (tex_use_ams (); LITERAL (HTMLABLEC (FONT_UF,
+ "\\mathrm{I}", "&Iota;")))
| "\\kappa" -> LITERAL (HTMLABLEC (FONT_UF, "\\kappa ", "&kappa;"))
- | "\\Kappa" -> LITERAL (HTMLABLEC (FONT_RTI, "K", "&Kappa;"))
+ | "\\Kappa" -> (tex_use_ams (); LITERAL (HTMLABLEC (FONT_UF,
+ "\\mathrm{K}", "&Kappa;")))
| "\\lambda" -> LITERAL (HTMLABLEC (FONT_UF, "\\lambda ", "&lambda;"))
- | "\\Lambda" -> LITERAL (HTMLABLEC (FONT_RTI, "\\Lambda ", "&Lambda;"))
+ | "\\Lambda" -> LITERAL (HTMLABLEC (FONT_UF, "\\Lambda ", "&Lambda;"))
| "\\mu" -> LITERAL (HTMLABLEC (FONT_UF, "\\mu ", "&mu;"))
- | "\\Mu" -> LITERAL (HTMLABLEC (FONT_RTI, "M", "&Mu;"))
+ | "\\Mu" -> (tex_use_ams (); LITERAL (HTMLABLEC (FONT_UF,
+ "\\mathrm{M}", "&Mu;")))
| "\\nu" -> LITERAL (HTMLABLEC (FONT_UF, "\\nu ", "&nu;"))
- | "\\Nu" -> LITERAL (HTMLABLEC (FONT_RTI, "N", "&Nu;"))
+ | "\\Nu" -> (tex_use_ams (); LITERAL (HTMLABLEC (FONT_UF,
+ "\\mathrm{N}", "&Nu;")))
| "\\pi" -> LITERAL (HTMLABLEC (FONT_UF, "\\pi ", "&pi;"))
- | "\\Pi" -> LITERAL (HTMLABLEC (FONT_RTI, "\\Pi ", "&Pi;"))
+ | "\\Pi" -> LITERAL (HTMLABLEC (FONT_UF, "\\Pi ", "&Pi;"))
| "\\varpi" -> LITERAL (TEX_ONLY "\\varpi ")
| "\\rho" -> LITERAL (HTMLABLEC (FONT_UF, "\\rho ", "&rho;"))
- | "\\Rho" -> LITERAL (HTMLABLEC (FONT_RTI, "P", "&Rho;"))
+ | "\\Rho" -> (tex_use_ams (); LITERAL (HTMLABLEC (FONT_UF,
+ "\\mathrm{P}", "&Rho;")))
| "\\varrho" -> LITERAL (TEX_ONLY "\\varrho ")
| "\\sim" -> LITERAL (HTMLABLEC (FONT_UF, "\\sim ", "&tilde;"))
| "\\sigma" -> LITERAL (HTMLABLEC (FONT_UF, "\\sigma ", "&sigma;"))
- | "\\Sigma" -> LITERAL (HTMLABLEC (FONT_RTI, "\\Sigma ", "&Sigma;"))
+ | "\\Sigma" -> LITERAL (HTMLABLEC (FONT_UF, "\\Sigma ", "&Sigma;"))
| "\\varsigma" -> LITERAL (TEX_ONLY "\\varsigma ")
| "\\tau" -> LITERAL (HTMLABLEC (FONT_UF, "\\tau ", "&tau;"))
- | "\\Tau" -> LITERAL (HTMLABLEC (FONT_RTI, "T", "&Tau;"))
+ | "\\Tau" -> (tex_use_ams (); LITERAL (HTMLABLEC (FONT_UF,
+ "\\mathrm{T}", "&Tau;")))
| "\\upsilon" -> LITERAL (HTMLABLEC (FONT_UF, "\\upsilon ", "&upsilon;"))
- | "\\Upsilon" -> LITERAL (HTMLABLEC (FONT_RTI, "\\Upsilon ", "&Upsilon;"))
+ | "\\Upsilon" -> LITERAL (HTMLABLEC (FONT_UF, "\\Upsilon ", "&Upsilon;"))
| "\\phi" -> LITERAL (HTMLABLEC (FONT_UF, "\\phi ", "&phi;"))
- | "\\Phi" -> LITERAL (HTMLABLEC (FONT_RTI, "\\Phi ", "&Phi;"))
+ | "\\Phi" -> LITERAL (HTMLABLEC (FONT_UF, "\\Phi ", "&Phi;"))
| "\\varphi" -> LITERAL (TEX_ONLY "\\varphi ")
| "\\chi" -> LITERAL (HTMLABLEC (FONT_UF, "\\chi ", "&chi;"))
- | "\\Chi" -> LITERAL (HTMLABLEC (FONT_RTI, "X", "&Chi;"))
+ | "\\Chi" -> (tex_use_ams (); LITERAL (HTMLABLEC (FONT_UF,
+ "\\mathrm{X}", "&Chi;")))
| "\\psi" -> LITERAL (HTMLABLEC (FONT_UF, "\\psi ", "&psi;"))
- | "\\Psi" -> LITERAL (HTMLABLEC (FONT_RTI, "\\Psi ", "&Psi;"))
+ | "\\Psi" -> LITERAL (HTMLABLEC (FONT_UF, "\\Psi ", "&Psi;"))
| "\\omega" -> LITERAL (HTMLABLEC (FONT_UF, "\\omega ", "&omega;"))
- | "\\Omega" -> LITERAL (HTMLABLEC (FONT_RTI, "\\Omega ", "&Omega;"))
+ | "\\Omega" -> LITERAL (HTMLABLEC (FONT_UF, "\\Omega ", "&Omega;"))
| "\\xi" -> LITERAL (HTMLABLEC (FONT_UF, "\\xi ", "&xi;"))
- | "\\Xi" -> LITERAL (HTMLABLEC (FONT_RTI, "\\Xi ", "&Xi;"))
+ | "\\Xi" -> LITERAL (HTMLABLEC (FONT_UF, "\\Xi ", "&Xi;"))
| "\\aleph" -> LITERAL (HTMLABLE (FONT_UF, "\\aleph ", "&alefsym;"))
| "\\alef" -> LITERAL (HTMLABLE (FONT_UF, "\\aleph ", "&alefsym;"))
| "\\alefsym" -> LITERAL (HTMLABLE (FONT_UF, "\\aleph ", "&alefsym;"))
@@ -158,6 +175,8 @@ let find = function
| "\\lrcorner" -> (tex_use_ams (); DELIMITER (TEX_ONLY "\\lrcorner "))
| "\\twoheadleftarrow" -> (tex_use_ams (); DELIMITER (TEX_ONLY "\\twoheadleftarrow "))
| "\\twoheadrightarrow" -> (tex_use_ams (); DELIMITER (TEX_ONLY "\\twoheadrightarrow "))
+ | "\\xleftarrow" -> (tex_use_ams (); FUN_AR1 "\\xleftarrow ")
+ | "\\xrightarrow" -> (tex_use_ams (); FUN_AR1 "\\xrightarrow ")
| "\\rightleftharpoons" -> DELIMITER (TEX_ONLY "\\rightleftharpoons ")
| "\\leftrightarrow" -> LITERAL (HTMLABLE (FONT_UF, "\\leftrightarrow ", "&harr;"))
| "\\lrarr" -> LITERAL (HTMLABLE (FONT_UF, "\\leftrightarrow ", "&harr;"))
@@ -167,6 +186,7 @@ let find = function
| "\\Harr" -> LITERAL (HTMLABLE (FONT_UF, "\\Leftrightarrow ", "&hArr;"))
| "\\lrArr" -> LITERAL (HTMLABLE (FONT_UF, "\\Leftrightarrow ", "&hArr;"))
| "\\hAar" -> LITERAL (HTMLABLE (FONT_UF, "\\Leftrightarrow ", "&hArr;"))
+ | "\\longleftrightarrow"->LITERAL (HTMLABLE (FONT_UF, "\\longleftrightarrow ", "&harr;"))
| "\\Longleftrightarrow"->LITERAL (HTMLABLE (FONT_UF, "\\Longleftrightarrow ", "&harr;"))
| "\\iff" -> LITERAL (HTMLABLE (FONT_UF, "\\iff ", "&harr;"))
| "\\ll" -> LITERAL (TEX_ONLY "\\ll ")
@@ -177,6 +197,7 @@ let find = function
| "\\swarrow" -> LITERAL (TEX_ONLY "\\swarrow ")
| "\\nwarrow" -> LITERAL (TEX_ONLY "\\nwarrow ")
| "\\simeq" -> LITERAL (TEX_ONLY "\\simeq ")
+ | "\\ast" -> LITERAL (TEX_ONLY "\\ast ")
| "\\star" -> LITERAL (TEX_ONLY "\\star ")
| "\\ell" -> LITERAL (TEX_ONLY "\\ell ")
| "\\P" -> LITERAL (TEX_ONLY "\\P ")
@@ -214,6 +235,7 @@ let find = function
| "\\circ" -> LITERAL (TEX_ONLY "\\circ ")
| "\\hbar" -> LITERAL (TEX_ONLY "\\hbar ")
| "\\imath" -> LITERAL (TEX_ONLY "\\imath ")
+ | "\\jmath" -> LITERAL (TEX_ONLY "\\jmath ")
| "\\lnot" -> LITERAL (TEX_ONLY "\\lnot ")
| "\\hookrightarrow" -> LITERAL (TEX_ONLY "\\hookrightarrow ")
| "\\hookleftarrow" -> LITERAL (TEX_ONLY "\\hookleftarrow ")
@@ -324,6 +346,7 @@ let find = function
| "\\otimes" -> LITERAL (HTMLABLE (FONT_UF, "\\otimes ", "&otimes;"))
| "\\cap" -> LITERAL (HTMLABLEM(FONT_UF, "\\cap ", "&cap;"))
| "\\cup" -> LITERAL (HTMLABLE (FONT_UF, "\\cup ", "&cup;"))
+ | "\\uplus" -> LITERAL (TEX_ONLY "\\uplus ")
| "\\sqcap" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\sqcap "))
| "\\sqcup" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\sqcup "))
| "\\empty" -> LITERAL (HTMLABLE (FONT_UF, "\\emptyset ", "&empty;"))
@@ -352,6 +375,7 @@ let find = function
| "\\rang" -> DELIMITER (HTMLABLE (FONT_UFH,"\\rangle ","&rang;"))
| "\\lbrack" -> DELIMITER (HTMLABLEC(FONT_UFH,"[","["))
| "\\rbrack" -> DELIMITER (HTMLABLEC(FONT_UFH,"]","]"))
+ | "\\surd" -> LITERAL (TEX_ONLY "\\surd ")
| "\\ddots" -> LITERAL (TEX_ONLY "\\ddots ")
| "\\clubs" -> LITERAL (TEX_ONLY "\\clubsuit ")
| "\\clubsuit" -> LITERAL (TEX_ONLY "\\clubsuit ")
@@ -360,7 +384,23 @@ let find = function
| "\\hearts" -> LITERAL (TEX_ONLY "\\heartsuit ")
| "\\heartsuit" -> LITERAL (TEX_ONLY "\\heartsuit ")
| "\\diamonds" -> LITERAL (TEX_ONLY "\\diamondsuit ")
+ | "\\diamond" -> LITERAL (TEX_ONLY "\\diamond ")
+ | "\\bigtriangleup" -> LITERAL (TEX_ONLY "\\bigtriangleup ")
+ | "\\bigtriangledown" -> LITERAL (TEX_ONLY "\\bigtriangledown ")
| "\\diamondsuit" -> LITERAL (TEX_ONLY "\\diamondsuit ")
+ | "\\ominus" -> LITERAL (TEX_ONLY "\\ominus ")
+ | "\\oslash" -> LITERAL (TEX_ONLY "\\oslash ")
+ | "\\odot" -> LITERAL (TEX_ONLY "\\odot ")
+ | "\\bigcirc" -> LITERAL (TEX_ONLY "\\bigcirc ")
+ | "\\amalg" -> LITERAL (TEX_ONLY "\\amalg ")
+ | "\\prec" -> LITERAL (TEX_ONLY "\\prec ")
+ | "\\succ" -> LITERAL (TEX_ONLY "\\succ ")
+ | "\\preceq" -> LITERAL (TEX_ONLY "\\preceq ")
+ | "\\succeq" -> LITERAL (TEX_ONLY "\\succeq ")
+ | "\\dashv" -> LITERAL (TEX_ONLY "\\dashv ")
+ | "\\asymp" -> LITERAL (TEX_ONLY "\\asymp ")
+ | "\\doteq" -> LITERAL (TEX_ONLY "\\doteq ")
+ | "\\parallel" -> LITERAL (TEX_ONLY "\\parallel ")
| "\\implies" -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UF, "\\implies ", "&rArr;")))
| "\\mod" -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UFH,"\\mod ", "mod")))
| "\\Diamond" -> (tex_use_ams (); LITERAL (HTMLABLE (FONT_UF, "\\Diamond ", "&loz;")))
@@ -391,6 +431,7 @@ let find = function
| "\\Box" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Box "))
| "\\nleq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nleq "))
| "\\upharpoonright" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\upharpoonright "))
+ | "\\restriction" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\upharpoonright "))
| "\\upharpoonleft" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\upharpoonleft "))
| "\\downharpoonright" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\downharpoonright "))
| "\\downharpoonleft" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\downharpoonleft "))
@@ -425,14 +466,14 @@ let find = function
| "\\left" -> LEFT
| "\\right" -> RIGHT
| "\\hat" -> FUN_AR1 "\\hat "
- | "\\widehat" -> FUN_AR1 "\\widehat "
- | "\\overline" -> FUN_AR1 "\\overline "
- | "\\overbrace" -> FUN_AR1 "\\overbrace "
- | "\\underline" -> FUN_AR1 "\\underline "
- | "\\underbrace" -> FUN_AR1 "\\underbrace "
- | "\\overleftarrow" -> FUN_AR1 "\\overleftarrow "
- | "\\overrightarrow" -> FUN_AR1 "\\overrightarrow "
- | "\\overleftrightarrow"->FUN_AR1 "\\overleftrightarrow "
+ | "\\widehat" -> LITERAL (TEX_ONLY "\\widehat ")
+ | "\\overline" -> LITERAL (TEX_ONLY "\\overline ")
+ | "\\overbrace" -> LITERAL (TEX_ONLY "\\overbrace ")
+ | "\\underline" -> LITERAL (TEX_ONLY "\\underline ")
+ | "\\underbrace" -> LITERAL (TEX_ONLY "\\underbrace ")
+ | "\\overleftarrow" -> LITERAL (TEX_ONLY "\\overleftarrow ")
+ | "\\overrightarrow" -> LITERAL (TEX_ONLY "\\overrightarrow ")
+ | "\\overleftrightarrow"->LITERAL (TEX_ONLY "\\overleftrightarrow ")
| "\\check" -> FUN_AR1 "\\check "
| "\\acute" -> FUN_AR1 "\\acute "
| "\\grave" -> FUN_AR1 "\\grave "
@@ -445,9 +486,16 @@ let find = function
| "\\not" -> LITERAL (TEX_ONLY "\\not ")
| "\\choose" -> FUN_INFIX "\\choose "
| "\\atop" -> FUN_INFIX "\\atop "
- | "\\binom" -> FUN_AR2 "\\binom "
+ | "\\binom" -> (tex_use_ams (); FUN_AR2 "\\binom ")
+ | "\\dbinom" -> (tex_use_ams (); FUN_AR2 "\\dbinom ")
+ | "\\tbinom" -> (tex_use_ams (); FUN_AR2 "\\tbinom ")
| "\\stackrel" -> FUN_AR2 "\\stackrel "
+ | "\\sideset" -> (tex_use_ams (); FUN_AR2nb "\\sideset ")
+ | "\\underset" -> (tex_use_ams (); FUN_AR2 "\\underset ")
+ | "\\overset" -> (tex_use_ams (); FUN_AR2 "\\overset ")
| "\\frac" -> FUN_AR2h ("\\frac ", fun num den -> Html.html_render [num], "<hr style=\"{background: black}\"/>", Html.html_render [den])
+ | "\\dfrac" -> (tex_use_ams () ; FUN_AR2 "\\dfrac ")
+ | "\\tfrac" -> (tex_use_ams () ; FUN_AR2h ("\\tfrac ", fun num den -> Html.html_render [num], "<hr style=\"background: black\">", Html.html_render [den]))
| "\\cfrac" -> (tex_use_ams (); FUN_AR2h ("\\cfrac ", fun num den -> Html.html_render [num], "<hr style=\"{background: black}\">", Html.html_render [den]))
| "\\over" -> FUN_INFIXh ("\\over ", fun num den -> Html.html_render num, "<hr style=\"{background: black}\"/>", Html.html_render den)
| "\\sqrt" -> FUN_AR1 "\\sqrt "
@@ -470,6 +518,188 @@ let find = function
| "\\Big" -> BIG "\\Big "
| "\\bigg" -> BIG "\\bigg "
| "\\Bigg" -> BIG "\\Bigg "
+ | "\\bigl" -> (tex_use_ams ();BIG "\\bigl ")
+ | "\\bigr" -> (tex_use_ams ();BIG "\\bigr ")
+ | "\\Bigl" -> (tex_use_ams ();BIG "\\Bigl ")
+ | "\\Bigr" -> (tex_use_ams ();BIG "\\Bigr ")
+ | "\\biggl" -> (tex_use_ams ();BIG "\\biggl ")
+ | "\\biggr" -> (tex_use_ams ();BIG "\\biggr ")
+ | "\\Biggl" -> (tex_use_ams ();BIG "\\Biggl ")
+ | "\\Biggr" -> (tex_use_ams ();BIG "\\Biggr ")
+ | "\\vartriangle" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\vartriangle "))
+ | "\\triangledown" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\triangledown "))
+ | "\\lozenge" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lozenge "))
+ | "\\circledS" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\circledS "))
+ | "\\measuredangle" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\measuredangle "))
+ | "\\nexists" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nexists "))
+ | "\\Bbbk" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Bbbk "))
+ | "\\backprime" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\backprime "))
+ | "\\blacktriangle" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\blacktriangle "))
+ | "\\blacktriangledown"-> (tex_use_ams (); LITERAL (TEX_ONLY "\\blacktriangledown "))
+ | "\\blacksquare" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\blacksquare "))
+ | "\\blacklozenge" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\blacklozenge "))
+ | "\\bigstar" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\bigstar "))
+ | "\\sphericalangle" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\sphericalangle "))
+ | "\\diagup" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\diagup "))
+ | "\\diagdown" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\diagdown "))
+ | "\\dotplus" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\dotplus "))
+ | "\\Cap" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Cap "))
+ | "\\doublecap" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Cap "))
+ | "\\Cup" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Cup "))
+ | "\\doublecup" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Cup "))
+ | "\\barwedge" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\barwedge "))
+ | "\\veebar" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\veebar "))
+ | "\\doublebarwedge" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\doublebarwedge "))
+ | "\\boxminus" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\boxminus "))
+ | "\\boxtimes" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\boxtimes "))
+ | "\\boxdot" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\boxdot "))
+ | "\\boxplus" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\boxplus "))
+ | "\\divideontimes" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\divideontimes "))
+ | "\\ltimes" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ltimes "))
+ | "\\rtimes" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\rtimes "))
+ | "\\leftthreetimes" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\leftthreetimes "))
+ | "\\rightthreetimes" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\rightthreetimes "))
+ | "\\curlywedge" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\curlywedge "))
+ | "\\curlyvee" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\curlyvee "))
+ | "\\circleddash" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\circleddash "))
+ | "\\circledast" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\circledast "))
+ | "\\circledcirc" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\circledcirc "))
+ | "\\centerdot" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\centerdot "))
+ | "\\intercal" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\intercal "))
+ | "\\leqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\leqq "))
+ | "\\leqslant" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\leqslant "))
+ | "\\eqslantless" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\eqslantless "))
+ | "\\lessapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lessapprox "))
+ | "\\approxeq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\approxeq "))
+ | "\\lessdot" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lessdot "))
+ | "\\lll" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lll "))
+ | "\\lessgtr" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lessgtr "))
+ | "\\lesseqgtr" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lesseqgtr "))
+ | "\\lesseqqgtr" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lesseqqgtr "))
+ | "\\doteqdot" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\doteqdot "))
+ | "\\Doteq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\doteqdot "))
+ | "\\risingdotseq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\risingdotseq "))
+ | "\\fallingdotseq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\fallingdotseq "))
+ | "\\backsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\backsim "))
+ | "\\backsimeq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\backsimeq "))
+ | "\\subseteqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\subseteqq "))
+ | "\\Subset" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Subset "))
+ | "\\preccurlyeq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\preccurlyeq "))
+ | "\\curlyeqprec" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\curlyeqprec "))
+ | "\\precsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\precsim "))
+ | "\\precapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\precapprox "))
+ | "\\vartriangleleft" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\vartriangleleft "))
+ | "\\Vvdash" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Vvdash "))
+ | "\\bumpeq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\bumpeq "))
+ | "\\Bumpeq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Bumpeq "))
+ | "\\geqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\geqq "))
+ | "\\geqslant" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\geqslant "))
+ | "\\eqslantgtr" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\eqslantgtr "))
+ | "\\gtrsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gtrsim "))
+ | "\\gtrapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gtrapprox "))
+ | "\\eqsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\eqsim "))
+ | "\\gtrdot" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gtrdot "))
+ | "\\ggg" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ggg "))
+ | "\\gggtr" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ggg "))
+ | "\\gtrless" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gtrless "))
+ | "\\gtreqless" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gtreqless "))
+ | "\\gtreqqless" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gtreqqless "))
+ | "\\eqcirc" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\eqcirc "))
+ | "\\circeq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\circeq "))
+ | "\\triangleq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\triangleq "))
+ | "\\thicksim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\thicksim "))
+ | "\\thickapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\thickapprox "))
+ | "\\supseteqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\supseteqq "))
+ | "\\Supset" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Supset "))
+ | "\\succcurlyeq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\succcurlyeq "))
+ | "\\curlyeqsucc" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\curlyeqsucc "))
+ | "\\succsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\succsim "))
+ | "\\succapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\succapprox "))
+ | "\\vartriangleright" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\vartriangleright "))
+ | "\\shortmid" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\shortmid "))
+ | "\\shortparallel" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\shortparallel "))
+ | "\\between" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\between "))
+ | "\\pitchfork" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\pitchfork "))
+ | "\\varpropto" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\varpropto "))
+ | "\\blacktriangleleft"-> (tex_use_ams (); LITERAL (TEX_ONLY "\\blacktriangleleft "))
+ | "\\therefore" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\therefore "))
+ | "\\backepsilon" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\backepsilon "))
+ | "\\blacktriangleright"-> (tex_use_ams (); LITERAL (TEX_ONLY "\\blacktriangleright "))
+ | "\\because" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\because "))
+ | "\\nleqslant" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nleqslant "))
+ | "\\nleqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nleqq "))
+ | "\\lneq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lneq "))
+ | "\\lneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lneqq "))
+ | "\\lvertneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lvertneqq "))
+ | "\\lnsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lnsim "))
+ | "\\lnapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lnapprox "))
+ | "\\nprec" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nprec "))
+ | "\\npreceq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\npreceq "))
+ | "\\precneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\precneqq "))
+ | "\\precnsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\precnsim "))
+ | "\\precnapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\precnapprox "))
+ | "\\nsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nsim "))
+ | "\\nshortmid" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nshortmid "))
+ | "\\nvdash" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nvdash "))
+ | "\\nVdash" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nVdash "))
+ | "\\ntriangleleft" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ntriangleleft "))
+ | "\\ntrianglelefteq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ntrianglelefteq "))
+ | "\\nsubseteq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nsubseteq "))
+ | "\\nsubseteqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nsubseteqq "))
+ | "\\varsubsetneq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\varsubsetneq "))
+ | "\\subsetneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\subsetneqq "))
+ | "\\varsubsetneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\varsubsetneqq "))
+ | "\\ngtr" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ngtr "))
+ | "\\ngeqslant" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ngeqslant "))
+ | "\\ngeqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ngeqq "))
+ | "\\gneq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gneq "))
+ | "\\gneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gneqq "))
+ | "\\gvertneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gvertneqq "))
+ | "\\gnsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gnsim "))
+ | "\\gnapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gnapprox "))
+ | "\\nsucc" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nsucc "))
+ | "\\nsucceq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nsucceq "))
+ | "\\succneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\succneqq "))
+ | "\\succnsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\succnsim "))
+ | "\\succnapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\succnapprox "))
+ | "\\ncong" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ncong "))
+ | "\\nshortparallel" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nshortparallel "))
+ | "\\nparallel" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nparallel "))
+ | "\\nvDash" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nvDash "))
+ | "\\nVDash" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nVDash "))
+ | "\\ntriangleright" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ntriangleright "))
+ | "\\ntrianglerighteq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ntrianglerighteq "))
+ | "\\nsupseteq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nsupseteq "))
+ | "\\nsupseteqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nsupseteqq "))
+ | "\\varsupsetneq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\varsupsetneq "))
+ | "\\supsetneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\supsetneqq "))
+ | "\\varsupsetneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\varsupsetneqq "))
+ | "\\leftleftarrows" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\leftleftarrows "))
+ | "\\leftrightarrows" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\leftrightarrows "))
+ | "\\Lleftarrow" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Lleftarrow "))
+ | "\\leftarrowtail" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\leftarrowtail "))
+ | "\\looparrowleft" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\looparrowleft "))
+ | "\\leftrightharpoons"-> (tex_use_ams (); LITERAL (TEX_ONLY "\\leftrightharpoons "))
+ | "\\curvearrowleft" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\curvearrowleft "))
+ | "\\circlearrowleft" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\circlearrowleft "))
+ | "\\Lsh" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Lsh "))
+ | "\\upuparrows" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\upuparrows "))
+ | "\\rightrightarrows" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\rightrightarrows "))
+ | "\\rightleftarrows" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\rightleftarrows "))
+ | "\\Rrightarrow" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Rrightarrow "))
+ | "\\rightarrowtail" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\rightarrowtail "))
+ | "\\looparrowright" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\looparrowright "))
+ | "\\curvearrowright" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\curvearrowright "))
+ | "\\circlearrowright" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\circlearrowright "))
+ | "\\Rsh" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Rsh "))
+ | "\\downdownarrows" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\downdownarrows "))
+ | "\\multimap" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\multimap "))
+ | "\\leftrightsquigarrow"-> (tex_use_ams (); LITERAL (TEX_ONLY "\\leftrightsquigarrow "))
+ | "\\rightsquigarrow" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\rightsquigarrow "))
+ | "\\nLeftarrow" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nLeftarrow "))
+ | "\\nleftrightarrow" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nleftrightarrow "))
+ | "\\nRightarrow" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nRightarrow "))
+ | "\\nLeftrightarrow" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nLeftrightarrow "))
| "\\mathit" -> (tex_use_ams (); FUN_AR1hf ("\\mathit ", FONTFORCE_IT))
| "\\mathrm" -> (tex_use_ams (); FUN_AR1hf ("\\mathrm ", FONTFORCE_RM))
| "\\mathop" -> (tex_use_ams (); FUN_AR1 "\\mathop ")
@@ -482,6 +712,7 @@ let find = function
| "\\mathbb" -> (tex_use_ams (); FUN_AR1 "\\mathbb ")
| "\\mathfrak" -> (tex_use_ams (); FUN_AR1 "\\mathfrak ")
| "\\operatorname" -> (tex_use_ams (); FUN_AR1 "\\operatorname ")
+ | "\\text" -> raise (Failure "malformatted \\text")
| "\\mbox" -> raise (Failure "malformatted \\mbox")
| "\\vbox" -> raise (Failure "malformatted \\vbox")
| "\\hbox" -> raise (Failure "malformatted \\hbox")
diff --git a/math/texvc_test.ml b/math/texvc_test.ml
index 3bce5296..cd3a1dfa 100644
--- a/math/texvc_test.ml
+++ b/math/texvc_test.ml
@@ -8,7 +8,6 @@ let rec foo () =
let line = input_line stdin in
(try
let tree = Parser.tex_expr lexer_token_safe (Lexing.from_string line) in
- let out = Util.mapjoin Texutil.render_tex tree in
(match Html.render tree with
Some _ -> print_string "$^\n"
| None -> print_string "$_\n";
diff --git a/opensearch_desc.php b/opensearch_desc.php
index 59d61eee..b06b7fee 100644
--- a/opensearch_desc.php
+++ b/opensearch_desc.php
@@ -16,9 +16,12 @@ if ( !preg_match( '/^https?:/', $wgFavicon ) ) {
$favicon = htmlspecialchars( $wgFavicon );
}
-$title = Title::makeTitle( NS_SPECIAL, 'Search' );
+$title = SpecialPage::getTitleFor( 'Search' );
$template = $title->escapeFullURL( 'search={searchTerms}' );
+$suggest = htmlspecialchars($wgServer . $wgScriptPath . '/api.php?action=opensearch&search={searchTerms}');
+
+
$response = $wgRequest->response();
$response->header( 'Content-type: application/opensearchdescription+xml' );
@@ -34,6 +37,7 @@ echo <<<EOT
<Description>$siteName</Description>
<Image height="16" width="16" type="image/x-icon">$favicon</Image>
<Url type="text/html" method="get" template="$template"/>
+<Url type="application/x-suggestions+json" method="GET" template="$suggest"/>
</OpenSearchDescription>
EOT;
diff --git a/skins/CologneBlue.php b/skins/CologneBlue.php
index 08389c43..6862274a 100644
--- a/skins/CologneBlue.php
+++ b/skins/CologneBlue.php
@@ -17,8 +17,11 @@ if( !defined( 'MEDIAWIKI' ) )
*/
class SkinCologneBlue extends Skin {
+ private $searchboxes = '';
+ // How many search boxes have we made? Avoid duplicate id's.
+
function getStylesheet() {
- return "common/cologneblue.css?2";
+ return 'common/cologneblue.css';
}
function getSkinName() {
return "cologneblue";
@@ -81,7 +84,7 @@ class SkinCologneBlue extends Skin {
$s .= "<td class='bottom' align='center' valign='top'>";
$s .= $this->bottomLinks();
- $s .= "\n<br />" . $this->makeKnownLink( wfMsgForContent( "mainpage" ) ) . " | "
+ $s .= "\n<br />" . $this->makeKnownLinkObj( Title::newMainPage() ) . " | "
. $this->aboutLink() . " | "
. $this->searchForm( wfMsg( "qbfind" ) );
@@ -135,7 +138,7 @@ class SkinCologneBlue extends Skin {
}
$s = "" .
- $this->makeKnownLink( wfMsgForContent( "mainpage" ), wfMsg( "mainpage" ) )
+ $this->mainPageLink()
. " | " .
$this->makeKnownLink( wfMsgForContent( "aboutpage" ), wfMsg( "about" ) )
. " | " .
@@ -143,27 +146,19 @@ class SkinCologneBlue extends Skin {
. " | " .
$this->makeKnownLink( wfMsgForContent( "faqpage" ), wfMsg("faq") )
. " | " .
- $this->specialLink( "specialpages" ) . " | ";
+ $this->specialLink( "specialpages" );
+ /* show links to different language variants */
+ $s .= $this->variantLinks();
+ $s .= $this->extensionTabLinks();
+
+ $s .= " | ";
if ( $wgUser->isLoggedIn() ) {
$s .= $this->makeKnownLink( $lo, wfMsg( "logout" ), $q );
} else {
$s .= $this->makeKnownLink( $li, wfMsg( "login" ), $q );
}
- /* show links to different language variants */
- global $wgDisableLangConversion;
- $variants = $wgContLang->getVariants();
- if( !$wgDisableLangConversion && sizeof( $variants ) > 1 ) {
- $actstr = '';
- foreach( $variants as $code ) {
- $varname = $wgContLang->getVariantname( $code );
- if( $varname == 'disable' )
- continue;
- $s .= ' | <a href="' . $wgTitle->getLocalUrl( 'variant=' . $code ) . '">' . $varname . '</a>';
- }
- }
-
return $s;
}
@@ -259,8 +254,8 @@ class SkinCologneBlue extends Skin {
wfMsg( "mypage" ) )
. $sep . $tl
. $sep . $this->specialLink( "watchlist" )
- . $sep . $this->makeKnownLinkObj( Title::makeTitle( NS_SPECIAL, "Contributions" ),
- wfMsg( "mycontris" ), "target=" . wfUrlencode($wgUser->getName() ) )
+ . $sep . $this->makeKnownLinkObj( SpecialPage::getSafeTitleFor( "Contributions", $wgUser->getName() ),
+ wfMsg( "mycontris" ) )
. $sep . $this->specialLink( "preferences" )
. $sep . $this->specialLink( "userlogout" );
} else {
@@ -282,7 +277,7 @@ class SkinCologneBlue extends Skin {
}
$s .= $sep . $this->makeKnownLinkObj(
- Title::makeTitle( NS_SPECIAL, 'Specialpages' ),
+ SpecialPage::getTitleFor( 'Specialpages' ),
wfMsg( 'moredotdotdot' ) );
$s .= $sep . "\n</div>\n";
@@ -301,12 +296,16 @@ class SkinCologneBlue extends Skin {
$search = $wgRequest->getText( 'search' );
$action = $this->escapeSearchLink();
- $s = "<form id=\"search\" method=\"get\" class=\"inline\" action=\"$action\">";
+ $s = "<form id=\"searchform{$this->searchboxes}\" method=\"get\" class=\"inline\" action=\"$action\">";
if ( "" != $label ) { $s .= "{$label}: "; }
- $s .= "<input type='text' name=\"search\" size='14' value=\""
- . htmlspecialchars(substr($search,0,256)) . "\" />"
- . "<br /><input type='submit' name=\"go\" value=\"" . htmlspecialchars( wfMsg( "searcharticle" ) ) . "\" /> <input type='submit' name=\"fulltext\" value=\"" . htmlspecialchars( wfMsg( "search" ) ) . "\" /></form>";
+ $s .= "<input type='text' id=\"searchInput{$this->searchboxes}\" class=\"mw-searchInput\" name=\"search\" size=\"14\" value=\""
+ . htmlspecialchars(substr($search,0,256)) . "\" /><br />"
+ . "<input type='submit' id=\"searchGoButton{$this->searchboxes}\" class=\"searchButton\" name=\"go\" value=\"" . htmlspecialchars( wfMsg( "searcharticle" ) ) . "\" />"
+ . "<input type='submit' id=\"mw-searchButton{$this->searchboxes}\" class=\"searchButton\" name=\"fulltext\" value=\"" . htmlspecialchars( wfMsg( "search" ) ) . "\" /></form>";
+
+ // Ensure unique id's for search boxes made after the first
+ $this->searchboxes = $this->searchboxes == '' ? 2 : $this->searchboxes + 1;
return $s;
}
diff --git a/skins/MonoBook.php b/skins/MonoBook.php
index 698585c7..0b9619a2 100644
--- a/skins/MonoBook.php
+++ b/skins/MonoBook.php
@@ -51,23 +51,27 @@ class MonoBookTemplate extends QuickTemplate {
wfSuppressWarnings();
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php $this->text('lang') ?>" lang="<?php $this->text('lang') ?>" dir="<?php $this->text('dir') ?>">
+<html xmlns="<?php $this->text('xhtmldefaultnamespace') ?>" <?php
+ foreach($this->data['xhtmlnamespaces'] as $tag => $ns) {
+ ?>xmlns:<?php echo "{$tag}=\"{$ns}\" ";
+ } ?>xml:lang="<?php $this->text('lang') ?>" lang="<?php $this->text('lang') ?>" dir="<?php $this->text('dir') ?>">
<head>
<meta http-equiv="Content-Type" content="<?php $this->text('mimetype') ?>; charset=<?php $this->text('charset') ?>" />
<?php $this->html('headlinks') ?>
<title><?php $this->text('pagetitle') ?></title>
- <style type="text/css" media="screen,projection">/*<![CDATA[*/ @import "<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/main.css?9"; /*]]>*/</style>
- <link rel="stylesheet" type="text/css" <?php if(empty($this->data['printable']) ) { ?>media="print"<?php } ?> href="<?php $this->text('stylepath') ?>/common/commonPrint.css" />
- <!--[if lt IE 5.5000]><style type="text/css">@import "<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/IE50Fixes.css";</style><![endif]-->
- <!--[if IE 5.5000]><style type="text/css">@import "<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/IE55Fixes.css";</style><![endif]-->
- <!--[if IE 6]><style type="text/css">@import "<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/IE60Fixes.css";</style><![endif]-->
- <!--[if IE 7]><style type="text/css">@import "<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/IE70Fixes.css?1";</style><![endif]-->
- <!--[if lt IE 7]><script type="<?php $this->text('jsmimetype') ?>" src="<?php $this->text('stylepath') ?>/common/IEFixes.js"></script>
+ <style type="text/css" media="screen,projection">/*<![CDATA[*/ @import "<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/main.css?<?php echo $GLOBALS['wgStyleVersion'] ?>"; /*]]>*/</style>
+ <link rel="stylesheet" type="text/css" <?php if(empty($this->data['printable']) ) { ?>media="print"<?php } ?> href="<?php $this->text('stylepath') ?>/common/commonPrint.css?<?php echo $GLOBALS['wgStyleVersion'] ?>" />
+ <link rel="stylesheet" type="text/css" media="handheld" href="<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/handheld.css?<?php echo $GLOBALS['wgStyleVersion'] ?>" />
+ <!--[if lt IE 5.5000]><style type="text/css">@import "<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/IE50Fixes.css?<?php echo $GLOBALS['wgStyleVersion'] ?>";</style><![endif]-->
+ <!--[if IE 5.5000]><style type="text/css">@import "<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/IE55Fixes.css?<?php echo $GLOBALS['wgStyleVersion'] ?>";</style><![endif]-->
+ <!--[if IE 6]><style type="text/css">@import "<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/IE60Fixes.css?<?php echo $GLOBALS['wgStyleVersion'] ?>";</style><![endif]-->
+ <!--[if IE 7]><style type="text/css">@import "<?php $this->text('stylepath') ?>/<?php $this->text('stylename') ?>/IE70Fixes.css?<?php echo $GLOBALS['wgStyleVersion'] ?>";</style><![endif]-->
+ <!--[if lt IE 7]><script type="<?php $this->text('jsmimetype') ?>" src="<?php $this->text('stylepath') ?>/common/IEFixes.js?<?php echo $GLOBALS['wgStyleVersion'] ?>"></script>
<meta http-equiv="imagetoolbar" content="no" /><![endif]-->
<?php print Skin::makeGlobalVariablesScript( $this->data ); ?>
- <script type="<?php $this->text('jsmimetype') ?>" src="<?php $this->text('stylepath' ) ?>/common/wikibits.js?1"><!-- wikibits js --></script>
+ <script type="<?php $this->text('jsmimetype') ?>" src="<?php $this->text('stylepath' ) ?>/common/wikibits.js?<?php echo $GLOBALS['wgStyleVersion'] ?>"><!-- wikibits js --></script>
<?php if($this->data['jsvarurl' ]) { ?>
<script type="<?php $this->text('jsmimetype') ?>" src="<?php $this->text('jsvarurl' ) ?>"><!-- site js --></script>
<?php } ?>
@@ -89,7 +93,7 @@ class MonoBookTemplate extends QuickTemplate {
</head>
<body <?php if($this->data['body_ondblclick']) { ?>ondblclick="<?php $this->text('body_ondblclick') ?>"<?php } ?>
<?php if($this->data['body_onload' ]) { ?>onload="<?php $this->text('body_onload') ?>"<?php } ?>
- class="mediawiki <?php $this->text('nsclass') ?> <?php $this->text('dir') ?>">
+ class="mediawiki <?php $this->text('nsclass') ?> <?php $this->text('dir') ?> <?php $this->text('pageclass') ?>">
<div id="globalWrapper">
<div id="column-content">
<div id="content">
@@ -113,21 +117,23 @@ class MonoBookTemplate extends QuickTemplate {
<div id="column-one">
<div id="p-cactions" class="portlet">
<h5><?php $this->msg('views') ?></h5>
- <ul>
-<?php foreach($this->data['content_actions'] as $key => $tab) { ?>
- <li id="ca-<?php echo htmlspecialchars($key) ?>"<?php
- if($tab['class']) { ?> class="<?php echo htmlspecialchars($tab['class']) ?>"<?php }
- ?>><a href="<?php echo htmlspecialchars($tab['href']) ?>"><?php
- echo htmlspecialchars($tab['text']) ?></a></li>
-<?php } ?>
- </ul>
+ <div class="pBody">
+ <ul>
+ <?php foreach($this->data['content_actions'] as $key => $tab) { ?>
+ <li id="ca-<?php echo Sanitizer::escapeId($key) ?>"<?php
+ if($tab['class']) { ?> class="<?php echo htmlspecialchars($tab['class']) ?>"<?php }
+ ?>><a href="<?php echo htmlspecialchars($tab['href']) ?>"><?php
+ echo htmlspecialchars($tab['text']) ?></a></li>
+ <?php } ?>
+ </ul>
+ </div>
</div>
<div class="portlet" id="p-personal">
<h5><?php $this->msg('personaltools') ?></h5>
<div class="pBody">
<ul>
<?php foreach($this->data['personal_urls'] as $key => $item) { ?>
- <li id="pt-<?php echo htmlspecialchars($key) ?>"<?php
+ <li id="pt-<?php echo Sanitizer::escapeId($key) ?>"<?php
if ($item['active']) { ?> class="active"<?php } ?>><a href="<?php
echo htmlspecialchars($item['href']) ?>"<?php
if(!empty($item['class'])) { ?> class="<?php
@@ -144,12 +150,12 @@ class MonoBookTemplate extends QuickTemplate {
</div>
<script type="<?php $this->text('jsmimetype') ?>"> if (window.isMSIE55) fixalpha(); </script>
<?php foreach ($this->data['sidebar'] as $bar => $cont) { ?>
- <div class='portlet' id='p-<?php echo htmlspecialchars($bar) ?>'>
+ <div class='portlet' id='p-<?php echo Sanitizer::escapeId($bar) ?>'>
<h5><?php $out = wfMsg( $bar ); if (wfEmptyMsg($bar, $out)) echo $bar; else echo $out; ?></h5>
<div class='pBody'>
<ul>
<?php foreach($cont as $key => $val) { ?>
- <li id="<?php echo htmlspecialchars($val['id']) ?>"<?php
+ <li id="<?php echo Sanitizer::escapeId($val['id']) ?>"<?php
if ( $val['active'] ) { ?> class="active" <?php }
?>><a href="<?php echo htmlspecialchars($val['href']) ?>"><?php echo htmlspecialchars($val['text']) ?></a></li>
<?php } ?>
@@ -167,7 +173,7 @@ class MonoBookTemplate extends QuickTemplate {
if( isset( $this->data['search'] ) ) {
?> value="<?php $this->text('search') ?>"<?php } ?> />
<input type='submit' name="go" class="searchButton" id="searchGoButton" value="<?php $this->msg('searcharticle') ?>" />&nbsp;
- <input type='submit' name="fulltext" class="searchButton" value="<?php $this->msg('searchbutton') ?>" />
+ <input type='submit' name="fulltext" class="searchButton" id="mw-searchButton" value="<?php $this->msg('searchbutton') ?>" />
</div></form>
</div>
</div>
@@ -194,7 +200,7 @@ class MonoBookTemplate extends QuickTemplate {
<?php }
if($this->data['feeds']) { ?>
<li id="feedlinks"><?php foreach($this->data['feeds'] as $key => $feed) {
- ?><span id="feed-<?php echo htmlspecialchars($key) ?>"><a href="<?php
+ ?><span id="feed-<?php echo Sanitizer::escapeId($key) ?>"><a href="<?php
echo htmlspecialchars($feed['href']) ?>"><?php echo htmlspecialchars($feed['text'])?></a>&nbsp;</span>
<?php } ?></li><?php
}
@@ -258,7 +264,7 @@ class MonoBookTemplate extends QuickTemplate {
'privacy', 'about', 'disclaimer', 'tagline',
);
foreach( $footerlinks as $aLink ) {
- if( $this->data[$aLink] ) {
+ if( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
?> <li id="<?php echo$aLink?>"><?php $this->html($aLink) ?></li>
<?php }
}
diff --git a/skins/Nostalgia.php b/skins/Nostalgia.php
index 1b54aab9..3b19e41e 100644
--- a/skins/Nostalgia.php
+++ b/skins/Nostalgia.php
@@ -18,7 +18,7 @@ if( !defined( 'MEDIAWIKI' ) )
class SkinNostalgia extends Skin {
function getStylesheet() {
- return 'common/nostalgia.css?1';
+ return 'common/nostalgia.css';
}
function getSkinName() {
return "nostalgia";
@@ -63,11 +63,17 @@ class SkinNostalgia extends Skin {
$s .= $sep . $this->editThisPage()
. $sep . $this->historyLink();
}
+
+ /* show links to different language variants */
+ $s .= $this->variantLinks();
+ $s .= $this->extensionTabLinks();
+
if ( $wgUser->isAnon() ) {
$s .= $sep . $this->specialLink( "userlogin" );
} else {
$s .= $sep . $this->specialLink( "userlogout" );
}
+
$s .= $sep . $this->specialPagesList();
return $s;
diff --git a/skins/Standard.php b/skins/Standard.php
index 90bcfc5b..517fd194 100644
--- a/skins/Standard.php
+++ b/skins/Standard.php
@@ -21,12 +21,12 @@ class SkinStandard extends Skin {
*
*/
function getHeadScripts() {
- global $wgStylePath, $wgJsMimeType;
+ global $wgStylePath, $wgJsMimeType, $wgStyleVersion;
$s = parent::getHeadScripts();
if ( 3 == $this->qbSetting() ) { # Floating left
$s .= "<script language='javascript' type='$wgJsMimeType' " .
- "src='{$wgStylePath}/common/sticky.js'></script>\n";
+ "src='{$wgStylePath}/common/sticky.js?$wgStyleVersion'></script>\n";
}
return $s;
}
@@ -35,14 +35,14 @@ class SkinStandard extends Skin {
*
*/
function getUserStyles() {
- global $wgStylePath;
+ global $wgStylePath, $wgStyleVersion;
$s = '';
if ( 3 == $this->qbSetting() ) { # Floating left
$s .= "<style type='text/css'>\n" .
- "@import '{$wgStylePath}/common/quickbar.css';\n</style>\n";
+ "@import '{$wgStylePath}/common/quickbar.css?$wgStyleVersion';\n</style>\n";
} else if ( 4 == $this->qbSetting() ) { # Floating right
$s .= "<style type='text/css'>\n" .
- "@import '{$wgStylePath}/common/quickbar-right.css';\n</style>\n";
+ "@import '{$wgStylePath}/common/quickbar-right.css?$wgStyleVersion';\n</style>\n";
}
$s .= parent::getUserStyles();
return $s;
diff --git a/skins/chick/main.css b/skins/chick/main.css
index 5d3d15bd..b84b291e 100644
--- a/skins/chick/main.css
+++ b/skins/chick/main.css
@@ -50,16 +50,26 @@ h1, h2, h3, h4, h5, h6 {
padding-bottom: 0.17em;
border-bottom: 1px solid #aaaaaa;
}
+.editsection {
+ font-weight: normal;
+ float: right;
+ margin-left: 5px;
+}
h1 { font-size: 188%; }
+h1 .editsection { font-size: 53.2%; }
h2 { font-size: 150%; }
+h2 .editsection { font-size: 66.7%; }
h3, h4, h5, h6 {
border-bottom: none;
font-weight: bold;
}
h3 { font-size: 132%; }
+h3 .editsection { font-size: 75.8%; }
h4 { font-size: 116%; }
+h4 .editsection { font-size: 86.2%; }
h5 { font-size: 100%; }
h6 { font-size: 80%; }
+h6 .editsection { font-size: 125%; }
ul {
line-height: 1.5em;
@@ -260,6 +270,7 @@ div.floatright, table.floatright {
div.floatright p { font-style: italic; }
div.floatleft, table.floatleft {
float: left;
+ clear: left;
margin: 0.3em 0.5em 0.5em 0;
position: relative;
border: 0.5em solid White;
@@ -306,6 +317,7 @@ div.tright {
}
div.tleft {
float: left;
+ clear: left;
margin-right:0.5em;
border-width: 0.5em 1.4em 0.8em 0;
}
@@ -478,4 +490,10 @@ div.gallerytext {
#jump-to-nav {
display: none;
-} \ No newline at end of file
+}
+
+.templatesUsed { margin-top: 1.5em; }
+
+#toolbar { clear: both; }
+
+.mw-plusminus-null { color: #aaa; } \ No newline at end of file
diff --git a/skins/common/ajax.js b/skins/common/ajax.js
index 6cc652b3..40065593 100644
--- a/skins/common/ajax.js
+++ b/skins/common/ajax.js
@@ -75,7 +75,7 @@ function sajax_do_call(func_name, args, target) {
var i, x, n;
var uri;
var post_data;
- uri = wgServer + "/" + wgScriptPath + "/index.php?action=ajax";
+ uri = wgServer + wgScriptPath + "/index.php?action=ajax";
if (sajax_request_type == "GET") {
if (uri.indexOf("?") == -1)
uri = uri + "?rs=" + encodeURIComponent(func_name);
@@ -96,7 +96,14 @@ function sajax_do_call(func_name, args, target) {
return false;
}
- x.open(sajax_request_type, uri, true);
+ try {
+ x.open(sajax_request_type, uri, true);
+ } catch (e) {
+ if (window.location.hostname == "localhost") {
+ alert("Your browser blocks XMLHttpRequest to 'localhost', try using a real hostname for development/testing.");
+ }
+ throw e;
+ }
if (sajax_request_type == "POST") {
x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
diff --git a/skins/common/ajaxwatch.js b/skins/common/ajaxwatch.js
new file mode 100644
index 00000000..16e4fdc4
--- /dev/null
+++ b/skins/common/ajaxwatch.js
@@ -0,0 +1,127 @@
+// dependencies:
+// * ajax.js:
+ /*extern sajax_init_object, sajax_do_call */
+// * wikibits.js:
+ /*extern changeText, akeytt, hookEvent */
+
+// These should have been initialized in the generated js
+/*extern wgAjaxWatch, wgArticleId */
+
+if(typeof wgAjaxWatch === "undefined" || !wgAjaxWatch) {
+ var wgAjaxWatch = {
+ watchMsg: "Watch",
+ unwatchMsg: "Unwatch",
+ watchingMsg: "Watching...",
+ unwatchingMsg: "Unwatching..."
+ };
+}
+
+wgAjaxWatch.supported = true; // supported on current page and by browser
+wgAjaxWatch.watching = false; // currently watching page
+wgAjaxWatch.inprogress = false; // ajax request in progress
+wgAjaxWatch.timeoutID = null; // see wgAjaxWatch.ajaxCall
+wgAjaxWatch.watchLink1 = null; // "watch"/"unwatch" link
+wgAjaxWatch.watchLink2 = null; // second one, for (some?) non-Monobook-based
+wgAjaxWatch.oldHref = null; // url for action=watch/action=unwatch
+
+wgAjaxWatch.setLinkText = function(newText) {
+ changeText(wgAjaxWatch.watchLink1, newText);
+ if (wgAjaxWatch.watchLink2) {
+ changeText(wgAjaxWatch.watchLink2, newText);
+ }
+};
+
+wgAjaxWatch.setLinkID = function(newId) {
+ wgAjaxWatch.watchLink1.id = newId;
+ akeytt(newId); // update tooltips for Monobook
+};
+
+wgAjaxWatch.ajaxCall = function() {
+ if(!wgAjaxWatch.supported || wgAjaxWatch.inprogress) {
+ return;
+ }
+ wgAjaxWatch.inprogress = true;
+ wgAjaxWatch.setLinkText(wgAjaxWatch.watching ? wgAjaxWatch.unwatchingMsg : wgAjaxWatch.watchingMsg);
+ sajax_do_call("wfAjaxWatch", [wgArticleId, (wgAjaxWatch.watching ? "u" : "w")], wgAjaxWatch.processResult);
+ // if the request isn't done in 10 seconds, allow user to try again
+ wgAjaxWatch.timeoutID = window.setTimeout(function() { wgAjaxWatch.inprogress = false; }, 10000);
+ return;
+};
+
+wgAjaxWatch.processResult = function(request) {
+ if(!wgAjaxWatch.supported) {
+ return;
+ }
+ var response = request.responseText;
+ if(response == "<err#>") {
+ window.location.href = wgAjaxWatch.oldHref;
+ return;
+ } else if(response == "<w#>") {
+ wgAjaxWatch.watching = true;
+ wgAjaxWatch.setLinkText(wgAjaxWatch.unwatchMsg);
+ wgAjaxWatch.setLinkID("ca-unwatch");
+ wgAjaxWatch.oldHref = wgAjaxWatch.oldHref.replace(/action=watch/, "action=unwatch");
+ } else if(response == "<u#>") {
+ wgAjaxWatch.watching = false;
+ wgAjaxWatch.setLinkText(wgAjaxWatch.watchMsg);
+ wgAjaxWatch.setLinkID("ca-watch");
+ wgAjaxWatch.oldHref = wgAjaxWatch.oldHref.replace(/action=unwatch/, "action=watch");
+ }
+ wgAjaxWatch.inprogress = false;
+ if(wgAjaxWatch.timeoutID) {
+ window.clearTimeout(wgAjaxWatch.timeoutID);
+ }
+ return;
+};
+
+wgAjaxWatch.onLoad = function() {
+ var el1 = document.getElementById("ca-unwatch");
+ var el2 = null;
+ if (!el1) {
+ el1 = document.getElementById("mw-unwatch-link1");
+ el2 = document.getElementById("mw-unwatch-link2");
+ }
+ if(el1) {
+ wgAjaxWatch.watching = true;
+ } else {
+ wgAjaxWatch.watching = false;
+ el1 = document.getElementById("ca-watch");
+ if (!el1) {
+ el1 = document.getElementById("mw-watch-link1");
+ el2 = document.getElementById("mw-watch-link2");
+ }
+ if(!el1) {
+ wgAjaxWatch.supported = false;
+ return;
+ }
+ }
+
+ if(!wfSupportsAjax()) {
+ wgAjaxWatch.supported = false;
+ return;
+ }
+
+ // The id can be either for the parent (Monobook-based) or the element
+ // itself (non-Monobook)
+ wgAjaxWatch.watchLink1 = el1.tagName.toLowerCase() == "a" ? el1 : el1.firstChild;
+ wgAjaxWatch.watchLink2 = el2 ? el2 : null;
+
+ wgAjaxWatch.oldHref = wgAjaxWatch.watchLink1.getAttribute("href");
+ wgAjaxWatch.watchLink1.setAttribute("href", "javascript:wgAjaxWatch.ajaxCall()");
+ if (wgAjaxWatch.watchLink2) {
+ wgAjaxWatch.watchLink2.setAttribute("href", "javascript:wgAjaxWatch.ajaxCall()");
+ }
+ return;
+};
+
+hookEvent("load", wgAjaxWatch.onLoad);
+
+/**
+ * @return boolean whether the browser supports XMLHttpRequest
+ */
+function wfSupportsAjax() {
+ var request = sajax_init_object();
+ var supportsAjax = request ? true : false;
+ delete request;
+ return supportsAjax;
+} \ No newline at end of file
diff --git a/skins/common/cologneblue.css b/skins/common/cologneblue.css
index 33c12abb..5b6e5bca 100644
--- a/skins/common/cologneblue.css
+++ b/skins/common/cologneblue.css
@@ -1,5 +1,3 @@
-@import url("common.css?2");
-
body { margin: 0px; padding: 0px; color: black; }
#specialform { display: inline; }
#content { top: 0; margin: 0; padding: 0; }
@@ -78,8 +76,9 @@ td.bottom {
h1 {
color: #666666;
font-family: Verdana, Arial, sans-serif;
- font-size: 18pt; font-weight: bold; line-height: 21pt;
+ font-size: 180%; line-height: 21pt;
}
+h1 .editsection { font-size: 55.6%; }
h1.pagetitle { padding-bottom: 0; margin-bottom: 0; }
#article p.subtitle {
color: #666666; font-size: 11pt; font-weight: bold;
@@ -93,4 +92,5 @@ a.printable { text-decoration: underline; }
a.stub, #quickbar a.stub { color:#772233; text-decoration:none; }
a.new, #quickbar a.new { color: #CC2200; }
h2, h3, h4, h5, h6 { margin-bottom: 0; }
-small { font-size: 75%; } \ No newline at end of file
+small { font-size: 75%; }
+input.mw-searchInput { width: 106px; } \ No newline at end of file
diff --git a/skins/common/common.css b/skins/common/common.css
index e630b77e..f3e5b574 100644
--- a/skins/common/common.css
+++ b/skins/common/common.css
@@ -2,11 +2,36 @@
* common.css
* This file contains CSS settings common to Wikistandard, Nostalgia and CologneBlue
*/
+
+/* For clarity, explicitly state some recommendations from <http://www.w3.org/
+ TR/CSS21/sample.html> to make sure the editsection links scale right */
+
+h1 { font-size: 2em; }
+h2 { font-size: 1.5em; }
+h3 { font-size: 1.17em; }
+h5 { font-size: .83em; }
+h6 { font-size: .75em; }
+h1, h2, h3, h4, h5, h6 { font-weight: bolder }
+
+/* Now the custom parts */
+
+/* Make edit sections (which are inside h# tags) normal-sized */
+.editsection {
+ font-weight: normal;
+ float: right;
+ margin-left: 5px;
+}
+h1 .editsection { font-size: 50% }
+h2 .editsection { font-size: 66.7% }
+h3 .editsection { font-size: 85.5% }
+h5 .editsection { font-size: 120% }
+h6 .editsection { font-size: 133% }
+
#footer { clear: both }
/* images */
-div.floatright { float: right; margin: 0 0 1em 1em; }
+div.floatright { float: right; clear: right; margin: 0 0 1em 1em; }
div.floatright p { font-style: italic; }
-div.floatleft { float: left; margin: 0.3em 0.5em 0.5em 0; }
+div.floatleft { float: left; clear: left; margin: 0.3em 0.5em 0.5em 0; }
div.floatleft p { font-style: italic; }
@@ -26,43 +51,49 @@ table.rimage {
/* thumbnails */
div.thumb {
- margin: 10px;
- text-align: center;
- width: auto;
-}
-div.thumb div {
- border: 1px solid #8888aa;
- background-color: #f7f8ff;
- padding: 2px;
- font-size: 94%;
- text-align: center;
- overflow: hidden;
+ margin-bottom: .5em;
+ border-style: solid;
+ border-color: white;
+ width: auto;
+}
+div.thumbinner {
+ border: 1px solid #ccc;
+ padding: 3px !important;
+ background-color: #f9f9f9;
+ font-size: 94%;
+ text-align: center;
+ overflow: hidden;
}
-div.thumb div * {
- border: none;
- background: none;
+html .thumbimage {
+ border: 1px solid #ccc;
}
-div.thumb img {
- border:1px solid #8888AA;
- margin-bottom:3px;
- background:#FFFFFF;
+html .thumbcaption {
+ border: none;
+ text-align: left;
+ line-height: 1.4em;
+ padding: 3px !important;
+ font-size: 94%;
}
-div.thumbcaption,
-div.thumbcaption * {
- border: none !important;
- background: none !important;
+div.magnify {
+ float: right;
+ border: none !important;
+ background: none !important;
}
-div.thumbcaption {
- padding: 0.2em 0 0.2em 0 !important;
- text-align: left !important;
+div.magnify a, div.magnify img {
+ display: block;
+ border: none !important;
+ background: none !important;
}
div.tright {
- float: right;
- margin-left:0.5em;
+ clear: right;
+ float: right;
+ border-width: .5em 0 .8em 1.4em;
}
div.tleft {
- float: left;
- margin-right:0.5em;
+ float: left;
+ clear: left;
+ margin-right: .5em;
+ border-width: .5em 1.4em .8em 0;
}
/* Page history styling */
@@ -314,7 +345,6 @@ li span.deleted {
font-style: italic;
}
-
/* Classes for EXIF data display */
table.mw_metadata {
margin-left: 0.5em;
@@ -430,3 +460,8 @@ table.multipageimage td {
.imagelist .TablePager_col_img_description { white-space: normal }
.imagelist th.TablePager_sort { background-color: #ccccff }
+.templatesUsed { margin-top: 1em; }
+
+#toolbar { clear: both; }
+
+.mw-plusminus-null { color: #aaa; } \ No newline at end of file
diff --git a/skins/common/commonPrint.css b/skins/common/commonPrint.css
index 7dcb5700..992ac4db 100644
--- a/skins/common/commonPrint.css
+++ b/skins/common/commonPrint.css
@@ -22,13 +22,11 @@ a.new{ color:#ba0000; text-decoration:none; }
.tocline {
margin-bottom: 0px;
}
-.toctoggle, .editsection {
- font-size: smaller;
-}
/* images */
div.floatright {
- float: right;
+ float: right;
+ clear: right;
margin: 0;
position:relative;
border: 0.5em solid White;
@@ -67,6 +65,7 @@ div.thumb div div.thumbcaption {
div.magnify { display: none; }
div.tright {
float: right;
+ clear: right;
border-width: 0.5em 0 0.8em 1.4em;
}
div.tleft {
@@ -103,10 +102,10 @@ div#column-one,
.tochidden,
div#f-poweredbyico,
div#f-copyrightico,
-li#f-viewcount,
-li#f-about,
-li#f-disclaimer,
-li#f-privacy {
+li#viewcount,
+li#about,
+li#disclaimer,
+li#privacy {
/* Hides all the elements irrelevant for printing */
display: none;
}
@@ -130,12 +129,12 @@ ul {
h1, h2, h3, h4, h5, h6
{
- font-weight: bold;
+ font-weight: bold;
}
p, .documentDescription {
margin: 1em 0 ! important;
- line-height: 1.2em;
+ line-height: 1.2em;
}
.tocindent p {
@@ -160,7 +159,8 @@ table.listing td {
a {
color: Black !important;
- padding: 0 !important
+ background: none !important;
+ padding: 0 !important;
}
a:link, a:visited {
diff --git a/skins/common/common_rtl.css b/skins/common/common_rtl.css
index 8f50b2ab..54186bb8 100644
--- a/skins/common/common_rtl.css
+++ b/skins/common/common_rtl.css
@@ -1,3 +1,6 @@
+/* This CSS file is called from absolutely every wiki that's RTL: unlike
+ * common.css, it's actually common to all skins. */
+
/* js pref toc */
#preftoc { float: right; }
/* workaround for moz bug, displayed bullets on left side */
@@ -13,3 +16,13 @@ fieldset.operaprefsection {
margin-right: 1.4em;
margin-left: 0.4em;
}
+.editsection {
+ float: left;
+ margin-right: 5px;
+}
+div.tright, div.floatright {
+ clear: none;
+}
+div.tleft, div.floatleft {
+ clear: left;
+} \ No newline at end of file
diff --git a/skins/common/images/sort_down.gif b/skins/common/images/sort_down.gif
new file mode 100644
index 00000000..5ff08160
--- /dev/null
+++ b/skins/common/images/sort_down.gif
Binary files differ
diff --git a/skins/common/images/sort_none.gif b/skins/common/images/sort_none.gif
new file mode 100644
index 00000000..6bb02824
--- /dev/null
+++ b/skins/common/images/sort_none.gif
Binary files differ
diff --git a/skins/common/images/sort_up.gif b/skins/common/images/sort_up.gif
new file mode 100644
index 00000000..53002968
--- /dev/null
+++ b/skins/common/images/sort_up.gif
Binary files differ
diff --git a/skins/common/nostalgia.css b/skins/common/nostalgia.css
index cc427bc9..c9b36a70 100644
--- a/skins/common/nostalgia.css
+++ b/skins/common/nostalgia.css
@@ -1,4 +1,3 @@
-@import url("common.css?1");
body {
/* Background color is set separately on page type */
color: black;
diff --git a/skins/common/sorttable.js b/skins/common/sorttable.js
new file mode 100644
index 00000000..24877865
--- /dev/null
+++ b/skins/common/sorttable.js
@@ -0,0 +1,359 @@
+/*
+ * Table sorting script by Joost de Valk, check it out at http://www.joostdevalk.nl/code/sortable-table/.
+ * Based on a script from http://www.kryogenix.org/code/browser/sorttable/.
+ * Distributed under the MIT license: http://www.kryogenix.org/code/browser/licence.html .
+ *
+ * Copyright (c) 1997-2006 Stuart Langridge, Joost de Valk.
+ *
+ * @todo don't break on colspans/rowspans (bug 8028)
+ * @todo language-specific digit grouping/decimals (bug 8063)
+ * @todo support all accepted date formats (bug 8226)
+ */
+
+var image_path = stylepath+"/common/images/";
+var image_up = "sort_up.gif";
+var image_down = "sort_down.gif";
+var image_none = "sort_none.gif";
+var europeandate = wgContentLanguage != "en"; // The non-American-inclined can change to "true"
+
+var alternate_row_colors = true;
+
+
+hookEvent( "load", sortables_init);
+
+var SORT_COLUMN_INDEX;
+var thead = false;
+
+function sortables_init() {
+ var idnum = 0;
+ // Find all tables with class sortable and make them sortable
+ if (!document.getElementsByTagName) return;
+ tbls = document.getElementsByTagName("table");
+ for (ti=0;ti<tbls.length;ti++) {
+ thisTbl = tbls[ti];
+ if ( (' '+thisTbl.className+' ').indexOf("sortable") != -1 ) {
+ if (!thisTbl.id) {
+ thisTbl.setAttribute('id','sortable_table_id_'+idnum);
+ ++idnum;
+ }
+ ts_makeSortable(thisTbl);
+ }
+ }
+}
+
+function ts_makeSortable(table) {
+ if (table.rows && table.rows.length > 0) {
+ if (table.tHead && table.tHead.rows.length > 0) {
+ var firstRow = table.tHead.rows[table.tHead.rows.length-1];
+ thead = true;
+ } else {
+ var firstRow = table.rows[0];
+ }
+ }
+ if (!firstRow) return;
+
+ // We have a first row: assume it's the header, and make its contents clickable links
+ for (var i=0;i<firstRow.cells.length;i++) {
+ var cell = firstRow.cells[i];
+ var txt = ts_getInnerText(cell);
+ if (cell.className != "unsortable" && cell.className.indexOf("unsortable") == -1) {
+ cell.innerHTML = txt+'&nbsp;&nbsp;<a href="#" class="sortheader" onclick="ts_resortTable(this);return false;"><span class="sortarrow"><img src="'+ image_path + image_none + '" alt="&darr;"/></span></a>';
+ }
+ }
+ if (alternate_row_colors) {
+ alternate(table);
+ }
+}
+
+function ts_getInnerText(el) {
+ if (typeof el == "string") return el;
+ if (typeof el == "undefined") { return el };
+ if (el.innerText) return el.innerText; //Not needed but it is faster
+ var str = "";
+
+ var cs = el.childNodes;
+ var l = cs.length;
+ for (var i = 0; i < l; i++) {
+ switch (cs[i].nodeType) {
+ case 1: //ELEMENT_NODE
+ str += ts_getInnerText(cs[i]);
+ break;
+ case 3: //TEXT_NODE
+ str += cs[i].nodeValue;
+ break;
+ }
+ }
+ return str;
+}
+
+function ts_resortTable(lnk) {
+ // get the span
+ var span;
+ for (var ci=0;ci<lnk.childNodes.length;ci++) {
+ if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span') span = lnk.childNodes[ci];
+ }
+ var spantext = ts_getInnerText(span);
+ var td = lnk.parentNode;
+ var column = td.cellIndex;
+ var table = getParent(td,'TABLE');
+
+ // Work out a type for the column
+ if (table.rows.length <= 1) return;
+
+ for( var i = 1, itm = ""; itm.match(/^([\s]|\n|\&nbsp;|<!--[^-]+-->)*$/); i++) {
+ var itm = ts_getInnerText(table.tBodies[0].rows[i].cells[column]);
+ itm = trim(itm);
+ }
+ sortfn = ts_sort_caseinsensitive;
+ if (itm.match(/^\d\d[\/. -][a-zA-Z]{3}[\/. -]\d\d\d\d$/)) sortfn = ts_sort_date;
+ if (itm.match(/^\d\d[\/.-]\d\d[\/.-]\d\d\d\d$/)) sortfn = ts_sort_date;
+ if (itm.match(/^\d\d[\/.-]\d\d[\/.-]\d\d$/)) sortfn = ts_sort_date;
+ if (itm.match(/^[£$€Û¢´]/)) sortfn = ts_sort_currency;
+ if (itm.match(/^[\d.,]+\%?$/)) sortfn = ts_sort_numeric;
+ SORT_COLUMN_INDEX = column;
+ var firstRow = new Array();
+ var newRows = new Array();
+
+ for (k=0;k<table.tBodies.length;k++) {
+ for (i=0;i<table.tBodies[k].rows[0].length;i++) {
+ firstRow[i] = table.tBodies[k].rows[0][i];
+ }
+ }
+
+ for (k=0;k<table.tBodies.length;k++) {
+ if (!thead) {
+ // Skip the first row
+ for (j=1;j<table.tBodies[k].rows.length;j++) {
+ newRows[j-1] = table.tBodies[k].rows[j];
+ }
+ } else {
+ // Do NOT skip the first row
+ for (j=0;j<table.tBodies[k].rows.length;j++) {
+ newRows[j] = table.tBodies[k].rows[j];
+ }
+ }
+ }
+
+ newRows.sort(sortfn);
+
+ if (span.getAttribute("sortdir") == 'down') {
+ ARROW = '<img src="'+ image_path + image_down + '" alt="&darr;"/>';
+ newRows.reverse();
+ span.setAttribute('sortdir','up');
+ } else {
+ ARROW = '<img src="'+ image_path + image_up + '" alt="&uarr;"/>';
+ span.setAttribute('sortdir','down');
+ }
+
+ // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones
+ // don't do sortbottom rows
+ for (i=0; i<newRows.length; i++) {
+ if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) {
+ table.tBodies[0].appendChild(newRows[i]);
+ }
+ }
+ // do sortbottom rows only
+ for (i=0; i<newRows.length; i++) {
+ if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1))
+ table.tBodies[0].appendChild(newRows[i]);
+ }
+
+ // Delete any other arrows there may be showing
+ var allspans = document.getElementsByTagName("span");
+ for (var ci=0;ci<allspans.length;ci++) {
+ if (allspans[ci].className == 'sortarrow') {
+ if (getParent(allspans[ci],"table") == getParent(lnk,"table")) { // in the same table as us?
+ allspans[ci].innerHTML = '<img src="'+ image_path + image_none + '" alt="&darr;"/>';
+ }
+ }
+ }
+
+ span.innerHTML = ARROW;
+ alternate(table);
+}
+
+function getParent(el, pTagName) {
+ if (el == null) {
+ return null;
+ } else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) { // Gecko bug, supposed to be uppercase
+ return el;
+ } else {
+ return getParent(el.parentNode, pTagName);
+ }
+}
+
+function sort_date(date) {
+ // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
+ dt = "00000000";
+ if (date.length == 11) {
+ monthstr = date.substr(3,3);
+ monthstr = monthstr.toLowerCase();
+ switch(monthstr) {
+ case "jan": var month = "01"; break;
+ case "feb": var month = "02"; break;
+ case "mar": var month = "03"; break;
+ case "apr": var month = "04"; break;
+ case "may": var month = "05"; break;
+ case "jun": var month = "06"; break;
+ case "jul": var month = "07"; break;
+ case "aug": var month = "08"; break;
+ case "sep": var month = "09"; break;
+ case "oct": var month = "10"; break;
+ case "nov": var month = "11"; break;
+ case "dec": var month = "12"; break;
+ // default: var month = "00";
+ }
+ dt = date.substr(7,4)+month+date.substr(0,2);
+ return dt;
+ } else if (date.length == 10) {
+ if (europeandate == false) {
+ dt = date.substr(6,4)+date.substr(0,2)+date.substr(3,2);
+ return dt;
+ } else {
+ dt = date.substr(6,4)+date.substr(3,2)+date.substr(0,2);
+ return dt;
+ }
+ } else if (date.length == 8) {
+ yr = date.substr(6,2);
+ if (parseInt(yr) < 50) {
+ yr = '20'+yr;
+ } else {
+ yr = '19'+yr;
+ }
+ if (europeandate == true) {
+ dt = yr+date.substr(3,2)+date.substr(0,2);
+ return dt;
+ } else {
+ dt = yr+date.substr(0,2)+date.substr(3,2);
+ return dt;
+ }
+ }
+ return dt;
+}
+
+function ts_sort_date(a,b) {
+ dt1 = sort_date(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));
+ dt2 = sort_date(ts_getInnerText(b.cells[SORT_COLUMN_INDEX]));
+
+ if (dt1==dt2) {
+ return 0;
+ }
+ if (dt1<dt2) {
+ return -1;
+ }
+ return 1;
+}
+
+function ts_sort_currency(a,b) {
+ aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
+ bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
+ return compare_numeric(aa,bb);
+}
+
+function ts_sort_numeric(a,b) {
+ aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
+ bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
+ return compare_numeric(aa,bb);
+}
+
+function compare_numeric(a,b) {
+ a = parseFloat(a.replace(/,/, ""));
+ a = (isNaN(a) ? 0 : a);
+ b = parseFloat(b.replace(/,/, ""));
+ b = (isNaN(b) ? 0 : b);
+ return a - b;
+}
+
+function ts_sort_caseinsensitive(a,b) {
+ aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
+ bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
+ if (aa==bb) {
+ return 0;
+ }
+ if (aa<bb) {
+ return -1;
+ }
+ return 1;
+}
+
+function ts_sort_default(a,b) {
+ aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
+ bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
+ if (aa==bb) {
+ return 0;
+ }
+ if (aa<bb) {
+ return -1;
+ }
+ return 1;
+}
+
+function addEvent(elm, evType, fn, useCapture)
+// addEvent and removeEvent
+// cross-browser event handling for IE5+, NS6 and Mozilla
+// By Scott Andrew
+{
+ if (elm.addEventListener){
+ elm.addEventListener(evType, fn, useCapture);
+ return true;
+ } else if (elm.attachEvent){
+ var r = elm.attachEvent("on"+evType, fn);
+ return r;
+ } else {
+ alert("Handler could not be removed");
+ }
+}
+
+function replace(s, t, u) {
+ /*
+ ** Replace a token in a string
+ ** s string to be processed
+ ** t token to be found and removed
+ ** u token to be inserted
+ ** returns new String
+ */
+ i = s.indexOf(t);
+ r = "";
+ if (i == -1) return s;
+ r += s.substring(0,i) + u;
+ if ( i + t.length < s.length) {
+ r += replace(s.substring(i + t.length, s.length), t, u);
+ }
+ return r;
+}
+
+function trim(s) {
+ return s.replace(/^([ \t]|\n|\&nbsp;|<!--[^-]+-->)*/, "").replace(/([ \t]|\n|\&nbsp;|<!--[^-]+-->)*$/, "");
+}
+
+function alternate(table) {
+ // Take object table and get all it's tbodies.
+ var tableBodies = table.getElementsByTagName("tbody");
+ // Loop through these tbodies
+ for (var i = 0; i < tableBodies.length; i++) {
+ // Take the tbody, and get all it's rows
+ var tableRows = tableBodies[i].getElementsByTagName("tr");
+ // Loop through these rows
+ // Start at 1 because we want to leave the heading row untouched
+ for (var j = 0; j < tableRows.length; j++) {
+ // Check if j is even, and apply classes for both possible results
+ if ( (j % 2) == 0 ) {
+ if ( !(tableRows[j].className.indexOf('odd') == -1) ) {
+ tableRows[j].className = replace(tableRows[j].className, 'odd', 'even');
+ } else {
+ if ( tableRows[j].className.indexOf('even') == -1 ) {
+ tableRows[j].className += " even";
+ }
+ }
+ } else {
+ if ( !(tableRows[j].className.indexOf('even') == -1) ) {
+ tableRows[j].className = replace(tableRows[j].className, 'even', 'odd');
+ } else {
+ if ( tableRows[j].className.indexOf('odd') == -1 ) {
+ tableRows[j].className += " odd";
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js
index 3a8fd6c6..eabdcbb4 100644
--- a/skins/common/wikibits.js
+++ b/skins/common/wikibits.js
@@ -5,54 +5,38 @@ var is_gecko = ((clientPC.indexOf('gecko')!=-1) && (clientPC.indexOf('spoofer')=
&& (clientPC.indexOf('khtml') == -1) && (clientPC.indexOf('netscape/7.0')==-1));
var is_safari = ((clientPC.indexOf('applewebkit')!=-1) && (clientPC.indexOf('spoofer')==-1));
var is_khtml = (navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled ));
+// For accesskeys
+var is_ff2_win = (clientPC.indexOf('firefox/2')!=-1 || clientPC.indexOf('minefield/3')!=-1) && clientPC.indexOf('windows')!=-1;
+var is_ff2_x11 = (clientPC.indexOf('firefox/2')!=-1 || clientPC.indexOf('minefield/3')!=-1) && clientPC.indexOf('x11')!=-1;
if (clientPC.indexOf('opera') != -1) {
var is_opera = true;
var is_opera_preseven = (window.opera && !document.childNodes);
var is_opera_seven = (window.opera && document.childNodes);
}
-// add any onload functions in this hook (please don't hard-code any events in the xhtml source)
+// Global external objects used by this script.
+/*extern ta, stylepath, skin */
+// add any onload functions in this hook (please don't hard-code any events in the xhtml source)
var doneOnloadHook;
-if (!window.onloadFuncts)
+if (!window.onloadFuncts) {
var onloadFuncts = [];
+}
function addOnloadHook(hookFunct) {
// Allows add-on scripts to add onload functions
onloadFuncts[onloadFuncts.length] = hookFunct;
}
-function runOnloadHook() {
- // don't run anything below this for non-dom browsers
- if (doneOnloadHook || !(document.getElementById && document.getElementsByTagName))
- return;
-
- histrowinit();
- unhidetzbutton();
- tabbedprefs();
- akeytt();
- scrollEditBox();
- setupCheckboxShiftClick();
-
- // Run any added-on functions
- for (var i = 0; i < onloadFuncts.length; i++)
- onloadFuncts[i]();
-
- doneOnloadHook = true;
-}
-
function hookEvent(hookName, hookFunct) {
- if (window.addEventListener)
- addEventListener(hookName, hookFunct, false);
- else if (window.attachEvent)
- attachEvent("on" + hookName, hookFunct);
+ if (window.addEventListener) {
+ window.addEventListener(hookName, hookFunct, false);
+ } else if (window.attachEvent) {
+ window.attachEvent("on" + hookName, hookFunct);
+ }
}
-//note: all skins shoud call runOnloadHook() at the end of html output,
-// so the below should be redundant. It's there just in case.
-hookEvent("load", runOnloadHook);
-
// document.write special stylesheet links
if (typeof stylepath != 'undefined' && typeof skin != 'undefined') {
if (is_opera_preseven) {
@@ -63,9 +47,13 @@ if (typeof stylepath != 'undefined' && typeof skin != 'undefined') {
document.write('<link rel="stylesheet" type="text/css" href="'+stylepath+'/'+skin+'/KHTMLFixes.css">');
}
}
-// Un-trap us from framesets
-if (window.top != window)
- window.top.location = window.location;
+
+if (wgBreakFrames) {
+ // Un-trap us from framesets
+ if (window.top != window) {
+ window.top.location = window.location;
+ }
+}
// for enhanced RecentChanges
function toggleVisibility(_levelId, _otherId, _linkId) {
@@ -83,29 +71,13 @@ function toggleVisibility(_levelId, _otherId, _linkId) {
}
}
-// page history stuff
-// attach event handlers to the input elements on history page
-function histrowinit() {
- var hf = document.getElementById('pagehistory');
- if (!hf)
- return;
- var lis = hf.getElementsByTagName('li');
- for (var i = 0; i < lis.length; i++) {
- var inputs = historyRadios(lis[i]);
- if (inputs[0] && inputs[1]) {
- inputs[0].onclick = diffcheck;
- inputs[1].onclick = diffcheck;
- }
- }
- diffcheck();
-}
-
function historyRadios(parent) {
var inputs = parent.getElementsByTagName('input');
var radios = [];
for (var i = 0; i < inputs.length; i++) {
- if (inputs[i].name == "diff" || inputs[i].name == "oldid")
+ if (inputs[i].name == "diff" || inputs[i].name == "oldid") {
radios[radios.length] = inputs[i];
+ }
}
return radios;
}
@@ -115,15 +87,17 @@ function diffcheck() {
var dli = false; // the li where the diff radio is checked
var oli = false; // the li where the oldid radio is checked
var hf = document.getElementById('pagehistory');
- if (!hf)
+ if (!hf) {
return true;
+ }
var lis = hf.getElementsByTagName('li');
- for (i=0;i<lis.length;i++) {
+ for (var i=0;i<lis.length;i++) {
var inputs = historyRadios(lis[i]);
if (inputs[1] && inputs[0]) {
if (inputs[1].checked || inputs[0].checked) { // this row has a checked radio button
- if (inputs[1].checked && inputs[0].checked && inputs[0].value == inputs[1].value)
+ if (inputs[1].checked && inputs[0].checked && inputs[0].value == inputs[1].value) {
return false;
+ }
if (oli) { // it's the second checked radio
if (inputs[1].checked) {
oli.className = "selected";
@@ -132,23 +106,28 @@ function diffcheck() {
} else if (inputs[0].checked) {
return false;
}
- if (inputs[0].checked)
+ if (inputs[0].checked) {
dli = lis[i];
- if (!oli)
+ }
+ if (!oli) {
inputs[0].style.visibility = 'hidden';
- if (dli)
+ }
+ if (dli) {
inputs[1].style.visibility = 'hidden';
+ }
lis[i].className = "selected";
oli = lis[i];
} else { // no radio is checked in this row
- if (!oli)
+ if (!oli) {
inputs[0].style.visibility = 'hidden';
- else
+ } else {
inputs[0].style.visibility = 'visible';
- if (dli)
+ }
+ if (dli) {
inputs[1].style.visibility = 'hidden';
- else
+ } else {
inputs[1].style.visibility = 'visible';
+ }
lis[i].className = "";
}
}
@@ -156,38 +135,61 @@ function diffcheck() {
return true;
}
+// page history stuff
+// attach event handlers to the input elements on history page
+function histrowinit() {
+ var hf = document.getElementById('pagehistory');
+ if (!hf) {
+ return;
+ }
+ var lis = hf.getElementsByTagName('li');
+ for (var i = 0; i < lis.length; i++) {
+ var inputs = historyRadios(lis[i]);
+ if (inputs[0] && inputs[1]) {
+ inputs[0].onclick = diffcheck;
+ inputs[1].onclick = diffcheck;
+ }
+ }
+ diffcheck();
+}
+
// generate toc from prefs form, fold sections
// XXX: needs testing on IE/Mac and safari
// more comments to follow
function tabbedprefs() {
var prefform = document.getElementById('preferences');
- if (!prefform || !document.createElement)
+ if (!prefform || !document.createElement) {
return;
- if (prefform.nodeName.toLowerCase() == 'a')
+ }
+ if (prefform.nodeName.toLowerCase() == 'a') {
return; // Occasional IE problem
+ }
prefform.className = prefform.className + 'jsprefs';
- var sections = new Array();
+ var sections = [];
var children = prefform.childNodes;
var seci = 0;
for (var i = 0; i < children.length; i++) {
if (children[i].nodeName.toLowerCase() == 'fieldset') {
children[i].id = 'prefsection-' + seci;
children[i].className = 'prefsection';
- if (is_opera || is_khtml)
+ if (is_opera || is_khtml) {
children[i].className = 'prefsection operaprefsection';
+ }
var legends = children[i].getElementsByTagName('legend');
- sections[seci] = new Object();
+ sections[seci] = {};
legends[0].className = 'mainLegend';
- if (legends[0] && legends[0].firstChild.nodeValue)
+ if (legends[0] && legends[0].firstChild.nodeValue) {
sections[seci].text = legends[0].firstChild.nodeValue;
- else
+ } else {
sections[seci].text = '# ' + seci;
+ }
sections[seci].secid = children[i].id;
seci++;
- if (sections.length != 1)
+ if (sections.length != 1) {
children[i].style.display = 'none';
- else
+ } else {
var selectedid = children[i].id;
+ }
}
}
var toc = document.createElement('ul');
@@ -195,8 +197,9 @@ function tabbedprefs() {
toc.selectedid = selectedid;
for (i = 0; i < sections.length; i++) {
var li = document.createElement('li');
- if (i == 0)
+ if (i === 0) {
li.className = 'selected';
+ }
var a = document.createElement('a');
a.href = '#' + sections[i].secid;
a.onmousedown = a.onclick = uncoversection;
@@ -243,8 +246,9 @@ function checkTimezone(tz, msg) {
function unhidetzbutton() {
var tzb = document.getElementById('guesstimezonebutton');
- if (tzb)
+ if (tzb) {
tzb.style.display = 'inline';
+ }
}
// in [-]HH:MM format...
@@ -269,9 +273,10 @@ function showTocToggle() {
if (document.createTextNode) {
// Uses DOM calls to avoid document.write + XHTML issues
- var linkHolder = document.getElementById('toctitle')
- if (!linkHolder)
+ var linkHolder = document.getElementById('toctitle');
+ if (!linkHolder) {
return;
+ }
var outerSpan = document.createElement('span');
outerSpan.className = 'toctoggle';
@@ -290,22 +295,24 @@ function showTocToggle() {
linkHolder.appendChild(outerSpan);
var cookiePos = document.cookie.indexOf("hidetoc=");
- if (cookiePos > -1 && document.cookie.charAt(cookiePos + 8) == 1)
+ if (cookiePos > -1 && document.cookie.charAt(cookiePos + 8) == 1) {
toggleToc();
+ }
}
}
function changeText(el, newText) {
// Safari work around
- if (el.innerText)
+ if (el.innerText) {
el.innerText = newText;
- else if (el.firstChild && el.firstChild.nodeValue)
+ } else if (el.firstChild && el.firstChild.nodeValue) {
el.firstChild.nodeValue = newText;
+ }
}
function toggleToc() {
var toc = document.getElementById('toc').getElementsByTagName('ul')[0];
- var toggleLink = document.getElementById('togglelink')
+ var toggleLink = document.getElementById('togglelink');
if (toc && toggleLink && toc.style.display == 'none') {
changeText(toggleLink, tocHideText);
@@ -348,7 +355,7 @@ function mwInsertEditButton(parent, item) {
image.onclick = function() {
insertTags(item.tagOpen, item.tagClose, item.sampleText);
return false;
- }
+ };
parent.appendChild(image);
return true;
@@ -356,20 +363,21 @@ function mwInsertEditButton(parent, item) {
function mwSetupToolbar() {
var toolbar = document.getElementById('toolbar');
- if (!toolbar) return false;
+ if (!toolbar) { return false; }
var textbox = document.getElementById('wpTextbox1');
- if (!textbox) return false;
+ if (!textbox) { return false; }
// Don't generate buttons for browsers which don't fully
// support it.
- if (!document.selection && textbox.selectionStart == null)
+ if (!document.selection && textbox.selectionStart === null) {
return false;
+ }
for (var i in mwEditButtons) {
mwInsertEditButton(toolbar, mwEditButtons[i]);
}
- for (var i in mwCustomEditButtons) {
+ for (i in mwCustomEditButtons) {
mwInsertEditButton(toolbar, mwCustomEditButtons[i]);
}
return true;
@@ -386,11 +394,11 @@ function escapeQuotes(text) {
function escapeQuotesHTML(text) {
var re = new RegExp('&',"g");
text = text.replace(re,"&amp;");
- var re = new RegExp('"',"g");
+ re = new RegExp('"',"g");
text = text.replace(re,"&quot;");
- var re = new RegExp('<',"g");
+ re = new RegExp('<',"g");
text = text.replace(re,"&lt;");
- var re = new RegExp('>',"g");
+ re = new RegExp('>',"g");
text = text.replace(re,"&gt;");
return text;
}
@@ -399,19 +407,21 @@ function escapeQuotesHTML(text) {
// use sampleText instead of selection if there is none
// copied and adapted from phpBB
function insertTags(tagOpen, tagClose, sampleText) {
- if (document.editform)
- var txtarea = document.editform.wpTextbox1;
- else {
+ var txtarea;
+ if (document.editform) {
+ txtarea = document.editform.wpTextbox1;
+ } else {
// some alternate form? take the first one we can find
var areas = document.getElementsByTagName('textarea');
- var txtarea = areas[0];
+ txtarea = areas[0];
}
// IE
if (document.selection && !is_gecko) {
var theSelection = document.selection.createRange().text;
- if (!theSelection)
+ if (!theSelection) {
theSelection=sampleText;
+ }
txtarea.focus();
if (theSelection.charAt(theSelection.length - 1) == " ") { // exclude ending space char, if any
theSelection = theSelection.substring(0, theSelection.length - 1);
@@ -425,12 +435,15 @@ function insertTags(tagOpen, tagClose, sampleText) {
var replaced = false;
var startPos = txtarea.selectionStart;
var endPos = txtarea.selectionEnd;
- if (endPos-startPos)
+ if (endPos-startPos) {
replaced = true;
+ }
var scrollTop = txtarea.scrollTop;
var myText = (txtarea.value).substring(startPos, endPos);
- if (!myText)
+ if (!myText) {
myText=sampleText;
+ }
+ var subst;
if (myText.charAt(myText.length - 1) == " ") { // exclude ending space char, if any
subst = tagOpen + myText.substring(0, (myText.length - 1)) + tagClose + " ";
} else {
@@ -455,19 +468,38 @@ function insertTags(tagOpen, tagClose, sampleText) {
// bar, but that caused more problems than it solved.
}
// reposition cursor if possible
- if (txtarea.createTextRange)
+ if (txtarea.createTextRange) {
txtarea.caretPos = document.selection.createRange().duplicate();
+ }
}
-function akeytt() {
- if (typeof ta == "undefined" || !ta)
+/**
+ * Set up accesskeys/tooltips. If doId is specified, only set up for that id.
+ *
+ * @param mixed doId string or null
+ */
+function akeytt( doId ) {
+ if (typeof ta == "undefined" || !ta) {
return;
- var pref = 'alt-';
+ }
+
+ var pref;
if (is_safari || navigator.userAgent.toLowerCase().indexOf('mac') + 1
- || navigator.userAgent.toLowerCase().indexOf('konqueror') + 1 )
+ || navigator.userAgent.toLowerCase().indexOf('konqueror') + 1 ) {
pref = 'control-';
- if (is_opera)
+ } else if (is_opera) {
pref = 'shift-esc-';
+ } else if (is_ff2_x11) {
+ pref = 'ctrl-shift-';
+ } else if (is_ff2_win) {
+ pref = 'alt-shift-';
+ } else {
+ pref = 'alt-';
+ }
+
+ if ( doId ) {
+ ta = [ta[doId]];
+ }
for (var id in ta) {
var n = document.getElementById(id);
@@ -483,8 +515,10 @@ function akeytt() {
} else {
a = n.childNodes[0];
}
-
- if (a) {
+ // Don't add an accesskey for the watch tab if the watch
+ // checkbox is also available.
+ if (a && ((id != 'ca-watch' && id != 'ca-unwatch') ||
+ !(window.location.search.match(/[\?&](action=edit|action=submit)/i)))) {
a.accessKey = ta[id][0];
ak = ' ['+pref+ta[id][0]+']';
}
@@ -503,9 +537,9 @@ function akeytt() {
function setupRightClickEdit() {
if (document.getElementsByTagName) {
- var divs = document.getElementsByTagName('div');
- for (var i = 0; i < divs.length; i++) {
- var el = divs[i];
+ var spans = document.getElementsByTagName('span');
+ for (var i = 0; i < spans.length; i++) {
+ var el = spans[i];
if(el.className == 'editsection') {
addRightClickEditHandler(el);
}
@@ -518,23 +552,31 @@ function addRightClickEditHandler(el) {
var link = el.childNodes[i];
if (link.nodeType == 1 && link.nodeName.toLowerCase() == 'a') {
var editHref = link.getAttribute('href');
-
- // find the following a
- var next = el.nextSibling;
- while (next.nodeType != 1)
- next = next.nextSibling;
-
- // find the following header
- next = next.nextSibling;
- while (next.nodeType != 1)
- next = next.nextSibling;
-
- if (next && next.nodeType == 1 &&
- next.nodeName.match(/^[Hh][1-6]$/)) {
- next.oncontextmenu = function() {
- document.location = editHref;
- return false;
- }
+ // find the enclosing (parent) header
+ var prev = el.parentNode;
+ if (prev && prev.nodeType == 1 &&
+ prev.nodeName.match(/^[Hh][1-6]$/)) {
+ prev.oncontextmenu = function(e) {
+ if (!e) { e = window.event; }
+ // e is now the event in all browsers
+ var targ;
+ if (e.target) { targ = e.target; }
+ else if (e.srcElement) { targ = e.srcElement; }
+ if (targ.nodeType == 3) { // defeat Safari bug
+ targ = targ.parentNode;
+ }
+ // targ is now the target element
+
+ // We don't want to deprive the noble reader of a context menu
+ // for the section edit link, do we? (Might want to extend this
+ // to all <a>'s?)
+ if (targ.nodeName.toLowerCase() != 'a'
+ || targ.parentNode.className != 'editsection') {
+ document.location = editHref;
+ return false;
+ }
+ return true;
+ };
}
}
}
@@ -613,22 +655,25 @@ function checkboxMouseupHandler(e) {
}
function toggle_element_activation(ida,idb) {
- if (!document.getElementById)
+ if (!document.getElementById) {
return;
+ }
document.getElementById(ida).disabled=true;
document.getElementById(idb).disabled=false;
}
function toggle_element_check(ida,idb) {
- if (!document.getElementById)
+ if (!document.getElementById) {
return;
+ }
document.getElementById(ida).checked=true;
document.getElementById(idb).checked=false;
}
function fillDestFilename(id) {
- if (!document.getElementById)
+ if (!document.getElementById) {
return;
+ }
var path = document.getElementById(id).value;
// Find trailing part
var slash = path.lastIndexOf('/');
@@ -647,25 +692,30 @@ function fillDestFilename(id) {
// Output result
var destFile = document.getElementById('wpDestFile');
- if (destFile)
+ if (destFile) {
destFile.value = fname;
+ }
}
function considerChangingExpiryFocus() {
- if (!document.getElementById)
+ if (!document.getElementById) {
return;
+ }
var drop = document.getElementById('wpBlockExpiry');
- if (!drop)
+ if (!drop) {
return;
+ }
var field = document.getElementById('wpBlockOther');
- if (!field)
+ if (!field) {
return;
+ }
var opt = drop.value;
- if (opt == 'other')
+ if (opt == 'other') {
field.style.display = '';
- else
+ } else {
field.style.display = 'none';
+ }
}
function scrollEditBox() {
@@ -674,91 +724,187 @@ function scrollEditBox() {
var editFormEl = document.getElementById("editform");
if (editBoxEl && scrollTopEl) {
- if (scrollTopEl.value) editBoxEl.scrollTop = scrollTopEl.value;
+ if (scrollTopEl.value) { editBoxEl.scrollTop = scrollTopEl.value; }
editFormEl.onsubmit = function() {
document.getElementById("wpScrolltop").value = document.getElementById("wpTextbox1").scrollTop;
- }
+ };
}
}
hookEvent("load", scrollEditBox);
+var allmessages_nodelist = false;
+var allmessages_modified = false;
+var allmessages_timeout = false;
+var allmessages_running = false;
+
+function allmessagesmodified() {
+ allmessages_modified = !allmessages_modified;
+ allmessagesfilter();
+}
+
function allmessagesfilter() {
- text = document.getElementById('allmessagesinput').value;
- k = document.getElementById('allmessagestable');
- if (!k) { return;}
+ if ( allmessages_timeout )
+ window.clearTimeout( allmessages_timeout );
- var items = k.getElementsByTagName('span');
+ if ( !allmessages_running )
+ allmessages_timeout = window.setTimeout( 'allmessagesfilter_do();', 500 );
+}
- if ( text.length > allmessages_prev.length ) {
- for (var i = items.length-1, j = 0; i >= 0; i--) {
- j = allmessagesforeach(items, i, j);
- }
- } else {
- for (var i = 0, j = 0; i < items.length; i++) {
- j = allmessagesforeach(items, i, j);
- }
+function allmessagesfilter_do() {
+ if ( !allmessages_nodelist )
+ return;
+
+ var text = document.getElementById('allmessagesinput').value;
+ var nodef = allmessages_modified;
+
+ allmessages_running = true;
+
+ for ( var name in allmessages_nodelist ) {
+ var nodes = allmessages_nodelist[name];
+ var display = ( name.indexOf( text ) == -1 ? 'none' : '' );
+
+ for ( var i = 0; i < nodes.length; i++)
+ nodes[i].style.display =
+ ( nodes[i].className == "def" && nodef
+ ? 'none' : display );
}
- allmessages_prev = text;
+
+ if ( text != document.getElementById('allmessagesinput').value ||
+ nodef != allmessages_modified )
+ allmessagesfilter_do(); // repeat
+
+ allmessages_running = false;
}
-function allmessagesforeach(items, i, j) {
- var hItem = items[i].getAttribute('id');
- if (hItem.substring(0,17) == 'sp-allmessages-i-') {
- if (items[i].firstChild && items[i].firstChild.nodeName == '#text' && items[i].firstChild.nodeValue.indexOf(text) != -1) {
- var itemA = document.getElementById( hItem.replace('i', 'r1') );
- var itemB = document.getElementById( hItem.replace('i', 'r2') );
- if ( itemA.style.display != '' ) {
- var s = "allmessageshider(\"" + hItem.replace('i', 'r1') + "\", \"" + hItem.replace('i', 'r2') + "\", '')";
- var k = window.setTimeout(s,j++*5);
- }
- } else {
- var itemA = document.getElementById( hItem.replace('i', 'r1') );
- var itemB = document.getElementById( hItem.replace('i', 'r2') );
- if ( itemA.style.display != 'none' ) {
- var s = "allmessageshider(\"" + hItem.replace('i', 'r1') + "\", \"" + hItem.replace('i', 'r2') + "\", 'none')";
- var k = window.setTimeout(s,j++*5);
+function allmessagesfilter_init() {
+ if ( allmessages_nodelist )
+ return;
+
+ var nodelist = new Array();
+ var templist = new Array();
+
+ var table = document.getElementById('allmessagestable');
+ if ( !table ) return;
+
+ var rows = document.getElementsByTagName('tr');
+ for ( var i = 0; i < rows.length; i++ ) {
+ var id = rows[i].getAttribute('id')
+ if ( id && id.substring(0,16) != 'sp-allmessages-r' ) continue;
+ templist[ id ] = rows[i];
+ }
+
+ var spans = table.getElementsByTagName('span');
+ for ( var i = 0; i < spans.length; i++ ) {
+ var id = spans[i].getAttribute('id')
+ if ( id && id.substring(0,17) != 'sp-allmessages-i-' ) continue;
+ if ( !spans[i].firstChild || spans[i].firstChild.nodeType != 3 ) continue;
+
+ var nodes = new Array();
+ var row1 = templist[ id.replace('i', 'r1') ];
+ var row2 = templist[ id.replace('i', 'r2') ];
+
+ if ( row1 ) nodes[nodes.length] = row1;
+ if ( row2 ) nodes[nodes.length] = row2;
+ nodelist[ spans[i].firstChild.nodeValue ] = nodes;
+ }
+
+ var k = document.getElementById('allmessagesfilter');
+ if (k) { k.style.display = ''; }
+
+ allmessages_nodelist = nodelist;
+}
+
+hookEvent( "load", allmessagesfilter_init );
+
+/*
+ Written by Jonathan Snook, http://www.snook.ca/jonathan
+ Add-ons by Robert Nyman, http://www.robertnyman.com
+ Author says "The credit comment is all it takes, no license. Go crazy with it!:-)"
+ From http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
+*/
+function getElementsByClassName(oElm, strTagName, oClassNames){
+ var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
+ var arrReturnElements = new Array();
+ var arrRegExpClassNames = new Array();
+ if(typeof oClassNames == "object"){
+ for(var i=0; i<oClassNames.length; i++){
+ arrRegExpClassNames.push(new RegExp("(^|\\s)" + oClassNames[i].replace(/\-/g, "\\-") + "(\\s|$)"));
+ }
+ }
+ else{
+ arrRegExpClassNames.push(new RegExp("(^|\\s)" + oClassNames.replace(/\-/g, "\\-") + "(\\s|$)"));
+ }
+ var oElement;
+ var bMatchesAll;
+ for(var j=0; j<arrElements.length; j++){
+ oElement = arrElements[j];
+ bMatchesAll = true;
+ for(var k=0; k<arrRegExpClassNames.length; k++){
+ if(!arrRegExpClassNames[k].test(oElement.className)){
+ bMatchesAll = false;
+ break;
}
}
+ if(bMatchesAll){
+ arrReturnElements.push(oElement);
+ }
}
- return j;
+ return (arrReturnElements)
}
-
-function allmessageshider(idA, idB, cstyle) {
- var itemA = document.getElementById( idA );
- var itemB = document.getElementById( idB );
- if (itemA) { itemA.style.display = cstyle; }
- if (itemB) { itemB.style.display = cstyle; }
+function sortableTables() {
+ if (getElementsByClassName(document, "table", "sortable").length != 0) {
+ document.write('<script type="text/javascript" src="'+stylepath+'/common/sorttable.js"></script>');
+ }
}
-function allmessagesmodified() {
- allmessages_modified = !allmessages_modified;
- k = document.getElementById('allmessagestable');
- if (!k) { return;}
- var items = k.getElementsByTagName('tr');
- for (var i = 0, j = 0; i< items.length; i++) {
- if (!allmessages_modified ) {
- if ( items[i].style.display != '' ) {
- var s = "allmessageshider(\"" + items[i].getAttribute('id') + "\", null, '')";
- var k = window.setTimeout(s,j++*5);
- }
- } else if (items[i].getAttribute('class') == 'def' && allmessages_modified) {
- if ( items[i].style.display != 'none' ) {
- var s = "allmessageshider(\"" + items[i].getAttribute('id') + "\", null, 'none')";
- var k = window.setTimeout(s,j++*5);
- }
+function redirectToFragment(fragment) {
+ var match = navigator.userAgent.match(/AppleWebKit\/(\d+)/);
+ if (match) {
+ var webKitVersion = parseInt(match[1]);
+ if (webKitVersion < 420) {
+ // Released Safari w/ WebKit 418.9.1 messes up horribly
+ // Nightlies of 420+ are ok
+ return;
}
}
+ if (is_gecko) {
+ // Mozilla needs to wait until after load, otherwise the window doesn't scroll
+ addOnloadHook(function () {
+ if (window.location.hash == "")
+ window.location.hash = fragment;
+ });
+ } else {
+ if (window.location.hash == "")
+ window.location.hash = fragment;
+ }
}
-function allmessagesshow() {
- k = document.getElementById('allmessagesfilter');
- if (k) { k.style.display = ''; }
+function runOnloadHook() {
+ // don't run anything below this for non-dom browsers
+ if (doneOnloadHook || !(document.getElementById && document.getElementsByTagName)) {
+ return;
+ }
+
+ histrowinit();
+ unhidetzbutton();
+ tabbedprefs();
+ akeytt( null );
+ scrollEditBox();
+ setupCheckboxShiftClick();
+ sortableTables();
- allmessages_prev = '';
- allmessages_modified = false;
+ // Run any added-on functions
+ for (var i = 0; i < onloadFuncts.length; i++) {
+ onloadFuncts[i]();
+ }
+
+ doneOnloadHook = true;
}
-hookEvent("load", allmessagesshow);
+//note: all skins should call runOnloadHook() at the end of html output,
+// so the below should be redundant. It's there just in case.
+hookEvent("load", runOnloadHook);
+
hookEvent("load", mwSetupToolbar);
diff --git a/skins/common/wikistandard.css b/skins/common/wikistandard.css
index 3985f1d9..532e4fdc 100644
--- a/skins/common/wikistandard.css
+++ b/skins/common/wikistandard.css
@@ -1,5 +1,3 @@
-@import url("common.css?1");
-
#article { padding: 4px; }
#content { margin: 0; padding: 0; }
#footer { padding: 4px;font-size:95%;clear: both; }
@@ -29,12 +27,18 @@ textarea { overflow: auto; }
h1.pagetitle { padding-top: 0; margin-top: 0; padding-bottom: 0; margin-bottom: 0;
font-size:150%; }
+h1.pagetitle .editsection { font-size: 66.7%; }
h2 { font-size: 120%; }
+h2 .editsection { font-size: 83.3%; }
h2, h3, h4, h5, h6 { margin-bottom: 0;}
h3 { font-size: 106.25%; }
+h3 .editsection { font-size: 94.1%; }
h4 { font-size: 103.125%; }
+h4 .editsection { font-size: 97.0%; }
h5 { font-size: 100%; }
+h5 .editsection { font-size: 100%; }
h6 { font-size: 95%; }
+h6 .editsection { font-size: 105.3%; }
hr.sep { color:gray;height:1px;background-color:gray;}
p.subpages { font-size:small;}
p.subtitle { padding-top: 0; margin-top: 0;}
diff --git a/skins/disabled/MonoBookCBT.php b/skins/disabled/MonoBookCBT.php
index f5f742d6..3d145b24 100644
--- a/skins/disabled/MonoBookCBT.php
+++ b/skins/disabled/MonoBookCBT.php
@@ -764,7 +764,7 @@ class SkinMonoBookCBT extends SkinTemplate {
}
function logopath() { return $GLOBALS['wgLogo']; }
- function mainpage() { return self::makeI18nUrl( 'mainpage' ); }
+ function mainpage() { return self::makeMainPageUrl(); }
function sidebar( $startSection, $endSection, $innerTpl ) {
$s = '';
diff --git a/skins/monobook/IE70Fixes.css b/skins/monobook/IE70Fixes.css
index 2a2c9c77..43ff7076 100644
--- a/skins/monobook/IE70Fixes.css
+++ b/skins/monobook/IE70Fixes.css
@@ -12,10 +12,9 @@
.rtl #column-one {
/* For some reason it tries to inherit the padding-top into every div,
* and I can't figure out how to get it back off.
+ * Margin works correctly for this use, though.
*/
padding-top: 0;
-}
-.rtl #column-one #p-navigation {
margin-top: 160px;
}
diff --git a/skins/monobook/audio.png b/skins/monobook/audio.png
new file mode 100644
index 00000000..1c56bdc8
--- /dev/null
+++ b/skins/monobook/audio.png
Binary files differ
diff --git a/skins/monobook/document.png b/skins/monobook/document.png
new file mode 100644
index 00000000..b48138e9
--- /dev/null
+++ b/skins/monobook/document.png
Binary files differ
diff --git a/skins/monobook/handheld.css b/skins/monobook/handheld.css
new file mode 100644
index 00000000..38fe1ebe
--- /dev/null
+++ b/skins/monobook/handheld.css
@@ -0,0 +1,1337 @@
+/*
+** MediaWiki 'monobook' style sheet for CSS2-capable browsers.
+** Copyright Gabriel Wicke - http://wikidev.net/
+** License: GPL (http://www.gnu.org/copyleft/gpl.html)
+**
+** Loosely based on http://www.positioniseverything.net/ordered-floats.html by Big John
+** and the Plone 2.0 styles, see http://plone.org/ (Alexander Limi,Joe Geldart & Tom Croucher,
+** Michael Zeltner and Geir Bækholt)
+** All you guys rock :)
+*/
+
+/**
+ * Stylesheet for handhelds. All rules not marked media-specific are shared
+ * with main.css and should be updated in tandem. The rules can't be in the
+ * same file because old browsers like IE5 won't obey @media rules.
+ *
+ * Rules that are handheld-specific are given @media rules in case old browsers
+ * don't recognize the media attribute and load this file anyway.
+ */
+
+#content {
+ background: white;
+ color: black;
+ border: 1px solid #aaa;
+ border-right: none;
+ line-height: 1.5em;
+}
+/* the left column width is specified in class .portlet */
+
+/* Font size:
+** We take advantage of keyword scaling- browsers won't go below 9px
+** More at http://www.w3.org/2003/07/30-font-size
+** http://style.cleverchimp.com/font_size_intervals/altintervals.html
+*/
+
+body {
+ font: x-small sans-serif;
+ background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat;
+ color: black;
+ margin: 0;
+ padding: 0;
+}
+
+/* scale back up to a sane default */
+#globalWrapper {
+ font-size: 127%;
+ width: 100%;
+ margin: 0;
+ padding: 0;
+}
+.visualClear {
+ clear: both;
+}
+
+/* general styles */
+
+table {
+ font-size: 100%;
+ color: black;
+ /* we don't want the bottom borders of <h2>s to be visible through
+ floated tables */
+ background-color: white;
+}
+a {
+ text-decoration: none;
+ color: #002bb8;
+ background: none;
+}
+a:visited {
+ color: #5a3696;
+}
+a:active {
+ color: #faa700;
+}
+a:hover {
+ text-decoration: underline;
+}
+a.stub {
+ color: #772233;
+}
+a.new, #p-personal a.new {
+ color: #ba0000;
+}
+a.new:visited, #p-personal a.new:visited {
+ color: #a55858;
+}
+
+img {
+ border: none;
+ vertical-align: middle;
+}
+p img {
+ margin: 0;
+}
+
+hr {
+ height: 1px;
+ color: #aaa;
+ background-color: #aaa;
+ border: 0;
+ margin: .2em 0 .2em 0;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: black;
+ background: none;
+ font-weight: normal;
+ margin: 0;
+ padding-top: .5em;
+ padding-bottom: .17em;
+ border-bottom: 1px solid #aaa;
+}
+h1 { font-size: 188%; }
+h1 .editsection { font-size: 53%; }
+h2 { font-size: 150%; }
+h2 .editsection { font-size: 67%; }
+h3, h4, h5, h6 {
+ border-bottom: none;
+ font-weight: bold;
+}
+h3 { font-size: 132%; }
+h3 .editsection { font-size: 76%; font-weight: normal; }
+h4 { font-size: 116%; }
+h4 .editsection { font-size: 86%; font-weight: normal; }
+h5 { font-size: 100%; }
+h5 .editsection { font-weight: normal; }
+h6 { font-size: 80%; }
+h6 .editsection { font-size: 125%; font-weight: normal; }
+
+.editsection {
+ float: right;
+ margin-left: 5px;
+}
+
+ul {
+ line-height: 1.5em;
+ list-style-type: square;
+ margin: .3em 0 0 1.5em;
+ padding: 0;
+ list-style-image: url(bullet.gif);
+}
+ol {
+ line-height: 1.5em;
+ margin: .3em 0 0 3.2em;
+ padding: 0;
+ list-style-image: none;
+}
+li {
+ margin-bottom: .1em;
+}
+dt {
+ font-weight: bold;
+ margin-bottom: .1em;
+}
+dl {
+ margin-top: .2em;
+ margin-bottom: .5em;
+}
+dd {
+ line-height: 1.5em;
+ margin-left: 2em;
+ margin-bottom: .1em;
+}
+
+fieldset {
+ border: 1px solid #2f6fab;
+ margin: 1em 0 1em 0;
+ padding: 0 1em 1em;
+ line-height: 1.5em;
+}
+legend {
+ padding: .5em;
+ font-size: 95%;
+}
+form {
+ border: none;
+ margin: 0;
+}
+
+textarea {
+ width: 100%;
+ padding: .1em;
+}
+
+input.historysubmit {
+ padding: 0 .3em .3em .3em !important;
+ font-size: 94%;
+ cursor: pointer;
+ height: 1.7em !important;
+ margin-left: 1.6em;
+}
+select {
+ vertical-align: top;
+}
+abbr, acronym, .explain {
+ border-bottom: 1px dotted black;
+ color: black;
+ background: none;
+ cursor: help;
+}
+q {
+ font-family: Times, "Times New Roman", serif;
+ font-style: italic;
+}
+/* disabled for now
+blockquote {
+ font-family: Times, "Times New Roman", serif;
+ font-style: italic;
+}*/
+code {
+ background-color: #f9f9f9;
+}
+pre {
+ padding: 1em;
+ border: 1px dashed #2f6fab;
+ color: black;
+ background-color: #f9f9f9;
+ line-height: 1.1em;
+}
+
+/*
+** the main content area
+*/
+
+#contentSub, #contentSub2 {
+ font-size: 84%;
+ line-height: 1.2em;
+ margin: 0 0 1.4em 1em;
+ color: #7d7d7d;
+ width: auto;
+}
+span.subpages {
+ display: block;
+}
+
+/* Some space under the headers in the content area */
+#bodyContent h1, #bodyContent h2 {
+ margin-bottom: .6em;
+}
+#bodyContent h3, #bodyContent h4, #bodyContent h5 {
+ margin-bottom: .3em;
+}
+.firstHeading {
+ margin-bottom: .1em;
+}
+
+/* user notification thing */
+.usermessage {
+ background-color: #ffce7b;
+ border: 1px solid #ffa500;
+ color: black;
+ font-weight: bold;
+ margin: 2em 0 1em;
+ padding: .5em 1em;
+ vertical-align: middle;
+}
+#siteNotice {
+ text-align: center;
+ font-size: 95%;
+ padding: 0 .9em;
+}
+#siteNotice p {
+ margin: 0;
+ padding: 0;
+}
+.error {
+ color: red;
+ font-size: larger;
+}
+.errorbox, .successbox {
+ font-size: larger;
+ border: 2px solid;
+ padding: .5em 1em;
+ float: left;
+ margin-bottom: 2em;
+ color: #000;
+}
+.errorbox {
+ border-color: red;
+ background-color: #fff2f2;
+}
+.successbox {
+ border-color: green;
+ background-color: #dfd;
+}
+.errorbox h2, .successbox h2 {
+ font-size: 1em;
+ font-weight: bold;
+ display: inline;
+ margin: 0 .5em 0 0;
+ border: none;
+}
+
+#catlinks {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ margin-top: 1em;
+ clear: both;
+}
+/* currently unused, intended to be used by a metadata box
+in the bottom-right corner of the content area */
+.documentDescription {
+ /* The summary text describing the document */
+ font-weight: bold;
+ display: block;
+ margin: 1em 0;
+ line-height: 1.5em;
+}
+.documentByLine {
+ text-align: right;
+ font-size: 90%;
+ clear: both;
+ font-weight: normal;
+ color: #76797c;
+}
+
+/* emulate center */
+.center {
+ width: 100%;
+ text-align: center;
+}
+*.center * {
+ margin-left: auto;
+ margin-right: auto;
+}
+/* small for tables and similar */
+.small, .small * {
+ font-size: 94%;
+}
+table.small {
+ font-size: 100%;
+}
+
+/*
+** content styles
+*/
+
+#toc,
+.toc,
+.mw-warning {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+#toc h2,
+.toc h2 {
+ display: inline;
+ border: none;
+ padding: 0;
+ font-size: 100%;
+ font-weight: bold;
+}
+#toc #toctitle,
+.toc #toctitle,
+#toc .toctitle,
+.toc .toctitle {
+ text-align: center;
+}
+#toc ul,
+.toc ul {
+ list-style-type: none;
+ list-style-image: none;
+ margin-left: 0;
+ padding-left: 0;
+ text-align: left;
+}
+#toc ul ul,
+.toc ul ul {
+ margin: 0 0 0 2em;
+}
+#toc .toctoggle,
+.toc .toctoggle {
+ font-size: 94%;
+}
+
+.mw-warning {
+ margin-left: 50px;
+ margin-right: 50px;
+ text-align: center;
+}
+
+/* images */
+div.floatright, table.floatright {
+ clear: right;
+ float: right;
+ position: relative;
+ margin: 0 0 .5em .5em;
+ border: 0;
+/*
+ border: .5em solid white;
+ border-width: .5em 0 .8em 1.4em;
+*/
+}
+div.floatright p { font-style: italic; }
+div.floatleft, table.floatleft {
+ float: left;
+ clear: left;
+ position: relative;
+ margin: 0 .5em .5em 0;
+ border: 0;
+/*
+ margin: .3em .5em .5em 0;
+ border: .5em solid white;
+ border-width: .5em 1.4em .8em 0;
+*/
+}
+div.floatleft p { font-style: italic; }
+/* thumbnails */
+div.thumb {
+ margin-bottom: .5em;
+ border-style: solid;
+ border-color: white;
+ width: auto;
+}
+div.thumbinner {
+ border: 1px solid #ccc;
+ padding: 3px !important;
+ background-color: #f9f9f9;
+ font-size: 94%;
+ text-align: center;
+ overflow: hidden;
+}
+html .thumbimage {
+ border: 1px solid #ccc;
+}
+html .thumbcaption {
+ border: none;
+ text-align: left;
+ line-height: 1.4em;
+ padding: 3px !important;
+ font-size: 94%;
+}
+div.magnify {
+ float: right;
+ border: none !important;
+ background: none !important;
+}
+div.magnify a, div.magnify img {
+ display: block;
+ border: none !important;
+ background: none !important;
+}
+div.tright {
+ clear: right;
+ float: right;
+ border-width: .5em 0 .8em 1.4em;
+}
+div.tleft {
+ float: left;
+ clear: left;
+ margin-right: .5em;
+ border-width: .5em 1.4em .8em 0;
+}
+
+.hiddenStructure {
+ display: none;
+ speak: none;
+}
+img.tex {
+ vertical-align: middle;
+}
+span.texhtml {
+ font-family: serif;
+}
+
+/*
+** classes for special content elements like town boxes
+** intended to be referenced directly from the wiki src
+*/
+
+/*
+** User styles
+*/
+/* table standards */
+table.rimage {
+ float: right;
+ position: relative;
+ margin-left: 1em;
+ margin-bottom: 1em;
+ text-align: center;
+}
+.toccolours {
+ border: 1px solid #aaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+}
+div.townBox {
+ position: relative;
+ float: right;
+ background: white;
+ margin-left: 1em;
+ border: 1px solid gray;
+ padding: .3em;
+ width: 200px;
+ overflow: hidden;
+ clear: right;
+}
+div.townBox dl {
+ padding: 0;
+ margin: 0 0 .3em;
+ font-size: 96%;
+}
+div.townBox dl dt {
+ background: none;
+ margin: .4em 0 0;
+}
+div.townBox dl dd {
+ margin: .1em 0 0 1.1em;
+ background-color: #f3f3f3;
+}
+
+/*
+** edit views etc
+*/
+.special li {
+ line-height: 1.4em;
+ margin: 0;
+ padding: 0;
+}
+
+/* Page history styling */
+/* the auto-generated edit comments */
+.autocomment {
+ color: gray;
+}
+#pagehistory span.user {
+ margin-left: 1.4em;
+ margin-right: .4em;
+}
+#pagehistory span.minor {
+ font-weight: bold;
+}
+#pagehistory li {
+ border: 1px solid white;
+}
+#pagehistory li.selected {
+ background-color: #f9f9f9;
+ border: 1px dashed #aaa;
+}
+
+/*
+** Diff rendering
+*/
+table.diff, td.diff-otitle, td.diff-ntitle {
+ background-color: white;
+}
+td.diff-addedline {
+ background: #cfc;
+ font-size: smaller;
+}
+td.diff-deletedline {
+ background: #ffa;
+ font-size: smaller;
+}
+td.diff-context {
+ background: #eee;
+ font-size: smaller;
+}
+span.diffchange {
+ color: red;
+ font-weight: bold;
+}
+
+/*
+** keep the whitespace in front of the ^=, hides rule from konqueror
+** this is css3, the validator doesn't like it when validating as css2
+*/
+#bodyContent a.external,
+#bodyContent a[href ^="gopher://"] {
+ background: url(external.png) center right no-repeat;
+ padding-right: 13px;
+}
+#bodyContent a[href ^="https://"],
+.link-https {
+ background: url(lock_icon.gif) center right no-repeat;
+ padding-right: 16px;
+}
+#bodyContent a[href ^="mailto:"],
+.link-mailto {
+ background: url(mail_icon.gif) center right no-repeat;
+ padding-right: 18px;
+}
+#bodyContent a[href ^="news://"] {
+ background: url(news_icon.png) center right no-repeat;
+ padding-right: 18px;
+}
+#bodyContent a[href ^="ftp://"],
+.link-ftp {
+ background: url(file_icon.gif) center right no-repeat;
+ padding-right: 18px;
+}
+#bodyContent a[href ^="irc://"],
+.link-irc {
+ background: url(discussionitem_icon.gif) center right no-repeat;
+ padding-right: 18px;
+}
+#bodyContent a.external[href $=".ogg"], #bodyContent a.external[href $=".OGG"],
+#bodyContent a.external[href $=".mid"], #bodyContent a.external[href $=".MID"],
+#bodyContent a.external[href $=".midi"], #bodyContent a.external[href $=".MIDI"],
+#bodyContent a.external[href $=".mp3"], #bodyContent a.external[href $=".MP3"],
+#bodyContent a.external[href $=".wav"], #bodyContent a.external[href $=".WAV"],
+#bodyContent a.external[href $=".wma"], #bodyContent a.external[href $=".WMA"],
+.link-audio {
+ background: url("audio.png") center right no-repeat;
+ padding-right: 13px;
+}
+#bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"],
+#bodyContent a.external[href $=".avi"], #bodyContent a.external[href $=".AVI"],
+#bodyContent a.external[href $=".mpeg"], #bodyContent a.external[href $=".MPEG"],
+#bodyContent a.external[href $=".mpg"], #bodyContent a.external[href $=".MPG"],
+.link-video {
+ background: url("video.png") center right no-repeat;
+ padding-right: 13px;
+}
+#bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"],
+#bodyContent a.external[href *=".pdf#"], #bodyContent a.external[href *=".PDF#"],
+#bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"],
+.link-document {
+ background: url("document.png") center right no-repeat;
+ padding-right: 12px;
+}
+
+/* disable interwiki styling */
+#bodyContent a.extiw,
+#bodyContent a.extiw:active {
+ color: #36b;
+ background: none;
+ padding: 0;
+}
+#bodyContent a.external {
+ color: #36b;
+}
+/* this can be used in the content area to switch off
+special external link styling */
+#bodyContent .plainlinks a {
+ background: none !important;
+ padding: 0 !important;
+}
+/*
+** Structural Elements
+*/
+
+/*
+** general portlet styles (elements in the quickbar)
+*/
+.portlet {
+ border: none;
+ margin: 0 0 .5em;
+ padding: 0;
+ float: none;
+ width: 11.6em;
+ overflow: hidden;
+}
+.portlet h4 {
+ font-size: 95%;
+ font-weight: normal;
+ white-space: nowrap;
+}
+.portlet h5 {
+ background: transparent;
+ padding: 0 1em 0 .5em;
+ display: inline;
+ height: 1em;
+ text-transform: lowercase;
+ font-size: 91%;
+ font-weight: normal;
+ white-space: nowrap;
+}
+.portlet h6 {
+ background: #ffae2e;
+ border: 1px solid #2f6fab;
+ border-style: solid solid none solid;
+ padding: 0 1em 0 1em;
+ text-transform: lowercase;
+ display: block;
+ font-size: 1em;
+ height: 1.2em;
+ font-weight: normal;
+ white-space: nowrap;
+}
+.pBody {
+ font-size: 95%;
+ background-color: white;
+ color: black;
+ border-collapse: collapse;
+ border: 1px solid #aaa;
+ padding: 0 .8em .3em .5em;
+}
+.portlet h1,
+.portlet h2,
+.portlet h3,
+.portlet h4 {
+ margin: 0;
+ padding: 0;
+}
+.portlet ul {
+ line-height: 1.5em;
+ list-style-type: square;
+ list-style-image: url(bullet.gif);
+ font-size: 95%;
+}
+.portlet li {
+ padding: 0;
+ margin: 0;
+}
+
+/*
+** Logo properties
+*/
+
+@media handheld {
+ #p-logo { display: none }
+}
+
+/*
+** the navigation portlet
+*/
+
+#p-navigation .pBody {
+ padding-right: 0;
+}
+
+#p-navigation li.active a, #p-navigation li.active a:hover {
+ text-decoration: none;
+ font-weight: bold;
+}
+
+
+/*
+** Search portlet
+*/
+input.searchButton {
+ margin-top: 1px;
+ font-size: 95%;
+}
+#searchGoButton {
+ padding-left: .5em;
+ padding-right: .5em;
+ font-weight: bold;
+}
+#searchInput {
+ width: 10.9em;
+ margin: 0;
+ font-size: 95%;
+}
+#p-search .pBody {
+ padding: .5em .4em .4em .4em;
+ text-align: center;
+}
+
+/*
+** the personal toolbar
+*/
+#p-personal ul {
+ text-transform: lowercase;
+}
+#p-personal li.active {
+ font-weight: bold;
+}
+/*
+** the page-related actions- page/talk, edit etc
+*/
+#p-cactions .hiddenStructure {
+ display: none;
+}
+#p-cactions li a {
+ text-transform: lowercase;
+}
+
+/* TODO: #t-iscite is only used by the Cite extension, come up with some
+ * system which allows extensions to add to this file on the fly
+ */
+#t-ispermalink, #t-iscite {
+ color: #999;
+}
+/*
+** footer
+*/
+#footer {
+ background-color: white;
+ border-top: 1px solid #fabd23;
+ border-bottom: 1px solid #fabd23;
+ margin: .6em 0 1em 0;
+ padding: .4em 0 1.2em 0;
+ text-align: center;
+ font-size: 90%;
+}
+#footer li {
+ display: inline;
+ margin: 0 1.3em;
+}
+/* hide from incapable browsers */
+head:first-child+body #footer li { white-space: nowrap; }
+#f-poweredbyico, #f-copyrightico {
+ margin: 0 8px;
+ position: relative;
+ top: -2px; /* Bump it up just a tad */
+}
+#f-poweredbyico {
+ float: right;
+ height: 1%;
+}
+#f-copyrightico {
+ float: left;
+ height: 1%;
+}
+
+/* js pref toc */
+#preftoc {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ clear: both;
+}
+#preftoc li {
+ background-color: #f0f0f0;
+ color: #000;
+}
+#preftoc li.selected {
+ font-weight: bold;
+ background-color: #f9f9f9;
+ border: 1px solid #aaa;
+ border-bottom: none;
+ cursor: default;
+ top: 1px;
+ padding-top: 2px;
+ margin-right: -3px;
+}
+#preftoc > li.selected {
+ top: 2px;
+}
+#preftoc a,
+#preftoc a:active {
+ display: block;
+ color: #000;
+ padding: 0 .7em;
+ position: relative;
+ text-decoration: none;
+}
+#preftoc li.selected a {
+ cursor: default;
+ text-decoration: none;
+}
+#prefcontrol {
+ padding-top: 2em;
+ clear: both;
+}
+#preferences {
+ margin: 0;
+ border: 1px solid #aaa;
+ clear: both;
+ padding: 1.5em;
+ background-color: #F9F9F9;
+}
+.prefsection {
+ border: none;
+ padding: 0;
+ margin: 0;
+}
+.prefsection fieldset {
+ border: 1px solid #aaa;
+ float: left;
+ margin-right: 2em;
+}
+.prefsection legend {
+ font-weight: bold;
+}
+.prefsection table, .prefsection legend {
+ background-color: #F9F9F9;
+}
+div.prefsectiontip {
+ font-size: 95%;
+ margin-top: 0;
+ background-color: #FFC1C1;
+ padding: .2em .7em;
+ clear: both;
+}
+.btnSavePrefs {
+ font-weight: bold;
+ padding-left: .3em;
+ padding-right: .3em;
+}
+
+.preferences-login {
+ clear: both;
+ margin-bottom: 1.5em;
+}
+
+.prefcache {
+ font-size: 90%;
+ margin-top: 2em;
+}
+
+div#userloginForm form,
+div#userlogin form#userlogin2 {
+ margin: 0 3em 1em 0;
+ border: 1px solid #aaa;
+ clear: both;
+ padding: 1.5em 2em;
+ background-color: #f9f9f9;
+ float: left;
+}
+
+div#userloginForm table,
+div#userlogin form#userlogin2 table {
+ background-color: #f9f9f9;
+}
+
+div#userloginForm h2,
+div#userlogin form#userlogin2 h2 {
+ padding-top: 0;
+}
+
+div#userlogin .captcha {
+ border: 1px solid #bbb;
+ padding: 1.5em 2em;
+ width: 400px;
+ background-color: white;
+}
+
+
+#userloginprompt, #languagelinks {
+ font-size: 85%;
+}
+
+#login-sectiontip {
+ font-size: 85%;
+ line-height: 1.2;
+ padding-top: 2em;
+}
+
+#userlogin .loginText, #userlogin .loginPassword {
+ width: 12em;
+}
+
+#userloginlink a, #wpLoginattempt, #wpCreateaccount {
+ font-weight: bold;
+}
+
+/* more IE fixes */
+/* float/negative margin brokenness */
+* html #footer {margin-top: 0;}
+* html #column-content {
+ display: inline;
+ margin-bottom: 0;
+}
+* html div.editsection { font-size: smaller; }
+#pagehistory li.selected { position: relative; }
+
+/* Mac IE 5.0 fix; floated content turns invisible */
+* > html #column-content {
+ float: none;
+}
+* > html #column-one {
+ position: absolute;
+ left: 0;
+ top: 0;
+}
+* > html #footer {
+ margin-left: 13.2em;
+}
+.redirectText {
+ font-size: 150%;
+ margin: 5px;
+}
+
+.printfooter {
+ display: none;
+}
+
+.not-patrolled {
+ background-color: #ffa;
+}
+div.patrollink {
+ font-size: 75%;
+ text-align: right;
+}
+span.newpage, span.minor, span.searchmatch, span.bot {
+ font-weight: bold;
+}
+span.unpatrolled {
+ font-weight: bold;
+ color: red;
+}
+
+span.searchmatch {
+ color: red;
+}
+.sharedUploadNotice {
+ font-style: italic;
+}
+
+span.updatedmarker {
+ color: black;
+ background-color: #0f0;
+}
+span.newpageletter {
+ font-weight: bold;
+ color: black;
+ background-color: yellow;
+}
+span.minoreditletter {
+ color: black;
+ background-color: #c5ffe6;
+}
+
+table.gallery {
+ border: 1px solid #ccc;
+ margin: 2px;
+ padding: 2px;
+ background-color: white;
+}
+
+table.gallery tr {
+ vertical-align: top;
+}
+
+table.gallery td {
+ vertical-align: top;
+ background-color: #f9f9f9;
+ border: solid 2px white;
+}
+
+table.gallery td.galleryheader {
+ text-align: center;
+ font-weight: bold;
+}
+
+div.gallerybox {
+ margin: 2px;
+ width: 150px;
+}
+
+div.gallerybox div.thumb {
+ text-align: center;
+ border: 1px solid #ccc;
+ margin: 2px;
+}
+
+div.gallerytext {
+ font-size: 94%;
+ padding: 2px 4px;
+}
+
+span.comment {
+ font-style: italic;
+}
+
+span.changedby {
+ font-size: 95%;
+}
+
+.previewnote {
+ text-indent: 3em;
+ color: #c00;
+ border-bottom: 1px solid #aaa;
+ padding-bottom: 1em;
+ margin-bottom: 1em;
+}
+
+.previewnote p {
+ margin: 0;
+ padding: 0;
+}
+
+.editExternally {
+ border: 1px solid gray;
+ background-color: #ffffff;
+ padding: 3px;
+ margin-top: 0.5em;
+ float: left;
+ font-size: small;
+ text-align: center;
+}
+.editExternallyHelp {
+ font-style: italic;
+ color: gray;
+}
+
+li span.deleted, span.history-deleted {
+ text-decoration: line-through;
+ color: #888;
+ font-style: italic;
+}
+
+.toggle {
+ margin-left: 2em;
+ text-indent: -2em;
+}
+
+/* Classes for EXIF data display */
+table.mw_metadata {
+ font-size: 0.8em;
+ margin-left: 0.5em;
+ margin-bottom: 0.5em;
+ width: 300px;
+}
+
+table.mw_metadata caption {
+ font-weight: bold;
+}
+
+table.mw_metadata th {
+ font-weight: normal;
+}
+
+table.mw_metadata td {
+ padding: 0.1em;
+}
+
+table.mw_metadata {
+ border: none;
+ border-collapse: collapse;
+}
+
+table.mw_metadata td, table.mw_metadata th {
+ text-align: center;
+ border: 1px solid #aaaaaa;
+ padding-left: 0.1em;
+ padding-right: 0.1em;
+}
+
+table.mw_metadata th {
+ background-color: #f9f9f9;
+}
+
+table.mw_metadata td {
+ background-color: #fcfcfc;
+}
+
+table.collapsed tr.collapsable {
+ display: none;
+}
+
+
+/* filetoc */
+ul#filetoc {
+ text-align: center;
+ border: 1px solid #aaaaaa;
+ background-color: #f9f9f9;
+ padding: 5px;
+ font-size: 95%;
+ margin-bottom: 0.5em;
+ margin-left: 0;
+ margin-right: 0;
+}
+
+#filetoc li {
+ display: inline;
+ list-style-type: none;
+ padding-right: 2em;
+}
+
+input#wpSummary {
+ width: 80%;
+}
+
+/* @bug 1714 */
+input#wpSave, input#wpDiff {
+ margin-right: 0.33em;
+}
+
+#editform .editOptions {
+ display: inline;
+}
+
+#wpSave {
+ font-weight: bold;
+}
+
+/* Classes for article validation */
+
+table.revisionform_default {
+ border: 1px solid #000000;
+}
+
+table.revisionform_focus {
+ border: 1px solid #000000;
+ background-color:#00BBFF;
+}
+
+tr.revision_tr_default {
+ background-color:#EEEEEE;
+}
+
+tr.revision_tr_first {
+ background-color:#DDDDDD;
+}
+
+p.revision_saved {
+ color: green;
+ font-weight:bold;
+}
+
+#mw_trackbacks {
+ border: solid 1px #bbbbff;
+ background-color: #eeeeff;
+ padding: 0.2em;
+}
+
+
+/* Allmessages table */
+
+#allmessagestable th {
+ background-color: #b2b2ff;
+}
+
+#allmessagestable tr.orig {
+ background-color: #ffe2e2;
+}
+
+#allmessagestable tr.new {
+ background-color: #e2ffe2;
+}
+
+#allmessagestable tr.def {
+ background-color: #f0f0ff;
+}
+
+
+/* noarticletext */
+div.noarticletext {
+ border: 1px solid #ccc;
+ background: #fff;
+ padding: .2em 1em;
+ color: #000;
+}
+
+div#searchTargetContainer {
+ left: 10px;
+ top: 10px;
+ width: 90%;
+ background: white;
+}
+
+div#searchTarget {
+ padding: 3px;
+ margin: 5px;
+ background: #F0F0F0;
+ border: solid 1px blue;
+}
+
+div#searchTarget ul li {
+ list-style: none;
+}
+
+div#searchTarget ul li:before {
+ color: orange;
+ content: "\00BB \0020";
+}
+
+div.multipageimagenavbox {
+ border: solid 1px silver;
+ padding: 4px;
+ margin: 1em;
+ -moz-border-radius: 6px;
+ background: #f0f0f0;
+}
+
+div.multipageimagenavbox div.thumb {
+ border: none;
+ margin-left: 2em;
+ margin-right: 2em;
+}
+
+div.multipageimagenavbox hr {
+ margin: 6px;
+}
+
+table.multipageimage td {
+ text-align: center;
+}
+
+/** Special:Version */
+
+table#sv-ext, table#sv-hooks {
+ margin: 1em;
+ padding:0em;
+}
+
+#sv-ext td, #sv-hooks td,
+#sv-ext th, #sv-hooks th {
+ border: 1px solid #A0A0A0;
+ padding: 0 0.15em 0 0.15em;
+}
+#sv-ext th, #sv-hooks th {
+ background-color: #F0F0F0;
+ color: black;
+ padding: 0 0.15em 0 0.15em;
+}
+tr.sv-space{
+ height: 0.8em;
+ border:none;
+}
+tr.sv-space td { display: none; }
+
+/*
+ Table pager (e.g. Special:Imagelist)
+ - remove underlines from the navigation link
+ - collapse borders
+ - set the borders to outsets (similar to Special:Allmessages)
+ - remove line wrapping for all td and th, set background color
+ - restore line wrapping for the last two table cells (description and size)
+*/
+.TablePager_nav a { text-decoration: none; }
+.TablePager { border-collapse: collapse; }
+.TablePager, .TablePager td, .TablePager th {
+ border: 0.15em solid #777777;
+ padding: 0 0.15em 0 0.15em;
+}
+.TablePager th { background-color: #eeeeff }
+.TablePager td { background-color: #ffffff }
+.TablePager tr:hover td { background-color: #eeeeff }
+
+.imagelist td, .imagelist th { white-space: nowrap }
+.imagelist .TablePager_col_links { background-color: #eeeeff }
+.imagelist .TablePager_col_img_description { white-space: normal }
+.imagelist th.TablePager_sort { background-color: #ccccff }
+
+.templatesUsed { margin-top: 1.5em; }
+
+.mw-summary-preview {
+ margin: 0.1em 0;
+}
+#toolbar { clear: both; }
+
+.mw-plusminus-null { color: #aaa; }
+
+@media handheld {
+ .nonessential {
+ /* Kill big bulky stuff that will clog up the screen */
+ display: none;
+ }
+} \ No newline at end of file
diff --git a/skins/monobook/main.css b/skins/monobook/main.css
index 95b4c735..dbfc0801 100644
--- a/skins/monobook/main.css
+++ b/skins/monobook/main.css
@@ -9,25 +9,38 @@
** All you guys rock :)
*/
-#column-content {
- width: 100%;
- float: right;
- margin: 0 0 .6em -12.2em;
- padding: 0;
-}
+/**
+ * Stylesheet for screen/projection. All rules not marked media-specific are
+ * shared with handheld.css and should be updated in tandem. The rules can't
+ * be in the same file because old browsers like IE5 won't obey @media rules.
+ *
+ * Rules that are screen/projection-specific are marked with commented-out
+ * @media rules and indentation.
+ */
+
+/* @media screen, projection { */
+ #column-content {
+ width: 100%;
+ float: right;
+ margin: 0 0 .6em -12.2em;
+ padding: 0;
+ }
+ #content {
+ margin: 2.8em 0 0 12.2em;
+ padding: 0 1em 1.5em 1em;
+ position: relative;
+ z-index: 2;
+ }
+ #column-one {
+ padding-top: 160px;
+ }
+/* } */
#content {
- margin: 2.8em 0 0 12.2em;
- padding: 0 1em 1.5em 1em;
background: white;
color: black;
border: 1px solid #aaa;
border-right: none;
line-height: 1.5em;
- position: relative;
- z-index: 2;
-}
-#column-one {
- padding-top: 160px;
}
/* the left column width is specified in class .portlet */
@@ -61,6 +74,9 @@ body {
table {
font-size: 100%;
color: black;
+ /* we don't want the bottom borders of <h2>s to be visible through
+ floated tables */
+ background-color: white;
}
a {
text-decoration: none;
@@ -90,10 +106,12 @@ img {
border: none;
vertical-align: middle;
}
-p {
- margin: .4em 0 .5em 0;
- line-height: 1.5em;
-}
+/* @media screen, projection { */
+ p {
+ margin: .4em 0 .5em 0;
+ line-height: 1.5em;
+ }
+/* } */
p img {
margin: 0;
}
@@ -116,15 +134,26 @@ h1, h2, h3, h4, h5, h6 {
border-bottom: 1px solid #aaa;
}
h1 { font-size: 188%; }
+h1 .editsection { font-size: 53%; }
h2 { font-size: 150%; }
+h2 .editsection { font-size: 67%; }
h3, h4, h5, h6 {
border-bottom: none;
font-weight: bold;
}
h3 { font-size: 132%; }
+h3 .editsection { font-size: 76%; font-weight: normal; }
h4 { font-size: 116%; }
+h4 .editsection { font-size: 86%; font-weight: normal; }
h5 { font-size: 100%; }
+h5 .editsection { font-weight: normal; }
h6 { font-size: 80%; }
+h6 .editsection { font-size: 125%; font-weight: normal; }
+
+.editsection {
+ float: right;
+ margin-left: 5px;
+}
ul {
line-height: 1.5em;
@@ -216,13 +245,14 @@ pre {
** the main content area
*/
-#siteSub {
- display: none;
-}
-
-#jump-to-nav {
- display: none;
-}
+/* @media screen, projection { */
+ #siteSub {
+ display: none;
+ }
+ #jump-to-nav {
+ display: none;
+ }
+/* } */
#contentSub, #contentSub2 {
font-size: 84%;
@@ -398,6 +428,7 @@ div.floatright, table.floatright {
div.floatright p { font-style: italic; }
div.floatleft, table.floatleft {
float: left;
+ clear: left;
position: relative;
margin: 0 .5em .5em 0;
border: 0;
@@ -415,7 +446,7 @@ div.thumb {
border-color: white;
width: auto;
}
-div.thumb div {
+div.thumbinner {
border: 1px solid #ccc;
padding: 3px !important;
background-color: #f9f9f9;
@@ -423,14 +454,15 @@ div.thumb div {
text-align: center;
overflow: hidden;
}
-div.thumb div a img {
+html .thumbimage {
border: 1px solid #ccc;
}
-div.thumb div div.thumbcaption {
+html .thumbcaption {
border: none;
text-align: left;
line-height: 1.4em;
- padding: .3em 0 .1em 0;
+ padding: 3px !important;
+ font-size: 94%;
}
div.magnify {
float: right;
@@ -449,6 +481,7 @@ div.tright {
}
div.tleft {
float: left;
+ clear: left;
margin-right: .5em;
border-width: .5em 1.4em .8em 0;
}
@@ -596,6 +629,32 @@ span.diffchange {
background: url(discussionitem_icon.gif) center right no-repeat;
padding-right: 18px;
}
+#bodyContent a.external[href $=".ogg"], #bodyContent a.external[href $=".OGG"],
+#bodyContent a.external[href $=".mid"], #bodyContent a.external[href $=".MID"],
+#bodyContent a.external[href $=".midi"], #bodyContent a.external[href $=".MIDI"],
+#bodyContent a.external[href $=".mp3"], #bodyContent a.external[href $=".MP3"],
+#bodyContent a.external[href $=".wav"], #bodyContent a.external[href $=".WAV"],
+#bodyContent a.external[href $=".wma"], #bodyContent a.external[href $=".WMA"],
+.link-audio {
+ background: url("audio.png") center right no-repeat;
+ padding-right: 13px;
+}
+#bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"],
+#bodyContent a.external[href $=".avi"], #bodyContent a.external[href $=".AVI"],
+#bodyContent a.external[href $=".mpeg"], #bodyContent a.external[href $=".MPEG"],
+#bodyContent a.external[href $=".mpg"], #bodyContent a.external[href $=".MPG"],
+.link-video {
+ background: url("video.png") center right no-repeat;
+ padding-right: 13px;
+}
+#bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"],
+#bodyContent a.external[href *=".pdf#"], #bodyContent a.external[href *=".PDF#"],
+#bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"],
+.link-document {
+ background: url("document.png") center right no-repeat;
+ padding-right: 12px;
+}
+
/* disable interwiki styling */
#bodyContent a.extiw,
#bodyContent a.extiw:active {
@@ -684,48 +743,52 @@ special external link styling */
** Logo properties
*/
-#p-logo {
- z-index: 3;
- position: absolute; /*needed to use z-index */
- top: 0;
- left: 0;
- height: 155px;
- width: 12em;
- overflow: visible;
-}
-#p-logo h5 {
- display: none;
-}
-#p-logo a,
-#p-logo a:hover {
- display: block;
- height: 155px;
- width: 12.2em;
- background-repeat: no-repeat;
- background-position: 35% 50% !important;
- text-decoration: none;
-}
-
+/* @media screen, projection { */
+ #p-logo {
+ top: 0;
+ left: 0;
+ position: absolute; /*needed to use z-index */
+ z-index: 3;
+ height: 155px;
+ width: 12em;
+ overflow: visible;
+ }
+ #p-logo h5 {
+ display: none;
+ }
+ #p-logo a,
+ #p-logo a:hover {
+ display: block;
+ height: 155px;
+ width: 12.2em;
+ background-repeat: no-repeat;
+ background-position: 35% 50% !important;
+ text-decoration: none;
+ }
+/* } */
/*
** the navigation portlet
*/
-#p-navigation {
- position: relative;
- z-index: 3;
-}
+/* @media screen, projection { */
+ #p-navigation {
+ position: relative;
+ z-index: 3;
+ }
+ #p-navigation a {
+ display: block;
+ }
+ #p-navigation li.active a, #p-navigation li.active a:hover {
+ display: inline;
+ }
+/* } */
#p-navigation .pBody {
padding-right: 0;
}
-#p-navigation a {
- display: block;
-}
-
#p-navigation li.active a, #p-navigation li.active a:hover {
text-decoration: none;
- display: inline;
font-weight: bold;
}
@@ -733,10 +796,12 @@ special external link styling */
/*
** Search portlet
*/
-#p-search {
- position: relative;
- z-index: 3;
-}
+/* @media screen, projection { */
+ #p-search {
+ position: relative;
+ z-index: 3;
+ }
+/* } */
input.searchButton {
margin-top: 1px;
font-size: 95%;
@@ -759,176 +824,193 @@ input.searchButton {
/*
** the personal toolbar
*/
-
-#p-personal {
- width: 100%;
- white-space: nowrap;
- padding: 0;
- margin: 0;
- position: absolute;
- left: 0;
- top: 0;
- z-index: 0;
- border: none;
- background: none;
- overflow: visible;
- line-height: 1.2em;
-}
-
-#p-personal h5 {
- display: none;
-}
-#p-personal .portlet,
-#p-personal .pBody {
- padding: 0;
- margin: 0;
- border: none;
- z-index: 0;
- overflow: visible;
- background: none;
-}
+/* @media screen, projection { */
+ #p-personal {
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: 0;
+ }
+ #p-personal {
+ width: 100%;
+ white-space: nowrap;
+ padding: 0;
+ margin: 0;
+ border: none;
+ background: none;
+ overflow: visible;
+ line-height: 1.2em;
+ }
+ #p-personal h5 {
+ display: none;
+ }
+ #p-personal .portlet,
+ #p-personal .pBody {
+ z-index: 0;
+ padding: 0;
+ margin: 0;
+ border: none;
+ overflow: visible;
+ background: none;
+ }
/* this is the ul contained in the portlet */
+ #p-personal ul {
+ border: none;
+ line-height: 1.4em;
+ color: #2f6fab;
+ padding: 0 2em 0 3em;
+ margin: 0;
+ text-align: right;
+ list-style: none;
+ z-index: 0;
+ background: none;
+ cursor: default;
+ }
+ #p-personal li {
+ z-index: 0;
+ border: none;
+ padding: 0;
+ display: inline;
+ color: #2f6fab;
+ margin-left: 1em;
+ line-height: 1.2em;
+ background: none;
+ }
+ #p-personal li a {
+ text-decoration: none;
+ color: #005896;
+ padding-bottom: .2em;
+ background: none;
+ }
+ #p-personal li a:hover {
+ background-color: white;
+ padding-bottom: .2em;
+ text-decoration: none;
+ }
+ #p-personal li.active a:hover {
+ background-color: transparent;
+ }
+ /* the icon in front of the user name, single quotes
+ in bg url to hide it from iemac */
+ li#pt-userpage,
+ li#pt-anonuserpage,
+ li#pt-login {
+ background: url(user.gif) top left no-repeat;
+ padding-left: 20px;
+ text-transform: none;
+ }
+/* } */
#p-personal ul {
- border: none;
- line-height: 1.4em;
- color: #2f6fab;
- padding: 0 2em 0 3em;
- margin: 0;
- text-align: right;
text-transform: lowercase;
- list-style: none;
- z-index: 0;
- background: none;
- cursor: default;
-}
-#p-personal li {
- z-index: 0;
- border: none;
- padding: 0;
- display: inline;
- color: #2f6fab;
- margin-left: 1em;
- line-height: 1.2em;
- background: none;
}
#p-personal li.active {
font-weight: bold;
}
-#p-personal li a {
- text-decoration: none;
- color: #005896;
- padding-bottom: .2em;
- background: none;
-}
-#p-personal li a:hover {
- background-color: white;
- padding-bottom: .2em;
- text-decoration: none;
-}
-#p-personal li.active a:hover {
- background-color: transparent;
-}
-/* the icon in front of the user name, single quotes
-in bg url to hide it from iemac */
-li#pt-userpage,
-li#pt-anonuserpage,
-li#pt-login {
- background: url(user.gif) top left no-repeat;
- padding-left: 20px;
- text-transform: none;
-}
-
/*
** the page-related actions- page/talk, edit etc
*/
-#p-cactions {
- position: absolute;
- top: 1.3em;
- left: 11.5em;
- margin: 0;
- white-space: nowrap;
- width: 76%;
- line-height: 1.1em;
- overflow: visible;
- background: none;
- border-collapse: collapse;
- padding-left: 1em;
- list-style: none;
- font-size: 95%;
-}
+/* @media screen, projection { */
+ #p-cactions {
+ position: absolute;
+ top: 1.3em;
+ left: 11.5em;
+ margin: 0;
+ white-space: nowrap;
+ width: 76%;
+ line-height: 1.1em;
+ overflow: visible;
+ background: none;
+ border-collapse: collapse;
+ padding-left: 1em;
+ list-style: none;
+ font-size: 95%;
+ }
+ #p-cactions ul {
+ list-style: none;
+ }
+ #p-cactions li {
+ display: inline;
+ border: 1px solid #aaa;
+ border-bottom: none;
+ padding: 0 0 .1em 0;
+ margin: 0 .3em 0 0;
+ overflow: visible;
+ background: white;
+ }
+ #p-cactions li.selected {
+ border-color: #fabd23;
+ padding: 0 0 .2em 0;
+ font-weight: bold;
+ }
+ #p-cactions li a {
+ background-color: #fbfbfb;
+ color: #002bb8;
+ border: none;
+ padding: 0 .8em .3em;
+ position: relative;
+ z-index: 0;
+ margin: 0;
+ text-decoration: none;
+ }
+ #p-cactions li.selected a {
+ z-index: 3;
+ padding: 0 1em .2em!important;
+ background-color: white;
+ }
+ #p-cactions .new a {
+ color: #ba0000;
+ }
+ #p-cactions li a:hover {
+ z-index: 3;
+ text-decoration: none;
+ background-color: white;
+ }
+ #p-cactions h5 {
+ display: none;
+ }
+ #p-cactions li.istalk {
+ margin-right: 0;
+ }
+ #p-cactions li.istalk a {
+ padding-right: .5em;
+ }
+ #p-cactions #ca-addsection a {
+ padding-left: .4em;
+ padding-right: .4em;
+ }
+ /* offsets to distinguish the tab groups */
+ li#ca-talk {
+ margin-right: 1.6em;
+ }
+ li#ca-watch, li#ca-unwatch, li#ca-varlang-0, li#ca-print {
+ margin-left: 1.6em;
+ }
+ #p-cactions .pBody {
+ font-size: 1em;
+ background-color: transparent;
+ color: inherit;
+ border-collapse: inherit;
+ border: 0;
+ padding: 0;
+ }
+/* } */
#p-cactions .hiddenStructure {
display: none;
}
-#p-cactions ul {
- list-style: none;
-}
-#p-cactions li {
- display: inline;
- border: 1px solid #aaa;
- border-bottom: none;
- padding: 0 0 .1em 0;
- margin: 0 .3em 0 0;
- overflow: visible;
- background: white;
-}
-#p-cactions li.selected {
- border-color: #fabd23;
- padding: 0 0 .2em 0;
- font-weight: bold;
-}
#p-cactions li a {
- background-color: #fbfbfb;
- color: #002bb8;
- border: none;
- padding: 0 .8em .3em;
- text-decoration: none;
text-transform: lowercase;
- position: relative;
- z-index: 0;
- margin: 0;
-}
-#p-cactions li.selected a {
- z-index: 3;
- background-color: #fff;
- padding: 0 1em .2em!important;
-}
-#p-cactions .new a {
- color: #ba0000;
-}
-#p-cactions li a:hover {
- z-index: 3;
- text-decoration: none;
- background-color: #fff;
-}
-#p-cactions h5 {
- display: none;
-}
-#p-cactions li.istalk {
- margin-right: 0;
-}
-#p-cactions li.istalk a {
- padding-right: .5em;
-}
-#p-cactions #ca-addsection a {
- padding-left: .4em;
- padding-right: .4em;
-}
-/* offsets to distinguish the tab groups */
-li#ca-talk {
- margin-right: 1.6em;
-}
-li#ca-watch, li#ca-unwatch, li#ca-varlang-0, li#ca-print {
- margin-left: 1.6em;
}
/*
** the remaining portlets
*/
-#p-tbx,
-#p-lang {
- position: relative;
- z-index: 3;
-}
+/* @media screen, projection { */
+ #p-tbx,
+ #p-lang {
+ position: relative;
+ z-index: 3;
+ }
+/* } */
/* TODO: #t-iscite is only used by the Cite extension, come up with some
* system which allows extensions to add to this file on the fly
@@ -976,20 +1058,24 @@ head:first-child+body #footer li { white-space: nowrap; }
clear: both;
}
#preftoc li {
- margin: 1px -2px 1px 2px;
- float: left;
- padding: 2px 0 3px 0;
background-color: #f0f0f0;
color: #000;
- border: 1px solid #fff;
- border-right-color: #716f64;
- border-bottom: 0;
- position: relative;
- white-space: nowrap;
- list-style-type: none;
- list-style-image: none;
- z-index: 3;
}
+/* @media screen, projection { */
+ #preftoc li {
+ margin: 1px -2px 1px 2px;
+ float: left;
+ padding: 2px 0 3px 0;
+ border: 1px solid #fff;
+ border-right-color: #716f64;
+ border-bottom: 0;
+ position: relative;
+ white-space: nowrap;
+ list-style-type: none;
+ list-style-image: none;
+ z-index: 3;
+ }
+/* } */
#preftoc li.selected {
font-weight: bold;
background-color: #f9f9f9;
@@ -1042,9 +1128,11 @@ head:first-child+body #footer li { white-space: nowrap; }
.prefsection table, .prefsection legend {
background-color: #F9F9F9;
}
-.mainLegend {
- display: none;
-}
+/* @media screen, projection { */
+ .mainLegend {
+ display: none;
+ }
+/* } */
div.prefsectiontip {
font-size: 95%;
margin-top: 0;
@@ -1114,27 +1202,29 @@ div#userlogin .captcha {
font-weight: bold;
}
-/*
-** IE/Mac fixes, hope to find a validating way to move this
-** to a separate stylesheet. This would work but doesn't validate:
-** @import("IEMacFixes.css");
-*/
-/* tabs: border on the a, not the div */
-* > html #p-cactions li { border: none; }
-* > html #p-cactions li a {
- border: 1px solid #aaa;
- border-bottom: none;
-}
-* > html #p-cactions li.selected a { border-color: #fabd23; }
-/* footer icons need a fixed width */
-* > html #f-poweredbyico,
-* > html #f-copyrightico { width: 88px; }
-* > html #bodyContent,
-* > html #bodyContent pre {
- overflow-x: auto;
- width: 100%;
- padding-bottom: 25px;
-}
+/* @media screen, projection { */
+ /*
+ ** IE/Mac fixes, hope to find a validating way to move this
+ ** to a separate stylesheet. This would work but doesn't validate:
+ ** @import("IEMacFixes.css");
+ */
+ /* tabs: border on the a, not the div */
+ * > html #p-cactions li { border: none; }
+ * > html #p-cactions li a {
+ border: 1px solid #aaa;
+ border-bottom: none;
+ }
+ * > html #p-cactions li.selected a { border-color: #fabd23; }
+ /* footer icons need a fixed width */
+ * > html #f-poweredbyico,
+ * > html #f-copyrightico { width: 88px; }
+ * > html #bodyContent,
+ * > html #bodyContent pre {
+ overflow-x: auto;
+ width: 100%;
+ padding-bottom: 25px;
+ }
+/* } */
/* more IE fixes */
/* float/negative margin brokenness */
@@ -1350,6 +1440,10 @@ ul#filetoc {
padding-right: 2em;
}
+input#wpSummary {
+ width: 80%;
+}
+
/* @bug 1714 */
input#wpSave, input#wpDiff {
margin-right: 0.33em;
@@ -1466,6 +1560,29 @@ table.multipageimage td {
text-align: center;
}
+/** Special:Version */
+
+table#sv-ext, table#sv-hooks {
+ margin: 1em;
+ padding:0em;
+}
+
+#sv-ext td, #sv-hooks td,
+#sv-ext th, #sv-hooks th {
+ border: 1px solid #A0A0A0;
+ padding: 0 0.15em 0 0.15em;
+}
+#sv-ext th, #sv-hooks th {
+ background-color: #F0F0F0;
+ color: black;
+ padding: 0 0.15em 0 0.15em;
+}
+tr.sv-space{
+ height: 0.8em;
+ border:none;
+}
+tr.sv-space td { display: none; }
+
/*
Table pager (e.g. Special:Imagelist)
- remove underlines from the navigation link
@@ -1488,3 +1605,12 @@ table.multipageimage td {
.imagelist .TablePager_col_links { background-color: #eeeeff }
.imagelist .TablePager_col_img_description { white-space: normal }
.imagelist th.TablePager_sort { background-color: #ccccff }
+
+.templatesUsed { margin-top: 1.5em; }
+
+.mw-summary-preview {
+ margin: 0.1em 0;
+}
+#toolbar { clear: both; }
+
+.mw-plusminus-null { color: #aaa; } \ No newline at end of file
diff --git a/skins/monobook/rtl.css b/skins/monobook/rtl.css
index 91e2fb37..f4a67683 100644
--- a/skins/monobook/rtl.css
+++ b/skins/monobook/rtl.css
@@ -41,6 +41,10 @@ html>body .portlet {
float: right;
clear: right;
}
+.editsection {
+ float: left;
+ margin-right: 5px;
+}
/* recover IEMac (might be fine with the float, but usually it's close to IE */
*>body .portlet {
float: none;
diff --git a/skins/monobook/video.png b/skins/monobook/video.png
new file mode 100644
index 00000000..38103dac
--- /dev/null
+++ b/skins/monobook/video.png
Binary files differ
diff --git a/skins/simple/main.css b/skins/simple/main.css
index d55552fc..e474f436 100644
--- a/skins/simple/main.css
+++ b/skins/simple/main.css
@@ -1,3 +1,29 @@
+/* For clarity, explicitly state some recommendations from <http://www.w3.org/
+ TR/CSS21/sample.html> to make sure the editsection links scale right */
+
+h1 { font-size: 2em; }
+h2 { font-size: 1.5em; }
+h3 { font-size: 1.17em; }
+h5 { font-size: .83em; }
+h6 { font-size: .75em; }
+h1, h2, h3, h4, h5, h6 { font-weight: bolder }
+
+/* Now the custom parts */
+
+/* Make edit sections (which are inside h# tags) normal-sized
+ and otherwise format */
+.editsection {
+ font-weight: normal;
+ float: right;
+ margin-left: 5px;
+}
+h1 .editsection { font-size: 50% }
+h2 .editsection { font-size: 66.7% }
+h3 .editsection { font-size: 85.5% }
+h5 .editsection { font-size: 120% }
+h6 .editsection { font-size: 133% }
+
+
#toolbar {
display: none;
}
@@ -276,6 +302,7 @@ div.floatright, table.floatright {
div.floatright p { font-style: italic; }
div.floatleft, table.floatleft {
float: left;
+ clear: left;
margin: 0.3em 0.5em 0.5em 0;
position: relative;
border-width: 0.5em 1.4em 0.8em 0;
@@ -315,6 +342,7 @@ div.tright {
}
div.tleft {
float: left;
+ clear: left;
margin-right:0.5em;
border-width: 0.5em 1.4em 0.8em 0;
}
@@ -402,3 +430,13 @@ div.prefsectiontip {
table.collapsed tr.collapsable {
display: none;
}
+
+.editsection {
+ float: right;
+ margin-left: 5px;
+}
+
+.templatesUsed { margin-top: 1.5em; }
+#toolbar { clear: both; }
+
+.mw-plusminus-null { color: #aaa; } \ No newline at end of file
diff --git a/thumb.php b/thumb.php
index a056dccd..c325d07a 100644
--- a/thumb.php
+++ b/thumb.php
@@ -73,12 +73,15 @@ if ( $thumb && $thumb->path ) {
} else {
$badtitle = wfMsg( 'badtitle' );
$badtitletext = wfMsg( 'badtitletext' );
+ header( 'Cache-Control: no-cache' );
+ header( 'Content-Type: text/html' );
echo "<html><head>
<title>$badtitle</title>
<body>
<h1>$badtitle</h1>
<p>$badtitletext</p>
-</body></html>";
+</body></html>
+";
}
wfProfileOut( 'thumb.php-render' );