summaryrefslogtreecommitdiff
path: root/www
diff options
context:
space:
mode:
authorYaco <franco@reevo.org>2021-10-19 20:30:39 -0300
committerYaco <franco@reevo.org>2021-10-19 20:30:39 -0300
commit8c201ace3699b4928daf41eb7b4cdcb4565c6f3b (patch)
treefbd98f026864e9c1919d3ee740b6799ca0c651e2 /www
parente3880a1c86acaa3bbd05786ad2f5c586e6511a58 (diff)
adds Scribunto
Diffstat (limited to 'www')
-rw-r--r--www/wiki/extensions/Scribunto/.eslintrc.json11
-rw-r--r--www/wiki/extensions/Scribunto/.gitignore26
-rw-r--r--www/wiki/extensions/Scribunto/.gitreview5
-rw-r--r--www/wiki/extensions/Scribunto/.minus-x.json5
-rw-r--r--www/wiki/extensions/Scribunto/.phpcs.xml20
-rw-r--r--www/wiki/extensions/Scribunto/.stylelintrc.json3
-rw-r--r--www/wiki/extensions/Scribunto/CODE_OF_CONDUCT.md1
-rw-r--r--www/wiki/extensions/Scribunto/COPYING376
-rw-r--r--www/wiki/extensions/Scribunto/Gruntfile.js40
-rw-r--r--www/wiki/extensions/Scribunto/Scribunto.magic.php136
-rw-r--r--www/wiki/extensions/Scribunto/Scribunto.namespaces.php498
-rw-r--r--www/wiki/extensions/Scribunto/Scribunto.php99
-rw-r--r--www/wiki/extensions/Scribunto/composer.json36
-rw-r--r--www/wiki/extensions/Scribunto/extension.json167
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ace.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ady-cyrl.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/af.json24
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ais.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ang.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/anp.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ar.json73
-rw-r--r--www/wiki/extensions/Scribunto/i18n/arq.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/arz.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/as.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ast.json68
-rw-r--r--www/wiki/extensions/Scribunto/i18n/atj.json10
-rw-r--r--www/wiki/extensions/Scribunto/i18n/av.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/awa.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/az.json11
-rw-r--r--www/wiki/extensions/Scribunto/i18n/azb.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ba.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/bcl.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/be-tarask.json48
-rw-r--r--www/wiki/extensions/Scribunto/i18n/be.json32
-rw-r--r--www/wiki/extensions/Scribunto/i18n/bg.json32
-rw-r--r--www/wiki/extensions/Scribunto/i18n/bgn.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/bho.json11
-rw-r--r--www/wiki/extensions/Scribunto/i18n/bn.json48
-rw-r--r--www/wiki/extensions/Scribunto/i18n/bqi.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/br.json16
-rw-r--r--www/wiki/extensions/Scribunto/i18n/bs.json19
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ca.json52
-rw-r--r--www/wiki/extensions/Scribunto/i18n/cdo.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ce.json29
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ceb.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ckb.json15
-rw-r--r--www/wiki/extensions/Scribunto/i18n/cs.json64
-rw-r--r--www/wiki/extensions/Scribunto/i18n/csb.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/cv.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/cy.json10
-rw-r--r--www/wiki/extensions/Scribunto/i18n/da.json39
-rw-r--r--www/wiki/extensions/Scribunto/i18n/de-formal.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/de.json69
-rw-r--r--www/wiki/extensions/Scribunto/i18n/din.json9
-rw-r--r--www/wiki/extensions/Scribunto/i18n/diq.json19
-rw-r--r--www/wiki/extensions/Scribunto/i18n/dsb.json45
-rw-r--r--www/wiki/extensions/Scribunto/i18n/dty.json11
-rw-r--r--www/wiki/extensions/Scribunto/i18n/el.json13
-rw-r--r--www/wiki/extensions/Scribunto/i18n/en-gb.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/en.json74
-rw-r--r--www/wiki/extensions/Scribunto/i18n/eo.json52
-rw-r--r--www/wiki/extensions/Scribunto/i18n/es.json76
-rw-r--r--www/wiki/extensions/Scribunto/i18n/et.json39
-rw-r--r--www/wiki/extensions/Scribunto/i18n/eu.json17
-rw-r--r--www/wiki/extensions/Scribunto/i18n/fa.json62
-rw-r--r--www/wiki/extensions/Scribunto/i18n/fi.json63
-rw-r--r--www/wiki/extensions/Scribunto/i18n/fo.json31
-rw-r--r--www/wiki/extensions/Scribunto/i18n/fr.json78
-rw-r--r--www/wiki/extensions/Scribunto/i18n/frp.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/frr.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/fur.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/fy.json16
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ga.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/gcr.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/gd.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/gl.json70
-rw-r--r--www/wiki/extensions/Scribunto/i18n/glk.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/gom-deva.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/gom-latn.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/gor.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/got.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/grc.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/gsw.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/gu.json9
-rw-r--r--www/wiki/extensions/Scribunto/i18n/hak.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/he.json70
-rw-r--r--www/wiki/extensions/Scribunto/i18n/hi.json54
-rw-r--r--www/wiki/extensions/Scribunto/i18n/hif-latn.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/hr.json12
-rw-r--r--www/wiki/extensions/Scribunto/i18n/hrx.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/hsb.json47
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ht.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/hu.json69
-rw-r--r--www/wiki/extensions/Scribunto/i18n/hy.json11
-rw-r--r--www/wiki/extensions/Scribunto/i18n/hyw.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ia.json66
-rw-r--r--www/wiki/extensions/Scribunto/i18n/id.json19
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ie.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ilo.json66
-rw-r--r--www/wiki/extensions/Scribunto/i18n/inh.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/io.json13
-rw-r--r--www/wiki/extensions/Scribunto/i18n/is.json55
-rw-r--r--www/wiki/extensions/Scribunto/i18n/it.json68
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ja.json68
-rw-r--r--www/wiki/extensions/Scribunto/i18n/jam.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/jut.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/jv.json35
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ka.json24
-rw-r--r--www/wiki/extensions/Scribunto/i18n/kab.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/kbp.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/kea.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/khw.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/kk-cyrl.json21
-rw-r--r--www/wiki/extensions/Scribunto/i18n/kn.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ko.json66
-rw-r--r--www/wiki/extensions/Scribunto/i18n/krc.json9
-rw-r--r--www/wiki/extensions/Scribunto/i18n/krl.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ksh.json57
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ku-latn.json24
-rw-r--r--www/wiki/extensions/Scribunto/i18n/kum.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/kw.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/la.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/lb.json29
-rw-r--r--www/wiki/extensions/Scribunto/i18n/lez.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/lfn.json9
-rw-r--r--www/wiki/extensions/Scribunto/i18n/li.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/lij.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/lki.json10
-rw-r--r--www/wiki/extensions/Scribunto/i18n/lo.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/lrc.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/lt.json11
-rw-r--r--www/wiki/extensions/Scribunto/i18n/luz.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/lv.json33
-rw-r--r--www/wiki/extensions/Scribunto/i18n/lzh.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/mai.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/mg.json9
-rw-r--r--www/wiki/extensions/Scribunto/i18n/mhr.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/mk.json67
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ml.json64
-rw-r--r--www/wiki/extensions/Scribunto/i18n/mn.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/mo.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/mr.json50
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ms.json49
-rw-r--r--www/wiki/extensions/Scribunto/i18n/mt.json10
-rw-r--r--www/wiki/extensions/Scribunto/i18n/mui.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/mwl.json68
-rw-r--r--www/wiki/extensions/Scribunto/i18n/my.json9
-rw-r--r--www/wiki/extensions/Scribunto/i18n/myv.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/mzn.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/nan.json10
-rw-r--r--www/wiki/extensions/Scribunto/i18n/nap.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/nb.json70
-rw-r--r--www/wiki/extensions/Scribunto/i18n/nds-nl.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ne.json12
-rw-r--r--www/wiki/extensions/Scribunto/i18n/nl.json71
-rw-r--r--www/wiki/extensions/Scribunto/i18n/nn.json57
-rw-r--r--www/wiki/extensions/Scribunto/i18n/nys.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/oc.json15
-rw-r--r--www/wiki/extensions/Scribunto/i18n/olo.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/or.json9
-rw-r--r--www/wiki/extensions/Scribunto/i18n/pa.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/pfl.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/pl.json73
-rw-r--r--www/wiki/extensions/Scribunto/i18n/pms.json41
-rw-r--r--www/wiki/extensions/Scribunto/i18n/pnb.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/prs.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ps.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/pt-br.json78
-rw-r--r--www/wiki/extensions/Scribunto/i18n/pt.json74
-rw-r--r--www/wiki/extensions/Scribunto/i18n/qqq.json84
-rw-r--r--www/wiki/extensions/Scribunto/i18n/qu.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/rm.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ro.json38
-rw-r--r--www/wiki/extensions/Scribunto/i18n/roa-tara.json16
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ru.json72
-rw-r--r--www/wiki/extensions/Scribunto/i18n/rue.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/sa.json10
-rw-r--r--www/wiki/extensions/Scribunto/i18n/sah.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/sat.json9
-rw-r--r--www/wiki/extensions/Scribunto/i18n/scn.json66
-rw-r--r--www/wiki/extensions/Scribunto/i18n/sco.json19
-rw-r--r--www/wiki/extensions/Scribunto/i18n/sd.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/sdh.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/sgs.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/sh.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/shn.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/si.json31
-rw-r--r--www/wiki/extensions/Scribunto/i18n/sk.json26
-rw-r--r--www/wiki/extensions/Scribunto/i18n/skr-arab.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/sl.json16
-rw-r--r--www/wiki/extensions/Scribunto/i18n/sq.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/sr-ec.json26
-rw-r--r--www/wiki/extensions/Scribunto/i18n/sr-el.json25
-rw-r--r--www/wiki/extensions/Scribunto/i18n/sty.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/su.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/sv.json73
-rw-r--r--www/wiki/extensions/Scribunto/i18n/szl.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ta.json10
-rw-r--r--www/wiki/extensions/Scribunto/i18n/tay.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/tcy.json11
-rw-r--r--www/wiki/extensions/Scribunto/i18n/te.json13
-rw-r--r--www/wiki/extensions/Scribunto/i18n/tg-cyrl.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/th.json69
-rw-r--r--www/wiki/extensions/Scribunto/i18n/tl.json39
-rw-r--r--www/wiki/extensions/Scribunto/i18n/tly.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/tr.json24
-rw-r--r--www/wiki/extensions/Scribunto/i18n/tt-cyrl.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/tt-latn.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/udm.json10
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ug-arab.json10
-rw-r--r--www/wiki/extensions/Scribunto/i18n/uk.json73
-rw-r--r--www/wiki/extensions/Scribunto/i18n/ur.json27
-rw-r--r--www/wiki/extensions/Scribunto/i18n/vec.json9
-rw-r--r--www/wiki/extensions/Scribunto/i18n/vep.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/vi.json68
-rw-r--r--www/wiki/extensions/Scribunto/i18n/vo.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/vro.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/wa.json10
-rw-r--r--www/wiki/extensions/Scribunto/i18n/war.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/wo.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/wuu.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/xal.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/xmf.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/yi.json27
-rw-r--r--www/wiki/extensions/Scribunto/i18n/yo.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/yue.json10
-rw-r--r--www/wiki/extensions/Scribunto/i18n/zgh.json8
-rw-r--r--www/wiki/extensions/Scribunto/i18n/zh-hans.json74
-rw-r--r--www/wiki/extensions/Scribunto/i18n/zh-hant.json65
-rw-r--r--www/wiki/extensions/Scribunto/includes/common/ApiScribuntoConsole.php150
-rw-r--r--www/wiki/extensions/Scribunto/includes/common/Base.php361
-rw-r--r--www/wiki/extensions/Scribunto/includes/common/Common.php209
-rw-r--r--www/wiki/extensions/Scribunto/includes/common/Hooks.php397
-rw-r--r--www/wiki/extensions/Scribunto/includes/common/ScribuntoContent.php160
-rw-r--r--www/wiki/extensions/Scribunto/includes/common/ScribuntoContentHandler.php52
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/HashLibrary.php44
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/HtmlLibrary.php11
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LanguageLibrary.php364
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LibraryBase.php181
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LuaCommon.php1063
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LuaInterpreter.php68
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/MessageLibrary.php59
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/SiteLibrary.php189
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/TextLibrary.php142
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/TitleLibrary.php381
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/UriLibrary.php56
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/UstringLibrary.php781
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/bit32.lua209
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/libraryUtil.lua71
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/luabit/bit.lua264
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/luabit/hex.lua99
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/luabit/readme.txt143
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.hash.lua30
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.html.lua433
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.language.lua189
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.lua784
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.message.lua198
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.site.lua86
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.text.lua330
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.title.lua337
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.uri.lua623
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mw.ustring.lua108
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/mwInit.lua143
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/package.lua127
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/ustring/README51
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/ustring/charsets.lua3117
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/ustring/lower.lua679
-rwxr-xr-xwww/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/ustring/make-normalization-table.php237
-rwxr-xr-xwww/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/ustring/make-tables.php154
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/ustring/normalization-data.lua9450
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/ustring/string.lua15
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/ustring/upper.lua715
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/ustring/ustring.lua1242
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaSandbox/Engine.php401
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaStandalone/LuaStandaloneEngine.php781
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaStandalone/MWServer.lua710
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaStandalone/binaries/README39
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaStandalone/binaries/generic.patch22
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_Win32_bin/lua5.1.exebin0 -> 409600 bytes
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_Win64_bin/lua5.1.exebin0 -> 483328 bytes
-rwxr-xr-xwww/wiki/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_32_generic/luabin0 -> 171697 bytes
-rwxr-xr-xwww/wiki/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/luabin0 -> 195508 bytes
-rwxr-xr-xwww/wiki/extensions/Scribunto/includes/engines/LuaStandalone/binaries/lua5_1_5_mac_lion_fat_generic/luabin0 -> 201644 bytes
-rwxr-xr-xwww/wiki/extensions/Scribunto/includes/engines/LuaStandalone/lua_ulimit.sh7
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaStandalone/mw_main.lua8
-rw-r--r--www/wiki/extensions/Scribunto/includes/engines/LuaStandalone/protocol.txt176
-rw-r--r--www/wiki/extensions/Scribunto/modules/ext.scribunto.edit.css64
-rw-r--r--www/wiki/extensions/Scribunto/modules/ext.scribunto.edit.js398
-rw-r--r--www/wiki/extensions/Scribunto/modules/ext.scribunto.errors.css8
-rw-r--r--www/wiki/extensions/Scribunto/modules/ext.scribunto.errors.js41
-rw-r--r--www/wiki/extensions/Scribunto/modules/ext.scribunto.logs.css4
-rw-r--r--www/wiki/extensions/Scribunto/package-lock.json3273
-rw-r--r--www/wiki/extensions/Scribunto/package.json16
-rw-r--r--www/wiki/extensions/Scribunto/tests/parser/luaParserTests.txt497
-rw-r--r--www/wiki/extensions/Scribunto/tests/phan/config.php33
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/CommonTest.php751
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/CommonTests-data-fail1.lua2
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/CommonTests-data-fail2.lua4
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/CommonTests-data-fail3.lua4
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/CommonTests-data-fail4.lua4
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/CommonTests-data-fail5.lua4
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/CommonTests-data.lua20
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/CommonTests-lib.lua30
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/CommonTests.lua387
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/HashLibraryTest.php13
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/HashLibraryTests.lua53
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/HtmlLibraryTest.php26
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/HtmlLibraryTests.lua359
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/LanguageLibraryTest.php70
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/LanguageLibraryTests.lua435
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/LibraryUtilTest.php12
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/LibraryUtilTests.lua220
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/LuaDataProvider.php53
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/LuaEngineTestBase.php291
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/LuaEnvironmentComparisonTest.php114
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/LuaInterpreterTest.php164
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/MessageLibraryTest.php12
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/MessageLibraryTests.lua70
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/SiteLibraryTest.php12
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/SiteLibraryTests.lua182
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/TestFramework.lua246
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/TextLibraryTest.php41
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/TextLibraryTests.lua509
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/TitleLibraryTest.php167
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/TitleLibraryTests.lua420
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/UriLibraryTest.php26
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/UriLibraryTests.lua182
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/UstringLibraryNormalizationTests.lua33
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/UstringLibraryPureLuaTest.php35
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/UstringLibraryTest.php192
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaCommon/UstringLibraryTests.lua730
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaSandbox/LuaSandboxInterpreterTest.php34
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaSandbox/SandboxTest.php101
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaSandbox/SandboxTests.lua18
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaStandalone/LuaStandaloneInterpreterTest.php260
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaStandalone/StandaloneTest.php28
-rw-r--r--www/wiki/extensions/Scribunto/tests/phpunit/engines/LuaStandalone/StandaloneTests.lua72
337 files changed, 43817 insertions, 0 deletions
diff --git a/www/wiki/extensions/Scribunto/.eslintrc.json b/www/wiki/extensions/Scribunto/.eslintrc.json
new file mode 100644
index 00000000..c6ad99e8
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/.eslintrc.json
@@ -0,0 +1,11 @@
+{
+ "root": true,
+ "extends": "wikimedia",
+ "env": {
+ "browser": true,
+ "jquery": true
+ },
+ "globals": {
+ "mediaWiki": false
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/.gitignore b/www/wiki/extensions/Scribunto/.gitignore
new file mode 100644
index 00000000..5e4f1222
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/.gitignore
@@ -0,0 +1,26 @@
+NormalizationTest.txt
+node_modules/
+vendor/
+composer.lock
+
+# Editors
+*.kate-swp
+*~
+\#*#
+.#*
+.*.swp
+.project
+.buildpath
+.classpath
+.settings
+cscope.files
+cscope.out
+*.orig
+## NetBeans
+nbproject*
+project.index
+## Sublime
+sublime-*
+sftp-config.json
+tests/phan/issues
+/.eslintcache
diff --git a/www/wiki/extensions/Scribunto/.gitreview b/www/wiki/extensions/Scribunto/.gitreview
new file mode 100644
index 00000000..e93945af
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/.gitreview
@@ -0,0 +1,5 @@
+[gerrit]
+host=gerrit.wikimedia.org
+port=29418
+project=mediawiki/extensions/Scribunto.git
+track=1
diff --git a/www/wiki/extensions/Scribunto/.minus-x.json b/www/wiki/extensions/Scribunto/.minus-x.json
new file mode 100644
index 00000000..e92e6f69
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/.minus-x.json
@@ -0,0 +1,5 @@
+{
+ "ignore": [
+ "./includes/engines/LuaStandalone/binaries/lua5_1_5_mac_lion_fat_generic/lua"
+ ]
+}
diff --git a/www/wiki/extensions/Scribunto/.phpcs.xml b/www/wiki/extensions/Scribunto/.phpcs.xml
new file mode 100644
index 00000000..b56d6d5c
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/.phpcs.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<ruleset name="Scribunto">
+ <rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
+ <exclude name="Generic.Files.OneObjectStructurePerFile.MultipleFound" />
+ <exclude name="MediaWiki.Commenting.FunctionComment.DefaultNullTypeParam" />
+ <exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationProtected" />
+ <exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic" />
+ <exclude name="MediaWiki.Commenting.MissingCovers.MissingCovers" />
+ <exclude name="MediaWiki.Commenting.PhpunitAnnotations.NotClassTrait" />
+ <exclude name="MediaWiki.Files.ClassMatchesFilename.NotMatch" />
+ <exclude name="MediaWiki.Usage.ForbiddenFunctions.popen" />
+ <exclude name="MediaWiki.Usage.ForbiddenFunctions.proc_open" />
+ <exclude name="MediaWiki.Usage.ForbiddenFunctions.shell_exec" />
+ <exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.NewLineComment" />
+ <exclude name="Squiz.Scope.MethodScope.Missing" />
+ </rule>
+ <file>.</file>
+ <arg name="extensions" value="php" />
+ <arg name="encoding" value="UTF-8" />
+</ruleset>
diff --git a/www/wiki/extensions/Scribunto/.stylelintrc.json b/www/wiki/extensions/Scribunto/.stylelintrc.json
new file mode 100644
index 00000000..2c907302
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/.stylelintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": "stylelint-config-wikimedia"
+}
diff --git a/www/wiki/extensions/Scribunto/CODE_OF_CONDUCT.md b/www/wiki/extensions/Scribunto/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000..498acf76
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/CODE_OF_CONDUCT.md
@@ -0,0 +1 @@
+The development of this software is covered by a [Code of Conduct](https://www.mediawiki.org/wiki/Special:MyLanguage/Code_of_Conduct).
diff --git a/www/wiki/extensions/Scribunto/COPYING b/www/wiki/extensions/Scribunto/COPYING
new file mode 100644
index 00000000..3eca3450
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/COPYING
@@ -0,0 +1,376 @@
+The majority of Scribunto is licensed under the GNU General Public License,
+version 2 or later. The text of this license is included below.
+
+Some included files and subdirectories are licensed with an MIT license, not
+with the GPL. These are:
+
+* engines/LuaCommon/lualib/package.lua (as described in that file)
+* engines/LuaCommon/lualib/luabit/ (as described in readme.txt in that directory)
+* engines/LuaCommon/lualib/ustring/ (as described in README in that directory)
+* engines/LuaStandalone/binaries/ (as described in README in that directory)
+
+The text of this license is also included below.
+
+------------------------------------------------------------------------------
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
+
+------------------------------------------------------------------------------
+
+ MIT LICENSE
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/www/wiki/extensions/Scribunto/Gruntfile.js b/www/wiki/extensions/Scribunto/Gruntfile.js
new file mode 100644
index 00000000..35b9ec48
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/Gruntfile.js
@@ -0,0 +1,40 @@
+/* eslint-env node, es6 */
+module.exports = function ( grunt ) {
+ grunt.loadNpmTasks( 'grunt-banana-checker' );
+ grunt.loadNpmTasks( 'grunt-eslint' );
+ grunt.loadNpmTasks( 'grunt-jsonlint' );
+ grunt.loadNpmTasks( 'grunt-stylelint' );
+
+ grunt.initConfig( {
+ eslint: {
+ options: {
+ cache: true
+ },
+ all: [
+ '**/*.js',
+ '!node_modules/**',
+ '!vendor/**'
+ ]
+ },
+ banana: {
+ all: 'i18n/'
+ },
+ jsonlint: {
+ all: [
+ '**/*.json',
+ '!node_modules/**',
+ '!vendor/**'
+ ]
+ },
+ stylelint: {
+ all: [
+ '**/*.css',
+ '!node_modules/**',
+ '!vendor/**'
+ ]
+ }
+ } );
+
+ grunt.registerTask( 'test', [ 'eslint', 'jsonlint', 'banana', 'stylelint' ] );
+ grunt.registerTask( 'default', 'test' );
+};
diff --git a/www/wiki/extensions/Scribunto/Scribunto.magic.php b/www/wiki/extensions/Scribunto/Scribunto.magic.php
new file mode 100644
index 00000000..3ca7859a
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/Scribunto.magic.php
@@ -0,0 +1,136 @@
+<?php
+/**
+ * Internationalization file for magic words.
+ */
+
+$magicWords = [];
+
+/** English (English) */
+$magicWords['en'] = [
+ 'invoke' => [ 0, 'invoke' ],
+];
+
+/** Arabic (العربية) */
+$magicWords['ar'] = [
+ 'invoke' => [ 0, 'استدعاء' ],
+];
+
+/** Egyptian Arabic (مصرى) */
+$magicWords['arz'] = [
+ 'invoke' => [ 0, 'استدعا' ],
+];
+
+/** Breton (Brezhoneg) */
+$magicWords['br'] = [
+ 'invoke' => [ 0, 'galv' ],
+];
+
+/** Chuvash (Чӑвашла) */
+$magicWords['cv'] = [
+ 'invoke' => [ 0, 'invoke' ],
+];
+
+/** German (Deutsch) */
+$magicWords['de'] = [
+ 'invoke' => [ 0, 'aufrufen' ],
+];
+
+/** Zazaki (Zazaki) */
+$magicWords['diq'] = [
+ 'invoke' => [ 0, 'veynden' ],
+];
+
+/** Spanish (español) */
+$magicWords['es'] = [
+ 'invoke' => [ 0, 'invocar' ],
+];
+
+/** Persian (فارسی) */
+$magicWords['fa'] = [
+ 'invoke' => [ 0, 'درخواست' ],
+];
+
+/** French (français) */
+$magicWords['fr'] = [
+ 'invoke' => [ 0, 'invoque' ],
+];
+
+/** Galician (galego) */
+$magicWords['gl'] = [
+ 'invoke' => [ 0, 'chamar' ],
+];
+
+/** Hindi (हिन्दी) */
+$magicWords['hi'] = [
+ 'invoke' => [ 0, 'बुलाएँ', 'बुलायें' ],
+];
+
+/** Indonesian (Bahasa Indonesia) */
+$magicWords['id'] = [
+ 'invoke' => [ 0, 'pinta' ],
+];
+
+/** Korean (한국어) */
+$magicWords['ko'] = [
+ 'invoke' => [ 0, '호출' ],
+];
+
+/** Minangkabau (Baso Minangkabau) */
+$magicWords['min'] = [
+ 'invoke' => [ 0, 'pinta' ],
+];
+
+/** Macedonian (македонски) */
+$magicWords['mk'] = [
+ 'invoke' => [ 0, 'повикај' ],
+];
+
+/** Malayalam (മലയാളം) */
+$magicWords['ml'] = [
+ 'invoke' => [ 0, 'ഉണർത്തുക' ],
+];
+
+/** Dutch (Nederlands) */
+$magicWords['nl'] = [
+ 'invoke' => [ 0, 'aanroepen' ],
+];
+
+/** Norwegian Nynorsk (norsk nynorsk) */
+$magicWords['nn'] = [
+ 'invoke' => [ 0, 'køyr' ],
+];
+
+/** Brazilian Portuguese (português do Brasil) */
+$magicWords['pt-br'] = [
+ 'invoke' => [ 0, 'invocar' ],
+];
+
+/** Russian (русский) */
+$magicWords['ru'] = [
+ 'invoke' => [ 0, 'вызвать' ],
+];
+
+/** Ukrainian (українська) */
+$magicWords['uk'] = [
+ 'invoke' => [ 0, 'викликати', 'вызвать' ],
+];
+
+/** Urdu (اردو) */
+$magicWords['ur'] = [
+ 'invoke' => [ 0, 'استدعا' ],
+];
+
+/** Vietnamese (Tiếng Việt) */
+$magicWords['vi'] = [
+ 'invoke' => [ 0, 'gọi' ],
+];
+
+/** Simplified Chinese (中文(简体)‎) */
+$magicWords['zh-hans'] = [
+ 'invoke' => [ 0, '调用' ],
+];
+
+/** Traditional Chinese (中文(繁體)‎) */
+$magicWords['zh-hant'] = [
+ 'invoke' => [ 0, '調動' ],
+];
diff --git a/www/wiki/extensions/Scribunto/Scribunto.namespaces.php b/www/wiki/extensions/Scribunto/Scribunto.namespaces.php
new file mode 100644
index 00000000..36049bce
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/Scribunto.namespaces.php
@@ -0,0 +1,498 @@
+<?php
+/**
+ * Internationalisation file for extension Scribunto.
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+$namespaceNames = [];
+
+$namespaceNames['en'] = [
+ 828 => 'Module',
+ 829 => 'Module_talk',
+];
+
+$namespaceNames['ab'] = [
+ 828 => 'Амодул',
+ 829 => 'Амодул_ахцәажәара',
+];
+
+$namespaceNames['an'] = [
+ 828 => 'Módulo',
+ 829 => 'Descusión_módulo',
+];
+
+$namespaceNames['ar'] = [
+ 828 => 'وحدة',
+ 829 => 'نقاش_الوحدة',
+];
+
+$namespaceNames['ast'] = [
+ 828 => 'Módulu',
+ 829 => 'Módulu_alderique',
+];
+
+$namespaceNames['atj'] = [
+ 828 => 'Aitapihikewin',
+ 829 => 'Aitapihikan_ke_ici_aimihitonaniwok',
+];
+
+$namespaceNames['azb'] = [
+ 828 => 'ماژول',
+ 829 => 'ماژول_دانیشیغی',
+];
+
+$namespaceNames['ba'] = [
+ 828 => 'Модуль',
+ 829 => 'Модуль_буйынса_фекерләшеү',
+];
+
+$namespaceNames['be'] = [
+ 828 => 'Модуль',
+ 829 => 'Размовы_пра_модуль',
+];
+
+$namespaceNames['be-tarask'] = [
+ 828 => 'Модуль',
+ 829 => 'Абмеркаваньне_модулю',
+];
+
+$namespaceNames['bg'] = [
+ 828 => 'Модул',
+ 829 => 'Модул_беседа',
+];
+
+$namespaceNames['bgn'] = [
+ 828 => 'ماژول',
+ 829 => 'ماژول_ئی_گپ',
+];
+
+$namespaceNames['bn'] = [
+ 828 => 'মডিউল',
+ 829 => 'মডিউল_আলাপ',
+];
+
+$namespaceNames['br'] = [
+ 828 => 'Modulenn',
+ 829 => 'Kaozeadenn_modulenn',
+];
+
+$namespaceNames['bs'] = [
+ 828 => 'Modul',
+ 829 => 'Razgovor_o_modulu',
+];
+
+$namespaceNames['ca'] = [
+ 828 => 'Mòdul',
+ 829 => 'Mòdul_Discussió',
+];
+
+$namespaceNames['ce'] = [
+ 828 => 'Модуль',
+ 829 => 'Модулин_дийцаре',
+];
+
+$namespaceNames['ckb'] = [
+ 828 => 'مۆدیوول',
+ 829 => 'لێدوانی_مۆدیوول',
+];
+
+$namespaceNames['crh'] = [
+ 828 => 'Modul',
+ 829 => 'Modul_muzakeresi',
+];
+
+$namespaceNames['cs'] = [
+ 828 => 'Modul',
+ 829 => 'Diskuse_k_modulu',
+];
+
+$namespaceNames['cy'] = [
+ 828 => 'Modiwl',
+ 829 => 'Sgwrs_modiwl',
+];
+
+$namespaceNames['da'] = [
+ 828 => 'Modul',
+ 829 => 'Moduldiskussion',
+];
+
+$namespaceNames['de'] = [
+ 828 => 'Modul',
+ 829 => 'Modul_Diskussion',
+];
+
+$namespaceNames['din'] = [
+ 828 => 'Mukääcëtök',
+ 829 => 'Jam_wɛ̈t_ë_mukääcëtök',
+];
+
+$namespaceNames['diq'] = [
+ 828 => 'Modul',
+ 829 => 'Modul_vaten',
+];
+
+$namespaceNames['dsb'] = [
+ 828 => 'Modul',
+ 829 => 'Modul_diskusija',
+];
+
+$namespaceNames['dty'] = [
+ 828 => 'मोड्युल',
+ 829 => 'मोड्युल_कुरणि',
+];
+
+$namespaceNames['dv'] = [
+ 828 => 'މޮޑިއުލް',
+ 829 => 'މޮޑިއުލް_ޚިޔާލު',
+];
+
+$namespaceNames['eml'] = [
+ 828 => 'Mòdul',
+ 829 => 'Discusiòun_dal_Mòdul',
+];
+
+$namespaceNames['eo'] = [
+ 828 => 'Modulo',
+ 829 => 'Modulo-Diskuto',
+];
+
+$namespaceNames['es'] = [
+ 828 => 'Módulo',
+ 829 => 'Módulo_discusión',
+];
+
+$namespaceNames['et'] = [
+ 828 => 'Moodul',
+ 829 => 'Mooduli_arutelu',
+];
+
+$namespaceNames['eu'] = [
+ 828 => 'Modulu',
+ 829 => 'Modulu_eztabaida',
+];
+
+$namespaceNames['fa'] = [
+ 828 => 'پودمان',
+ 829 => 'بحث_پودمان',
+];
+
+$namespaceNames['fi'] = [
+ 828 => 'Moduuli',
+ 829 => 'Keskustelu_moduulista',
+];
+
+$namespaceNames['fr'] = [
+ 828 => 'Module',
+ 829 => 'Discussion_module',
+];
+
+$namespaceNames['gd'] = [
+ 828 => 'Mòideal',
+ 829 => 'Deasbaireachd_mòideil',
+];
+
+$namespaceNames['gl'] = [
+ 828 => 'Módulo',
+ 829 => 'Conversa_módulo',
+];
+
+$namespaceNames['gom-deva'] = [
+ 828 => 'एकक',
+ 829 => 'एकक_चर्चा',
+];
+
+$namespaceNames['gu'] = [
+ 828 => 'વિભાગ',
+ 829 => 'વિભાગ_ચર્ચા',
+];
+
+$namespaceNames['he'] = [
+ 828 => 'יחידה',
+ 829 => 'שיחת_יחידה',
+];
+
+$namespaceNames['hr'] = [
+ 828 => 'Modul',
+ 829 => 'Razgovor_o_modulu',
+];
+
+$namespaceNames['hsb'] = [
+ 828 => 'Modul',
+ 829 => 'Modul_diskusija',
+];
+
+$namespaceNames['hu'] = [
+ 828 => 'Modul',
+ 829 => 'Modulvita',
+];
+
+$namespaceNames['hy'] = [
+ 828 => 'Մոդուլ',
+ 829 => 'Մոդուլի_քննարկում',
+];
+
+$namespaceNames['id'] = [
+ 828 => 'Modul',
+ 829 => 'Pembicaraan_Modul',
+];
+
+$namespaceNames['ilo'] = [
+ 828 => 'Modulo',
+ 829 => 'Modulo_tungtungan',
+];
+
+$namespaceNames['it'] = [
+ 828 => 'Modulo',
+ 829 => 'Discussioni_modulo',
+];
+
+$namespaceNames['ja'] = [
+ 828 => 'モジュール',
+ 829 => 'モジュール・トーク',
+];
+
+$namespaceNames['jv'] = [
+ 828 => 'Modhul',
+ 829 => 'Parembugan_Modhul',
+];
+
+$namespaceNames['ka'] = [
+ 828 => 'მოდული',
+ 829 => 'მოდულის_განხილვა',
+];
+
+$namespaceNames['kn'] = [
+ 828 => 'ಮಾಡ್ಯೂಲ್',
+ 829 => 'ಮಾಡ್ಯೂಲ್_ಚರ್ಚೆ',
+];
+
+$namespaceNames['ko'] = [
+ 828 => '모듈',
+ 829 => '모듈토론',
+];
+
+$namespaceNames['ku'] = [
+ 828 => 'Modul',
+ 829 => 'Gotûbêja_modulê',
+];
+
+$namespaceNames['lb'] = [
+ 828 => 'Modul',
+ 829 => 'Modul_Diskussioun',
+];
+
+$namespaceNames['lrc'] = [
+ 828 => 'ماجول',
+ 829 => 'چک_چنه_ماجول',
+];
+
+$namespaceNames['lv'] = [
+ 828 => 'Modulis',
+ 829 => 'Moduļa_diskusija',
+];
+
+$namespaceNames['mai'] = [
+ 828 => 'मोड्युल',
+ 829 => 'मोड्युल_वार्ता',
+];
+
+$namespaceNames['min'] = [
+ 828 => 'Modul',
+ 829 => 'Rundiang_Modul',
+];
+
+$namespaceNames['mk'] = [
+ 828 => 'Модул',
+ 829 => 'Разговор_за_модул',
+];
+
+$namespaceNames['ml'] = [
+ 828 => 'ഘടകം',
+ 829 => 'ഘടകത്തിന്റെ_സംവാദം',
+];
+
+$namespaceNames['mr'] = [
+ 828 => 'विभाग',
+ 829 => 'विभाग_चर्चा',
+];
+
+$namespaceNames['ms'] = [
+ 828 => 'Modul',
+];
+
+$namespaceNames['mwl'] = [
+ 828 => 'Módulo',
+ 829 => 'Cumbersa_módulo',
+];
+
+$namespaceNames['mzn'] = [
+ 828 => 'ماژول',
+ 829 => 'ماژول_گپ',
+];
+
+$namespaceNames['nb'] = [
+ 828 => 'Modul',
+ 829 => 'Moduldiskusjon',
+];
+
+$namespaceNames['ne'] = [
+ 828 => 'मोड्युल',
+ 829 => 'मोड्युल_वार्तालाप',
+];
+
+$namespaceNames['nl'] = [
+ 828 => 'Module',
+ 829 => 'Overleg_module',
+];
+
+$namespaceNames['nn'] = [
+ 828 => 'Modul',
+ 829 => 'Moduldiskusjon',
+];
+
+$namespaceNames['or'] = [
+ 828 => 'ମଡ୍ୟୁଲ',
+ 829 => 'ମଡ୍ୟୁଲ_ଆଲୋଚନା',
+];
+
+$namespaceNames['pl'] = [
+ 828 => 'Moduł',
+ 829 => 'Dyskusja_modułu',
+];
+
+$namespaceNames['pnb'] = [
+ 828 => 'ماڈیول',
+ 829 => 'ماڈیول_گل_بات',
+];
+
+$namespaceNames['pt'] = [
+ 828 => 'Módulo',
+ 829 => 'Módulo_Discussão',
+];
+
+$namespaceNames['pt-br'] = [
+ 828 => 'Módulo',
+ 829 => 'Módulo_Discussão',
+];
+
+$namespaceNames['ro'] = [
+ 828 => 'Modul',
+ 829 => 'Discuție_Modul',
+];
+
+$namespaceNames['ru'] = [
+ 828 => 'Модуль',
+ 829 => 'Обсуждение_модуля',
+];
+
+$namespaceNames['sa'] = [
+ 828 => 'पटलम्',
+ 829 => 'पटलसम्भाषणम्',
+];
+
+$namespaceNames['sd'] = [
+ 828 => 'ماڊيول',
+ 829 => 'ماڊيول_بحث',
+];
+
+$namespaceNames['sh'] = [
+ 828 => 'Modul',
+ 829 => 'Razgovor_o_modulu',
+];
+
+$namespaceNames['sk'] = [
+ 828 => 'Modul',
+ 829 => 'Diskusia_k_modulu',
+];
+
+$namespaceNames['sl'] = [
+ 828 => 'Modul',
+ 829 => 'Pogovor_o_modulu',
+];
+
+$namespaceNames['sq'] = [
+ 828 => 'Moduli',
+ 829 => 'Moduli_diskutim',
+];
+
+$namespaceNames['sr'] = [
+ 828 => 'Модул',
+ 829 => 'Разговор о модулу',
+];
+
+$namespaceNames['sr-ec'] = [
+ 828 => 'Модул',
+ 829 => 'Разговор_о_модулу',
+];
+
+$namespaceNames['sr-el'] = [
+ 828 => 'Modul',
+ 829 => 'Razgovor_o_modulu',
+];
+
+$namespaceNames['sv'] = [
+ 828 => 'Modul',
+ 829 => 'Moduldiskussion',
+];
+
+$namespaceNames['tcy'] = [
+ 828 => 'ಮೋಡ್ಯೂಲ್',
+ 829 => 'ಮೋಡ್ಯೂಲ್_ಪಾತೆರ',
+];
+
+$namespaceNames['te'] = [
+ 828 => 'మాడ్యూల్',
+ 829 => 'మాడ్యూల్_సంభాషణ',
+];
+
+$namespaceNames['tg'] = [
+ 828 => 'Модул',
+ 829 => 'Баҳси_Модул',
+];
+
+$namespaceNames['th'] = [
+ 828 => 'มอดูล',
+ 829 => 'คุยเรื่องมอดูล',
+];
+
+$namespaceNames['tr'] = [
+ 828 => 'Modül',
+ 829 => 'Modül_tartışma',
+];
+
+$namespaceNames['uk'] = [
+ 828 => 'Модуль',
+ 829 => 'Обговорення_модуля',
+];
+
+$namespaceNames['ur'] = [
+ 828 => 'ماڈیول',
+ 829 => 'تبادلۂ_خیال_ماڈیول',
+];
+
+$namespaceNames['vi'] = [
+ 828 => 'Mô_đun',
+ 829 => 'Thảo_luận_Mô_đun',
+];
+
+$namespaceNames['yue'] = [
+ 828 => '模組',
+ 829 => '模組討論',
+];
+
+$namespaceNames['zh'] = [
+ 828 => '模块',
+ 829 => '模块讨论',
+];
+
+$namespaceNames['zh-hans'] = [
+ 828 => '模块',
+ 829 => '模块讨论',
+];
+
+$namespaceNames['zh-hant'] = [
+ 828 => '模組',
+ 829 => '模組討論',
+];
diff --git a/www/wiki/extensions/Scribunto/Scribunto.php b/www/wiki/extensions/Scribunto/Scribunto.php
new file mode 100644
index 00000000..a267ead0
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/Scribunto.php
@@ -0,0 +1,99 @@
+<?php
+
+if ( function_exists( 'wfLoadExtension' ) ) {
+ wfLoadExtension( 'Scribunto' );
+ // Keep i18n globals so mergeMessageFileList.php doesn't break
+ $wgMessagesDirs['Scribunto'] = __DIR__ . '/i18n';
+ $wgExtensionMessagesFiles['ScribuntoMagic'] = __DIR__ . '/Scribunto.magic.php';
+ $wgExtensionMessagesFiles['ScribuntoNamespaces'] = __DIR__ . '/Scribunto.namespaces.php';
+ /* wfWarn(
+ 'Deprecated PHP entry point used for Scribunto extension. Please use wfLoadExtension instead,' .
+ ' see https://www.mediawiki.org/wiki/Extension_registration for more details.'
+ ); */
+ return true;
+} else {
+ die( 'This version of the Scribunto extension requires MediaWiki 1.27+' );
+}
+
+/**
+ * The rest of this file is a PHP stub for providing documentation
+ * about the various configuration settings for Scribunto, as well
+ * as providing hints for IDEs. It is not executed by MediaWiki.
+ */
+
+define( 'NS_MODULE', 828 );
+define( 'NS_MODULE_TALK', 829 );
+
+/**
+ * The name of the default script engine.
+ */
+$wgScribuntoDefaultEngine = 'luaautodetect';
+
+/**
+ * Configuration for each script engine
+ */
+$wgScribuntoEngineConf = [
+ 'luasandbox' => [
+ 'class' => 'Scribunto_LuaSandboxEngine',
+ 'memoryLimit' => 50 * 1024 * 1024,
+ 'cpuLimit' => 7,
+
+ // The profiler sample period, or false to disable the profiler
+ 'profilerPeriod' => 0.02,
+
+ // Set this to true to allow setfenv() and getfenv() in user code.
+ // Note that these functions have been removed in Lua 5.2. Scribunto
+ // does not yet support Lua 5.2, but we expect support will be
+ // implemented in the future, and there is no guarantee that a
+ // simulation of setfenv() and getfenv() will be provided.
+ 'allowEnvFuncs' => false,
+
+ // The maximum number of languages about which data can be requested.
+ // The cost is about 1.5MB of memory usage per language on default
+ // installations (during recache), but if recaching is disabled with
+ // $wgLocalisationCacheConf['manualRecache'] = false
+ // then memory usage is perhaps 10x smaller.
+ 'maxLangCacheSize' => 30,
+ ],
+ 'luastandalone' => [
+ 'class' => 'Scribunto_LuaStandaloneEngine',
+
+ // A filename to act as the destination for stderr from the Lua
+ // binary. This may provide useful error information if Lua fails to
+ // run. Set this to null to discard stderr output.
+ 'errorFile' => null,
+
+ // The location of the Lua binary, or null to use the bundled binary.
+ 'luaPath' => null,
+ 'memoryLimit' => 50 * 1024 * 1024,
+ 'cpuLimit' => 7,
+ 'allowEnvFuncs' => false,
+ 'maxLangCacheSize' => 30,
+ ],
+ 'luaautodetect' => [
+ 'factory' => 'Scribunto_LuaEngine::newAutodetectEngine',
+ ],
+];
+
+/**
+ * Set to true to enable the SyntaxHighlight_GeSHi extension
+ */
+$wgScribuntoUseGeSHi = true;
+
+/**
+ * Set to true to enable the CodeEditor extension
+ */
+$wgScribuntoUseCodeEditor = true;
+
+/**
+ * Set to true to enable gathering and reporting of performance data
+ * for slow function invocations.
+ */
+$wgScribuntoGatherFunctionStats = false;
+
+/**
+ * If $wgScribuntoGatherFunctionStats is true, this variable specifies
+ * the percentile threshold for slow function invocations. Should be
+ * a value between 0 and 1 (exclusive).
+ */
+$wgScribuntoSlowFunctionThreshold = 0.90;
diff --git a/www/wiki/extensions/Scribunto/composer.json b/www/wiki/extensions/Scribunto/composer.json
new file mode 100644
index 00000000..6681af02
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/composer.json
@@ -0,0 +1,36 @@
+{
+ "require-dev": {
+ "mediawiki/lua-sandbox": "3.0.1",
+ "mediawiki/mediawiki-codesniffer": "19.4.0",
+ "mediawiki/mediawiki-phan-config": "0.2.0",
+ "mediawiki/minus-x": "0.3.1",
+ "php-parallel-lint/php-console-highlighter": "0.3.2",
+ "php-parallel-lint/php-parallel-lint": "1.0.0"
+ },
+ "repositories": [
+ {
+ "type": "package",
+ "package": {
+ "name": "mediawiki/lua-sandbox",
+ "version": "3.0.1",
+ "source": {
+ "url": "https://gerrit.wikimedia.org/r/mediawiki/php/luasandbox.git",
+ "type": "git",
+ "reference": "tags/3.0.1"
+ }
+ }
+ }
+ ],
+ "scripts": {
+ "test": [
+ "parallel-lint . --exclude vendor --exclude node_modules",
+ "phpcs -p -s",
+ "minus-x check ."
+ ],
+ "fix": [
+ "minus-x fix .",
+ "phpcbf"
+ ],
+ "phan": "phan -d . -p"
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/extension.json b/www/wiki/extensions/Scribunto/extension.json
new file mode 100644
index 00000000..92677b1a
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/extension.json
@@ -0,0 +1,167 @@
+{
+ "name": "Scribunto",
+ "author": [
+ "Victor Vasiliev",
+ "Tim Starling",
+ "Brad Jorsch"
+ ],
+ "url": "https://www.mediawiki.org/wiki/Extension:Scribunto",
+ "descriptionmsg": "scribunto-desc",
+ "license-name": "GPL-2.0-or-later AND MIT",
+ "type": "parserhook",
+ "requires": {
+ "MediaWiki": ">=1.31.0"
+ },
+ "APIModules": {
+ "scribunto-console": "ApiScribuntoConsole"
+ },
+ "ContentHandlers": {
+ "Scribunto": "ScribuntoContentHandler"
+ },
+ "TrackingCategories": [
+ "scribunto-common-error-category",
+ "scribunto-module-with-errors-category"
+ ],
+ "MessagesDirs": {
+ "Scribunto": [
+ "i18n"
+ ]
+ },
+ "ExtensionMessagesFiles": {
+ "ScribuntoMagic": "Scribunto.magic.php",
+ "ScribuntoNamespaces": "Scribunto.namespaces.php"
+ },
+ "AutoloadClasses": {
+ "ScribuntoEngineBase": "includes/common/Base.php",
+ "ScribuntoModuleBase": "includes/common/Base.php",
+ "ScribuntoHooks": "includes/common/Hooks.php",
+ "ScribuntoException": "includes/common/Common.php",
+ "Scribunto": "includes/common/Common.php",
+ "ApiScribuntoConsole": "includes/common/ApiScribuntoConsole.php",
+ "ScribuntoContentHandler": "includes/common/ScribuntoContentHandler.php",
+ "ScribuntoContent": "includes/common/ScribuntoContent.php",
+ "Scribunto_LuaError": "includes/engines/LuaCommon/LuaCommon.php",
+ "Scribunto_LuaInterpreterNotFoundError": "includes/engines/LuaCommon/LuaInterpreter.php",
+ "Scribunto_LuaInterpreterBadVersionError": "includes/engines/LuaCommon/LuaInterpreter.php",
+ "Scribunto_LuaSandboxInterpreter": "includes/engines/LuaSandbox/Engine.php",
+ "Scribunto_LuaSandboxCallback": "includes/engines/LuaSandbox/Engine.php",
+ "Scribunto_LuaStandaloneInterpreterFunction": "includes/engines/LuaStandalone/LuaStandaloneEngine.php",
+ "Scribunto_LuaEngineTestSkip": "tests/phpunit/engines/LuaCommon/LuaEngineTestBase.php",
+ "Scribunto_LuaEngine": "includes/engines/LuaCommon/LuaCommon.php",
+ "Scribunto_LuaModule": "includes/engines/LuaCommon/LuaCommon.php",
+ "Scribunto_LuaInterpreter": "includes/engines/LuaCommon/LuaInterpreter.php",
+ "Scribunto_LuaSandboxEngine": "includes/engines/LuaSandbox/Engine.php",
+ "Scribunto_LuaStandaloneEngine": "includes/engines/LuaStandalone/LuaStandaloneEngine.php",
+ "Scribunto_LuaStandaloneInterpreter": "includes/engines/LuaStandalone/LuaStandaloneEngine.php",
+ "Scribunto_LuaLibraryBase": "includes/engines/LuaCommon/LibraryBase.php",
+ "Scribunto_LuaEngineTestBase": "tests/phpunit/engines/LuaCommon/LuaEngineTestBase.php",
+ "Scribunto_LuaDataProvider": "tests/phpunit/engines/LuaCommon/LuaDataProvider.php",
+ "Scribunto_LuaSiteLibrary": "includes/engines/LuaCommon/SiteLibrary.php",
+ "Scribunto_LuaUriLibrary": "includes/engines/LuaCommon/UriLibrary.php",
+ "Scribunto_LuaUstringLibrary": "includes/engines/LuaCommon/UstringLibrary.php",
+ "Scribunto_LuaLanguageLibrary": "includes/engines/LuaCommon/LanguageLibrary.php",
+ "Scribunto_LuaMessageLibrary": "includes/engines/LuaCommon/MessageLibrary.php",
+ "Scribunto_LuaTitleLibrary": "includes/engines/LuaCommon/TitleLibrary.php",
+ "Scribunto_LuaTextLibrary": "includes/engines/LuaCommon/TextLibrary.php",
+ "Scribunto_LuaHtmlLibrary": "includes/engines/LuaCommon/HtmlLibrary.php",
+ "Scribunto_LuaHashLibrary": "includes/engines/LuaCommon/HashLibrary.php"
+ },
+ "ResourceModules": {
+ "ext.scribunto.errors": {
+ "scripts": "ext.scribunto.errors.js",
+ "styles": "ext.scribunto.errors.css",
+ "dependencies": [
+ "jquery.ui.dialog"
+ ],
+ "messages": [
+ "scribunto-parser-dialog-title"
+ ]
+ },
+ "ext.scribunto.logs": {
+ "styles": "ext.scribunto.logs.css"
+ },
+ "ext.scribunto.edit": {
+ "scripts": "ext.scribunto.edit.js",
+ "styles": "ext.scribunto.edit.css",
+ "dependencies": [
+ "mediawiki.api",
+ "jquery.spinner"
+ ],
+ "messages": [
+ "scribunto-console-title",
+ "scribunto-console-intro",
+ "scribunto-console-clear",
+ "scribunto-console-cleared",
+ "scribunto-console-cleared-session-lost"
+ ]
+ }
+ },
+ "ResourceFileModulePaths": {
+ "localBasePath": "modules",
+ "remoteExtPath": "Scribunto/modules"
+ },
+ "Hooks": {
+ "SoftwareInfo": "ScribuntoHooks::getSoftwareInfo",
+ "ParserFirstCallInit": "ScribuntoHooks::setupParserHook",
+ "ParserLimitReportPrepare": "ScribuntoHooks::reportLimitData",
+ "ParserLimitReportFormat": "ScribuntoHooks::formatLimitData",
+ "ParserClearState": "ScribuntoHooks::clearState",
+ "ParserCloned": "ScribuntoHooks::parserCloned",
+ "CodeEditorGetPageLanguage": "ScribuntoHooks::getCodeLanguage",
+ "EditPage::showStandardInputs:options": "ScribuntoHooks::showStandardInputsOptions",
+ "EditPage::showReadOnlyForm:initial": "ScribuntoHooks::showReadOnlyFormInitial",
+ "EditPageBeforeEditButtons": "ScribuntoHooks::beforeEditButtons",
+ "EditFilterMergedContent": "ScribuntoHooks::validateScript",
+ "ArticleViewHeader": "ScribuntoHooks::showDocPageHeader",
+ "ContentHandlerDefaultModelFor": "ScribuntoHooks::contentHandlerDefaultModelFor"
+ },
+ "namespaces": [
+ {
+ "id": 828,
+ "constant": "NS_MODULE",
+ "name": "Module",
+ "subpages": true
+ },
+ {
+ "id": 829,
+ "constant": "NS_MODULE_TALK",
+ "name": "Module_talk",
+ "subpages": true
+ }
+ ],
+ "callback": "ScribuntoHooks::onRegistration",
+ "config": {
+ "ScribuntoDefaultEngine": "luaautodetect",
+ "ScribuntoEngineConf": {
+ "luasandbox": {
+ "class": "Scribunto_LuaSandboxEngine",
+ "memoryLimit": 52428800,
+ "cpuLimit": 7,
+ "profilerPeriod": 0.02,
+ "allowEnvFuncs": false,
+ "maxLangCacheSize": 30
+ },
+ "luastandalone": {
+ "class": "Scribunto_LuaStandaloneEngine",
+ "errorFile": null,
+ "luaPath": null,
+ "memoryLimit": 52428800,
+ "cpuLimit": 7,
+ "allowEnvFuncs": false,
+ "maxLangCacheSize": 30
+ },
+ "luaautodetect": {
+ "factory": "Scribunto_LuaEngine::newAutodetectEngine"
+ },
+ "_merge_strategy": "array_plus_2d"
+ },
+ "ScribuntoUseGeSHi": true,
+ "ScribuntoUseCodeEditor": true,
+ "ScribuntoGatherFunctionStats": false,
+ "ScribuntoSlowFunctionThreshold": 0.9
+ },
+ "TemplateSandboxEditNamespaces": [
+ 828
+ ],
+ "manifest_version": 1
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ace.json b/www/wiki/extensions/Scribunto/i18n/ace.json
new file mode 100644
index 00000000..f9b367fb
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ace.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Si Gam Acèh"
+ ]
+ },
+ "scribunto-lua-error": "Reuloh Lua: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ady-cyrl.json b/www/wiki/extensions/Scribunto/i18n/ady-cyrl.json
new file mode 100644
index 00000000..e96c17d8
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ady-cyrl.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bedynokue.nart"
+ ]
+ },
+ "scribunto-lua-error": "Lua:$2 хэукъоныгъэ."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/af.json b/www/wiki/extensions/Scribunto/i18n/af.json
new file mode 100644
index 00000000..e9da2b2b
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/af.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Naudefj",
+ "Arnobarnard",
+ "Fwolff"
+ ]
+ },
+ "scribunto-line": "op reël $1",
+ "scribunto-module-line": "in $1 op reël $2",
+ "scribunto-parser-dialog-title": "Skripfout",
+ "scribunto-error-short": "Skripfout: $1",
+ "scribunto-error-long": "Skripfoute:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''Dokumentasie vir hierdie module kan geskep word by: [[$1]]''",
+ "scribunto-doc-page-header": "'''Hierdie is die dokumentasieblad vir [[$1]]'''",
+ "scribunto-common-error-category": "Bladsye met skripfoute",
+ "scribunto-common-nosuchmodule": "Skripfout: die module bestaan nie.",
+ "scribunto-lua-in-function": "in funksie \"$1\"",
+ "scribunto-lua-in-main": "in die hoofgedeelte",
+ "scribunto-lua-in-function-at": "in die funksie op $1:$2",
+ "scribunto-lua-error-location": "Luafout $1: $2",
+ "scribunto-lua-error": "Lua-fout: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ais.json b/www/wiki/extensions/Scribunto/i18n/ais.json
new file mode 100644
index 00000000..bc09ff7b
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ais.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Benel"
+ ]
+ },
+ "scribunto-lua-error": "Lua mungangaw: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ang.json b/www/wiki/extensions/Scribunto/i18n/ang.json
new file mode 100644
index 00000000..445edc86
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ang.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gott wisst"
+ ]
+ },
+ "scribunto-lua-error": "Lua wōg: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/anp.json b/www/wiki/extensions/Scribunto/i18n/anp.json
new file mode 100644
index 00000000..4910c5ed
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/anp.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Angpradesh"
+ ]
+ },
+ "scribunto-lua-error": "लुआ त्रुटि: $2।"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ar.json b/www/wiki/extensions/Scribunto/i18n/ar.json
new file mode 100644
index 00000000..001b478d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ar.json
@@ -0,0 +1,73 @@
+{
+ "@metadata": {
+ "authors": [
+ "زكريا",
+ "Yahya Sakhnini",
+ "Mr. Ibrahem",
+ "McDutchie",
+ "Mido",
+ "Meno25",
+ "ديفيد"
+ ]
+ },
+ "scribunto-desc": "إطار عمل لتضمين لغات البرمجة النصية في صفحات ميدياويكي",
+ "scribunto-line": "في السطر $1",
+ "scribunto-module-line": "في $1 على السطر $2",
+ "scribunto-parser-dialog-title": "خطأ في البرنامج النصي",
+ "scribunto-error-short": "خطأ في البرنامج النصي: $1",
+ "scribunto-error-long": "أخطاء البرنامج النصي:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/شرح",
+ "scribunto-doc-page-does-not-exist": "''يمكن إنشاء صفحة توثيق الوحدة في [[$1]]''",
+ "scribunto-doc-page-header": "'''هذه صفحة توثيق ل[[$1]]'''",
+ "scribunto-console-intro": "* تتوفر صادرات الوحدة كمتغير \"p\"، بما في ذلك التعديلات غير المحفوظة. \n* أسبق خطا بـ\"=\" لتقييمه كتعبير أو استخدم print()، استخدم mw.logObject() للجداول.\n* استخدم mw.log() وmw.logObject() في رمز الوحدة لإرسال الرسائل إلى وحدة التحكم هذه.",
+ "scribunto-console-title": "وحدة تحكم التصحيح",
+ "scribunto-console-too-large": "جلسة وحدة التحكم هذه كبيرة جدا; الرجاء مسح تاريخ وحدة التحكم أو تقليل حجم الوحدة.",
+ "scribunto-console-current-src": "إدخال وحدة التحكم",
+ "scribunto-console-clear": "إفراغ",
+ "scribunto-console-cleared": "تم مسح حالة وحدة التحكم بسبب تحديث الوحدة.",
+ "scribunto-console-cleared-session-lost": "تم مسح حالة وحدة التحكم بسبب فقد بيانات الجلسة.",
+ "scribunto-common-error-category": "صفحات بها أخطاء في البرنامج النصي",
+ "scribunto-common-error-category-desc": "حدث خطأ عند معالجة الوحدات المدرجة في الصفحة.",
+ "scribunto-common-nosuchmodule": "خطأ: لا توجد وحدة بهذا الاسم \"$2\".",
+ "scribunto-common-nofunction": "خطأ: يجب أن تحدد وظيفة للاتصال بها.",
+ "scribunto-common-nosuchfunction": "خطأ: الوظيفة \"$2\" غير موجودة.",
+ "scribunto-common-notafunction": "خطأ: \"$2\" ليس وظيفة.",
+ "scribunto-common-timeout": "الوقت المتاح لتشغيل البرامج النصية قد إنتهى.",
+ "scribunto-common-oom": "تم تجاوز مقدار الذاكرة المسموح به لتشغيل البرامج النصية.",
+ "scribunto-common-backtrace": "المصحح:",
+ "scribunto-common-no-details": "لا توجد تفاصيل أخرى متوفرة.",
+ "scribunto-lua-in-function": "في الوظيفة \"$1\"",
+ "scribunto-lua-in-main": "في الجزء الرئيسي",
+ "scribunto-lua-in-function-at": "في الوظيفة عند $1:$2",
+ "scribunto-lua-error-location": "خطأ لوا $1: $2.",
+ "scribunto-lua-error": "خطأ لوا: $2.",
+ "scribunto-lua-notarrayreturn": "خطأ:أنتجت الوحدة $2 كقيمة، ومن المفترض أن تنتج جدول.",
+ "scribunto-luastandalone-proc-error": "خطأ لوا: لا يمكن إنشاء العملية.",
+ "scribunto-luastandalone-proc-error-msg": "خطأ لوا: لا يمكن إنشاء العملية: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "خطأ لوا: لا يمكن إنشاء العملية: proc_open غير متوفر; تحقق من توجيه تكوين \"disable_functions\" الخاص بـPHP.",
+ "scribunto-luastandalone-decode-error": "خطأ لوا: خطأ داخلي: غير قادر على فك شفرة الرسالة.",
+ "scribunto-luastandalone-write-error": "خطأ لوا: خطأ داخلي: خطأ في الكتابة إلى الأنبوب.",
+ "scribunto-luastandalone-read-error": "خطأ لوا: خطأ داخلي: خطأ في القراءة من الأنبوب.",
+ "scribunto-luastandalone-gone": "خطأ لوا: خطأ داخلي: لقد خرج المفسر بالفعل.",
+ "scribunto-luastandalone-signal": "خطأ لوا: خطأ داخلي: تم إنهاء المفسر بالإشارة \"$2\".",
+ "scribunto-luastandalone-exited": "خطأ لوا: خطأ داخلي: لقد خرج المفسر بالحالة $2.",
+ "scribunto-module-with-errors-category": "وحدات بها أخطاء",
+ "scribunto-module-with-errors-category-desc": "الوحدة بها أخطاء.",
+ "scribunto-limitreport-timeusage": "زمن لوا المستغرق",
+ "scribunto-limitreport-timeusage-value": "$1/$2 ثواني",
+ "scribunto-limitreport-virtmemusage": "حجم لوا الافتراضي",
+ "scribunto-limitreport-estmemusage": "استخدام الذاكرة المقدر للوا",
+ "scribunto-limitreport-memusage": "ذاكرة لوا المستخدمة",
+ "scribunto-limitreport-profile": "ملف تعريف لوا",
+ "scribunto-limitreport-profile-ms": "$1 مللي ثانية",
+ "scribunto-limitreport-logs": "سجل لوا",
+ "apihelp-scribunto-console-description": "وحدة داخلية لخدمة طلبات XHR من وحدة Scribunto.",
+ "apihelp-scribunto-console-summary": "وحدة داخلية لخدمة طلبات XHR من وحدة Scribunto.",
+ "apihelp-scribunto-console-param-title": "عنوان الوحدة لاختبارها.",
+ "apihelp-scribunto-console-param-content": "المحتوى الجديد للوحدة.",
+ "apihelp-scribunto-console-param-session": "رمز الجلسة.",
+ "apihelp-scribunto-console-param-question": "السطر التالي للتقييم كنص.",
+ "apihelp-scribunto-console-param-clear": "اضبط لمسح حالة الجلسة الحالية.",
+ "nstab-module": "وحدة",
+ "tooltip-ca-nstab-module": "عرض صفحة الوحدة"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/arq.json b/www/wiki/extensions/Scribunto/i18n/arq.json
new file mode 100644
index 00000000..8c211af8
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/arq.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Oldstoneage"
+ ]
+ },
+ "scribunto-lua-error": "Lua غلطة: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/arz.json b/www/wiki/extensions/Scribunto/i18n/arz.json
new file mode 100644
index 00000000..59e15670
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/arz.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ghaly"
+ ]
+ },
+ "scribunto-lua-error": "لونا غلط:$2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/as.json b/www/wiki/extensions/Scribunto/i18n/as.json
new file mode 100644
index 00000000..c8973b6f
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/as.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "IKHazarika"
+ ]
+ },
+ "scribunto-lua-error": "লুআ ত্ৰুতি: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ast.json b/www/wiki/extensions/Scribunto/i18n/ast.json
new file mode 100644
index 00000000..0fd3381c
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ast.json
@@ -0,0 +1,68 @@
+{
+ "@metadata": {
+ "authors": [
+ "Xuacu",
+ "McDutchie"
+ ]
+ },
+ "scribunto-desc": "Infraestructura pa incrustar llinguaxes de script nes páxines de MediaWiki",
+ "scribunto-line": "na llinia $1",
+ "scribunto-module-line": "en $1 na llinia $2",
+ "scribunto-parser-dialog-title": "Error de script",
+ "scribunto-error-short": "Error de script: $1",
+ "scribunto-error-long": "Errores de script:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/usu",
+ "scribunto-doc-page-does-not-exist": "''La documentación pa esti módulu pue crease'n [[$1]]''",
+ "scribunto-doc-page-header": "'''Esta ye la páxina de documentación pa [[$1]]'''",
+ "scribunto-console-intro": "* Les esportaciones del módulu tan disponibles como la variable \"p\", incluyendo los cambios ensin guardar.\n* Pon un \"=\" delantre de la llinia pa evaluala como una espresión, o usa print(). Usa mw.logObject() pa tables.\n* Usa mw.log() y mw.logObject() nel códigu del módulu pa unviar los mensaxes a esta consola.",
+ "scribunto-console-title": "Consola de depuración",
+ "scribunto-console-too-large": "La sesión d'esta consola ye enforma grande. Llimpíe l'historial de la consola o reduza'l tamañu del módulu.",
+ "scribunto-console-current-src": "entrada de la consola",
+ "scribunto-console-clear": "Llimpiar",
+ "scribunto-console-cleared": "Llimpióse l'estáu de la consola porque'l módulu anovóse.",
+ "scribunto-console-cleared-session-lost": "Llimpióse l'estáu de la consola porque perdieronse los datos de la sesión.",
+ "scribunto-common-error-category": "Páxines con errores de script",
+ "scribunto-common-error-category-desc": "Hebo un error al procesar los módulos incluíos na páxina.",
+ "scribunto-common-nosuchmodule": "Error de script: Nun esiste'l módulu «$2».",
+ "scribunto-common-nofunction": "Error de script: Tien d'especificar una función a la que llamar.",
+ "scribunto-common-nosuchfunction": "Error de script: Nun esiste la función «$2».",
+ "scribunto-common-notafunction": "Error de script: «$2» nun ye una función.",
+ "scribunto-common-timeout": "Acabó'l tiempu acutáu pa executar scripts.",
+ "scribunto-common-oom": "Superóse la cantidá de memoria permitida pa executar scripts.",
+ "scribunto-common-backtrace": "Trazáu inversu (backtrace):",
+ "scribunto-common-no-details": "Nun hai disponibles más detalles.",
+ "scribunto-lua-in-function": "na función \"$1\"",
+ "scribunto-lua-in-main": "nel fragmentu principal",
+ "scribunto-lua-in-function-at": "na función en $1:$2",
+ "scribunto-lua-error-location": "Error de Lua $1: $2.",
+ "scribunto-lua-error": "Error de Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Error del script: El módulu devolvió un valor $2. Esperase que devuelva una tabla d'esportación.",
+ "scribunto-luastandalone-proc-error": "Error de Lua: Nun pue crease'l procesu.",
+ "scribunto-luastandalone-proc-error-msg": "Error de Lua: Nun pue crease'l procesu: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Error de Lua: Nun pue crease'l procesu: proc_open nun ta disponible. Compruebe la direutiva de configuración \"disable_functions\" de PHP.",
+ "scribunto-luastandalone-decode-error": "Error de Lua: Error internu: Nun pudo descodificase'l mensaxe.",
+ "scribunto-luastandalone-write-error": "Error de Lua: Error internu: Error al escribir nun conductu (pipe).",
+ "scribunto-luastandalone-read-error": "Error de Lua: Error internu: Error al lleer d'un conductu (pipe).",
+ "scribunto-luastandalone-gone": "Error de Lua: Error internu: L'intérprete yá acabó.",
+ "scribunto-luastandalone-signal": "Error de Lua: Error internu: L'intérprete acabó cola señal \"$2\".",
+ "scribunto-luastandalone-exited": "Error de Lua: Error internu: L'intérprete acabó col estáu $2.",
+ "scribunto-module-with-errors-category": "Módulos de Scribunto con errores",
+ "scribunto-module-with-errors-category-desc": "El módulu contien un error.",
+ "scribunto-limitreport-timeusage": "Tiempu d'usu de Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 segundos",
+ "scribunto-limitreport-virtmemusage": "Tamañu virtual de Lua",
+ "scribunto-limitreport-estmemusage": "Usu de memoria estimáu de Lua",
+ "scribunto-limitreport-memusage": "Usu de memoria de Lua",
+ "scribunto-limitreport-profile": "Perfil de Lua",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Rexistros de Lua",
+ "apihelp-scribunto-console-description": "Módulu internu pa dar serviciu a les solicitúes XHR de la consola de Scribunto.",
+ "apihelp-scribunto-console-summary": "Módulu internu pa dar serviciu a les solicitúes XHR de la consola de Scribunto.",
+ "apihelp-scribunto-console-param-title": "El títulu del módulu a probar.",
+ "apihelp-scribunto-console-param-content": "El conteníu nuevu del módulu.",
+ "apihelp-scribunto-console-param-session": "Pase de sesión.",
+ "apihelp-scribunto-console-param-question": "La siguiente llinia a evaluar como script.",
+ "apihelp-scribunto-console-param-clear": "Marcar pa llimpiar l'estáu de la sesión actual.",
+ "nstab-module": "Módulu",
+ "tooltip-ca-nstab-module": "Ver la páxina del módulu"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/atj.json b/www/wiki/extensions/Scribunto/i18n/atj.json
new file mode 100644
index 00000000..1f5bcdf3
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/atj.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jean-paul echaquan",
+ "Benoit Rochon"
+ ]
+ },
+ "scribunto-lua-error-location": "Lua oniparin $1: $2.",
+ "scribunto-lua-error": "Lua oniparin: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/av.json b/www/wiki/extensions/Scribunto/i18n/av.json
new file mode 100644
index 00000000..c1eadbc3
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/av.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gazimagomedov"
+ ]
+ },
+ "scribunto-lua-error": "ГъалатӀ Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/awa.json b/www/wiki/extensions/Scribunto/i18n/awa.json
new file mode 100644
index 00000000..556cb14f
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/awa.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "1AnuraagPandey"
+ ]
+ },
+ "scribunto-lua-error": "लुआ त्रुटि: $2।"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/az.json b/www/wiki/extensions/Scribunto/i18n/az.json
new file mode 100644
index 00000000..0c2c17ee
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/az.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Wertuose",
+ "Serkanland"
+ ]
+ },
+ "scribunto-common-error-category": "Skript xətası olan səhifələr",
+ "scribunto-lua-error": "Lua səhvi: $2.",
+ "scribunto-limitreport-timeusage-value": "$1/$2 saniyə"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/azb.json b/www/wiki/extensions/Scribunto/i18n/azb.json
new file mode 100644
index 00000000..4fcef018
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/azb.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amir a57"
+ ]
+ },
+ "scribunto-lua-error": "لوآ خطاسی: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ba.json b/www/wiki/extensions/Scribunto/i18n/ba.json
new file mode 100644
index 00000000..4b87fb69
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ba.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Рустам Нурыев"
+ ]
+ },
+ "scribunto-lua-error": "Lua хатаһы: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/bcl.json b/www/wiki/extensions/Scribunto/i18n/bcl.json
new file mode 100644
index 00000000..03f871a4
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/bcl.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Filipinayzd"
+ ]
+ },
+ "scribunto-lua-error": "Lua error: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/be-tarask.json b/www/wiki/extensions/Scribunto/i18n/be-tarask.json
new file mode 100644
index 00000000..473547c1
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/be-tarask.json
@@ -0,0 +1,48 @@
+{
+ "@metadata": {
+ "authors": [
+ "Wizardist",
+ "Red Winged Duck"
+ ]
+ },
+ "scribunto-desc": "Фрэймворк для выкарыстаньня скрыптавых моваў на старонках MediaWiki",
+ "scribunto-line": "на радку $1",
+ "scribunto-module-line": "у $1 на радку $2",
+ "scribunto-parser-dialog-title": "Памылка скрыпту",
+ "scribunto-error-short": "Памылка скрыпту: $1",
+ "scribunto-error-long": "Памылкі скрыпту:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/Дакумэнтацыя",
+ "scribunto-doc-page-does-not-exist": "''Дакумэнтацыю да гэтага модуля можна стварыць у [[$1]]''",
+ "scribunto-doc-page-header": "''Гэта падстаронка-дакумэнтацыя для [[$1]]''",
+ "scribunto-console-intro": "* Экспартаваныя зьвесткі модулю даступныя празь зьменную «p», у тым ліку незахаваныя зьмены.\n* Калі хочаце вылічыць радок як выраз, ужывайце перад радком знак «=», або выкарыстоўвайце print(). Ужывайце mw.logObject() для табліц.\n* Каб дасылаць паведамленьні ў гэтую кансоль, выкарыстоўвайце mw.log() і mw.logObject() у кодзе модулю.",
+ "scribunto-console-title": "Кансоль адладкі",
+ "scribunto-console-too-large": "Гэтая сэсія кансолі надта вялікая. Калі ласка, ачысьціце гісторыю кансолі ці паменшыце памер модуля.",
+ "scribunto-console-current-src": "увод кансолі",
+ "scribunto-console-clear": "Ачысьціць",
+ "scribunto-console-cleared": "Стан кансолі ачышчаны праз абнаўленьне модуля.",
+ "scribunto-console-cleared-session-lost": "Стан кансолі ачышчаны праз страту зьвестак сэсіі.",
+ "scribunto-common-error-category": "Старонкі з памылкамі ў скрыптах",
+ "scribunto-common-error-category-desc": "Адбылася памылка пры апрацоўцы модуляў, уключаных у старонку.",
+ "scribunto-common-nosuchmodule": "Памылка скрыпту: модуль «$2» не існуе.",
+ "scribunto-common-nofunction": "Памылка скрыпта: вы мусіце пазначыць функцыю, якую выклікаеце.",
+ "scribunto-common-nosuchfunction": "Памылка скрыпту: функцыя «$2» не існуе.",
+ "scribunto-common-timeout": "Час, адведзены пад выкананьне скрыптаў, выйшаў.",
+ "scribunto-common-oom": "Перавышаная вобласьць памяці, адведзенай пад выкананьне скрыптаў.",
+ "scribunto-common-backtrace": "Шлях выклікаў:",
+ "scribunto-lua-in-function": "у функцыі «$1»",
+ "scribunto-lua-in-main": "у асноўнай частцы коду",
+ "scribunto-lua-in-function-at": "у функцыі $1:$2",
+ "scribunto-lua-error-location": "Памылка Lua $1: $2.",
+ "scribunto-lua-error": "Памылка Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Памылка скрыпту: модуль вярнуў значэньне $2. Модуль мусіў вярнуць табліцу экспарту.",
+ "scribunto-luastandalone-proc-error": "Памылка Lua: немагчыма стварыць працэс.",
+ "scribunto-luastandalone-proc-error-msg": "Памылка Lua: немагчыма стварыць працэс — $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Памылка Lua: немагчыма стварыць працэс — proc_open недаступны. Праверце значэньне дырэктывы «disable_functions» у наладах PHP.",
+ "scribunto-luastandalone-decode-error": "Памылка Lua: Унутраная памылка: не атрымалася раскадаваць паведамленьне.",
+ "scribunto-luastandalone-write-error": "Памылка Lua: Унутраная памылка: памылка запісу ў канвэер.",
+ "scribunto-luastandalone-read-error": "Памылка Lua: Унутраная памылка: памылка чытаньня з канвэеру.",
+ "scribunto-luastandalone-gone": "Памылка Lua: Унутраная памылка: інтэрпрэтатар ужо скончыў працу.",
+ "scribunto-luastandalone-signal": "Памылка Lua: Унутраная памылка: інтэрпрэтатар быў спынены з сыгналам «$2».",
+ "scribunto-luastandalone-exited": "Памылка Lua: Унутраная памылка: інтэрпрэтатар завяршыў працу з станам $2.",
+ "scribunto-module-with-errors-category-desc": "Модуль утрымлівае памылку."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/be.json b/www/wiki/extensions/Scribunto/i18n/be.json
new file mode 100644
index 00000000..a7f7bced
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/be.json
@@ -0,0 +1,32 @@
+{
+ "@metadata": {
+ "authors": [
+ "Wizardist",
+ "Чаховіч Уладзіслаў",
+ "Mechanizatar"
+ ]
+ },
+ "scribunto-desc": "Фрэймворк для выкарыстання скрыптавых моў на старонках MediaWiki",
+ "scribunto-line": "на радку $1",
+ "scribunto-module-line": "у $1 на радку $2",
+ "scribunto-parser-dialog-title": "Памылка скрыпта",
+ "scribunto-error-short": "Памылка скрыпта: $1",
+ "scribunto-error-long": "Памылкі скрыпта:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/Дакументацыя",
+ "scribunto-doc-page-does-not-exist": "''Дакументацыю да гэтага модуля можна стварыць у [[$1]]''",
+ "scribunto-doc-page-header": "'''Гэта старонка дакументацыі для [[$1]]'''",
+ "scribunto-console-intro": "* Экспартаваныя звесткі модуля даступныя праз зменную «p», у тым ліку незахаваныя змены.\n* Калі хочаце вылічыць радок як выраз, ужывайце перад радком знак «=», або выкарыстоўвайце print().\n* Каб дасылаць паведамленні ў гэтую кансоль, выкарыстоўвайце mw.log() у кодзе модуля.",
+ "scribunto-console-title": "Кансоль адладкі",
+ "scribunto-console-clear": "Ачысціць",
+ "scribunto-common-error-category": "Старонкі з памылкамі ў скрыптах",
+ "scribunto-common-nosuchmodule": "Памылка скрыпта: модуль \"$2\" не існуе.",
+ "scribunto-common-nofunction": "Памылка скрыпта: Вы павінны пазначыць функцыю для выкліку.",
+ "scribunto-common-nosuchfunction": "Памылка скрыпта: функцыя \"$2\" не існуе.",
+ "scribunto-common-notafunction": "Памылка скрыпта: \"$2\" гэта не функцыя.",
+ "scribunto-common-backtrace": "Шлях выклікаў:",
+ "scribunto-lua-in-function": "у функцыі «$1»",
+ "scribunto-lua-in-main": "у асноўнай частцы коду",
+ "scribunto-lua-in-function-at": "у функцыі $1:$2",
+ "scribunto-lua-error-location": "Памылка Lua $1: $2.",
+ "scribunto-lua-error": "Памылка Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/bg.json b/www/wiki/extensions/Scribunto/i18n/bg.json
new file mode 100644
index 00000000..c0f67daf
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/bg.json
@@ -0,0 +1,32 @@
+{
+ "@metadata": {
+ "authors": [
+ "DCLXVI",
+ "Termininja",
+ "පසිඳු කාවින්ද"
+ ]
+ },
+ "scribunto-line": "на ред $1",
+ "scribunto-module-line": "в $1 на ред $2",
+ "scribunto-parser-dialog-title": "Грешка в скрипта",
+ "scribunto-error-short": "Грешка в скрипта: $1",
+ "scribunto-error-long": "Грешки в скрипта:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''Документация за този модул може да бъде създадена на [[$1]]''",
+ "scribunto-doc-page-header": "'''Това е страница с документация за [[$1]]'''",
+ "scribunto-console-title": "Конзола за отстраняване на грешки",
+ "scribunto-console-clear": "Изчистване",
+ "scribunto-common-error-category": "Страници с грешки в скрипта",
+ "scribunto-common-nosuchmodule": "Грешка в скрипта: Няма такъв модул.",
+ "scribunto-common-nofunction": "Грешка в скрипта: Необходимо е да се посочи име на функция.",
+ "scribunto-common-nosuchfunction": "Грешка в скрипта: Посочената функция не съществува.",
+ "scribunto-common-timeout": "Времето, отделено за изпълнение на скриптове, е изтекло.",
+ "scribunto-common-oom": "Количеството памет, отделено за изпълнение на скриптове, е надвишено.",
+ "scribunto-lua-in-function": "във функцията „$1“",
+ "scribunto-lua-in-main": "в основната част от кода",
+ "scribunto-lua-in-function-at": "във функцията $1:$2",
+ "scribunto-lua-error-location": "Грешка в Lua $1: $2.",
+ "scribunto-lua-error": "Грешка в Lua: $2.",
+ "scribunto-luastandalone-proc-error": "Грешка в Lua: Не може да бъде създаден процес.",
+ "scribunto-luastandalone-decode-error": "Грешка в Lua: Вътрешна грешка: Не може да се декодира съобщението."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/bgn.json b/www/wiki/extensions/Scribunto/i18n/bgn.json
new file mode 100644
index 00000000..54f8df05
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/bgn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Baloch Afghanistan"
+ ]
+ },
+ "scribunto-lua-error": "لوآئی ختا: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/bho.json b/www/wiki/extensions/Scribunto/i18n/bho.json
new file mode 100644
index 00000000..0ee1f4c8
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/bho.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Nepaboy",
+ "Ganesh",
+ "SatyamMishra"
+ ]
+ },
+ "scribunto-lua-error": "लुआ खराबी:$2",
+ "apihelp-scribunto-console-param-title": "मॉड्यूल के शीर्षक के परीक्षण खातिर।"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/bn.json b/www/wiki/extensions/Scribunto/i18n/bn.json
new file mode 100644
index 00000000..5a35289b
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/bn.json
@@ -0,0 +1,48 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aftab1995",
+ "Bellayet",
+ "Aftabuzzaman",
+ "Bodhisattwa"
+ ]
+ },
+ "scribunto-line": "$1 নং লাইনে",
+ "scribunto-module-line": "$1 এর $2 নং লাইনে",
+ "scribunto-parser-dialog-title": "স্ক্রিপ্ট ত্রুটি",
+ "scribunto-error-short": "স্ক্রিপ্ট ত্রুটি: $1",
+ "scribunto-error-long": "স্ক্রিপ্ট ত্রুটি:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/নথি",
+ "scribunto-doc-page-does-not-exist": "''এই মডিউলের জন্য [[$1]]-এ নথিপত্র তৈরি করা হয়ে থাকতে পারে''",
+ "scribunto-doc-page-header": "'''এই নথির পাতাটি [[$1]]-এর জন্য'''",
+ "scribunto-console-intro": "* অসংরক্ষিত পরিবর্তনসহ, মডিউল রপ্তানি চলক \"p\" হিসাবে উপলব্ধ।\n* একটি লাইনকে একটি এক্সপ্রেশন হিসেবে মূল্যায়ন করতে, \"=\" দিয়ে শুরু করুন, বা print() ব্যবহার করুন। ছকের জন্য mw.logObject() ব্যবহার করুন।\n* এই কনসোলে বার্তা পাঠাতে মডিউল কোডে mw.log() ও mw.logObject() ব্যবহার করুন।",
+ "scribunto-console-title": "ডিবাগ কনসোল",
+ "scribunto-console-current-src": "কনসোল ইনপুট",
+ "scribunto-console-clear": "পরিষ্কার",
+ "scribunto-common-error-category": "স্ক্রিপ্ট ত্রুটিসহ পাতা",
+ "scribunto-common-nosuchmodule": "স্ক্রিপ্ট ত্রুটি: \"$2\" নামক কোন মডিউল নেই।",
+ "scribunto-common-nofunction": "স্ক্রিপ্ট ত্রুটি: কল করতে আপনাকে একটি ফাংশন অবশ্যই উল্লেখ করতে হবে।",
+ "scribunto-common-nosuchfunction": "স্ক্রিপ্ট ত্রুটি: ফাংশন \"$2\" নেই।",
+ "scribunto-common-notafunction": "স্ক্রিপ্ট ত্রুটি: \"$2\" কোন ফাংশন নয়।",
+ "scribunto-common-no-details": "আর কোনও বিবরণ উপলব্ধ নেই।",
+ "scribunto-lua-in-function": "\"$1\" ফাংশনে",
+ "scribunto-lua-in-main": "প্রধান খণ্ডে",
+ "scribunto-lua-in-function-at": "$1 ফাংশনে: $2 নং লাইনে",
+ "scribunto-lua-error-location": "লুয়া ত্রুটি $1: $2।",
+ "scribunto-lua-error": "লুয়া ত্রুটি: $2।",
+ "scribunto-luastandalone-proc-error": "লুয়া ত্রুটি: প্রক্রিয়া তৈরি করা যাবে না।",
+ "scribunto-luastandalone-proc-error-msg": "লুয়া ত্রুটি: প্রক্রিয়া তৈরি করা যাবে না: $2",
+ "scribunto-luastandalone-exited": "লুয়া ত্রুটি: আভ্যন্তরীণ ত্রুটি: প্রস্থানের সময় দোভাষীর অবস্থা $2।",
+ "scribunto-module-with-errors-category": "ত্রুটিসহ স্ক্রিবুন্তো মডিউল",
+ "scribunto-module-with-errors-category-desc": "মডিউলে একটি ত্রুটি আছে।",
+ "scribunto-limitreport-timeusage": "লুয়া সময় ব্যবহার",
+ "scribunto-limitreport-timeusage-value": "$1/$2 সেকেন্ড",
+ "scribunto-limitreport-virtmemusage": "লুয়া ভার্চুয়াল আকার",
+ "scribunto-limitreport-estmemusage": "লুয়া আনুমানিক স্মৃতি ব্যবহার",
+ "scribunto-limitreport-memusage": "লুয়া স্মৃতি ব্যবহার",
+ "scribunto-limitreport-profile": "লুয়া বৃত্তান্ত",
+ "scribunto-limitreport-profile-ms": "$1 মি.সে.",
+ "scribunto-limitreport-logs": "লুয়া লোগোগুলি",
+ "nstab-module": "মডিউল",
+ "tooltip-ca-nstab-module": "মডিউল পাতাটি দেখুন"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/bqi.json b/www/wiki/extensions/Scribunto/i18n/bqi.json
new file mode 100644
index 00000000..938b87fe
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/bqi.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Mogoeilor"
+ ]
+ },
+ "scribunto-lua-error": "خطا لوآ:$2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/br.json b/www/wiki/extensions/Scribunto/i18n/br.json
new file mode 100644
index 00000000..8619486c
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/br.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fohanno",
+ "Y-M D"
+ ]
+ },
+ "scribunto-line": "d'al linenn $1",
+ "scribunto-module-line": "e $1 d'al linenn $2",
+ "scribunto-console-clear": "Riñsañ",
+ "scribunto-lua-error-location": "Fazi Lua $1 : $2.",
+ "scribunto-lua-error": "Fazi Lua : $2.",
+ "scribunto-module-with-errors-category-desc": "Ur fazi a zo er modulenn.",
+ "scribunto-limitreport-timeusage-value": "$1/$2 eilenn",
+ "scribunto-limitreport-profile-ms": "$1 me"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/bs.json b/www/wiki/extensions/Scribunto/i18n/bs.json
new file mode 100644
index 00000000..dd9c5aea
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/bs.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "DzWiki",
+ "Palapa",
+ "Srdjan m",
+ "Obsuser"
+ ]
+ },
+ "scribunto-doc-page-name": "Module:$1/dok",
+ "scribunto-doc-page-does-not-exist": "''Dokumentaciju za ovaj modul možete napraviti na stranici [[$1]]''",
+ "scribunto-doc-page-header": "'''Ovo je stranica dokumentacije za [[$1]]'''",
+ "scribunto-console-clear": "Očisti",
+ "scribunto-common-timeout": "Isteklo je dodijeljeno vrijeme za rad skripti.",
+ "scribunto-lua-error": "Lua greška: $2.",
+ "scribunto-limitreport-timeusage": "Lua – upotreba vremena",
+ "scribunto-limitreport-timeusage-value": "$1/$2 sekundi",
+ "scribunto-limitreport-memusage": "Lua – upotreba memorije"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ca.json b/www/wiki/extensions/Scribunto/i18n/ca.json
new file mode 100644
index 00000000..5df11556
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ca.json
@@ -0,0 +1,52 @@
+{
+ "@metadata": {
+ "authors": [
+ "Toniher",
+ "Vriullop",
+ "Fitoschido"
+ ]
+ },
+ "scribunto-desc": "Un entorn de treball per a incrustar llenguatges d'script a les pàgines de MediaWiki",
+ "scribunto-line": "a la línia $1",
+ "scribunto-module-line": "a $1 a la línia $2",
+ "scribunto-parser-dialog-title": "Error de l'script",
+ "scribunto-error-short": "Error de l'script: $1",
+ "scribunto-error-long": "Errors de l'script:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/ús",
+ "scribunto-doc-page-does-not-exist": "''La documentació d'ús d'aquest mòdul es pot crear a [[$1]]''",
+ "scribunto-doc-page-header": "'''Aquesta és la pàgina de documentació per a [[$1]]'''",
+ "scribunto-console-intro": "* Les exportacions del mòdul són disponibles com a part de la variable «p», incloent-hi aquelles modificacions que no s'han desat.\n* Escriviu «=» davant d'una línia per a avaluar-ho com a expressió, o bé feu servir print().\n* Utilitzeu mw.log() al codi del mòdul per a enviar missatges a la consola.",
+ "scribunto-console-title": "Consola de depuració",
+ "scribunto-console-too-large": "La sessió de la consola és massa gran. Netegeu l'historial de la consola o reduïu la mida del mòdul.",
+ "scribunto-console-current-src": "entrada de la consola",
+ "scribunto-console-clear": "Neteja",
+ "scribunto-console-cleared": "S'ha netejat l'estat de la consola perquè el mòdul s'ha actualitzat.",
+ "scribunto-console-cleared-session-lost": "S'ha netejat l'estat de la consola perquè s'han perdut les dades de la sessió.",
+ "scribunto-common-error-category": "Pàgines amb errors de script",
+ "scribunto-common-error-category-desc": "Hi ha hagut un error en processar els mòduls inclosos a la pàgina.",
+ "scribunto-common-nosuchmodule": "Error de l'script: no existeix el mòdul.",
+ "scribunto-common-nofunction": "Error de l'script: cal que especifiqueu una funció per cridar.",
+ "scribunto-common-nosuchfunction": "Error de l'script: la funció que heu especificat no existeix.",
+ "scribunto-common-timeout": "S'ha exhaurit el temps assignat per a l'execució d'scripts.",
+ "scribunto-common-oom": "S'ha exhaurit la quantitat de memòria permesa per a l'execució d'scripts.",
+ "scribunto-common-backtrace": "Traça inversa:",
+ "scribunto-common-no-details": "No hi ha més detalls disponibles.",
+ "scribunto-lua-in-function": "a la funció «$1»",
+ "scribunto-lua-in-main": "en el fragment principal",
+ "scribunto-lua-in-function-at": "a la funció a $1:$2",
+ "scribunto-lua-error-location": "Error de Lua $1: $2.",
+ "scribunto-lua-error": "Error de Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Error de l'script: el mòdul ha retornat quelcom que no és una taula. Se suposa que havia de retornar una taula d'exportació.",
+ "scribunto-luastandalone-proc-error": "Error de Lua: no es pot crear el procés.",
+ "scribunto-luastandalone-decode-error": "Error de Lua: error intern: no es pot descodificar el missatge.",
+ "scribunto-luastandalone-write-error": "Error de Lua: error intern: s'ha produït un error en escriure al conducte.",
+ "scribunto-luastandalone-read-error": "Error de Lua: error intern: s'ha produït un error en llegir del conducte.",
+ "scribunto-luastandalone-gone": "Error de Lua: error intern: l'intèrpret ja ha sortit.",
+ "scribunto-luastandalone-signal": "Error de Lua: error intern: l'intèrpret ha terminat amb el senyal «$2».",
+ "scribunto-luastandalone-exited": "Error de Lua: error intern: l'intèrpret ha sortit amb l'estat «$2».",
+ "scribunto-module-with-errors-category": "Mòduls Scribunto amb errors",
+ "scribunto-module-with-errors-category-desc": "El mòdul conté un error.",
+ "scribunto-limitreport-timeusage-value": "$1/$2 segons",
+ "nstab-module": "Mòdul",
+ "tooltip-ca-nstab-module": "Mostra la pàgina del mòdul"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/cdo.json b/www/wiki/extensions/Scribunto/i18n/cdo.json
new file mode 100644
index 00000000..c01d462c
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/cdo.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "GnuDoyng"
+ ]
+ },
+ "scribunto-lua-error": "Lua chó̤-nguô: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ce.json b/www/wiki/extensions/Scribunto/i18n/ce.json
new file mode 100644
index 00000000..560af843
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ce.json
@@ -0,0 +1,29 @@
+{
+ "@metadata": {
+ "authors": [
+ "Умар"
+ ]
+ },
+ "scribunto-desc": "MediaWiki агӀонашкахь скриптийн мотт лато хӀума",
+ "scribunto-parser-dialog-title": "Скриптан гӀалат",
+ "scribunto-error-short": "Скриптан гӀалат: $1",
+ "scribunto-doc-page-does-not-exist": "''ХӀокху модулах лаьцна хааман [[$1]] агӀо кхолла мега''",
+ "scribunto-console-intro": "* ХӀокху модульс экспорт еш ерг, лело луш ю хийцалуш «p» сана, Ӏалаш бина боцу хийцамашца.\n* Хьалха йилла билгало «=», дош сана къаста ян я лела йе print().\n* Модулан кодан юкъахь лела йе mw.log() хаам консуль чохь гучу балийта.",
+ "scribunto-console-title": "Лелоран консуль",
+ "scribunto-console-clear": "ЦӀанъян",
+ "scribunto-common-error-category": "Сриптийн гӀалаташ долу агӀонаш",
+ "scribunto-common-error-category-desc": "АгӀона тӀе тоьхна йолу модулаш кеч ечу хенахь гӀалат даьлла.",
+ "scribunto-common-nosuchmodule": "Скриптан гӀалат: Иштта модуль яц «$2».",
+ "scribunto-common-nosuchfunction": "Скриптан гӀалат: Функцеш «$2» яц.",
+ "scribunto-common-no-details": "Мадарра дац.",
+ "scribunto-lua-error": "Lua гӀалат: $2.",
+ "scribunto-module-with-errors-category": "Scribunto модуль гӀалаташца",
+ "scribunto-module-with-errors-category-desc": "Модуль чохь гӀалаташ ду.",
+ "scribunto-limitreport-timeusage": "Lua лелоран хан",
+ "scribunto-limitreport-timeusage-value": "$1/$2 секунд",
+ "scribunto-limitreport-virtmemusage": "Виртуалан барам Lua",
+ "scribunto-limitreport-memusage": "Lua меттиг лелор",
+ "scribunto-limitreport-profile": "Профиль Lua",
+ "scribunto-limitreport-profile-ms": "$1 мс",
+ "scribunto-limitreport-logs": "Lua тептарш"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ceb.json b/www/wiki/extensions/Scribunto/i18n/ceb.json
new file mode 100644
index 00000000..905166bb
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ceb.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bentong Isles"
+ ]
+ },
+ "scribunto-lua-error": "Problema sa Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ckb.json b/www/wiki/extensions/Scribunto/i18n/ckb.json
new file mode 100644
index 00000000..c5424829
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ckb.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "Calak",
+ "Asoxor",
+ "Épine"
+ ]
+ },
+ "scribunto-parser-dialog-title": "ھەڵەی دەق",
+ "scribunto-error-short": "ھەڵەی دەق: $1",
+ "scribunto-doc-page-does-not-exist": "\"بەڵگەدارکردنی ئەم مۆدیوولە دەکرێ لە [[$1]]دا دروست بکرێ\"",
+ "scribunto-doc-page-header": "'''ئەمە پەڕەیەکی بەڵگەدارکردنە بۆ [[$1]]'''",
+ "scribunto-common-nosuchmodule": "ھەڵەی دەق: مۆدیوول بە ناوی «$2» بوونی نییە.",
+ "scribunto-lua-error": "ھەڵەی زمانی لوا: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/cs.json b/www/wiki/extensions/Scribunto/i18n/cs.json
new file mode 100644
index 00000000..fd6f5d49
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/cs.json
@@ -0,0 +1,64 @@
+{
+ "@metadata": {
+ "authors": [
+ "Danny B.",
+ "Mormegil",
+ "Matěj Suchánek",
+ "Dvorapa"
+ ]
+ },
+ "scribunto-desc": "Framework pro vkládání skriptovacích jazyků do stránek MediaWiki",
+ "scribunto-line": "na řádku $1",
+ "scribunto-module-line": "v modulu $1 na řádku $2",
+ "scribunto-parser-dialog-title": "Chyba skriptu",
+ "scribunto-error-short": "Chyba skriptu: $1",
+ "scribunto-error-long": "Chyby skriptu:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/Dokumentace",
+ "scribunto-doc-page-does-not-exist": "''Dokumentaci tohoto modulu lze vytvořit na stránce [[$1]]''",
+ "scribunto-doc-page-header": "'''Toto je dokumentace pro [[$1]]'''",
+ "scribunto-console-intro": "* Exporty z modulu jsou dostupné jako proměnná „p“ včetně neuložených změn.\n* Řádek začínající „=“ se vyhodnotí jako výraz, případně můžete použít print(). Pro tabulky použijte mw.logObject().\n* V kódu modulu můžete zprávy do konzole poslat pomocí mw.log() a mw.logObject().",
+ "scribunto-console-title": "Ladicí konzole",
+ "scribunto-console-too-large": "Toto konzolové sezení je příliš velké. Vymažte historii konzole nebo zmenšete modul.",
+ "scribunto-console-current-src": "konzolový vstup",
+ "scribunto-console-clear": "Vymazat",
+ "scribunto-console-cleared": "Stav konzole byl vymazán, protože modul byl změněn.",
+ "scribunto-console-cleared-session-lost": "Stav konzole byl vymazán, protože se ztratila data sezení.",
+ "scribunto-common-error-category": "Stránky s chybami skriptů",
+ "scribunto-common-error-category-desc": "Při zpracování modulů použitých na stránce došlo k chybě.",
+ "scribunto-common-nosuchmodule": "Chyba skriptu: Zadaný modul „$2“ neexistuje.",
+ "scribunto-common-nofunction": "Chyba skriptu: Musíte uvést funkci, která se má zavolat.",
+ "scribunto-common-nosuchfunction": "Chyba skriptu: Funkce „$2“ neexistuje.",
+ "scribunto-common-notafunction": "Chyba skriptu: „$2“ není funkce.",
+ "scribunto-common-timeout": "Vypršel čas povolený pro provádění skriptů.",
+ "scribunto-common-oom": "Byla překročena velikost paměti povolená pro provádění skriptů.",
+ "scribunto-common-backtrace": "Zásobník volání:",
+ "scribunto-common-no-details": "Žádné další podrobnosti nejsou k dispozici.",
+ "scribunto-lua-in-function": "ve funkci „$1“",
+ "scribunto-lua-in-main": "v hlavním bloku",
+ "scribunto-lua-in-function-at": "ve funkci na $1:$2",
+ "scribunto-lua-error-location": "Chyba Lua $1: $2.",
+ "scribunto-lua-error": "Chyba Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Chyba skriptu: Modul vrátil hodnotu typu $2. Měl by vrátit tabulku exportů.",
+ "scribunto-luastandalone-proc-error": "Chyba Lua: Nelze vytvořit proces.",
+ "scribunto-luastandalone-proc-error-msg": "Chyba Lua: Nelze vytvořit proces: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Chyba Lua: Nelze vytvořit proces: Není k dispozici proc_open. Zkontrolujte direktivu „disable_functions“ v konfiguraci PHP.",
+ "scribunto-luastandalone-decode-error": "Chyba Lua: Interní chyba: Nelze dekódovat zprávu.",
+ "scribunto-luastandalone-write-error": "Chyba Lua: Interní chyba: Chyba zápisu do roury.",
+ "scribunto-luastandalone-read-error": "Chyba Lua: Interní chyba: Chyba čtení z roury.",
+ "scribunto-luastandalone-gone": "Chyba Lua: Interní chyba: Interpret již byl ukončen.",
+ "scribunto-luastandalone-signal": "Chyba Lua: Interní chyba: Interpret byl ukončen signálem „$2“.",
+ "scribunto-luastandalone-exited": "Chyba Lua: Interní chyba: Interpret byl ukončen s výsledkem $2.",
+ "scribunto-module-with-errors-category": "Moduly Scribunto obsahující chyby",
+ "scribunto-module-with-errors-category-desc": "Modul obsahuje chybu.",
+ "scribunto-limitreport-timeusage": "Využití času Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 sekund",
+ "scribunto-limitreport-virtmemusage": "Virtuální velikost Lua",
+ "scribunto-limitreport-estmemusage": "Odhad využití paměti Lua",
+ "scribunto-limitreport-memusage": "Využití paměti Lua",
+ "scribunto-limitreport-profile": "Profil Lua",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-profile-percent": "$1 %",
+ "scribunto-limitreport-logs": "Protokoly Lua",
+ "nstab-module": "Modul",
+ "tooltip-ca-nstab-module": "Zobrazit stránku modulu"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/csb.json b/www/wiki/extensions/Scribunto/i18n/csb.json
new file mode 100644
index 00000000..faac220d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/csb.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kaszeba"
+ ]
+ },
+ "scribunto-lua-error": "Fela Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/cv.json b/www/wiki/extensions/Scribunto/i18n/cv.json
new file mode 100644
index 00000000..0193e2c5
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/cv.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chavash"
+ ]
+ },
+ "scribunto-lua-error": "Lua йӑнӑшӗ: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/cy.json b/www/wiki/extensions/Scribunto/i18n/cy.json
new file mode 100644
index 00000000..8fa7b8b6
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/cy.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lloffiwr",
+ "Ham II"
+ ]
+ },
+ "scribunto-lua-error": "Gwall Lua: $2.",
+ "scribunto-limitreport-timeusage-value": "$1/$2 eiliad"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/da.json b/www/wiki/extensions/Scribunto/i18n/da.json
new file mode 100644
index 00000000..f425d659
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/da.json
@@ -0,0 +1,39 @@
+{
+ "@metadata": {
+ "authors": [
+ "Peter Alberti"
+ ]
+ },
+ "scribunto-desc": "Gør det muligt at indlejre skriptsprog i MediaWiki-sider",
+ "scribunto-line": "i linje $1",
+ "scribunto-module-line": "i $1 på linje $2",
+ "scribunto-parser-dialog-title": "Skriptfejl",
+ "scribunto-error-short": "Skriptfejl: $1",
+ "scribunto-error-long": "Skriptfejl:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/dok",
+ "scribunto-doc-page-does-not-exist": "''Dokumentation for dette modul kan oprettes på [[$1]]''",
+ "scribunto-doc-page-header": "'''Dette er dokumentationssiden for [[$1]]'''",
+ "scribunto-console-title": "Fejlsøgningskonsol",
+ "scribunto-console-current-src": "konsolinput",
+ "scribunto-console-clear": "Ryd",
+ "scribunto-common-error-category": "Sider med skriptfejl",
+ "scribunto-common-nosuchmodule": "Skriptfejl: Intet modul med navnet \"$2\".",
+ "scribunto-common-nosuchfunction": "Skriptfejl: Funktionen \"$2\" findes ikke.",
+ "scribunto-common-notafunction": "Skriptfejl: \"$2\" er ikke en funktion.",
+ "scribunto-common-oom": "Mængden af hukommelse, der er tilladt for kørsel af skripts, er overskredet.",
+ "scribunto-common-backtrace": "Tilbagesporing:",
+ "scribunto-lua-in-function": "i funktionen \"$1\"",
+ "scribunto-lua-in-main": "i hoveddelen",
+ "scribunto-lua-in-function-at": "i funktionen ved $1:$2",
+ "scribunto-lua-error-location": "Lua-fejl $1: $2.",
+ "scribunto-lua-error": "Lua-fejl: $2.",
+ "scribunto-luastandalone-proc-error": "Lua-fejl: Kan ikke oprette proces.",
+ "scribunto-module-with-errors-category": "Scribunto-moduler med fejl",
+ "scribunto-module-with-errors-category-desc": "Modulet indeholder en fejl.",
+ "scribunto-limitreport-timeusage": "Lua tidsforbrug",
+ "scribunto-limitreport-timeusage-value": "$1/$2 sekunder",
+ "scribunto-limitreport-virtmemusage": "Lua virtuel størrelse",
+ "scribunto-limitreport-estmemusage": "Lua anslået brug af hukommelse",
+ "scribunto-limitreport-memusage": "Lua brug af hukommelse",
+ "scribunto-limitreport-profile-ms": "$1 ms"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/de-formal.json b/www/wiki/extensions/Scribunto/i18n/de-formal.json
new file mode 100644
index 00000000..84f518a9
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/de-formal.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kghbln"
+ ]
+ },
+ "scribunto-console-too-large": "Dieser Konsolensitzung ist zu umfangreich. Bitte deaktivieren Sie die Konsolenprotokollierung oder verringeren Sie die Größe des Moduls."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/de.json b/www/wiki/extensions/Scribunto/i18n/de.json
new file mode 100644
index 00000000..a4435116
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/de.json
@@ -0,0 +1,69 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kghbln",
+ "Metalhead64",
+ "Hoo",
+ "PerfektesChaos",
+ "Umherirrender"
+ ]
+ },
+ "scribunto-desc": "Ermöglicht eine Umgebung zum Einbetten von Skriptsprachen in Wikiseiten",
+ "scribunto-line": "in Zeile $1",
+ "scribunto-module-line": "in $1, Zeile $2",
+ "scribunto-parser-dialog-title": "Skriptfehler",
+ "scribunto-error-short": "Skriptfehler: $1",
+ "scribunto-error-long": "Skriptfehler:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/Doku",
+ "scribunto-doc-page-does-not-exist": "''Die Dokumentation für dieses Modul kann unter [[$1]] erstellt werden''",
+ "scribunto-doc-page-header": "'''Dies ist die Dokumentationsseite für [[$1]]'''",
+ "scribunto-console-intro": "* Modulexporte sind über die Variable „p“ verfügbar. Sie enthalten auch nicht gespeicherte Änderungen.\n* Einer Zeile „=“ voranstellen, um sie als Ausdruck auszuwerten oder print() nutzen. mw.logObject() für Tabellen verwenden.\n* Innerhalb des Modulcodes mw.log() und mw.logObject() nutzen, um Nachrichten zu dieser Konsole zu senden.",
+ "scribunto-console-title": "Fehlerbereinigungskonsole",
+ "scribunto-console-too-large": "Diese Konsolensitzung ist zu umfangreich. Bitte deaktiviere die Konsolenprotokollierung oder verringere die Größe des Moduls.",
+ "scribunto-console-current-src": "Konsoleneingabe",
+ "scribunto-console-clear": "Leeren",
+ "scribunto-console-cleared": "Die Konsole wurde geleert, da das Modul aktualisiert wurde.",
+ "scribunto-console-cleared-session-lost": "Der Konsolenstatus wurde gelöscht, da die Sitzungsdaten verloren gegangen sind.",
+ "scribunto-common-error-category": "Seiten mit Skriptfehlern",
+ "scribunto-common-error-category-desc": "Beim Verarbeiten der Module auf der Seite ist ein Fehler aufgetreten.",
+ "scribunto-common-nosuchmodule": "Skriptfehler: Ein solches Modul „$2“ ist nicht vorhanden.",
+ "scribunto-common-nofunction": "Skriptfehler: Es muss eine aufzurufende Funktion angegeben werden.",
+ "scribunto-common-nosuchfunction": "Skriptfehler: Die Funktion „$2“ ist nicht vorhanden.",
+ "scribunto-common-notafunction": "Skriptfehler: „$2“ ist keine Funktion.",
+ "scribunto-common-timeout": "Die zum Ausführen von Skripten vorgesehene Zeit ist abgelaufen.",
+ "scribunto-common-oom": "Der zum Ausführen von Skripten vorgesehene Arbeitsspeicher wurde erschöpft.",
+ "scribunto-common-backtrace": "Ablaufrückverfolgung:",
+ "scribunto-common-no-details": "Es sind keine weiteren Einzelheiten verfügbar.",
+ "scribunto-lua-in-function": "in der Funktion „$1“",
+ "scribunto-lua-in-main": "im Hauptsegment",
+ "scribunto-lua-in-function-at": "in der Funktion bei $1:$2",
+ "scribunto-lua-error-location": "Lua-Fehler $1: $2",
+ "scribunto-lua-error": "Lua-Fehler: $2",
+ "scribunto-lua-notarrayreturn": "Skriptfehler: Das Modul gab einen $2-Wert zurück. Es wird angenommen, dass eine Tabelle zum Export zurückgegeben wird.",
+ "scribunto-luastandalone-proc-error": "Lua-Fehler: Der Vorgang kann nicht erstellt werden.",
+ "scribunto-luastandalone-proc-error-msg": "Lua-Fehler: Der Prozess konnte nicht erstellt werden: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Lua-Fehler: Der Prozess konnte nicht erstellt werden: proc_open ist nicht verfügbar. „disable_functions“ der PHP-Konfigurationsanweisung überprüfen.",
+ "scribunto-luastandalone-decode-error": "Interner Lua-Fehler: Die Nachricht konnte nicht dekodiert werden.",
+ "scribunto-luastandalone-write-error": "Interner Lua-Fehler: Es trat ein Fehler beim Schreiben auf.",
+ "scribunto-luastandalone-read-error": "Interner Lua-Fehler: Es trat ein Fehler beim Lesen auf.",
+ "scribunto-luastandalone-gone": "Interner Lua-Fehler: Der Interpreter wurde bereits beendet.",
+ "scribunto-luastandalone-signal": "Interner Lua-Fehler: Der Interpreter beendet sich mit dem Signal „$2“.",
+ "scribunto-luastandalone-exited": "Interner Lua-Fehler: Der Interpreter beendet sich mit dem Status $2.",
+ "scribunto-module-with-errors-category": "Scribunto-Module mit Fehlern",
+ "scribunto-module-with-errors-category-desc": "Das Modul hat einen Fehler.",
+ "scribunto-limitreport-timeusage": "Lua – Zeitnutzung",
+ "scribunto-limitreport-timeusage-value": "$1/$2 Sekunden",
+ "scribunto-limitreport-virtmemusage": "Lua – virtuelle Größe",
+ "scribunto-limitreport-estmemusage": "Lua – geschätzte Speichernutzung",
+ "scribunto-limitreport-memusage": "Lua – Speichernutzung",
+ "scribunto-limitreport-profile": "Lua – Profil",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Lua-Logbücher",
+ "apihelp-scribunto-console-param-title": "Der Titel des zu testenden Moduls.",
+ "apihelp-scribunto-console-param-content": "Der neue Inhalt des Moduls.",
+ "apihelp-scribunto-console-param-session": "Sitzungs-Token.",
+ "apihelp-scribunto-console-param-question": "Die nächste Zeile, die als Skript evaluiert werden soll.",
+ "apihelp-scribunto-console-param-clear": "Setzt den aktuellen Sitzungsstatus fest oder löscht ihn.",
+ "nstab-module": "Modul",
+ "tooltip-ca-nstab-module": "Die Modulseite ansehen"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/din.json b/www/wiki/extensions/Scribunto/i18n/din.json
new file mode 100644
index 00000000..4019e4e8
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/din.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dinkawiki",
+ "Amire80"
+ ]
+ },
+ "scribunto-lua-error": "Lua awäc: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/diq.json b/www/wiki/extensions/Scribunto/i18n/diq.json
new file mode 100644
index 00000000..2eb0a56d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/diq.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "Erdemaslancan",
+ "Mirzali",
+ "Gorizon",
+ "Gırd"
+ ]
+ },
+ "scribunto-parser-dialog-title": "Xırabiya scripti",
+ "scribunto-error-long": "Xırabiya scripti:\n$1",
+ "scribunto-console-clear": "Bestere",
+ "scribunto-lua-error": "Xetay lua: $2.",
+ "scribunto-luastandalone-proc-error": "Xetay lua: Proses nêşeno bıvıraziyo.",
+ "scribunto-limitreport-timeusage-value": "$1/$2 saniyeyi",
+ "scribunto-limitreport-profile": "Profilê lua",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Qeydê lua"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/dsb.json b/www/wiki/extensions/Scribunto/i18n/dsb.json
new file mode 100644
index 00000000..34b81593
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/dsb.json
@@ -0,0 +1,45 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michawiki",
+ "Tlustulimu",
+ "McDutchie"
+ ]
+ },
+ "scribunto-desc": "Wobcerk za zasajźenje skriptowych rěcow do bokow MediaWiki",
+ "scribunto-line": "w smužce $1",
+ "scribunto-module-line": "w $1, w smužce $2",
+ "scribunto-parser-dialog-title": "Skriptowa zmólka",
+ "scribunto-error-short": "Skriptowa zmólka: $1",
+ "scribunto-error-long": "Skriptowe zmólki:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/Documentacija",
+ "scribunto-doc-page-does-not-exist": "''Dokumentacija za toś ten modul dajo se na [[$1]] napóraś''",
+ "scribunto-doc-page-header": "'''To jo dokumentaciski bok za [[$1]]'''",
+ "scribunto-console-intro": "* Modulowe eksporty stoje ako wariabla \"p\" k dispoziciji, inkluziwnje njeskładowanych změnow.\n* Staj \"=\" pśed smužku, aby ju ako wuraz wugódnośił, abo wužyj print().\n* Wužyj mw.log() w modulowem koźe, aby powěsći na konsolu pósłał.",
+ "scribunto-console-title": "Konsola za wótpóranje zmólkow",
+ "scribunto-console-too-large": "Toś to konsolowe pósejźenje jo pśewjelike. Pšosym wuprozni konsolowu historiju abo reducěruj wjelikosć modula.",
+ "scribunto-console-current-src": "konsolowe zapódaśe",
+ "scribunto-console-clear": "Wuprozniś",
+ "scribunto-console-cleared": "Konsola jo se wuprozniła, dokulaž modul jo se zaktualizěrował.",
+ "scribunto-console-cleared-session-lost": "Status konsole jo se wulašował, dokulaž pósejźeńske daty su se zgubili.",
+ "scribunto-common-error-category": "Boki ze skriptowymi zmólkami",
+ "scribunto-common-nosuchmodule": "Skriptowa zmólka: Taki modul njejo.",
+ "scribunto-common-nofunction": "Skriptowa zmólka: Musyš funkciju pódaś, kótaraž ma se wołaś.",
+ "scribunto-common-nosuchfunction": "Skriptowa zmólka: Funkcija, kótaruž sy pódał, njeeksistěrujo.",
+ "scribunto-common-timeout": "Cas, kótaryž jo se za wuwjeźenje skriptow póstajił, jo se minył.",
+ "scribunto-common-oom": "Wjelikosć źěłowego składa, kótaraž jo za wuwjeźenje skriptow dowólona, jo pśekšocona.",
+ "scribunto-common-backtrace": "Slědkslědowanje:",
+ "scribunto-lua-in-function": "we funkciji \"$1\"",
+ "scribunto-lua-in-main": "w głownem segmenśe",
+ "scribunto-lua-in-function-at": "we funkciji pśi $1:$2",
+ "scribunto-lua-error-location": "Lua-zmólka $1: $2.",
+ "scribunto-lua-error": "Lua-zmólka: $2.",
+ "scribunto-lua-notarrayreturn": "Skriptowa zmólka: Modul jo něco druge ako tabelu wrośił, wón by měł eksportowu tabelu wrośiś.",
+ "scribunto-luastandalone-proc-error": "Lua-zmólka: Proces njedajo se napóraś.",
+ "scribunto-luastandalone-decode-error": "Lua-zmólka: Nutśkowna zmólka: Powěźeńka njedajo se dekoděrowaś.",
+ "scribunto-luastandalone-write-error": "Lua-zmólka: Nutśkowna zmólka: Pśi pisanju jo zmólka nastała.",
+ "scribunto-luastandalone-read-error": "Lua-zmólka: Nutśkowna zmólka: Pśi cytanju jo zmólka nastała.",
+ "scribunto-luastandalone-gone": "Lua-zmólka: Nutśkowna zmólka: Interpreter jo se južo skóńcył.",
+ "scribunto-luastandalone-signal": "Lua-zmólka: Nutśkowna zmólka: Interpreter jo se ze signalom \"$2\" skóńcył.",
+ "scribunto-luastandalone-exited": "Lua-zmólka: Nutśkowna zmólka: Interpreter jo se ze statusom $2 skóńcył."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/dty.json b/www/wiki/extensions/Scribunto/i18n/dty.json
new file mode 100644
index 00000000..6abaad9a
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/dty.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "रमेश सिंह बोहरा",
+ "Nirajan pant"
+ ]
+ },
+ "scribunto-lua-error": "लुआ छुट: $2।",
+ "nstab-module": "मोड्यूल",
+ "tooltip-ca-nstab-module": "मोड्यूल पन्ना हेरऽ"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/el.json b/www/wiki/extensions/Scribunto/i18n/el.json
new file mode 100644
index 00000000..2fd0cb96
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/el.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Geraki",
+ "Evropi",
+ "Αντιγόνη"
+ ]
+ },
+ "scribunto-doc-page-name": "Module:$1/τεκμηρίωση",
+ "scribunto-common-error-category": "Σελίδες με σφάλματα δέσμης ενεργειών",
+ "scribunto-lua-error": "Σφάλμα Lua: $2.",
+ "scribunto-module-with-errors-category": "Modules Scribunto με σφάλματα"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/en-gb.json b/www/wiki/extensions/Scribunto/i18n/en-gb.json
new file mode 100644
index 00000000..dbaea031
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/en-gb.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chase me ladies, I'm the Cavalry"
+ ]
+ },
+ "scribunto-lua-error": "Lua error: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/en.json b/www/wiki/extensions/Scribunto/i18n/en.json
new file mode 100644
index 00000000..f98c807f
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/en.json
@@ -0,0 +1,74 @@
+{
+ "@metadata": {
+ "authors": [
+ "Victor Vasiliev",
+ "Base"
+ ]
+ },
+ "scribunto-desc": "Framework for embedding scripting languages into MediaWiki pages",
+ "scribunto-line": "at line $1",
+ "scribunto-module-line": "in $1 at line $2",
+ "scribunto-parser-dialog-title": "Script error",
+ "scribunto-error-short": "Script error: $1",
+ "scribunto-error-long": "Script errors:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''Documentation for this module may be created at [[$1]]''",
+ "scribunto-doc-page-show": "{{$1}}\n<hr />",
+ "scribunto-doc-page-header": "'''This is the documentation page for [[$1]]'''",
+ "scribunto-console-intro": "* The module exports are available as the variable \"p\", including unsaved modifications.\n* Precede a line with \"=\" to evaluate it as an expression or use print(). Use mw.logObject() for tables.\n* Use mw.log() and mw.logObject() in module code to send messages to this console.",
+ "scribunto-console-title": "Debug console",
+ "scribunto-console-too-large": "This console session is too large. Please clear the console history or reduce the size of the module.",
+ "scribunto-console-current-src": "console input",
+ "scribunto-console-clear": "Clear",
+ "scribunto-console-cleared": "The console state was cleared because the module was updated.",
+ "scribunto-console-cleared-session-lost": "The console state was cleared because the session data was lost.",
+ "scribunto-common-error-category": "Pages with script errors",
+ "scribunto-common-error-category-desc": "There was an error when processing the modules included on the page.",
+ "scribunto-common-nosuchmodule": "Script error: No such module \"$2\".",
+ "scribunto-common-nofunction": "Script error: You must specify a function to call.",
+ "scribunto-common-nosuchfunction": "Script error: The function \"$2\" does not exist.",
+ "scribunto-common-notafunction": "Script error: \"$2\" is not a function.",
+ "scribunto-common-timeout": "The time allocated for running scripts has expired.",
+ "scribunto-common-oom": "The amount of memory allowed for running scripts has been exceeded.",
+ "scribunto-common-backtrace": "Backtrace:",
+ "scribunto-common-no-details": "No further details are available.",
+ "scribunto-lua-in-function": "in function \"$1\"",
+ "scribunto-lua-in-main": "in main chunk",
+ "scribunto-lua-in-function-at": "in the function at $1:$2",
+ "scribunto-lua-backtrace-line": "$1: $2",
+ "scribunto-lua-error-location": "Lua error $1: $2.",
+ "scribunto-lua-error": "Lua error: $2.",
+ "scribunto-lua-notarrayreturn": "Script error: The module returned a $2 value. It is supposed to return an export table.",
+ "scribunto-luastandalone-proc-error": "Lua error: Cannot create process.",
+ "scribunto-luastandalone-proc-error-msg": "Lua error: Cannot create process: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Lua error: Cannot create process: proc_open is not available. Check PHP's \"disable_functions\" configuration directive.",
+ "scribunto-luastandalone-decode-error": "Lua error: Internal error: Unable to decode message.",
+ "scribunto-luastandalone-write-error": "Lua error: Internal error: Error writing to pipe.",
+ "scribunto-luastandalone-read-error": "Lua error: Internal error: Error reading from pipe.",
+ "scribunto-luastandalone-gone": "Lua error: Internal error: The interpreter has already exited.",
+ "scribunto-luastandalone-signal": "Lua error: Internal error: The interpreter has terminated with signal \"$2\".",
+ "scribunto-luastandalone-exited": "Lua error: Internal error: The interpreter exited with status $2.",
+ "scribunto-module-with-errors-category": "Scribunto modules with errors",
+ "scribunto-module-with-errors-category-desc": "The module has an error in it.",
+ "scribunto-limitreport-timeusage": "Lua time usage",
+ "scribunto-limitreport-timeusage-value": "$1/$2 seconds",
+ "scribunto-limitreport-virtmemusage": "Lua virtual size",
+ "scribunto-limitreport-virtmemusage-value": "$1/$2",
+ "scribunto-limitreport-estmemusage": "Lua estimated memory usage",
+ "scribunto-limitreport-estmemusage-value": "$1",
+ "scribunto-limitreport-memusage": "Lua memory usage",
+ "scribunto-limitreport-memusage-value": "$1/$2",
+ "scribunto-limitreport-profile": "Lua Profile",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-profile-percent": "$1%",
+ "scribunto-limitreport-logs": "Lua logs",
+ "apihelp-scribunto-console-description": "Internal module for servicing XHR requests from the Scribunto console.",
+ "apihelp-scribunto-console-summary": "Internal module for servicing XHR requests from the Scribunto console.",
+ "apihelp-scribunto-console-param-title": "The title of the module to test.",
+ "apihelp-scribunto-console-param-content": "The new content of the module.",
+ "apihelp-scribunto-console-param-session": "Session token.",
+ "apihelp-scribunto-console-param-question": "The next line to evaluate as a script.",
+ "apihelp-scribunto-console-param-clear": "Set to clear the current session state.",
+ "nstab-module": "Module",
+ "tooltip-ca-nstab-module": "View the module page"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/eo.json b/www/wiki/extensions/Scribunto/i18n/eo.json
new file mode 100644
index 00000000..3c807081
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/eo.json
@@ -0,0 +1,52 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michawiki",
+ "Tlustulimu",
+ "Lucas",
+ "Rafaneta",
+ "Robin van der Vliet",
+ "Psychoslave",
+ "McDutchie",
+ "Fitoschido"
+ ]
+ },
+ "scribunto-desc": "Framo por enkorpigi skriptlingvojn en paĝojn de MediaWiki",
+ "scribunto-line": "en linio $1",
+ "scribunto-module-line": "en $1, linio $2",
+ "scribunto-parser-dialog-title": "Skripteraro",
+ "scribunto-error-short": "Skripteraro: $1",
+ "scribunto-error-long": "Skripteraroj:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/dokumentado",
+ "scribunto-doc-page-does-not-exist": "''Dokumentado por ĉi tiu modulo povas esti kreata ĉe [[$1]]''",
+ "scribunto-doc-page-header": "'''Tio estas la paĝo de la dokumentado por [[$1]]'''",
+ "scribunto-console-intro": "* La modulaj elportaĵoj estas disponeblaj kiel variablo \"p\" , inkluzive de la nekonservitaj ŝanĝoj.\n* Prefiksu linion per \"=\" por taksi ĝin kiel esprimon aŭ uzu print().\n* Uzu mw.log() en la modulkodo por sendi mesaĝojn al ĉi tiu konzolo.",
+ "scribunto-console-title": "Sencimiga konzolo",
+ "scribunto-console-too-large": "Ĉi tiu konzola seanco estas tro ampleksa. Bonvolu vakigi la konzolan historion aŭ reduku la grandecon de la modulo.",
+ "scribunto-console-current-src": "Konzola enigo",
+ "scribunto-console-clear": "Vakigi",
+ "scribunto-console-cleared": "Konzola stato estis vakigata, ĉar la modulo estis ĝisdatigata.",
+ "scribunto-console-cleared-session-lost": "La konzola stato estis vakigata, ĉar la seancaj datumoj perdiĝis.",
+ "scribunto-common-error-category": "Paĝoj kun skripteraroj",
+ "scribunto-common-nosuchmodule": "Skripteraro: Tia modulo ne ekzistas.",
+ "scribunto-common-nofunction": "Skripteraro: Vi devas specifi vokotan funkcion.",
+ "scribunto-common-nosuchfunction": "Skripteraro: La funkcio, kiun vi specifis, ne ekzistis.",
+ "scribunto-common-timeout": "La planita tempo por plenumi skriptojn pasis.",
+ "scribunto-common-oom": "La sumo de memoro permesata por lanĉi skriptojn estas transpasita.",
+ "scribunto-common-backtrace": "Retrospurado:",
+ "scribunto-lua-in-function": "en funkcio \"$1\"",
+ "scribunto-lua-in-main": "en la ĉefsegmento",
+ "scribunto-lua-in-function-at": "en la funkcio ĉe $1: $2",
+ "scribunto-lua-error-location": "Lua-eraro $1: $2.",
+ "scribunto-lua-error": "Lua‑eraro: $2.",
+ "scribunto-lua-notarrayreturn": "Skripteraro: La modulo liveris ion alian ol tabelon. Ĝi liveru eksportotabelon.",
+ "scribunto-luastandalone-proc-error": "Lua-eraro: Ne povas krei proceson.",
+ "scribunto-luastandalone-decode-error": "Lua-eraro: Interna eraro: Ne eblas dekodi mesaĝon.",
+ "scribunto-luastandalone-write-error": "Lua-eraro: Interna eraro: Eraro skribante al dukto.",
+ "scribunto-luastandalone-read-error": "Lua-eraro: Interna eraro: Eraro legante el dukto.",
+ "scribunto-luastandalone-gone": "Lua-eraro: Interna eraro: La interpretilo estas jam eligita.",
+ "scribunto-luastandalone-signal": "Lua-eraro: Interna eraro: La interpretilo finiĝis kun signalo \"$2\".",
+ "scribunto-luastandalone-exited": "Lua-eraro: Interna eraro: La interpretilo finiĝis kun statuso \"$2\".",
+ "nstab-module": "Modulo",
+ "tooltip-ca-nstab-module": "Rigardi la modul-paĝon"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/es.json b/www/wiki/extensions/Scribunto/i18n/es.json
new file mode 100644
index 00000000..f612b3d5
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/es.json
@@ -0,0 +1,76 @@
+{
+ "@metadata": {
+ "authors": [
+ "Armando-Martin",
+ "Jewbask",
+ "Maor X",
+ "Peter Bowman",
+ "Fitoschido",
+ "Vfrico",
+ "Macofe",
+ "Ryo567",
+ "Lemondoge",
+ "Dgstranz",
+ "McDutchie"
+ ]
+ },
+ "scribunto-desc": "Marco para la incorporación de lenguajes de script en páginas de MediaWiki",
+ "scribunto-line": "en la línea $1",
+ "scribunto-module-line": "en $1 en la línea $2",
+ "scribunto-parser-dialog-title": "Error en la secuencia de órdenes",
+ "scribunto-error-short": "Error de secuencia de órdenes: $1",
+ "scribunto-error-long": "Errores en la secuencia de órdenes:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''La documentación para este módulo puede ser creada en [[$1]]''",
+ "scribunto-doc-page-header": "'''Esta es la página de documentación de [[$1]]'''",
+ "scribunto-console-intro": "* Las exportaciones del módulo están disponibles como la variable \"p\", incluidas las modificaciones sin guardar.\n* Inicia una línea con el carácter \"=\" para evaluarla como una expresión; o usa print().\n* Usa mw.log() en el código del módulo para enviar mensajes a esta consola.",
+ "scribunto-console-title": "Consola de depuración de errores",
+ "scribunto-console-too-large": "La sesión de esta consola es demasiado grande. Limpia el historial de la consola o reduce el tamaño del módulo.",
+ "scribunto-console-current-src": "entrada de la consola",
+ "scribunto-console-clear": "Limpiar",
+ "scribunto-console-cleared": "El estado de la consola se ha limpiado debido a que el módulo se ha actualizado.",
+ "scribunto-console-cleared-session-lost": "El estado de la consola se ha limpiado debido a que la sesión de datos se ha perdido.",
+ "scribunto-common-error-category": "Páginas con errores en secuencias de órdenes",
+ "scribunto-common-error-category-desc": "Se produjo un error al procesar los módulos incluidos en la página.",
+ "scribunto-common-nosuchmodule": "Error en la secuencia de órdenes: no existe el módulo «$2».",
+ "scribunto-common-nofunction": "Error de secuencia de órdenes: se debe especificar una función a la que llamar.",
+ "scribunto-common-nosuchfunction": "Error en la secuencia de órdenes: la función «$2» no existe.",
+ "scribunto-common-notafunction": "Error en la secuencia de órdenes: «$2» no es una función.",
+ "scribunto-common-timeout": "Ha caducado el tiempo asignado para ejecutar secuencias de comandos (scripts).",
+ "scribunto-common-oom": "Se superó la cantidad de memoria permitida para ejecutar secuencias de órdenes.",
+ "scribunto-common-backtrace": "Traza inversa:",
+ "scribunto-common-no-details": "No hay más detalles disponibles.",
+ "scribunto-lua-in-function": "en la función \"$1\"",
+ "scribunto-lua-in-main": "en el campo principal",
+ "scribunto-lua-in-function-at": "en la función en $1: $2",
+ "scribunto-lua-error-location": "Error de Lua $1: $2.",
+ "scribunto-lua-error": "Error de Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Error de secuencia de comandos: el módulo devolvió un valor $2. Debería devolver una tabla de exportación.",
+ "scribunto-luastandalone-proc-error": "Error de Lua: No se puede crear el proceso.",
+ "scribunto-luastandalone-proc-error-msg": "Error de Lua: no se puede crear el proceso: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Error de Lua: No se puede crear el proceso: proc_open no está disponible. Comprueba la directiva de configuración de PHP «disable_functions».",
+ "scribunto-luastandalone-decode-error": "Error de Lua: Error interno: No se pudo decodificar el mensaje.",
+ "scribunto-luastandalone-write-error": "Error de Lua: Error interno: Error al escribir en la canalización (pipe).",
+ "scribunto-luastandalone-read-error": "Error de Lua: Error interno: Error al leer desde la canalización (pipe).",
+ "scribunto-luastandalone-gone": "Error de Lua: Error interno: El intérprete ya ha finalizado.",
+ "scribunto-luastandalone-signal": "Error de Lua: Error interno: El intérprete ha finalizado con la señal \"$2\".",
+ "scribunto-luastandalone-exited": "Error de Lua: Error interno: El intérprete ha finalizado con el estado $2.",
+ "scribunto-module-with-errors-category": "Módulos de Scribunto con errores",
+ "scribunto-module-with-errors-category-desc": "El módulo tiene un error.",
+ "scribunto-limitreport-timeusage": "Tiempo de uso de Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 segundos",
+ "scribunto-limitreport-virtmemusage": "Tamaño virtual de Lua",
+ "scribunto-limitreport-estmemusage": "Uso estimado de memoria de Lua",
+ "scribunto-limitreport-memusage": "Uso de memoria de Lua",
+ "scribunto-limitreport-profile": "Perfil de Lua",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Registros de Lua",
+ "apihelp-scribunto-console-description": "Módulo interno para el mantenimiento de XHR las solicitudes de los Scribunto de la consola.",
+ "apihelp-scribunto-console-param-title": "El título del módulo que probar.",
+ "apihelp-scribunto-console-param-content": "El nuevo contenido del módulo.",
+ "apihelp-scribunto-console-param-session": "Token de sesión.",
+ "apihelp-scribunto-console-param-question": "El próximo renglón que evaluar como secuencia de órdenes.",
+ "apihelp-scribunto-console-param-clear": "Marcar para borrar el estado de la sesión actual.",
+ "nstab-module": "Módulo",
+ "tooltip-ca-nstab-module": "Ver la página del módulo"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/et.json b/www/wiki/extensions/Scribunto/i18n/et.json
new file mode 100644
index 00000000..ec10ec30
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/et.json
@@ -0,0 +1,39 @@
+{
+ "@metadata": {
+ "authors": [
+ "Avjoska",
+ "Pikne",
+ "Cumbril"
+ ]
+ },
+ "scribunto-desc": "Raamistik, mis võimaldab põimida MediaWiki lehekülgedesse skriptikeeli.",
+ "scribunto-line": "$1. real",
+ "scribunto-module-line": "kohal $1 $2. real",
+ "scribunto-parser-dialog-title": "Skriptitõrge",
+ "scribunto-error-short": "Skriptitõrge: $1",
+ "scribunto-error-long": "Skriptitõrked:\n\n$1",
+ "scribunto-doc-page-does-not-exist": "''Selle mooduli dokumentatsiooni saab kirjutada asukohta [[$1]]''.",
+ "scribunto-doc-page-header": "'''See on üksuse [[$1]] dokumentatsiooni lehekülg.'''",
+ "scribunto-console-title": "Veatõrje konsool",
+ "scribunto-console-current-src": "konsoolisisend",
+ "scribunto-console-clear": "Puhasta",
+ "scribunto-common-error-category": "Skriptitõrgetega leheküljed",
+ "scribunto-common-error-category-desc": "Leheküljel olevate moodulite töötlemisel ilmnes tõrge.",
+ "scribunto-common-nosuchmodule": "Skriptitõrge: Moodulit \"$2\" pole.",
+ "scribunto-common-nosuchfunction": "Skriptitõrge: Funktsioon \"$2\" puudub.",
+ "scribunto-common-notafunction": "Skriptitõrge: \"$2\" pole funktsioon.",
+ "scribunto-lua-in-function": "funktsioonis \"$1\"",
+ "scribunto-lua-error-location": "Lua tõrge $1: $2.",
+ "scribunto-lua-error": "Lua tõrge: $2.",
+ "scribunto-lua-notarrayreturn": "Skriptitõrge: Moodul peaks väljastama eksporditabeli, kuid väljastas $2-tüüpi väärtuse.",
+ "scribunto-module-with-errors-category": "Tõrgetega Scribunto-moodulid",
+ "scribunto-module-with-errors-category-desc": "Moodulis on tõrge.",
+ "scribunto-limitreport-timeusage": "Lua ajakasutus",
+ "scribunto-limitreport-timeusage-value": "$1/$2 sekundit",
+ "scribunto-limitreport-virtmemusage": "Lua virtuaalne suurus",
+ "scribunto-limitreport-estmemusage": "Lua hinnanguline mälukasutus",
+ "scribunto-limitreport-memusage": "Lua mälukasutus",
+ "scribunto-limitreport-profile": "Lua profiil",
+ "nstab-module": "Moodul",
+ "tooltip-ca-nstab-module": "Vaata mooduli lehekülge"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/eu.json b/www/wiki/extensions/Scribunto/i18n/eu.json
new file mode 100644
index 00000000..c17c5510
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/eu.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "පසිඳු කාවින්ද",
+ "Subi",
+ "Sator",
+ "McDutchie"
+ ]
+ },
+ "scribunto-line": "$1. lerroan",
+ "scribunto-doc-page-name": "Module:$1/dok",
+ "scribunto-console-clear": "Garbitu",
+ "scribunto-lua-error-location": "Luanda errorea $1:$2.",
+ "scribunto-lua-error": "Lua errorea:$2.",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "nstab-module": "Modulua"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/fa.json b/www/wiki/extensions/Scribunto/i18n/fa.json
new file mode 100644
index 00000000..5aa5f070
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/fa.json
@@ -0,0 +1,62 @@
+{
+ "@metadata": {
+ "authors": [
+ "Armin1392",
+ "Mjbmr",
+ "Reza1615",
+ "ZxxZxxZ",
+ "جواد",
+ "Ebraminio",
+ "Calak",
+ "Dalba"
+ ]
+ },
+ "scribunto-desc": "چارچوبی برای تعبیه‌کردن زبان‌های اسکریپتی در صفحه‌های مدیاویکی",
+ "scribunto-line": "در خط $1",
+ "scribunto-module-line": "در $1 در خط $2",
+ "scribunto-parser-dialog-title": "خطای اسکریپتی",
+ "scribunto-error-short": "خطای اسکریپتی: $1",
+ "scribunto-error-long": "خطاهای اسکریپتی:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/توضیحات",
+ "scribunto-doc-page-does-not-exist": "''توضیحات این پودمان می‌تواند در [[$1]] قرار گیرد.''",
+ "scribunto-doc-page-header": "'''این صفحهٔ توضیحات [[$1]] است'''",
+ "scribunto-console-intro": "* برون‌بری پودمان به عنوان متغیر \"p\"، شامل تغییرات ذخیره نشده در دسترس هستند.\n* یک خط را با \"=\" برای ارزیابی آن به عنوان یک عبارت، یا با استفاده از print()‎ مقدم کنید.\n* از mw.log()‎ در کد پودمان برای ارسال پیام‌ها به این کنسول استفاده کنید.",
+ "scribunto-console-title": "میزفرمان اشکال‌زدایی",
+ "scribunto-console-too-large": "نشست میز فرمان خیلی بزرگ است. لطفاً تاریخچهٔ میز فرمان را پاک کنید یا حجم پودمان را کمتر کنید.",
+ "scribunto-console-current-src": "ورودی میزفرمان",
+ "scribunto-console-clear": "پاک‌سازی",
+ "scribunto-console-cleared": "وضعیت میز فرمان پاک‌سازی شد، چون پودمان تغییر کرد.",
+ "scribunto-console-cleared-session-lost": "وضعیت میزفرمان پاک‌سازی شد، چون اطلاعات نشست از دست رفت.",
+ "scribunto-common-error-category": "صفحه‌های دارای خطاهای اسکریپتی",
+ "scribunto-common-nosuchmodule": "خطای اسکریپتی: پودمان «$2» وجود ندارد.",
+ "scribunto-common-nofunction": "خطای اسکریپتی: باید تابعی را برای فراخوانی مشخص کنید.",
+ "scribunto-common-nosuchfunction": "خطای اسکریپتی: تابعی که مشخص کردید وجود ندارد.",
+ "scribunto-common-timeout": "زمان مجاز برای اجرای اسکریپت‌ها منقضی شده است.",
+ "scribunto-common-oom": "مقدار حافظهٔ استفاده شده برای اجرای اسکریپت از حد مجاز فراتر رفته است.",
+ "scribunto-common-backtrace": "نشانهٔ قبلی:",
+ "scribunto-lua-in-function": "در تابع «$1»",
+ "scribunto-lua-in-main": "در قسمت اصلی",
+ "scribunto-lua-in-function-at": "در تابع در $1:$2",
+ "scribunto-lua-error-location": "خطای لوآ $1: $2.",
+ "scribunto-lua-error": "خطای لوآ: $2.",
+ "scribunto-lua-notarrayreturn": "خطای اسکریپتی: پودمان چیزی غیر از یک جدول برگرداند. (باید یک جدول برون‌ریزی برگرداند)",
+ "scribunto-luastandalone-proc-error": "خطای لوآ: نمی‌تواند فرآیند را ایجاد کند.",
+ "scribunto-luastandalone-proc-error-msg": "خطای لوا: روند نتوانست ایجاد شود: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "خطای لوآ: نتوانست روند را ایجاد کند: proc_open در دسترس نیست. دستور پیکربندی \"disable_functions\"پی‌اچ‌پی‌ را بررسی کنید.",
+ "scribunto-luastandalone-decode-error": "خطای لوآ: خطای داخلی: نمی‌تواند پیغام را کدبرداری کند.",
+ "scribunto-luastandalone-write-error": "خطای لوآ: خطای داخلی: خطا در نوشتن لوله.",
+ "scribunto-luastandalone-read-error": "خطای لوآ: خطای داخلی: خطا در خواندن لوله.",
+ "scribunto-luastandalone-gone": "خطای لوآ: خطای داخلی: مفسر قبلاً خارج شده است.",
+ "scribunto-luastandalone-signal": "خطای لوآ: خطای داخلی: مفسر با سیگنال «$2» خاتمه یافته است.",
+ "scribunto-luastandalone-exited": "خطای لوآ: خطای داخلی: مفسر با وضعیت $2 خارج شده است.",
+ "scribunto-module-with-errors-category": "ماژول‌های اسکرایبونتو با خطاها",
+ "scribunto-limitreport-timeusage": "مصرف زمان لوآ",
+ "scribunto-limitreport-timeusage-value": "$1/ $2 ثانیه",
+ "scribunto-limitreport-virtmemusage": "اندازهٔ مجازی لوآ",
+ "scribunto-limitreport-estmemusage": "حافظهٔ مصرفی لوآ تخمین‌زده‌شده",
+ "scribunto-limitreport-memusage": "مصرف حافظهٔ‌ لوآ",
+ "scribunto-limitreport-profile": "مشخصات لوآ",
+ "scribunto-limitreport-profile-ms": "$1 میلی‌ثانیه",
+ "scribunto-limitreport-profile-percent": "$1٪",
+ "nstab-module": "پودمان"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/fi.json b/www/wiki/extensions/Scribunto/i18n/fi.json
new file mode 100644
index 00000000..17c2b72e
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/fi.json
@@ -0,0 +1,63 @@
+{
+ "@metadata": {
+ "authors": [
+ "Beluga",
+ "Crt",
+ "Silvonen",
+ "Stryn",
+ "VezonThunder",
+ "Pxos",
+ "Nike",
+ "01miki10"
+ ]
+ },
+ "scribunto-desc": "Mahdollistaa komentosarjakielien käytön wikisivuilla",
+ "scribunto-line": "rivillä $1",
+ "scribunto-module-line": "kohdassa $1 rivillä $2",
+ "scribunto-parser-dialog-title": "Komentosarjavirhe",
+ "scribunto-error-short": "Komentosarjavirhe: $1",
+ "scribunto-error-long": "Komentosarjavirheet:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/ohje",
+ "scribunto-doc-page-does-not-exist": "''Tämän moduulin ohjeistuksen voi tehdä sivulle [[$1]]''",
+ "scribunto-doc-page-header": "'''Tämä on ohjesivu moduulille [[$1]]'''",
+ "scribunto-console-intro": "* Moduulien viennit ovat käytettävissä muuttujana \"p\", mukaan lukien tallentamattomat muokkaukset.\n* Aloita rivi merkillä \"=\" arvioidaksesi sitä lausekkeena, tai käytä komentoa print().\n* Käytä komentoa mw.log() moduulin koodissa lähettääksesi viestejä tähän konsoliin.",
+ "scribunto-console-title": "Virheenetsintäkonsoli",
+ "scribunto-console-too-large": "Tämä konsoli-istunto on liian suuri. Tyhjennä konsolin historia tai pienennä moduulin kokoa.",
+ "scribunto-console-current-src": "konsolisyöte",
+ "scribunto-console-clear": "Tyhjennä",
+ "scribunto-console-cleared": "Konsolin tila tyhjennettiin, koska moduuli päivitettiin.",
+ "scribunto-console-cleared-session-lost": "Konsolin tila tyhjennettiin, koska istunnon tiedot menetettiin.",
+ "scribunto-common-error-category": "Sivut, joissa on komentosarjavirhe",
+ "scribunto-common-error-category-desc": "Sivulla olevien moduulien käsittelyn aikana tapahtui virhe.",
+ "scribunto-common-nosuchmodule": "Komentosarjavirhe: Moduulia \"$2\" ei ole.",
+ "scribunto-common-nofunction": "Komentosarjavirhe: Sinun on määritettävä kutsuttava funktio.",
+ "scribunto-common-nosuchfunction": "Komentosarjavirhe: Funktiota \"$2\" ei ole.",
+ "scribunto-common-notafunction": "Komentosarjavirhe: \"$2\" ei ole funktio.",
+ "scribunto-common-timeout": "Skriptien suorittamiseen varattu aika on päättynyt.",
+ "scribunto-common-oom": "Skriptien suorittamiseen sallittu muistin määrä on ylitetty.",
+ "scribunto-common-no-details": "Lisätietoja ei ole saatavilla.",
+ "scribunto-lua-in-function": "funktiossa \"$1\"",
+ "scribunto-lua-in-function-at": "funktiossa kohdassa $1:$2",
+ "scribunto-lua-error-location": "Lua-virhe $1: $2.",
+ "scribunto-lua-error": "Lua-virhe: $2.",
+ "scribunto-luastandalone-proc-error": "Lua-virhe: Prosessin luominen epäonnistui.",
+ "scribunto-luastandalone-proc-error-msg": "Lua-virhe: Prosessin luominen epäonnistui: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Lua-virhe: Prosessia ei voida luoda: proc_open ei ole saatavilla. Tarkista PHP:n \"disable_functions\"-konfiguraatiodirektiivi.",
+ "scribunto-luastandalone-decode-error": "Lua-virhe: Sisäinen virhe: Viestiä ei voida purkaa.",
+ "scribunto-luastandalone-write-error": "Lua-virhe: Sisäinen virhe: Virhe kirjoitettaessa putkeen.",
+ "scribunto-luastandalone-read-error": "Lua-virhe: Sisäinen virhe: Virhe luettaessa putkesta.",
+ "scribunto-module-with-errors-category": "Scribunto-moduulit, joissa on virheitä",
+ "scribunto-module-with-errors-category-desc": "Moduulissa on virhe.",
+ "scribunto-limitreport-timeusage": "Lua-ajankäyttö",
+ "scribunto-limitreport-timeusage-value": "$1/$2 sekuntia",
+ "scribunto-limitreport-virtmemusage": "Lua-virtuaalikoko",
+ "scribunto-limitreport-estmemusage": "Arvioitu Lua-muistinkäyttö",
+ "scribunto-limitreport-memusage": "Lua-muistinkäyttö",
+ "scribunto-limitreport-profile": "Lua-profiili",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Lua-lokit",
+ "apihelp-scribunto-console-param-title": "Testattavan moduulin nimi.",
+ "apihelp-scribunto-console-param-content": "Moduulin uusi sisältö.",
+ "nstab-module": "Moduuli",
+ "tooltip-ca-nstab-module": "Näytä moduulisivu"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/fo.json b/www/wiki/extensions/Scribunto/i18n/fo.json
new file mode 100644
index 00000000..b62366aa
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/fo.json
@@ -0,0 +1,31 @@
+{
+ "@metadata": {
+ "authors": [
+ "EileenSanda"
+ ]
+ },
+ "scribunto-line": "á linju $1",
+ "scribunto-module-line": "í $1 á linju $2",
+ "scribunto-parser-dialog-title": "Script feilur",
+ "scribunto-error-short": "Script feilur: $1",
+ "scribunto-error-long": "Script feilir:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''Tú kanst upprætta kunningarsíðu um hetta modulið á [[$1]]''",
+ "scribunto-doc-page-header": "'''Hetta er kunningarsíðan viðvíkjandi [[$1]]'''",
+ "scribunto-console-clear": "Tak burtur",
+ "scribunto-common-error-category": "Síður við script-feilum",
+ "scribunto-common-nosuchmodule": "Script feilur: Onki sovorði modul \"$2\".",
+ "scribunto-common-nosuchfunction": "Script feilur: Funktiónin \"$2\" er ikki til.",
+ "scribunto-common-notafunction": "Script feilur: \"$2\" er ikki ein funktión.",
+ "scribunto-common-no-details": "Ongin onnur kunning er tøk.",
+ "scribunto-lua-in-function": "í funktión $1",
+ "scribunto-lua-in-function-at": "í funktiónini á $1:$2",
+ "scribunto-lua-error-location": "Lua feilur $1: $2.",
+ "scribunto-lua-error": "Lua feilur: $2.",
+ "scribunto-luastandalone-proc-error": "Lua feilur: Kann ikki skapa tilgongdina.",
+ "scribunto-luastandalone-proc-error-msg": "Lua feilur: Kann ikki skapa tilgond: $2",
+ "scribunto-module-with-errors-category": "Scribunto modulir við feilum",
+ "scribunto-module-with-errors-category-desc": "Tað er ein feilur í modulinum.",
+ "scribunto-limitreport-timeusage": "Tíðarnýtsla hjá Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 sekund"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/fr.json b/www/wiki/extensions/Scribunto/i18n/fr.json
new file mode 100644
index 00000000..d138fff9
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/fr.json
@@ -0,0 +1,78 @@
+{
+ "@metadata": {
+ "authors": [
+ "Brunoperel",
+ "Cquoi",
+ "Crochet.david",
+ "Erkethan",
+ "Gomoko",
+ "IAlex",
+ "Urhixidur",
+ "Orlodrim",
+ "Wyz",
+ "Wladek92",
+ "Od1n"
+ ]
+ },
+ "scribunto-desc": "Framework pour l'intégration de langages de script dans les pages MediaWiki",
+ "scribunto-line": "à la ligne $1",
+ "scribunto-module-line": "dans $1 à la ligne $2",
+ "scribunto-parser-dialog-title": "Erreur de script",
+ "scribunto-error-short": "Erreur de script : $1",
+ "scribunto-error-long": "Erreurs de script :\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''La documentation pour ce module peut être créée à [[$1]]''",
+ "scribunto-doc-page-header": "'''Ceci est la page de documentation pour [[$1]]'''",
+ "scribunto-console-intro": "* Les exportations du module sont accessibles par la variable « p », y compris les modifications non enregistrées. \n* Faites précéder une ligne par « = » pour l'évaluer comme une expression, ou utilisez print(). Utilisez mw.logObject() pour les tables.\n* Utilisez mw.log() et mw.logObject() dans le code du module pour envoyer des messages à cette console.",
+ "scribunto-console-title": "Console de débogage",
+ "scribunto-console-too-large": "Cette session de console est trop grande. Veuillez effacer l’historique de la console ou réduire la taille du module.",
+ "scribunto-console-current-src": "entrée de la console",
+ "scribunto-console-clear": "Effacer",
+ "scribunto-console-cleared": "L'état de la console a été effacé parce que le module a été mis à jour.",
+ "scribunto-console-cleared-session-lost": "L’état de la console a été nettoyé car les données de sessions ont été perdues.",
+ "scribunto-common-error-category": "Pages avec des erreurs de script",
+ "scribunto-common-error-category-desc": "Il y a eu une erreur lors du traitement des modules contenus sur la page.",
+ "scribunto-common-nosuchmodule": "Erreur de script : le module « $2 » n’existe pas.",
+ "scribunto-common-nofunction": "Erreur de script : vous devez spécifier une fonction à appeler.",
+ "scribunto-common-nosuchfunction": "Erreur de script : la fonction « $2 » n’existe pas.",
+ "scribunto-common-notafunction": "Erreur de script : « $2 » n’est pas une fonction.",
+ "scribunto-common-timeout": "Le temps alloué pour l’exécution des scripts a expiré.",
+ "scribunto-common-oom": "La quantité de mémoire allouée pour exécuter des scripts a été dépassée.",
+ "scribunto-common-backtrace": "Pile des appels :",
+ "scribunto-common-no-details": "Aucun autre détail n’est disponible.",
+ "scribunto-lua-in-function": "dans la fonction « $1 »",
+ "scribunto-lua-in-main": "dans le segment principal",
+ "scribunto-lua-in-function-at": "dans la fonction $1 : $2",
+ "scribunto-lua-backtrace-line": "$1 : $2",
+ "scribunto-lua-error-location": "Erreur Lua $1 : $2.",
+ "scribunto-lua-error": "Erreur Lua : $2",
+ "scribunto-lua-notarrayreturn": "Erreur de script : Le module a renvoyé une valeur $2. Il est supposé renvoyer un tableau d’exportations.",
+ "scribunto-luastandalone-proc-error": "Erreur LUA : Impossible de créer le processus.",
+ "scribunto-luastandalone-proc-error-msg": "Erreur LUA : Impossible de créer le processus : $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Erreur LUA : Impossible de créer le processus : proc_open n’est pas disponible. Vérifiez la directive de configuration PHP « disable_functions ».",
+ "scribunto-luastandalone-decode-error": "Erreur LUA : Erreur interne : Impossible de décoder le message.",
+ "scribunto-luastandalone-write-error": "Erreur LUA : Erreur interne : Erreur d'écriture dans le tube (pipe).",
+ "scribunto-luastandalone-read-error": "Erreur LUA : Erreur interne : Erreur de lecture du tube (pipe).",
+ "scribunto-luastandalone-gone": "Erreur LUA : Erreur interne : L'interpréteur s'est déjà arrêté.",
+ "scribunto-luastandalone-signal": "Erreur LUA : Erreur interne: L'interpréteur s'est arrêté avec le signal « $2 ».",
+ "scribunto-luastandalone-exited": "Erreur LUA : Erreur interne : L'interpréteur s'est arrêté avec le statut « $2 ».",
+ "scribunto-module-with-errors-category": "Modules Scribunto avec des erreurs",
+ "scribunto-module-with-errors-category-desc": "Le module contient une erreur.",
+ "scribunto-limitreport-timeusage": "Temps d’utilisation de Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 secondes",
+ "scribunto-limitreport-virtmemusage": "Taille virtuelle de Lua",
+ "scribunto-limitreport-estmemusage": "Utilisation mémoire estimée de Lua",
+ "scribunto-limitreport-memusage": "Utilisation mémoire de Lua",
+ "scribunto-limitreport-profile": "Profil Lua",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Journaux de Lua",
+ "apihelp-scribunto-console-description": "Module interne pour les requêtes de service XHR à partir de la console Scribunto.",
+ "apihelp-scribunto-console-summary": "Module interne gérant les requêtes XHR à partir de la console Scribunto.",
+ "apihelp-scribunto-console-param-title": "Le titre du module à tester.",
+ "apihelp-scribunto-console-param-content": "Le nouveau contenu du module.",
+ "apihelp-scribunto-console-param-session": "Jeton de session.",
+ "apihelp-scribunto-console-param-question": "La ligne suivante à évaluer comme un script.",
+ "apihelp-scribunto-console-param-clear": "Positionner pour effacer l'état de la session courante.",
+ "nstab-module": "Module",
+ "tooltip-ca-nstab-module": "Afficher la page du module"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/frp.json b/www/wiki/extensions/Scribunto/i18n/frp.json
new file mode 100644
index 00000000..29659d9b
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/frp.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "ChrisPtDe"
+ ]
+ },
+ "scribunto-lua-error": "Fôta Lua : $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/frr.json b/www/wiki/extensions/Scribunto/i18n/frr.json
new file mode 100644
index 00000000..5b46952a
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/frr.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Murma174"
+ ]
+ },
+ "scribunto-lua-error": "Lua-feeler: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/fur.json b/www/wiki/extensions/Scribunto/i18n/fur.json
new file mode 100644
index 00000000..e247e5d0
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/fur.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Tocaibon"
+ ]
+ },
+ "scribunto-lua-error": "Erôr Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/fy.json b/www/wiki/extensions/Scribunto/i18n/fy.json
new file mode 100644
index 00000000..0593be8b
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/fy.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Robin0van0der0vliet",
+ "Robin van der Vliet",
+ "PiefPafPier"
+ ]
+ },
+ "scribunto-line": "op rigel $1",
+ "scribunto-module-line": "yn $1 op rigel $2",
+ "scribunto-console-current-src": "konsoleynfier",
+ "scribunto-common-error-category": "Siden mei skriptflaters",
+ "scribunto-lua-error-location": "Lua-flater $1: $2",
+ "scribunto-lua-error": "Luaflater: $2",
+ "scribunto-limitreport-timeusage-value": "$1/$2 sekonden"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ga.json b/www/wiki/extensions/Scribunto/i18n/ga.json
new file mode 100644
index 00000000..9db37ae4
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ga.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Tem"
+ ]
+ },
+ "scribunto-lua-error": "Earráid Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/gcr.json b/www/wiki/extensions/Scribunto/i18n/gcr.json
new file mode 100644
index 00000000..7cd0e81e
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/gcr.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "LeGuyanaisPure"
+ ]
+ },
+ "scribunto-lua-error": "Éròr Lua : $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/gd.json b/www/wiki/extensions/Scribunto/i18n/gd.json
new file mode 100644
index 00000000..e2d9726c
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/gd.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "GunChleoc"
+ ]
+ },
+ "scribunto-lua-error": "Mearachd Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/gl.json b/www/wiki/extensions/Scribunto/i18n/gl.json
new file mode 100644
index 00000000..4a3a771d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/gl.json
@@ -0,0 +1,70 @@
+{
+ "@metadata": {
+ "authors": [
+ "Toliño",
+ "Elisardojm",
+ "Banjo",
+ "McDutchie"
+ ]
+ },
+ "scribunto-desc": "Estrutura para incorporar linguaxes de script nas páxinas de MediaWiki",
+ "scribunto-line": "na liña $1",
+ "scribunto-module-line": "en $1 na liña $2",
+ "scribunto-parser-dialog-title": "Erro de script",
+ "scribunto-error-short": "Erro de script: $1",
+ "scribunto-error-long": "Erros de script:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/uso",
+ "scribunto-doc-page-does-not-exist": "''A documentación deste módulo pódese crear en \"[[$1]]\"''",
+ "scribunto-doc-page-header": "'''Esta é a páxina de documentación de \"[[$1]]\"'''",
+ "scribunto-console-intro": "* As exportacións do módulo están dispoñibles como a variable \"p\", incluídas as modificacións sen gardar.\n* Poña un \"=\" ao comezo da liña para avaliala como unha expresión; tamén pode usar print(). Use mw.logObject() para táboas.\n* Use mw.log() e mw.logObject() no código do módulo para enviar mensaxes a esta consola.",
+ "scribunto-console-title": "Consola de depuración",
+ "scribunto-console-too-large": "A sesión desta consola é grande de máis. Limpe o historial da consola ou reduza o tamaño do módulo.",
+ "scribunto-console-current-src": "entrada da consola",
+ "scribunto-console-clear": "Limpar",
+ "scribunto-console-cleared": "Limpouse o estado da consola debido á actualización do módulo.",
+ "scribunto-console-cleared-session-lost": "Limpouse o estado da consola debido á perda dos datos da sesión.",
+ "scribunto-common-error-category": "Páxinas con erros de script",
+ "scribunto-common-error-category-desc": "Produciuse un erro ao procesar os módulos incluídos na páxina.",
+ "scribunto-common-nosuchmodule": "Erro de script: Non existe o módulo \"$2\".",
+ "scribunto-common-nofunction": "Erro de script: Cómpre especificar a función que se quere chamar.",
+ "scribunto-common-nosuchfunction": "Erro de script: A función \"$2\" non existe.",
+ "scribunto-common-notafunction": "Erro de script: «$2» non é unha función.",
+ "scribunto-common-timeout": "O tempo reservado para executar os scripts rematou.",
+ "scribunto-common-oom": "Superouse a cantidade de memoria permitida para executar os scripts.",
+ "scribunto-common-backtrace": "Rastro inverso (backtrace):",
+ "scribunto-common-no-details": "No hai máis detalles dispoñibles.",
+ "scribunto-lua-in-function": "na función \"$1\"",
+ "scribunto-lua-in-main": "no bloque principal",
+ "scribunto-lua-in-function-at": "na función en $1:$2",
+ "scribunto-lua-error-location": "Erro de Lua $1: $2.",
+ "scribunto-lua-error": "Erro de Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Erro de script: O módulo devolveu o valor $2. Debería devolver unha táboa de exportación.",
+ "scribunto-luastandalone-proc-error": "Erro de Lua: Non se pode crear o proceso.",
+ "scribunto-luastandalone-proc-error-msg": "Erro de Lua: Non se pode crear o proceso: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Erro de Lua: Non se pode crear o proceso: proc_open non está dispoñible. Comprobe a directiva de configuración \"disable_functions\" do PHP.",
+ "scribunto-luastandalone-decode-error": "Erro de Lua: Erro interno: Non se puido descodificar a mensaxe.",
+ "scribunto-luastandalone-write-error": "Erro de Lua: Erro interno: Erro ao escribir na canalización (pipe).",
+ "scribunto-luastandalone-read-error": "Erro de Lua: Erro interno: Erro ao ler desde a canalización (pipe).",
+ "scribunto-luastandalone-gone": "Erro de Lua: Erro interno: O intérprete xa rematou.",
+ "scribunto-luastandalone-signal": "Erro de Lua: Erro interno: O intérprete rematou co sinal \"$2\".",
+ "scribunto-luastandalone-exited": "Erro de Lua: Erro interno: O intérprete rematou co estado $2.",
+ "scribunto-module-with-errors-category": "Módulos de Scribunto con erros",
+ "scribunto-module-with-errors-category-desc": "O módulo contén un erro.",
+ "scribunto-limitreport-timeusage": "Tempo de uso de Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 segundos",
+ "scribunto-limitreport-virtmemusage": "Tamaño virtual de Lua",
+ "scribunto-limitreport-estmemusage": "Uso estimado de memoria de Lua",
+ "scribunto-limitreport-memusage": "Uso de memoria de Lua",
+ "scribunto-limitreport-profile": "Perfil de Lua",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Rexistros de Lua",
+ "apihelp-scribunto-console-description": "Módulo interno para servir peticións XHR dende a consola Scribunto.",
+ "apihelp-scribunto-console-summary": "Módulo interno para servir peticións XHR dende a consola Scribunto.",
+ "apihelp-scribunto-console-param-title": "Título do módulo a probar.",
+ "apihelp-scribunto-console-param-content": "Novo contido do módulo.",
+ "apihelp-scribunto-console-param-session": "Identificador de sesión.",
+ "apihelp-scribunto-console-param-question": "Liña seguinte a evaluar como script.",
+ "apihelp-scribunto-console-param-clear": "Baleirar o estado de sesión actual.",
+ "nstab-module": "Módulo",
+ "tooltip-ca-nstab-module": "Ver a páxina do módulo"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/glk.json b/www/wiki/extensions/Scribunto/i18n/glk.json
new file mode 100644
index 00000000..6d7d7d48
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/glk.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "شیخ"
+ ]
+ },
+ "scribunto-lua-error": "لۊا سأب: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/gom-deva.json b/www/wiki/extensions/Scribunto/i18n/gom-deva.json
new file mode 100644
index 00000000..15ce1ca0
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/gom-deva.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Supriya kankumbikar"
+ ]
+ },
+ "scribunto-lua-error": "लुआ त्रुटि: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/gom-latn.json b/www/wiki/extensions/Scribunto/i18n/gom-latn.json
new file mode 100644
index 00000000..f5659064
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/gom-latn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "The Discoverer"
+ ]
+ },
+ "scribunto-lua-error": "Lua chuk: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/gor.json b/www/wiki/extensions/Scribunto/i18n/gor.json
new file mode 100644
index 00000000..f368e480
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/gor.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Marwan Mohamad"
+ ]
+ },
+ "scribunto-lua-error": "Tilala Lua:$2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/got.json b/www/wiki/extensions/Scribunto/i18n/got.json
new file mode 100644
index 00000000..fdfe4583
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/got.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gothicspeaker"
+ ]
+ },
+ "scribunto-lua-error": "𐌻𐌿𐌰 𐌰𐌹𐍂𐌶𐌴𐌹: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/grc.json b/www/wiki/extensions/Scribunto/i18n/grc.json
new file mode 100644
index 00000000..c936020e
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/grc.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gts-tg"
+ ]
+ },
+ "scribunto-lua-error": "Σφάλμα Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/gsw.json b/www/wiki/extensions/Scribunto/i18n/gsw.json
new file mode 100644
index 00000000..4d704368
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/gsw.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Als-Holder"
+ ]
+ },
+ "scribunto-lua-error": "Lua-Fähler: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/gu.json b/www/wiki/extensions/Scribunto/i18n/gu.json
new file mode 100644
index 00000000..688762c4
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/gu.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Arbhatt",
+ "KartikMistry"
+ ]
+ },
+ "scribunto-lua-error": "લુઆ ક્ષતિ : $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/hak.json b/www/wiki/extensions/Scribunto/i18n/hak.json
new file mode 100644
index 00000000..6adba884
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/hak.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hakka"
+ ]
+ },
+ "scribunto-lua-error": "Lua chhâ-chho: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/he.json b/www/wiki/extensions/Scribunto/i18n/he.json
new file mode 100644
index 00000000..af05b86d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/he.json
@@ -0,0 +1,70 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "ערן",
+ "Guycn2",
+ "McDutchie"
+ ]
+ },
+ "scribunto-desc": "מסגרת להטבעת שפות תסריט לדפים של מדיה־ויקי",
+ "scribunto-line": "בשורה $1",
+ "scribunto-module-line": "ביחידה $1 בשורה $2",
+ "scribunto-parser-dialog-title": "שגיאה בתסריט",
+ "scribunto-error-short": "שגיאה בתסריט: $1",
+ "scribunto-error-long": "שגיאות בתסריט:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/תיעוד",
+ "scribunto-doc-page-does-not-exist": "ניתן ליצור תיעוד על היחידה הזאת בדף [[$1]]",
+ "scribunto-doc-page-header": "זהו דף התיעוד עבור [[$1]]",
+ "scribunto-console-intro": "* השמות המיוצאים מיחידה זמינים במשתנה \"p\", כולל שינויים שלא נשמרו.\n* כדי לחשב את השורה כביטוי יש להתחיל אותה בסימן \"=\" או להשתמש ב־print()‎. יש להשתמש ב־mw.logObject()‎ בשביל טבלאות.\n* כדי לשלוח הודעות למסוף הזה, יש להשתמש ב־mw.log()‎ וב־mw.logObject()‎.",
+ "scribunto-console-title": "מסוף לבדיקת קוד",
+ "scribunto-console-too-large": "השיחה במסוף גדולה מדי. נא לנקות את ההיסטוריה או להקטין את היחידה.",
+ "scribunto-console-current-src": "קלט במסוף",
+ "scribunto-console-clear": "ניקוי",
+ "scribunto-console-cleared": "מצב המסוף נוקה כי היחידה עודכנה.",
+ "scribunto-console-cleared-session-lost": "מצב המסוף נוקה, כי נתוני השיחה אבדו.",
+ "scribunto-common-error-category": "דפים עם שגיאות בתסריט",
+ "scribunto-common-error-category-desc": "אירעה שגיאה בעת עיבוד היחידות הכלולות בדף.",
+ "scribunto-common-nosuchmodule": "שגיאת תסריט: היחידה \"$2\" אינה קיימת.",
+ "scribunto-common-nofunction": "שגיאת תסריט: חובה לציין לאיזו פונקציה לקרוא.",
+ "scribunto-common-nosuchfunction": "שגיאת תסריט: הפונקציה \"$2\" אינה קיימת.",
+ "scribunto-common-notafunction": "שגיאת תסריט: \"$2\" אינה פונקציה.",
+ "scribunto-common-timeout": "הזמן שהוקצה להרצת תסריטים פג.",
+ "scribunto-common-oom": "הזיכרון שהוקצה להרצת תסריטים אזל.",
+ "scribunto-common-backtrace": "מחסנית קריאות:",
+ "scribunto-common-no-details": "פרטים נוספים אינם זמינים.",
+ "scribunto-lua-in-function": "בפונקציה \"$1\"",
+ "scribunto-lua-in-main": "בגוש העיקרי",
+ "scribunto-lua-in-function-at": "בפונקציה $1 בשורה $2",
+ "scribunto-lua-error-location": "שגיאת לואה $1: $2.",
+ "scribunto-lua-error": "שגיאת לואה: $2.",
+ "scribunto-lua-notarrayreturn": "שגיאת תסריט: היחידה החזירה ערך $2. היא אמורה להחזיר טבלת שמות מיוצאים.",
+ "scribunto-luastandalone-proc-error": "שגיאת לואה: לא ניתן ליצור תהליך.",
+ "scribunto-luastandalone-proc-error-msg": "שגיאת לואה: לא ניתן ליצור תהליך: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "שגיאת לואה: לא ניתן ליצור תהליך: הפונקציה proc_open אינה זמינה. נא לבדוק את ההגדרה \"disable_functions\" של PHP.",
+ "scribunto-luastandalone-decode-error": "שגיאת לואה: שגיאה פנימית: לא ניתן לפענח הודעה.",
+ "scribunto-luastandalone-write-error": "שגיאת לואה: שגיאה פנימית: שגיאה בכתיבה לצינור.",
+ "scribunto-luastandalone-read-error": "שגיאת לואה: שגיאה פנימית: שגיאה בקריאה מצינור.",
+ "scribunto-luastandalone-gone": "שגיאת לואה: שגיאה פנימית: המפענח כבר יצא.",
+ "scribunto-luastandalone-signal": "שגיאת לואה: שגיאה פנימית: המפענח גמר עם הסיגנל \"$2\".",
+ "scribunto-luastandalone-exited": "שגיאת לואה: שגיאה פנימית: המפענח יצא עם המצב $2.",
+ "scribunto-module-with-errors-category": "יחידות סקריבונטו עם שגיאות",
+ "scribunto-module-with-errors-category-desc": "ביחידה יש שגיאה.",
+ "scribunto-limitreport-timeusage": "שימוש של לואה בזמן",
+ "scribunto-limitreport-timeusage-value": "$1/$2 שניות",
+ "scribunto-limitreport-virtmemusage": "גודל וירטואלי של לואה",
+ "scribunto-limitreport-estmemusage": "שימוש מוערך של לואה בזיכרון",
+ "scribunto-limitreport-memusage": "שימוש של לואה בזיכרון",
+ "scribunto-limitreport-profile": "פרופיל לואה",
+ "scribunto-limitreport-profile-ms": "$1 מ\"ש",
+ "scribunto-limitreport-logs": "יומני לואה",
+ "apihelp-scribunto-console-description": "יחידה פנימית לשירות בקשות XHR ממסוף Scribunto.",
+ "apihelp-scribunto-console-summary": "יחידה פנימית להבאת בקשות XHR ממסוף Scribunto.",
+ "apihelp-scribunto-console-param-title": "שם היחידה לבדיקה.",
+ "apihelp-scribunto-console-param-content": "התוכן החדש ליחידה.",
+ "apihelp-scribunto-console-param-session": "אסימון שיחה.",
+ "apihelp-scribunto-console-param-question": "השורה הבאה להערכה בתור תסריט.",
+ "apihelp-scribunto-console-param-clear": "להגדיר כדי לנקות את מצב השיחה הנוכחי.",
+ "nstab-module": "יחידה",
+ "tooltip-ca-nstab-module": "צפייה בדף היחידה"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/hi.json b/www/wiki/extensions/Scribunto/i18n/hi.json
new file mode 100644
index 00000000..ab306c3d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/hi.json
@@ -0,0 +1,54 @@
+{
+ "@metadata": {
+ "authors": [
+ "Siddhartha Ghai",
+ "Sfic"
+ ]
+ },
+ "scribunto-desc": "मीडियाविकि पृष्ठों में स्क्रिप्टिंग भाषाएँ डालने का ढाँचा",
+ "scribunto-line": "पंक्ति $1 पर",
+ "scribunto-module-line": "$1 में पंक्ति $2 पर",
+ "scribunto-parser-dialog-title": "स्क्रिप्ट त्रुटि",
+ "scribunto-error-short": "स्क्रिप्ट त्रुटि: $1",
+ "scribunto-error-long": "स्क्रिप्ट त्रुटियाँ:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "\"इस मॉड्यूल हेतु प्रलेख [[$1]] पर बनाया जा सकता है\"",
+ "scribunto-doc-page-header": "'''यह [[$1]] हेतु प्रलेख पृष्ठ है'''",
+ "scribunto-console-intro": "* मॉड्यूल के निर्यात वेरियेबल \"p\" में उपलब्ध हैं, नहीं सहेजे गये बदलावों सहित।\n*किसी पंक्ति को एक्सप्रेशन की तरह चलाने के लिए उससे पहले \"=\" लगाएँ, अथवा print() का प्रयोग करें।\n* इस कौन्सोल को सन्देश भेजने के लिए मॉड्यूल कोड में mw.log() का प्रयोग करें",
+ "scribunto-console-title": "डीबग कौन्सोल",
+ "scribunto-console-too-large": "यह कौन्सोल सेशन बहुत बड़ा है। कृपया कौन्सोल इतिहास खाली करें अथवा मॉड्यूल का आकार छोटा करें।",
+ "scribunto-console-current-src": "कौन्सोल इनपुट",
+ "scribunto-console-clear": "खाली करें",
+ "scribunto-console-cleared": "कौन्सोल को खाली किया गया है क्योंकि मॉड्यूल में बदलाव हुए हैं।",
+ "scribunto-console-cleared-session-lost": "कौन्सोल को खाली किया गया है क्योंकि सेशन डाटा खो गया।",
+ "scribunto-common-error-category": "स्क्रिप्ट त्रुटियों वाले पृष्ठ",
+ "scribunto-common-nosuchmodule": "स्क्रिप्ट त्रुटि: \"$2\" ऐसा कोई मॉड्यूल नहीं है।",
+ "scribunto-common-nofunction": "स्क्रिप्ट त्रुटि: आपको बुलाने के लिए कोई फंक्शन बताना होगा।",
+ "scribunto-common-nosuchfunction": "स्क्रिप्ट त्रुटि: \"$2\" फंक्शन मौजूद नहीं है।",
+ "scribunto-common-timeout": "स्क्रिप्ट चलाने हेतु आवंटित समय समाप्त हो गया है।",
+ "scribunto-common-oom": "स्क्रिप्ट चलाने हेतु आवंटित मेमोरी सीमा पार हो गयी है।",
+ "scribunto-common-backtrace": "बैकट्रेस (बुलाए गए फंक्शन):",
+ "scribunto-lua-in-function": "फंक्शन \"$1\" में",
+ "scribunto-lua-in-main": "मुख्य खंड में",
+ "scribunto-lua-in-function-at": "फंक्शन में $1:$2 पर",
+ "scribunto-lua-error-location": "लुआ त्रुटि $1: $2।",
+ "scribunto-lua-error": "लुआ त्रुटि: $2।",
+ "scribunto-lua-notarrayreturn": "स्क्रिप्ट त्रुटि: मॉड्यूल ने उत्तर में सारणी के अलावा कुछ और दिया। मॉड्यूल को उत्तर में एक निर्यात सारणी देनी चाहिए।",
+ "scribunto-luastandalone-proc-error": "लुआ त्रुटि: प्रक्रिया नहीं बनाई जा सकती।",
+ "scribunto-luastandalone-proc-error-msg": "लुआ त्रुटि: प्रक्रिया नहीं बनाई जा सकी: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "लुआ त्रुटि: प्रक्रिया नहीं बनाई जा सकी: proc_open उपलब्ध नहीं है। PHP का \"disable_functions\" कन्फिगरेशन डायरेक्टिव जाँचें।",
+ "scribunto-luastandalone-decode-error": "लुआ त्रुटि: आतंरिक त्रुटि: सन्देश डीकोड नहीं किया जा सका।",
+ "scribunto-luastandalone-write-error": "लुआ त्रुटि: आतंरिक त्रुटि: पाइप में लिखने में त्रुटि।",
+ "scribunto-luastandalone-read-error": "लुआ त्रुटि: आतंरिक त्रुटि: पाइप से पढ़ने में त्रुटि।",
+ "scribunto-luastandalone-gone": "लुआ त्रुटि: आतंरिक त्रुटि: इंटरप्रेटर पहले ही बंद हो चुका है।",
+ "scribunto-luastandalone-signal": "लुआ त्रुटि: आतंरिक त्रुटि: इंटरप्रेटर \"$2\" संकेत के साथ बंद हो चुका है।",
+ "scribunto-luastandalone-exited": "लुआ त्रुटि: आतंरिक त्रुटि: इंटरप्रेटर $2 स्थिति-संकेत के साथ बंद हुआ।",
+ "scribunto-module-with-errors-category": "त्रुटियों वाले स्क्रिबुंटो मॉड्यूल",
+ "scribunto-limitreport-timeusage": "लुआ समय प्रयोग",
+ "scribunto-limitreport-timeusage-value": "$1/$2 सेकेंड",
+ "scribunto-limitreport-virtmemusage": "लुआ वर्चुअल आकार",
+ "scribunto-limitreport-estmemusage": "अनुमानित लुआ मेमोरी प्रयोग",
+ "scribunto-limitreport-memusage": "लुआ मेमोरी प्रयोग",
+ "scribunto-limitreport-profile": "लुआ प्रोफ़ाइल",
+ "scribunto-limitreport-profile-ms": "$1 मिलीसेकेंड"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/hif-latn.json b/www/wiki/extensions/Scribunto/i18n/hif-latn.json
new file mode 100644
index 00000000..0a2b9ed7
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/hif-latn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Girmitya"
+ ]
+ },
+ "scribunto-lua-error": "Lua error: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/hr.json b/www/wiki/extensions/Scribunto/i18n/hr.json
new file mode 100644
index 00000000..61978f6c
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/hr.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fraxinus",
+ "Bugoslav",
+ "Obsuser"
+ ]
+ },
+ "scribunto-common-timeout": "Vrijeme izdvojeno za pokretanje skripti je isteklo.",
+ "scribunto-lua-error": "Lua pogreška: $2.",
+ "nstab-module": "Modul"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/hrx.json b/www/wiki/extensions/Scribunto/i18n/hrx.json
new file mode 100644
index 00000000..aa03ad7d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/hrx.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Midnight Gambler"
+ ]
+ },
+ "scribunto-lua-error": "Lua-Fehler: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/hsb.json b/www/wiki/extensions/Scribunto/i18n/hsb.json
new file mode 100644
index 00000000..851da9b2
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/hsb.json
@@ -0,0 +1,47 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michawiki",
+ "Tlustulimu",
+ "McDutchie"
+ ]
+ },
+ "scribunto-desc": "Wobłuk za zasadźenje skriptowych rěčow do stronow MediaWiki",
+ "scribunto-line": "w lince $1",
+ "scribunto-module-line": "w $1, w lince $2",
+ "scribunto-parser-dialog-title": "Skriptowy zmylk",
+ "scribunto-error-short": "Skriptowy zmylk: $1",
+ "scribunto-error-long": "Skriptowe zmylki:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/dokumentacija",
+ "scribunto-doc-page-does-not-exist": "''Dokumentacija za tutón modul hodźi so na [[$1]] wutworić''",
+ "scribunto-doc-page-header": "'''To je dokumentaciska strona za [[$1]]'''",
+ "scribunto-console-intro": "* Modulowe eksporty steja jako wariabla \"p\" k dispoziciji, inkluziwnje njeskładowanych změnow.\n* Staj \"=\" před linku, zo by ju jako wuraz wuhódnoćił, abo wužij print().\n* Wužij mw.log() w modulowym kodźe, zo by powěsće na konsolu pósłał.",
+ "scribunto-console-title": "Konsola za porjedźenje zmylkow",
+ "scribunto-console-too-large": "Tute konsolowe posedźnje je přewulke. Prošu wuprózdń konsolowu historiju abo redukuj wulkosć modula.",
+ "scribunto-console-current-src": "konsolowe zapodaće",
+ "scribunto-console-clear": "Wuprózdnić",
+ "scribunto-console-cleared": "Konsola je so wuprózdniła, dokelž modul je so zaktualizował.",
+ "scribunto-console-cleared-session-lost": "Status konsole je so zhašał, dokelž posedźenske daty su so zhubili.",
+ "scribunto-common-error-category": "Strony ze skriptowymi zmylkami",
+ "scribunto-common-nosuchmodule": "Skriptowy zmylk: Tajki modul njeje.",
+ "scribunto-common-nofunction": "Skriptowy zmylk: Dyrbiš funkciju podać, kotraž ma so wołać.",
+ "scribunto-common-nosuchfunction": "Skriptowy zmylk: Funkcija, kotruž sy podał, njeeksistuje.",
+ "scribunto-common-timeout": "Čas, kotryž je so za wuwjedźenje skriptow postajił, je spadnył.",
+ "scribunto-common-oom": "Wulkosć dźěłoweho składa, kotraž je za wuwjedźenje skriptow dowolena, je překročena.",
+ "scribunto-common-backtrace": "Wróćoslědowanje:",
+ "scribunto-lua-in-function": "we funkciji \"$1\"",
+ "scribunto-lua-in-main": "we hłownym segmenće",
+ "scribunto-lua-in-function-at": "we funkciji při $1:$2",
+ "scribunto-lua-error-location": "Lua-zmylk $1: $2.",
+ "scribunto-lua-error": "Lua-zmylk: $2.",
+ "scribunto-lua-notarrayreturn": "Skriptowy zmylk: Modul je něšto druhe hač tabelu wróćił, wón měł eksportowu tabelu wróćić.",
+ "scribunto-luastandalone-proc-error": "Lua-zmylk: Proces njeda so wutworić.",
+ "scribunto-luastandalone-proc-error-msg": "Lua-zmylk: Proces njeda so wutworić: $2",
+ "scribunto-luastandalone-decode-error": "Lua-zmylk: Nutřkowny zmylk: Zdźělenka njeda so dekodować.",
+ "scribunto-luastandalone-write-error": "Lua-zmylk: Nutřkowny zmylk: Při pisanju je zmylk wustupił.",
+ "scribunto-luastandalone-read-error": "Lua-zmylk: Nutřkowny zmylk: Při čitanju je zmylk wustupił.",
+ "scribunto-luastandalone-gone": "Lua-zmylk: Nutřkowny zmylk: Interpreter je so hižo skónčił.",
+ "scribunto-luastandalone-signal": "Lua-zmylk: Nutřkowny zmylk: Interpreter je so ze signalom \"$2\" skónčił.",
+ "scribunto-luastandalone-exited": "Lua-zmylk: Nutřkowny zmylk: Interpreter je so ze statusom $2 skónčił.",
+ "scribunto-module-with-errors-category": "Module Scribunto ze zmylkami"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ht.json b/www/wiki/extensions/Scribunto/i18n/ht.json
new file mode 100644
index 00000000..de860d7f
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ht.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bfpage"
+ ]
+ },
+ "scribunto-lua-error": "Lua error: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/hu.json b/www/wiki/extensions/Scribunto/i18n/hu.json
new file mode 100644
index 00000000..c7b0f729
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/hu.json
@@ -0,0 +1,69 @@
+{
+ "@metadata": {
+ "authors": [
+ "Misibacsi",
+ "TK-999",
+ "Tgr",
+ "Tacsipacsi"
+ ]
+ },
+ "scribunto-desc": "Keretrendszer a parancsnyelvek MediaWiki-lapokba történő beágyazására",
+ "scribunto-line": "a(z) $1. sorban",
+ "scribunto-module-line": "a(z) $1 modulban a(z) $2. sorban",
+ "scribunto-parser-dialog-title": "Parancsfájl-hiba",
+ "scribunto-error-short": "Parancsfájl-hiba: $1",
+ "scribunto-error-long": "Parancsfájl-hibák:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''A modult a [[$1]] lapon tudod dokumentálni''",
+ "scribunto-doc-page-header": "'''Ez a [[$1]] dokumentációs lapja'''",
+ "scribunto-console-intro": "* A modul kimenetei a „p” változóban érhetők el, beleértve a nem mentett módosításokat is.\n* Kezdjél egy sort „=” jellel, ha kifejezésként értelmezendő, vagy használd a print() parancsot.\n* Használd az mw.log() függvényt, hogy közvetlenül a konzolra küldjél üzenetet.",
+ "scribunto-console-title": "Hibakereső konzol",
+ "scribunto-console-too-large": "A konzolmunkamenet túl nagy. Töröld a konzolelőzményeket a modul méretének csökkentéséhez.",
+ "scribunto-console-current-src": "konzol bemenet",
+ "scribunto-console-clear": "törlés",
+ "scribunto-console-cleared": "A konzolállapot visszaállítódott, mert megváltoztattad a modult.",
+ "scribunto-console-cleared-session-lost": "A konzolállapot visszaállítódott, mert a munkamenet adatai elvesztek.",
+ "scribunto-common-error-category": "Parancsfájlhibát okozó lapok",
+ "scribunto-common-error-category-desc": "Hiba lépett fel a lapon található modulok feldolgozása közben.",
+ "scribunto-common-nosuchmodule": "Parancsfájl-hiba: nincs „$2” modul.",
+ "scribunto-common-nofunction": "Parancsfájl-hiba: meg kell adnod a használandó függvényt.",
+ "scribunto-common-nosuchfunction": "Parancsfájl-hiba: a(z) „$2” függvény nem létezik.",
+ "scribunto-common-notafunction": "Parancsfájlhiba: „$2” nem egy függvény.",
+ "scribunto-common-timeout": "A parancsfájlok futtatására lefoglalt idő lejárt.",
+ "scribunto-common-oom": "A parancsfájlok futtatásához engedélyezett memória mennyisége túl lett lépve.",
+ "scribunto-common-backtrace": "Backtrace:",
+ "scribunto-common-no-details": "Nem érhetők el további részletek.",
+ "scribunto-lua-in-function": "a(z) \"$1\" függvényben",
+ "scribunto-lua-in-main": "a fő részben",
+ "scribunto-lua-in-function-at": "a(z) $1 függvényben, $2. sorban",
+ "scribunto-lua-error-location": "Lua-hiba $1: $2",
+ "scribunto-lua-error": "Lua-hiba: $2.",
+ "scribunto-lua-notarrayreturn": "Parancsfájl-hiba: A modul egy $2 értékkel tért vissza, pedig egy tömböt kellene exportálnia.",
+ "scribunto-luastandalone-proc-error": "Lua-hiba: Folyamat létrehozása sikertelen.",
+ "scribunto-luastandalone-proc-error-msg": "Lua-hiba: Folyamat létrehozása sikertelen: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Lua-hiba: Folyamat létrehozása sikertelen: a proc_open függvény nem elérhető. Ellenőrizd a PHP „disable_functions” konfigurációs direktíváját.",
+ "scribunto-luastandalone-decode-error": "Lua-hiba: Belső hiba: Üzenet dekódolása sikertelen.",
+ "scribunto-luastandalone-write-error": "Lua-hiba: Belső hiba: Hiba a csőbe írás közben.",
+ "scribunto-luastandalone-read-error": "Lua-hiba: Belső hiba: Hiba a csőből olvasás közben.",
+ "scribunto-luastandalone-gone": "Lua-hiba: Belső hiba: Az értelmező már kilépett.",
+ "scribunto-luastandalone-signal": "Lua-hiba: Belső hiba: Az értelmező „$2” állapotüzenettel tért vissza.",
+ "scribunto-luastandalone-exited": "Lua-hiba: Belső hiba: Az értelmező $2 státusszal ért lépett ki.",
+ "scribunto-module-with-errors-category": "Hibát okozó Scribunto-modulok",
+ "scribunto-module-with-errors-category-desc": "A modul hibát tartalmaz.",
+ "scribunto-limitreport-timeusage": "Lua-időhasználat",
+ "scribunto-limitreport-timeusage-value": "$1/$2 másodperc",
+ "scribunto-limitreport-virtmemusage": "Lua virtuális mérete",
+ "scribunto-limitreport-estmemusage": "Lua becsült memóriahasználata",
+ "scribunto-limitreport-memusage": "Lua memóriahasználata",
+ "scribunto-limitreport-profile": "Lua-profil",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Lua-naplók",
+ "apihelp-scribunto-console-description": "Belső modul a Scribunto konzolról érkező XHR-kérések kiszolgálására.",
+ "apihelp-scribunto-console-param-title": "A tesztelendő modul címe.",
+ "apihelp-scribunto-console-param-content": "A modul új tartalma.",
+ "apihelp-scribunto-console-param-session": "Munkamenettoken.",
+ "apihelp-scribunto-console-param-question": "A következő parancsfájlként kiértékelendő sor.",
+ "apihelp-scribunto-console-param-clear": "Add meg az aktuális munkamenet-állapot törléséhez.",
+ "nstab-module": "Modul",
+ "tooltip-ca-nstab-module": "Modullap megtekintése"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/hy.json b/www/wiki/extensions/Scribunto/i18n/hy.json
new file mode 100644
index 00000000..91eb58f5
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/hy.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Xelgen",
+ "Kareyac"
+ ]
+ },
+ "scribunto-lua-error": "Lua–յի սխալ՝ $2։",
+ "nstab-module": "Մոդուլ",
+ "tooltip-ca-nstab-module": "Դիտել մոդուլի էջը"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/hyw.json b/www/wiki/extensions/Scribunto/i18n/hyw.json
new file mode 100644
index 00000000..42697ced
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/hyw.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "ArmenBakkalian"
+ ]
+ },
+ "scribunto-lua-error": "Lua–ի սխալ՝ $2։"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ia.json b/www/wiki/extensions/Scribunto/i18n/ia.json
new file mode 100644
index 00000000..df72418a
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ia.json
@@ -0,0 +1,66 @@
+{
+ "@metadata": {
+ "authors": [
+ "McDutchie"
+ ]
+ },
+ "scribunto-desc": "Structura pro incorporar linguages de script in paginas de MediaWiki",
+ "scribunto-line": "al linea $1",
+ "scribunto-module-line": "in $1 al linea $2",
+ "scribunto-parser-dialog-title": "Error de script",
+ "scribunto-error-short": "Error de script: $1",
+ "scribunto-error-long": "Errores de script:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''Le documentation pro iste modulo pote esser create in [[$1]]''",
+ "scribunto-doc-page-header": "'''Iste es le pagina de documentation pro [[$1]]'''",
+ "scribunto-console-intro": "* Le exportationes del modulo es disponibile como le variabile \"p\", incluse le modificationes non salveguardate.\n* Initia un linea con \"=\" pro evalutar lo como expression, o usa print().\n* Usa mw.log() in le codice del modulo pro inviar messages a iste consola.",
+ "scribunto-console-title": "Consola de debug",
+ "scribunto-console-too-large": "Iste session de consola es troppo grande. Per favor rade le historia del consola o reduce le dimension del modulo.",
+ "scribunto-console-current-src": "entrata del consola",
+ "scribunto-console-clear": "Rader",
+ "scribunto-console-cleared": "Le stato del consola ha essite radite perque le modulo ha essite actualisate.",
+ "scribunto-console-cleared-session-lost": "Le stato del consola ha essite radite perque le datos del session ha essite perdite.",
+ "scribunto-common-error-category": "Paginas con errores de script",
+ "scribunto-common-error-category-desc": "Un error se produceva durante le processamento del modulos includite in le pagina.",
+ "scribunto-common-nosuchmodule": "Error de script: modulo \"$2\" non trovate.",
+ "scribunto-common-nofunction": "Error de script: tu debe specificar un function a appellar.",
+ "scribunto-common-nosuchfunction": "Error de script: le function \"$2\" non existe.",
+ "scribunto-common-notafunction": "Error de script: \"$2\" non es un function.",
+ "scribunto-common-timeout": "Le tempore allocate pro le execution de scripts ha expirate.",
+ "scribunto-common-oom": "Le quantitate de memoria permittite pro le execution de scripts ha essite excedite.",
+ "scribunto-common-backtrace": "Tracia a retro:",
+ "scribunto-common-no-details": "Il non ha altere detalios disponibile.",
+ "scribunto-lua-in-function": "in function \"$1\"",
+ "scribunto-lua-in-main": "in le parte principal",
+ "scribunto-lua-in-function-at": "in le function a $1:$2",
+ "scribunto-lua-error-location": "Error de Lua $1: $2",
+ "scribunto-lua-error": "Error de Lua: $2",
+ "scribunto-lua-notarrayreturn": "Error de script: Le modulo retornava un valor $2, ma debeva retornar un tabella de exportation.",
+ "scribunto-luastandalone-proc-error": "Error de Lua: non pote crear processo",
+ "scribunto-luastandalone-proc-error-msg": "Error de Lua: non pote crear processo: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Error de Lua: Impossibile crear processo: proc_open non es disponibile. Verifica le directiva de configuration \"disable_functions\" de PHP.",
+ "scribunto-luastandalone-decode-error": "Error de Lua: error interne: impossibile decodificar le message",
+ "scribunto-luastandalone-write-error": "Error de Lua: error interne: error de scriptura al tubo",
+ "scribunto-luastandalone-read-error": "Error de Lua: error interne: error de lectura del tubo",
+ "scribunto-luastandalone-gone": "Error de Lua: error interne: le interpretator ha jam exite",
+ "scribunto-luastandalone-signal": "Error de Lua: error interne: le interpretator ha terminate con le signal \"$2\"",
+ "scribunto-luastandalone-exited": "Error de Lua: error interne: le interpretator exiva con le stato $2",
+ "scribunto-module-with-errors-category": "Modulos Scribunto con errores",
+ "scribunto-module-with-errors-category-desc": "Le modulo contine un error.",
+ "scribunto-limitreport-timeusage": "Tempore de uso de Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 secundas",
+ "scribunto-limitreport-virtmemusage": "Dimension virtual de Lua",
+ "scribunto-limitreport-estmemusage": "Uso de memoria estimate de Lua",
+ "scribunto-limitreport-memusage": "Uso de memoria de Lua",
+ "scribunto-limitreport-profile": "Profilo Lua",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Registros Lua",
+ "apihelp-scribunto-console-description": "Modulo interne pro responder a requestas XHR ab le consola Scribunto.",
+ "apihelp-scribunto-console-param-title": "Le titulo del modulo a testar.",
+ "apihelp-scribunto-console-param-content": "Le nove contento del modulo.",
+ "apihelp-scribunto-console-param-session": "Indicio de session.",
+ "apihelp-scribunto-console-param-question": "Le proxime linea a evalutar como script.",
+ "apihelp-scribunto-console-param-clear": "Marcar pro rader le stato actual del session.",
+ "nstab-module": "Modulo",
+ "tooltip-ca-nstab-module": "Vider le pagina del modulo"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/id.json b/www/wiki/extensions/Scribunto/i18n/id.json
new file mode 100644
index 00000000..b7d28d49
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/id.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "Iwan Novirion",
+ "Ahdan"
+ ]
+ },
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''Dokumentasi untuk modul ini dapat dibuat di [[$1]]''",
+ "scribunto-doc-page-header": "'''Ini adalah halaman dokumentasi untuk [[$1]]'''",
+ "scribunto-console-clear": "Kosongkan",
+ "scribunto-console-cleared": "Pernyataan konsol dibersihkan karena modul telah diperbarui.",
+ "scribunto-console-cleared-session-lost": "Pernyataan konsol dibersihkan karena data sesi hilang.",
+ "scribunto-common-error-category": "Halaman dengan galat skrip",
+ "scribunto-common-nosuchmodule": "Galat skrip: tidak ada modul tersebut.",
+ "scribunto-common-no-details": "Rincian lebih lanjut tidak tersedia",
+ "scribunto-lua-backtrace-line": "$1: $2",
+ "scribunto-lua-error": "Galat Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ie.json b/www/wiki/extensions/Scribunto/i18n/ie.json
new file mode 100644
index 00000000..0ccb006d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ie.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Stavanger7"
+ ]
+ },
+ "scribunto-lua-error": "Errore de Lua: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ilo.json b/www/wiki/extensions/Scribunto/i18n/ilo.json
new file mode 100644
index 00000000..15a8e2db
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ilo.json
@@ -0,0 +1,66 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lam-ang"
+ ]
+ },
+ "scribunto-desc": "Obra a batayan para iti panagikabil ti pagsasao a panagisurat kadagiti panid ti MediaWiki",
+ "scribunto-line": "iti linia $1",
+ "scribunto-module-line": "iti $1 iti linia $2",
+ "scribunto-parser-dialog-title": "Biddut nga eskritu",
+ "scribunto-error-short": "Biddut nga eskritu: $1",
+ "scribunto-error-long": "Dagiti biddut nga eskritu:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/dok",
+ "scribunto-doc-page-does-not-exist": "''Ti dokumentasion para iti daytoy a modulo ket mabalin a mapartuat idiay [[$1]]''",
+ "scribunto-doc-page-header": "'''Daytoy ket dokumentasion a panid para iti [[$1]]'''",
+ "scribunto-console-intro": "* Dagiti modulo nga eksport ket magun-od a kas ti nadumaduma a \"p\", a mairaman dagiti saan a naidulin a panagbalbaliw.\n* Pasarunuan ti maysa a linia iti \"=\" tapno mapategan daytoy a kas maysa a panangisao, wenno agusar ti prenta().\n* Usaren ti mw.log() iti kodigo ti modulo tapno makaipatulod kadagiti mensahe iti daytoy a konsola.",
+ "scribunto-console-title": "Konsola a pagpasayaatan",
+ "scribunto-console-too-large": "Dakkel unay daytoy a sesion ti konsola. Pangngaasi a dalusam ti pakasaritaan ti konsola wenno pabassiten ti kadakkel ti modulo.",
+ "scribunto-console-current-src": "naipastrek ti konsola",
+ "scribunto-console-clear": "Dalusan",
+ "scribunto-console-cleared": "Ti kasasaad ti konsola ket nadalusan idi gapu ta ti modulo ket napabaro idi.",
+ "scribunto-console-cleared-session-lost": "Ti kasasaad ti konsola ket nadalusan idi gapu ta ti sesion ti datos ket napukaw idi.",
+ "scribunto-common-error-category": "Pampanid nga adda dagiti biddut ti eskritu",
+ "scribunto-common-error-category-desc": "Adda biddut idi nagproseso kadagiti modulo a nairaman iti panid.",
+ "scribunto-common-nosuchmodule": "Biddut nga eskritu: Awan ti kasta a modulo ti \"$2\".",
+ "scribunto-common-nofunction": "Biddut nga eskritu: Nasken a naganam ti maawagan a pamay-an.",
+ "scribunto-common-nosuchfunction": "Biddut nga eskritu: Ti annong ti \"$2\" ket awan.",
+ "scribunto-common-notafunction": "Biddut nga eskritu: Ti \"$2\" ket saan nga annong.",
+ "scribunto-common-timeout": "Ti oras a maipalubos para iti panagpataray kadagiti eskritu ket nagpason.",
+ "scribunto-common-oom": "Ti kaadu ti memoria a mapalubosan para iti panagpataray kadagiti eskritu ket nalabsanen.",
+ "scribunto-common-backtrace": "Sublian:",
+ "scribunto-common-no-details": "Awanen dagiti adu a magun-od a salasay.",
+ "scribunto-lua-in-function": "iti pamay-an \"$1\"",
+ "scribunto-lua-in-main": "iti kangrunaan a pisi",
+ "scribunto-lua-in-function-at": "iti pamay-an idiay $1:$2",
+ "scribunto-lua-error-location": "Biddut ti Lua $1: $2.",
+ "scribunto-lua-error": "Biddut ti Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Biddut nga eskritu: Ti modulo ket nangisubli ti pateg ti $2. Daytoy ket nasken koma nga agisubli ti eksport a tabla.",
+ "scribunto-luastandalone-proc-error": "Biddut ti Lua: Saan a mapartuat ti pamuspusan.",
+ "scribunto-luastandalone-proc-error-msg": "Biddut ti Lua: Saan a makaaramid ti proseso: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Biddut ti Lua: Saan a makaaramid ti proseso: ti proc_open ket saan a magun-od. Kitaen ti \"disable_functions\" ti PHP a pannakaaramid ti direktibo.",
+ "scribunto-luastandalone-decode-error": "Biddut ti Lua: Akin-uneg a biddut: Saan a nakudiguan ti mensahe.",
+ "scribunto-luastandalone-write-error": "Biddut ti Lua: Akin-uneg a biddut: Biddut ti panagsurat iti pipa.",
+ "scribunto-luastandalone-read-error": "Biddut ti Lua: Akin-uneg a biddut: Biddut a panagbasa manipud iti pipa.",
+ "scribunto-luastandalone-gone": "Biddut ti Lua: Akin-uneg a biddut: Ti agipatpatarus ket nakaruaren.",
+ "scribunto-luastandalone-signal": "Biddut ti Lua: Akin-uneg a biddut: Ti agipatpatarus ket pinasardengna ti senial ti \"$2\".",
+ "scribunto-luastandalone-exited": "Biddut ti Lua: Akin-uneg a biddut: Ti agipatpatarus ket rimmuar nga adda ti kasasaad iti $2.",
+ "scribunto-module-with-errors-category": "Dagiti modulo ti Scribunto nga addaan kadagiti biddut",
+ "scribunto-module-with-errors-category-desc": "Ti modulo ket adda biddutna.",
+ "scribunto-limitreport-timeusage": "Oras a panagusar ti Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 segsegundo",
+ "scribunto-limitreport-virtmemusage": "Birtual a kadakkel ti Lua",
+ "scribunto-limitreport-estmemusage": "Nakarkulo a panagusar ti memoria ti Lua",
+ "scribunto-limitreport-memusage": "Panagusar ti memoria ti Lua",
+ "scribunto-limitreport-profile": "Bariweswes ti Lua",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Dagiti listaan ti Lua",
+ "apihelp-scribunto-console-description": "Internal a modulo para iti panaserbisio dagiti kiddaw ti XHR manipud iti konsola ti Scribunto.",
+ "apihelp-scribunto-console-param-title": "Ti titulo ti modulo a masubokan.",
+ "apihelp-scribunto-console-param-content": "Ti baro a linaon ti modulo.",
+ "apihelp-scribunto-console-param-session": "Tandaan ti sesion.",
+ "apihelp-scribunto-console-param-question": "Ti sumaruno a linia a pategan a kas eskritu.",
+ "apihelp-scribunto-console-param-clear": "Isaad a dalusan ti kasasaad ti agdama a sesion.",
+ "nstab-module": "Modulo",
+ "tooltip-ca-nstab-module": "Kitaen ti panid ti modulo"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/inh.json b/www/wiki/extensions/Scribunto/i18n/inh.json
new file mode 100644
index 00000000..11ffe841
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/inh.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Adam-Yourist"
+ ]
+ },
+ "scribunto-lua-error": "ГIалат Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/io.json b/www/wiki/extensions/Scribunto/i18n/io.json
new file mode 100644
index 00000000..23c58c96
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/io.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Algentem",
+ "Joao Xavier"
+ ]
+ },
+ "scribunto-doc-page-does-not-exist": "''Dokumentizo por ica modulo povas kreesar ye [[$1]]''",
+ "scribunto-common-error-category": "Pagini kun erori pri script",
+ "scribunto-common-nosuchmodule": "Eroro pri script: Ica modulo ne existas \"$2\".",
+ "scribunto-lua-error": "Lua eroro: $2",
+ "scribunto-luastandalone-proc-error-msg": "Eroro 'Lua': Ne povas kreesar procedo: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/is.json b/www/wiki/extensions/Scribunto/i18n/is.json
new file mode 100644
index 00000000..aec044f1
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/is.json
@@ -0,0 +1,55 @@
+{
+ "@metadata": {
+ "authors": [
+ "Snævar",
+ "Sveinn í Felli"
+ ]
+ },
+ "scribunto-line": "í línu $1",
+ "scribunto-module-line": "í $1, línu $2",
+ "scribunto-parser-dialog-title": "Villa í skriftu",
+ "scribunto-error-short": "Villa í skriftu: $1",
+ "scribunto-error-long": "Villur í skriftu: \n\n$1",
+ "scribunto-doc-page-does-not-exist": "''Hægt er að búa til leiðbeiningar fyrir þessa skriftu á [[$1]]''",
+ "scribunto-doc-page-header": "'''Þetta er leiðbeiningar síða fyrir [[$1]]'''",
+ "scribunto-console-intro": "* Útkomur skriftunar eru aðgengilegar sem gildið „p”, þar á meðal óvistaðar breytingar.\n* Byrjaðu línu með „=” til að ákvarða gildi sem segð, eða notaðu \"print()\". Notaðu mw.logObject() fyrir töflur.\n* Notaðu \"mw.log()\" í kóða skriftunnar til að senda skilaboð til stjórnborðsins hér.",
+ "scribunto-console-title": "Aflúsunar stjórnborð",
+ "scribunto-console-too-large": "Þessi seta stjórnborðsins er of stór. Vinsamlegast hreinsaðu setu stjórnborðsins eða minnkaðu stærð skriftunnar.",
+ "scribunto-console-current-src": "Inntak stjórnborðs",
+ "scribunto-console-clear": "Hreinsa",
+ "scribunto-console-cleared": "Staða stjórnborðsins var hreinsuð því skriftan var uppfærð.",
+ "scribunto-console-cleared-session-lost": "Staða stjórnborðsins var hreinsuð því setu gögn töpuðust.",
+ "scribunto-common-error-category": "Síður með villum í skriftum",
+ "scribunto-common-error-category-desc": "Villa átti sér stað við vinnslu skriftanna á þessari síðu.",
+ "scribunto-common-nosuchmodule": "Villa í skriftu: Skriftan „$2” er ekki til.",
+ "scribunto-common-nofunction": "Villa í skriftu: Þú þarft að kalla á aðgerð.",
+ "scribunto-common-nosuchfunction": "Villa í skriftu: Aðgerðin „$2” er ekki til.",
+ "scribunto-common-notafunction": "Villa í skriftu: „$2“ er ekki aðgerð.",
+ "scribunto-common-timeout": "Sá tími sem er tileinkaður keyrslu skriftna hefur runnið út.",
+ "scribunto-common-oom": "Það magn minnis sem er leyft fyrir keyrslu skrifta er þegar uppurið.",
+ "scribunto-common-backtrace": "Afturekja:",
+ "scribunto-common-no-details": "Engar frekari upplýsingar eru til.",
+ "scribunto-lua-in-function": "í aðgerðinni „$1\"",
+ "scribunto-lua-in-main": "í aðal hlutanum",
+ "scribunto-lua-in-function-at": "í aðgerðinni $1:$2",
+ "scribunto-lua-error-location": "Lua villa $1: $2.",
+ "scribunto-lua-error": "Lua villa: $2",
+ "scribunto-lua-notarrayreturn": "Villa í skriftu: Skriftan skilaði $2 gildi. Hún á að skila útflutnings töflu.",
+ "scribunto-luastandalone-proc-error": "Lua villa: Mistókst að búa til ferli.",
+ "scribunto-luastandalone-proc-error-msg": "Lua villa: Get ekki búið til ferli: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Lua villa: Get ekki búið til ferli: proc_open er ekki aðgengileg. Athugaðu \"disable_functions\" stillinguna í PHP.",
+ "scribunto-luastandalone-decode-error": "Lua villa: Innri villa: Ófær um að afkóta skilaboð.",
+ "scribunto-luastandalone-write-error": "Lua villa: Innri villa: Mistókst að skrifa til pípu (biðminnis).",
+ "scribunto-luastandalone-read-error": "Lua villa: Innri villa: Villa við að lesa frá pípu (biðminni).",
+ "scribunto-luastandalone-gone": "Lua villa: Innri villa: Túlkurinn hefur þegar lokið vinnslu.",
+ "scribunto-luastandalone-signal": "Lua villa: Innri villa: Túlkurinn hefur slökkt á sér með merkinu \"$2\".",
+ "scribunto-luastandalone-exited": "Lua villa: Innri villa: Túlkurinn hefur slökkt á sér með stöðunni $2.",
+ "scribunto-module-with-errors-category": "Scribunto skriftur með villum",
+ "scribunto-module-with-errors-category-desc": "Skriftan hefur villu í sér.",
+ "scribunto-limitreport-timeusage": "Lua tímanotkun",
+ "scribunto-limitreport-timeusage-value": "$1/$2 sekóndur",
+ "scribunto-limitreport-estmemusage": "Áætluð minnisnotkun Lua",
+ "scribunto-limitreport-memusage": "Minnisnotkun Lua",
+ "scribunto-limitreport-profile-ms": "$1 msek",
+ "nstab-module": "Eining"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/it.json b/www/wiki/extensions/Scribunto/i18n/it.json
new file mode 100644
index 00000000..4405eb55
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/it.json
@@ -0,0 +1,68 @@
+{
+ "@metadata": {
+ "authors": [
+ "Beta16",
+ "Codicorumus",
+ "F. Cosoleto",
+ "Raoli",
+ "Ontsed",
+ "Giuseppe Forte",
+ "Bultro",
+ "Lucas2"
+ ]
+ },
+ "scribunto-desc": "Framework per incorporare linguaggi di scripting in pagine MediaWiki",
+ "scribunto-line": "alla linea $1",
+ "scribunto-module-line": "in $1 alla linea $2",
+ "scribunto-parser-dialog-title": "Errore script",
+ "scribunto-error-short": "Errore script: $1",
+ "scribunto-error-long": "Errori script:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/man",
+ "scribunto-doc-page-does-not-exist": "''La documentazione per questo modulo può essere creata in [[$1]]''",
+ "scribunto-doc-page-header": "'''Questa è la pagina di documentazione per [[$1]]'''",
+ "scribunto-console-intro": "* Le esportazioni del modulo sono rappresentate dalla variabile \"p\", incluse le modifiche non salvate.\n* Per valutare una linea come espressione, iniziala con \"=\" oppure usa print(). Utilizza mw.logObject() per le tabelle.\n* Usa mw.log() e mw.logObject() nel codice del modulo per inviare messaggi a questa console.",
+ "scribunto-console-title": "Console di debug",
+ "scribunto-console-too-large": "Questa sessione della console è troppo grande, cancellare la cronologia della console o ridurre le dimensioni del modulo.",
+ "scribunto-console-current-src": "input della console",
+ "scribunto-console-clear": "Pulisci",
+ "scribunto-console-cleared": "Lo stato della console è stato azzerato perché il modulo è stato aggiornato.",
+ "scribunto-console-cleared-session-lost": "Lo stato della console è stato azzerato perché i dati della sessione sono andati persi.",
+ "scribunto-common-error-category": "Pagine con errori di script",
+ "scribunto-common-error-category-desc": "Si è verificato un errore durante l'elaborazione dei moduli inclusi nella pagina.",
+ "scribunto-common-nosuchmodule": "Errore script: nessun modulo \"$2\".",
+ "scribunto-common-nofunction": "Errore script: devi specificare una funzione da chiamare.",
+ "scribunto-common-nosuchfunction": "Errore script: la funzione \"$2\" non esiste.",
+ "scribunto-common-notafunction": "Errore script: \"$2\" non è una funzione.",
+ "scribunto-common-timeout": "Il tempo assegnato per l'esecuzione dello script è scaduto.",
+ "scribunto-common-oom": "La quantità di memoria consentita per l'esecuzione dello script è stata superata.",
+ "scribunto-common-backtrace": "Backtrace:",
+ "scribunto-common-no-details": "Ulteriori dettagli non sono disponibili.",
+ "scribunto-lua-in-function": "nella funzione \"$1\"",
+ "scribunto-lua-in-main": "nel blocco principale",
+ "scribunto-lua-in-function-at": "nella funzione a $1:$2",
+ "scribunto-lua-error-location": "Errore Lua $1: $2.",
+ "scribunto-lua-error": "Errore Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Errore script: il modulo ha restituito un valore $2. Avrebbe dovuto restituire una tabella in esportazione.",
+ "scribunto-luastandalone-proc-error": "Errore Lua: impossibile creare il processo.",
+ "scribunto-luastandalone-proc-error-msg": "Errore Lua: impossibile creare il processo: $2.",
+ "scribunto-luastandalone-proc-error-proc-open": "Errore Lua: impossibile creare il processo: proc_open non è disponibile. Controlla la configurazione della direttiva PHP \"disable_functions\".",
+ "scribunto-luastandalone-decode-error": "Errore Lua: errore interno - impossibile decodificare il messaggio.",
+ "scribunto-luastandalone-write-error": "Errore Lua: errore interno - errore durante la scrittura nel canale di comunicazione",
+ "scribunto-luastandalone-read-error": "Errore Lua: errore interno - errore durante la lettura nel canale di comunicazione",
+ "scribunto-luastandalone-gone": "Errore Lua: errore interno - l'interprete è già stato terminato.",
+ "scribunto-luastandalone-signal": "Errore Lua: errore interno - l'interprete è terminato con il segnale \"$2\".",
+ "scribunto-luastandalone-exited": "Errore Lua: errore interno - l'interprete è uscito con stato $2.",
+ "scribunto-module-with-errors-category": "Moduli Scribunto con errori",
+ "scribunto-module-with-errors-category-desc": "Il modulo contiene un errore.",
+ "scribunto-limitreport-timeusage": "Tempo di utilizzo Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 secondi",
+ "scribunto-limitreport-virtmemusage": "Dimensione virtuale Lua",
+ "scribunto-limitreport-estmemusage": "Stima dell'utilizzo della memoria Lua",
+ "scribunto-limitreport-memusage": "Utilizzo della memoria Lua",
+ "scribunto-limitreport-profile": "Profilo Lua",
+ "scribunto-limitreport-profile-ms": "$1&nbsp;ms",
+ "scribunto-limitreport-logs": "Registri Lua",
+ "apihelp-scribunto-console-param-title": "Titolo del modulo su cui effettuare test.",
+ "nstab-module": "Modulo",
+ "tooltip-ca-nstab-module": "Vedi la pagina del modulo"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ja.json b/www/wiki/extensions/Scribunto/i18n/ja.json
new file mode 100644
index 00000000..49fb421f
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ja.json
@@ -0,0 +1,68 @@
+{
+ "@metadata": {
+ "authors": [
+ "Shirayuki",
+ "Whym",
+ "Fryed-peach",
+ "Frozen-mikan",
+ "Otokoume",
+ "Yusuke1109"
+ ]
+ },
+ "scribunto-desc": "MediaWiki ページにスクリプト言語を埋め込むフレームワーク",
+ "scribunto-line": "$1 行目",
+ "scribunto-module-line": "$1 内、$2 行目",
+ "scribunto-parser-dialog-title": "スクリプトエラー",
+ "scribunto-error-short": "スクリプトエラー: $1",
+ "scribunto-error-long": "スクリプトエラー:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''このモジュールについての説明文ページを [[$1]] に作成できます''",
+ "scribunto-doc-page-header": "'''このページは、[[$1]]の説明文を記述するページです。'''",
+ "scribunto-console-intro": "* モジュールのエクスポートは、保存していない変更も含めて、「p」という変数として利用できます。\n* 式として評価するには、行頭に「=」をつけるか print() を使ってください。テーブルには mw.logObject() を使用します。\n* モジュールのコードからこのコンソールにメッセージを送信するには mw.log() および mw.logObject() を使ってください。",
+ "scribunto-console-title": "デバッグコンソール",
+ "scribunto-console-too-large": "このコンソールセッションは大きすぎます。コンソール履歴を消去するか、モジュールのサイズを減らしてください。",
+ "scribunto-console-current-src": "コンソール入力",
+ "scribunto-console-clear": "消去",
+ "scribunto-console-cleared": "モジュールが更新されたため、コンソールの状態を消去しました。",
+ "scribunto-console-cleared-session-lost": "セッションデータが失われたため、コンソールの状態を消去しました。",
+ "scribunto-common-error-category": "スクリプトエラーがあるページ",
+ "scribunto-common-error-category-desc": "このページに含まれているモジュールを処理している際にエラーが発生しました。",
+ "scribunto-common-nosuchmodule": "スクリプトエラー: モジュール「$2」はありません。",
+ "scribunto-common-nofunction": "スクリプトエラー: 呼び出す関数を指定してください。",
+ "scribunto-common-nosuchfunction": "スクリプトエラー: 関数「$2」は存在しません。",
+ "scribunto-common-notafunction": "スクリプトエラー: 「$2」は関数ではありません。",
+ "scribunto-common-timeout": "スクリプトに割り当てた時間が終了しました。",
+ "scribunto-common-oom": "スクリプトの実行で使用を許可されているメモリ量を超過しました。",
+ "scribunto-common-backtrace": "バックトレース:",
+ "scribunto-common-no-details": "詳細情報はありません。",
+ "scribunto-lua-in-function": "関数「$1」内",
+ "scribunto-lua-in-main": "メインチャンク内",
+ "scribunto-lua-in-function-at": "関数内、$1:$2",
+ "scribunto-lua-error-location": "Lua エラー $1: $2",
+ "scribunto-lua-error": "Lua エラー: $2",
+ "scribunto-lua-notarrayreturn": "スクリプトエラー: モジュールが値 $2 を返しました。書き出しテーブルを返すことになっています。",
+ "scribunto-luastandalone-proc-error": "Lua エラー: プロセスを作成できません。",
+ "scribunto-luastandalone-proc-error-msg": "Lua エラー: プロセスを作成できません: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Lua エラー: プロセスを作成できません: proc_open を利用できません。PHP の「disable_function」ディレクティブを確認してください。",
+ "scribunto-luastandalone-decode-error": "Lua エラー: 内部エラー: メッセージを復号できません。",
+ "scribunto-luastandalone-write-error": "Lua エラー: 内部エラー: パイプへの書き込みエラーです。",
+ "scribunto-luastandalone-read-error": "Lua エラー: 内部エラー: パイプからの読み取りエラーです。",
+ "scribunto-luastandalone-gone": "Lua エラー: 内部エラー: インタープリターは既に終了しています。",
+ "scribunto-luastandalone-signal": "Lua エラー: 内部エラー: インタープリターはシグナル「$2」により終了しました。",
+ "scribunto-luastandalone-exited": "Lua エラー: 内部エラー: インタープリターは終了コード $2 で終了しました。",
+ "scribunto-module-with-errors-category": "エラーがあるScribuntoモジュール",
+ "scribunto-module-with-errors-category-desc": "このモジュールにはエラーがあります。",
+ "scribunto-limitreport-timeusage": "Lua 実行時間",
+ "scribunto-limitreport-timeusage-value": "$1/$2 秒",
+ "scribunto-limitreport-virtmemusage": "Lua 仮想サイズ",
+ "scribunto-limitreport-virtmemusage-value": "$1/$2",
+ "scribunto-limitreport-estmemusage": "Lua 推定メモリ使用量",
+ "scribunto-limitreport-memusage": "Lua のメモリ使用量",
+ "scribunto-limitreport-memusage-value": "$1/$2",
+ "scribunto-limitreport-profile": "Lua プロファイル",
+ "scribunto-limitreport-profile-ms": "$1 ミリ秒",
+ "scribunto-limitreport-profile-percent": "$1%",
+ "scribunto-limitreport-logs": "Lua のログ",
+ "nstab-module": "モジュール",
+ "tooltip-ca-nstab-module": "モジュールページを表示"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/jam.json b/www/wiki/extensions/Scribunto/i18n/jam.json
new file mode 100644
index 00000000..fb56abf7
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/jam.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Katxis"
+ ]
+ },
+ "scribunto-lua-error": "Lua era: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/jut.json b/www/wiki/extensions/Scribunto/i18n/jut.json
new file mode 100644
index 00000000..e4c5217c
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/jut.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jyllanj"
+ ]
+ },
+ "scribunto-lua-error": "Lua-fejl: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/jv.json b/www/wiki/extensions/Scribunto/i18n/jv.json
new file mode 100644
index 00000000..11cf3d3c
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/jv.json
@@ -0,0 +1,35 @@
+{
+ "@metadata": {
+ "authors": [
+ "NoiX180",
+ "Pras"
+ ]
+ },
+ "scribunto-desc": "Rangka kerja kanggo nyisipaké basa skrip nèng kaca MediaWiki",
+ "scribunto-line": "ing larik $1",
+ "scribunto-module-line": "ing $1 larik $2",
+ "scribunto-parser-dialog-title": "Masalah skrip",
+ "scribunto-error-short": "Masalah skrip: $1",
+ "scribunto-error-long": "Masalah skrip:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''Dhokumèntasi modhul iki bisa digawé ing [[$1]]''",
+ "scribunto-doc-page-header": "'''Iki kaca dhokumèntasiné [[$1]]'''",
+ "scribunto-console-title": "Debug konsol",
+ "scribunto-console-clear": "Resiki",
+ "scribunto-common-error-category": "Kaca mawa masalah skrip",
+ "scribunto-common-nosuchmodule": "Masalah skrip: Modhul \"$2\" ora ana.",
+ "scribunto-common-nofunction": "Masalah skrip: Panjenengan kudu ngisi fungsi sing arep dianggo.",
+ "scribunto-common-nosuchfunction": "Masalah skrip: Fungsi \"$2\" ora ana.",
+ "scribunto-common-notafunction": "Masalah skrip: \"$2\" dudu fungsi.",
+ "scribunto-lua-error-location": "Masalah Lua $1: $2.",
+ "scribunto-lua-error": "Masalah Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Masalah skrip: Modhulé mbalèkaké aji $2. Kuduné tabèl èspor banjur pulih.",
+ "scribunto-module-with-errors-category-desc": "Modhulé ngemu masalah ing njeroné.",
+ "scribunto-limitreport-timeusage": "Panggunané wektu Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 sekon",
+ "apihelp-scribunto-console-param-title": "Sesirah modhul sing arep diuji.",
+ "apihelp-scribunto-console-param-content": "Kontèn anyaré modhul.",
+ "apihelp-scribunto-console-param-session": "Token sèsi.",
+ "nstab-module": "Modhul",
+ "tooltip-ca-nstab-module": "Deleng kaca modhul"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ka.json b/www/wiki/extensions/Scribunto/i18n/ka.json
new file mode 100644
index 00000000..299655f1
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ka.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "David1010",
+ "SHOTHA",
+ "BRUTE"
+ ]
+ },
+ "scribunto-parser-dialog-title": "სკრიპტის შეცდომა",
+ "scribunto-error-short": "სკრიპტის შეცდომა: $1",
+ "scribunto-error-long": "სკრიპტის შეცდომები:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/ინფო",
+ "scribunto-doc-page-does-not-exist": "''შეგიძლიათ შექმნათ დოკუმენტაცია ამ მოდულისათვის: [[$1]]''",
+ "scribunto-doc-page-header": "''ეს არის „[[$1]]“-ის დოკუმენტაციის გვერდი''",
+ "scribunto-console-clear": "გასუფთავება",
+ "scribunto-lua-error-location": "Lua-ს შეცდომა $1: $2.",
+ "scribunto-lua-error": "შეცდომა Lua: $2",
+ "scribunto-limitreport-timeusage-value": "$1/$2 წამი",
+ "scribunto-limitreport-virtmemusage": "Lua-ს ვირტუალური ზომა",
+ "scribunto-limitreport-memusage": "Lua-ს მეხსიერების გამოყენება",
+ "scribunto-limitreport-profile": "Lua-ს პროფილი",
+ "scribunto-limitreport-profile-ms": "$1 მლ/წმ",
+ "scribunto-limitreport-logs": "Lua-ს ჟურნალი"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/kab.json b/www/wiki/extensions/Scribunto/i18n/kab.json
new file mode 100644
index 00000000..11c91329
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/kab.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Belkacem77"
+ ]
+ },
+ "scribunto-lua-error": "Tuccḍa Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/kbp.json b/www/wiki/extensions/Scribunto/i18n/kbp.json
new file mode 100644
index 00000000..37ed0515
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/kbp.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gnangbade"
+ ]
+ },
+ "scribunto-lua-error": "Yiɣduu Lua : $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/kea.json b/www/wiki/extensions/Scribunto/i18n/kea.json
new file mode 100644
index 00000000..16d04b23
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/kea.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Quintino Lopes Castro Tavares"
+ ]
+ },
+ "scribunto-lua-error": "Eru na Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/khw.json b/www/wiki/extensions/Scribunto/i18n/khw.json
new file mode 100644
index 00000000..9f89795b
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/khw.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Rachitrali"
+ ]
+ },
+ "scribunto-lua-error": "لوا خطا: $2۔"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/kk-cyrl.json b/www/wiki/extensions/Scribunto/i18n/kk-cyrl.json
new file mode 100644
index 00000000..12a496ac
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/kk-cyrl.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amankel'dy"
+ ]
+ },
+ "scribunto-desc": "MediaWiki беттеріндегі скрипттік тілдерді қосу құрылғысы",
+ "scribunto-line": "$1 жолында",
+ "scribunto-module-line": "$1 ішіндегі $2 жолында",
+ "scribunto-parser-dialog-title": "Скрипт қатесі",
+ "scribunto-error-short": "Скрипт қатесі: $1",
+ "scribunto-error-long": "Скрипт қатесі:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''Бұл модульдің құжаттамасын [[$1]] бетінде бастай аласыз''",
+ "scribunto-doc-page-header": "'''Бұл [[$1]] модуліне арналған құжаттама беті'''",
+ "scribunto-console-intro": "* Осы модулдің экспорттайтыны «p» айнымалысы ретінде, сақталмаған өзгерістермен бірге қолжетімді.\n* Жолды өрнек ретінде есептеу үшін алдын ала «=» деп белгілеңіз немесе print() қолданыңыз.\n* Модульде хабарлама шығару үшін mw.log() қолданыңыз.",
+ "scribunto-console-title": "Ретке келтіру консолы",
+ "scribunto-console-too-large": "Консолдың бұл сеансы өте үлкен. Өтініш, не консолдың тарихын тазалаңыз, не болмаса модульдің өлшемін кішірейтіңіз.",
+ "scribunto-console-current-src": "консолды енгізу",
+ "scribunto-console-clear": "Тазалау"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/kn.json b/www/wiki/extensions/Scribunto/i18n/kn.json
new file mode 100644
index 00000000..9b59145b
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/kn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Omshivaprakash"
+ ]
+ },
+ "scribunto-lua-error": "ಲುಅ ದೋಷ: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ko.json b/www/wiki/extensions/Scribunto/i18n/ko.json
new file mode 100644
index 00000000..ef4be90c
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ko.json
@@ -0,0 +1,66 @@
+{
+ "@metadata": {
+ "authors": [
+ "Klutzy",
+ "Kwj2772",
+ "Priviet",
+ "아라",
+ "SeoJeongHo",
+ "Hwangjy9",
+ "Ykhwong"
+ ]
+ },
+ "scribunto-desc": "미디어위키 문서에 스크립트 언어를 넣기 위한 프레임워크",
+ "scribunto-line": "$1번째 줄에서",
+ "scribunto-module-line": "$1 $2번째 줄에서",
+ "scribunto-parser-dialog-title": "스크립트 오류",
+ "scribunto-error-short": "스크립트 오류: $1",
+ "scribunto-error-long": "스크립트 오류:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/설명문서",
+ "scribunto-doc-page-does-not-exist": "''이 모듈에 대한 설명문서는 [[$1]]에서 만들 수 있습니다''",
+ "scribunto-doc-page-header": "'''이 문서는 [[$1]]에 대한 설명문서입니다.'''",
+ "scribunto-console-intro": "* 모듈 내보내기는 저장하지 않은 수정을 포함하여 변수 \"p\"로 사용할 수 있습니다.\n* 표현으로 평가하는 \"=\"이 있는 줄을 앞에 넣거나 print()를 사용하세요.\n* 이 콘솔에 메시지를 보낼 모듈 코드에 mw.log()를 사용하세요.",
+ "scribunto-console-title": "콘솔 디버그",
+ "scribunto-console-too-large": "이 콘솔 세션이 너무 큽니다. 콘솔 역사를 삭제하거나 모듈의 크기를 줄이세요.",
+ "scribunto-console-current-src": "콘솔 입력",
+ "scribunto-console-clear": "지우기",
+ "scribunto-console-cleared": "모듈을 업데이트했기 때문에 콘솔 상태가 지워졌습니다.",
+ "scribunto-console-cleared-session-lost": "세션 데이터를 잃었기 때문에 콘솔 상태가 지워졌습니다.",
+ "scribunto-common-error-category": "스크립트 오류가 있는 문서",
+ "scribunto-common-nosuchmodule": "스크립트 오류: \"$2\" 모듈이 없습니다.",
+ "scribunto-common-nofunction": "스크립트 오류: 호출할 함수를 지정해야 합니다.",
+ "scribunto-common-nosuchfunction": "스크립트 오류: 함수 \"$2\"가 존재하지 않습니다.",
+ "scribunto-common-notafunction": "스크립트 오류: \"$2\"는 함수가 아닙니다.",
+ "scribunto-common-timeout": "스크립트를 실행하는 데 할당한 시간이 만료되었습니다.",
+ "scribunto-common-oom": "스크립트를 실행하는 데 허용하는 메모리 크기를 초과했습니다.",
+ "scribunto-common-backtrace": "역추적:",
+ "scribunto-lua-in-function": "\"$1\" 함수에서",
+ "scribunto-lua-in-main": "메인 청크에서",
+ "scribunto-lua-in-function-at": "함수 $1, $2번째 줄에서",
+ "scribunto-lua-error-location": "$1 Lua 오류: $2.",
+ "scribunto-lua-error": "Lua 오류: $2.",
+ "scribunto-lua-notarrayreturn": "스크립트 오류: 모듈이 $2 값을 반환했습니다. 내보내기 테이블을 반환해야 합니다.",
+ "scribunto-luastandalone-proc-error": "Lua 오류: 프로세스를 생성할 수 없습니다.",
+ "scribunto-luastandalone-proc-error-msg": "Lua 오류: 프로세스를 생성할 수 없습니다: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Lua 오류: 프로세스를 생성할 수 없습니다: proc_open은 사용할 수 없습니다. PHP의 \"disable_functions\" 설정을 확인하십시오.",
+ "scribunto-luastandalone-decode-error": "Lua 오류: 내부 오류: 메시지를 디코드할 수 없습니다.",
+ "scribunto-luastandalone-write-error": "Lua 오류: 내부 오류: 파이프에 쓰는 도중 오류가 발생했습니다.",
+ "scribunto-luastandalone-read-error": "Lua 오류: 내부 오류: 파이프에서 읽는 도중 오류가 발생했습니다.",
+ "scribunto-luastandalone-gone": "Lua 오류: 내부 오류: 인터프리터가 이미 종료되었습니다.",
+ "scribunto-luastandalone-signal": "Lua 오류: 내부 오류: 인터프리터가 \"$2\" 신호로 종료했습니다.",
+ "scribunto-luastandalone-exited": "Lua 오류: 내부 오류: 인터프리터가 $2 상태로 종료했습니다.",
+ "scribunto-module-with-errors-category": "오류가 있는 Scribunto 모듈",
+ "scribunto-module-with-errors-category-desc": "모듈 안에 오류가 있습니다.",
+ "scribunto-limitreport-timeusage": "루아 시간 사용",
+ "scribunto-limitreport-timeusage-value": "$1/$2초",
+ "scribunto-limitreport-virtmemusage": "루아 가상 크기",
+ "scribunto-limitreport-estmemusage": "루아 추정 메모리 사용",
+ "scribunto-limitreport-memusage": "루아 메모리 사용",
+ "scribunto-limitreport-profile": "루아 프로필",
+ "scribunto-limitreport-profile-ms": "$1ms",
+ "apihelp-scribunto-console-description": "Scribunto 콘솔에서 XHR 요청을 서비스하기 위한 내부 모듈입니다.",
+ "apihelp-scribunto-console-summary": "Scribunto 콘솔에서 XHR 요청을 서비스하기 위한 내부 모듈입니다.",
+ "apihelp-scribunto-console-param-title": "테스트할 모듈의 제목입니다.",
+ "nstab-module": "모듈",
+ "tooltip-ca-nstab-module": "모듈 문서 보기"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/krc.json b/www/wiki/extensions/Scribunto/i18n/krc.json
new file mode 100644
index 00000000..79972493
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/krc.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Iltever",
+ "Ernác"
+ ]
+ },
+ "scribunto-lua-error": "Lua халат: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/krl.json b/www/wiki/extensions/Scribunto/i18n/krl.json
new file mode 100644
index 00000000..78eca25a
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/krl.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Likopiän tyttö"
+ ]
+ },
+ "scribunto-lua-error": "Lua-hairahuš: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ksh.json b/www/wiki/extensions/Scribunto/i18n/ksh.json
new file mode 100644
index 00000000..804b4d49
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ksh.json
@@ -0,0 +1,57 @@
+{
+ "@metadata": {
+ "authors": [
+ "Purodha"
+ ]
+ },
+ "scribunto-desc": "Ene Rahme för Schprohche för Skrepte en et MehdijaWikki un sing Sigge enzebenge.",
+ "scribunto-line": "en dä Reih $1",
+ "scribunto-module-line": "en $1 en dä Reih $2",
+ "scribunto-parser-dialog-title": "Fähler em Skrepp",
+ "scribunto-error-short": "Fähler em Skrepp: $1",
+ "scribunto-error-long": "Fähler em Skrepp:\n\n$1",
+ "scribunto-doc-page-does-not-exist": "Heh dat {{ns:module}} kam_mer beschrieve op dä Sigg [[$1]]",
+ "scribunto-doc-page-header": "'''Heh di Sigg beschriev dat {{ns:module}} [[$1]]'''",
+ "scribunto-console-clear": "Läddesch maache",
+ "scribunto-common-error-category": "Sigge met Fähler em Skrepte",
+ "scribunto-common-nosuchmodule": "Ene Fähler mem Skrepp: Et jitt kei {{ns:module}} „$2“",
+ "scribunto-common-nofunction": "Ene Fähler mem Skrepp: En Fonxjuhn zom Oprohfe moß aanjejovve sin.",
+ "scribunto-common-nosuchfunction": "Ene Fähler mem Skrepp: Et jitt kein Fonxjuhn „$2“.",
+ "scribunto-common-notafunction": "Ene Fähler mem Skrepp: „$2“ es kein Fonxjuhn.",
+ "scribunto-common-timeout": "Di Zigg för Skrepte, fähdesch ze wähde, es eröm.",
+ "scribunto-common-oom": "Der Scheijscher, dä för Skreppte parraht jeschtalld es, es övverjeloufe.",
+ "scribunto-common-backtrace": "Zerökverfolljong:",
+ "scribunto-common-no-details": "Mer han söns kein Einzelheite.",
+ "scribunto-lua-in-function": "en dä Fongxjuhn „$1“",
+ "scribunto-lua-in-function-at": "en dä Fongxjuhn aan dä Schtäll $1:$2",
+ "scribunto-lua-backtrace-line": "$1:&nbsp;$2",
+ "scribunto-lua-error-location": "Fähler em Lua $1: $2.",
+ "scribunto-lua-error": "Fähler em Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Ene Fähler mem Skrepp: Dat {{ns:module}} johv ene Wäät vun dä Zoot „$2“ uß. Et sullt ävver en Tabäll för der Äxpoot livvere.",
+ "scribunto-luastandalone-proc-error": "Lua mäldt ene Fähler: Kunnt keine Prozäss aanlähje.",
+ "scribunto-luastandalone-proc-error-msg": "Lua mäldt ene Fähler: Kunnt keine Prozäss aanlähje: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Lua mäldt ene Fähler: Kunnt keine Prozäss aanlähje: proc_open is not available. Check PHP's \"disable_functions\" configuration directive.\n",
+ "scribunto-luastandalone-decode-error": "Fähler em LUA. Mer kunnte di Mäldong nit verschtonn.",
+ "scribunto-luastandalone-write-error": "Fähler em Lua.\nEne entärne Fähler es opjetrodde beim Schriive en en <i lang=\"en\" xml:lang=\"en\">pipe</i>.",
+ "scribunto-luastandalone-read-error": "Fähler em Lua.\nEne entärne Fähler es opjetrodde beim Lässe us ener <i lang=\"en\" xml:lang=\"en\">pipe</i>.",
+ "scribunto-luastandalone-gone": "Lua mäldt ene ennere Fähler: Dä Enterprehter es ald aam Äng un fott.",
+ "scribunto-luastandalone-signal": "Lua mäldt ene ennere Fähler: Dä Enterprehter es ald aam Äng un johv et Singnahl: „$2“",
+ "scribunto-luastandalone-exited": "Lua mäldt ene ennere Fähler: Dä Enterprehter es ald aam Äng, mem Zohschtand $2.",
+ "scribunto-module-with-errors-category": "Scribunto {{ns:module}}e met Fähler dren",
+ "scribunto-module-with-errors-category-desc": "En däm Moduhl heh es en Fähler dren.",
+ "scribunto-limitreport-timeusage": "Dem Lua singe Ziggverbruch",
+ "scribunto-limitreport-timeusage-value": "$1/$2 Sekonde",
+ "scribunto-limitreport-virtmemusage": "Dem Lua sing vechtoälle Plazverbruch",
+ "scribunto-limitreport-virtmemusage-value": "$1 vun $2",
+ "scribunto-limitreport-estmemusage": "Dem Lua singe Schpeijscherplazverbruch, jeschäz",
+ "scribunto-limitreport-memusage": "Dem Lua singe Schpeijscherplazverbruch",
+ "scribunto-limitreport-memusage-value": "$1 vun $2",
+ "scribunto-limitreport-profile": "Dem Lua sing Profihl",
+ "scribunto-limitreport-profile-ms": "$1&nbsp;ms",
+ "scribunto-limitreport-profile-percent": "$1%",
+ "scribunto-limitreport-logs": "Dem Lua sing Loglöhscher",
+ "apihelp-scribunto-console-param-title": "De Övverschreff vun däm {{ns:module}} zom Ußprobehre.",
+ "apihelp-scribunto-console-param-content": "Däm Moduhl singe neue Enhalld",
+ "apihelp-scribunto-console-param-question": "Dä nähkßte Reih, di als e Skrepp ußjeföhrt wähde sull.",
+ "apihelp-scribunto-console-param-clear": "Donn dat aanschallde, un maach esu de aktälle Sezongsdahte fott."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ku-latn.json b/www/wiki/extensions/Scribunto/i18n/ku-latn.json
new file mode 100644
index 00000000..bcba76e0
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ku-latn.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ghybu",
+ "Gomada",
+ "George Animal",
+ "McDutchie"
+ ]
+ },
+ "scribunto-line": "li ser rêza $1",
+ "scribunto-module-line": "di $1 de, li ser rêza $2",
+ "scribunto-parser-dialog-title": "Çewtiya nivîsê",
+ "scribunto-error-short": "Çewtiya nivîsê: $1",
+ "scribunto-error-long": "Çewtiyên nivîsê:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/belge",
+ "scribunto-doc-page-header": "'''Ev rûpela belgekirinê ya [[$1]] ye'''",
+ "scribunto-console-clear": "Jê bibe",
+ "scribunto-common-error-category": "Rûpelên bi çewtiyên kodê",
+ "scribunto-common-nosuchmodule": "Çewtiya nivîsê: Moduleke bi vî rengî \"$2\" tune ye.",
+ "scribunto-lua-error-location": "Çewtiya Lua'yê $1: $2.",
+ "scribunto-lua-error": "Çewtiya Lua'yê: $2.",
+ "nstab-module": "Modul",
+ "tooltip-ca-nstab-module": "Rûpela modulê bibîne"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/kum.json b/www/wiki/extensions/Scribunto/i18n/kum.json
new file mode 100644
index 00000000..9dbba70a
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/kum.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Arsenekoumyk"
+ ]
+ },
+ "scribunto-lua-error": "Lua янгылышы: $2.‎"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/kw.json b/www/wiki/extensions/Scribunto/i18n/kw.json
new file mode 100644
index 00000000..dc27e2cf
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/kw.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kw-Moon"
+ ]
+ },
+ "scribunto-lua-error": "Kammwrians Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/la.json b/www/wiki/extensions/Scribunto/i18n/la.json
new file mode 100644
index 00000000..15dd5a0f
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/la.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lesgles"
+ ]
+ },
+ "scribunto-lua-error": "Error Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/lb.json b/www/wiki/extensions/Scribunto/i18n/lb.json
new file mode 100644
index 00000000..a3d8dd4d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/lb.json
@@ -0,0 +1,29 @@
+{
+ "@metadata": {
+ "authors": [
+ "Robby",
+ "McDutchie"
+ ]
+ },
+ "scribunto-line": "an der Linn $1",
+ "scribunto-parser-dialog-title": "Script-Feeler",
+ "scribunto-error-short": "Script-Feeler: $1",
+ "scribunto-error-long": "Script-Feeler:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''D'Dokumentatioun fir dëse Modul kann op [[$1]] ugeluecht ginn''",
+ "scribunto-doc-page-header": "'''Dëst ass d'Dokumentationsäit fir [[$1]]'''",
+ "scribunto-console-clear": "Eidel maachen",
+ "scribunto-common-error-category": "Säite mat Scriptfeeler",
+ "scribunto-common-nosuchfunction": "Scriptfeeler: D'Funktioun \"$2\" gëtt et net.",
+ "scribunto-common-notafunction": "Scriptfeeler: \"$2\" ass keng Funktioun.",
+ "scribunto-lua-in-function": "an der Funktioun \"$1\"",
+ "scribunto-lua-error-location": "Lua-Feeler $1: $2.",
+ "scribunto-lua-error": "Lua Feeler: $2",
+ "scribunto-module-with-errors-category-desc": "De Modul huet e Feeler.",
+ "scribunto-limitreport-timeusage-value": "$1/$2 Sekonnen",
+ "scribunto-limitreport-profile": "Lua – Profil",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "apihelp-scribunto-console-param-title": "Den Titel vum Modul fir ze testen.",
+ "nstab-module": "Modul",
+ "tooltip-ca-nstab-module": "D'Modulsäit weisen"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/lez.json b/www/wiki/extensions/Scribunto/i18n/lez.json
new file mode 100644
index 00000000..7a80816f
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/lez.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Migraghvi"
+ ]
+ },
+ "scribunto-lua-error": "Lua гъалатl: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/lfn.json b/www/wiki/extensions/Scribunto/i18n/lfn.json
new file mode 100644
index 00000000..d04944ad
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/lfn.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Cgboeree",
+ "Katxis"
+ ]
+ },
+ "scribunto-lua-error": "Era de Lua: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/li.json b/www/wiki/extensions/Scribunto/i18n/li.json
new file mode 100644
index 00000000..98d30360
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/li.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ooswesthoesbes"
+ ]
+ },
+ "scribunto-lua-error": "Luafout: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/lij.json b/www/wiki/extensions/Scribunto/i18n/lij.json
new file mode 100644
index 00000000..03f0d86f
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/lij.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Giromin Cangiaxo"
+ ]
+ },
+ "scribunto-lua-error": "Errô Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/lki.json b/www/wiki/extensions/Scribunto/i18n/lki.json
new file mode 100644
index 00000000..b253beee
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/lki.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hosseinblue",
+ "Lakzon"
+ ]
+ },
+ "scribunto-doc-page-name": "Module:$1/توضیحات",
+ "scribunto-lua-error": ". خطا لوآ: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/lo.json b/www/wiki/extensions/Scribunto/i18n/lo.json
new file mode 100644
index 00000000..161f7e12
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/lo.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aefgh39622"
+ ]
+ },
+ "scribunto-lua-error": "ຂໍ້ຜິດພາດ Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/lrc.json b/www/wiki/extensions/Scribunto/i18n/lrc.json
new file mode 100644
index 00000000..4d17563d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/lrc.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Mogoeilor"
+ ]
+ },
+ "scribunto-lua-error": "خٱتا لۊآ:$2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/lt.json b/www/wiki/extensions/Scribunto/i18n/lt.json
new file mode 100644
index 00000000..07410128
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/lt.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hugo.arg",
+ "Eitvys200"
+ ]
+ },
+ "scribunto-lua-error": "Lua klaida: $2.",
+ "nstab-module": "Modulis",
+ "tooltip-ca-nstab-module": "Žiūrėti modulio puslapį"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/luz.json b/www/wiki/extensions/Scribunto/i18n/luz.json
new file mode 100644
index 00000000..109fb1bd
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/luz.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "علی ساکی لرستانی"
+ ]
+ },
+ "scribunto-lua-error": "خطای Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/lv.json b/www/wiki/extensions/Scribunto/i18n/lv.json
new file mode 100644
index 00000000..abdb7ea4
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/lv.json
@@ -0,0 +1,33 @@
+{
+ "@metadata": {
+ "authors": [
+ "Edgars2007",
+ "Papuass"
+ ]
+ },
+ "scribunto-line": "$1. rindā",
+ "scribunto-parser-dialog-title": "Skripta kļūda",
+ "scribunto-error-short": "Skripta kļūda: $1",
+ "scribunto-error-long": "Skripta kļūdas:\n\n$1",
+ "scribunto-doc-page-does-not-exist": "''Šī moduļa dokumentāciju var izveidot [[$1]] lapā''",
+ "scribunto-doc-page-header": "'''Šī ir [[$1]] moduļa dokumentācijas lapa'''",
+ "scribunto-console-title": "Atkļūdošanas konsole",
+ "scribunto-console-current-src": "konsoles ievade",
+ "scribunto-console-clear": "Notīrīt",
+ "scribunto-common-error-category": "Lapas ar skriptu kļūdām",
+ "scribunto-common-notafunction": "Skripta kļūda: \"$2\" nav fubkcija.",
+ "scribunto-lua-in-function": "funkcijā \"$1\"",
+ "scribunto-lua-error-location": "Lua kļūda $1: $2.",
+ "scribunto-lua-error": "Lua kļūda: $2.",
+ "scribunto-luastandalone-proc-error": "Lua kļūda: Nevar izveidot procesu.",
+ "scribunto-luastandalone-proc-error-msg": "Lua kļūda: Nevar izveidot procesu: $2",
+ "scribunto-module-with-errors-category": "Scribunto moduļi ar kļūdām",
+ "scribunto-module-with-errors-category-desc": "Modulī ir kļūda.",
+ "scribunto-limitreport-memusage": "Lua atmiņas lietojums",
+ "scribunto-limitreport-profile": "Lua profils",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Lua žurnāli",
+ "apihelp-scribunto-console-param-content": "Jaunais moduļa saturs",
+ "nstab-module": "Modulis",
+ "tooltip-ca-nstab-module": "Apskatīt moduļa lapu"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/lzh.json b/www/wiki/extensions/Scribunto/i18n/lzh.json
new file mode 100644
index 00000000..93b00323
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/lzh.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "SolidBlock"
+ ]
+ },
+ "scribunto-lua-error": "Lua誤:$2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/mai.json b/www/wiki/extensions/Scribunto/i18n/mai.json
new file mode 100644
index 00000000..dcaa6c9d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/mai.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Tulsi Bhagat"
+ ]
+ },
+ "scribunto-lua-error": "लुआ गल्ती: $2 ।"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/mg.json b/www/wiki/extensions/Scribunto/i18n/mg.json
new file mode 100644
index 00000000..0f2cc0e5
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/mg.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jagwar"
+ ]
+ },
+ "scribunto-lua-error": "Hadisoana Lua: $2.",
+ "scribunto-limitreport-profile-ms": "$1 ms"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/mhr.json b/www/wiki/extensions/Scribunto/i18n/mhr.json
new file mode 100644
index 00000000..bdc26295
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/mhr.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Санюн Вадик"
+ ]
+ },
+ "scribunto-lua-error": "Lua йоҥылыш: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/mk.json b/www/wiki/extensions/Scribunto/i18n/mk.json
new file mode 100644
index 00000000..36f851c4
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/mk.json
@@ -0,0 +1,67 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bjankuloski06"
+ ]
+ },
+ "scribunto-desc": "Рамка за вметнување на скриптни јазици во страница на МедијаВики",
+ "scribunto-line": "во редот $1",
+ "scribunto-module-line": "во $1, ред $2",
+ "scribunto-parser-dialog-title": "Грешка во скриптата",
+ "scribunto-error-short": "Грешка во скриптата: $1",
+ "scribunto-error-long": "Грешки во скриптата:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/док",
+ "scribunto-doc-page-does-not-exist": "''Документацијата за овој модул можете да ја создадете на [[$1]]''",
+ "scribunto-doc-page-header": "'''Ова е страницата за документација на [[$1]]'''",
+ "scribunto-console-intro": "* Извозот на модулот е достапен како променлива „p“, вклучувајќи ги незачуваните измени.\n* Пред редот ставајте „=“ за да ја вреднувате како израз, или пак користете print(). Користете mw.logObject() за табели.\n* Во кодот на модулот користете mw.log() and mw.logObject() за испраќање на пораки до оваа конзола.",
+ "scribunto-console-title": "Конзола за исправање на грешки",
+ "scribunto-console-too-large": "Оваа седница на конзолата е преголема. Исчистете ја нејзината историја или намалете ја големината на модулот.",
+ "scribunto-console-current-src": "внос во конзолата",
+ "scribunto-console-clear": "Исчисти",
+ "scribunto-console-cleared": "Состојбата на конзолата е исчистена поради поднова на модулот.",
+ "scribunto-console-cleared-session-lost": "Состојбата на конзолата е исчистена поради загуба на податоците од седницата.",
+ "scribunto-common-error-category": "Страници со грешки во скриптата",
+ "scribunto-common-error-category-desc": "Се јави грешка при обработката на модулите во страницава.",
+ "scribunto-common-nosuchmodule": "Грешка во скриптата: Нема модул наречен „$2“.",
+ "scribunto-common-nofunction": "Грешка во скриптата: Мора да ја наведете функцијата што треба да се повика.",
+ "scribunto-common-nosuchfunction": "Грешка во скриптата: Функцијата „$2“ не постои.",
+ "scribunto-common-notafunction": "Грешка во скриптата: „$2“ не е функција.",
+ "scribunto-common-timeout": "Зададеното време за работа на скриптите истече.",
+ "scribunto-common-oom": "Надминат е дозволениот складишен простор за работа на скрипти.",
+ "scribunto-common-backtrace": "Проследување на текот:",
+ "scribunto-common-no-details": "Нема повеќе подробности.",
+ "scribunto-lua-in-function": "во функцијата „$1“",
+ "scribunto-lua-in-main": "во главниот дел",
+ "scribunto-lua-in-function-at": "во функцијата, кај $1:$2",
+ "scribunto-lua-error-location": "Грешка во Lua $1: $2",
+ "scribunto-lua-error": "Грешка во Lua: $2",
+ "scribunto-lua-notarrayreturn": "Грешка во скриптата: Модулот даде $2 вредност. Треба да врати извозна табела.",
+ "scribunto-luastandalone-proc-error": "Грешка во Lua: не можам да ја создадам постапката",
+ "scribunto-luastandalone-proc-error-msg": "Грешка во Lua: не можам да ја создадам постапката: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Гречка во Lua: Не можам да ја создадам постапката: proc_open е недостапен. Проверете ја наредбата „disable_functions“ во поставките за PHP.",
+ "scribunto-luastandalone-decode-error": "Грешка во Lua: внатрешна грешка: не можам да ја декодирам пораката",
+ "scribunto-luastandalone-write-error": "Грешка во Lua: внатрешна грешка: грешка при записот",
+ "scribunto-luastandalone-read-error": "Грешка во Lua: внатрешна грешка: грешка при читањето",
+ "scribunto-luastandalone-gone": "Грешка во Lua: внатрешна грешка: толкувачот веќе напушти",
+ "scribunto-luastandalone-signal": "Грешка во Lua: внатрешна грешка: толкувачот прекина да работи со сигналот „$2“",
+ "scribunto-luastandalone-exited": "Грешка во Lua: внатрешна грешка: толкувачот напушти со статусот $2",
+ "scribunto-module-with-errors-category": "Модули на Scribunto со грешки",
+ "scribunto-module-with-errors-category-desc": "Модулот содржи грешка.",
+ "scribunto-limitreport-timeusage": "Lua – употреба на време",
+ "scribunto-limitreport-timeusage-value": "$1/$2 секунди",
+ "scribunto-limitreport-virtmemusage": "Lua – виртуелна големина",
+ "scribunto-limitreport-estmemusage": "Lua – проценета употреба на складот",
+ "scribunto-limitreport-memusage": "Lua – употреба на складот",
+ "scribunto-limitreport-profile": "Lua – Профил",
+ "scribunto-limitreport-profile-ms": "$1 мс",
+ "scribunto-limitreport-logs": "Днавници на Lua",
+ "apihelp-scribunto-console-description": "Внатрешен модул за опслужување на XHR-барања од конзолата на Scribunto.",
+ "apihelp-scribunto-console-summary": "Внатрешен модул за опслужување на XHR-барања од конзолата на Scribunto.",
+ "apihelp-scribunto-console-param-title": "Наслов на модулот што се испробува.",
+ "apihelp-scribunto-console-param-content": "Новата содржина на модулот.",
+ "apihelp-scribunto-console-param-session": "Шифра на седницата.",
+ "apihelp-scribunto-console-param-question": "Следниот ред за проверка како скрипта.",
+ "apihelp-scribunto-console-param-clear": "Задајте го за да ја исчистите тековната состојба на седницата.",
+ "nstab-module": "Модул",
+ "tooltip-ca-nstab-module": "Преглед на модулната страница"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ml.json b/www/wiki/extensions/Scribunto/i18n/ml.json
new file mode 100644
index 00000000..fa657acd
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ml.json
@@ -0,0 +1,64 @@
+{
+ "@metadata": {
+ "authors": [
+ "Praveenp",
+ "McDutchie"
+ ]
+ },
+ "scribunto-desc": "മീഡിയവിക്കി താളുകളിൽ സ്ക്രിപ്റ്റിങ് ഭാഷകൾ ഉൾക്കൊള്ളിക്കാനുള്ള ചട്ടക്കൂട്",
+ "scribunto-line": "$1 വരിയിൽ",
+ "scribunto-module-line": "$1-ൽ $2 വരിയിൽ",
+ "scribunto-parser-dialog-title": "സ്ക്രിപ്റ്റ് പിഴവ്",
+ "scribunto-error-short": "സ്ക്രിപ്റ്റ് പിഴവ്: $1",
+ "scribunto-error-long": "സ്ക്രിപ്റ്റ് പിഴവുകൾ:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/വിവരണം",
+ "scribunto-doc-page-does-not-exist": "''ഈ ഘടകത്തിന്റെ വിവരണം [[$1]] എന്ന താളിൽ നിർമ്മിക്കാവുന്നതാണ്''",
+ "scribunto-doc-page-header": "'''ഇത് [[$1]] എന്നതിന്റെ വിവരണതാൾ ആണ്'''",
+ "scribunto-console-intro": "*ഘടകം കയറ്റുമതി ചെയ്തത് \"p\" എന്ന ചരമായി സേവ് ചെയ്യാത്ത മാറ്റങ്ങളുൾപ്പെടെ ലഭ്യമാണ്.\n*ഒരു വരി പ്രയോഗമായി (എക്സ്പ്രെഷൻ) തിട്ടപ്പെടുത്തുവാൻ \"=\" എന്ന് തുടങ്ങുക, അല്ലെങ്കിൽ print() ഉപയോഗിക്കുക.\n*ഈ കൺസോളിലേയ്ക്ക് സന്ദേശങ്ങൾ അയയ്ക്കാൻ ഘടക കോഡിൽ mw.log() ഉപയോഗിക്കുക",
+ "scribunto-console-title": "തെറ്റുകണ്ടെത്തൽ കൺസോൾ",
+ "scribunto-console-too-large": "ഈ കൺസോൾ സെഷൻ വളരെ വലുതാണ്. കൺസോളിലെ പഴയവ ഒഴിവാക്കുകയോ ഘടകത്തിന്റെ വലിപ്പം ചെറുതാക്കുകയോ ചെയ്യുക.",
+ "scribunto-console-current-src": "കൺസോളിൽ നൽകേണ്ടത്",
+ "scribunto-console-clear": "ശൂന്യമാക്കുക",
+ "scribunto-console-cleared": "ഘടകം പുതുക്കിയതിനാൽ കൺസോളിന്റെ സ്ഥിതി ശൂന്യമാക്കിയിരുന്നു.",
+ "scribunto-console-cleared-session-lost": "സെഷൻ ഡേറ്റ നഷ്ടപ്പെട്ടതിനാൽ കൺസോളിന്റെ സ്ഥിതി ശൂന്യമാക്കിയിരുന്നു.",
+ "scribunto-common-error-category": "സ്ക്രിപ്റ്റ് പിഴവുകളോട് കൂടിയ താളുകൾ",
+ "scribunto-common-error-category-desc": "താളിൽ ഉൾപ്പെടുത്തിയ ഘടകങ്ങൾ കൈകാര്യം ചെയ്യുന്നതിനിടെ പിഴവുണ്ടായി.",
+ "scribunto-common-nosuchmodule": "സ്ക്രിപ്റ്റ് പിഴവ്: \"$2\" എന്നൊരു ഘടകം ഇല്ല.",
+ "scribunto-common-nofunction": "സ്ക്രിപ്റ്റ് പിഴവ്: വിളിക്കേണ്ട ഫങ്ഷൻ വ്യക്തമാക്കേണ്ടതാണ്.",
+ "scribunto-common-nosuchfunction": "സ്ക്രിപ്റ്റ് പിഴവ്: \"$2\" എന്ന ഫങ്ഷൻ നിലവിലില്ല.",
+ "scribunto-common-notafunction": "സ്ക്രിപ്റ്റ് പിഴവ്: \"$2\" ഒരു ഫങ്ഷനല്ല.",
+ "scribunto-common-timeout": "സ്ക്രിപ്റ്റുകൾ പ്രവർത്തിക്കാനായി അനുവദിച്ച സമയം അവസാനിച്ചു.",
+ "scribunto-common-oom": "സ്ക്രിപ്റ്റുകൾ പ്രവർത്തിക്കാനായി അനുവദിച്ച മെമ്മറി അധികരിച്ചു.",
+ "scribunto-common-backtrace": "അനുധാവനം:",
+ "scribunto-common-no-details": "കൂടുതൽ വിവരങ്ങളൊന്നും ലഭ്യമല്ല.",
+ "scribunto-lua-in-function": "\"$1\" എന്ന ഫങ്ഷനിൽ",
+ "scribunto-lua-in-main": "പ്രധാന ഖണ്ഡത്തിൽ",
+ "scribunto-lua-in-function-at": "$1 ഫങ്ഷനിൽ $2 വരിയിൽ",
+ "scribunto-lua-error-location": "ലുവ പിഴവ് $1 : $2",
+ "scribunto-lua-error": "ലുവ പിഴവ്: $2.",
+ "scribunto-lua-notarrayreturn": "സ്ക്രിപ്റ്റ് പിഴവ്: ഒരു $2 വിലയാണ് ഘടകം നൽകിയത്. കയറ്റുമതി പട്ടിക നൽകണം എന്നാണ് കരുതിയിരുന്നത്.",
+ "scribunto-luastandalone-proc-error": "ലുവ പിഴവ്: പ്രോസസ്സ് സൃഷ്ടിക്കാനായില്ല.",
+ "scribunto-luastandalone-proc-error-msg": "ലുവ പിഴവ്: പ്രോസസ്സ് സൃഷ്ടിക്കാനായില്ല: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "ലുവ പിഴവ്: പ്രോസസ് സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല: proc_open ലഭ്യമല്ല. പി.എച്ച്.പി.യുടെ \"disable_functions\" ക്രമീകരണ നിർദ്ദേശിനി പരിശോധിക്കുക.",
+ "scribunto-luastandalone-decode-error": "ലുവ പിഴവ്: ആന്തരിക പിഴവ്: സന്ദേശം നിർഗൂഢീകരിക്കാൻ സാധിച്ചില്ല.",
+ "scribunto-luastandalone-write-error": "ലുവ പിഴവ്: ആന്തരിക പിഴവ്: പൈപ്പിലേയ്ക്ക് എഴുതുന്നതിൽ പിഴവുണ്ടായി.",
+ "scribunto-luastandalone-read-error": "ലുവ പിഴവ്: ആന്തരിക പിഴവ്: പൈപ്പിൽ നിന്ന് വായിക്കുന്നതിൽ പിഴവുണ്ടായി.",
+ "scribunto-luastandalone-gone": "ലുവ പിഴവ്: ആന്തരിക പിഴവ്: ദ്വിഭാഷി മുമ്പേ തന്നെ പ്രവർത്തനം നിർത്തിയിരിക്കുകയാണ്.",
+ "scribunto-luastandalone-signal": "ലുവ പിഴവ്: ആന്തരിക പിഴവ്: \"$2\" എന്ന സൂചന നൽകി ദ്വിഭാഷി നിന്നുപോയി.",
+ "scribunto-luastandalone-exited": "ലുവ പിഴവ്: ആന്തരിക പിഴവ്: $2 എന്ന സ്ഥിതിയോടെ ദ്വിഭാഷി നിന്നുപോയി.",
+ "scribunto-module-with-errors-category": "സ്ക്രൈബുണ്ടോ ഘടകങ്ങളിൽ പിഴവുണ്ട്",
+ "scribunto-module-with-errors-category-desc": "ഘടത്തിൽ ഒരു പിഴവുണ്ട്.",
+ "scribunto-limitreport-timeusage": "ലുവ സമയോപയോഗം",
+ "scribunto-limitreport-timeusage-value": "$1/$2 സെക്കന്റുകൾ",
+ "scribunto-limitreport-virtmemusage": "ലുവ വിർച്വൽ വലിപ്പം",
+ "scribunto-limitreport-estmemusage": "ലുവ കണക്കാക്കുന്ന മെമ്മറി ഉപഭോഗം",
+ "scribunto-limitreport-memusage": "ലുവ മെമ്മറി ഉപഭോഗം",
+ "scribunto-limitreport-profile": "ലുവ പ്രോഫൈൽ",
+ "scribunto-limitreport-profile-ms": "$1 എം.എസ്.",
+ "scribunto-limitreport-logs": "ലുവ രേഖകൾ",
+ "apihelp-scribunto-console-param-title": "പരീക്ഷിക്കാനുള്ള ഘടകത്തിന്റെ തലക്കെട്ട്.",
+ "apihelp-scribunto-console-param-content": "ഘടകത്തിന്റെ പുതിയ ഉള്ളടക്കം.",
+ "apihelp-scribunto-console-param-session": "സെഷൻ ചീട്ട്.",
+ "apihelp-scribunto-console-param-question": "സ്ക്രിപ്റ്റ് ആയി പരിശോധിക്കാനുള്ള അടുത്ത വരി.",
+ "apihelp-scribunto-console-param-clear": "ഇപ്പൊഴത്തെ സെഷൻ സ്ഥിതി ശൂന്യമാക്കിയതായി സജ്ജീകരിക്കുക."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/mn.json b/www/wiki/extensions/Scribunto/i18n/mn.json
new file mode 100644
index 00000000..7da88bb9
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/mn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Sembuk"
+ ]
+ },
+ "scribunto-lua-error": "Lua алдаа: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/mo.json b/www/wiki/extensions/Scribunto/i18n/mo.json
new file mode 100644
index 00000000..2e98044e
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/mo.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "TheChampionMan1234"
+ ]
+ },
+ "scribunto-lua-error": "Ероаре Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/mr.json b/www/wiki/extensions/Scribunto/i18n/mr.json
new file mode 100644
index 00000000..dcc006a1
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/mr.json
@@ -0,0 +1,50 @@
+{
+ "@metadata": {
+ "authors": [
+ "V.narsikar",
+ "Sureshkhole"
+ ]
+ },
+ "scribunto-desc": "मिडीयाविकी पानांमध्ये स्क्रिप्टींग भाषा अंतर्भूत करण्यासाठीचा आराखडा",
+ "scribunto-line": "$1 या ओळीत",
+ "scribunto-module-line": "$1 मध्ये $2 ओळीत",
+ "scribunto-parser-dialog-title": "लेखन त्रुटी",
+ "scribunto-error-short": "लेखन त्रुटी:$1",
+ "scribunto-error-long": "लेखन त्रुटी:\n\n\n$1",
+ "scribunto-doc-page-name": "विभाग:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''[[$1]] येथे या विभागाचे दस्तावेजीकरण तयार करु शकता''",
+ "scribunto-doc-page-header": "'''हे [[$1]]साठी असलेले दस्तावेजीकरण पान आहे'''",
+ "scribunto-console-title": "डिबग संचालक",
+ "scribunto-console-too-large": "संचालकाला आपण खुप काम दिले आहे. आपण जर संचालकाचा इतिहास काढून टाकलात किंवा दिलेल्या कामाचे आकारमान कमी केले तरच ही‌ क्रिया पुर्ण होऊ शकते.",
+ "scribunto-console-current-src": "संचालक इनपुट",
+ "scribunto-console-clear": "स्वच्छ करा",
+ "scribunto-console-cleared": "मोडूलचे अद्यतन केल्यामुळे संचालकाची स्थिती रिकामी करण्यात आलेली आहे.",
+ "scribunto-console-cleared-session-lost": "ह्या सत्राचा डेटा गेल्यामुळे संचालकाची स्थिती रिकामी करण्यात आलेली आहे.",
+ "scribunto-common-error-category": "लेखन त्रुटी असणारी पाने",
+ "scribunto-common-error-category-desc": "या पानात अंतर्भूत विभागावर (मॉड्यूल) प्रक्रिया करण्यात त्रुटी घडली आहे.",
+ "scribunto-common-nosuchmodule": "लेखन त्रुटी:\"$2\" असा कोणताच विभाग नाही.",
+ "scribunto-common-nofunction": "लेखन त्रुटी:आपण हाक द्यायची क्रिया टाकावयास हवी.",
+ "scribunto-common-nosuchfunction": "लेखन त्रुटी:\"$2\" ही क्रिया अस्तित्वात नाही.",
+ "scribunto-common-notafunction": "लेखन त्रुटी:\"$2\" ही एक क्रिया नाही.",
+ "scribunto-common-timeout": "ह्या संहिता चालाववायचा निर्धारीत कालावधी संपला आहे.",
+ "scribunto-common-oom": "संहिता चालवावयाची निर्धारीत स्मृती पार केल्या गेली आहे.",
+ "scribunto-common-backtrace": "मागेशोधा:",
+ "scribunto-common-no-details": "पुढील अधिक तपशील उपलब्ध नाही.",
+ "scribunto-lua-in-function": "\"$1\" या क्रियेत",
+ "scribunto-lua-in-main": "मुख्य ढिगार्यात",
+ "scribunto-lua-in-function-at": "ह्या $1:$2 फ़ंक्शनमध्ये",
+ "scribunto-lua-error-location": "लुआ(Lua) त्रुटी $1: $2.",
+ "scribunto-lua-error": "लुआ(Lua) त्रुटी: $2.",
+ "scribunto-lua-notarrayreturn": "स्क्रिप्ट चुक:‌मोड्यूलने $2 हे मुल्य दाखवले आहे. खरेतर त्याने निकालाची सारणी उत्पादित करणे अपेक्षित होते.",
+ "scribunto-luastandalone-proc-error": "लुआ त्रुटी:प्रक्रिया तयार करू शकत नाही.",
+ "scribunto-luastandalone-proc-error-msg": "लुआ त्रुटी:प्रक्रिया तयार करू शकलो नाही:$2",
+ "scribunto-luastandalone-decode-error": "लुआ त्रुटी:अंतर्गत त्रुटी:संदेश-संकेत उघडू शकलो नाही.",
+ "scribunto-module-with-errors-category": "त्रुटी असणारे स्क्रिबुंटो विभाग",
+ "scribunto-module-with-errors-category-desc": "या विभागात (मॉड्यूलमध्ये) त्रुटी आहे.",
+ "scribunto-limitreport-timeusage": "लुआ वापराचा कालावधी",
+ "scribunto-limitreport-timeusage-value": "$1/$2 सेकंद",
+ "scribunto-limitreport-memusage": "लुआ स्मृती वापर",
+ "scribunto-limitreport-logs": "लुआ नोंदी",
+ "nstab-module": "विभाग",
+ "tooltip-ca-nstab-module": "विभाग पान बघा"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ms.json b/www/wiki/extensions/Scribunto/i18n/ms.json
new file mode 100644
index 00000000..4ad9756b
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ms.json
@@ -0,0 +1,49 @@
+{
+ "@metadata": {
+ "authors": [
+ "Anakmalaysia",
+ "Aurora",
+ "Pizza1016"
+ ]
+ },
+ "scribunto-desc": "Kerangka pembenaman bahasa skrip dalam halaman MediaWiki",
+ "scribunto-line": "pada baris $1",
+ "scribunto-module-line": "pada baris $2 di $1",
+ "scribunto-parser-dialog-title": "Ralat skrip",
+ "scribunto-error-short": "Ralat skrip: $1",
+ "scribunto-error-long": "Ralat-ralat skrip:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''Pendokumenan untuk modul ini boleh diciptakan di [[$1]]''",
+ "scribunto-doc-page-header": "'''Ini ialah halaman pendokumenan untuk [[$1]]'''",
+ "scribunto-console-intro": "* Eksport modul terdapat dalam bentuk pembolehubah \"p\", termasuk pengubahsuaian yang belum disimpan.\n* Dahului baris dengan tanda \"=\" untuk menilainya sebagai ungkapan, atau gunakan print().\n* Gunakan mw.log() dalam kod modul untuk menghantar mesej ke konsol ini.",
+ "scribunto-console-title": "Konsol penyahpepijatan",
+ "scribunto-console-too-large": "Sesi konsol ini terlalu besar. Sila padamkan sejarah konsol atau kecilkan saiz modul.",
+ "scribunto-console-current-src": "input konsol",
+ "scribunto-console-clear": "Padamkan",
+ "scribunto-console-cleared": "Keadaan konsol dipadamkan kerana modul dikemaskinikan.",
+ "scribunto-console-cleared-session-lost": "Keadaan konsol dipadamkan kerana kehilangan data sesi.",
+ "scribunto-common-error-category": "Laman yang ada ralat skrip",
+ "scribunto-common-nosuchmodule": "Ralat skrip: Modul ini tidak wujud.",
+ "scribunto-common-nofunction": "Ralat skrip: Anda mesti menyatakan fungsi yang hendak diseru.",
+ "scribunto-common-nosuchfunction": "Ralat skrip: Fungsi yang anda nyatakan itu tidak wujud.",
+ "scribunto-common-timeout": "Masa yang diperuntukkan untuk menjalankan skrip sudah luput.",
+ "scribunto-common-oom": "Had jumlah ingatan yang dibenarkan untuk menjalankan skrip sudah dilampaui.",
+ "scribunto-common-backtrace": "Jejak balik:",
+ "scribunto-common-no-details": "Tiada butiran lanjut.",
+ "scribunto-lua-in-function": "dalam fungsi \"$1\"",
+ "scribunto-lua-in-main": "dalam ketulan utama",
+ "scribunto-lua-in-function-at": "dalam fungsi di $1:$2",
+ "scribunto-lua-error-location": "Ralat Lua $1: $2.",
+ "scribunto-lua-error": "Ralat Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Ralat skrip: Modul sepatutnya memulangkan jadual eksport, tetapi lain pula yang dipulangkannya.",
+ "scribunto-luastandalone-proc-error": "Ralat Lua: Proses tidak boleh diwujudkan.",
+ "scribunto-luastandalone-proc-error-msg": "Ralat Lua: Proses tidak boleh diwujudkan: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Ralat Lua: Proses tidak boleh diwujudkan: proc_open tidak disediakan. Semak arahan konfigurasi \"disable_functions\" PHP.",
+ "scribunto-luastandalone-decode-error": "Ralat Lua: Ralat dalaman: Pesanan tidak dapat dinyahkod.",
+ "scribunto-luastandalone-write-error": "Ralat Lua: Ralat dalaman: Ralat ketika menulis pada paip.",
+ "scribunto-luastandalone-read-error": "Ralat Lua: Ralat dalaman: Ralat ketika membaca dari paip.",
+ "scribunto-luastandalone-gone": "Ralat Lua: Ralat dalaman: Pentafsir sudah keluar.",
+ "scribunto-luastandalone-signal": "Ralat Lua: Ralat dalaman: Pentafsir sudah berhenti dengan isyarat \"$2\".",
+ "scribunto-luastandalone-exited": "Ralat Lua: Ralat dalaman: Pentafsir sudah berhenti dengan status \"$2\".",
+ "scribunto-module-with-errors-category": "Modul Scribunto dengan ralat"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/mt.json b/www/wiki/extensions/Scribunto/i18n/mt.json
new file mode 100644
index 00000000..ee7e620b
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/mt.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chrisportelli",
+ "Leli Forte"
+ ]
+ },
+ "scribunto-common-no-details": "M'hemmx dettalji oħra disponibbli.",
+ "scribunto-lua-error": "Żball ta' Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/mui.json b/www/wiki/extensions/Scribunto/i18n/mui.json
new file mode 100644
index 00000000..bb936978
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/mui.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jawadywn"
+ ]
+ },
+ "scribunto-lua-error": "Lua error: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/mwl.json b/www/wiki/extensions/Scribunto/i18n/mwl.json
new file mode 100644
index 00000000..682f0700
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/mwl.json
@@ -0,0 +1,68 @@
+{
+ "@metadata": {
+ "authors": [
+ "MokaAkashiyaPT",
+ "Athena in Wonderland"
+ ]
+ },
+ "scribunto-desc": "Strutura pa aneixar lhenguaiges de quemandos (script) nas páiginas de l MediaWiki",
+ "scribunto-line": "na lhinha $1",
+ "scribunto-module-line": "an $1 na lhinha $2",
+ "scribunto-parser-dialog-title": "Erro ne l script",
+ "scribunto-error-short": "Erro ne l script: $1",
+ "scribunto-error-long": "Erros ne l script:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''La decumentaçon pa este módulo puode ser criada na páigina [[$1]]''",
+ "scribunto-doc-page-header": "'''Esta ye la páigina de decumentaçon de [[$1]]'''",
+ "scribunto-console-intro": "* Las sportaçones de l módulo stan çponibles por meio de la bariable \"p\", ancluindo altaraçones nó grabadas.\n* Queloca un \"=\" ne l ampeço de la lhinha, pa eilha ser abaluada cumo ua spresson, ó outelize print(). Outelize mw.logObject() pa tabelas.\n* Outelize mw.log() i mw.logObject() ne l código de l módulo pa ambiar mensaiges pa esta cunsuola.",
+ "scribunto-console-title": "Cunsuola pa lhimpar erros",
+ "scribunto-console-too-large": "Esta sesson de cunsuola ye smasiada grande. Por fabor, lhimpe l stórico de la cunsuola ó deminua l tamanho de l módulo.",
+ "scribunto-console-current-src": "antrada de la cunsuola",
+ "scribunto-console-clear": "Lhimpar",
+ "scribunto-console-cleared": "L stado de la cunsuola fui lhimpo porque l módulo fui atualizado.",
+ "scribunto-console-cleared-session-lost": "L stado de la cunsuola fui lhimpo porque ls dados de la sesson fúrun perdidos.",
+ "scribunto-common-error-category": "Páiginas cun erros de quemandos",
+ "scribunto-common-error-category-desc": "Hoube un erro al porcessar ls módulos ancluídos na páigina.",
+ "scribunto-common-nosuchmodule": "Erro de quemando: Nó eijiste ningun módulo \"$2\".",
+ "scribunto-common-nofunction": "Erro de quemando: Ten de specifecar ua funçon a ser chamada.",
+ "scribunto-common-nosuchfunction": "Erro de quemando: La funcion \"$2\" nó eijiste.",
+ "scribunto-common-notafunction": "Erro de quemando: \"$2\" nó ye ua funçon.",
+ "scribunto-common-timeout": "L tiempo dedicado a la eisecuçon de quemandos spirou.",
+ "scribunto-common-oom": "La cantidade de mimória premitida pa la eisecuçon de quemandos fui arrepassada.",
+ "scribunto-common-backtrace": "Chamadas atibas (''backtrace''):",
+ "scribunto-common-no-details": "Nun stan çponibles mais detailhes.",
+ "scribunto-lua-in-function": "na funçon \"$1\"",
+ "scribunto-lua-in-main": "na parte percipal",
+ "scribunto-lua-in-function-at": "na funçon an $1:$2",
+ "scribunto-lua-error-location": "Erro de Lua $1: $2.",
+ "scribunto-lua-error": "Erro an Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Erro de quemando: L módulo ambiou de buolta un balor $2. Ye supuosto que ambie de buolta ua tabela de sportaçon.",
+ "scribunto-luastandalone-proc-error": "Erro de Lua: Nó ye possible criar l porcesso.",
+ "scribunto-luastandalone-proc-error-msg": "Erro de Lua: Nun ye possible criar l seguinte porcesso: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Erro de Lua: Nó fui possible criar l porcesso: proc_open nó stá çponible. Cunsulte la diretiba de cunfiguraçon \"disable_functions\" de l PHP.",
+ "scribunto-luastandalone-decode-error": "Erro de Lua: Erro anterno: Nó ye possible çcodeficar la mensaige.",
+ "scribunto-luastandalone-write-error": "Erro de Lua: Erro anterno: Hoube un erro al screbir ne l ancanhamiento (''pipe'').",
+ "scribunto-luastandalone-read-error": "Erro de Lua: Erro anterno: Hoube un erro al lher de l ancanhamiento (''pipe'').",
+ "scribunto-luastandalone-gone": "Erro de Lua: Erro anterno: L anterpretador yá treminou.",
+ "scribunto-luastandalone-signal": "Erro de Lua: Erro anterno: L anterpretador treminou cul senhal \"$2\".",
+ "scribunto-luastandalone-exited": "Erro de Lua: Erro anterno: L anterpretador treminou cul stado $2.",
+ "scribunto-module-with-errors-category": "Módulos Scribunto cun erros",
+ "scribunto-module-with-errors-category-desc": "L módulo ten un erro.",
+ "scribunto-limitreport-timeusage": "Tiempo de outelizaçon de Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 segundos",
+ "scribunto-limitreport-virtmemusage": "Tamanho birtual de Lua",
+ "scribunto-limitreport-estmemusage": "Stimatiba de la outelizaçon de mimória de Lua",
+ "scribunto-limitreport-memusage": "Outelizaçon de mimória de Lua",
+ "scribunto-limitreport-profile": "Perfil de Lua",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Registros de Lua",
+ "apihelp-scribunto-console-description": "Módulo anterno pa respunder ls pedidos XHR benidos de la cunsuola Scribunto.",
+ "apihelp-scribunto-console-summary": "Módulo anterno pa respunder ls pedidos XHR benidos de la cunsuola Scribunto.",
+ "apihelp-scribunto-console-param-title": "L títalo de l módulo a ser testado.",
+ "apihelp-scribunto-console-param-content": "L nuobo cuntenido de l módulo.",
+ "apihelp-scribunto-console-param-session": "Chabe de la sesson.",
+ "apihelp-scribunto-console-param-question": "La próssima lhinha a abaluar cumo un quemando.",
+ "apihelp-scribunto-console-param-clear": "Defenir pa lhimpar l stado de la sesson atual.",
+ "nstab-module": "Módulo",
+ "tooltip-ca-nstab-module": "Ber la páigina de l módulo"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/my.json b/www/wiki/extensions/Scribunto/i18n/my.json
new file mode 100644
index 00000000..3d7fd04d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/my.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ninjastrikers"
+ ]
+ },
+ "scribunto-lua-error": "Lua အမှား - $2။",
+ "nstab-module": "မော်ဂျူး"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/myv.json b/www/wiki/extensions/Scribunto/i18n/myv.json
new file mode 100644
index 00000000..a8369c98
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/myv.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Rueter"
+ ]
+ },
+ "scribunto-lua-error": "Lua ильведевкс: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/mzn.json b/www/wiki/extensions/Scribunto/i18n/mzn.json
new file mode 100644
index 00000000..9fd4c91d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/mzn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "محک"
+ ]
+ },
+ "scribunto-lua-error": "لوآ خطا: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/nan.json b/www/wiki/extensions/Scribunto/i18n/nan.json
new file mode 100644
index 00000000..2fb0ff91
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/nan.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ianbu",
+ "Luuva"
+ ]
+ },
+ "scribunto-common-error-category": "Tòa script gō͘-biū ê ia̍h",
+ "scribunto-lua-error": "Lua錯誤:$2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/nap.json b/www/wiki/extensions/Scribunto/i18n/nap.json
new file mode 100644
index 00000000..38e9d9b6
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/nap.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "C.R."
+ ]
+ },
+ "scribunto-lua-error": "Errore Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/nb.json b/www/wiki/extensions/Scribunto/i18n/nb.json
new file mode 100644
index 00000000..67afcf06
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/nb.json
@@ -0,0 +1,70 @@
+{
+ "@metadata": {
+ "authors": [
+ "Danmichaelo",
+ "Cocu",
+ "Jeblad",
+ "Jon Harald Søby"
+ ]
+ },
+ "scribunto-desc": "Rammeverk for å bygge inn scriptspråk i MediaWiki-sider",
+ "scribunto-line": "i linje $1",
+ "scribunto-module-line": "i $1, linje $2",
+ "scribunto-parser-dialog-title": "Skriptfeil",
+ "scribunto-error-short": "Skriptfeil: $1",
+ "scribunto-error-long": "Skriptfeil:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/dok",
+ "scribunto-doc-page-does-not-exist": "''Dokumentasjon for denne modulen kan opprettes på [[$1]]''",
+ "scribunto-doc-page-header": "'''Dette er dokumentasjonssiden for [[$1]]'''",
+ "scribunto-console-intro": "* Moduleksporteringer er tilgjengelig som variabelen «p», inkludert ulagrede endringer.\n* Start en linje med «=» for å evaluere den som et uttrykk, eller bruk print(). Bruk mw.logObject() for tabeller.\n* Bruk mw.log() og mw.logObject() i modulkode for å sende meldinger til denne konsollen.",
+ "scribunto-console-title": "Feilsøkingskonsoll",
+ "scribunto-console-too-large": "Denne konsollsesjonen er for stor. Vennligst tøm konsollhistorikken eller reduser størrelsen på modulen.",
+ "scribunto-console-current-src": "konsollinndata",
+ "scribunto-console-clear": "Tøm",
+ "scribunto-console-cleared": "Konsolltilstanden ble tømt siden modulen ble oppdatert.",
+ "scribunto-console-cleared-session-lost": "Konsolltilstanden ble tømt fordi sesjonsdata ble mistet.",
+ "scribunto-common-error-category": "Sider med skriptfeil",
+ "scribunto-common-error-category-desc": "En feil oppsto under prosessering av moduler som inkluderes på siden.",
+ "scribunto-common-nosuchmodule": "Skriptfeil: Ingen modul med navn «$2».",
+ "scribunto-common-nofunction": "Skriptfeil: Du må angi en funksjon som skal kalles.",
+ "scribunto-common-nosuchfunction": "Skriptfeil: Funksjonen «$2» eksisterer ikke.",
+ "scribunto-common-notafunction": "Skriptfeil: «$2» er ikke en funksjon.",
+ "scribunto-common-timeout": "Tiden som er avsatt til å kjøre skript har løpt ut.",
+ "scribunto-common-oom": "Mengden minne tillatt for å kjøre skript er overskredet.",
+ "scribunto-common-backtrace": "Tilbakesporing:",
+ "scribunto-common-no-details": "Ingen flere detaljer er tilgjengelig.",
+ "scribunto-lua-in-function": "i funksjon \"$1\"",
+ "scribunto-lua-in-main": "i hoveddelen",
+ "scribunto-lua-in-function-at": "i funksjonen ved $1:$2",
+ "scribunto-lua-error-location": "Lua-feil $1: $2.",
+ "scribunto-lua-error": "Lua-feil: $2.",
+ "scribunto-lua-notarrayreturn": "Skriptfeil: Modulen returnerte en $2-verdi. Det forventes at den returnerer en eksporttabell.",
+ "scribunto-luastandalone-proc-error": "Lua-feil: Kan ikke opprette prosess.",
+ "scribunto-luastandalone-proc-error-msg": "Lua-feil: Kan ikke opprette prosess: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Lua-feil: Kan ikke opprette prosess: proc_open er ikke tilgjengelig. Sjekk PHPs «disable_functions»-konfigurasjon.",
+ "scribunto-luastandalone-decode-error": "Lua-feil: Intern feil: Kunne ikke dekode meldingen.",
+ "scribunto-luastandalone-write-error": "Lua-feil: Intern feil: Feil ved skriving til rør.",
+ "scribunto-luastandalone-read-error": "Lua-feil: Intern feil: Feil ved lesing fra rør.",
+ "scribunto-luastandalone-gone": "Lua-feil: Intern feil: Fortolkeren har allerede avsluttet.",
+ "scribunto-luastandalone-signal": "Lua-feil: Intern feil: Fortolkeren har avsluttet med signal «$2».",
+ "scribunto-luastandalone-exited": "Lua-feil: Intern feil: Fortolkeren har avsluttet med status $2.",
+ "scribunto-module-with-errors-category": "Scribunto-moduler med feil",
+ "scribunto-module-with-errors-category-desc": "Modulen inneholder en feil",
+ "scribunto-limitreport-timeusage": "Lua tidsbruk",
+ "scribunto-limitreport-timeusage-value": "$1/$2 sekunder",
+ "scribunto-limitreport-virtmemusage": "Lua virtuell størrelse",
+ "scribunto-limitreport-estmemusage": "Lua beregnet minnebruk",
+ "scribunto-limitreport-memusage": "Lua minnebruk",
+ "scribunto-limitreport-profile": "Lua Profil",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Lua logger",
+ "apihelp-scribunto-console-description": "Intern modul for å behandle XHR-forespørsler fra Scribunto-konsollen.",
+ "apihelp-scribunto-console-summary": "Intern modul for å betjene XHR-forespørsler fra Scribunto-konsollen.",
+ "apihelp-scribunto-console-param-title": "Tittelen til modulen som testes",
+ "apihelp-scribunto-console-param-content": "Det nye innholdet til modulen",
+ "apihelp-scribunto-console-param-session": "Sessjonens token.",
+ "apihelp-scribunto-console-param-question": "Den neste linjen som skal kjøres som et script.",
+ "apihelp-scribunto-console-param-clear": "Sett for å slette den gjeldende sesjonstilstanden.",
+ "nstab-module": "Modul",
+ "tooltip-ca-nstab-module": "Vis modulsiden"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/nds-nl.json b/www/wiki/extensions/Scribunto/i18n/nds-nl.json
new file mode 100644
index 00000000..96c615a2
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/nds-nl.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Servien"
+ ]
+ },
+ "scribunto-lua-error": "Lua-fout: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ne.json b/www/wiki/extensions/Scribunto/i18n/ne.json
new file mode 100644
index 00000000..00ddb2f1
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ne.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "सरोज कुमार ढकाल",
+ "बिप्लब आनन्द",
+ "NehalDaveND"
+ ]
+ },
+ "scribunto-console-clear": "सफागर्ने",
+ "scribunto-lua-error": "लुआ त्रुटि: $2।",
+ "scribunto-module-with-errors-category": "स्क्रिबुन्टो मोड्युल त्रुटि सहित"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/nl.json b/www/wiki/extensions/Scribunto/i18n/nl.json
new file mode 100644
index 00000000..6f2d4e93
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/nl.json
@@ -0,0 +1,71 @@
+{
+ "@metadata": {
+ "authors": [
+ "Konovalov",
+ "SPQRobin",
+ "Saruman",
+ "Siebrand",
+ "Sjoerddebruin",
+ "Robin0van0der0vliet",
+ "HanV",
+ "Robin van der Vliet",
+ "Mainframe98"
+ ]
+ },
+ "scribunto-desc": "Framework voor het inbedden van scripttalen in pagina's",
+ "scribunto-line": "op regel $1",
+ "scribunto-module-line": "in $1 op regel $2",
+ "scribunto-parser-dialog-title": "Scriptfout",
+ "scribunto-error-short": "Scriptfout: $1",
+ "scribunto-error-long": "Scriptfouten:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''Documentatie voor deze module kan aangemaakt worden op de volgende pagina: [[$1]]''",
+ "scribunto-doc-page-header": "'''Dit is de documentatiepagina voor [[$1]]'''",
+ "scribunto-console-intro": "* De moduleexports zijn beschikbaar als de variabele \"p\", inclusief nog niet opgeslagen wijzigingen.\n* Begin een regel met \"=\" om deze als expressie te evalueren, of gebruik print(). Gebruik mw.logObject voor tabellen.\n* Gebruik mw.log() en mw.logObject() in modulecode om berichten aan deze console te zenden.",
+ "scribunto-console-title": "Debugconsole",
+ "scribunto-console-too-large": "Deze consolesessie is te groot. Wis de consolegeschiedenis of beperk de grootte van de module.",
+ "scribunto-console-current-src": "consoleinvoer",
+ "scribunto-console-clear": "Wissen",
+ "scribunto-console-cleared": "De consolestatus is gewist omdat de module is bijgewerkt.",
+ "scribunto-console-cleared-session-lost": "De consolestatus is gewist omdat de sessiegegevens verloren zijn gegaan.",
+ "scribunto-common-error-category": "Pagina's met scriptfouten",
+ "scribunto-common-error-category-desc": "Er is een fout opgetreden bij het verwerken van de modules ingesloten op de pagina.",
+ "scribunto-common-nosuchmodule": "Scriptfout: de module \"$2\" bestaat niet.",
+ "scribunto-common-nofunction": "Scriptfout: u moet een aan te roepen functie opgeven.",
+ "scribunto-common-nosuchfunction": "Scriptfout: de functie \"$2\" bestaat niet.",
+ "scribunto-common-notafunction": "Scriptfout: \"$2\" is geen functie.",
+ "scribunto-common-timeout": "De maximale uitvoertijd voor scripts is verlopen.",
+ "scribunto-common-oom": "De hoeveelheid geheugen die uitgevoerde scripts mogen gebruiken is overschreden.",
+ "scribunto-common-backtrace": "Backtrace:",
+ "scribunto-common-no-details": "Geen verdere gegevens beschikbaar.",
+ "scribunto-lua-in-function": "in functie \"$1\"",
+ "scribunto-lua-in-main": "in het hoofdgedeelte",
+ "scribunto-lua-in-function-at": "in de functie op $1:$2",
+ "scribunto-lua-error-location": "Luafout $1: $2",
+ "scribunto-lua-error": "Luafout: $2",
+ "scribunto-lua-notarrayreturn": "Scriptfout: de module heeft de waarde $2 teruggegeven. Dit moet een exporttabel zijn.",
+ "scribunto-luastandalone-proc-error": "Luafout: het was niet mogelijk een proces te creëren.",
+ "scribunto-luastandalone-proc-error-msg": "Luafout: kan proces niet aanmaken: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Luafout: kan proces niet maken: proc_open is niet beschikbaar. Controleer de PHP-instelling \"disable_functions\".",
+ "scribunto-luastandalone-decode-error": "Luafout: interne fout: het was niet mogelijk het bericht te decoderen.",
+ "scribunto-luastandalone-write-error": "Luafout: interne fout: fout tijdens het schrijven naar de pipe.",
+ "scribunto-luastandalone-read-error": "Luafout: interne fout: fout tijdens het lezen van de pipe.",
+ "scribunto-luastandalone-gone": "Luafout: interne fout: de verwerkingsmodule is al klaar",
+ "scribunto-luastandalone-signal": "Luafout: interne fout: de verwerkingsmodule is gestopt met het signaal \"$2\".",
+ "scribunto-luastandalone-exited": "Luafout: interne fout: de verwerkingsmodule is gestopt met de status $2.",
+ "scribunto-module-with-errors-category": "Scribuntomodules met fouten",
+ "scribunto-module-with-errors-category-desc": "Deze module bevat een fout.",
+ "scribunto-limitreport-timeusage": "Tijdgebruik door Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 seconden",
+ "scribunto-limitreport-virtmemusage": "Virtuele grootte van Lua",
+ "scribunto-limitreport-estmemusage": "Geschat geheugengebruik door Lua",
+ "scribunto-limitreport-memusage": "Geheugengebruik door Lua",
+ "scribunto-limitreport-profile": "Luaprofiel",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Lua logboeken",
+ "apihelp-scribunto-console-param-title": "De titel van de module om te testen.",
+ "apihelp-scribunto-console-param-content": "De nieuwe inhoud van de module.",
+ "apihelp-scribunto-console-param-session": "Sessiesleutel.",
+ "nstab-module": "Module",
+ "tooltip-ca-nstab-module": "Modulepagina bekijken"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/nn.json b/www/wiki/extensions/Scribunto/i18n/nn.json
new file mode 100644
index 00000000..f8acad57
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/nn.json
@@ -0,0 +1,57 @@
+{
+ "@metadata": {
+ "authors": [
+ "Njardarlogar"
+ ]
+ },
+ "scribunto-desc": "Rammeverk for å byggja inn skriptspråk i MediaWiki-sider",
+ "scribunto-line": "på line $1",
+ "scribunto-module-line": "i $1, line $2",
+ "scribunto-parser-dialog-title": "Skriptfeil",
+ "scribunto-error-short": "Skriptfeil: $1",
+ "scribunto-error-long": "Skriptfeil:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/dok",
+ "scribunto-doc-page-does-not-exist": "''Dokumentasjon for modulen kan opprettast på [[$1]]''",
+ "scribunto-doc-page-header": "'''Dette er dokumentasjonssida for [[$1]]'''",
+ "scribunto-console-intro": "* Moduleksporteringar er tilgjengelege som variabelen «p», inkludert ulagra endringar.\n* Byrj ei line med «=» for å evaluera henne som eit uttrykk, eller bruk print().\n* Bruk mw.log() i modulkoden for å senda meldingar til denne konsollen.",
+ "scribunto-console-title": "Feilsøkingskonsoll",
+ "scribunto-console-too-large": "Konsolløkta er for stor. Tøm konsollhistorikken eller minsk storleiken på modulen.",
+ "scribunto-console-current-src": "konsollinndata",
+ "scribunto-console-clear": "Tøm",
+ "scribunto-console-cleared": "Konsollstoda vart tømd av di modulen vart oppdatert.",
+ "scribunto-console-cleared-session-lost": "Konsollstoda vart tømd av di øktdataa vart tapte.",
+ "scribunto-common-error-category": "Sider med skriptfeil",
+ "scribunto-common-error-category-desc": "Det oppstod ein feil under handsaminga av modulane inkluderte på sida.",
+ "scribunto-common-nosuchmodule": "Skriptfeil: Modulen «$2» finst ikkje.",
+ "scribunto-common-nofunction": "Skriptfeil: du lyt oppgje ein funksjon som skal kallast.",
+ "scribunto-common-nosuchfunction": "Skriptfeil: funksjonen «$2» finst ikkje.",
+ "scribunto-common-timeout": "Tida tildelt skriptkøyring har gått ut.",
+ "scribunto-common-oom": "Mengda minne tildelt skriptkøyring er overstigen.",
+ "scribunto-common-backtrace": "Attendesporing:",
+ "scribunto-common-no-details": "Fleire detaljar er ikkje tilgjengelege.",
+ "scribunto-lua-in-function": "i funksjonen «$1»",
+ "scribunto-lua-in-main": "i hovuddelen",
+ "scribunto-lua-in-function-at": "i funksjonen ved $1:$2",
+ "scribunto-lua-error-location": "Lua-feil $1: $2.",
+ "scribunto-lua-error": "Lua-feil: $2.",
+ "scribunto-lua-notarrayreturn": "Skriptfeil: modulen returnerte noko anna enn ein tabell. Han er meint å returnera ein eksporteringstabell.",
+ "scribunto-luastandalone-proc-error": "Lua-feil: kan ikkje oppretta prosess.",
+ "scribunto-luastandalone-proc-error-msg": "Lua-feil: kan ikkje oppretta prosess: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Lua-feil: kan ikkje oppretta prosess: proc_open er ikkje tilgjengeleg. Sjekk «disable_functions»- innstillingsdirektivet til PHP.",
+ "scribunto-luastandalone-decode-error": "Lua-feil: Intern feil: kan ikkje avkoda melding.",
+ "scribunto-luastandalone-write-error": "Lua-feil: Intern feil: feil under skriving til røyret.",
+ "scribunto-luastandalone-read-error": "Lua-feil: Intern feil: feil under lesing av røyret.",
+ "scribunto-luastandalone-gone": "Lua-feil: Intern feil: tolkaren har alt avslutta.",
+ "scribunto-luastandalone-signal": "Lua-feil: Intern feil: tolkaren har avslutta med signalet «$2».",
+ "scribunto-luastandalone-exited": "Lua-feil: Intern feil: tolkaren avslutta med stoda $2.",
+ "scribunto-module-with-errors-category": "Skribunto-modular med feil",
+ "scribunto-module-with-errors-category-desc": "Modulen inneheld ein feil.",
+ "scribunto-limitreport-timeusage": "Tidsbruk av Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 sekund",
+ "scribunto-limitreport-virtmemusage": "Virtuell storleik for Lua",
+ "scribunto-limitreport-estmemusage": "Estimert minnebruk av Lua",
+ "scribunto-limitreport-memusage": "Minnebruk av Lua",
+ "scribunto-limitreport-profile": "Lua-profil",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Lua-loggar"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/nys.json b/www/wiki/extensions/Scribunto/i18n/nys.json
new file mode 100644
index 00000000..2cf5a07e
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/nys.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gnangarra"
+ ]
+ },
+ "scribunto-lua-error": "Lua error: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/oc.json b/www/wiki/extensions/Scribunto/i18n/oc.json
new file mode 100644
index 00000000..110a99cd
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/oc.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "Cedric31"
+ ]
+ },
+ "scribunto-common-error-category": "Paginas amb d'errors d'escript",
+ "scribunto-common-error-category-desc": "I a agut una error al moment del tractament dels moduls contenguts sus la pagina.",
+ "scribunto-common-nosuchmodule": "Error d'escript : lo modul « $2 » existís pas.",
+ "scribunto-common-nosuchfunction": "Error d'escript : la foncion « $2 » existís pas.",
+ "scribunto-common-no-details": "Cap de detalh mai es pas disponible.",
+ "scribunto-lua-error": "Error de Lua : $2.",
+ "scribunto-luastandalone-gone": "Error LUA : Error intèrna : L'interpretador s'es ja arrestat.",
+ "scribunto-luastandalone-signal": "Error LUA : Error intèrna: L'interpretador s'es arrestat amb lo senhal « $2 »."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/olo.json b/www/wiki/extensions/Scribunto/i18n/olo.json
new file mode 100644
index 00000000..55e434e4
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/olo.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Denö"
+ ]
+ },
+ "scribunto-lua-error": "Lua-haireh: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/or.json b/www/wiki/extensions/Scribunto/i18n/or.json
new file mode 100644
index 00000000..cf87349d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/or.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jnanaranjan Sahu",
+ "Psubhashish"
+ ]
+ },
+ "scribunto-lua-error": "ଲୁଆ ତ୍ରୁଟି: $2 ।"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/pa.json b/www/wiki/extensions/Scribunto/i18n/pa.json
new file mode 100644
index 00000000..612a2b01
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/pa.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Babanwalia"
+ ]
+ },
+ "scribunto-lua-error": "ਲੂਆ ਗ਼ਲਤੀ: $2।"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/pfl.json b/www/wiki/extensions/Scribunto/i18n/pfl.json
new file mode 100644
index 00000000..06784aaf
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/pfl.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Manuae"
+ ]
+ },
+ "scribunto-lua-error": "Lua-Fehla: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/pl.json b/www/wiki/extensions/Scribunto/i18n/pl.json
new file mode 100644
index 00000000..210a2cf8
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/pl.json
@@ -0,0 +1,73 @@
+{
+ "@metadata": {
+ "authors": [
+ "Beau",
+ "Chrumps",
+ "Jacenty359",
+ "Matma Rex",
+ "WTM",
+ "Pio387",
+ "Darellur",
+ "Woytecr"
+ ]
+ },
+ "scribunto-desc": "Framework pozwalający na osadzanie języków skryptowych na stronach MediaWiki",
+ "scribunto-line": "w linii $1",
+ "scribunto-module-line": "w module „$1”, w linii $2",
+ "scribunto-parser-dialog-title": "Błąd skryptu",
+ "scribunto-error-short": "Błąd skryptu: $1",
+ "scribunto-error-long": "Błędy skryptu:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/opis",
+ "scribunto-doc-page-does-not-exist": "''Dokumentacja dla tego modułu może zostać utworzona pod nazwą [[$1]]''",
+ "scribunto-doc-page-header": "'''To jest strona dokumentacji dla [[$1]]'''",
+ "scribunto-console-intro": "* Eksportowana zawartość modułu jest dostępna pod zmienną \"p\", włącznie z niezapisanymi zmianami.\n* Poprzedź linię \"=\", aby wykonać ją jako wyrażenie lub użyj print().\n* Użyj mw.log() w kodzie modułu, aby wysyłać wiadomości do tej konsoli.",
+ "scribunto-console-title": "Konsola debugowania",
+ "scribunto-console-too-large": "Ta sesja konsoli jest za duża. Wyczyść historię konsoli lub zmniejsz rozmiar modułu.",
+ "scribunto-console-current-src": "wejście z konsoli",
+ "scribunto-console-clear": "Wyczyść",
+ "scribunto-console-cleared": "Stan konsoli został wyczyszczony, ponieważ moduł został zaktualizowany",
+ "scribunto-console-cleared-session-lost": "Stan konsoli został wyczyszczony, ponieważ zostały utracone dane sesji.",
+ "scribunto-common-error-category": "Strony z błędami skryptów",
+ "scribunto-common-error-category-desc": "Wystąpił błąd podczas przetwarzania modułów zawartych na stronie.",
+ "scribunto-common-nosuchmodule": "Błąd skryptu: nie ma takiego modułu „$2”.",
+ "scribunto-common-nofunction": "Błąd skryptu: nie została podana nazwa funkcji.",
+ "scribunto-common-nosuchfunction": "Błąd skryptu: nie ma takiej funkcji „$2”.",
+ "scribunto-common-notafunction": "Błąd skryptu: „$2” nie jest funkcją.",
+ "scribunto-common-timeout": "Upłynął czas przewidziany do wykonywania skryptów.",
+ "scribunto-common-oom": "Przekroczona wielkość pamięci przewidziana do wykonywania skryptów.",
+ "scribunto-common-backtrace": "Backtrace:",
+ "scribunto-common-no-details": "Żadne dalsze szczegóły nie są dostępne.",
+ "scribunto-lua-in-function": "w funkcji „$1”",
+ "scribunto-lua-in-main": "w głównym bloku",
+ "scribunto-lua-in-function-at": "w funkcji na $1: $2",
+ "scribunto-lua-error-location": "Błąd Lua $1: $2.",
+ "scribunto-lua-error": "Błąd Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Błąd skryptu: Moduł zwrócił wartość $2. Oczekiwano, że zwróci tabelę eksportu.",
+ "scribunto-luastandalone-proc-error": "Błąd Lua: Nie można utworzyć procesu.",
+ "scribunto-luastandalone-proc-error-msg": "Błąd Lua: Nie można utworzyć procesu: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Błąd Lua: Nie można utworzyć procesu: proc_open nie jest dostępny. Sprawdź dyrektywę \"disable_functions\" w konfiguracji PHP.",
+ "scribunto-luastandalone-decode-error": "Błąd Lua: Błąd wewnętrzny: Nie można zdekodować wiadomości.",
+ "scribunto-luastandalone-write-error": "Błąd Lua: Błąd wewnętrzny: Błąd zapisu do potoku.",
+ "scribunto-luastandalone-read-error": "Błąd Lua: Błąd wewnętrzny: Błąd czytania z potoku.",
+ "scribunto-luastandalone-gone": "Błąd Lua: Błąd wewnętrzny: Interpreter już zakończył pracę.",
+ "scribunto-luastandalone-signal": "Błąd Lua: Błąd wewnętrzny: Proces interpretera został zakończony z sygnałem \"$2\".",
+ "scribunto-luastandalone-exited": "Błąd Lua: Błąd wewnętrzny: Interpreter zakończył pracę ze statusem $2",
+ "scribunto-module-with-errors-category": "Moduły Scribunto zawierające błędy",
+ "scribunto-module-with-errors-category-desc": "Moduł zawiera błąd.",
+ "scribunto-limitreport-timeusage": "Czas użytkowania Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 sekund",
+ "scribunto-limitreport-virtmemusage": "Wirtualny rozmiar Lua",
+ "scribunto-limitreport-estmemusage": "Szacunkowe zużycie pamięci Lua",
+ "scribunto-limitreport-memusage": "Użycie pamięci Lua",
+ "scribunto-limitreport-profile": "Profil Lua",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Rejestry Lua",
+ "apihelp-scribunto-console-description": "Wewnętrzny moduł obsługi żądań XHR z konsoli Scribunto.",
+ "apihelp-scribunto-console-param-title": "Tytuł modułu do przetestowania.",
+ "apihelp-scribunto-console-param-content": "Nowa zawartość modułu.",
+ "apihelp-scribunto-console-param-session": "Token sesji.",
+ "apihelp-scribunto-console-param-question": "Następny wiersz do wykonania jako skrypt.",
+ "apihelp-scribunto-console-param-clear": "Ustaw, aby wyczyścić stan bieżącej sesji",
+ "nstab-module": "Moduł",
+ "tooltip-ca-nstab-module": "Zobacz stronę modułu"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/pms.json b/www/wiki/extensions/Scribunto/i18n/pms.json
new file mode 100644
index 00000000..72bdc514
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/pms.json
@@ -0,0 +1,41 @@
+{
+ "@metadata": {
+ "authors": [
+ "Borichèt",
+ "Dragonòt",
+ "පසිඳු කාවින්ද"
+ ]
+ },
+ "scribunto-desc": "Quàder për l'antëgrassion dij langagi ëd copin an dle pàgine ëd MediaWiki",
+ "scribunto-line": "a la linia $1",
+ "scribunto-module-line": "an $1 a la linia $2",
+ "scribunto-parser-dialog-title": "Eror ëd copion",
+ "scribunto-error-short": "Eror ëd copion: $1",
+ "scribunto-error-long": "Eror ëd copion:\n\n$1",
+ "scribunto-console-intro": "* J'esportassion ëd mòdul a son disponìbij com la variàbil «p», comprèise le modìfiche nen salvà.\n* Ch'a ancamin-a na linia con «=» për valutela com n'espression, o ch'a deuvra print().\n* Ch'a deuvra mw.log() ant ël còdes dël mòdul për mandé dij mëssagi a costa plancia.",
+ "scribunto-console-title": "Plancia d'eliminassion dij givo",
+ "scribunto-console-too-large": "Sta session ëd plancia a l'é tròp gròssa. Për piasì, ch'a scancela la stòria dla plancia o ch'a riduv la dimension dël mòdul.",
+ "scribunto-console-current-src": "anseriment ëd la plancia",
+ "scribunto-console-clear": "Scancela",
+ "scribunto-console-cleared": "Lë stat ëd la plancia a l'é stàit ëscancelà përché ël mòdul a l'é stàit agiornà.",
+ "scribunto-common-error-category": "Pàgine con eror ëd copion",
+ "scribunto-common-nosuchmodule": "Eror ëd copion: Gnun mòduj parèj.",
+ "scribunto-common-nofunction": "Eror ëd copion. A dev specifiché na funsion da ciamé.",
+ "scribunto-common-nosuchfunction": "Eror ëd copion. La funsion ch'a l'ha specificà a esist nen.",
+ "scribunto-common-timeout": "Ël temp assignà për fé andé ij copion a l'é finì.",
+ "scribunto-common-oom": "La quantità ëd memòria assignà për fé marcé ij copion a l'é stàita sorpassà.",
+ "scribunto-common-backtrace": "Marca andré:",
+ "scribunto-lua-in-function": "ant la funsion \"$1\"",
+ "scribunto-lua-in-main": "ant ël blòch prinsipal",
+ "scribunto-lua-in-function-at": "ant la funsion a $1:$2",
+ "scribunto-lua-error-location": "Eror Lua $1: $2.",
+ "scribunto-lua-error": "Eror Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Eror ëd copion: Ël mòdul a l'ha dàit quaicòs d'àutr nopà che na tàula. A dovrìa dé na tàula d'esportassion.",
+ "scribunto-luastandalone-proc-error": "Eror Lua: As peul pa creesse un process.",
+ "scribunto-luastandalone-decode-error": "Eror Lua: Eror intern: A peul pa decodifichesse ël mëssagi.",
+ "scribunto-luastandalone-write-error": "Eror Lua: Eror intern: Eror scrivend ant ël canal.",
+ "scribunto-luastandalone-read-error": "Eror Lua: Eror intern: Eror ëd letura dal canal.",
+ "scribunto-luastandalone-gone": "Eror Lua: Eror intern: L'antérpret a l'ha già finì.",
+ "scribunto-luastandalone-signal": "Eror Lua: Eror intern: L'antérpret a l'ha finì con ël signal «$2».",
+ "scribunto-luastandalone-exited": "Eror Lua: Eror intern: L'antérpret a l'ha finì con lë statù $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/pnb.json b/www/wiki/extensions/Scribunto/i18n/pnb.json
new file mode 100644
index 00000000..24de392f
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/pnb.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Khalid Mahmood"
+ ]
+ },
+ "scribunto-lua-error": "لوا غلطی:$2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/prs.json b/www/wiki/extensions/Scribunto/i18n/prs.json
new file mode 100644
index 00000000..e9355391
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/prs.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Mjbmr"
+ ]
+ },
+ "scribunto-lua-error": "خطای لوآ: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ps.json b/www/wiki/extensions/Scribunto/i18n/ps.json
new file mode 100644
index 00000000..43fbe279
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ps.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ahmed-Najib-Biabani-Ibrahimkhel"
+ ]
+ },
+ "scribunto-lua-error": "لوا تېروتنه: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/pt-br.json b/www/wiki/extensions/Scribunto/i18n/pt-br.json
new file mode 100644
index 00000000..c134127f
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/pt-br.json
@@ -0,0 +1,78 @@
+{
+ "@metadata": {
+ "authors": [
+ "Cainamarques",
+ "Helder.wiki",
+ "Jaideraf",
+ "Jefersonmoraes",
+ "He7d3r",
+ "Luan",
+ "Felipe L. Ewald",
+ "Eduardo Addad de Oliveira"
+ ]
+ },
+ "scribunto-desc": "Estrutura para incorporar linguagens de script em páginas do MediaWiki",
+ "scribunto-line": "na linha $1",
+ "scribunto-module-line": "em $1 na linha $2",
+ "scribunto-parser-dialog-title": "Erro de script",
+ "scribunto-error-short": "Erro de script: $1",
+ "scribunto-error-long": "Erros de script:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''A documentação para este módulo pode ser criada em [[$1]]''",
+ "scribunto-doc-page-header": "'''Esta é a página de documentação para [[$1]]'''",
+ "scribunto-console-intro": "* As exportações do módulo estão disponíveis por meio da variável \"p\", incluindo alterações não gravadas.\n* Preceda a linha com \"=\" para esta ser calculada como uma expressão, ou utilize print(). Use mw.logObject() para tabelas.\n* Use mw.log() e mw.logObject() no código do módulo para enviar mensagens para esta consola.",
+ "scribunto-console-title": "Interpretador de depuração de erros",
+ "scribunto-console-too-large": "Esta sessão do interpretador está muito grande. Por favor, limpe o histórico do interpretador ou reduza o tamanho do módulo.",
+ "scribunto-console-current-src": "entrada do interpretador",
+ "scribunto-console-clear": "Limpar",
+ "scribunto-console-cleared": "O estado do interpretador foi esvaziado porque o módulo foi atualizado.",
+ "scribunto-console-cleared-session-lost": "O estado do interpretador foi esvaziado porque os dados de sessão foram perdidos.",
+ "scribunto-common-error-category": "Páginas com erros de sequência de comandos",
+ "scribunto-common-error-category-desc": "Ocorreu um erro ao processar os módulos incluídos na página.",
+ "scribunto-common-nosuchmodule": "Erro de script: Nenhum módulo desse tipo \"$2\".",
+ "scribunto-common-nofunction": "Erro de script: você deve especificar uma função para chamar.",
+ "scribunto-common-nosuchfunction": "Erro de script: A função \"$2\" não existe.",
+ "scribunto-common-notafunction": "Error de script: \"$2\" não é uma função.",
+ "scribunto-common-timeout": "O tempo alocado para a execução de scripts expirou.",
+ "scribunto-common-oom": "A quantidade de memória permitida para a execução de scripts foi excedida.",
+ "scribunto-common-backtrace": "Backtrace:",
+ "scribunto-common-no-details": "Não há mais detalhes disponíveis.",
+ "scribunto-lua-in-function": "na função \"$1\"",
+ "scribunto-lua-in-main": "na parte principal",
+ "scribunto-lua-in-function-at": "na função em $1:$2",
+ "scribunto-lua-backtrace-line": "$1: $2",
+ "scribunto-lua-error-location": "Erro em Lua $1: $2.",
+ "scribunto-lua-error": "Erro em lua: $2.",
+ "scribunto-lua-notarrayreturn": "Erro de script: O módulo retornou um valor de $2. Devia ter retornado uma tabela de exportação.",
+ "scribunto-luastandalone-proc-error": "Erro em Lua: impossível criar o processo.",
+ "scribunto-luastandalone-proc-error-msg": "Erro em Lua: Não é possível criar o processo: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Erro em Lua: Não é possível criar o processo: proc_open não está disponível. Verifique a diretiva de configuração \"disable_functions\".",
+ "scribunto-luastandalone-decode-error": "Erro em Lua: erro interno: não foi possível decodificar a mensagem.",
+ "scribunto-luastandalone-write-error": "Erro em Lua: erro interno: erro ao gravar pipe.",
+ "scribunto-luastandalone-read-error": "Erro em Lua: erro interno: erro ao ler do pipe.",
+ "scribunto-luastandalone-gone": "Erro em Lua: erro interno: o interpretador já foi encerrado.",
+ "scribunto-luastandalone-signal": "Erro em Lua: erro interno: o interpretador foi finalizado com o sinal \"$2\".",
+ "scribunto-luastandalone-exited": "Erro em Lua: erro interno: o interpretador saiu com status $2.",
+ "scribunto-module-with-errors-category": "Módulos Scribunto com erros",
+ "scribunto-module-with-errors-category-desc": "O módulo tem um erro.",
+ "scribunto-limitreport-timeusage": "Uso de tempo em Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 segundos",
+ "scribunto-limitreport-virtmemusage": "Tamanho virtual em Lua",
+ "scribunto-limitreport-virtmemusage-value": "$1/$2",
+ "scribunto-limitreport-estmemusage": "Estimativa do uso de memória em Lua",
+ "scribunto-limitreport-memusage": "Uso de memória em Lua",
+ "scribunto-limitreport-memusage-value": "$1/$2",
+ "scribunto-limitreport-profile": "Perfil em Lua",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-profile-percent": "$1%",
+ "scribunto-limitreport-logs": "Logs Lua",
+ "apihelp-scribunto-console-description": "Módulo interno para atender solicitações XHR a partir do console Scribunto.",
+ "apihelp-scribunto-console-summary": "Módulo interno para atender solicitações XHR a partir do console Scribunto.",
+ "apihelp-scribunto-console-param-title": "O título do módulo a ser testado.",
+ "apihelp-scribunto-console-param-content": "O novo conteúdo do módulo.",
+ "apihelp-scribunto-console-param-session": "Token da sessão.",
+ "apihelp-scribunto-console-param-question": "A próxima linha para avaliar como um script.",
+ "apihelp-scribunto-console-param-clear": "Marque para limpar o estado da sessão atual.",
+ "nstab-module": "Módulo",
+ "tooltip-ca-nstab-module": "Ver a página do módulo"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/pt.json b/www/wiki/extensions/Scribunto/i18n/pt.json
new file mode 100644
index 00000000..637708d5
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/pt.json
@@ -0,0 +1,74 @@
+{
+ "@metadata": {
+ "authors": [
+ "Helder.wiki",
+ "Imperadeiro98",
+ "SandroHc",
+ "Vitorvicentevalente",
+ "He7d3r",
+ "Luan",
+ "Hamilton Abreu",
+ "McDutchie"
+ ]
+ },
+ "scribunto-desc": "Fornece uma estrutura para incorporação de linguagens de comandos (''scripting'') em páginas do MediaWiki",
+ "scribunto-line": "na linha $1",
+ "scribunto-module-line": "em $1 na linha $2",
+ "scribunto-parser-dialog-title": "Erro no script",
+ "scribunto-error-short": "Erro no script: $1",
+ "scribunto-error-long": "Erro no script:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''A documentação para este módulo pode ser criada na página [[$1]]''",
+ "scribunto-doc-page-header": "'''Esta é a página de documentação de [[$1]]'''",
+ "scribunto-console-intro": "* As exportações do módulo estão disponíveis por meio da variável \"p\", incluindo alterações não gravadas.\n* Preceda a linha com \"=\" para esta ser calculada como uma expressão, ou utilize print(). Use mw.logObject() para tabelas.\n* Use mw.log() e mw.logObject() no código do módulo para enviar mensagens para esta consola.",
+ "scribunto-console-title": "Consola de despiste de erros",
+ "scribunto-console-too-large": "Esta sessão de consola é demasiado grande. Por favor, limpe o histórico da consola ou reduza o tamanho do módulo.",
+ "scribunto-console-current-src": "entrada da consola",
+ "scribunto-console-clear": "Limpar",
+ "scribunto-console-cleared": "O estado da consola foi reiniciado porque o módulo foi atualizado.",
+ "scribunto-console-cleared-session-lost": "O estado da consola foi reiniciado porque os dados da sessão foram perdidos.",
+ "scribunto-common-error-category": "Páginas com erros de comandos",
+ "scribunto-common-error-category-desc": "Ocorreu um erro ao processar os módulos incluídos na página.",
+ "scribunto-common-nosuchmodule": "Erro de comando: Não existe nenhum módulo \"$2\".",
+ "scribunto-common-nofunction": "Erro de comando: Tem de especificar uma função a ser chamada.",
+ "scribunto-common-nosuchfunction": "Erro de comando: A função \"$2\" não existe.",
+ "scribunto-common-notafunction": "Erro de comando: \"$2\" não é uma função.",
+ "scribunto-common-timeout": "O tempo dedicado à execução de comandos expirou.",
+ "scribunto-common-oom": "A quantidade de memória permitida para execução de comandos foi excedida.",
+ "scribunto-common-backtrace": "Chamadas ativas (''backtrace''):",
+ "scribunto-common-no-details": "Não estão disponíveis mais detalhes.",
+ "scribunto-lua-in-function": "na função \"$1\"",
+ "scribunto-lua-in-main": "na parte principal",
+ "scribunto-lua-in-function-at": "na função em $1:$2",
+ "scribunto-lua-error-location": "Erro Lua $1: $2.",
+ "scribunto-lua-error": "Erro Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Erro de comando: O módulo devolveu um valor $2. É suposto que devolva uma tabela de exportação.",
+ "scribunto-luastandalone-proc-error": "Erro Lua: Não é possível criar o processo.",
+ "scribunto-luastandalone-proc-error-msg": "Erro Lua: Não é possível criar o seguinte processo: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Erro Lua: Não foi possível criar o processo: proc_open não está disponível. Verifique a diretiva de configuração \"disable_functions\" do PHP.",
+ "scribunto-luastandalone-decode-error": "Erro Lua: Erro interno: não é possível descodificar a mensagem.",
+ "scribunto-luastandalone-write-error": "Erro Lua: Erro interno: ocorreu um erro ao escrever no ''pipe''.",
+ "scribunto-luastandalone-read-error": "Erro Lua: Erro interno: ocorreu um erro ao ler do ''pipe''.",
+ "scribunto-luastandalone-gone": "Erro Lua: Erro interno: o interpretador já terminou.",
+ "scribunto-luastandalone-signal": "Erro Lua: Erro interno: o interpretador terminou com o sinal \"$2\".",
+ "scribunto-luastandalone-exited": "Erro Lua: Erro interno: o interpretador terminou com o estado $2.",
+ "scribunto-module-with-errors-category": "Módulos Scribunto com erros",
+ "scribunto-module-with-errors-category-desc": "O módulo tem um erro.",
+ "scribunto-limitreport-timeusage": "Tempo de utilização de Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 segundos",
+ "scribunto-limitreport-virtmemusage": "Tamanho virtual de Lua",
+ "scribunto-limitreport-estmemusage": "Estimativa do uso de memória de Lua",
+ "scribunto-limitreport-memusage": "Uso de memória de Lua",
+ "scribunto-limitreport-profile": "Perfil de Lua",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Registos Lua",
+ "apihelp-scribunto-console-description": "Módulo interno para responder a pedidos XHR vindos da consola Scribunto.",
+ "apihelp-scribunto-console-summary": "Módulo interno para responder a pedidos XHR vindos da consola Scribunto.",
+ "apihelp-scribunto-console-param-title": "O título do módulo a ser testado.",
+ "apihelp-scribunto-console-param-content": "O novo conteúdo do módulo.",
+ "apihelp-scribunto-console-param-session": "Chave da sessão.",
+ "apihelp-scribunto-console-param-question": "A próxima linha a calcular como um comando.",
+ "apihelp-scribunto-console-param-clear": "Definir para limpar o estado da sessão atual.",
+ "nstab-module": "Módulo",
+ "tooltip-ca-nstab-module": "Ver a página do módulo"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/qqq.json b/www/wiki/extensions/Scribunto/i18n/qqq.json
new file mode 100644
index 00000000..3815dd5b
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/qqq.json
@@ -0,0 +1,84 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Anomie",
+ "Gomada",
+ "Mormegil",
+ "Nemo bis",
+ "Raymond",
+ "Shirayuki",
+ "Siebrand",
+ "Snævar",
+ "Liuxinyu970226",
+ "Umherirrender",
+ "Base"
+ ]
+ },
+ "scribunto-desc": "{{desc|name=Scribunto|url=https://www.mediawiki.org/wiki/Extension:Scribunto}}",
+ "scribunto-line": "Used as reference to a code location. Parameters:\n* $1 - a line number\nSee also:\n* {{msg-mw|Scribunto-module-line}}",
+ "scribunto-module-line": "Used as reference to a code location. Parameters:\n* $1 - a module (may also be {{msg-mw|Scribunto-console-current-src}})\n* $2 - a line number\nSee also:\n* {{msg-mw|Scribunto-line}}",
+ "scribunto-parser-dialog-title": "Error message.",
+ "scribunto-error-short": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|Scribunto-error-long}}",
+ "scribunto-error-long": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|Scribunto-error-short}}",
+ "scribunto-doc-page-name": "{{doc-important|Do not translate the namespace \"Module:\"}}\nPage name for module documentation. Parameters:\n* $1 - the unprefixed name of the module",
+ "scribunto-doc-page-does-not-exist": "Message displayed if the documentation page does not exist. Parameters:\n* $1 - the prefixed title of the doc page",
+ "scribunto-doc-page-show": "Message displayed if the documentation page does exist. Parameters:\n* $1 - the prefixed title of the doc page. Should probably transclude that page",
+ "scribunto-doc-page-header": "Message displayed at the top of the documentation page. Parameters:\n* $1 - the prefixed title of the module",
+ "scribunto-console-intro": "An explanatory message shown to module programmers in the debug console, where they can run Lua commands and see how they work.\n\n\"Module exports\" are the names that are exported. See the chapter [http://www.lua.org/pil/15.2.html Privacy] in the book \"Programming in Lua\".",
+ "scribunto-console-title": "Legend for the debug console fieldset",
+ "scribunto-console-too-large": "Error message displayed when the console history contains too much data.",
+ "scribunto-console-current-src": "Name of the fictional Lua module created in the debugging console.\n\nMay appear e.g. in Lua error messages (like <code>$1</code> in {{msg-mw|Scribunto-module-line}})",
+ "scribunto-console-clear": "Used as button text which enables to clear the console.\n{{Identical|Clear}}",
+ "scribunto-console-cleared": "Message displayed in the console when the module source has been changed.",
+ "scribunto-console-cleared-session-lost": "Message displayed in the console when the session has expired.",
+ "scribunto-common-error-category": "Tracking category for pages with errors from #invoke",
+ "scribunto-common-error-category-desc": "Description on [[Special:TrackingCategories]] for the {{msg-mw|scribunto-common-error-category}} tracking category.",
+ "scribunto-common-nosuchmodule": "Error message displayed when referencing a non-existing module. Parameters:\n* $1 - (Unused)\n* $2 - the title of the module",
+ "scribunto-common-nofunction": "Error message displayed when not specifying a function to call.",
+ "scribunto-common-nosuchfunction": "Error message displayed when referencing a non-existing function. Parameters:\n* $1 - (Unused)\n* $2 - the name of the function",
+ "scribunto-common-notafunction": "Error message displayed when referencing an element that isn't a function. Parameters:\n* $1 - (Unused)\n* $2 - the name of the element",
+ "scribunto-common-timeout": "Error message displayed when script execution has passed a threshold.",
+ "scribunto-common-oom": "Error message displayed when the script requires more memory than the threshold.",
+ "scribunto-common-backtrace": "A backtrace is a list of the function calls that are currently active in a thread. This message is followed by a backtrace.",
+ "scribunto-common-no-details": "Displayed in the error dialog when there are no details available other than the error message itself.",
+ "scribunto-lua-in-function": "Reference to a function name.\n\nUsed as <code>$2</code> in {{msg-mw|Scribunto-lua-backtrace-line}} (Optional message).\n\nParameters:\n* $1 - a function name",
+ "scribunto-lua-in-main": "Part of the backtrace creation routines. Refers to the main part of the code.\n\nUsed as <code>$2</code> in {{msg-mw|Scribunto-lua-backtrace-line}} (Optional message).",
+ "scribunto-lua-in-function-at": "Unused at this time.\n\nPart of the backtrace creation routines.\n\nParameters:\n* $1 - a function name\n* $2 - a line number",
+ "scribunto-lua-backtrace-line": "{{optional}}\nParameters:\n* $1 - src\n* $2 - any one of the following:\n** {{msg-mw|Scribunto-lua-in-function}}\n** {{msg-mw|Scribunto-lua-in-main}}\n** \"?\" (hard-coded)",
+ "scribunto-lua-error-location": "Error message when module and line are given. Parameters:\n* $1 - code line from {{msg-mw|Scribunto-line}} or {{msg-mw|Scribunto-module-line}}\n* $2 - error message, not localized. (e.g. \"too many language codes requested\")",
+ "scribunto-lua-error": "Error message. Parameters:\n* $1 - (Unused)\n* $2 - error message, not localized. (e.g. \"too many language codes requested\")",
+ "scribunto-lua-notarrayreturn": "Error message. Parameters:\n* $1 - (Unused)\n* $2 - Type of value returned by the module",
+ "scribunto-luastandalone-proc-error": "Exception message.",
+ "scribunto-luastandalone-proc-error-msg": "Exception message. Parameters:\n* $1 - (Unused)\n* $2 - Warning/error text from PHP",
+ "scribunto-luastandalone-proc-error-proc-open": "Exception message displayed when PHP's <tt>proc_open</tt> function is not available, which is needed by the LuaStandalone engine. <tt>proc_open</tt> is a PHP function name and <tt>disable_functions</tt> is the name of a PHP configuration. Both these names aren't localized, thus shouldn't be translated. \n\nSee also:\n* proc_open: http://www.php.net/manual/en/function.proc-open.php\n* disable_functions: http://www.php.net/manual/en/ini.core.php",
+ "scribunto-luastandalone-decode-error": "Exception message.",
+ "scribunto-luastandalone-write-error": "Exception message. A [[wikipedia:unix pipe|unix pipe]] is similar to an electronic pipeline for data.\n\nSee also:\n* {{msg-mw|Scribunto-luastandalone-read-error}}",
+ "scribunto-luastandalone-read-error": "Exception message.\nA [[wikipedia:unix pipe|unix pipe]] is similar to an electronic pipeline for data.\n\nSee also:\n* {{msg-mw|Scribunto-luastandalone-write-error}}",
+ "scribunto-luastandalone-gone": "Exception message.",
+ "scribunto-luastandalone-signal": "Exception message. Parameters:\n* $1 - (Unused)\n* $2 - an exit status (may also be a signal name)",
+ "scribunto-luastandalone-exited": "Exception message. Parameters:\n* $1 - (Unused)\n* $2 - an exit status",
+ "scribunto-module-with-errors-category": "Name of [[mw:Help:Tracking categories|tracking category]] where modules saved with errors are listed.\n\nSee also:\n* {{msg-mw|scribunto-module-with-errors-category-desc}}",
+ "scribunto-module-with-errors-category-desc": "Description on [[Special:TrackingCategories]] for the {{msg-mw|scribunto-module-with-errors-category}} tracking category.",
+ "scribunto-limitreport-timeusage": "Label for the \"Lua time usage\" row in the limit report table.\n\nSee also:\n* {{msg-mw|Scribunto-limitreport-timeusage-value}}",
+ "scribunto-limitreport-timeusage-value": "Format for the \"Lua time usage\" value in the limit report table. Parameters:\n* $1 - the usage in seconds\n* $2 - the maximum\nSee also:\n* {{msg-mw|Scribunto-limitreport-timeusage}}\n{{Identical|Second}}",
+ "scribunto-limitreport-virtmemusage": "Label for the \"Lua virtual size\" row in the limit report table.\n\nSee also:\n* {{msg-mw|Scribunto-limitreport-virtmemusage-value}}",
+ "scribunto-limitreport-virtmemusage-value": "{{optional}}\nFormat for the \"Lua virtual size\" value in the limit report table. Parameters:\n* $1 - the usage\n* $2 - the maximum\nSee also:\n* {{msg-mw|Scribunto-limitreport-virtmemusage}}",
+ "scribunto-limitreport-estmemusage": "Label for the \"Lua estimated memory usage\" row in the limit report table.\n\nSee also:\n* {{msg-mw|Scribunto-limitreport-estmemusage-value}}",
+ "scribunto-limitreport-estmemusage-value": "Format for the \"Lua estimated memory usage\" value in the limit report table.\n\nParameters:\n* $1 - the value\nSee also:\n* {{msg-mw|Scribunto-limitreport-estmemusage}}",
+ "scribunto-limitreport-memusage": "Label for the \"Lua memory usage\" row in the limit report table.\n\nSee also:\n* {{msg-mw|Scribunto-limitreport-memusage-value}}",
+ "scribunto-limitreport-memusage-value": "{{optional}}\nFormat for the \"Lua memory usage\" value in the limit report table. Parameters:\n* $1 - the usage\n* $2 - the maximum\nSee also:\n* {{msg-mw|Scribunto-limitreport-memusage}}",
+ "scribunto-limitreport-profile": "Label for the \"Lua Profile\" row in the limit report table.\n\nFollowed by {{msg-mw|Scribunto-limitreport-profile-ms}} and {{msg-mw|Scribunto-limitreport-profile-percent}}.",
+ "scribunto-limitreport-profile-ms": "Text to format the milliseconds in the \"Lua Profile\" table.\n\nPreceded by {{msg-mw|Scribunto-limitreport-profile}}.\n\nFollowed by {{msg-mw|Scribunto-limitreport-profile-percent}}.\n\nParameters:\n* $1 - the time in milliseconds",
+ "scribunto-limitreport-profile-percent": "Text to format the time percentage in the \"Lua Profile\" table.\n\nPreceded by {{msg-mw|Scribunto-limitreport-profile}} and {{msg-mw|Scribunto-limitreport-profile-ms}}.\n\nParameters:\n* $1 - the percentage",
+ "scribunto-limitreport-logs": "Label for the \"Lua logs\" row in the limit report table",
+ "apihelp-scribunto-console-description": "{{doc-apihelp-description|scribunto-console}}",
+ "apihelp-scribunto-console-summary": "{{doc-apihelp-summary|scribunto-console}}",
+ "apihelp-scribunto-console-param-title": "{{doc-apihelp-param|scribunto-console|title}}",
+ "apihelp-scribunto-console-param-content": "{{doc-apihelp-param|scribunto-console|content}}",
+ "apihelp-scribunto-console-param-session": "{{doc-apihelp-param|scribunto-console|session}}",
+ "apihelp-scribunto-console-param-question": "{{doc-apihelp-param|scribunto-console|question}}",
+ "apihelp-scribunto-console-param-clear": "Probably a way to delete the history, variables etc. of the Scribunto debug console, i.e. an environment where Lua modules can be tested (not currently documented).\n----\n{{doc-apihelp-param|scribunto-console|clear}}",
+ "nstab-module": "The name for the tab of the Module namespace.\n\nSee also:\n* {{msg-mw|Nstab-module}}\n* {{msg-mw|Tooltip-ca-nstab-module}}\n{{Identical|Module}}",
+ "tooltip-ca-nstab-module": "Tooltip shown when hovering over the {{msg-mw|Nstab-module}} tab.\n\nSee also:\n* {{msg-mw|Nstab-module}}\n* {{msg-mw|Tooltip-ca-nstab-module}}"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/qu.json b/www/wiki/extensions/Scribunto/i18n/qu.json
new file mode 100644
index 00000000..4210b39b
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/qu.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "AlimanRuna"
+ ]
+ },
+ "scribunto-lua-error": "Lua pantasqa: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/rm.json b/www/wiki/extensions/Scribunto/i18n/rm.json
new file mode 100644
index 00000000..c5f330c4
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/rm.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Terfili"
+ ]
+ },
+ "scribunto-lua-error": "Sbagl da Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ro.json b/www/wiki/extensions/Scribunto/i18n/ro.json
new file mode 100644
index 00000000..9a274987
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ro.json
@@ -0,0 +1,38 @@
+{
+ "@metadata": {
+ "authors": [
+ "Minisarm",
+ "Stelistcristi",
+ "XXN",
+ "Andreyyshore",
+ "Strainu"
+ ]
+ },
+ "scribunto-line": "la linia $1",
+ "scribunto-module-line": "în $1 la linia $2",
+ "scribunto-parser-dialog-title": "Eroare în script",
+ "scribunto-error-short": "Eroare în script: $1",
+ "scribunto-error-long": "Erori în script:\n\n$1",
+ "scribunto-doc-page-name": "Modul:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''Documentația acestui modul poate fi creată la [[$1]]''",
+ "scribunto-doc-page-header": "'''Aceasta este pagina de documentație pentru [[$1]]'''",
+ "scribunto-console-title": "Consolă de depanare",
+ "scribunto-console-clear": "Șterge",
+ "scribunto-console-cleared": "Starea consolei a fost ștearsă deoarece modulul a fost actualizat.",
+ "scribunto-common-error-category": "Pagini cu erori de script",
+ "scribunto-common-nosuchmodule": "Eroare în script: Niciun astfel de modul.",
+ "scribunto-common-nofunction": "Eroare în script: Trebuie să specificați o funcție pentru apelare.",
+ "scribunto-common-nosuchfunction": "Eroare în script: Funcția specificată nu există.",
+ "scribunto-lua-in-function-at": "în funcția de la $1:$2",
+ "scribunto-lua-error-location": "Eroare Lua $1: $2",
+ "scribunto-lua-error": "Eroare Lua: $2.",
+ "scribunto-limitreport-timeusage-value": "$1/$2 secunde",
+ "scribunto-limitreport-virtmemusage": "Mărime virtuală Lua",
+ "scribunto-limitreport-profile": "Profil Lua",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "apihelp-scribunto-console-param-title": "Titllul modulului de testat",
+ "apihelp-scribunto-console-param-content": "Noul conținut al modulului.",
+ "apihelp-scribunto-console-param-session": "Token de sesiune.",
+ "nstab-module": "Modul",
+ "tooltip-ca-nstab-module": "Vezi modulul"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/roa-tara.json b/www/wiki/extensions/Scribunto/i18n/roa-tara.json
new file mode 100644
index 00000000..8b2ee663
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/roa-tara.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Joetaras"
+ ]
+ },
+ "scribunto-line": "a 'a linèe $1",
+ "scribunto-module-line": "jndr'à $1 a 'a linèe $2",
+ "scribunto-parser-dialog-title": "Errore d'u script",
+ "scribunto-error-short": "Errore d'u script: $1",
+ "scribunto-error-long": "Errore d'u script:\n\n$1",
+ "scribunto-console-clear": "Pulizze",
+ "scribunto-lua-in-function": "jndr'à funzione \"$1\"",
+ "scribunto-lua-error-location": "Errore Lua: $1: $2.",
+ "scribunto-lua-error": "Errore Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ru.json b/www/wiki/extensions/Scribunto/i18n/ru.json
new file mode 100644
index 00000000..f64d0b53
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ru.json
@@ -0,0 +1,72 @@
+{
+ "@metadata": {
+ "authors": [
+ "Base",
+ "Ignatus",
+ "Kalan",
+ "Okras",
+ "HarpyWar",
+ "Kaganer",
+ "Lemondoge",
+ "Kareyac",
+ "MaxBioHazard",
+ "Patrick Star",
+ "Jack who built the house"
+ ]
+ },
+ "scribunto-desc": "Средство для включения скриптовых языков на страницах MediaWiki",
+ "scribunto-line": "на строке $1",
+ "scribunto-module-line": "в $1 на строке $2",
+ "scribunto-parser-dialog-title": "Ошибка скрипта",
+ "scribunto-error-short": "Ошибка скрипта: $1",
+ "scribunto-error-long": "Ошибки скрипта:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''Для документации этого модуля может быть создана страница [[$1]]''",
+ "scribunto-doc-page-header": "''Это страница документации [[$1]]''",
+ "scribunto-console-intro": "* То, что экспортирует данный модуль, доступно как переменная «p», включая несохранённые изменения.\n* Предваряйте строку знаком «=», чтобы вычислить её как выражение, или используйте print(). Используйте mw.logObject() для таблицы.\n* Используйте mw.log() и mw.logObject() в коде модуля для вывода сообщений в эту консоль.",
+ "scribunto-console-title": "Консоль отладки",
+ "scribunto-console-too-large": "Этот сеанс консоли слишком большой. Очистите историю консоли или уменьшите размер модуля.",
+ "scribunto-console-current-src": "ввод консоли",
+ "scribunto-console-clear": "Очистить",
+ "scribunto-console-cleared": "Консоль очищена, потому что модуль был обновлён.",
+ "scribunto-console-cleared-session-lost": "Состояние консоли очищено, поскольку потеряны данные сессии.",
+ "scribunto-common-error-category": "Страницы с ошибками скриптов",
+ "scribunto-common-error-category-desc": "Произошла ошибка при обработке включённых в страницу модулей.",
+ "scribunto-common-nosuchmodule": "Ошибка скрипта: Модуля «$2» не существует.",
+ "scribunto-common-nofunction": "Ошибка скрипта: Вы должны указать вызываемую функцию.",
+ "scribunto-common-nosuchfunction": "Ошибка скрипта: Функции «$2» не существует.",
+ "scribunto-common-notafunction": "Ошибка сценария: «$2» — не функция.",
+ "scribunto-common-timeout": "Время, выделенное для выполнения скриптов, истекло.",
+ "scribunto-common-oom": "Количество памяти, выделенное для выполнения скриптов, превышено.",
+ "scribunto-common-backtrace": "Трассировка вызовов:",
+ "scribunto-common-no-details": "Нет никаких подробностей.",
+ "scribunto-lua-in-function": "в функции «$1»",
+ "scribunto-lua-in-main": "в основной части кода",
+ "scribunto-lua-in-function-at": "в функции $1:$2",
+ "scribunto-lua-error-location": "Ошибка Lua $1: $2.",
+ "scribunto-lua-error": "Ошибка Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Ошибка скрипта: Модуль вернул значение $2. Ожидается, что модуль вернёт таблицу экспорта.",
+ "scribunto-luastandalone-proc-error": "Ошибка Lua: Не удалось создать процесс.",
+ "scribunto-luastandalone-proc-error-msg": "Ошибка Lua: не удаётся создать процесс: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Ошибка Lua: не удаётся создать процесс: proc_open не доступен. Проверьте директиву конфигурации PHP «disable_functions».",
+ "scribunto-luastandalone-decode-error": "Ошибка Lua: Внутренняя ошибка: Не удаётся декодировать сообщение.",
+ "scribunto-luastandalone-write-error": "Ошибка Lua: Внутренняя ошибка: Ошибка записи в конвейер.",
+ "scribunto-luastandalone-read-error": "Ошибка Lua: Внутренняя ошибка: Ошибка чтения из конвейера.",
+ "scribunto-luastandalone-gone": "Ошибка Lua: Внутренняя ошибка: Интерпретатор уже завершил работу.",
+ "scribunto-luastandalone-signal": "Ошибка Lua: Внутренняя ошибка: Интерпретатор был остановлен сигналом «$2».",
+ "scribunto-luastandalone-exited": "Ошибка Lua: Внутренняя ошибка: Интерпретатор завершил работу со статусом $2.",
+ "scribunto-module-with-errors-category": "Модули Scribunto с ошибками",
+ "scribunto-module-with-errors-category-desc": "В модуле имеется ошибка.",
+ "scribunto-limitreport-timeusage": "Время использование Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 секунд",
+ "scribunto-limitreport-virtmemusage": "Виртуальный размер Lua",
+ "scribunto-limitreport-estmemusage": "Предположительное использование памяти Lua",
+ "scribunto-limitreport-memusage": "Использование памяти Lua",
+ "scribunto-limitreport-profile": "Профиль Lua",
+ "scribunto-limitreport-profile-ms": "$1 мс",
+ "scribunto-limitreport-logs": "Журналы Lua",
+ "apihelp-scribunto-console-param-content": "Новое содержимое модуля.",
+ "apihelp-scribunto-console-param-session": "Токен сессии.",
+ "nstab-module": "Модуль",
+ "tooltip-ca-nstab-module": "Просмотреть страницу модуля"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/rue.json b/www/wiki/extensions/Scribunto/i18n/rue.json
new file mode 100644
index 00000000..be828c03
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/rue.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "KHMELNYTSKYIA"
+ ]
+ },
+ "scribunto-lua-error": "Помилка Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/sa.json b/www/wiki/extensions/Scribunto/i18n/sa.json
new file mode 100644
index 00000000..b9db84a8
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/sa.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Shubha",
+ "NehalDaveND"
+ ]
+ },
+ "scribunto-console-clear": "रिक्तीक्रियताम्",
+ "scribunto-lua-error": "लुअ दोषः : $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/sah.json b/www/wiki/extensions/Scribunto/i18n/sah.json
new file mode 100644
index 00000000..aa283100
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/sah.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "HalanTul"
+ ]
+ },
+ "scribunto-lua-error": "Lua алҕаһа: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/sat.json b/www/wiki/extensions/Scribunto/i18n/sat.json
new file mode 100644
index 00000000..943fa61f
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/sat.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Albinus",
+ "Manik Soren"
+ ]
+ },
+ "scribunto-lua-error": "Lua ᱵᱷᱩᱞ: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/scn.json b/www/wiki/extensions/Scribunto/i18n/scn.json
new file mode 100644
index 00000000..fb783b08
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/scn.json
@@ -0,0 +1,66 @@
+{
+ "@metadata": {
+ "authors": [
+ "Pippinu",
+ "Gmelfi",
+ "Sarvaturi"
+ ]
+ },
+ "scribunto-desc": "Piattaforma pi ncurpurari linguaggi script ntê pàggini MediaWiki",
+ "scribunto-line": "â riga $1",
+ "scribunto-module-line": "nta $1 â riga $2",
+ "scribunto-parser-dialog-title": "Erruri ntô script",
+ "scribunto-error-short": "Erruri ntô script: $1",
+ "scribunto-error-long": "Erruri ntô script:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''La ducumintazzioni di stu mòdulu si pò criari nta [[$1]]''",
+ "scribunto-doc-page-header": "'''Chista è la pàggina di ducumintazzioni di [[$1]]'''",
+ "scribunto-console-intro": "* L'espurtazzioni dû mòdulu sù dispunìbbili ntâ variàbbili \"p\", macari li canciamenti nun sarvati.\n* Fai accumonzari na riga cu \"=\" pi valutàrila comu sprissioni, o puru adòpira print().\n* Adòpira mw.log() ntô còdici dû mòdulu pi mannari missaggi a sta console.",
+ "scribunto-console-title": "Console pû debug",
+ "scribunto-console-too-large": "Sta sissioni dâ console è troppu granni. Pi favuri svacanta la crunuluggìa dâ console o scala la grannizza dû mòdulu.",
+ "scribunto-console-current-src": "input â console",
+ "scribunto-console-clear": "Svacanta",
+ "scribunto-console-cleared": "Lu statu dâ console fu azziratu pirchì fu aggiurnatu lu mòdulu.",
+ "scribunto-console-cleared-session-lost": "Lu statu dâ console fu azziratu pirchì si pirderu li dati dâ sissioni.",
+ "scribunto-common-error-category": "Pàggini cu erruri ntê script",
+ "scribunto-common-error-category-desc": "Ammattìu n'erruri nta l'elabburazzioni dî mòduli nclusi ntâ pàggina.",
+ "scribunto-common-nosuchmodule": "Erruri ntô script: Lu mòdulu \"$2\" nun c'è.",
+ "scribunto-common-nofunction": "Erruri ntô script: Hâ' spicificari na funzioni di chiamari.",
+ "scribunto-common-nosuchfunction": "Erruri ntô script: La funzioni \"$2\" nun esisti.",
+ "scribunto-common-notafunction": "Erruri ntô script: \"$2\" nun è na funzioni.",
+ "scribunto-common-timeout": "Lu tempu assignatu pi l'esicuzzioni dî script scadìu.",
+ "scribunto-common-oom": "La quantità di mimoria cunzintuta pi l'esicuzzioni dî script fu passata.",
+ "scribunto-common-backtrace": "Backtrace:",
+ "scribunto-common-no-details": "Àutri dittagghî nun nn'havi.",
+ "scribunto-lua-in-function": "ntâ funzioni \"$1\"",
+ "scribunto-lua-in-main": "ntô bloccu principali",
+ "scribunto-lua-in-function-at": "ntâ funzioni a $1:$2",
+ "scribunto-lua-error-location": "Erruri dû Lua $1: $2.",
+ "scribunto-lua-error": "Erruri dû Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Erruri ntô script: Lu mòdulu riturnau un valuri $2. Avìa a riturnari na tàvula d'espurtazzioni.",
+ "scribunto-luastandalone-proc-error": "Erruri dû Lua: Nun si potti criari nu prucessu.",
+ "scribunto-luastandalone-proc-error-msg": "Erruri dû Lua: Nun si potti criari nu prucessu: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Erruri dû Lua: Nun si potti criari nu prucessu: proc_open nun è dispunìbbili. Cuntrullari la dirittiva di cunfigurazzioni \"disable_functions\" dû PHP.",
+ "scribunto-luastandalone-decode-error": "Erruri dû Lua: Erruri nternu: Nun si potti dicudificari un missaggiu.",
+ "scribunto-luastandalone-write-error": "Erruri dû Lua: Erruri nternu: Erruri ntâ scrivuta ntôn pipe.",
+ "scribunto-luastandalone-read-error": "Erruri dû Lua: Erruri nternu: Erruri ntâ littura dûn pipe.",
+ "scribunto-luastandalone-gone": "Erruri dû Lua: Erruri nternu: Lu ntèrpriti già niscìu.",
+ "scribunto-luastandalone-signal": "Erruri dû Lua: Erruri nternu: Lu ntèrpitri tirminau cû signali \"$2\".",
+ "scribunto-luastandalone-exited": "Erruri dû Lua: Erruri nternu: Lu ntèrpitri niscìu cû statu \"$2\".",
+ "scribunto-module-with-errors-category": "Mòduli Scribunto cu erruri",
+ "scribunto-module-with-errors-category-desc": "Lu mòdulu havi n'erruri dintra.",
+ "scribunto-limitreport-timeusage": "Cunzumu di tempu dû Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 sicunni",
+ "scribunto-limitreport-virtmemusage": "Grannizza virtuali dû Lua",
+ "scribunto-limitreport-estmemusage": "Cunzumu di mimoria dû Lua stimatu",
+ "scribunto-limitreport-memusage": "Cunzumu di mimoria dû Lua",
+ "scribunto-limitreport-profile": "Prufilu dû Lua",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Riggistri dû Lua",
+ "apihelp-scribunto-console-description": "Mòdulu nternu pi sèrviri addumannati XHR dâ console Scribunto.",
+ "apihelp-scribunto-console-param-title": "Lu tìtulu dû mòdulu di pruvari.",
+ "apihelp-scribunto-console-param-content": "Lu cuntinutu novu dû mòdulu.",
+ "apihelp-scribunto-console-param-session": "Token dâ sissioni.",
+ "apihelp-scribunto-console-param-question": "La pròssima riga di valutari comu script.",
+ "apihelp-scribunto-console-param-clear": "Attivari p'azzirari lu statu currenti dâ sissioni."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/sco.json b/www/wiki/extensions/Scribunto/i18n/sco.json
new file mode 100644
index 00000000..d773492e
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/sco.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "John Reid",
+ "AmaryllisGardener"
+ ]
+ },
+ "scribunto-common-error-category": "Pages wi script errors",
+ "scribunto-common-error-category-desc": "Thaur wis ae mistak while processin the modules incluidit oan the page.",
+ "scribunto-lua-error": "Lua error: $2.",
+ "scribunto-module-with-errors-category-desc": "The module haes ae mistak in it.",
+ "scribunto-limitreport-timeusage": "Lua time uissage",
+ "scribunto-limitreport-timeusage-value": "$1/$2 seicons",
+ "scribunto-limitreport-virtmemusage": "Lua virtual size",
+ "scribunto-limitreport-estmemusage": "Lua estimated memory uissage",
+ "scribunto-limitreport-memusage": "Lua memory uissage",
+ "scribunto-limitreport-profile": "Lua Profile",
+ "scribunto-limitreport-profile-ms": "$1 ms"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/sd.json b/www/wiki/extensions/Scribunto/i18n/sd.json
new file mode 100644
index 00000000..31464f12
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/sd.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Mehtab ahmed"
+ ]
+ },
+ "scribunto-lua-error": "Lua خرابي: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/sdh.json b/www/wiki/extensions/Scribunto/i18n/sdh.json
new file mode 100644
index 00000000..2b0ea247
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/sdh.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Paraw2"
+ ]
+ },
+ "scribunto-lua-error": "ھەڵەێ زوان لوا: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/sgs.json b/www/wiki/extensions/Scribunto/i18n/sgs.json
new file mode 100644
index 00000000..ff716815
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/sgs.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hugo.arg"
+ ]
+ },
+ "scribunto-lua-error": "Lua soklīdėms: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/sh.json b/www/wiki/extensions/Scribunto/i18n/sh.json
new file mode 100644
index 00000000..2ac0ad38
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/sh.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "OC Ripper"
+ ]
+ },
+ "scribunto-lua-error": "Lua pogreška: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/shn.json b/www/wiki/extensions/Scribunto/i18n/shn.json
new file mode 100644
index 00000000..ec41fa9c
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/shn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Saimawnkham"
+ ]
+ },
+ "scribunto-lua-error": "လွင်ႈၽိတ်းပိူင်ႈ Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/si.json b/www/wiki/extensions/Scribunto/i18n/si.json
new file mode 100644
index 00000000..1c0b47e1
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/si.json
@@ -0,0 +1,31 @@
+{
+ "@metadata": {
+ "authors": [
+ "Sahan.ssw",
+ "පසිඳු කාවින්ද"
+ ]
+ },
+ "scribunto-line": "$1 පේලියේදී",
+ "scribunto-parser-dialog-title": "අක්ෂර දෝෂය",
+ "scribunto-error-short": "අක්ෂර දෝෂය: $1",
+ "scribunto-error-long": "අක්ෂර දෝෂ:\n\n$1",
+ "scribunto-console-title": "නිදොස්කිරීම් කොන්සෝලය",
+ "scribunto-console-current-src": "කොන්සෝල ආදානය",
+ "scribunto-console-clear": "හිස් කරන්න",
+ "scribunto-common-error-category": "අක්ෂර දෝෂ සහිත පිටු",
+ "scribunto-common-nosuchmodule": "අක්ෂර දෝෂය: සැබෑ මොඩියුලක් නොමැත.",
+ "scribunto-common-backtrace": "ආපසුවිතගමන:",
+ "scribunto-lua-in-function": "\"$1\" ක්‍රියාවෙහි",
+ "scribunto-lua-in-main": "ප්‍රධාන කුට්ටියේ",
+ "scribunto-lua-in-function-at": "$1:$2 හිදී කාර්යය තුල",
+ "scribunto-lua-error-location": "Lua දෝෂය $1: $2.",
+ "scribunto-lua-error": "Lua දෝෂය: $2.",
+ "scribunto-luastandalone-proc-error": "Lua දෝෂය: ක්‍රියාවලිය තැනිය නොහැක.",
+ "scribunto-luastandalone-decode-error": "Lua දෝෂය: අභ්‍යන්තර දෝෂය: පණිවුඩය විකේතනය කල නොහැක.",
+ "scribunto-luastandalone-write-error": "Lua දෝෂය: අභ්‍යන්තර දෝෂය: pipe වෙත ලිවීමේ දෝෂය.",
+ "scribunto-luastandalone-read-error": "Lua දෝෂය: අභ්‍යන්තර දෝෂය: pipe වෙතින් කියවීමේ දෝෂය.",
+ "scribunto-luastandalone-gone": "Lua දෝෂය: අභ්‍යන්තර දෝෂය: ව්‍යාඛ්‍යා කර්තෘ දැනටමත් පවතී.",
+ "scribunto-luastandalone-signal": "Lua දෝෂය: අභ්‍යන්තර දෝෂය: ව්‍යාඛ්‍යා කර්තෘ \"$2\" සංඥාව සමඟ අවසාන වුණි.",
+ "scribunto-luastandalone-exited": "Lua දෝෂය: අභ්‍යන්තර දෝෂය: ව්‍යාඛ්‍යා කර්තෘ \"$2\" තත්වය සමඟ ඉවත් වුණි.",
+ "scribunto-limitreport-profile-ms": "$1 ms"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/sk.json b/www/wiki/extensions/Scribunto/i18n/sk.json
new file mode 100644
index 00000000..1a16a0d6
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/sk.json
@@ -0,0 +1,26 @@
+{
+ "@metadata": {
+ "authors": [
+ "KuboF",
+ "Wizzard",
+ "Teslaton",
+ "McDutchie"
+ ]
+ },
+ "scribunto-desc": "Umožňuje vkladať do stránok MediaWiki skriptovacie jazyky",
+ "scribunto-line": "na riadku $1",
+ "scribunto-parser-dialog-title": "Chyba skriptu",
+ "scribunto-error-short": "Chyba skriptu: $1",
+ "scribunto-error-long": "Chyby skriptu:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/Dokumentácia",
+ "scribunto-doc-page-does-not-exist": "''Dokumentácia pre tento modul môže byť vytvorená na [[$1]]''",
+ "scribunto-doc-page-header": "'''Toto je podstránka dokumentácie pre [[$1]]'''",
+ "scribunto-console-intro": "* Exporty z modulu sú dostupné ako premenná „p“, vrátane neuložených úprav.\n* Riadok začínajúci s „=“ sa vyhodnotí ako výraz, prípadne môžete použiť print().\n* Pomocou mw.log() v kóde modulu môžete do tejto konzoly posielať správy.",
+ "scribunto-console-title": "Ladiaca konzola",
+ "scribunto-console-too-large": "Toto konzolové sedenie je příliš veľké. Vymažte históriu konzoly alebo zmenšite modul.",
+ "scribunto-console-current-src": "konzolový vstup",
+ "scribunto-console-clear": "Vymazať",
+ "scribunto-console-cleared": "Stav konzoly bol v dôsledku zmeny modulu vymazaný.",
+ "scribunto-console-cleared-session-lost": "Stav konzoly bol v dôsledku straty dát sedenia vymazaný.",
+ "scribunto-lua-error": "Chyba Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/skr-arab.json b/www/wiki/extensions/Scribunto/i18n/skr-arab.json
new file mode 100644
index 00000000..a3bd1505
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/skr-arab.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Saraiki"
+ ]
+ },
+ "scribunto-lua-error": "لوا غلطی:$2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/sl.json b/www/wiki/extensions/Scribunto/i18n/sl.json
new file mode 100644
index 00000000..c5dddd43
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/sl.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Eleassar",
+ "Dbc334",
+ "Janezdrilc"
+ ]
+ },
+ "scribunto-error-short": "Skriptna napaka: $1",
+ "scribunto-common-nosuchmodule": "Skriptna napaka: Modul »$2« ne obstaja.",
+ "scribunto-common-nofunction": "Skriptna napaka: določiti morate funkcijo za klic.",
+ "scribunto-common-nosuchfunction": "Skriptna napaka: Funkcija »$2« ne obstaja.",
+ "scribunto-lua-error": "Napaka Lua: $2",
+ "scribunto-lua-notarrayreturn": "Skriptna napaka: Modul je vrnil vrednost $2. Vrnil bi naj izvozno tabelo.",
+ "nstab-module": "Modul"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/sq.json b/www/wiki/extensions/Scribunto/i18n/sq.json
new file mode 100644
index 00000000..6b155293
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/sq.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Olsi"
+ ]
+ },
+ "scribunto-lua-error": "Gabim Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/sr-ec.json b/www/wiki/extensions/Scribunto/i18n/sr-ec.json
new file mode 100644
index 00000000..2c66f8e2
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/sr-ec.json
@@ -0,0 +1,26 @@
+{
+ "@metadata": {
+ "authors": [
+ "Milicevic01",
+ "Сербијана",
+ "Obsuser"
+ ]
+ },
+ "scribunto-line": "на линији $1",
+ "scribunto-parser-dialog-title": "Грешка у скрипти",
+ "scribunto-error-short": "Грешка у скрипти: $1",
+ "scribunto-doc-page-name": "Module:$1/док",
+ "scribunto-doc-page-does-not-exist": "''Документација за овај модул се може направити на [[$1]]''",
+ "scribunto-doc-page-header": "'''Ово је документациона подстраница за [[$1]]'''",
+ "scribunto-console-clear": "Очисти",
+ "scribunto-common-error-category": "Странице са грешкама у скрипти",
+ "scribunto-common-nosuchmodule": "Грешка у скрипти: Не постоји модул „$2”.",
+ "scribunto-common-timeout": "Време издвојено за покретање скрипти је истекло.",
+ "scribunto-lua-error-location": "Lua грешка $1: $2.",
+ "scribunto-lua-error": "Lua грешка: $2.",
+ "scribunto-limitreport-timeusage": "Време коришћења Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 секунди",
+ "scribunto-limitreport-memusage": "Меморија коришћења Lua",
+ "nstab-module": "Модул",
+ "tooltip-ca-nstab-module": "Погледајте страницу модула"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/sr-el.json b/www/wiki/extensions/Scribunto/i18n/sr-el.json
new file mode 100644
index 00000000..a68a9a5c
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/sr-el.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Milicevic01",
+ "Сербијана",
+ "Obsuser"
+ ]
+ },
+ "scribunto-line": "na liniji $1",
+ "scribunto-parser-dialog-title": "Greška u skripti",
+ "scribunto-error-short": "Greška u skripti: $1",
+ "scribunto-doc-page-name": "Module:$1/dok",
+ "scribunto-doc-page-does-not-exist": "''Dokumentacija za ovaj modul se može napraviti na [[$1]]''",
+ "scribunto-doc-page-header": "'''Ovo je dokumentaciona podstranica za [[$1]]'''",
+ "scribunto-console-clear": "Očisti",
+ "scribunto-common-error-category": "Stranice sa greškama u skripti",
+ "scribunto-common-nosuchmodule": "Greška u skripti: Ne postoji modul „$2”.",
+ "scribunto-common-timeout": "Vreme izdvojeno za pokretanje skripti je isteklo.",
+ "scribunto-lua-error-location": "Lua greška $1: $2.",
+ "scribunto-lua-error": "Lua greška: $2.",
+ "scribunto-limitreport-timeusage": "Vreme korišćenja Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 sekundi",
+ "scribunto-limitreport-memusage": "Memorija korišćenja Lua",
+ "nstab-module": "Modul"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/sty.json b/www/wiki/extensions/Scribunto/i18n/sty.json
new file mode 100644
index 00000000..23d3f411
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/sty.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Khanmarat"
+ ]
+ },
+ "scribunto-lua-error": "Lua ҡата: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/su.json b/www/wiki/extensions/Scribunto/i18n/su.json
new file mode 100644
index 00000000..1144eb0e
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/su.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kandar"
+ ]
+ },
+ "scribunto-lua-error": "Galat Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/sv.json b/www/wiki/extensions/Scribunto/i18n/sv.json
new file mode 100644
index 00000000..cdd59ee2
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/sv.json
@@ -0,0 +1,73 @@
+{
+ "@metadata": {
+ "authors": [
+ "GameOn",
+ "Hangsna",
+ "Jopparn",
+ "Lokal Profil",
+ "Skalman",
+ "WikiPhoenix",
+ "Ainali",
+ "Rotsee",
+ "Magol"
+ ]
+ },
+ "scribunto-desc": "Ramverk för att bädda in skriptspråk på MediaWiki-sidor",
+ "scribunto-line": "på rad $1",
+ "scribunto-module-line": "i $1 på rad $2",
+ "scribunto-parser-dialog-title": "Skriptfel",
+ "scribunto-error-short": "Skriptfel: $1",
+ "scribunto-error-long": "Skriptfel:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/dok",
+ "scribunto-doc-page-does-not-exist": "''Dokumentationen för denna modul kan skapas på [[$1]]''",
+ "scribunto-doc-page-header": "'''Detta är dokumentationssidan för [[$1]]'''",
+ "scribunto-console-intro": "* Modulexporteringarna är tillgängliga som variabeln \"p\", inklusive osparade ändringar.\n* Börja en rad med \"=\" för att utvärdera den som ett uttryck, eller använd print(). Använd mw.logObject() för tabeller.\n* Använd mw.log() och mw.logObject() i modulkoden för att skicka meddelande till denna konsol.",
+ "scribunto-console-title": "Felsökningskonsol",
+ "scribunto-console-too-large": "Denna konsolsessionen är för stor. Vänligen rensa konsolhistoriken eller minska storleken på modulen.",
+ "scribunto-console-current-src": "konsol-indata",
+ "scribunto-console-clear": "Rensa",
+ "scribunto-console-cleared": "Konsol-tillståndet tömdes eftersom modulen uppdaterades.",
+ "scribunto-console-cleared-session-lost": "Konsol-tillståndet tömdes eftersom sessionsdata uppdaterades.",
+ "scribunto-common-error-category": "Sidor med skriptfel",
+ "scribunto-common-error-category-desc": "Ett fel uppstod vid bearbetning av de moduler som ingår på sidan.",
+ "scribunto-common-nosuchmodule": "Skriptfel: Modulen \"$2\" finns inte.",
+ "scribunto-common-nofunction": "Skriptfel: Du måste ange en funktion att anropa.",
+ "scribunto-common-nosuchfunction": "Skriptfel: Funktionen \"$2\" finns inte.",
+ "scribunto-common-notafunction": "Skriptfel: \"$2\" är inte en funktion.",
+ "scribunto-common-timeout": "Den tid som avsatts för att köra skript har löpt ut.",
+ "scribunto-common-oom": "Mängden minne som tillåts för att köra skript har överskridits.",
+ "scribunto-common-backtrace": "Backtrace:",
+ "scribunto-common-no-details": "Inga ytterligare detaljer är tillgängliga.",
+ "scribunto-lua-in-function": "i funktionen \"$1\"",
+ "scribunto-lua-in-main": "i det största segmentet",
+ "scribunto-lua-in-function-at": "i funktionen på $1:$2",
+ "scribunto-lua-error-location": "Luafel $1: $2.",
+ "scribunto-lua-error": "Luafel: $2.",
+ "scribunto-lua-notarrayreturn": "Skriptfel: Modulen returnerade ett $2-värde. Den förväntas returnera en exporttabell.",
+ "scribunto-luastandalone-proc-error": "Luafel: Kan inte starta processen.",
+ "scribunto-luastandalone-proc-error-msg": "Luafel: Kan inte skapa processen: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Luafel: kan inte skapa processen: proc_open är inte tillgänglig. Kontrollera PHP:s \"disable_functions\" konfigurationsdirektiv.",
+ "scribunto-luastandalone-decode-error": "Luafel: Internt fel: det gick inte att avkoda meddelandet.",
+ "scribunto-luastandalone-write-error": "Luafel: Internt fel: Fel vid skrivning till pipe.",
+ "scribunto-luastandalone-read-error": "Luafel: Internt fel: Fel vid läsning från pipe.",
+ "scribunto-luastandalone-gone": "Luafel: Internt fel: Tolken har redan avslutats.",
+ "scribunto-luastandalone-signal": "Luafel: Internt fel: Tolken har avslutats med signalen \"$2\".",
+ "scribunto-luastandalone-exited": "Luafel: Internt fel: Tolken avslutades med status $2.",
+ "scribunto-module-with-errors-category": "Scribunto-moduler med fel",
+ "scribunto-module-with-errors-category-desc": "Modulen har ett fel i den.",
+ "scribunto-limitreport-timeusage": "Lua - tidsanvändning",
+ "scribunto-limitreport-timeusage-value": "$1/$2 sekunder",
+ "scribunto-limitreport-virtmemusage": "Lua - virtuell storlek",
+ "scribunto-limitreport-estmemusage": "Lua - uppskattad minnesanvändning",
+ "scribunto-limitreport-memusage": "Lua - minnesanvändning",
+ "scribunto-limitreport-profile": "Lua-profil",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Lua-loggar",
+ "apihelp-scribunto-console-description": "Intern modul för att betjäna XHR-förfrågningar från Scribunto-konsolen.",
+ "apihelp-scribunto-console-param-title": "Titeln på modulen som ska testas.",
+ "apihelp-scribunto-console-param-content": "Modulens nya innehåll.",
+ "apihelp-scribunto-console-param-session": "Sessionsnyckel.",
+ "apihelp-scribunto-console-param-question": "Nästa rad att utvärdera som ett skript.",
+ "nstab-module": "Modul",
+ "tooltip-ca-nstab-module": "Visa modulsidan"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/szl.json b/www/wiki/extensions/Scribunto/i18n/szl.json
new file mode 100644
index 00000000..3698d15b
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/szl.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Krol111"
+ ]
+ },
+ "scribunto-lua-error": "Lua feler: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ta.json b/www/wiki/extensions/Scribunto/i18n/ta.json
new file mode 100644
index 00000000..5b841f4b
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ta.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "ElangoRamanujam",
+ "Jayarathina"
+ ]
+ },
+ "scribunto-common-no-details": "மேல் விபரங்களேதும் கிடைக்கவில்லை.",
+ "scribunto-lua-error": "லூவா பிழை: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/tay.json b/www/wiki/extensions/Scribunto/i18n/tay.json
new file mode 100644
index 00000000..3c3a702a
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/tay.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hitaypayan"
+ ]
+ },
+ "scribunto-lua-error": "Lua min’uqu’:$2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/tcy.json b/www/wiki/extensions/Scribunto/i18n/tcy.json
new file mode 100644
index 00000000..ae9f061c
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/tcy.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "VASANTH S.N.",
+ "Vishwanatha Badikana",
+ "రహ్మానుద్దీన్",
+ "BHARATHESHA ALASANDEMAJALU"
+ ]
+ },
+ "scribunto-lua-error": "Lua ದೋಸೊ:$2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/te.json b/www/wiki/extensions/Scribunto/i18n/te.json
new file mode 100644
index 00000000..44d98aff
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/te.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chaduvari",
+ "Ravichandra",
+ "రహ్మానుద్దీన్",
+ "Veeven"
+ ]
+ },
+ "scribunto-lua-error": "లువా తప్పిదం: $2",
+ "scribunto-limitreport-timeusage-value": "$1/$2 సెకండ్లు",
+ "scribunto-limitreport-profile-ms": "$1 మి.సె"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/tg-cyrl.json b/www/wiki/extensions/Scribunto/i18n/tg-cyrl.json
new file mode 100644
index 00000000..ea4daad2
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/tg-cyrl.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Vashgird"
+ ]
+ },
+ "scribunto-lua-error": "Хатои Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/th.json b/www/wiki/extensions/Scribunto/i18n/th.json
new file mode 100644
index 00000000..ea985195
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/th.json
@@ -0,0 +1,69 @@
+{
+ "@metadata": {
+ "authors": [
+ "Nullzero",
+ "Octahedron80",
+ "Horus",
+ "Aefgh39622"
+ ]
+ },
+ "scribunto-desc": "กรอบงานสำหรับฝังภาษาสคริปต์ลงในหน้าของมีเดียวิกิ",
+ "scribunto-line": "บรรทัดที่ $1",
+ "scribunto-module-line": "ใน $1 บรรทัดที่ $2",
+ "scribunto-parser-dialog-title": "สคริปต์ผิดพลาด",
+ "scribunto-error-short": "สคริปต์ผิดพลาด: $1",
+ "scribunto-error-long": "สคริปต์ผิดพลาด:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''เอกสารการใช้งานสำหรับมอดูลนี้อาจสร้างขึ้นที่ [[$1]]''",
+ "scribunto-doc-page-header": "'''นี่คือหน้าเอกสารการใช้งานสำหรับ [[$1]]'''",
+ "scribunto-console-intro": "* การส่งออกมอดูลมีให้ใช้ได้เป็นตัวแปร \"p\" รวมถึงการแก้ไขเพิ่มเติมที่ยังไม่บันทึก\n* ขึ้นต้นบรรทัดด้วย \"=\" เพื่อประเมินเป็นนิพจน์ หรือใช้ print() ใช้ mw.logObject() สำหรับตาราง\n* ใช้ mw.log() และ mw.logObject() ในรหัสของมอดูลเพื่อส่งข้อความไปยังคอนโซลนี้",
+ "scribunto-console-title": "คอนโซลดีบั๊ก",
+ "scribunto-console-too-large": "ช่วงเวลาสื่อสารคอนโซลนี้มากเกินไป กรุณาล้างประวัติคอนโซลหรือลดขนาดของมอดูล",
+ "scribunto-console-current-src": "ตัวป้อนเข้าคอนโซล",
+ "scribunto-console-clear": "ล้าง",
+ "scribunto-console-cleared": "สถานะคอนโซลถูกล้างเพราะมอดูลอัปเดต",
+ "scribunto-console-cleared-session-lost": "สถานะคอนโซลถูกล้างเพราะข้อมูลช่วงเวลาสื่อสารสูญหาย",
+ "scribunto-common-error-category": "หน้าที่มีสคริปต์ผิดพลาด",
+ "scribunto-common-error-category-desc": "เกิดความผิดพลาดขณะประมวลผลมอดูลที่รวมอยู่ในหน้า",
+ "scribunto-common-nosuchmodule": "สคริปต์ผิดพลาด: ไม่มีมอดูล $2",
+ "scribunto-common-nofunction": "สคริปต์ผิดพลาด: คุณต้องระบุฟังก์ชันที่จะเรียกใช้",
+ "scribunto-common-nosuchfunction": "สคริปต์ผิดพลาด: ฟังก์ชัน \"$2\" ไม่มีอยู่",
+ "scribunto-common-notafunction": "สคริปต์ผิดพลาด: \"$2\" ไม่ใช่ฟังก์ชัน",
+ "scribunto-common-timeout": "เวลาที่จัดสรรให้ดำเนินงานสคริปต์ครบกำหนดแล้ว",
+ "scribunto-common-oom": "ปริมาณหน่วยความจำที่อนญาตให้ดำเนินงานสคริปต์เกินกำหนดแล้ว",
+ "scribunto-common-backtrace": "การติดตามย้อนหลัง:",
+ "scribunto-common-no-details": "ไม่มีรายละเอียดที่หาได้มากกว่านี้",
+ "scribunto-lua-in-function": "ในฟังก์ชัน \"$1\"",
+ "scribunto-lua-in-main": "ในส่วนหลัก",
+ "scribunto-lua-in-function-at": "ในฟังก์ชัน $1:$2",
+ "scribunto-lua-error-location": "สคริปต์ลูอาผิดพลาด $1: $2",
+ "scribunto-lua-error": "ข้อผิดพลาดลูอา: $2",
+ "scribunto-lua-notarrayreturn": "สคริปต์ผิดพลาด: มอดูลคืนค่าเป็น $2 มันควรจะคืนค่าเป็นตารางส่งออก",
+ "scribunto-luastandalone-proc-error": "สคริปต์ลูอาผิดพลาด: ไม่สามารถสร้างกระบวนการ",
+ "scribunto-luastandalone-proc-error-msg": "สคริปต์ลูอาผิดพลาด: ไม่สามารถสร้างกระบวนการ: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "สคริปต์ลูอาผิดพลาด: ไม่สามารถสร้างกระบวนการ: proc_open ไม่มีให้ใช้ ให้ตรวจสอบตัวชี้แนะการตั้งค่า \"disable_functions\" ของ PHP",
+ "scribunto-luastandalone-decode-error": "สคริปต์ลูอาผิดพลาด: ความผิดพลาดภายใน: ไม่สามารถถอดรหัสข้อความ",
+ "scribunto-luastandalone-write-error": "สคริปต์ลูอาผิดพลาด: ความผิดพลาดภายใน: การเขียนไปยังไฟป์ผิดพลาด",
+ "scribunto-luastandalone-read-error": "สคริปต์ลูอาผิดพลาด: ความผิดพลาดภายใน: การอ่านมาจากไพป์ผิดพลาด",
+ "scribunto-luastandalone-gone": "สคริปต์ลูอาผิดพลาด: ความผิดพลาดภายใน: อินเทอร์พรีเตอร์ออกจากการทำงานไปแล้ว",
+ "scribunto-luastandalone-signal": "สคริปต์ลูอาผิดพลาด: ความผิดพลาดภายใน: อินเทอร์พรีเตอร์สิ้นสุดการทำงานด้วยสัญญาณ \"$2\"",
+ "scribunto-luastandalone-exited": "สคริปต์ลูอาผิดพลาด: ความผิดพลาดภายใน: อินเทอร์พรีเตอร์ออกจากการทำงานด้วยสถานภาพ $2",
+ "scribunto-module-with-errors-category": "มอดูลสกรีบุนโทที่มีความผิดพลาด",
+ "scribunto-module-with-errors-category-desc": "มอดูลที่มีความผิดพลาดอยู่ข้างใน",
+ "scribunto-limitreport-timeusage": "การใช้เวลาของสคริปต์ลูอา",
+ "scribunto-limitreport-timeusage-value": "$1/$2 วินาที",
+ "scribunto-limitreport-virtmemusage": "ขนาดเสมือนของสคริปต์ลูอา",
+ "scribunto-limitreport-estmemusage": "การใช้หน่วยความจำโดยประมาณของสคริปต์ลูอา",
+ "scribunto-limitreport-memusage": "การใช้หน่วยความจำของสคริปต์ลูอา",
+ "scribunto-limitreport-profile": "โพรไฟล์ของสคริปต์ลูอา",
+ "scribunto-limitreport-profile-ms": "$1 มิลลิวินาที",
+ "scribunto-limitreport-logs": "ปูมของสคริปต์ลูอา",
+ "apihelp-scribunto-console-description": "มอดูลภายในสำหรับให้บริการการร้องขอ XHR จากคอนโซลสกรีบุนโท",
+ "apihelp-scribunto-console-param-title": "ชื่อเรื่องของมอดูลเพื่อทดสอบ",
+ "apihelp-scribunto-console-param-content": "เนื้อหาใหม่ของมอดูล",
+ "apihelp-scribunto-console-param-session": "โทเค็นช่วงเวลาสื่อสาร",
+ "apihelp-scribunto-console-param-question": "บรรทัดถัดไปที่จะประเมินเป็นสคริปต์",
+ "apihelp-scribunto-console-param-clear": "ตั้งค่าเพื่อล้างสถานะช่วงเวลาสื่อสารปัจจุบัน",
+ "nstab-module": "มอดูล",
+ "tooltip-ca-nstab-module": "ดูหน้ามอดูล"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/tl.json b/www/wiki/extensions/Scribunto/i18n/tl.json
new file mode 100644
index 00000000..3b3736fc
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/tl.json
@@ -0,0 +1,39 @@
+{
+ "@metadata": {
+ "authors": [
+ "AnakngAraw"
+ ]
+ },
+ "scribunto-desc": "Baskagan para sa pagbabaon ng mga wikang pampagpapanitik papaloob sa mga pahina ng MediaWiki",
+ "scribunto-line": "sa guhit na $1",
+ "scribunto-module-line": "sa loob ng $1 na nasa guhit na $2",
+ "scribunto-parser-dialog-title": "Kamalian sa panitik",
+ "scribunto-error-short": "Kamalian sa panitik: $1",
+ "scribunto-error-long": "Mga kamalian sa panitik:\n\n$1",
+ "scribunto-console-intro": "* Ang mga luwas ng modulo ay makukuha bilang ang nagpapabagu-bagong \"p\", kasama na ang hindi pa nasasagip na mga pagbabago.\n* Magpauna ng \"=\" sa isang guhit upang mahatulan ito bilang isang pagpapahayag, o gamitin ang paglimbag ().\n* Gamitin ang mw.log() na nasa kodigo ng modulo upang makapagpadala ng mga mensahe sa kahang pantaban na ito.",
+ "scribunto-console-title": "Kahang pantaban ng sira",
+ "scribunto-console-too-large": "Ang inilaang panahon sa kahang pantaban ay napakalaki. Paki hawiin ang kasaysayan ng kahang pantaban o bawasan ang sukat ng modyul.",
+ "scribunto-console-current-src": "pagpapasok sa kahang pantaban",
+ "scribunto-console-clear": "Hawiin",
+ "scribunto-console-cleared": "Hinawi ang katayuan ng kahang pantaban dahil isinapanahon ang modyul.",
+ "scribunto-common-nosuchmodule": "Kamalian sa panitik: Walang ganyang modulo",
+ "scribunto-common-nofunction": "Kamalian sa panitik: Dapat kang magtukoy ng isang tungkuling tatawagin.",
+ "scribunto-common-nosuchfunction": "Kamalian sa panitik: Ang tinukoy mong tungkulin ay hindi umiiral.",
+ "scribunto-common-timeout": "Ang panahong inilaan para sa pagpapatakbo ng mga panitik ay lipas na.",
+ "scribunto-common-oom": "Ang dami ng pinahintulutang alaala para sa pagpapatakbo ng mga panitik ay nalampasan na.",
+ "scribunto-common-backtrace": "Paurong na pagbabakas:",
+ "scribunto-lua-in-function": "sa loob ng tungkuling \"$1\"",
+ "scribunto-lua-in-main": "sa loob ng pangunahing tipak",
+ "scribunto-lua-in-function-at": "sa loob ng tungkuling nasa $1:$2",
+ "scribunto-lua-backtrace-line": "$1: $2",
+ "scribunto-lua-error-location": "Kamalian ng lua na $1: $2",
+ "scribunto-lua-error": "Kamalian ng lua: $2",
+ "scribunto-lua-notarrayreturn": "Kamalian sa panitik: Ang modulo ay nagbalik ng isang bagay na bukod sa isang talahanayan, dapat itong magbalik ng isang talahanayan ng pag-aangkat.",
+ "scribunto-luastandalone-proc-error": "Kamalian ng lua: hindi malikha ang proseso",
+ "scribunto-luastandalone-decode-error": "Kamalian ng lua: panloob na kamalian: hindi nagawang alamin ang kodigo ng mensahe",
+ "scribunto-luastandalone-write-error": "Kamalian ng lua: panloob na kamalian: kamalian sa pagsusulat sa tubo",
+ "scribunto-luastandalone-read-error": "Kamalian sa lua: kamaliang panloob: kamalian sa pagbabasa mula sa tubo",
+ "scribunto-luastandalone-gone": "Kamalian sa lua: panloob na kamalian: lumabas na ang tagapagpaunawa",
+ "scribunto-luastandalone-signal": "Kamalian sa lua: panloob na kamalian: huminto ang tagapagpaliwanag na mayroong senyas na \"$2\"",
+ "scribunto-luastandalone-exited": "Kamalian sa lua: panloob na kamalian: ang tagapagpaunawa ay lumabas na mayroong katayuang $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/tly.json b/www/wiki/extensions/Scribunto/i18n/tly.json
new file mode 100644
index 00000000..754f74d0
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/tly.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ganbarzada"
+ ]
+ },
+ "scribunto-lua-error": "Çı Lua səhv: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/tr.json b/www/wiki/extensions/Scribunto/i18n/tr.json
new file mode 100644
index 00000000..ba6a13c1
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/tr.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Sadrettin",
+ "Violetanka",
+ "Incelemeelemani",
+ "McDutchie",
+ "Vito Genovese"
+ ]
+ },
+ "scribunto-parser-dialog-title": "Betik hatası",
+ "scribunto-error-short": "Betik hatası: $1",
+ "scribunto-error-long": "Betik hataları:\n$1",
+ "scribunto-doc-page-name": "Module:$1/belge",
+ "scribunto-doc-page-does-not-exist": "Bu modül için bir belgeleme oluşturabilirsiniz: [[$1]]",
+ "scribunto-doc-page-header": "Bu belgeleme sayfası için [[$1]]",
+ "scribunto-console-clear": "Temizle",
+ "scribunto-common-no-details": "Daha fazla bilgi mevcut değildir.",
+ "scribunto-lua-error": "Lua hatası: $2",
+ "scribunto-module-with-errors-category-desc": "Modülde bir hata bulunuyor.",
+ "scribunto-limitreport-timeusage": "Lua zaman kullanımı",
+ "scribunto-limitreport-timeusage-value": "$1/$2 saniye",
+ "scribunto-limitreport-memusage": "Lua bellek kullanımı"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/tt-cyrl.json b/www/wiki/extensions/Scribunto/i18n/tt-cyrl.json
new file mode 100644
index 00000000..4ee62703
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/tt-cyrl.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Derslek"
+ ]
+ },
+ "scribunto-lua-error": "Lua хатасы: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/tt-latn.json b/www/wiki/extensions/Scribunto/i18n/tt-latn.json
new file mode 100644
index 00000000..4c97fbcc
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/tt-latn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Frhdkazan"
+ ]
+ },
+ "scribunto-lua-error": "Lua xatası: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/udm.json b/www/wiki/extensions/Scribunto/i18n/udm.json
new file mode 100644
index 00000000..aee261be
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/udm.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "AlnashPiyash2",
+ "Kaganer"
+ ]
+ },
+ "scribunto-lua-error": "Lua: $2 янгыш.",
+ "scribunto-limitreport-logs": "Lua журналъёс"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ug-arab.json b/www/wiki/extensions/Scribunto/i18n/ug-arab.json
new file mode 100644
index 00000000..fca40671
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ug-arab.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Sahran",
+ "Uzdil"
+ ]
+ },
+ "scribunto-console-clear": "تازىلا",
+ "scribunto-lua-error": "Lua خاتالىقى: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/uk.json b/www/wiki/extensions/Scribunto/i18n/uk.json
new file mode 100644
index 00000000..a44771ce
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/uk.json
@@ -0,0 +1,73 @@
+{
+ "@metadata": {
+ "authors": [
+ "Andriykopanytsia",
+ "Base",
+ "DixonD",
+ "Steve.rusyn",
+ "SteveR",
+ "Ата",
+ "Piramidion"
+ ]
+ },
+ "scribunto-desc": "Фреймворк для включення скриптових мов на сторінки MediaWiki",
+ "scribunto-line": "у рядку $1",
+ "scribunto-module-line": "у $1 у рядку $2",
+ "scribunto-parser-dialog-title": "Помилка скрипту",
+ "scribunto-error-short": "Помилка скрипту: $1",
+ "scribunto-error-long": "Помилки скрипту:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/документація",
+ "scribunto-doc-page-does-not-exist": "''Документацію для цього модуля можна створити у [[$1]]''",
+ "scribunto-doc-page-header": "'''Це сторінка документації для [[$1]]'''",
+ "scribunto-console-intro": "* Експорти модуля доступні як змінна \"p\", у тому числі і незбережені зміни.\n* Починайте рядок з \"=\", щоб обчислити його як вираз, або використовуйте print(). Використовуйте mw.logObject() для таблиць.\n* Використовуйте mw.log() та mw.logObject() у коді модуля, щоб надіслати повідомлення в цю консоль.",
+ "scribunto-console-title": "Консоль налагодження",
+ "scribunto-console-too-large": "Цей сеанс консолі занадто великий. Очистіть історію консолі або зменшіть розмір модуля.",
+ "scribunto-console-current-src": "консольному вводі",
+ "scribunto-console-clear": "Очистити",
+ "scribunto-console-cleared": "Консоль очищена, тому що модуль був оновлений.",
+ "scribunto-console-cleared-session-lost": "Стан консолі очищено, оскільки втрачені дані сесії.",
+ "scribunto-common-error-category": "Сторінки з помилками скриптів",
+ "scribunto-common-error-category-desc": "Сталася помилка при обробці модулів, включених на сторінці.",
+ "scribunto-common-nosuchmodule": "Помилка скрипту: Не існує модуля «$2».",
+ "scribunto-common-nofunction": "Помилка скрипту: Ви повинні вказати функцію для виклику.",
+ "scribunto-common-nosuchfunction": "Помилка скрипту: Функції «$2» не існує.",
+ "scribunto-common-notafunction": "Помилка скрипту: «$2» не є функцією.",
+ "scribunto-common-timeout": "Закінчився час, виділений для виконання скриптів.",
+ "scribunto-common-oom": "Перевищено розмір пам'яті, дозволений для виконання скриптів.",
+ "scribunto-common-backtrace": "Зворотне трасування:",
+ "scribunto-common-no-details": "Немає жодних деталей.",
+ "scribunto-lua-in-function": "у функції «$1»",
+ "scribunto-lua-in-main": "в головній частині коду",
+ "scribunto-lua-in-function-at": "у функції в $1:$2",
+ "scribunto-lua-error-location": "Помилка Lua $1: $2.",
+ "scribunto-lua-error": "Помилка Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Помилка скрипту: Модуль повернув значення $2. Він повинен повертати таблицю експорту.",
+ "scribunto-luastandalone-proc-error": "Помилка Lua: Неможливо створити процес.",
+ "scribunto-luastandalone-proc-error-msg": "Помилка Lua: Неможливо створити процес $2.",
+ "scribunto-luastandalone-proc-error-proc-open": "Помилка Lua: не вдалося створити процес - proc_open недоступна. Перевірте директиви конфігурації РНР \"disable_functions\".",
+ "scribunto-luastandalone-decode-error": "Помилка Lua: Внутрішня помилка: Не вдається декодувати повідомлення.",
+ "scribunto-luastandalone-write-error": "Помилка Lua: Внутрішня помилка: Помилка запису в конвеєр.",
+ "scribunto-luastandalone-read-error": "Помилка Lua: Внутрішня помилка: Помилка читання з конвеєра.",
+ "scribunto-luastandalone-gone": "Помилка Lua: Внутрішня помилка: Інтерпретатор вже завершив роботу.",
+ "scribunto-luastandalone-signal": "Помилка Lua: Внутрішня помилка: Інтерпретатор було зупинено з сигналом «$2».",
+ "scribunto-luastandalone-exited": "Помилка Lua: Внутрішня помилка: Інтерпретатор завершив роботу зі статусом $2.",
+ "scribunto-module-with-errors-category": "Модулі Scribunto з помилками",
+ "scribunto-module-with-errors-category-desc": "У модулі є помилка.",
+ "scribunto-limitreport-timeusage": "Час використання Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 секунд",
+ "scribunto-limitreport-virtmemusage": "Віртуальний розмір Lua",
+ "scribunto-limitreport-estmemusage": "Можливе використання пам'яті Lua",
+ "scribunto-limitreport-memusage": "Використання пам'яті Lua",
+ "scribunto-limitreport-profile": "Профіль Lua",
+ "scribunto-limitreport-profile-ms": "$1 мс",
+ "scribunto-limitreport-logs": "Журнали Lua",
+ "apihelp-scribunto-console-description": "Внутрішній модуль обробки XHR-запитів з консолі Scribunto.",
+ "apihelp-scribunto-console-summary": "Внутрішній модуль обробки XHR-запитів з консолі Scribunto.",
+ "apihelp-scribunto-console-param-title": "Назва модуля для тесту.",
+ "apihelp-scribunto-console-param-content": "Новий вміст модуля.",
+ "apihelp-scribunto-console-param-session": "Токен сесії.",
+ "apihelp-scribunto-console-param-question": "Наступний рядок для оцінки як скрипта.",
+ "apihelp-scribunto-console-param-clear": "Встановіть для очистки поточного стану сесії.",
+ "nstab-module": "Модуль",
+ "tooltip-ca-nstab-module": "Переглянути сторінку модуля"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/ur.json b/www/wiki/extensions/Scribunto/i18n/ur.json
new file mode 100644
index 00000000..ee8c2402
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/ur.json
@@ -0,0 +1,27 @@
+{
+ "@metadata": {
+ "authors": [
+ "Muhammad Shuaib",
+ "McDutchie",
+ "Obaid Raza",
+ "BukhariSaeed"
+ ]
+ },
+ "scribunto-line": "سطر $1 پر",
+ "scribunto-module-line": "$1 میں $2 سطر پر",
+ "scribunto-parser-dialog-title": "اسکرپٹ خطا",
+ "scribunto-error-short": "اسکرپٹ خطا: $1",
+ "scribunto-error-long": "اسکرپٹ خطا:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/دستاویز",
+ "scribunto-doc-page-does-not-exist": "''اس ماڈیول کی دستاویز [[$1]] پر بنائی جاسکتی ہے''",
+ "scribunto-doc-page-header": "'''یہ [[$1]] کا دستاویزی صفحہ ہے'''",
+ "scribunto-console-clear": "صاف کریں",
+ "scribunto-common-error-category": "صفحات مع اسکرپٹ نقائص",
+ "scribunto-common-nosuchmodule": "خطائے اسکرپٹ: \"$2\" کے نام کا ماڈیول موجود نہیں۔",
+ "scribunto-common-timeout": "اسکرپٹ چلانے کے لیے مختص کردہ وقت ختم ہو چکا ہے۔",
+ "scribunto-common-no-details": "کوئی اضافہ معلومات میسر نہیں۔",
+ "scribunto-lua-error-location": "لوا خطا $1: $2۔",
+ "scribunto-lua-error": "لوا خطا: $2۔",
+ "scribunto-limitreport-profile": "لوا پروفائل",
+ "apihelp-scribunto-console-param-session": "نشست ٹوکن۔"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/vec.json b/www/wiki/extensions/Scribunto/i18n/vec.json
new file mode 100644
index 00000000..27060077
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/vec.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Candalua"
+ ]
+ },
+ "scribunto-common-error-category": "Pagine co erori de script",
+ "scribunto-lua-error": "Error Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/vep.json b/www/wiki/extensions/Scribunto/i18n/vep.json
new file mode 100644
index 00000000..08c18bc5
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/vep.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Игорь Бродский"
+ ]
+ },
+ "scribunto-lua-error": "Lua-petuz: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/vi.json b/www/wiki/extensions/Scribunto/i18n/vi.json
new file mode 100644
index 00000000..aad10b25
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/vi.json
@@ -0,0 +1,68 @@
+{
+ "@metadata": {
+ "authors": [
+ "Minh Nguyen",
+ "Max20091"
+ ]
+ },
+ "scribunto-desc": "Khuôn khổ đế nhúng ngôn ngữ kịch bản vào các trang MediaWiki",
+ "scribunto-line": "tại dòng $1",
+ "scribunto-module-line": "trong $1 tại dòng $2",
+ "scribunto-parser-dialog-title": "Lỗi kịch bản",
+ "scribunto-error-short": "Lỗi kịch bản: $1",
+ "scribunto-error-long": "Lỗi kịch bản:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/tài liệu",
+ "scribunto-doc-page-does-not-exist": "''Có thể viết tài liệu về mô đun này tại [[$1]].''",
+ "scribunto-doc-page-header": "'''Đây là trang dành cho tài liệu về [[$1]].'''",
+ "scribunto-console-intro": "* Các giá trị được xuất khẩu từ mô đun, bao gồm các thay đổi chưa lưu, có sẵn trong biến “p”.\n* Đưa “=” vào đầu dòng để tính toán nó như một biểu thức hoặc sử dụng print(). Sử dụng mw.logObject() cho bảng.\n* Sử dụng mw.log() và mw.logObject() trong mã mô đun để đưa thông điệp vào bảng điều khiển này.",
+ "scribunto-console-title": "Bảng điều khiển gỡ lỗi",
+ "scribunto-console-too-large": "Phiên bảng điều khiển này đã dài quá. Xin vui lòng tẩy trống lịch sử bảng điều khiển hoặc giảm cỡ mô đun.",
+ "scribunto-console-current-src": "đầu vào bảng điều khiển",
+ "scribunto-console-clear": "Tẩy trống",
+ "scribunto-console-cleared": "Trạng thái bảng điều khiển được tẩy trống vì mô đun đã được cập nhật.",
+ "scribunto-console-cleared-session-lost": "Trạng thái bảng điều khiển được tẩy trống do mất dữ liệu phiên làm việc.",
+ "scribunto-common-error-category": "Trang có lỗi kịch bản",
+ "scribunto-common-error-category-desc": "Đã xuất hiện lỗi khi xử lý các mô đun được gọi bởi trang này.",
+ "scribunto-common-nosuchmodule": "Lỗi kịch bản: Không tìm thấy mô đun “$2”.",
+ "scribunto-common-nofunction": "Lỗi kịch bản: Bạn cần phải định rõ hàm để gọi.",
+ "scribunto-common-nosuchfunction": "Lỗi kịch bản: Hàm “$2” không tồn tại.",
+ "scribunto-common-notafunction": "Lỗi kịch bản: “$2” không phải là hàm.",
+ "scribunto-common-timeout": "Đã hết thời gian dành để chạy kịch bản.",
+ "scribunto-common-oom": "Đã vượt quá lượng bộ nhớ dành để chạy kịch bản.",
+ "scribunto-common-backtrace": "Danh sách ngăn xếp:",
+ "scribunto-common-no-details": "Không có thêm chi tiết.",
+ "scribunto-lua-in-function": "trong hàm “$1”",
+ "scribunto-lua-in-main": "trong đoạn chính",
+ "scribunto-lua-in-function-at": "trong hàm tại $1:$2",
+ "scribunto-lua-backtrace-line": "$1: $2",
+ "scribunto-lua-error-location": "Lỗi Lua $1: $2.",
+ "scribunto-lua-error": "Lỗi Lua: $2.",
+ "scribunto-lua-notarrayreturn": "Lỗi kịch bản: Mô đun cho ra giá trị $2. Nó cần phải cho ra một bảng xuất khẩu.",
+ "scribunto-luastandalone-proc-error": "Lỗi Lua: Không thể tạo ra quá trình.",
+ "scribunto-luastandalone-proc-error-msg": "Lỗi Lua: Không thể tạo quá trình: $2",
+ "scribunto-luastandalone-proc-error-proc-open": "Lỗi Lua: Không thể tạo quá trình: proc_open không có sẵn. Hãy kiểm tra chỉ thị cấu hình “disable_functions” của PHP.",
+ "scribunto-luastandalone-decode-error": "Lỗi Lua: Lỗi nội bộ: Không thể giải mã thông điệp.",
+ "scribunto-luastandalone-write-error": "Lỗi Lua: Lỗi nội bộ: Lỗi khi ghi vào đường ống.",
+ "scribunto-luastandalone-read-error": "Lỗi Lua: Lỗi nội bộ: Lỗi khi đọc từ đường ống.",
+ "scribunto-luastandalone-gone": "Lỗi Lua: Lỗi nội bộ: Bộ phân tích đã thoát.",
+ "scribunto-luastandalone-signal": "Lỗi Lua: Lỗi nội bộ: Bộ phân tích đã kết thúc với tín hiệu “$2”.",
+ "scribunto-luastandalone-exited": "Lỗi Lua: Lỗi nội bộ: Bộ phân tích đã thoát với trạng thái $2.",
+ "scribunto-module-with-errors-category": "Mô đun Scribunto có lỗi",
+ "scribunto-module-with-errors-category-desc": "Mô đun này có lỗi.",
+ "scribunto-limitreport-timeusage": "Thời gian sử dụng Lua",
+ "scribunto-limitreport-timeusage-value": "$1/$2 giây",
+ "scribunto-limitreport-virtmemusage": "Kích thước ảo Lua",
+ "scribunto-limitreport-estmemusage": "Ước lượng sử dụng bộ nhớ Lua",
+ "scribunto-limitreport-memusage": "Sử dụng bộ nhớ Lua",
+ "scribunto-limitreport-profile": "Hồ sơ Lua",
+ "scribunto-limitreport-profile-ms": "$1 ms",
+ "scribunto-limitreport-logs": "Lời ghi Lua",
+ "apihelp-scribunto-console-description": "Mô đun nội bộ để phản hồi các yêu cầu XHR từ bảng điều khiển Scribunto.",
+ "apihelp-scribunto-console-param-title": "Tên mô đun để thử.",
+ "apihelp-scribunto-console-param-content": "Nội dung mới của mô đun.",
+ "apihelp-scribunto-console-param-session": "Dấu phiên làm việc.",
+ "apihelp-scribunto-console-param-question": "Dòng sau để đánh giá như một kịch bản.",
+ "apihelp-scribunto-console-param-clear": "Đặt để xóa trạng thái phiên làm việc hiện tại.",
+ "nstab-module": "Mô đun",
+ "tooltip-ca-nstab-module": "Xem trang mô đun"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/vo.json b/www/wiki/extensions/Scribunto/i18n/vo.json
new file mode 100644
index 00000000..924898f7
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/vo.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Malafaya"
+ ]
+ },
+ "scribunto-lua-error": "Pök ela 'Lua': $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/vro.json b/www/wiki/extensions/Scribunto/i18n/vro.json
new file mode 100644
index 00000000..ced79657
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/vro.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Võrok"
+ ]
+ },
+ "scribunto-lua-error": "Lua-viga: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/wa.json b/www/wiki/extensions/Scribunto/i18n/wa.json
new file mode 100644
index 00000000..e763e338
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/wa.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Srtxg",
+ "Reptilien.19831209BE1"
+ ]
+ },
+ "scribunto-common-error-category": "Pådjes avou des flotches di scripe",
+ "scribunto-lua-error": "Aroke Lua: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/war.json b/www/wiki/extensions/Scribunto/i18n/war.json
new file mode 100644
index 00000000..1813d83c
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/war.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "JinJian"
+ ]
+ },
+ "scribunto-lua-error": "Sayop ha Lua:$2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/wo.json b/www/wiki/extensions/Scribunto/i18n/wo.json
new file mode 100644
index 00000000..465e26cf
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/wo.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ibou"
+ ]
+ },
+ "scribunto-lua-error": "Njuumteg Lua: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/wuu.json b/www/wiki/extensions/Scribunto/i18n/wuu.json
new file mode 100644
index 00000000..78216893
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/wuu.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Poiuyt"
+ ]
+ },
+ "scribunto-lua-error": "Lua出错:$2。"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/xal.json b/www/wiki/extensions/Scribunto/i18n/xal.json
new file mode 100644
index 00000000..75bbdd76
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/xal.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Huuchin"
+ ]
+ },
+ "scribunto-lua-error": "Lua эндү: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/xmf.json b/www/wiki/extensions/Scribunto/i18n/xmf.json
new file mode 100644
index 00000000..0d3b1abe
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/xmf.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Silovan"
+ ]
+ },
+ "scribunto-lua-error": "ჩილათა Lua: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/yi.json b/www/wiki/extensions/Scribunto/i18n/yi.json
new file mode 100644
index 00000000..6972e11e
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/yi.json
@@ -0,0 +1,27 @@
+{
+ "@metadata": {
+ "authors": [
+ "פוילישער",
+ "පසිඳු කාවින්ද"
+ ]
+ },
+ "scribunto-line": "אין שורה $1",
+ "scribunto-module-line": "אין $1, שורה $2",
+ "scribunto-parser-dialog-title": "סקריפט פֿעלער",
+ "scribunto-error-short": "סקריפט פֿעלער: $1",
+ "scribunto-error-long": "סקריפט פֿעלער:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/דאק",
+ "scribunto-doc-page-does-not-exist": "מען קען שאפן דאקומענטאציע פאר דעם מאדול ביי [[$1]]",
+ "scribunto-doc-page-header": "'''דאָס איז דער דאקומענטאציע בלאַט פֿאַר [[$1]]'''",
+ "scribunto-console-clear": "רייניקן",
+ "scribunto-common-error-category": "בלעטער מיט סקריפט פֿעלער",
+ "scribunto-common-nosuchmodule": "סקריפט־פעלער: נישט פאראן אזא מאדול \"$2\" .",
+ "scribunto-common-nosuchfunction": "סקריפט פֿעלער: די פֿונקציע \"$2\" עקזיסטירט נישט.",
+ "scribunto-common-notafunction": "סקריפט פֿעלער: \"$2\" איז נישט קיין פֿונקציע.",
+ "scribunto-lua-in-function": "אין פֿונקציע \"$1\"",
+ "scribunto-lua-error-location": "לוא־פעלער $1: $2.",
+ "scribunto-lua-error": "לוא־פעלער: $2.",
+ "scribunto-limitreport-profile": "לוא פראפֿיל",
+ "nstab-module": "מאדול",
+ "tooltip-ca-nstab-module": "באַקוקן דעם מאדול־בלאַט"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/yo.json b/www/wiki/extensions/Scribunto/i18n/yo.json
new file mode 100644
index 00000000..1cdd2bd8
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/yo.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Demmy"
+ ]
+ },
+ "scribunto-lua-error": "Àsìṣe Lua: $2"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/yue.json b/www/wiki/extensions/Scribunto/i18n/yue.json
new file mode 100644
index 00000000..e6256d02
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/yue.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Antonytse",
+ "Yueman"
+ ]
+ },
+ "scribunto-lua-error": "Lua出錯:$2。",
+ "scribunto-limitreport-profile-ms": "$1毫秒"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/zgh.json b/www/wiki/extensions/Scribunto/i18n/zgh.json
new file mode 100644
index 00000000..be1af6a0
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/zgh.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amara-Amaziɣ"
+ ]
+ },
+ "scribunto-lua-error": "ⵜⴰⵣⴳⵍⵜ ⵍⵓⵡⴰ: $2."
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/zh-hans.json b/www/wiki/extensions/Scribunto/i18n/zh-hans.json
new file mode 100644
index 00000000..6fd73e7c
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/zh-hans.json
@@ -0,0 +1,74 @@
+{
+ "@metadata": {
+ "authors": [
+ "Liangent",
+ "Liuxinyu970226",
+ "Xiaomingyan",
+ "Yfdyh000",
+ "Duolaimi",
+ "Arthur2e5",
+ "SolidBlock"
+ ]
+ },
+ "scribunto-desc": "嵌入脚本语言到MediaWiki页面中的框架",
+ "scribunto-line": "第$1行",
+ "scribunto-module-line": "$1的第$2行",
+ "scribunto-parser-dialog-title": "脚本错误",
+ "scribunto-error-short": "脚本错误:$1",
+ "scribunto-error-long": "脚本错误:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''此模块的文档可以在[[$1]]创建''",
+ "scribunto-doc-page-header": "'''这是[[$1]]的文档页面'''",
+ "scribunto-console-intro": "* 此模块的返回的值存于控制台变量“p”中,包括没有保存的变更。\n* 在一行的前面加上“=”或使用print()可以将其作为表达式来计算。表格请使用mw.logObject()。\n* 在模块代码中使用mw.log()和mw.logObject()来向控制台发送消息。",
+ "scribunto-console-title": "调试控制台",
+ "scribunto-console-too-large": "此控制台会话太大。请清除控制台历史记录或减少模块的大小。",
+ "scribunto-console-current-src": "控制台输入",
+ "scribunto-console-clear": "清除",
+ "scribunto-console-cleared": "控制台状态已清除,因为模块已更新。",
+ "scribunto-console-cleared-session-lost": "控制台状态已清除,因为会话数据已丢失。",
+ "scribunto-common-error-category": "有脚本错误的页面",
+ "scribunto-common-error-category-desc": "处理页面嵌入的模块时出错。",
+ "scribunto-common-nosuchmodule": "脚本错误:没有“$2”这个模块。",
+ "scribunto-common-nofunction": "脚本错误:您必须指定要调用的函数。",
+ "scribunto-common-nosuchfunction": "脚本错误:函数“$2”不存在。",
+ "scribunto-common-notafunction": "脚本错误:“$2”不是函数。",
+ "scribunto-common-timeout": "为运行的脚本分配的时间已耗尽。",
+ "scribunto-common-oom": "运行的脚本超出允许的内存用量。",
+ "scribunto-common-backtrace": "回溯:",
+ "scribunto-common-no-details": "没有可用的进一步细节。",
+ "scribunto-lua-in-function": "在函数“$1”中",
+ "scribunto-lua-in-main": "在主块中",
+ "scribunto-lua-in-function-at": "在函数 $1:$2 中",
+ "scribunto-lua-error-location": "Lua错误 $1:$2",
+ "scribunto-lua-error": "Lua错误:$2。",
+ "scribunto-lua-notarrayreturn": "脚本错误:该模块返回了一个 $2 值。它应该返回一个导出表。",
+ "scribunto-luastandalone-proc-error": "Lua错误:无法创建进程。",
+ "scribunto-luastandalone-proc-error-msg": "Lua错误:无法创建进程:$2",
+ "scribunto-luastandalone-proc-error-proc-open": "Lua错误:无法创建进程:proc_open不可用。请检查PHP的指令配置“disable_functions”。",
+ "scribunto-luastandalone-decode-error": "Lua错误:内部错误:无法解码消息。",
+ "scribunto-luastandalone-write-error": "Lua错误:内部错误:写入管道时出错。",
+ "scribunto-luastandalone-read-error": "Lua错误:内部错误:从管道读取时出错。",
+ "scribunto-luastandalone-gone": "Lua错误:内部错误:解释器已退出。",
+ "scribunto-luastandalone-signal": "Lua错误:内部错误:解释器因收到信号“$2”而终止。",
+ "scribunto-luastandalone-exited": "Lua错误:内部错误:解释器已退出,状态为$2。",
+ "scribunto-module-with-errors-category": "有错误的Scribunto模块",
+ "scribunto-module-with-errors-category-desc": "模块有错误。",
+ "scribunto-limitreport-timeusage": "Lua使用时间",
+ "scribunto-limitreport-timeusage-value": "$1/$2秒",
+ "scribunto-limitreport-virtmemusage": "Lua虚拟尺寸",
+ "scribunto-limitreport-estmemusage": "Lua估计的内存使用情况",
+ "scribunto-limitreport-memusage": "Lua内存使用情况",
+ "scribunto-limitreport-profile": "Lua属性",
+ "scribunto-limitreport-profile-ms": "$1毫秒",
+ "scribunto-limitreport-profile-percent": "$1%",
+ "scribunto-limitreport-logs": "Lua日志",
+ "apihelp-scribunto-console-description": "从Scribunto控制台提供XHR请求的内部模块。",
+ "apihelp-scribunto-console-summary": "从Scribunto控制台提供XHR请求的内部模块。",
+ "apihelp-scribunto-console-param-title": "要测试的模块的标题。",
+ "apihelp-scribunto-console-param-content": "模块的新内容。",
+ "apihelp-scribunto-console-param-session": "会话令牌。",
+ "apihelp-scribunto-console-param-question": "要作为脚本评估的下一行。",
+ "apihelp-scribunto-console-param-clear": "设置以清除当前的会话状态。",
+ "nstab-module": "模块",
+ "tooltip-ca-nstab-module": "查看模块页面"
+}
diff --git a/www/wiki/extensions/Scribunto/i18n/zh-hant.json b/www/wiki/extensions/Scribunto/i18n/zh-hant.json
new file mode 100644
index 00000000..53a9652d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/i18n/zh-hant.json
@@ -0,0 +1,65 @@
+{
+ "@metadata": {
+ "authors": [
+ "Liuxinyu970226",
+ "Yfdyh000",
+ "Spring Roll Conan",
+ "LNDDYL",
+ "Cwlin0416",
+ "A2093064"
+ ]
+ },
+ "scribunto-desc": "用來內嵌腳本語言到 MediaWiki 頁面的框架",
+ "scribunto-line": "在第 $1 行",
+ "scribunto-module-line": "於 $1 中的第 $2 行",
+ "scribunto-parser-dialog-title": "腳本錯誤",
+ "scribunto-error-short": "腳本錯誤:$1",
+ "scribunto-error-long": "腳本錯誤:\n\n$1",
+ "scribunto-doc-page-name": "Module:$1/doc",
+ "scribunto-doc-page-does-not-exist": "''此模組的說明文件可於 [[$1]] 建立''",
+ "scribunto-doc-page-header": "'''此頁面為 [[$1]] 的說明文件'''",
+ "scribunto-console-intro": "* 該模組的匯出資訊可透過變數 \"p\" 來取得,包含尚未儲存的修改。\n* 在行的前面加上 \"=\" 可將該行作為運算式來評估執行,或使用 print()。\n* 在模組程式碼中使用 mw.log() 以傳送訊息至主控台。",
+ "scribunto-console-title": "除錯主控台",
+ "scribunto-console-too-large": "此主控台工作階段過大,請清除主控台的歷史記錄或減少該模組的大小。",
+ "scribunto-console-current-src": "主控台輸入",
+ "scribunto-console-clear": "清除",
+ "scribunto-console-cleared": "因模組已更新,主控台狀態已清除。",
+ "scribunto-console-cleared-session-lost": "因連線階段資料已遺失,主控台狀態已清除。",
+ "scribunto-common-error-category": "含有腳本錯誤的頁面",
+ "scribunto-common-error-category-desc": "處理此頁面的模組時發生錯誤。",
+ "scribunto-common-nosuchmodule": "腳本錯誤:沒有 \"$2\" 這個模組。",
+ "scribunto-common-nofunction": "腳本錯誤:您必須指定要呼叫的函數。",
+ "scribunto-common-nosuchfunction": "腳本錯誤:函數 \"$2\" 不存在。",
+ "scribunto-common-notafunction": "腳本錯誤:\"$2\" 不是函數。",
+ "scribunto-common-timeout": "分配用來執行腳本的時間已到期。",
+ "scribunto-common-oom": "已超出執行腳本允許的記憶體用量。",
+ "scribunto-common-backtrace": "回溯:",
+ "scribunto-lua-in-function": "於函數 \"$1\"",
+ "scribunto-lua-in-main": "於主要區塊",
+ "scribunto-lua-in-function-at": "於函數 $1:$2",
+ "scribunto-lua-error-location": "Lua 錯誤 $1:$2。",
+ "scribunto-lua-error": "Lua 錯誤:$2。",
+ "scribunto-lua-notarrayreturn": "腳本錯誤:模組回傳 $2 數值,該模組應該回傳匯出資料表。",
+ "scribunto-luastandalone-proc-error": "Lua 錯誤:無法建立程序。",
+ "scribunto-luastandalone-proc-error-msg": "Lua 錯誤:無法建立程序:$2",
+ "scribunto-luastandalone-proc-error-proc-open": "Lua 錯誤:無法建立程序:proc_open 無法使用。檢查 PHP 的 \"disable_functions\" 設定宣告。",
+ "scribunto-luastandalone-decode-error": "Lua 錯誤:內部錯誤:無法解碼訊息。",
+ "scribunto-luastandalone-write-error": "Lua 錯誤:內部錯誤:寫入縱線時發生錯誤。",
+ "scribunto-luastandalone-read-error": "Lua 錯誤:內部錯誤:從縱線讀取時發生錯誤。",
+ "scribunto-luastandalone-gone": "Lua 錯誤:內部錯誤:直譯器早已結束。",
+ "scribunto-luastandalone-signal": "Lua 錯誤:內部錯誤:直譯器因收到信號 \"$2\" 已中止。",
+ "scribunto-luastandalone-exited": "Lua 錯誤:內部錯誤:直譯器已結束,狀態碼為 $2。",
+ "scribunto-module-with-errors-category": "Scribunto 模組有錯誤",
+ "scribunto-module-with-errors-category-desc": "該模組中有一個錯誤。",
+ "scribunto-limitreport-timeusage": "Lua 使用時間",
+ "scribunto-limitreport-timeusage-value": "$1/$2 秒",
+ "scribunto-limitreport-virtmemusage": "Lua 虛擬大小",
+ "scribunto-limitreport-estmemusage": "Lua 估計記憶體使用狀況",
+ "scribunto-limitreport-memusage": "Lua 記憶體使用狀況",
+ "scribunto-limitreport-profile": "Lua 設定檔",
+ "scribunto-limitreport-profile-ms": "$1 毫秒",
+ "scribunto-limitreport-profile-percent": "$1%",
+ "scribunto-limitreport-logs": "Lua 日誌",
+ "apihelp-scribunto-console-param-title": "要測試的模組標題。",
+ "nstab-module": "模組"
+}
diff --git a/www/wiki/extensions/Scribunto/includes/common/ApiScribuntoConsole.php b/www/wiki/extensions/Scribunto/includes/common/ApiScribuntoConsole.php
new file mode 100644
index 00000000..22f29668
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/common/ApiScribuntoConsole.php
@@ -0,0 +1,150 @@
+<?php
+
+/**
+ * API module for serving debug console requests on the edit page
+ */
+
+class ApiScribuntoConsole extends ApiBase {
+ const SC_MAX_SIZE = 500000;
+ const SC_SESSION_EXPIRY = 3600;
+
+ public function execute() {
+ $params = $this->extractRequestParams();
+
+ $title = Title::newFromText( $params['title'] );
+ if ( !$title ) {
+ $this->dieWithError( [ 'apierror-invalidtitle', wfEscapeWikiText( $params['title'] ) ] );
+ }
+
+ if ( $params['session'] ) {
+ $sessionId = $params['session'];
+ } else {
+ $sessionId = mt_rand( 0, 0x7fffffff );
+ }
+
+ $cache = ObjectCache::getInstance( CACHE_ANYTHING );
+ $sessionKey = $cache->makeKey( 'scribunto-console', $this->getUser()->getId(), $sessionId );
+ $session = null;
+ $sessionIsNew = false;
+ if ( $params['session'] ) {
+ $session = $cache->get( $sessionKey );
+ }
+ if ( !isset( $session['version'] ) ) {
+ $session = $this->newSession();
+ $sessionIsNew = true;
+ }
+
+ // Create a variable holding the session which will be stored if there
+ // are no errors. If there are errors, we don't want to store the current
+ // question to the state builder array, since that will cause subsequent
+ // requests to fail.
+ $newSession = $session;
+
+ if ( !empty( $params['clear'] ) ) {
+ $newSession['size'] -= strlen( implode( '', $newSession['questions'] ) );
+ $newSession['questions'] = [];
+ $session['questions'] = [];
+ }
+ if ( strlen( $params['question'] ) ) {
+ $newSession['size'] += strlen( $params['question'] );
+ $newSession['questions'][] = $params['question'];
+ }
+ if ( $params['content'] ) {
+ $newSession['size'] += strlen( $params['content'] ) - strlen( $newSession['content'] );
+ $newSession['content'] = $params['content'];
+ }
+
+ if ( $newSession['size'] > self::SC_MAX_SIZE ) {
+ $this->dieWithError( 'scribunto-console-too-large' );
+ }
+ $result = $this->runConsole( [
+ 'title' => $title,
+ 'content' => $newSession['content'],
+ 'prevQuestions' => $session['questions'],
+ 'question' => $params['question'],
+ ] );
+
+ if ( $result['type'] === 'error' ) {
+ // Restore the questions array
+ $newSession['questions'] = $session['questions'];
+ }
+ $cache->set( $sessionKey, $newSession, self::SC_SESSION_EXPIRY );
+ $result['session'] = $sessionId;
+ $result['sessionSize'] = $newSession['size'];
+ $result['sessionMaxSize'] = self::SC_MAX_SIZE;
+ if ( $sessionIsNew ) {
+ $result['sessionIsNew'] = '';
+ }
+ foreach ( $result as $key => $value ) {
+ $this->getResult()->addValue( null, $key, $value );
+ }
+ }
+
+ protected function runConsole( array $params ) {
+ global $wgParser;
+ $options = new ParserOptions;
+ $wgParser->startExternalParse( $params['title'], $options, Parser::OT_HTML, true );
+ $engine = Scribunto::getParserEngine( $wgParser );
+ try {
+ $result = $engine->runConsole( $params );
+ } catch ( ScribuntoException $e ) {
+ $trace = $e->getScriptTraceHtml();
+ $message = $e->getMessage();
+ $html = Html::element( 'p', [], $message );
+ if ( $trace !== false ) {
+ $html .= Html::element( 'p',
+ [],
+ $this->msg( 'scribunto-common-backtrace' )->inContentLanguage()->text()
+ ) . $trace;
+ }
+
+ return [
+ 'type' => 'error',
+ 'html' => $html,
+ 'message' => $message,
+ 'messagename' => $e->getMessageName() ];
+ }
+ return [
+ 'type' => 'normal',
+ 'print' => strval( $result['print'] ),
+ 'return' => strval( $result['return'] )
+ ];
+ }
+
+ /**
+ * @return array
+ */
+ protected function newSession() {
+ return [
+ 'content' => '',
+ 'questions' => [],
+ 'size' => 0,
+ 'version' => 1,
+ ];
+ }
+
+ public function isInternal() {
+ return true;
+ }
+
+ public function getAllowedParams() {
+ return [
+ 'title' => [
+ ApiBase::PARAM_TYPE => 'string',
+ ],
+ 'content' => [
+ ApiBase::PARAM_TYPE => 'string'
+ ],
+ 'session' => [
+ ApiBase::PARAM_TYPE => 'integer',
+ ],
+ 'question' => [
+ ApiBase::PARAM_TYPE => 'string',
+ ApiBase::PARAM_REQUIRED => true,
+ ],
+ 'clear' => [
+ ApiBase::PARAM_TYPE => 'boolean',
+ ],
+ ];
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/includes/common/Base.php b/www/wiki/extensions/Scribunto/includes/common/Base.php
new file mode 100644
index 00000000..e6c78111
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/common/Base.php
@@ -0,0 +1,361 @@
+<?php
+
+/**
+ * Wikitext scripting infrastructure for MediaWiki: base classes.
+ * Copyright (C) 2012 Victor Vasiliev <vasilvv@gmail.com> et al
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+/**
+ * Base class for all script engines. Includes all code
+ * not related to particular modules, like tracking links between
+ * modules or loading module texts.
+ */
+abstract class ScribuntoEngineBase {
+
+ // Flags for ScribuntoEngineBase::getResourceUsage()
+ const CPU_SECONDS = 1;
+ const MEM_PEAK_BYTES = 2;
+
+ /**
+ * @var Title
+ */
+ protected $title;
+
+ /**
+ * @var array
+ */
+ protected $options;
+
+ /**
+ * @var ScribuntoModuleBase[]
+ */
+ protected $modules = [];
+
+ /**
+ * @var Parser
+ */
+ protected $parser;
+
+ /**
+ * Creates a new module object within this engine
+ *
+ * @param string $text
+ * @param string|bool $chunkName
+ * @return ScribuntoModuleBase
+ */
+ abstract protected function newModule( $text, $chunkName );
+
+ /**
+ * Run an interactive console request
+ *
+ * @param array $params Associative array. Options are:
+ * - title: The title object for the module being debugged
+ * - content: The text content of the module
+ * - prevQuestions: An array of previous "questions" used to establish the state
+ * - question: The current "question", a string script
+ *
+ * @return array containing:
+ * - print: The resulting print buffer
+ * - return: The resulting return value
+ */
+ abstract function runConsole( array $params );
+
+ /**
+ * Get software information for Special:Version
+ * @param array &$software
+ */
+ abstract public function getSoftwareInfo( array &$software );
+
+ /**
+ * @param array $options Associative array of options:
+ * - parser: A Parser object
+ */
+ public function __construct( array $options ) {
+ $this->options = $options;
+ if ( isset( $options['parser'] ) ) {
+ $this->parser = $options['parser'];
+ }
+ if ( isset( $options['title'] ) ) {
+ $this->title = $options['title'];
+ }
+ }
+
+ public function __destruct() {
+ $this->destroy();
+ }
+
+ public function destroy() {
+ // Break reference cycles
+ $this->parser = null;
+ $this->title = null;
+ $this->modules = null;
+ }
+
+ /**
+ * @param Title $title
+ */
+ public function setTitle( $title ) {
+ $this->title = $title;
+ }
+
+ /**
+ * @return Title
+ */
+ public function getTitle() {
+ return $this->title;
+ }
+
+ /**
+ * Get an element from the configuration array
+ *
+ * @param string $optionName
+ * @return mixed
+ */
+ public function getOption( $optionName ) {
+ return isset( $this->options[$optionName] )
+ ? $this->options[$optionName] : null;
+ }
+
+ /**
+ * @param string $message
+ * @param array $params
+ * @return ScribuntoException
+ */
+ public function newException( $message, array $params = [] ) {
+ return new ScribuntoException( $message, $this->getDefaultExceptionParams() + $params );
+ }
+
+ /**
+ * @return array
+ */
+ public function getDefaultExceptionParams() {
+ $params = [];
+ if ( $this->title ) {
+ $params['title'] = $this->title;
+ }
+ return $params;
+ }
+
+ /**
+ * Load a module from some parser-defined template loading mechanism and
+ * register a parser output dependency.
+ *
+ * Does not initialize the module, i.e. do not expect it to complain if the module
+ * text is garbage or has syntax error. Returns a module or null if it doesn't exist.
+ *
+ * @param Title $title The title of the module
+ * @return ScribuntoModuleBase|null
+ */
+ function fetchModuleFromParser( Title $title ) {
+ $key = $title->getPrefixedDBkey();
+ if ( !array_key_exists( $key, $this->modules ) ) {
+ list( $text, $finalTitle ) = $this->parser->fetchTemplateAndTitle( $title );
+ if ( $text === false ) {
+ $this->modules[$key] = null;
+ return null;
+ }
+
+ $finalKey = $finalTitle->getPrefixedDBkey();
+ if ( !isset( $this->modules[$finalKey] ) ) {
+ $this->modules[$finalKey] = $this->newModule( $text, $finalKey );
+ }
+ // Almost certainly $key === $finalKey, but just in case...
+ $this->modules[$key] = $this->modules[$finalKey];
+ }
+ return $this->modules[$key];
+ }
+
+ /**
+ * Validates the script and returns a Status object containing the syntax
+ * errors for the given code.
+ *
+ * @param string $text
+ * @param string|bool $chunkName
+ * @return Status
+ */
+ function validate( $text, $chunkName = false ) {
+ $module = $this->newModule( $text, $chunkName );
+ return $module->validate();
+ }
+
+ /**
+ * Get CPU and memory usage information, if the script engine
+ * provides it.
+ *
+ * If the script engine is capable of reporting CPU and memory usage
+ * data, it should override this implementation.
+ *
+ * @param int $resource One of ScribuntoEngineBase::CPU_SECONDS
+ * or ScribuntoEngineBase::MEM_PEAK_BYTES.
+ * @return float|int|false Resource usage for the specified resource
+ * or false if not available.
+ */
+ public function getResourceUsage( $resource ) {
+ return false;
+ }
+
+ /**
+ * Get the language for GeSHi syntax highlighter.
+ * @return string|false
+ */
+ function getGeSHiLanguage() {
+ return false;
+ }
+
+ /**
+ * Get the language for Ace code editor.
+ * @return string|false
+ */
+ function getCodeEditorLanguage() {
+ return false;
+ }
+
+ /**
+ * @return Parser
+ */
+ public function getParser() {
+ return $this->parser;
+ }
+
+ /**
+ * Load a list of all libraries supported by this engine
+ *
+ * The return value is an array with keys being the library name seen by
+ * the module and values being either a PHP class name or an array with the
+ * following elements:
+ * - class: (string) Class to load (required)
+ * - deferLoad: (bool) Library should not be loaded at startup; modules
+ * needing the library must request it (e.g. via 'require' in Lua)
+ *
+ * @param string $engine script engine we're using (eg: lua)
+ * @param array $coreLibraries Array of core libraries we support
+ * @return array
+ */
+ protected function getLibraries( $engine, array $coreLibraries = [] ) {
+ $extraLibraries = [];
+ Hooks::run( 'ScribuntoExternalLibraries', [ $engine, &$extraLibraries ] );
+ return $coreLibraries + $extraLibraries;
+ }
+
+ /**
+ * Load a list of all paths libraries can be in for this engine
+ *
+ * @param string $engine script engine we're using (eg: lua)
+ * @param array $coreLibraryPaths Array of library paths to use by default
+ * @return array
+ */
+ protected function getLibraryPaths( $engine, array $coreLibraryPaths = [] ) {
+ $extraLibraryPaths = [];
+ Hooks::run( 'ScribuntoExternalLibraryPaths', [ $engine, &$extraLibraryPaths ] );
+ return array_merge( $coreLibraryPaths, $extraLibraryPaths );
+ }
+
+ /**
+ * Add limit report data to a ParserOutput object
+ *
+ * @param ParserOutput $output ParserOutput object in which to add limit data
+ * @return null
+ */
+ public function reportLimitData( ParserOutput $output ) {
+ }
+
+ /**
+ * Format limit report data
+ *
+ * @param string $key
+ * @param mixed &$value
+ * @param string &$report
+ * @param bool $isHTML
+ * @param bool $localize
+ * @return bool
+ */
+ public function formatLimitData( $key, &$value, &$report, $isHTML, $localize ) {
+ return true;
+ }
+}
+
+/**
+ * Class that represents a module. Responsible for initial module parsing
+ * and maintaining the contents of the module.
+ */
+abstract class ScribuntoModuleBase {
+ /**
+ * @var ScribuntoEngineBase
+ */
+ protected $engine;
+
+ /**
+ * @var string
+ */
+ protected $code;
+
+ /**
+ * @var string|bool
+ */
+ protected $chunkName;
+
+ /**
+ * @param ScribuntoEngineBase $engine
+ * @param string $code
+ * @param string|bool $chunkName
+ */
+ public function __construct( ScribuntoEngineBase $engine, $code, $chunkName ) {
+ $this->engine = $engine;
+ $this->code = $code;
+ $this->chunkName = $chunkName;
+ }
+
+ /**
+ * @return ScribuntoEngineBase
+ */
+ public function getEngine() {
+ return $this->engine;
+ }
+
+ /**
+ * @return string
+ */
+ public function getCode() {
+ return $this->code;
+ }
+
+ /**
+ * @return string|bool
+ */
+ public function getChunkName() {
+ return $this->chunkName;
+ }
+
+ /**
+ * Validates the script and returns a Status object containing the syntax
+ * errors for the given code.
+ *
+ * @return Status
+ */
+ abstract public function validate();
+
+ /**
+ * Invoke the function with the specified name.
+ *
+ * @param string $name
+ * @param PPFrame $frame
+ * @return string
+ */
+ abstract public function invoke( $name, $frame );
+}
diff --git a/www/wiki/extensions/Scribunto/includes/common/Common.php b/www/wiki/extensions/Scribunto/includes/common/Common.php
new file mode 100644
index 00000000..e92e615b
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/common/Common.php
@@ -0,0 +1,209 @@
+<?php
+
+/**
+ * Static function collection for general extension support.
+ */
+class Scribunto {
+ const LOCAL = 'local';
+
+ /**
+ * Create a new engine object with specified parameters.
+ *
+ * @param array $options
+ * @return ScribuntoEngineBase
+ */
+ public static function newEngine( $options ) {
+ if ( isset( $options['factory'] ) ) {
+ return call_user_func( $options['factory'], $options );
+ } else {
+ $class = $options['class'];
+ return new $class( $options );
+ }
+ }
+
+ /**
+ * Create a new engine object with default parameters
+ *
+ * @param array $extraOptions Extra options to pass to the constructor,
+ * in addition to the configured options
+ * @throws MWException
+ * @return ScribuntoEngineBase
+ */
+ public static function newDefaultEngine( $extraOptions = [] ) {
+ global $wgScribuntoDefaultEngine, $wgScribuntoEngineConf;
+ if ( !$wgScribuntoDefaultEngine ) {
+ throw new MWException(
+ 'Scribunto extension is enabled but $wgScribuntoDefaultEngine is not set'
+ );
+ }
+
+ if ( !isset( $wgScribuntoEngineConf[$wgScribuntoDefaultEngine] ) ) {
+ throw new MWException( 'Invalid scripting engine is specified in $wgScribuntoDefaultEngine' );
+ }
+ $options = $extraOptions + $wgScribuntoEngineConf[$wgScribuntoDefaultEngine];
+ return self::newEngine( $options );
+ }
+
+ /**
+ * Get an engine instance for the given parser, and cache it in the parser
+ * so that subsequent calls to this function for the same parser will return
+ * the same engine.
+ *
+ * @param Parser $parser
+ * @return ScribuntoEngineBase
+ */
+ public static function getParserEngine( Parser $parser ) {
+ if ( empty( $parser->scribunto_engine ) ) {
+ $parser->scribunto_engine = self::newDefaultEngine( [ 'parser' => $parser ] );
+ $parser->scribunto_engine->setTitle( $parser->getTitle() );
+ }
+ return $parser->scribunto_engine;
+ }
+
+ /**
+ * Check if an engine instance is present in the given parser
+ *
+ * @param Parser $parser
+ * @return bool
+ */
+ public static function isParserEnginePresent( Parser $parser ) {
+ return !empty( $parser->scribunto_engine );
+ }
+
+ /**
+ * Remove the current engine instance from the parser
+ * @param Parser $parser
+ */
+ public static function resetParserEngine( Parser $parser ) {
+ if ( !empty( $parser->scribunto_engine ) ) {
+ $parser->scribunto_engine->destroy();
+ $parser->scribunto_engine = null;
+ }
+ }
+
+ /**
+ * Test whether the page should be considered a documentation page
+ *
+ * @param Title $title
+ * @param Title|null &$forModule Module for which this is a doc page
+ * @return bool
+ */
+ public static function isDocPage( Title $title, Title &$forModule = null ) {
+ $docPage = wfMessage( 'scribunto-doc-page-name' )->inContentLanguage();
+ if ( $docPage->isDisabled() ) {
+ return false;
+ }
+
+ // Canonicalize the input pseudo-title. The unreplaced "$1" shouldn't
+ // cause a problem.
+ $docTitle = Title::newFromText( $docPage->plain() );
+ if ( !$docTitle ) {
+ return false;
+ }
+ $docPage = $docTitle->getPrefixedText();
+
+ // Make it into a regex, and match it against the input title
+ $docPage = str_replace( '\\$1', '(.+)', preg_quote( $docPage, '/' ) );
+ if ( preg_match( "/^$docPage$/", $title->getPrefixedText(), $m ) ) {
+ $forModule = Title::makeTitleSafe( NS_MODULE, $m[1] );
+ return $forModule !== null;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Return the Title for the documentation page
+ *
+ * @param Title $title
+ * @return Title|null
+ */
+ public static function getDocPage( Title $title ) {
+ $docPage = wfMessage( 'scribunto-doc-page-name', $title->getText() )->inContentLanguage();
+ if ( $docPage->isDisabled() ) {
+ return null;
+ }
+
+ return Title::newFromText( $docPage->plain() );
+ }
+}
+
+/**
+ * An exception class which represents an error in the script. This does not
+ * normally abort the request, instead it is caught and shown to the user.
+ */
+class ScribuntoException extends MWException {
+ /**
+ * @var string
+ */
+ public $messageName;
+
+ /**
+ * @var array
+ */
+ public $messageArgs;
+
+ /**
+ * @var array
+ */
+ public $params;
+
+ /**
+ * @param string $messageName
+ * @param array $params
+ */
+ function __construct( $messageName, $params = [] ) {
+ if ( isset( $params['args'] ) ) {
+ $this->messageArgs = $params['args'];
+ } else {
+ $this->messageArgs = [];
+ }
+ if ( isset( $params['module'] ) && isset( $params['line'] ) ) {
+ $codeLocation = false;
+ if ( isset( $params['title'] ) ) {
+ $moduleTitle = Title::newFromText( $params['module'] );
+ if ( $moduleTitle && $moduleTitle->equals( $params['title'] ) ) {
+ $codeLocation = wfMessage( 'scribunto-line', $params['line'] )->inContentLanguage()->text();
+ }
+ }
+ if ( $codeLocation === false ) {
+ $codeLocation = wfMessage(
+ 'scribunto-module-line',
+ $params['module'],
+ $params['line']
+ )->inContentLanguage()->text();
+ }
+ } else {
+ $codeLocation = '[UNKNOWN]';
+ }
+ array_unshift( $this->messageArgs, $codeLocation );
+ $msg = wfMessage( $messageName )->params( $this->messageArgs )->inContentLanguage()->text();
+ parent::__construct( $msg );
+
+ $this->messageName = $messageName;
+ $this->params = $params;
+ }
+
+ /**
+ * @return string
+ */
+ public function getMessageName() {
+ return $this->messageName;
+ }
+
+ public function toStatus() {
+ $args = array_merge( [ $this->messageName ], $this->messageArgs );
+ $status = call_user_func_array( [ 'Status', 'newFatal' ], $args );
+ $status->scribunto_error = $this;
+ return $status;
+ }
+
+ /**
+ * Get the backtrace as HTML, or false if there is none available.
+ * @param array $options
+ * @return bool|string
+ */
+ public function getScriptTraceHtml( $options = [] ) {
+ return false;
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/includes/common/Hooks.php b/www/wiki/extensions/Scribunto/includes/common/Hooks.php
new file mode 100644
index 00000000..9ad63731
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/common/Hooks.php
@@ -0,0 +1,397 @@
+<?php
+/**
+ * Wikitext scripting infrastructure for MediaWiki: hooks.
+ * Copyright (C) 2009-2012 Victor Vasiliev <vasilvv@gmail.com>
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+use MediaWiki\MediaWikiServices;
+use UtfNormal\Validator;
+use Wikimedia\PSquare;
+
+/**
+ * Hooks for the Scribunto extension.
+ */
+class ScribuntoHooks {
+
+ /**
+ * Define content handler constant upon extension registration
+ */
+ public static function onRegistration() {
+ define( 'CONTENT_MODEL_SCRIBUNTO', 'Scribunto' );
+ }
+
+ /**
+ * Get software information for Special:Version
+ *
+ * @param array &$software
+ * @return bool
+ */
+ public static function getSoftwareInfo( array &$software ) {
+ $engine = Scribunto::newDefaultEngine();
+ $engine->setTitle( Title::makeTitle( NS_SPECIAL, 'Version' ) );
+ $engine->getSoftwareInfo( $software );
+ return true;
+ }
+
+ /**
+ * Register parser hooks.
+ *
+ * @param Parser &$parser
+ * @return bool
+ */
+ public static function setupParserHook( Parser &$parser ) {
+ $parser->setFunctionHook( 'invoke', 'ScribuntoHooks::invokeHook', Parser::SFH_OBJECT_ARGS );
+ return true;
+ }
+
+ /**
+ * Called when the interpreter is to be reset.
+ *
+ * @param Parser &$parser
+ * @return bool
+ */
+ public static function clearState( Parser &$parser ) {
+ Scribunto::resetParserEngine( $parser );
+ return true;
+ }
+
+ /**
+ * Called when the parser is cloned
+ *
+ * @param Parser $parser
+ * @return bool
+ */
+ public static function parserCloned( Parser $parser ) {
+ $parser->scribunto_engine = null;
+ return true;
+ }
+
+ /**
+ * Hook function for {{#invoke:module|func}}
+ *
+ * @param Parser &$parser
+ * @param PPFrame $frame
+ * @param array $args
+ * @throws MWException
+ * @throws ScribuntoException
+ * @return string
+ */
+ public static function invokeHook( Parser &$parser, PPFrame $frame, array $args ) {
+ global $wgScribuntoGatherFunctionStats;
+
+ try {
+ if ( count( $args ) < 2 ) {
+ throw new ScribuntoException( 'scribunto-common-nofunction' );
+ }
+ $moduleName = trim( $frame->expand( $args[0] ) );
+ $engine = Scribunto::getParserEngine( $parser );
+
+ $title = Title::makeTitleSafe( NS_MODULE, $moduleName );
+ if ( !$title || !$title->hasContentModel( CONTENT_MODEL_SCRIBUNTO ) ) {
+ throw new ScribuntoException( 'scribunto-common-nosuchmodule',
+ [ 'args' => [ $moduleName ] ] );
+ }
+ $module = $engine->fetchModuleFromParser( $title );
+ if ( !$module ) {
+ throw new ScribuntoException( 'scribunto-common-nosuchmodule',
+ [ 'args' => [ $moduleName ] ] );
+ }
+ $functionName = trim( $frame->expand( $args[1] ) );
+
+ $bits = $args[1]->splitArg();
+ unset( $args[0] );
+ unset( $args[1] );
+
+ // If $bits['index'] is empty, then the function name was parsed as a
+ // key=value pair (because of an equals sign in it), and since it didn't
+ // have an index, we don't need the index offset.
+ $childFrame = $frame->newChild( $args, $title, $bits['index'] === '' ? 0 : 1 );
+
+ if ( $wgScribuntoGatherFunctionStats ) {
+ $u0 = $engine->getResourceUsage( $engine::CPU_SECONDS );
+ $result = $module->invoke( $functionName, $childFrame );
+ $u1 = $engine->getResourceUsage( $engine::CPU_SECONDS );
+
+ if ( $u1 > $u0 ) {
+ $timingMs = (int)( 1000 * ( $u1 - $u0 ) );
+ // Since the overhead of stats is worst when when #invoke
+ // calls are very short, don't process measurements <= 20ms.
+ if ( $timingMs > 20 ) {
+ self::reportTiming( $moduleName, $functionName, $timingMs );
+ }
+ }
+ } else {
+ $result = $module->invoke( $functionName, $childFrame );
+ }
+
+ return Validator::cleanUp( strval( $result ) );
+ } catch ( ScribuntoException $e ) {
+ $trace = $e->getScriptTraceHtml( [ 'msgOptions' => [ 'content' ] ] );
+ $html = Html::element( 'p', [], $e->getMessage() );
+ if ( $trace !== false ) {
+ $html .= Html::element( 'p',
+ [],
+ wfMessage( 'scribunto-common-backtrace' )->inContentLanguage()->text()
+ ) . $trace;
+ } else {
+ $html .= Html::element( 'p',
+ [],
+ wfMessage( 'scribunto-common-no-details' )->inContentLanguage()->text()
+ );
+ }
+ $out = $parser->getOutput();
+ $errors = $out->getExtensionData( 'ScribuntoErrors' );
+ if ( $errors === null ) {
+ // On first hook use, set up error array and output
+ $errors = [];
+ $parser->addTrackingCategory( 'scribunto-common-error-category' );
+ $out->addModules( 'ext.scribunto.errors' );
+ }
+ $errors[] = $html;
+ $out->setExtensionData( 'ScribuntoErrors', $errors );
+ $out->addJsConfigVars( 'ScribuntoErrors', $errors );
+ $id = 'mw-scribunto-error-' . ( count( $errors ) - 1 );
+ $parserError = htmlspecialchars( $e->getMessage() );
+
+ // #iferror-compatible error element
+ return "<strong class=\"error\"><span class=\"scribunto-error\" id=\"$id\">" .
+ $parserError. "</span></strong>";
+ }
+ }
+
+ /**
+ * Record stats on slow function calls.
+ *
+ * @param string $moduleName
+ * @param string $functionName
+ * @param int $timing Function execution time in milliseconds.
+ */
+ public static function reportTiming( $moduleName, $functionName, $timing ) {
+ global $wgScribuntoGatherFunctionStats, $wgScribuntoSlowFunctionThreshold;
+
+ if ( !$wgScribuntoGatherFunctionStats ) {
+ return;
+ }
+
+ $threshold = $wgScribuntoSlowFunctionThreshold;
+ if ( !( is_float( $threshold ) && $threshold > 0 && $threshold < 1 ) ) {
+ return;
+ }
+
+ static $cache;
+
+ if ( !$cache ) {
+ $cache = ObjectCache::getLocalServerInstance( CACHE_NONE );
+
+ }
+
+ // To control the sampling rate, we keep a compact histogram of
+ // observations in APC, and extract the Nth percentile (specified
+ // via $wgScribuntoSlowFunctionThreshold; defaults to 0.90).
+ // We need APC and \Wikimedia\PSquare to do that.
+ if ( !class_exists( PSquare::class ) || $cache instanceof EmptyBagOStuff ) {
+ return;
+ }
+
+ $cacheVersion = '1';
+ $key = $cache->makeGlobalKey( __METHOD__, $cacheVersion, $threshold );
+
+ // This is a classic "read-update-write" critical section with no
+ // mutual exclusion, but the only consequence is that some samples
+ // will be dropped. We only need enough samples to estimate the
+ // the shape of the data, so that's fine.
+ $ps = $cache->get( $key ) ?: new PSquare( $threshold );
+ $ps->addObservation( $timing );
+ $cache->set( $key, $ps, 60 );
+
+ if ( $ps->getCount() < 1000 || $timing < $ps->getValue() ) {
+ return;
+ }
+
+ static $stats;
+
+ if ( !$stats ) {
+ $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
+ }
+
+ $metricKey = sprintf( 'scribunto.traces.%s__%s__%s', wfWikiId(), $moduleName, $functionName );
+ $stats->timing( $metricKey, $timing );
+ }
+
+ /**
+ * @param Title $title
+ * @param string &$languageCode
+ * @return bool
+ */
+ public static function getCodeLanguage( Title $title, &$languageCode ) {
+ global $wgScribuntoUseCodeEditor;
+ if ( $wgScribuntoUseCodeEditor && $title->hasContentModel( CONTENT_MODEL_SCRIBUNTO )
+ ) {
+ $engine = Scribunto::newDefaultEngine();
+ if ( $engine->getCodeEditorLanguage() ) {
+ $languageCode = $engine->getCodeEditorLanguage();
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Set the Scribunto content handler for modules
+ *
+ * @param Title $title
+ * @param string &$model
+ * @return bool
+ */
+ public static function contentHandlerDefaultModelFor( Title $title, &$model ) {
+ if ( $title->getNamespace() == NS_MODULE && !Scribunto::isDocPage( $title ) ) {
+ $model = CONTENT_MODEL_SCRIBUNTO;
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Adds report of number of evaluations by the single wikitext page.
+ *
+ * @param Parser $parser
+ * @param ParserOutput $output
+ * @return bool
+ */
+ public static function reportLimitData( Parser $parser, ParserOutput $output ) {
+ if ( Scribunto::isParserEnginePresent( $parser ) ) {
+ $engine = Scribunto::getParserEngine( $parser );
+ $engine->reportLimitData( $output );
+ }
+ return true;
+ }
+
+ /**
+ * Formats the limit report data
+ *
+ * @param string $key
+ * @param mixed &$value
+ * @param string &$report
+ * @param bool $isHTML
+ * @param bool $localize
+ * @return bool
+ */
+ public static function formatLimitData( $key, &$value, &$report, $isHTML, $localize ) {
+ $engine = Scribunto::newDefaultEngine();
+ return $engine->formatLimitData( $key, $value, $report, $isHTML, $localize );
+ }
+
+ /**
+ * EditPage::showStandardInputs:options hook
+ *
+ * @param EditPage $editor
+ * @param OutputPage $output
+ * @param int &$tab Current tabindex
+ * @return bool
+ */
+ public static function showStandardInputsOptions( EditPage $editor, OutputPage $output, &$tab ) {
+ if ( $editor->getTitle()->hasContentModel( CONTENT_MODEL_SCRIBUNTO ) ) {
+ $output->addModules( 'ext.scribunto.edit' );
+ $editor->editFormTextAfterTools .= '<div id="mw-scribunto-console"></div>';
+ }
+ return true;
+ }
+
+ /**
+ * EditPage::showReadOnlyForm:initial hook
+ *
+ * @param EditPage $editor
+ * @param OutputPage $output
+ * @return bool
+ */
+ public static function showReadOnlyFormInitial( EditPage $editor, OutputPage $output ) {
+ if ( $editor->getTitle()->hasContentModel( CONTENT_MODEL_SCRIBUNTO ) ) {
+ $output->addModules( 'ext.scribunto.edit' );
+ $editor->editFormTextAfterContent .= '<div id="mw-scribunto-console"></div>';
+ }
+ return true;
+ }
+
+ /**
+ * EditPageBeforeEditButtons hook
+ *
+ * @param EditPage &$editor
+ * @param array &$buttons Button array
+ * @param int &$tabindex Current tabindex
+ * @return bool
+ */
+ public static function beforeEditButtons( EditPage &$editor, array &$buttons, &$tabindex ) {
+ if ( $editor->getTitle()->hasContentModel( CONTENT_MODEL_SCRIBUNTO ) ) {
+ unset( $buttons['preview'] );
+ }
+ return true;
+ }
+
+ /**
+ * @param IContextSource $context
+ * @param Content $content
+ * @param Status $status
+ * @return bool
+ */
+ public static function validateScript( IContextSource $context, Content $content,
+ Status $status
+ ) {
+ $title = $context->getTitle();
+
+ if ( !$content instanceof ScribuntoContent ) {
+ return true;
+ }
+
+ /** @suppress PhanUndeclaredMethod */
+ $validateStatus = $content->validate( $title );
+ if ( $validateStatus->isOK() ) {
+ return true;
+ }
+
+ $status->merge( $validateStatus );
+
+ if ( isset( $validateStatus->scribunto_error->params['module'] ) ) {
+ $module = $validateStatus->scribunto_error->params['module'];
+ $line = $validateStatus->scribunto_error->params['line'];
+ if ( $module === $title->getPrefixedDBkey() && preg_match( '/^\d+$/', $line ) ) {
+ $out = $context->getOutput();
+ $out->addInlineScript( 'window.location.hash = ' . Xml::encodeJsVar( "#mw-ce-l$line" ) );
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * @param Article &$article
+ * @param bool &$outputDone
+ * @param bool &$pcache
+ * @return bool
+ */
+ public static function showDocPageHeader( Article &$article, &$outputDone, &$pcache ) {
+ $title = $article->getTitle();
+ if ( Scribunto::isDocPage( $title, $forModule ) ) {
+ $article->getContext()->getOutput()->addHTML(
+ wfMessage( 'scribunto-doc-page-header', $forModule->getPrefixedText() )->parseAsBlock()
+ );
+ }
+ return true;
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/includes/common/ScribuntoContent.php b/www/wiki/extensions/Scribunto/includes/common/ScribuntoContent.php
new file mode 100644
index 00000000..ff2ec8e4
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/common/ScribuntoContent.php
@@ -0,0 +1,160 @@
+<?php
+/**
+ * Scribunto Content Model
+ *
+ * @file
+ * @ingroup Extensions
+ * @ingroup Scribunto
+ *
+ * @author Brad Jorsch <bjorsch@wikimedia.org>
+ */
+
+/**
+ * Represents the content of a Scribunto script page
+ */
+class ScribuntoContent extends TextContent {
+
+ function __construct( $text ) {
+ parent::__construct( $text, CONTENT_MODEL_SCRIBUNTO );
+ }
+
+ /**
+ * Checks whether the script is valid
+ *
+ * @param Title $title
+ * @return Status
+ */
+ public function validate( Title $title ) {
+ $engine = Scribunto::newDefaultEngine();
+ $engine->setTitle( $title );
+ return $engine->validate( $this->getNativeData(), $title->getPrefixedDBkey() );
+ }
+
+ public function prepareSave( WikiPage $page, $flags, $parentRevId, User $user ) {
+ return $this->validate( $page->getTitle() );
+ }
+
+ /**
+ * Parse the Content object and generate a ParserOutput from the result.
+ *
+ * @param Title $title The page title to use as a context for rendering
+ * @param null|int $revId The revision being rendered (optional)
+ * @param null|ParserOptions $options Any parser options
+ * @param bool $generateHtml Whether to generate HTML (default: true).
+ * @param ParserOutput &$output ParserOutput representing the HTML form of the text.
+ * @return ParserOutput
+ */
+ protected function fillParserOutput(
+ Title $title, $revId, ParserOptions $options, $generateHtml, ParserOutput &$output
+ ) {
+ global $wgParser;
+
+ $text = $this->getNativeData();
+
+ // Get documentation, if any
+ $output = new ParserOutput();
+ $doc = Scribunto::getDocPage( $title );
+ if ( $doc ) {
+ $msg = wfMessage(
+ $doc->exists() ? 'scribunto-doc-page-show' : 'scribunto-doc-page-does-not-exist',
+ $doc->getPrefixedText()
+ )->inContentLanguage();
+
+ if ( !$msg->isDisabled() ) {
+ // We need the ParserOutput for categories and such, so we
+ // can't use $msg->parse().
+ $docViewLang = $doc->getPageViewLanguage();
+ $dir = $docViewLang->getDir();
+
+ // Code is forced to be ltr, but the documentation can be rtl.
+ // Correct direction class is needed for correct formatting.
+ // The possible classes are
+ // mw-content-ltr or mw-content-rtl
+ $dirClass = "mw-content-$dir";
+
+ $docWikitext = Html::rawElement(
+ 'div',
+ [
+ 'lang' => $docViewLang->getHtmlCode(),
+ 'dir' => $dir,
+ 'class' => $dirClass,
+ ],
+ // Line breaks are needed so that wikitext would be
+ // appropriately isolated for correct parsing. See Bug 60664.
+ "\n" . $msg->plain() . "\n"
+ );
+
+ if ( !$options ) {
+ // NOTE: use canonical options per default to produce cacheable output
+ $options = ContentHandler::getForTitle( $doc )->makeParserOptions( 'canonical' );
+ } else {
+ if ( $options->getTargetLanguage() === null ) {
+ $options->setTargetLanguage( $doc->getPageLanguage() );
+ }
+ }
+
+ $output = $wgParser->parse( $docWikitext, $title, $options, true, true, $revId );
+ }
+
+ // Mark the doc page as a transclusion, so we get purged when it
+ // changes.
+ $output->addTemplate( $doc, $doc->getArticleID(), $doc->getLatestRevID() );
+ }
+
+ // Validate the script, and include an error message and tracking
+ // category if it's invalid
+ $status = $this->validate( $title );
+ if ( !$status->isOK() ) {
+ $output->setText( $output->getRawText() .
+ Html::rawElement( 'div', [ 'class' => 'errorbox' ],
+ $status->getHTML( 'scribunto-error-short', 'scribunto-error-long' )
+ )
+ );
+ $output->addTrackingCategory( 'scribunto-module-with-errors-category', $title );
+ }
+
+ if ( !$generateHtml ) {
+ // We don't need the actual HTML
+ $output->setText( '' );
+ return $output;
+ }
+
+ $engine = Scribunto::newDefaultEngine();
+ $engine->setTitle( $title );
+ if ( $this->highlight( $text, $output, $engine ) ) {
+ return $output;
+ }
+
+ // No GeSHi, or GeSHi can't parse it, use plain <pre>
+ $output->setText( $output->getRawText() .
+ "<pre class='mw-code mw-script' dir='ltr'>\n" .
+ htmlspecialchars( $text ) .
+ "\n</pre>\n"
+ );
+
+ return $output;
+ }
+
+ /**
+ * Adds syntax highlighting to the output (or do not touch it and return false).
+ * @param string $text
+ * @param ParserOutput $output
+ * @param ScribuntoEngineBase $engine
+ * @return bool Success status
+ */
+ protected function highlight( $text, ParserOutput $output, ScribuntoEngineBase $engine ) {
+ global $wgScribuntoUseGeSHi;
+ $language = $engine->getGeSHiLanguage();
+ if ( $wgScribuntoUseGeSHi && class_exists( SyntaxHighlight::class ) && $language ) {
+ $status = SyntaxHighlight::highlight( $text, $language );
+ if ( $status->isGood() ) {
+ // @todo replace addModuleStyles line with the appropriate call on
+ // SyntaxHighlight once one is created
+ $output->addModuleStyles( 'ext.pygments' );
+ $output->setText( $output->getRawText() . $status->getValue() );
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/includes/common/ScribuntoContentHandler.php b/www/wiki/extensions/Scribunto/includes/common/ScribuntoContentHandler.php
new file mode 100644
index 00000000..ad2c1baa
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/common/ScribuntoContentHandler.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Scribunto Content Handler
+ *
+ * @file
+ * @ingroup Extensions
+ * @ingroup Scribunto
+ *
+ * @author Brad Jorsch <bjorsch@wikimedia.org>
+ */
+
+class ScribuntoContentHandler extends CodeContentHandler {
+
+ /**
+ * @param string $modelId
+ * @param string[] $formats
+ */
+ public function __construct(
+ $modelId = CONTENT_MODEL_SCRIBUNTO, $formats = [ CONTENT_FORMAT_TEXT ]
+ ) {
+ parent::__construct( $modelId, $formats );
+ }
+
+ protected function getContentClass() {
+ return 'ScribuntoContent';
+ }
+
+ /**
+ * @param string $format
+ * @return bool
+ */
+ public function isSupportedFormat( $format ) {
+ // An error in an earlier version of Scribunto means we might see this.
+ if ( $format === 'CONTENT_FORMAT_TEXT' ) {
+ $format = CONTENT_FORMAT_TEXT;
+ }
+ return parent::isSupportedFormat( $format );
+ }
+
+ /**
+ * Only allow this content handler to be used in the Module namespace
+ * @param Title $title
+ * @return bool
+ */
+ public function canBeUsedOn( Title $title ) {
+ if ( $title->getNamespace() !== NS_MODULE ) {
+ return false;
+ }
+
+ return parent::canBeUsedOn( $title );
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/HashLibrary.php b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/HashLibrary.php
new file mode 100644
index 00000000..b2720de5
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/HashLibrary.php
@@ -0,0 +1,44 @@
+<?php
+
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+class Scribunto_LuaHashLibrary extends Scribunto_LuaLibraryBase {
+
+ public function register() {
+ $lib = [
+ 'listAlgorithms' => [ $this, 'listAlgorithms' ],
+ 'hashValue' => [ $this, 'hashValue' ],
+ ];
+
+ return $this->getEngine()->registerInterface( 'mw.hash.lua', $lib );
+ }
+
+ /**
+ * Returns a list of known/ supported hash algorithms
+ *
+ * @return string[][]
+ */
+ public function listAlgorithms() {
+ $algos = hash_algos();
+ $algos = array_combine( range( 1, count( $algos ) ), $algos );
+
+ return [ $algos ];
+ }
+
+ /**
+ * Hash a given value.
+ *
+ * @param string $algo
+ * @param string $value
+ * @return string[]
+ */
+ public function hashValue( $algo, $value ) {
+ if ( !in_array( $algo, hash_algos() ) ) {
+ throw new Scribunto_LuaError( "Unknown hashing algorithm: $algo" );
+ }
+
+ $hash = hash( $algo, $value );
+
+ return [ $hash ];
+ }
+
+}
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/HtmlLibrary.php b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/HtmlLibrary.php
new file mode 100644
index 00000000..00716ca8
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/HtmlLibrary.php
@@ -0,0 +1,11 @@
+<?php
+
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+class Scribunto_LuaHtmlLibrary extends Scribunto_LuaLibraryBase {
+ function register() {
+ return $this->getEngine()->registerInterface( 'mw.html.lua', [], [
+ 'uniqPrefix' => Parser::MARKER_PREFIX,
+ 'uniqSuffix' => Parser::MARKER_SUFFIX,
+ ] );
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LanguageLibrary.php b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LanguageLibrary.php
new file mode 100644
index 00000000..b3671e67
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LanguageLibrary.php
@@ -0,0 +1,364 @@
+<?php
+
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+class Scribunto_LuaLanguageLibrary extends Scribunto_LuaLibraryBase {
+ public $langCache = [];
+ public $timeCache = [];
+ public $maxLangCacheSize;
+
+ function register() {
+ // Pre-populate the language cache
+ global $wgContLang;
+ $this->langCache[$wgContLang->getCode()] = $wgContLang;
+ $this->maxLangCacheSize = $this->getEngine()->getOption( 'maxLangCacheSize' );
+
+ $statics = [
+ 'getContLangCode',
+ 'isSupportedLanguage',
+ 'isKnownLanguageTag',
+ 'isValidCode',
+ 'isValidBuiltInCode',
+ 'fetchLanguageName',
+ 'fetchLanguageNames',
+ 'getFallbacksFor',
+ ];
+ $methods = [
+ 'lcfirst',
+ 'ucfirst',
+ 'lc',
+ 'uc',
+ 'caseFold',
+ 'formatNum',
+ 'formatDate',
+ 'formatDuration',
+ 'getDurationIntervals',
+ 'parseFormattedNumber',
+ 'convertPlural',
+ 'convertGrammar',
+ 'gender',
+ 'isRTL',
+ ];
+ $lib = [];
+ foreach ( $statics as $name ) {
+ $lib[$name] = [ $this, $name ];
+ }
+ $ths = $this;
+ foreach ( $methods as $name ) {
+ $lib[$name] = function () use ( $ths, $name ) {
+ $args = func_get_args();
+ return $ths->languageMethod( $name, $args );
+ };
+ }
+ return $this->getEngine()->registerInterface( 'mw.language.lua', $lib );
+ }
+
+ function getContLangCode() {
+ global $wgContLang;
+ return [ $wgContLang->getCode() ];
+ }
+
+ function isSupportedLanguage( $code ) {
+ $this->checkType( 'isSupportedLanguage', 1, $code, 'string' );
+ try {
+ // There's no good reason this should throw, but it does. Sigh.
+ return [ Language::isSupportedLanguage( $code ) ];
+ } catch ( MWException $ex ) {
+ return [ false ];
+ }
+ }
+
+ function isKnownLanguageTag( $code ) {
+ $this->checkType( 'isKnownLanguageTag', 1, $code, 'string' );
+ return [ Language::isKnownLanguageTag( $code ) ];
+ }
+
+ function isValidCode( $code ) {
+ $this->checkType( 'isValidCode', 1, $code, 'string' );
+ return [ Language::isValidCode( $code ) ];
+ }
+
+ function isValidBuiltInCode( $code ) {
+ $this->checkType( 'isValidBuiltInCode', 1, $code, 'string' );
+ return [ (bool)Language::isValidBuiltInCode( $code ) ];
+ }
+
+ function fetchLanguageName( $code, $inLanguage ) {
+ $this->checkType( 'fetchLanguageName', 1, $code, 'string' );
+ $this->checkTypeOptional( 'fetchLanguageName', 2, $inLanguage, 'string', null );
+ return [ Language::fetchLanguageName( $code, $inLanguage ) ];
+ }
+
+ function fetchLanguageNames( $inLanguage, $include ) {
+ $this->checkTypeOptional( 'fetchLanguageNames', 1, $inLanguage, 'string', null );
+ $this->checkTypeOptional( 'fetchLanguageNames', 2, $include, 'string', 'mw' );
+ return [ Language::fetchLanguageNames( $inLanguage, $include ) ];
+ }
+
+ function getFallbacksFor( $code ) {
+ $this->checkType( 'getFallbacksFor', 1, $code, 'string' );
+ $ret = Language::getFallbacksFor( $code );
+ // Make 1-based
+ if ( count( $ret ) ) {
+ $ret = array_combine( range( 1, count( $ret ) ), $ret );
+ }
+ return [ $ret ];
+ }
+
+ /**
+ * Language object method handler
+ * @param string $name
+ * @param array $args
+ * @return array
+ * @throws Scribunto_LuaError
+ */
+ function languageMethod( $name, $args ) {
+ $name = strval( $name );
+ $code = array_shift( $args );
+ if ( !isset( $this->langCache[$code] ) ) {
+ if ( count( $this->langCache ) > $this->maxLangCacheSize ) {
+ throw new Scribunto_LuaError( 'too many language codes requested' );
+ }
+ try {
+ $this->langCache[$code] = Language::factory( $code );
+ } catch ( MWException $ex ) {
+ throw new Scribunto_LuaError( "language code '$code' is invalid" );
+ }
+ }
+ $lang = $this->langCache[$code];
+ switch ( $name ) {
+ // Zero arguments
+ case 'isRTL':
+ return [ $lang->$name() ];
+
+ // One string argument passed straight through
+ case 'lcfirst':
+ case 'ucfirst':
+ case 'lc':
+ case 'uc':
+ case 'caseFold':
+ $this->checkType( $name, 1, $args[0], 'string' );
+ return [ $lang->$name( $args[0] ) ];
+
+ case 'parseFormattedNumber':
+ if ( is_numeric( $args[0] ) ) {
+ $args[0] = strval( $args[0] );
+ }
+ if ( $this->getLuaType( $args[0] ) !== 'string' ) {
+ // Be like tonumber(), return nil instead of erroring out
+ return [ null ];
+ }
+ return [ $lang->$name( $args[0] ) ];
+
+ // Custom handling
+ default:
+ return $this->$name( $lang, $args );
+ }
+ }
+
+ /**
+ * convertPlural handler
+ * @param Language $lang
+ * @param array $args
+ * @return array
+ */
+ function convertPlural( $lang, $args ) {
+ $number = array_shift( $args );
+ $this->checkType( 'convertPlural', 1, $number, 'number' );
+ if ( is_array( $args[0] ) ) {
+ $args = $args[0];
+ }
+ $forms = array_values( array_map( 'strval', $args ) );
+ return [ $lang->convertPlural( $number, $forms ) ];
+ }
+
+ /**
+ * convertGrammar handler
+ * @param Language $lang
+ * @param array $args
+ * @return array
+ */
+ function convertGrammar( $lang, $args ) {
+ $this->checkType( 'convertGrammar', 1, $args[0], 'string' );
+ $this->checkType( 'convertGrammar', 2, $args[1], 'string' );
+ return [ $lang->convertGrammar( $args[0], $args[1] ) ];
+ }
+
+ /**
+ * gender handler
+ * @param Language $lang
+ * @param array $args
+ * @return array
+ */
+ function gender( $lang, $args ) {
+ $this->checkType( 'gender', 1, $args[0], 'string' );
+ $username = trim( array_shift( $args ) );
+
+ if ( is_array( $args[0] ) ) {
+ $args = $args[0];
+ }
+ $forms = array_values( array_map( 'strval', $args ) );
+
+ // Shortcuts
+ if ( count( $forms ) === 0 ) {
+ return [ '' ];
+ } elseif ( count( $forms ) === 1 ) {
+ return [ $forms[0] ];
+ }
+
+ if ( $username === 'male' || $username === 'female' ) {
+ $gender = $username;
+ } else {
+ // default
+ $gender = User::getDefaultOption( 'gender' );
+
+ // Check for "User:" prefix
+ $title = Title::newFromText( $username );
+ if ( $title && $title->getNamespace() == NS_USER ) {
+ $username = $title->getText();
+ }
+
+ // check parameter, or use the ParserOptions if in interface message
+ $user = User::newFromName( $username );
+ if ( $user ) {
+ $gender = GenderCache::singleton()->getGenderOf( $user, __METHOD__ );
+ } elseif ( $username === '' ) {
+ $parserOptions = $this->getParserOptions();
+ if ( $parserOptions->getInterfaceMessage() ) {
+ $gender = GenderCache::singleton()->getGenderOf( $parserOptions->getUser(), __METHOD__ );
+ }
+ }
+ }
+ return [ $lang->gender( $gender, $forms ) ];
+ }
+
+ /**
+ * formatNum handler
+ * @param Language $lang
+ * @param array $args
+ * @return array
+ */
+ function formatNum( $lang, $args ) {
+ $num = $args[0];
+ $this->checkType( 'formatNum', 1, $num, 'number' );
+
+ $noCommafy = false;
+ if ( isset( $args[1] ) ) {
+ $this->checkType( 'formatNum', 2, $args[1], 'table' );
+ $options = $args[1];
+ $noCommafy = !empty( $options['noCommafy'] );
+ }
+ return [ $lang->formatNum( $num, $noCommafy ) ];
+ }
+
+ /**
+ * formatDate handler
+ * @param Language $lang
+ * @param array $args
+ * @return array
+ * @throws Scribunto_LuaError
+ */
+ function formatDate( $lang, $args ) {
+ $this->checkType( 'formatDate', 1, $args[0], 'string' );
+ $this->checkTypeOptional( 'formatDate', 2, $args[1], 'string', '' );
+ $this->checkTypeOptional( 'formatDate', 3, $args[2], 'boolean', false );
+
+ list( $format, $date, $local ) = $args;
+ $langcode = $lang->getCode();
+
+ if ( $date === '' ) {
+ $cacheKey = $this->getParserOptions()->getTimestamp();
+ $timestamp = new MWTimestamp( $cacheKey );
+ $date = $timestamp->getTimestamp( TS_ISO_8601 );
+ $useTTL = true;
+ } else {
+ # Correct for DateTime interpreting 'XXXX' as XX:XX o'clock
+ if ( preg_match( '/^[0-9]{4}$/', $date ) ) {
+ $date = '00:00 '.$date;
+ }
+
+ $cacheKey = $date;
+ $useTTL = false;
+ }
+
+ if ( isset( $this->timeCache[$format][$cacheKey][$langcode][$local] ) ) {
+ $ttl = $this->timeCache[$format][$cacheKey][$langcode][$local][1];
+ if ( $useTTL && $ttl !== null ) {
+ $this->getEngine()->setTTL( $ttl );
+ }
+ return [ $this->timeCache[$format][$cacheKey][$langcode][$local][0] ];
+ }
+
+ # Default input timezone is UTC.
+ try {
+ $utc = new DateTimeZone( 'UTC' );
+ $dateObject = new DateTime( $date, $utc );
+ } catch ( Exception $ex ) {
+ throw new Scribunto_LuaError( "bad argument #2 to 'formatDate' (not a valid timestamp)" );
+ }
+
+ # Set output timezone.
+ if ( $local ) {
+ global $wgLocaltimezone;
+ if ( isset( $wgLocaltimezone ) ) {
+ $tz = new DateTimeZone( $wgLocaltimezone );
+ } else {
+ $tz = new DateTimeZone( date_default_timezone_get() );
+ }
+ } else {
+ $tz = $utc;
+ }
+ $dateObject->setTimezone( $tz );
+ # Generate timestamp
+ $ts = $dateObject->format( 'YmdHis' );
+
+ if ( $ts < 0 ) {
+ throw new Scribunto_LuaError( "mw.language:formatDate() only supports years from 0" );
+ } elseif ( $ts >= 100000000000000 ) {
+ throw new Scribunto_LuaError( "mw.language:formatDate() only supports years up to 9999" );
+ }
+
+ $ttl = null;
+ $ret = $lang->sprintfDate( $format, $ts, $tz, $ttl );
+ $this->timeCache[$format][$cacheKey][$langcode][$local] = [ $ret, $ttl ];
+ if ( $useTTL && $ttl !== null ) {
+ $this->getEngine()->setTTL( $ttl );
+ }
+ return [ $ret ];
+ }
+
+ /**
+ * formatDuration handler
+ * @param Language $lang
+ * @param array $args
+ * @return array
+ */
+ function formatDuration( $lang, $args ) {
+ $this->checkType( 'formatDuration', 1, $args[0], 'number' );
+ $this->checkTypeOptional( 'formatDuration', 2, $args[1], 'table', [] );
+
+ list( $seconds, $chosenIntervals ) = $args;
+ $langcode = $lang->getCode();
+ $chosenIntervals = array_values( $chosenIntervals );
+
+ $ret = $lang->formatDuration( $seconds, $chosenIntervals );
+ return [ $ret ];
+ }
+
+ /**
+ * getDurationIntervals handler
+ * @param Language $lang
+ * @param array $args
+ * @return array
+ */
+ function getDurationIntervals( $lang, $args ) {
+ $this->checkType( 'getDurationIntervals', 1, $args[0], 'number' );
+ $this->checkTypeOptional( 'getDurationIntervals', 2, $args[1], 'table', [] );
+
+ list( $seconds, $chosenIntervals ) = $args;
+ $langcode = $lang->getCode();
+ $chosenIntervals = array_values( $chosenIntervals );
+
+ $ret = $lang->getDurationIntervals( $seconds, $chosenIntervals );
+ return [ $ret ];
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LibraryBase.php b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LibraryBase.php
new file mode 100644
index 00000000..38505fa9
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LibraryBase.php
@@ -0,0 +1,181 @@
+<?php
+/**
+ * Basic services that Lua libraries will probably need
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Brad Jorsch
+ */
+
+/**
+ * This class provides some basic services that Lua libraries will probably need
+ */
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+abstract class Scribunto_LuaLibraryBase {
+ /**
+ * @var Scribunto_LuaEngine
+ */
+ private $engine;
+
+ /**
+ * @param Scribunto_LuaEngine $engine
+ */
+ function __construct( Scribunto_LuaEngine $engine ) {
+ $this->engine = $engine;
+ }
+
+ /**
+ * Called to register the library.
+ *
+ * This should do any necessary setup and then call $this->getEngine()->registerInterface().
+ * The value returned by that call should be returned from this function,
+ * and must be for 'deferLoad' libraries to work right.
+ *
+ * @return array Lua package
+ */
+ abstract function register();
+
+ /**
+ * Get the engine
+ *
+ * @return Scribunto_LuaEngine engine
+ */
+ protected function getEngine() {
+ return $this->engine;
+ }
+
+ /**
+ * Get the interpreter
+ *
+ * @return Scribunto_LuaInterpreter interpreter
+ */
+ protected function getInterpreter() {
+ return $this->engine->getInterpreter();
+ }
+
+ /**
+ * Get the parser
+ *
+ * @return Parser parser
+ */
+ protected function getParser() {
+ return $this->engine->getParser();
+ }
+
+ /**
+ * Get the title
+ *
+ * @return Title title
+ */
+ protected function getTitle() {
+ return $this->getEngine()->getTitle();
+ }
+
+ /**
+ * Get the parser options
+ *
+ * @return ParserOptions parser options
+ */
+ protected function getParserOptions() {
+ return $this->engine->getParser()->getOptions();
+ }
+
+ /**
+ * Get the Lua type corresponding to the type of the variable.
+ *
+ * If the variable does not correspond to any type, the PHP type will be
+ * returned (prefixed with "PHP"). For example, "PHP resource" or "PHP
+ * object of class Foo".
+ *
+ * @param mixed $var Variable to test
+ * @return string Type
+ */
+ protected function getLuaType( $var ) {
+ static $luaTypes = [
+ 'NULL' => 'nil',
+ 'double' => 'number',
+ 'integer' => 'number',
+ 'string' => 'string',
+ 'boolean' => 'boolean',
+ 'array' => 'table',
+ ];
+ $type = gettype( $var );
+ if ( isset( $luaTypes[$type] ) ) {
+ return $luaTypes[$type];
+ } elseif ( $this->getInterpreter()->isLuaFunction( $var ) ) {
+ return 'function';
+ } else {
+ $type = "PHP $type";
+ if ( is_object( $var ) ) {
+ $type .= " of class " . get_class( $var );
+ }
+ return $type;
+ }
+ }
+
+ /**
+ * Check the type of a variable
+ *
+ * If the type of the variable does not match the expected type,
+ * a Scribunto_LuaError will be thrown.
+ *
+ * @param string $name Name of the calling function (as seen from Lua)
+ * @param int $argIdx Index of the argument being tested (1-based)
+ * @param mixed $arg Variable to test
+ * @param string $expectType Lua type expected
+ * @return void
+ */
+ protected function checkType( $name, $argIdx, $arg, $expectType ) {
+ $type = $this->getLuaType( $arg );
+ if ( $type !== $expectType ) {
+ throw new Scribunto_LuaError(
+ "bad argument #$argIdx to '$name' ($expectType expected, got $type)"
+ );
+ }
+ }
+
+ /**
+ * Check the type of a variable, with default if null
+ *
+ * If the variable is null, $default will be assigned. Otherwise, if the
+ * type of the variable does not match the expected type, a
+ * Scribunto_LuaError will be thrown.
+ *
+ * @param string $name Name of the calling function (as seen from Lua)
+ * @param int $argIdx Index of the argument being tested (1-based)
+ * @param mixed &$arg Variable to test/set
+ * @param string $expectType Lua type expected
+ * @param mixed $default Default value
+ * @return void
+ */
+ protected function checkTypeOptional( $name, $argIdx, &$arg, $expectType, $default ) {
+ if ( $arg === null ) {
+ $arg = $default;
+ } else {
+ $this->checkType( $name, $argIdx, $arg, $expectType );
+ }
+ }
+
+ /**
+ * Increment the expensive function count, and throw if limit exceeded
+ *
+ * @return null
+ */
+ public function incrementExpensiveFunctionCount() {
+ return $this->getEngine()->incrementExpensiveFunctionCount();
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LuaCommon.php b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LuaCommon.php
new file mode 100644
index 00000000..db38e49d
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LuaCommon.php
@@ -0,0 +1,1063 @@
+<?php
+
+use Wikimedia\ScopedCallback;
+
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+abstract class Scribunto_LuaEngine extends ScribuntoEngineBase {
+ /**
+ * Libraries to load. See also the 'ScribuntoExternalLibraries' hook.
+ * @var array Maps module names to PHP classes or definition arrays
+ */
+ protected static $libraryClasses = [
+ 'mw.site' => 'Scribunto_LuaSiteLibrary',
+ 'mw.uri' => 'Scribunto_LuaUriLibrary',
+ 'mw.ustring' => 'Scribunto_LuaUstringLibrary',
+ 'mw.language' => 'Scribunto_LuaLanguageLibrary',
+ 'mw.message' => 'Scribunto_LuaMessageLibrary',
+ 'mw.title' => 'Scribunto_LuaTitleLibrary',
+ 'mw.text' => 'Scribunto_LuaTextLibrary',
+ 'mw.html' => 'Scribunto_LuaHtmlLibrary',
+ 'mw.hash' => 'Scribunto_LuaHashLibrary',
+ ];
+
+ /**
+ * Paths for modules that may be loaded from Lua. See also the
+ * 'ScribuntoExternalLibraryPaths' hook.
+ * @var array Paths
+ */
+ protected static $libraryPaths = [
+ '.',
+ 'luabit',
+ 'ustring',
+ ];
+
+ protected $loaded = false;
+
+ /**
+ * @var Scribunto_LuaInterpreter
+ */
+ protected $interpreter;
+
+ /**
+ * @var array
+ */
+ protected $mw;
+
+ /**
+ * @var array
+ */
+ protected $currentFrames = [];
+ protected $expandCache = [];
+ protected $availableLibraries = [];
+
+ const MAX_EXPAND_CACHE_SIZE = 100;
+
+ /**
+ * If luasandbox is installed and usable then use it,
+ * otherwise
+ *
+ * @param array $options
+ * @return Scribunto_LuaEngine
+ */
+ public static function newAutodetectEngine( array $options ) {
+ global $wgScribuntoEngineConf;
+ $engine = 'luastandalone';
+ try {
+ Scribunto_LuaSandboxInterpreter::checkLuaSandboxVersion();
+ $engine = 'luasandbox';
+ } catch ( Scribunto_LuaInterpreterNotFoundError $e ) {
+ // pass
+ } catch ( Scribunto_LuaInterpreterBadVersionError $e ) {
+ // pass
+ }
+
+ unset( $options['factory'] );
+
+ return Scribunto::newEngine( $options + $wgScribuntoEngineConf[$engine] );
+ }
+
+ /**
+ * Create a new interpreter object
+ * @return Scribunto_LuaInterpreter
+ */
+ abstract function newInterpreter();
+
+ /**
+ * @param string $text
+ * @param string|bool $chunkName
+ * @return Scribunto_LuaModule
+ */
+ protected function newModule( $text, $chunkName ) {
+ return new Scribunto_LuaModule( $this, $text, $chunkName );
+ }
+
+ /**
+ * @param string $message
+ * @param array $params
+ * @return Scribunto_LuaError
+ */
+ public function newLuaError( $message, $params = [] ) {
+ return new Scribunto_LuaError( $message, $this->getDefaultExceptionParams() + $params );
+ }
+
+ public function destroy() {
+ // Break reference cycles
+ $this->interpreter = null;
+ $this->mw = null;
+ $this->expandCache = null;
+ parent::destroy();
+ }
+
+ /**
+ * Initialise the interpreter and the base environment
+ */
+ public function load() {
+ if ( $this->loaded ) {
+ return;
+ }
+ $this->loaded = true;
+
+ try {
+ $this->interpreter = $this->newInterpreter();
+
+ $funcs = [
+ 'loadPackage',
+ 'loadPHPLibrary',
+ 'frameExists',
+ 'newChildFrame',
+ 'getExpandedArgument',
+ 'getAllExpandedArguments',
+ 'expandTemplate',
+ 'callParserFunction',
+ 'preprocess',
+ 'incrementExpensiveFunctionCount',
+ 'isSubsting',
+ 'getFrameTitle',
+ 'setTTL',
+ 'addWarning',
+ ];
+
+ $lib = [];
+ foreach ( $funcs as $name ) {
+ $lib[$name] = [ $this, $name ];
+ }
+
+ $this->registerInterface( 'mwInit.lua', [] );
+ $this->mw = $this->registerInterface( 'mw.lua', $lib,
+ [ 'allowEnvFuncs' => $this->options['allowEnvFuncs'] ] );
+
+ $this->availableLibraries = $this->getLibraries( 'lua', self::$libraryClasses );
+ foreach ( $this->availableLibraries as $name => $def ) {
+ $this->instantiatePHPLibrary( $name, $def, false );
+ }
+ } catch ( Exception $ex ) {
+ $this->loaded = false;
+ $this->interpreter = null;
+ throw $ex;
+ }
+ }
+
+ /**
+ * Register a Lua Library
+ *
+ * This should be called from the library's PHP module's register() method.
+ *
+ * The value for $interfaceFuncs is used to populate the mw_interface
+ * global that is defined when the library's Lua module is loaded. Values
+ * must be PHP callables, which will be seen in Lua as functions.
+ *
+ * @param string $moduleFileName The path to the Lua portion of the library
+ * (absolute, or relative to $this->getLuaLibDir())
+ * @param array $interfaceFuncs Populates mw_interface
+ * @param array $setupOptions Passed to the modules setupInterface() method.
+ * @return array Lua package
+ */
+ public function registerInterface( $moduleFileName, $interfaceFuncs, $setupOptions = [] ) {
+ $this->interpreter->registerLibrary( 'mw_interface', $interfaceFuncs );
+ $moduleFileName = $this->normalizeModuleFileName( $moduleFileName );
+ $package = $this->loadLibraryFromFile( $moduleFileName );
+ if ( !empty( $package['setupInterface'] ) ) {
+ $this->interpreter->callFunction( $package['setupInterface'], $setupOptions );
+ }
+ return $package;
+ }
+
+ /**
+ * Return the base path for Lua modules.
+ * @return string
+ */
+ public function getLuaLibDir() {
+ return __DIR__ . '/lualib';
+ }
+
+ /**
+ * Normalize a lua module to its full path. If path does not look like an
+ * absolute path (i.e. begins with DIRECTORY_SEPARATOR or "X:"), prepend
+ * getLuaLibDir()
+ *
+ * @param string $fileName name of the lua module file
+ * @return string
+ */
+ protected function normalizeModuleFileName( $fileName ) {
+ if ( !preg_match( '<^(?:[a-zA-Z]:)?' . preg_quote( DIRECTORY_SEPARATOR ) . '>', $fileName ) ) {
+ $fileName = "{$this->getLuaLibDir()}/{$fileName}";
+ }
+ return $fileName;
+ }
+
+ /**
+ * Get performance characteristics of the Lua engine/interpreter
+ *
+ * phpCallsRequireSerialization: boolean
+ * whether calls between PHP and Lua functions require (slow)
+ * serialization of parameters and return values
+ *
+ * @return array
+ */
+ abstract public function getPerformanceCharacteristics();
+
+ /**
+ * Get the current interpreter object
+ * @return Scribunto_LuaInterpreter
+ */
+ public function getInterpreter() {
+ $this->load();
+ return $this->interpreter;
+ }
+
+ /**
+ * Replaces the list of current frames, and return a ScopedCallback that
+ * will reset them when it goes out of scope.
+ *
+ * @param PPFrame|null $frame If null, an empty frame with no parent will be used
+ * @return ScopedCallback
+ */
+ private function setupCurrentFrames( PPFrame $frame = null ) {
+ if ( !$frame ) {
+ $frame = $this->getParser()->getPreprocessor()->newFrame();
+ }
+
+ $oldFrames = $this->currentFrames;
+ $oldExpandCache = $this->expandCache;
+ $this->currentFrames = [
+ 'current' => $frame,
+ 'parent' => isset( $frame->parent ) ? $frame->parent : null,
+ ];
+ $this->expandCache = [];
+
+ return new ScopedCallback( function () use ( $oldFrames, $oldExpandCache ) {
+ $this->currentFrames = $oldFrames;
+ $this->expandCache = $oldExpandCache;
+ } );
+ }
+
+ /**
+ * Execute a module chunk in a new isolated environment, and return the specified function
+ * @param mixed $chunk As accepted by Scribunto_LuaInterpreter::callFunction()
+ * @param string $functionName
+ * @param PPFrame|null $frame
+ * @return mixed
+ * @throws ScribuntoException
+ */
+ public function executeModule( $chunk, $functionName, $frame ) {
+ $resetFrames = null;
+ if ( !$this->currentFrames || !isset( $this->currentFrames['current'] ) ) {
+ // Only reset frames if there isn't already current frame
+ // $resetFrames is a ScopedCallback, so it has a purpose even though it appears unused.
+ $resetFrames = $this->setupCurrentFrames( $frame );
+ }
+
+ $retval = $this->getInterpreter()->callFunction(
+ $this->mw['executeModule'], $chunk, $functionName
+ );
+ if ( !$retval[0] ) {
+ // If we get here, it means we asked for an element from the table the module returned,
+ // but it returned something other than a table. In this case, $retval[1] contains the type
+ // of what it did returned, instead of the value we asked for.
+ throw $this->newException(
+ 'scribunto-lua-notarrayreturn', [ 'args' => [ $retval[1] ] ]
+ );
+ }
+ return $retval[1];
+ }
+
+ /**
+ * Execute a module function chunk
+ * @param mixed $chunk As accepted by Scribunto_LuaInterpreter::callFunction()
+ * @param PPFrame|null $frame
+ * @return array
+ */
+ public function executeFunctionChunk( $chunk, $frame ) {
+ // $resetFrames is a ScopedCallback, so it has a purpose even though it appears unused.
+ $resetFrames = $this->setupCurrentFrames( $frame );
+
+ return $this->getInterpreter()->callFunction(
+ $this->mw['executeFunction'],
+ $chunk );
+ }
+
+ /**
+ * Get data logged by modules
+ * @return string Logged data
+ */
+ protected function getLogBuffer() {
+ if ( !$this->loaded ) {
+ return '';
+ }
+ try {
+ $log = $this->getInterpreter()->callFunction( $this->mw['getLogBuffer'] );
+ return $log[0];
+ } catch ( ScribuntoException $ex ) {
+ // Probably time expired, ignore it.
+ return '';
+ }
+ }
+
+ /**
+ * Format the logged data for HTML output
+ * @param string $logs Logged data
+ * @param bool $localize Whether to localize the message key
+ * @return string HTML
+ */
+ protected function formatHtmlLogs( $logs, $localize ) {
+ $keyMsg = wfMessage( 'scribunto-limitreport-logs' );
+ if ( !$localize ) {
+ $keyMsg->inLanguage( 'en' )->useDatabase( false );
+ }
+ return Html::openElement( 'tr' ) .
+ Html::rawElement( 'th', [ 'colspan' => 2 ], $keyMsg->parse() ) .
+ Html::closeElement( 'tr' ) .
+ Html::openElement( 'tr' ) .
+ Html::openElement( 'td', [ 'colspan' => 2 ] ) .
+ Html::openElement( 'div', [ 'class' => 'mw-collapsible mw-collapsed' ] ) .
+ Html::element( 'pre', [ 'class' => 'scribunto-limitreport-logs' ], $logs ) .
+ Html::closeElement( 'div' ) .
+ Html::closeElement( 'td' ) .
+ Html::closeElement( 'tr' );
+ }
+
+ /**
+ * Load a library from the given file and execute it in the base environment.
+ * @param string $fileName File name/path to load
+ * @return array|null the export list, or null if there isn't one.
+ */
+ protected function loadLibraryFromFile( $fileName ) {
+ static $cache = null;
+
+ if ( !$cache ) {
+ $cache = ObjectCache::getLocalServerInstance( 'hash' );
+ }
+
+ $mtime = filemtime( $fileName );
+ if ( $mtime === false ) {
+ throw new MWException( 'Lua file does not exist: ' . $fileName );
+ }
+
+ $cacheKey = $cache->makeGlobalKey( __CLASS__, $fileName );
+ $fileData = $cache->get( $cacheKey );
+
+ $code = false;
+ if ( $fileData ) {
+ list( $code, $cachedMtime ) = $fileData;
+ if ( $cachedMtime < $mtime ) {
+ $code = false;
+ }
+ }
+ if ( !$code ) {
+ $code = file_get_contents( $fileName );
+ if ( $code === false ) {
+ throw new MWException( 'Lua file does not exist: ' . $fileName );
+ }
+ $cache->set( $cacheKey, [ $code, $mtime ], 60 * 5 );
+ }
+
+ # Prepending an "@" to the chunk name makes Lua think it is a filename
+ $module = $this->getInterpreter()->loadString( $code, '@' . basename( $fileName ) );
+ $ret = $this->getInterpreter()->callFunction( $module );
+ return isset( $ret[0] ) ? $ret[0] : null;
+ }
+
+ public function getGeSHiLanguage() {
+ return 'lua';
+ }
+
+ public function getCodeEditorLanguage() {
+ return 'lua';
+ }
+
+ public function runConsole( array $params ) {
+ // $resetFrames is a ScopedCallback, so it has a purpose even though it appears unused.
+ $resetFrames = $this->setupCurrentFrames();
+
+ /**
+ * TODO: provide some means for giving correct line numbers for errors
+ * in console input, and for producing an informative error message
+ * if there is an error in prevQuestions.
+ *
+ * Maybe each console line could be evaluated as a different chunk,
+ * apparently that's what lua.c does.
+ */
+ $code = "return function (__init, exe)\n" .
+ "if not exe then exe = function(...) return true, ... end end\n" .
+ "local p = select(2, exe(__init) )\n" .
+ "__init, exe = nil, nil\n" .
+ "local print = mw.log\n";
+ foreach ( $params['prevQuestions'] as $q ) {
+ if ( substr( $q, 0, 1 ) === '=' ) {
+ $code .= "print(" . substr( $q, 1 ) . ")";
+ } else {
+ $code .= $q;
+ }
+ $code .= "\n";
+ }
+ $code .= "mw.clearLogBuffer()\n";
+ if ( substr( $params['question'], 0, 1 ) === '=' ) {
+ // Treat a statement starting with "=" as a return statement, like in lua.c
+ $code .= "local ret = mw.allToString(" . substr( $params['question'], 1 ) . ")\n" .
+ "return ret, mw.getLogBuffer()\n";
+ } else {
+ $code .= $params['question'] . "\n" .
+ "return nil, mw.getLogBuffer()\n";
+ }
+ $code .= "end\n";
+
+ if ( $params['title']->hasContentModel( CONTENT_MODEL_SCRIBUNTO ) ) {
+ $contentModule = $this->newModule(
+ $params['content'], $params['title']->getPrefixedDBkey() );
+ $contentInit = $contentModule->getInitChunk();
+ $contentExe = $this->mw['executeModule'];
+ } else {
+ $contentInit = $params['content'];
+ $contentExe = null;
+ }
+
+ $consoleModule = $this->newModule(
+ $code,
+ wfMessage( 'scribunto-console-current-src' )->text()
+ );
+ $consoleInit = $consoleModule->getInitChunk();
+ $ret = $this->getInterpreter()->callFunction( $this->mw['executeModule'], $consoleInit, false );
+ $func = $ret[1];
+ $ret = $this->getInterpreter()->callFunction( $func, $contentInit, $contentExe );
+
+ return [
+ 'return' => isset( $ret[0] ) ? $ret[0] : null,
+ 'print' => isset( $ret[1] ) ? $ret[1] : '',
+ ];
+ }
+
+ /**
+ * Workalike for luaL_checktype()
+ *
+ * @param string $funcName The Lua function name, for use in error messages
+ * @param array $args The argument array
+ * @param int $index0 The zero-based argument index
+ * @param string|array $type The allowed type names as given by gettype()
+ * @param string $msgType The type name used in the error message
+ * @throws Scribunto_LuaError
+ */
+ public function checkType( $funcName, $args, $index0, $type, $msgType ) {
+ if ( !is_array( $type ) ) {
+ $type = [ $type ];
+ }
+ if ( !isset( $args[$index0] ) || !in_array( gettype( $args[$index0] ), $type, true ) ) {
+ $index1 = $index0 + 1;
+ throw new Scribunto_LuaError( "bad argument #$index1 to '$funcName' ($msgType expected)" );
+ }
+ }
+
+ /**
+ * Workalike for luaL_checkstring()
+ *
+ * @param string $funcName The Lua function name, for use in error messages
+ * @param array $args The argument array
+ * @param int $index0 The zero-based argument index
+ */
+ public function checkString( $funcName, $args, $index0 ) {
+ $this->checkType( $funcName, $args, $index0, 'string', 'string' );
+ }
+
+ /**
+ * Workalike for luaL_checknumber()
+ *
+ * @param string $funcName The Lua function name, for use in error messages
+ * @param array $args The argument array
+ * @param int $index0 The zero-based argument index
+ */
+ public function checkNumber( $funcName, $args, $index0 ) {
+ $this->checkType( $funcName, $args, $index0, [ 'integer', 'double' ], 'number' );
+ }
+
+ /**
+ * Instantiate and register a library.
+ * @param string $name
+ * @param array|string $def
+ * @param bool $loadDeferred
+ * @throws MWException
+ * @return array|null
+ */
+ private function instantiatePHPLibrary( $name, $def, $loadDeferred ) {
+ $def = $this->availableLibraries[$name];
+ if ( is_string( $def ) ) {
+ $class = new $def( $this );
+ } else {
+ if ( !$loadDeferred && !empty( $def['deferLoad'] ) ) {
+ return null;
+ }
+ if ( isset( $def['class'] ) ) {
+ $class = new $def['class']( $this );
+ } else {
+ throw new MWException( "No class for library \"$name\"" );
+ }
+ }
+ return $class->register();
+ }
+
+ /**
+ * Handler for the loadPHPLibrary() callback. Register the specified
+ * library and return its function table. It's not necessary to cache the
+ * function table in the object instance, since there is caching in a
+ * wrapper on the Lua side.
+ * @param string $name
+ * @return array
+ */
+ function loadPHPLibrary( $name ) {
+ $args = func_get_args();
+ $this->checkString( 'loadPHPLibrary', $args, 0 );
+
+ $ret = null;
+ if ( isset( $this->availableLibraries[$name] ) ) {
+ $ret = $this->instantiatePHPLibrary( $name, $this->availableLibraries[$name], true );
+ }
+
+ return [ $ret ];
+ }
+
+ /**
+ * Handler for the loadPackage() callback. Load the specified
+ * module and return its chunk. It's not necessary to cache the resulting
+ * chunk in the object instance, since there is caching in a wrapper on the
+ * Lua side.
+ * @param string $name
+ * @return array
+ */
+ function loadPackage( $name ) {
+ $args = func_get_args();
+ $this->checkString( 'loadPackage', $args, 0 );
+
+ # This is what Lua does for its built-in loaders
+ $luaName = str_replace( '.', '/', $name ) . '.lua';
+ $paths = $this->getLibraryPaths( 'lua', self::$libraryPaths );
+ foreach ( $paths as $path ) {
+ $fileName = $this->normalizeModuleFileName( "$path/$luaName" );
+ if ( !file_exists( $fileName ) ) {
+ continue;
+ }
+ $code = file_get_contents( $fileName );
+ $init = $this->interpreter->loadString( $code, "@$luaName" );
+ return [ $init ];
+ }
+
+ $title = Title::newFromText( $name );
+ if ( !$title || !$title->hasContentModel( CONTENT_MODEL_SCRIBUNTO ) ) {
+ return [];
+ }
+
+ $module = $this->fetchModuleFromParser( $title );
+ if ( $module ) {
+ /** @suppress PhanUndeclaredMethod */
+ return [ $module->getInitChunk() ];
+ } else {
+ return [];
+ }
+ }
+
+ /**
+ * Helper function for the implementation of frame methods
+ *
+ * @param string $frameId
+ * @return PPFrame
+ *
+ * @throws Scribunto_LuaError
+ */
+ protected function getFrameById( $frameId ) {
+ if ( $frameId === 'empty' ) {
+ return $this->getParser()->getPreprocessor()->newFrame();
+ } elseif ( isset( $this->currentFrames[$frameId] ) ) {
+ return $this->currentFrames[$frameId];
+ } else {
+ throw new Scribunto_LuaError( 'invalid frame ID' );
+ }
+ }
+
+ /**
+ * Handler for frameExists()
+ *
+ * @param string $frameId
+ * @return array
+ */
+ function frameExists( $frameId ) {
+ return [ $frameId === 'empty' || isset( $this->currentFrames[$frameId] ) ];
+ }
+
+ /**
+ * Handler for newChildFrame()
+ *
+ * @param string $frameId
+ * @param string $title
+ * @param array $args
+ * @return array
+ * @throws Scribunto_LuaError
+ */
+ function newChildFrame( $frameId, $title, array $args ) {
+ if ( count( $this->currentFrames ) > 100 ) {
+ throw new Scribunto_LuaError( 'newChild: too many frames' );
+ }
+
+ $frame = $this->getFrameById( $frameId );
+ if ( $title === false ) {
+ $title = $frame->getTitle();
+ } else {
+ $title = Title::newFromText( $title );
+ if ( !$title ) {
+ throw new Scribunto_LuaError( 'newChild: invalid title' );
+ }
+ }
+ $args = $this->getParser()->getPreprocessor()->newPartNodeArray( $args );
+ $newFrame = $frame->newChild( $args, $title );
+ $newFrameId = 'frame' . count( $this->currentFrames );
+ $this->currentFrames[$newFrameId] = $newFrame;
+ return [ $newFrameId ];
+ }
+
+ /**
+ * Handler for getTitle()
+ *
+ * @param string $frameId
+ *
+ * @return array
+ */
+ function getFrameTitle( $frameId ) {
+ $frame = $this->getFrameById( $frameId );
+ return [ $frame->getTitle()->getPrefixedText() ];
+ }
+
+ /**
+ * Handler for setTTL()
+ * @param int $ttl
+ */
+ function setTTL( $ttl ) {
+ $args = func_get_args();
+ $this->checkNumber( 'setTTL', $args, 0 );
+
+ $frame = $this->getFrameById( 'current' );
+ $frame->setTTL( $ttl );
+ }
+
+ /**
+ * Handler for getExpandedArgument()
+ * @param string $frameId
+ * @param string $name
+ * @return array
+ */
+ function getExpandedArgument( $frameId, $name ) {
+ $args = func_get_args();
+ $this->checkString( 'getExpandedArgument', $args, 0 );
+
+ $frame = $this->getFrameById( $frameId );
+ $this->getInterpreter()->pauseUsageTimer();
+ $result = $frame->getArgument( $name );
+ if ( $result === false ) {
+ return [];
+ } else {
+ return [ $result ];
+ }
+ }
+
+ /**
+ * Handler for getAllExpandedArguments()
+ * @param string $frameId
+ * @return array
+ */
+ function getAllExpandedArguments( $frameId ) {
+ $frame = $this->getFrameById( $frameId );
+ $this->getInterpreter()->pauseUsageTimer();
+ return [ $frame->getArguments() ];
+ }
+
+ /**
+ * Handler for expandTemplate()
+ * @param string $frameId
+ * @param string $titleText
+ * @param array $args
+ * @return array
+ * @throws Scribunto_LuaError
+ */
+ function expandTemplate( $frameId, $titleText, $args ) {
+ $frame = $this->getFrameById( $frameId );
+ $title = Title::newFromText( $titleText, NS_TEMPLATE );
+ if ( !$title ) {
+ throw new Scribunto_LuaError( "expandTemplate: invalid title \"$titleText\"" );
+ }
+
+ if ( $frame->depth >= $this->parser->mOptions->getMaxTemplateDepth() ) {
+ throw new Scribunto_LuaError( 'expandTemplate: template depth limit exceeded' );
+ }
+ if ( MWNamespace::isNonincludable( $title->getNamespace() ) ) {
+ throw new Scribunto_LuaError( 'expandTemplate: template inclusion denied' );
+ }
+
+ list( $dom, $finalTitle ) = $this->parser->getTemplateDom( $title );
+ if ( $dom === false ) {
+ throw new Scribunto_LuaError( "expandTemplate: template \"$titleText\" does not exist" );
+ }
+ if ( !$frame->loopCheck( $finalTitle ) ) {
+ throw new Scribunto_LuaError( 'expandTemplate: template loop detected' );
+ }
+
+ $fargs = $this->getParser()->getPreprocessor()->newPartNodeArray( $args );
+ $newFrame = $frame->newChild( $fargs, $finalTitle );
+ $text = $this->doCachedExpansion( $newFrame, $dom,
+ [
+ 'frameId' => $frameId,
+ 'template' => $finalTitle->getPrefixedDBkey(),
+ 'args' => $args
+ ] );
+ return [ $text ];
+ }
+
+ /**
+ * Handler for callParserFunction()
+ * @param string $frameId
+ * @param string $function
+ * @param array $args
+ * @throws MWException
+ * @throws Scribunto_LuaError
+ * @return array
+ */
+ function callParserFunction( $frameId, $function, $args ) {
+ $frame = $this->getFrameById( $frameId );
+
+ # Make zero-based, without screwing up named args
+ $args = array_merge( [], $args );
+
+ # Sort, since we can't rely on the order coming in from Lua
+ uksort( $args, function ( $a, $b ) {
+ if ( is_int( $a ) !== is_int( $b ) ) {
+ return is_int( $a ) ? -1 : 1;
+ }
+ if ( is_int( $a ) ) {
+ return $a - $b;
+ }
+ return strcmp( $a, $b );
+ } );
+
+ # Be user-friendly
+ $colonPos = strpos( $function, ':' );
+ if ( $colonPos !== false ) {
+ array_unshift( $args, trim( substr( $function, $colonPos + 1 ) ) );
+ $function = substr( $function, 0, $colonPos );
+ }
+ if ( !isset( $args[0] ) ) {
+ # It's impossible to call a parser function from wikitext without
+ # supplying an arg 0. Insist that one be provided via Lua, too.
+ throw new Scribunto_LuaError( 'callParserFunction: At least one unnamed parameter ' .
+ '(the parameter that comes after the colon in wikitext) ' .
+ 'must be provided'
+ );
+ }
+
+ $result = $this->parser->callParserFunction( $frame, $function, $args );
+ if ( !$result['found'] ) {
+ throw new Scribunto_LuaError( "callParserFunction: function \"$function\" was not found" );
+ }
+
+ # Set defaults for various flags
+ $result += [
+ 'nowiki' => false,
+ 'isChildObj' => false,
+ 'isLocalObj' => false,
+ 'isHTML' => false,
+ 'title' => false,
+ ];
+
+ $text = $result['text'];
+ if ( $result['isChildObj'] ) {
+ $fargs = $this->getParser()->getPreprocessor()->newPartNodeArray( $args );
+ $newFrame = $frame->newChild( $fargs, $result['title'] );
+ if ( $result['nowiki'] ) {
+ $text = $newFrame->expand( $text, PPFrame::RECOVER_ORIG );
+ } else {
+ $text = $newFrame->expand( $text );
+ }
+ }
+ if ( $result['isLocalObj'] && $result['nowiki'] ) {
+ $text = $frame->expand( $text, PPFrame::RECOVER_ORIG );
+ $result['isLocalObj'] = false;
+ }
+
+ # Replace raw HTML by a placeholder
+ if ( $result['isHTML'] ) {
+ $text = $this->parser->insertStripItem( $text );
+ } elseif ( $result['nowiki'] ) {
+ # Escape nowiki-style return values
+ $text = wfEscapeWikiText( $text );
+ }
+
+ if ( $result['isLocalObj'] ) {
+ $text = $frame->expand( $text );
+ }
+
+ return [ "$text" ];
+ }
+
+ /**
+ * Handler for preprocess()
+ * @param string $frameId
+ * @param string $text
+ * @return array
+ * @throws Scribunto_LuaError
+ */
+ function preprocess( $frameId, $text ) {
+ $args = func_get_args();
+ $this->checkString( 'preprocess', $args, 0 );
+
+ $frame = $this->getFrameById( $frameId );
+
+ if ( !$frame ) {
+ throw new Scribunto_LuaError( 'attempt to call mw.preprocess with no frame' );
+ }
+
+ // Don't count the time for expanding all the frame arguments against
+ // the Lua time limit.
+ $this->getInterpreter()->pauseUsageTimer();
+ $frame->getArguments();
+ $this->getInterpreter()->unpauseUsageTimer();
+
+ $text = $this->doCachedExpansion( $frame, $text,
+ [
+ 'frameId' => $frameId,
+ 'inputText' => $text
+ ] );
+ return [ $text ];
+ }
+
+ /**
+ * Increment the expensive function count, and throw if limit exceeded
+ *
+ * @throws Scribunto_LuaError
+ * @return null
+ */
+ public function incrementExpensiveFunctionCount() {
+ if ( !$this->getParser()->incrementExpensiveFunctionCount() ) {
+ throw new Scribunto_LuaError( "too many expensive function calls" );
+ }
+ return null;
+ }
+
+ /**
+ * Adds a warning to be displayed upon preview
+ *
+ * @param string $text wikitext
+ */
+ public function addWarning( $text ) {
+ $this->getParser()->getOutput()->addWarning( $text );
+ }
+
+ /**
+ * Return whether the parser is currently substing
+ *
+ * @return array
+ */
+ public function isSubsting() {
+ // See Parser::braceSubstitution, OT_WIKI is the switch
+ return [ $this->getParser()->OutputType() === Parser::OT_WIKI ];
+ }
+
+ function doCachedExpansion( $frame, $input, $cacheKey ) {
+ $hash = md5( serialize( $cacheKey ) );
+ if ( isset( $this->expandCache[$hash] ) ) {
+ return $this->expandCache[$hash];
+ }
+
+ if ( is_scalar( $input ) ) {
+ $input = str_replace( [ "\r\n", "\r" ], "\n", $input );
+ $dom = $this->parser->getPreprocessor()->preprocessToObj(
+ $input, $frame->depth ? Parser::PTD_FOR_INCLUSION : 0 );
+ } else {
+ $dom = $input;
+ }
+ $ret = $frame->expand( $dom );
+ if ( !$frame->isVolatile() ) {
+ if ( count( $this->expandCache ) > self::MAX_EXPAND_CACHE_SIZE ) {
+ reset( $this->expandCache );
+ $oldHash = key( $this->expandCache );
+ unset( $this->expandCache[$oldHash] );
+ }
+ $this->expandCache[$hash] = $ret;
+ }
+ return $ret;
+ }
+}
+
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+class Scribunto_LuaModule extends ScribuntoModuleBase {
+ /**
+ * @var mixed
+ */
+ protected $initChunk;
+
+ /**
+ * @var Scribunto_LuaEngine
+ */
+ protected $engine;
+
+ /**
+ * @param Scribunto_LuaEngine $engine
+ * @param string $code
+ * @param string|bool $chunkName
+ */
+ public function __construct( Scribunto_LuaEngine $engine, $code, $chunkName ) {
+ parent::__construct( $engine, $code, $chunkName );
+ }
+
+ public function validate() {
+ try {
+ $this->getInitChunk();
+ } catch ( ScribuntoException $e ) {
+ return $e->toStatus();
+ }
+ return Status::newGood();
+ }
+
+ /**
+ * Get the chunk which, when called, will return the export table.
+ * @return mixed
+ */
+ public function getInitChunk() {
+ if ( !$this->initChunk ) {
+ $this->initChunk = $this->engine->getInterpreter()->loadString(
+ $this->code,
+ // Prepending an "=" to the chunk name avoids truncation or a "[string" prefix
+ '=' . $this->chunkName );
+ }
+ return $this->initChunk;
+ }
+
+ /**
+ * Invoke a function within the module. Return the expanded wikitext result.
+ *
+ * @param string $name
+ * @param PPFrame $frame
+ * @throws ScribuntoException
+ * @return string|null
+ */
+ public function invoke( $name, $frame ) {
+ $ret = $this->engine->executeModule( $this->getInitChunk(), $name, $frame );
+
+ if ( !isset( $ret ) ) {
+ throw $this->engine->newException(
+ 'scribunto-common-nosuchfunction', [ 'args' => [ $name ] ]
+ );
+ }
+ if ( !$this->engine->getInterpreter()->isLuaFunction( $ret ) ) {
+ throw $this->engine->newException(
+ 'scribunto-common-notafunction', [ 'args' => [ $name ] ]
+ );
+ }
+
+ $result = $this->engine->executeFunctionChunk( $ret, $frame );
+ if ( isset( $result[0] ) ) {
+ return $result[0];
+ } else {
+ return null;
+ }
+ }
+}
+
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+class Scribunto_LuaError extends ScribuntoException {
+ public $luaMessage, $lineMap = [];
+
+ function __construct( $message, array $options = [] ) {
+ $this->luaMessage = $message;
+ $options = $options + [ 'args' => [ $message ] ];
+ if ( isset( $options['module'] ) && isset( $options['line'] ) ) {
+ $msg = 'scribunto-lua-error-location';
+ } else {
+ $msg = 'scribunto-lua-error';
+ }
+
+ parent::__construct( $msg, $options );
+ }
+
+ function getLuaMessage() {
+ return $this->luaMessage;
+ }
+
+ function setLineMap( $map ) {
+ $this->lineMap = $map;
+ }
+
+ /**
+ * @param array $options Options for message processing. Currently supports:
+ * $options['msgOptions']['content'] to use content language.
+ * @return bool|string
+ */
+ function getScriptTraceHtml( $options = [] ) {
+ if ( !isset( $this->params['trace'] ) ) {
+ return false;
+ }
+ if ( isset( $options['msgOptions'] ) ) {
+ $msgOptions = $options['msgOptions'];
+ } else {
+ $msgOptions = [];
+ }
+
+ $s = '<ol class="scribunto-trace">';
+ foreach ( $this->params['trace'] as $info ) {
+ $short_src = $srcdefined = $info['short_src'];
+ $currentline = $info['currentline'];
+
+ $src = htmlspecialchars( $short_src );
+ if ( $currentline > 0 ) {
+ $src .= ':' . htmlspecialchars( $currentline );
+
+ $title = Title::newFromText( $short_src );
+ if ( $title && $title->hasContentModel( CONTENT_MODEL_SCRIBUNTO ) ) {
+ $title = $title->createFragmentTarget( 'mw-ce-l' . $currentline );
+ $src = Html::rawElement( 'a',
+ [ 'href' => $title->getFullURL( 'action=edit' ) ],
+ $src );
+ }
+ }
+
+ if ( strval( $info['namewhat'] ) !== '' ) {
+ $function = wfMessage( 'scribunto-lua-in-function', wfEscapeWikiText( $info['name'] ) );
+ in_array( 'content', $msgOptions ) ?
+ $function = $function->inContentLanguage()->plain() :
+ $function = $function->plain();
+ } elseif ( $info['what'] == 'main' ) {
+ $function = wfMessage( 'scribunto-lua-in-main' );
+ in_array( 'content', $msgOptions ) ?
+ $function = $function->inContentLanguage()->plain() :
+ $function = $function->plain();
+ } else {
+ // C function, tail call, or a Lua function where Lua can't
+ // guess the name
+ $function = '?';
+ }
+
+ $backtraceLine = wfMessage( 'scribunto-lua-backtrace-line' )
+ ->rawParams( "<strong>$src</strong>" )
+ ->params( $function );
+ in_array( 'content', $msgOptions ) ?
+ $backtraceLine = $backtraceLine->inContentLanguage()->parse() :
+ $backtraceLine = $backtraceLine->parse();
+
+ $s .= "<li>$backtraceLine</li>";
+ }
+ $s .= '</ol>';
+ return $s;
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LuaInterpreter.php b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LuaInterpreter.php
new file mode 100644
index 00000000..e1840310
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/LuaInterpreter.php
@@ -0,0 +1,68 @@
+<?php
+
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+abstract class Scribunto_LuaInterpreter {
+ /**
+ * Load a string. Return an object which can later be passed to callFunction.
+ * If there is a pass error, a Scribunto_LuaError will be thrown.
+ *
+ * @param string $text The Lua source code
+ * @param string $chunkName The chunk name
+ * @return mixed
+ */
+ abstract public function loadString( $text, $chunkName );
+
+ /**
+ * Call a Lua function. Return an array of results, with indices starting
+ * at zero. If an error occurs, a Scribunto_LuaError will be thrown.
+ *
+ * @param mixed $func The function object
+ */
+ abstract public function callFunction( $func /*...*/ );
+
+ /**
+ * Wrap a PHP callable as a Lua function, which can be passed back into
+ * Lua. If an error occurs, a Scribunto_LuaError will be thrown.
+ *
+ * @param callable $callable The PHP callable
+ * @return object a Lua function
+ */
+ abstract public function wrapPhpFunction( $callable );
+
+ /**
+ * Test whether an object is a Lua function.
+ *
+ * @param object $object
+ * @return bool
+ */
+ abstract public function isLuaFunction( $object );
+
+ /**
+ * Register a library of functions.
+ *
+ * @param string $name The global variable name to be created or added to.
+ * @param array $functions An associative array mapping the function name to the
+ * callback. The callback may throw a Scribunto_LuaError, which will be
+ * caught and raised in the Lua code as a Lua error, catchable with
+ * pcall().
+ */
+ abstract public function registerLibrary( $name, array $functions );
+
+ /**
+ * Pause CPU usage and limits
+ * @return void
+ */
+ abstract public function pauseUsageTimer();
+
+ /**
+ * Unpause CPU usage and limits
+ * @return void
+ */
+ abstract public function unpauseUsageTimer();
+}
+
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+class Scribunto_LuaInterpreterNotFoundError extends MWException {}
+
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+class Scribunto_LuaInterpreterBadVersionError extends MWException {}
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/MessageLibrary.php b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/MessageLibrary.php
new file mode 100644
index 00000000..4d9edbd3
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/MessageLibrary.php
@@ -0,0 +1,59 @@
+<?php
+
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+class Scribunto_LuaMessageLibrary extends Scribunto_LuaLibraryBase {
+ function register() {
+ $lib = [
+ 'plain' => [ $this, 'messagePlain' ],
+ 'check' => [ $this, 'messageCheck' ],
+ ];
+
+ // Get the correct default language from the parser
+ if ( $this->getParser() ) {
+ $lang = $this->getParser()->getTargetLanguage();
+ } else {
+ global $wgContLang;
+ $lang = $wgContLang;
+ }
+
+ return $this->getEngine()->registerInterface( 'mw.message.lua', $lib, [
+ 'lang' => $lang->getCode(),
+ ] );
+ }
+
+ private function makeMessage( $data, $setParams ) {
+ if ( isset( $data['rawMessage'] ) ) {
+ $msg = new RawMessage( $data['rawMessage'] );
+ } else {
+ $msg = Message::newFallbackSequence( $data['keys'] );
+ }
+ $msg->inLanguage( $data['lang'] )
+ ->useDatabase( $data['useDB'] );
+ if ( $setParams ) {
+ $msg->params( array_values( $data['params'] ) );
+ }
+ return $msg;
+ }
+
+ function messagePlain( $data ) {
+ try {
+ $msg = $this->makeMessage( $data, true );
+ return [ $msg->plain() ];
+ } catch ( MWException $ex ) {
+ throw new Scribunto_LuaError( "msg:plain() failed (" . $ex->getMessage() . ")" );
+ }
+ }
+
+ function messageCheck( $what, $data ) {
+ if ( !in_array( $what, [ 'exists', 'isBlank', 'isDisabled' ] ) ) {
+ throw new Scribunto_LuaError( "invalid what for 'messageCheck'" );
+ }
+
+ try {
+ $msg = $this->makeMessage( $data, false );
+ return [ call_user_func( [ $msg, $what ] ) ];
+ } catch ( MWException $ex ) {
+ throw new Scribunto_LuaError( "msg:$what() failed (" . $ex->getMessage() . ")" );
+ }
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/SiteLibrary.php b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/SiteLibrary.php
new file mode 100644
index 00000000..92d733c4
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/SiteLibrary.php
@@ -0,0 +1,189 @@
+<?php
+
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+class Scribunto_LuaSiteLibrary extends Scribunto_LuaLibraryBase {
+ private static $namespacesCacheLang = null;
+ private static $namespacesCache = null;
+ private static $interwikiMapCache = [];
+ private $pagesInCategoryCache = [];
+
+ function register() {
+ global $wgContLang, $wgNamespaceAliases;
+
+ $lib = [
+ 'getNsIndex' => [ $this, 'getNsIndex' ],
+ 'pagesInCategory' => [ $this, 'pagesInCategory' ],
+ 'pagesInNamespace' => [ $this, 'pagesInNamespace' ],
+ 'usersInGroup' => [ $this, 'usersInGroup' ],
+ 'interwikiMap' => [ $this, 'interwikiMap' ],
+ ];
+ $parser = $this->getParser();
+ $info = [
+ 'siteName' => $GLOBALS['wgSitename'],
+ 'server' => $GLOBALS['wgServer'],
+ 'scriptPath' => $GLOBALS['wgScriptPath'],
+ 'stylePath' => $GLOBALS['wgStylePath'],
+ 'currentVersion' => SpecialVersion::getVersion(
+ '', $parser ? $parser->getTargetLanguage() : $wgContLang
+ ),
+ ];
+
+ if ( !self::$namespacesCache || self::$namespacesCacheLang !== $wgContLang->getCode() ) {
+ $namespaces = [];
+ $namespacesByName = [];
+ foreach ( $wgContLang->getFormattedNamespaces() as $ns => $title ) {
+ $canonical = MWNamespace::getCanonicalName( $ns );
+ $namespaces[$ns] = [
+ 'id' => $ns,
+ 'name' => $title,
+ 'canonicalName' => strtr( $canonical, '_', ' ' ),
+ 'hasSubpages' => MWNamespace::hasSubpages( $ns ),
+ 'hasGenderDistinction' => MWNamespace::hasGenderDistinction( $ns ),
+ 'isCapitalized' => MWNamespace::isCapitalized( $ns ),
+ 'isContent' => MWNamespace::isContent( $ns ),
+ 'isIncludable' => !MWNamespace::isNonincludable( $ns ),
+ 'isMovable' => MWNamespace::isMovable( $ns ),
+ 'isSubject' => MWNamespace::isSubject( $ns ),
+ 'isTalk' => MWNamespace::isTalk( $ns ),
+ 'defaultContentModel' => MWNamespace::getNamespaceContentModel( $ns ),
+ 'aliases' => [],
+ ];
+ if ( $ns >= NS_MAIN ) {
+ $namespaces[$ns]['subject'] = MWNamespace::getSubject( $ns );
+ $namespaces[$ns]['talk'] = MWNamespace::getTalk( $ns );
+ $namespaces[$ns]['associated'] = MWNamespace::getAssociated( $ns );
+ } else {
+ $namespaces[$ns]['subject'] = $ns;
+ }
+ $namespacesByName[strtr( $title, ' ', '_' )] = $ns;
+ if ( $canonical ) {
+ $namespacesByName[$canonical] = $ns;
+ }
+ }
+
+ $aliases = array_merge( $wgNamespaceAliases, $wgContLang->getNamespaceAliases() );
+ foreach ( $aliases as $title => $ns ) {
+ if ( !isset( $namespacesByName[$title] ) && isset( $namespaces[$ns] ) ) {
+ $ct = count( $namespaces[$ns]['aliases'] );
+ $namespaces[$ns]['aliases'][$ct + 1] = $title;
+ $namespacesByName[$title] = $ns;
+ }
+ }
+
+ $namespaces[NS_MAIN]['displayName'] = wfMessage( 'blanknamespace' )->inContentLanguage()->text();
+
+ self::$namespacesCache = $namespaces;
+ self::$namespacesCacheLang = $wgContLang->getCode();
+ }
+ $info['namespaces'] = self::$namespacesCache;
+
+ $info['stats'] = [
+ 'pages' => (int)SiteStats::pages(),
+ 'articles' => (int)SiteStats::articles(),
+ 'files' => (int)SiteStats::images(),
+ 'edits' => (int)SiteStats::edits(),
+ 'users' => (int)SiteStats::users(),
+ 'activeUsers' => (int)SiteStats::activeUsers(),
+ 'admins' => (int)SiteStats::numberingroup( 'sysop' ),
+ ];
+
+ return $this->getEngine()->registerInterface( 'mw.site.lua', $lib, $info );
+ }
+
+ public function pagesInCategory( $category = null, $which = null ) {
+ $this->checkType( 'pagesInCategory', 1, $category, 'string' );
+ $this->checkTypeOptional( 'pagesInCategory', 2, $which, 'string', 'all' );
+
+ $title = Title::makeTitleSafe( NS_CATEGORY, $category );
+ if ( !$title ) {
+ return [ 0 ];
+ }
+ $cacheKey = $title->getDBkey();
+
+ if ( !isset( $this->pagesInCategoryCache[$cacheKey] ) ) {
+ $this->incrementExpensiveFunctionCount();
+ $category = Category::newFromTitle( $title );
+ $counts = [
+ 'all' => (int)$category->getPageCount(),
+ 'subcats' => (int)$category->getSubcatCount(),
+ 'files' => (int)$category->getFileCount(),
+ ];
+ $counts['pages'] = $counts['all'] - $counts['subcats'] - $counts['files'];
+ $this->pagesInCategoryCache[$cacheKey] = $counts;
+ }
+ if ( $which === '*' ) {
+ return [ $this->pagesInCategoryCache[$cacheKey] ];
+ }
+ if ( !isset( $this->pagesInCategoryCache[$cacheKey][$which] ) ) {
+ $this->checkType(
+ 'pagesInCategory', 2, $which, "one of '*', 'all', 'pages', 'subcats', or 'files'"
+ );
+ }
+ return [ $this->pagesInCategoryCache[$cacheKey][$which] ];
+ }
+
+ public function pagesInNamespace( $ns = null ) {
+ $this->checkType( 'pagesInNamespace', 1, $ns, 'number' );
+ return [ (int)SiteStats::pagesInNs( intval( $ns ) ) ];
+ }
+
+ public function usersInGroup( $group = null ) {
+ $this->checkType( 'usersInGroup', 1, $group, 'string' );
+ return [ (int)SiteStats::numberingroup( strtolower( $group ) ) ];
+ }
+
+ public function getNsIndex( $name = null ) {
+ global $wgContLang;
+ $this->checkType( 'getNsIndex', 1, $name, 'string' );
+ // PHP call is case-insensitive but chokes on non-standard spaces/underscores.
+ $name = trim( preg_replace( '/[\s_]+/', '_', $name ), '_' );
+ return [ $wgContLang->getNsIndex( $name ) ];
+ }
+
+ public function interwikiMap( $filter = null ) {
+ global $wgLocalInterwikis, $wgExtraInterlanguageLinkPrefixes;
+ $this->checkTypeOptional( 'interwikiMap', 1, $filter, 'string', null );
+ $local = null;
+ if ( $filter === 'local' ) {
+ $local = 1;
+ } elseif ( $filter === '!local' ) {
+ $local = 0;
+ } elseif ( $filter !== null ) {
+ throw new Scribunto_LuaError(
+ "bad argument #1 to 'interwikiMap' (unknown filter '$filter')"
+ );
+ }
+ $cacheKey = $filter === null ? 'null' : $filter;
+ if ( !isset( self::$interwikiMapCache[$cacheKey] ) ) {
+ // Not expensive because we can have a max of three cache misses in the
+ // entire page parse.
+ $interwikiMap = [];
+ $prefixes = Interwiki::getAllPrefixes( $local );
+ foreach ( $prefixes as $row ) {
+ $prefix = $row['iw_prefix'];
+ $val = [
+ 'prefix' => $prefix,
+ 'url' => wfExpandUrl( $row['iw_url'], PROTO_RELATIVE ),
+ 'isProtocolRelative' => substr( $row['iw_url'], 0, 2 ) === '//',
+ 'isLocal' => isset( $row['iw_local'] ) && $row['iw_local'] == '1',
+ 'isTranscludable' => isset( $row['iw_trans'] ) && $row['iw_trans'] == '1',
+ 'isCurrentWiki' => in_array( $prefix, $wgLocalInterwikis ),
+ 'isExtraLanguageLink' => in_array( $prefix, $wgExtraInterlanguageLinkPrefixes ),
+ ];
+ if ( $val['isExtraLanguageLink'] ) {
+ $displayText = wfMessage( "interlanguage-link-$prefix" );
+ if ( !$displayText->isDisabled() ) {
+ $val['displayText'] = $displayText->text();
+ }
+ $tooltip = wfMessage( "interlanguage-link-sitename-$prefix" );
+ if ( !$tooltip->isDisabled() ) {
+ $val['tooltip'] = $tooltip->text();
+ }
+ }
+ $interwikiMap[$prefix] = $val;
+ }
+ self::$interwikiMapCache[$cacheKey] = $interwikiMap;
+ }
+ return [ self::$interwikiMapCache[$cacheKey] ];
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/TextLibrary.php b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/TextLibrary.php
new file mode 100644
index 00000000..794d3821
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/TextLibrary.php
@@ -0,0 +1,142 @@
+<?php
+
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+class Scribunto_LuaTextLibrary extends Scribunto_LuaLibraryBase {
+ // Matches Lua mw.text constants
+ const JSON_PRESERVE_KEYS = 1;
+ const JSON_TRY_FIXING = 2;
+ const JSON_PRETTY = 4;
+
+ function register() {
+ global $wgUrlProtocols;
+
+ $lib = [
+ 'unstrip' => [ $this, 'textUnstrip' ],
+ 'unstripNoWiki' => [ $this, 'textUnstripNoWiki' ],
+ 'killMarkers' => [ $this, 'killMarkers' ],
+ 'getEntityTable' => [ $this, 'getEntityTable' ],
+ 'jsonEncode' => [ $this, 'jsonEncode' ],
+ 'jsonDecode' => [ $this, 'jsonDecode' ],
+ ];
+ $opts = [
+ 'comma' => wfMessage( 'comma-separator' )->inContentLanguage()->text(),
+ 'and' => wfMessage( 'and' )->inContentLanguage()->text() .
+ wfMessage( 'word-separator' )->inContentLanguage()->text(),
+ 'ellipsis' => wfMessage( 'ellipsis' )->inContentLanguage()->text(),
+ 'nowiki_protocols' => [],
+ ];
+
+ foreach ( $wgUrlProtocols as $prot ) {
+ if ( substr( $prot, -1 ) === ':' ) {
+ // To convert the protocol into a case-insensitive Lua pattern,
+ // we need to replace letters with a character class like [Xx]
+ // and insert a '%' before various punctuation.
+ $prot = preg_replace_callback( '/([a-zA-Z])|([()^$%.\[\]*+?-])/', function ( $m ) {
+ if ( $m[1] ) {
+ return '[' . strtoupper( $m[1] ) . strtolower( $m[1] ) . ']';
+ } else {
+ return '%' . $m[2];
+ }
+ }, substr( $prot, 0, -1 ) );
+ $opts['nowiki_protocols']["($prot):"] = '%1&#58;';
+ }
+ }
+
+ return $this->getEngine()->registerInterface( 'mw.text.lua', $lib, $opts );
+ }
+
+ function textUnstrip( $s ) {
+ $this->checkType( 'unstrip', 1, $s, 'string' );
+ $stripState = $this->getParser()->mStripState;
+ return [ $stripState->killMarkers( $stripState->unstripNoWiki( $s ) ) ];
+ }
+
+ function textUnstripNoWiki( $s ) {
+ $this->checkType( 'unstripNoWiki', 1, $s, 'string' );
+ return [ $this->getParser()->mStripState->unstripNoWiki( $s ) ];
+ }
+
+ function killMarkers( $s ) {
+ $this->checkType( 'killMarkers', 1, $s, 'string' );
+ return [ $this->getParser()->mStripState->killMarkers( $s ) ];
+ }
+
+ function getEntityTable() {
+ $table = array_flip(
+ get_html_translation_table( HTML_ENTITIES, ENT_QUOTES | ENT_HTML5, "UTF-8" )
+ );
+ return [ $table ];
+ }
+
+ public function jsonEncode( $value, $flags ) {
+ $this->checkTypeOptional( 'mw.text.jsonEncode', 2, $flags, 'number', 0 );
+ $flags = (int)$flags;
+ if ( !( $flags & self::JSON_PRESERVE_KEYS ) && is_array( $value ) ) {
+ $value = self::reindexArrays( $value, true );
+ }
+ $ret = FormatJson::encode( $value, (bool)( $flags & self::JSON_PRETTY ), FormatJson::ALL_OK );
+ if ( $ret === false ) {
+ throw new Scribunto_LuaError( 'mw.text.jsonEncode: Unable to encode value' );
+ }
+ return [ $ret ];
+ }
+
+ public function jsonDecode( $s, $flags ) {
+ $this->checkType( 'mw.text.jsonDecode', 1, $s, 'string' );
+ $this->checkTypeOptional( 'mw.text.jsonDecode', 2, $flags, 'number', 0 );
+ $flags = (int)$flags;
+ $opts = FormatJson::FORCE_ASSOC;
+ if ( $flags & self::JSON_TRY_FIXING ) {
+ $opts |= FormatJson::TRY_FIXING;
+ }
+ $status = FormatJson::parse( $s, $opts );
+ if ( !$status->isOk() ) {
+ throw new Scribunto_LuaError( 'mw.text.jsonDecode: ' . $status->getMessage()->text() );
+ }
+ $val = $status->getValue();
+ if ( !( $flags & self::JSON_PRESERVE_KEYS ) && is_array( $val ) ) {
+ $val = self::reindexArrays( $val, false );
+ }
+ return [ $val ];
+ }
+
+ /** Recursively reindex array with integer keys to 0-based or 1-based
+ * @param array $arr
+ * @param bool $isEncoding
+ * @return array
+ */
+ private static function reindexArrays( array $arr, $isEncoding ) {
+ if ( $isEncoding ) {
+ ksort( $arr, SORT_NUMERIC );
+ $next = 1;
+ } else {
+ $next = 0;
+ }
+ $isSequence = true;
+ foreach ( $arr as $k => &$v ) {
+ if ( is_array( $v ) ) {
+ $v = self::reindexArrays( $v, $isEncoding );
+ }
+
+ if ( $isSequence ) {
+ if ( is_int( $k ) ) {
+ $isSequence = $next++ === $k;
+ } elseif ( $isEncoding && ctype_digit( $k ) ) {
+ // json_decode currently doesn't return integer keys for {}
+ $isSequence = $next++ === (int)$k;
+ } else {
+ $isSequence = false;
+ }
+ }
+ }
+ if ( $isSequence ) {
+ if ( $isEncoding ) {
+ return array_values( $arr );
+ } else {
+ return $arr ? array_combine( range( 1, count( $arr ) ), $arr ) : $arr;
+ }
+ }
+ return $arr;
+ }
+
+}
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/TitleLibrary.php b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/TitleLibrary.php
new file mode 100644
index 00000000..bf015639
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/TitleLibrary.php
@@ -0,0 +1,381 @@
+<?php
+
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+class Scribunto_LuaTitleLibrary extends Scribunto_LuaLibraryBase {
+ // Note these caches are naturally limited to
+ // $wgExpensiveParserFunctionLimit + 1 actual Title objects because any
+ // addition besides the one for the current page calls
+ // incrementExpensiveFunctionCount()
+ private $titleCache = [];
+ private $idCache = [ 0 => null ];
+
+ function register() {
+ $lib = [
+ 'newTitle' => [ $this, 'newTitle' ],
+ 'makeTitle' => [ $this, 'makeTitle' ],
+ 'getExpensiveData' => [ $this, 'getExpensiveData' ],
+ 'getUrl' => [ $this, 'getUrl' ],
+ 'getContent' => [ $this, 'getContent' ],
+ 'getFileInfo' => [ $this, 'getFileInfo' ],
+ 'protectionLevels' => [ $this, 'protectionLevels' ],
+ 'cascadingProtection' => [ $this, 'cascadingProtection' ],
+ 'redirectTarget' => [ $this, 'redirectTarget' ],
+ ];
+ return $this->getEngine()->registerInterface( 'mw.title.lua', $lib, [
+ 'thisTitle' => $this->getInexpensiveTitleData( $this->getTitle() ),
+ 'NS_MEDIA' => NS_MEDIA,
+ ] );
+ }
+
+ private function checkNamespace( $name, $argIdx, &$arg, $default = null ) {
+ global $wgContLang;
+
+ if ( $arg === null && $default !== null ) {
+ $arg = $default;
+ } elseif ( is_numeric( $arg ) ) {
+ $arg = (int)$arg;
+ if ( !MWNamespace::exists( $arg ) ) {
+ throw new Scribunto_LuaError(
+ "bad argument #$argIdx to '$name' (unrecognized namespace number '$arg')"
+ );
+ }
+ } elseif ( is_string( $arg ) ) {
+ $ns = $wgContLang->getNsIndex( $arg );
+ if ( $ns === false ) {
+ throw new Scribunto_LuaError(
+ "bad argument #$argIdx to '$name' (unrecognized namespace name '$arg')"
+ );
+ }
+ $arg = $ns;
+ } else {
+ $this->checkType( $name, $argIdx, $arg, 'namespace number or name' );
+ }
+ }
+
+ /**
+ * Extract inexpensive information from a Title object for return to Lua
+ *
+ * @param Title $title Title to return
+ * @return array Lua data
+ */
+ private function getInexpensiveTitleData( Title $title ) {
+ $ns = $title->getNamespace();
+ $ret = [
+ 'isLocal' => (bool)$title->isLocal(),
+ 'interwiki' => $title->getInterwiki(),
+ 'namespace' => $ns,
+ 'nsText' => $title->getNsText(),
+ 'text' => $title->getText(),
+ 'fragment' => $title->getFragment(),
+ 'thePartialUrl' => $title->getPartialURL(),
+ ];
+ if ( $ns === NS_SPECIAL ) {
+ // Core doesn't currently record special page links, but it may in the future.
+ if ( $this->getParser() && !$title->equals( $this->getTitle() ) ) {
+ $this->getParser()->getOutput()->addLink( $title );
+ }
+ $ret['exists'] = (bool)SpecialPageFactory::exists( $title->getDBkey() );
+ }
+ if ( $ns !== NS_FILE && $ns !== NS_MEDIA ) {
+ $ret['file'] = false;
+ }
+ return $ret;
+ }
+
+ /**
+ * Extract expensive information from a Title object for return to Lua
+ *
+ * This records a link to this title in the current ParserOutput and caches the
+ * title for repeated lookups. It may call incrementExpensiveFunctionCount() if
+ * the title is not already cached.
+ *
+ * @param string $text Title text
+ * @return array Lua data
+ */
+ public function getExpensiveData( $text ) {
+ $this->checkType( 'getExpensiveData', 1, $text, 'string' );
+ $title = Title::newFromText( $text );
+ if ( !$title ) {
+ return [ null ];
+ }
+ $dbKey = $title->getPrefixedDBkey();
+ if ( isset( $this->titleCache[$dbKey] ) ) {
+ // It was already cached, so we already did the expensive work and added a link
+ $title = $this->titleCache[$dbKey];
+ } else {
+ if ( !$title->equals( $this->getTitle() ) ) {
+ $this->incrementExpensiveFunctionCount();
+
+ // Record a link
+ if ( $this->getParser() ) {
+ $this->getParser()->getOutput()->addLink( $title );
+ }
+ }
+
+ // Cache it
+ $this->titleCache[$dbKey] = $title;
+ if ( $title->getArticleID() > 0 ) {
+ $this->idCache[$title->getArticleID()] = $title;
+ }
+ }
+
+ $ret = [
+ 'isRedirect' => (bool)$title->isRedirect(),
+ 'id' => $title->getArticleID(),
+ 'contentModel' => $title->getContentModel(),
+ ];
+ if ( $title->getNamespace() === NS_SPECIAL ) {
+ $ret['exists'] = (bool)SpecialPageFactory::exists( $title->getDBkey() );
+ } else {
+ // bug 70495: don't just check whether the ID != 0
+ $ret['exists'] = $title->exists();
+ }
+ return [ $ret ];
+ }
+
+ /**
+ * Handler for title.new
+ *
+ * Calls Title::newFromID or Title::newFromTitle as appropriate for the
+ * arguments.
+ *
+ * @param string|int $text_or_id Title or page_id to fetch
+ * @param string|int $defaultNamespace Namespace name or number to use if
+ * $text_or_id doesn't override
+ * @return array Lua data
+ */
+ function newTitle( $text_or_id, $defaultNamespace = null ) {
+ $type = $this->getLuaType( $text_or_id );
+ if ( $type === 'number' ) {
+ if ( array_key_exists( $text_or_id, $this->idCache ) ) {
+ $title = $this->idCache[$text_or_id];
+ } else {
+ $this->incrementExpensiveFunctionCount();
+ $title = Title::newFromID( $text_or_id );
+ $this->idCache[$text_or_id] = $title;
+
+ // Record a link
+ if ( $this->getParser() && $title && !$title->equals( $this->getTitle() ) ) {
+ $this->getParser()->getOutput()->addLink( $title );
+ }
+ }
+ if ( $title ) {
+ $this->titleCache[$title->getPrefixedDBkey()] = $title;
+ } else {
+ return [ null ];
+ }
+ } elseif ( $type === 'string' ) {
+ $this->checkNamespace( 'title.new', 2, $defaultNamespace, NS_MAIN );
+
+ // Note this just fills in the given fields, it doesn't fetch from
+ // the page table.
+ $title = Title::newFromText( $text_or_id, $defaultNamespace );
+ if ( !$title ) {
+ return [ null ];
+ }
+ } else {
+ // This will always fail
+ $this->checkType( 'title.new', 1, $text_or_id, 'number or string' );
+ }
+
+ return [ $this->getInexpensiveTitleData( $title ) ];
+ }
+
+ /**
+ * Handler for title.makeTitle
+ *
+ * Calls Title::makeTitleSafe.
+ *
+ * @param string|int $ns Namespace
+ * @param string $text Title text
+ * @param string $fragment URI fragment
+ * @param string $interwiki Interwiki code
+ * @return array Lua data
+ */
+ function makeTitle( $ns, $text, $fragment = null, $interwiki = null ) {
+ $this->checkNamespace( 'makeTitle', 1, $ns );
+ $this->checkType( 'makeTitle', 2, $text, 'string' );
+ $this->checkTypeOptional( 'makeTitle', 3, $fragment, 'string', '' );
+ $this->checkTypeOptional( 'makeTitle', 4, $interwiki, 'string', '' );
+
+ // Note this just fills in the given fields, it doesn't fetch from the
+ // page table.
+ $title = Title::makeTitleSafe( $ns, $text, $fragment, $interwiki );
+ if ( !$title ) {
+ return [ null ];
+ }
+
+ return [ $this->getInexpensiveTitleData( $title ) ];
+ }
+
+ /**
+ * Get a URL referring to this title
+ * @param string $text Title text.
+ * @param string $which 'fullUrl', 'localUrl', or 'canonicalUrl'
+ * @param string|array|null $query Query string or query string data.
+ * @param string|null $proto 'http', 'https', 'relative', or 'canonical'
+ * @return array
+ */
+ function getUrl( $text, $which, $query = null, $proto = null ) {
+ static $protoMap = [
+ 'http' => PROTO_HTTP,
+ 'https' => PROTO_HTTPS,
+ 'relative' => PROTO_RELATIVE,
+ 'canonical' => PROTO_CANONICAL,
+ ];
+
+ $this->checkType( 'getUrl', 1, $text, 'string' );
+ $this->checkType( 'getUrl', 2, $which, 'string' );
+ if ( !in_array( $which, [ 'fullUrl', 'localUrl', 'canonicalUrl' ], true ) ) {
+ $this->checkType( 'getUrl', 2, $which, "'fullUrl', 'localUrl', or 'canonicalUrl'" );
+ }
+
+ // May call the following Title methods:
+ // getFullUrl, getLocalUrl, getCanonicalUrl
+ $func = "get" . ucfirst( $which );
+
+ $args = [ $query, false ];
+ if ( !is_string( $query ) && !is_array( $query ) ) {
+ $this->checkTypeOptional( $which, 1, $query, 'table or string', '' );
+ }
+ if ( $which === 'fullUrl' ) {
+ $this->checkTypeOptional( $which, 2, $proto, 'string', 'relative' );
+ if ( !isset( $protoMap[$proto] ) ) {
+ $this->checkType( $which, 2, $proto, "'http', 'https', 'relative', or 'canonical'" );
+ }
+ $args[] = $protoMap[$proto];
+ }
+
+ $title = Title::newFromText( $text );
+ if ( !$title ) {
+ return [ null ];
+ }
+ return [ call_user_func_array( [ $title, $func ], $args ) ];
+ }
+
+ /**
+ * Utility to get a Content object from a title
+ *
+ * The title is counted as a transclusion.
+ *
+ * @param $text string Title text
+ * @return Content|null The Content object of the title, null if missing
+ */
+ private function getContentInternal( $text ) {
+ $title = Title::newFromText( $text );
+ if ( !$title ) {
+ return null;
+ }
+
+ // Record in templatelinks, so edits cause the page to be refreshed
+ $this->getParser()->getOutput()->addTemplate(
+ $title, $title->getArticleID(), $title->getLatestRevID()
+ );
+ if ( $title->equals( $this->getTitle() ) ) {
+ $this->getParser()->getOutput()->setFlag( 'vary-revision' );
+ }
+
+ $rev = $this->getParser()->fetchCurrentRevisionOfTitle( $title );
+ return $rev ? $rev->getContent() : null;
+ }
+
+ function getContent( $text ) {
+ $this->checkType( 'getContent', 1, $text, 'string' );
+ $content = $this->getContentInternal( $text );
+ return [ $content ? $content->serialize() : null ];
+ }
+
+ function getFileInfo( $text ) {
+ $this->checkType( 'getFileInfo', 1, $text, 'string' );
+ $title = Title::newFromText( $text );
+ if ( !$title ) {
+ return [ false ];
+ }
+ $ns = $title->getNamespace();
+ if ( $ns !== NS_FILE && $ns !== NS_MEDIA ) {
+ return [ false ];
+ }
+
+ $this->incrementExpensiveFunctionCount();
+ $file = wfFindFile( $title );
+ if ( !$file ) {
+ return [ [ 'exists' => false ] ];
+ }
+ $this->getParser()->getOutput()->addImage(
+ $file->getName(), $file->getTimestamp(), $file->getSha1()
+ );
+ if ( !$file->exists() ) {
+ return [ [ 'exists' => false ] ];
+ }
+ $pageCount = $file->pageCount();
+ if ( $pageCount === false ) {
+ $pages = null;
+ } else {
+ $pages = [];
+ for ( $i = 1; $i <= $pageCount; ++$i ) {
+ $pages[$i] = [
+ 'width' => $file->getWidth( $i ),
+ 'height' => $file->getHeight( $i )
+ ];
+ }
+ }
+ return [ [
+ 'exists' => true,
+ 'width' => $file->getWidth(),
+ 'height' => $file->getHeight(),
+ 'mimeType' => $file->getMimeType(),
+ 'size' => $file->getSize(),
+ 'pages' => $pages
+ ] ];
+ }
+
+ private static function makeArrayOneBased( $arr ) {
+ if ( empty( $arr ) ) {
+ return $arr;
+ }
+ return array_combine( range( 1, count( $arr ) ), array_values( $arr ) );
+ }
+
+ public function protectionLevels( $text ) {
+ $this->checkType( 'protectionLevels', 1, $text, 'string' );
+ $title = Title::newFromText( $text );
+ if ( !$title ) {
+ return [ null ];
+ }
+
+ if ( !$title->areRestrictionsLoaded() ) {
+ $this->incrementExpensiveFunctionCount();
+ }
+ return [ array_map(
+ 'Scribunto_LuaTitleLibrary::makeArrayOneBased', $title->getAllRestrictions()
+ ) ];
+ }
+
+ public function cascadingProtection( $text ) {
+ $this->checkType( 'cascadingProtection', 1, $text, 'string' );
+ $title = Title::newFromText( $text );
+ if ( !$title ) {
+ return [ null ];
+ }
+
+ if ( !$title->areCascadeProtectionSourcesLoaded() ) {
+ $this->incrementExpensiveFunctionCount();
+ }
+ list( $sources, $restrictions ) = $title->getCascadeProtectionSources();
+ return [ [
+ 'sources' => self::makeArrayOneBased( array_map(
+ function ( $t ) {
+ return $t->getPrefixedText();
+ },
+ $sources ) ),
+ 'restrictions' => array_map( 'Scribunto_LuaTitleLibrary::makeArrayOneBased', $restrictions )
+ ] ];
+ }
+
+ public function redirectTarget( $text ) {
+ $this->checkType( 'redirectTarget', 1, $text, 'string' );
+ $content = $this->getContentInternal( $text );
+ $redirTitle = $content ? $content->getRedirectTarget() : null;
+ return [ $redirTitle ? $this->getInexpensiveTitleData( $redirTitle ) : null ];
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/UriLibrary.php b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/UriLibrary.php
new file mode 100644
index 00000000..3492e7b9
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/UriLibrary.php
@@ -0,0 +1,56 @@
+<?php
+
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+class Scribunto_LuaUriLibrary extends Scribunto_LuaLibraryBase {
+ function register() {
+ $lib = [
+ 'anchorEncode' => [ $this, 'anchorEncode' ],
+ 'localUrl' => [ $this, 'localUrl' ],
+ 'fullUrl' => [ $this, 'fullUrl' ],
+ 'canonicalUrl' => [ $this, 'canonicalUrl' ],
+ ];
+
+ return $this->getEngine()->registerInterface( 'mw.uri.lua', $lib, [
+ 'defaultUrl' => $this->getTitle()->getFullUrl(),
+ ] );
+ }
+
+ public function anchorEncode( $s ) {
+ return [ CoreParserFunctions::anchorencode(
+ $this->getParser(), $s
+ ) ];
+ }
+
+ private function getUrl( $func, $page, $query ) {
+ $title = Title::newFromText( $page );
+ if ( !$title ) {
+ $title = Title::newFromURL( urldecode( $page ) );
+ }
+ if ( $title ) {
+ # Convert NS_MEDIA -> NS_FILE
+ if ( $title->getNamespace() == NS_MEDIA ) {
+ $title = Title::makeTitle( NS_FILE, $title->getDBkey() );
+ }
+ if ( $query !== null ) {
+ $text = $title->$func( $query );
+ } else {
+ $text = $title->$func();
+ }
+ return [ $text ];
+ } else {
+ return [ null ];
+ }
+ }
+
+ public function localUrl( $page, $query ) {
+ return $this->getUrl( 'getLocalURL', $page, $query );
+ }
+
+ public function fullUrl( $page, $query ) {
+ return $this->getUrl( 'getFullURL', $page, $query );
+ }
+
+ public function canonicalUrl( $page, $query ) {
+ return $this->getUrl( 'getCanonicalURL', $page, $query );
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/UstringLibrary.php b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/UstringLibrary.php
new file mode 100644
index 00000000..d8905845
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/UstringLibrary.php
@@ -0,0 +1,781 @@
+<?php
+
+use UtfNormal\Validator;
+
+// @codingStandardsIgnoreLine Squiz.Classes.ValidClassName.NotCamelCaps
+class Scribunto_LuaUstringLibrary extends Scribunto_LuaLibraryBase {
+ /**
+ * Limit on pattern lengths, in bytes not characters
+ * @var integer
+ */
+ private $patternLengthLimit = 10000;
+
+ /**
+ * Limit on string lengths, in bytes not characters
+ * If null, $wgMaxArticleSize * 1024 will be used
+ * @var integer|null
+ */
+ private $stringLengthLimit = null;
+
+ /**
+ * PHP until 5.6.9 are buggy when the regex in preg_replace an
+ * preg_match_all matches the empty string.
+ * @var boolean
+ */
+ private $phpBug53823 = false;
+
+ /**
+ * A cache of patterns and the regexes they generate.
+ * @var MapCacheLRU
+ */
+ private $patternRegexCache = null;
+
+ function __construct( $engine ) {
+ if ( $this->stringLengthLimit === null ) {
+ global $wgMaxArticleSize;
+ $this->stringLengthLimit = $wgMaxArticleSize * 1024;
+ }
+
+ $this->phpBug53823 = preg_replace( '//us', 'x', "\xc3\xa1" ) === "x\xc3x\xa1x";
+ $this->patternRegexCache = new MapCacheLRU( 100 );
+
+ parent::__construct( $engine );
+ }
+
+ function register() {
+ $perf = $this->getEngine()->getPerformanceCharacteristics();
+
+ if ( $perf['phpCallsRequireSerialization'] ) {
+ $lib = [
+ // Pattern matching is still much faster in PHP, even with the
+ // overhead of serialization
+ 'find' => [ $this, 'ustringFind' ],
+ 'match' => [ $this, 'ustringMatch' ],
+ 'gmatch_init' => [ $this, 'ustringGmatchInit' ],
+ 'gmatch_callback' => [ $this, 'ustringGmatchCallback' ],
+ 'gsub' => [ $this, 'ustringGsub' ],
+ ];
+ } else {
+ $lib = [
+ 'isutf8' => [ $this, 'ustringIsUtf8' ],
+ 'byteoffset' => [ $this, 'ustringByteoffset' ],
+ 'codepoint' => [ $this, 'ustringCodepoint' ],
+ 'gcodepoint_init' => [ $this, 'ustringGcodepointInit' ],
+ 'toNFC' => [ $this, 'ustringToNFC' ],
+ 'toNFD' => [ $this, 'ustringToNFD' ],
+ 'toNFKC' => [ $this, 'ustringToNFKC' ],
+ 'toNFKD' => [ $this, 'ustringToNFKD' ],
+ 'char' => [ $this, 'ustringChar' ],
+ 'len' => [ $this, 'ustringLen' ],
+ 'sub' => [ $this, 'ustringSub' ],
+ 'upper' => [ $this, 'ustringUpper' ],
+ 'lower' => [ $this, 'ustringLower' ],
+ 'find' => [ $this, 'ustringFind' ],
+ 'match' => [ $this, 'ustringMatch' ],
+ 'gmatch_init' => [ $this, 'ustringGmatchInit' ],
+ 'gmatch_callback' => [ $this, 'ustringGmatchCallback' ],
+ 'gsub' => [ $this, 'ustringGsub' ],
+ ];
+ }
+ return $this->getEngine()->registerInterface( 'mw.ustring.lua', $lib, [
+ 'stringLengthLimit' => $this->stringLengthLimit,
+ 'patternLengthLimit' => $this->patternLengthLimit,
+ ] );
+ }
+
+ private function checkString( $name, $s, $checkEncoding = true ) {
+ if ( $this->getLuaType( $s ) == 'number' ) {
+ $s = (string)$s;
+ } else {
+ $this->checkType( $name, 1, $s, 'string' );
+ if ( $checkEncoding && !mb_check_encoding( $s, 'UTF-8' ) ) {
+ throw new Scribunto_LuaError( "bad argument #1 to '$name' (string is not UTF-8)" );
+ }
+ if ( strlen( $s ) > $this->stringLengthLimit ) {
+ throw new Scribunto_LuaError(
+ "bad argument #1 to '$name' (string is longer than $this->stringLengthLimit bytes)"
+ );
+ }
+ }
+ }
+
+ public function ustringIsUtf8( $s ) {
+ $this->checkString( 'isutf8', $s, false );
+ return [ mb_check_encoding( $s, 'UTF-8' ) ];
+ }
+
+ public function ustringByteoffset( $s, $l = 1, $i = 1 ) {
+ $this->checkString( 'byteoffset', $s );
+ $this->checkTypeOptional( 'byteoffset', 2, $l, 'number', 1 );
+ $this->checkTypeOptional( 'byteoffset', 3, $i, 'number', 1 );
+
+ $bytelen = strlen( $s );
+ if ( $i < 0 ) {
+ $i = $bytelen + $i + 1;
+ }
+ if ( $i < 1 || $i > $bytelen ) {
+ return [ null ];
+ }
+ $i--;
+ $j = $i;
+ while ( ( ord( $s[$i] ) & 0xc0 ) === 0x80 ) {
+ $i--;
+ }
+ if ( $l > 0 && $j === $i ) {
+ $l--;
+ }
+ $char = mb_strlen( substr( $s, 0, $i ), 'UTF-8' ) + $l;
+ if ( $char < 0 || $char >= mb_strlen( $s, 'UTF-8' ) ) {
+ return [ null ];
+ } else {
+ return [ strlen( mb_substr( $s, 0, $char, 'UTF-8' ) ) + 1 ];
+ }
+ }
+
+ public function ustringCodepoint( $s, $i = 1, $j = null ) {
+ $this->checkString( 'codepoint', $s );
+ $this->checkTypeOptional( 'codepoint', 2, $i, 'number', 1 );
+ $this->checkTypeOptional( 'codepoint', 3, $j, 'number', $i );
+
+ $l = mb_strlen( $s, 'UTF-8' );
+ if ( $i < 0 ) {
+ $i = $l + $i + 1;
+ }
+ if ( $j < 0 ) {
+ $j = $l + $j + 1;
+ }
+ if ( $j < $i ) {
+ return [];
+ }
+ $i = max( 1, min( $i, $l + 1 ) );
+ $j = max( 1, min( $j, $l + 1 ) );
+ $s = mb_substr( $s, $i - 1, $j - $i + 1, 'UTF-8' );
+ return unpack( 'N*', mb_convert_encoding( $s, 'UTF-32BE', 'UTF-8' ) );
+ }
+
+ public function ustringGcodepointInit( $s, $i = 1, $j = null ) {
+ return [ $this->ustringCodepoint( $s, $i, $j ) ];
+ }
+
+ public function ustringToNFC( $s ) {
+ $this->checkString( 'toNFC', $s, false );
+ if ( !mb_check_encoding( $s, 'UTF-8' ) ) {
+ return [ null ];
+ }
+ return [ Validator::toNFC( $s ) ];
+ }
+
+ public function ustringToNFD( $s ) {
+ $this->checkString( 'toNFD', $s, false );
+ if ( !mb_check_encoding( $s, 'UTF-8' ) ) {
+ return [ null ];
+ }
+ return [ Validator::toNFD( $s ) ];
+ }
+
+ public function ustringToNFKC( $s ) {
+ $this->checkString( 'toNFKC', $s, false );
+ if ( !mb_check_encoding( $s, 'UTF-8' ) ) {
+ return [ null ];
+ }
+ return [ Validator::toNFKC( $s ) ];
+ }
+
+ public function ustringToNFKD( $s ) {
+ $this->checkString( 'toNFKD', $s, false );
+ if ( !mb_check_encoding( $s, 'UTF-8' ) ) {
+ return [ null ];
+ }
+ return [ Validator::toNFKD( $s ) ];
+ }
+
+ /**
+ * @return array
+ */
+ public function ustringChar() {
+ $args = func_get_args();
+ if ( count( $args ) > $this->stringLengthLimit ) {
+ throw new Scribunto_LuaError( "too many arguments to 'char'" );
+ }
+ foreach ( $args as $k => &$v ) {
+ if ( !is_numeric( $v ) ) {
+ $this->checkType( 'char', $k + 1, $v, 'number' );
+ }
+ $v = (int)floor( $v );
+ if ( $v < 0 || $v > 0x10ffff ) {
+ $k++;
+ throw new Scribunto_LuaError( "bad argument #$k to 'char' (value out of range)" );
+ }
+ }
+ array_unshift( $args, 'N*' );
+ $s = call_user_func_array( 'pack', $args );
+ $s = mb_convert_encoding( $s, 'UTF-8', 'UTF-32BE' );
+ if ( strlen( $s ) > $this->stringLengthLimit ) {
+ throw new Scribunto_LuaError( "result to long for 'char'" );
+ }
+ return [ $s ];
+ }
+
+ public function ustringLen( $s ) {
+ $this->checkString( 'len', $s, false );
+ if ( !mb_check_encoding( $s, 'UTF-8' ) ) {
+ return [ null ];
+ }
+ return [ mb_strlen( $s, 'UTF-8' ) ];
+ }
+
+ public function ustringSub( $s, $i=1, $j=-1 ) {
+ $this->checkString( 'sub', $s );
+ $this->checkTypeOptional( 'sub', 2, $i, 'number', 1 );
+ $this->checkTypeOptional( 'sub', 3, $j, 'number', -1 );
+
+ $len = mb_strlen( $s, 'UTF-8' );
+ if ( $i < 0 ) {
+ $i = $len + $i + 1;
+ }
+ if ( $j < 0 ) {
+ $j = $len + $j + 1;
+ }
+ if ( $j < $i ) {
+ return [ '' ];
+ }
+ $i = max( 1, min( $i, $len + 1 ) );
+ $j = max( 1, min( $j, $len + 1 ) );
+ $s = mb_substr( $s, $i - 1, $j - $i + 1, 'UTF-8' );
+ return [ $s ];
+ }
+
+ public function ustringUpper( $s ) {
+ $this->checkString( 'upper', $s );
+ return [ mb_strtoupper( $s, 'UTF-8' ) ];
+ }
+
+ public function ustringLower( $s ) {
+ $this->checkString( 'lower', $s );
+ return [ mb_strtolower( $s, 'UTF-8' ) ];
+ }
+
+ private function checkPattern( $name, $pattern ) {
+ if ( $this->getLuaType( $pattern ) == 'number' ) {
+ $pattern = (string)$pattern;
+ }
+ $this->checkType( $name, 2, $pattern, 'string' );
+ if ( !mb_check_encoding( $pattern, 'UTF-8' ) ) {
+ throw new Scribunto_LuaError( "bad argument #2 to '$name' (string is not UTF-8)" );
+ }
+ if ( strlen( $pattern ) > $this->patternLengthLimit ) {
+ throw new Scribunto_LuaError(
+ "bad argument #2 to '$name' (pattern is longer than $this->patternLengthLimit bytes)"
+ );
+ }
+ }
+
+ /* Convert a Lua pattern into a PCRE regex */
+ private function patternToRegex( $pattern, $anchor, $name ) {
+ $cacheKey = serialize( [ $pattern, $anchor ] );
+ if ( !$this->patternRegexCache->has( $cacheKey ) ) {
+ $this->checkPattern( $name, $pattern );
+ $pat = preg_split( '//us', $pattern, null, PREG_SPLIT_NO_EMPTY );
+
+ static $charsets = null, $brcharsets = null;
+ if ( $charsets === null ) {
+ $charsets = [
+ // If you change these, also change lualib/ustring/make-tables.php
+ // (and run it to regenerate charsets.lua)
+ 'a' => '\p{L}',
+ 'c' => '\p{Cc}',
+ 'd' => '\p{Nd}',
+ 'l' => '\p{Ll}',
+ 'p' => '\p{P}',
+ 's' => '\p{Xps}',
+ 'u' => '\p{Lu}',
+ 'w' => '[\p{L}\p{Nd}]',
+ 'x' => '[0-9A-Fa-f0-9A-Fa-f]',
+ 'z' => '\0',
+
+ // These *must* be the inverse of the above
+ 'A' => '\P{L}',
+ 'C' => '\P{Cc}',
+ 'D' => '\P{Nd}',
+ 'L' => '\P{Ll}',
+ 'P' => '\P{P}',
+ 'S' => '\P{Xps}',
+ 'U' => '\P{Lu}',
+ 'W' => '[^\p{L}\p{Nd}]',
+ 'X' => '[^0-9A-Fa-f0-9A-Fa-f]',
+ 'Z' => '[^\0]',
+ ];
+ $brcharsets = [
+ 'w' => '\p{L}\p{Nd}',
+ 'x' => '0-9A-Fa-f0-9A-Fa-f',
+
+ // Negated sets that are not expressable as a simple \P{} are
+ // unfortunately complicated.
+
+ // Xan is L plus N, so ^Xan plus Nl plus No is anything that's not L or Nd
+ 'W' => '\P{Xan}\p{Nl}\p{No}',
+
+ // Manually constructed. Fun.
+ 'X' => '\x00-\x2f\x3a-\x40\x47-\x60\x67-\x{ff0f}'
+ . '\x{ff1a}-\x{ff20}\x{ff27}-\x{ff40}\x{ff47}-\x{10ffff}',
+
+ // Ha!
+ 'Z' => '\x01-\x{10ffff}',
+ ] + $charsets;
+ }
+
+ $re = '/';
+ $len = count( $pat );
+ $capt = [];
+ $anypos = false;
+ $captparen = [];
+ $opencapt = [];
+ $bct = 0;
+
+ for ( $i = 0; $i < $len; $i++ ) {
+ $ii = $i + 1;
+ $q = false;
+ switch ( $pat[$i] ) {
+ case '^':
+ $q = $i;
+ $re .= ( $anchor === false || $q ) ? '\\^' : $anchor;
+ break;
+
+ case '$':
+ $q = ( $i < $len - 1 );
+ $re .= $q ? '\\$' : '$';
+ break;
+
+ case '(':
+ if ( $i + 1 >= $len ) {
+ throw new Scribunto_LuaError( "Unmatched open-paren at pattern character $ii" );
+ }
+ $n = count( $capt ) + 1;
+ $capt[$n] = ( $pat[$i + 1] === ')' );
+ if ( $capt[$n] ) {
+ $anypos = true;
+ }
+ $re .= "(?<m$n>";
+ $opencapt[] = $n;
+ $captparen[$n] = $ii;
+ break;
+
+ case ')':
+ if ( count( $opencapt ) <= 0 ) {
+ throw new Scribunto_LuaError( "Unmatched close-paren at pattern character $ii" );
+ }
+ array_pop( $opencapt );
+ $re .= $pat[$i];
+ break;
+
+ case '%':
+ $i++;
+ if ( $i >= $len ) {
+ throw new Scribunto_LuaError( "malformed pattern (ends with '%')" );
+ }
+ if ( isset( $charsets[$pat[$i]] ) ) {
+ $re .= $charsets[$pat[$i]];
+ $q = true;
+ } elseif ( $pat[$i] === 'b' ) {
+ if ( $i + 2 >= $len ) {
+ throw new Scribunto_LuaError( "malformed pattern (missing arguments to \'%b\')" );
+ }
+ $d1 = preg_quote( $pat[++$i], '/' );
+ $d2 = preg_quote( $pat[++$i], '/' );
+ if ( $d1 === $d2 ) {
+ $re .= "{$d1}[^$d1]*$d1";
+ } else {
+ $bct++;
+ $re .= "(?<b$bct>$d1(?:(?>[^$d1$d2]+)|(?P>b$bct))*$d2)";
+ }
+ } elseif ( $pat[$i] === 'f' ) {
+ if ( $i + 1 >= $len || $pat[++$i] !== '[' ) {
+ throw new Scribunto_LuaError( "missing '[' after %f in pattern at pattern character $ii" );
+ }
+ list( $i, $re2 ) = $this->bracketedCharSetToRegex( $pat, $i, $len, $brcharsets );
+ // Because %f considers the beginning and end of the string
+ // to be \0, determine if $re2 matches that and take it
+ // into account with "^" and "$".
+ if ( preg_match( "/$re2/us", "\0" ) ) {
+ $re .= "(?<!^)(?<!$re2)(?=$re2|$)";
+ } else {
+ $re .= "(?<!$re2)(?=$re2)";
+ }
+ } elseif ( $pat[$i] >= '0' && $pat[$i] <= '9' ) {
+ $n = ord( $pat[$i] ) - 0x30;
+ if ( $n === 0 || $n > count( $capt ) || in_array( $n, $opencapt ) ) {
+ throw new Scribunto_LuaError( "invalid capture index %$n at pattern character $ii" );
+ }
+ $re .= "\\g{m$n}";
+ } else {
+ $re .= preg_quote( $pat[$i], '/' );
+ $q = true;
+ }
+ break;
+
+ case '[':
+ list( $i, $re2 ) = $this->bracketedCharSetToRegex( $pat, $i, $len, $brcharsets );
+ $re .= $re2;
+ $q = true;
+ break;
+
+ case ']':
+ throw new Scribunto_LuaError( "Unmatched close-bracket at pattern character $ii" );
+
+ case '.':
+ $re .= $pat[$i];
+ $q = true;
+ break;
+
+ default:
+ $re .= preg_quote( $pat[$i], '/' );
+ $q = true;
+ break;
+ }
+ if ( $q && $i + 1 < $len ) {
+ switch ( $pat[$i + 1] ) {
+ case '*':
+ case '+':
+ case '?':
+ $re .= $pat[++$i];
+ break;
+ case '-':
+ $re .= '*?';
+ $i++;
+ break;
+ }
+ }
+ }
+ if ( count( $opencapt ) ) {
+ $ii = $captparen[$opencapt[0]];
+ throw new Scribunto_LuaError( "Unclosed capture beginning at pattern character $ii" );
+ }
+ $re .= '/us';
+
+ $this->patternRegexCache->set( $cacheKey, [ $re, $capt, $anypos ] );
+ }
+ return $this->patternRegexCache->get( $cacheKey );
+ }
+
+ private function bracketedCharSetToRegex( $pat, $i, $len, $brcharsets ) {
+ $ii = $i + 1;
+ $re = '[';
+ $i++;
+ if ( $i < $len && $pat[$i] === '^' ) {
+ $re .= '^';
+ $i++;
+ }
+ for ( $j = $i; $i < $len && ( $j == $i || $pat[$i] !== ']' ); $i++ ) {
+ if ( $pat[$i] === '%' ) {
+ $i++;
+ if ( $i >= $len ) {
+ break;
+ }
+ if ( isset( $brcharsets[$pat[$i]] ) ) {
+ $re .= $brcharsets[$pat[$i]];
+ } else {
+ $re .= preg_quote( $pat[$i], '/' );
+ }
+ } elseif ( $i + 2 < $len &&
+ $pat[$i + 1] === '-' && $pat[$i + 2] !== ']' && $pat[$i + 2] !== '%'
+ ) {
+ if ( $pat[$i] <= $pat[$i + 2] ) {
+ $re .= preg_quote( $pat[$i], '/' ) . '-' . preg_quote( $pat[$i + 2], '/' );
+ }
+ $i += 2;
+ } else {
+ $re .= preg_quote( $pat[$i], '/' );
+ }
+ }
+ if ( $i >= $len ) {
+ throw new Scribunto_LuaError(
+ "Missing close-bracket for character set beginning at pattern character $ii"
+ );
+ }
+ $re .= ']';
+
+ // Lua just ignores invalid ranges, while pcre throws an error.
+ // We filter them out above, but then we need to special-case empty sets
+ if ( $re === '[]' ) {
+ // Can't directly quantify (*FAIL), so wrap it.
+ // "(?!)" would be simpler and could be quantified if not for a bug in PCRE 8.13 to 8.33
+ $re = '(?:(*FAIL))';
+ } elseif ( $re === '[^]' ) {
+ $re = '.'; // 's' modifier is always used, so this works
+ }
+
+ return [ $i, $re ];
+ }
+
+ private function addCapturesFromMatch( $arr, $s, $m, $capt, $m0_if_no_captures ) {
+ if ( count( $capt ) ) {
+ foreach ( $capt as $n => $pos ) {
+ if ( $pos ) {
+ $o = mb_strlen( substr( $s, 0, $m["m$n"][1] ), 'UTF-8' ) + 1;
+ $arr[] = $o;
+ } else {
+ $arr[] = $m["m$n"][0];
+ }
+ }
+ } elseif ( $m0_if_no_captures ) {
+ $arr[] = $m[0][0];
+ }
+ return $arr;
+ }
+
+ public function ustringFind( $s, $pattern, $init = 1, $plain = false ) {
+ $this->checkString( 'find', $s );
+ $this->checkTypeOptional( 'find', 3, $init, 'number', 1 );
+ $this->checkTypeOptional( 'find', 4, $plain, 'boolean', false );
+
+ $len = mb_strlen( $s, 'UTF-8' );
+ if ( $init < 0 ) {
+ $init = $len + $init + 1;
+ } elseif ( $init > $len + 1 ) {
+ $init = $len + 1;
+ }
+
+ if ( $init > 1 ) {
+ $offset = strlen( mb_substr( $s, 0, $init - 1, 'UTF-8' ) );
+ } else {
+ $init = 1;
+ $offset = 0;
+ }
+
+ if ( $plain ) {
+ $this->checkPattern( 'find', $pattern );
+ if ( $pattern !== '' ) {
+ $ret = mb_strpos( $s, $pattern, $init - 1, 'UTF-8' );
+ } else {
+ $ret = $init - 1;
+ }
+ if ( $ret === false ) {
+ return [ null ];
+ } else {
+ return [ $ret + 1, $ret + mb_strlen( $pattern ) ];
+ }
+ } else {
+ list( $re, $capt ) = $this->patternToRegex( $pattern, '\G', 'find' );
+ if ( !preg_match( $re, $s, $m, PREG_OFFSET_CAPTURE, $offset ) ) {
+ return [ null ];
+ }
+ $o = mb_strlen( substr( $s, 0, $m[0][1] ), 'UTF-8' );
+ $ret = [ $o + 1, $o + mb_strlen( $m[0][0], 'UTF-8' ) ];
+ return $this->addCapturesFromMatch( $ret, $s, $m, $capt, false );
+ }
+ }
+
+ public function ustringMatch( $s, $pattern, $init = 1 ) {
+ $this->checkString( 'match', $s );
+ $this->checkTypeOptional( 'match', 3, $init, 'number', 1 );
+
+ $len = mb_strlen( $s, 'UTF-8' );
+ if ( $init < 0 ) {
+ $init = $len + $init + 1;
+ } elseif ( $init > $len + 1 ) {
+ $init = $len + 1;
+ }
+ if ( $init > 1 ) {
+ $offset = strlen( mb_substr( $s, 0, $init - 1, 'UTF-8' ) );
+ } else {
+ $offset = 0;
+ }
+
+ list( $re, $capt ) = $this->patternToRegex( $pattern, '\G', 'match' );
+ if ( !preg_match( $re, $s, $m, PREG_OFFSET_CAPTURE, $offset ) ) {
+ return [ null ];
+ }
+ return $this->addCapturesFromMatch( [], $s, $m, $capt, true );
+ }
+
+ public function ustringGmatchInit( $s, $pattern ) {
+ $this->checkString( 'gmatch', $s );
+
+ list( $re, $capt ) = $this->patternToRegex( $pattern, false, 'gmatch' );
+ return [ $re, $capt ];
+ }
+
+ public function ustringGmatchCallback( $s, $re, $capt, $pos ) {
+ if ( !preg_match( $re, $s, $m, PREG_OFFSET_CAPTURE, $pos ) ) {
+ return [ $pos, [] ];
+ }
+ $pos = $m[0][1] + strlen( $m[0][0] );
+ return [ $pos, $this->addCapturesFromMatch( [ null ], $s, $m, $capt, true ) ];
+ }
+
+ public function ustringGsub( $s, $pattern, $repl, $n = null ) {
+ $this->checkString( 'gsub', $s );
+ $this->checkTypeOptional( 'gsub', 4, $n, 'number', null );
+
+ if ( $n === null ) {
+ $n = -1;
+ } elseif ( $n < 1 ) {
+ return [ $s, 0 ];
+ }
+
+ list( $re, $capt, $anypos ) = $this->patternToRegex( $pattern, '^', 'gsub' );
+ $captures = [];
+
+ if ( $this->phpBug53823 ) {
+ // PHP bug 53823 means that a zero-length match before a UTF-8
+ // character will match again before every byte of that character.
+ // The workaround is to capture the first "character" of/after the
+ // match and verify that its first byte is legal to start a UTF-8
+ // character.
+ $re = '/(?=(?<phpBug53823>.|$))' . substr( $re, 1 );
+ }
+
+ if ( $anypos ) {
+ // preg_replace_callback doesn't take a "flags" argument, so we
+ // can't pass PREG_OFFSET_CAPTURE to it, which is needed to handle
+ // position captures. So instead we have to do a preg_match_all and
+ // handle the captures ourself.
+ $ct = preg_match_all( $re, $s, $mm, PREG_OFFSET_CAPTURE | PREG_SET_ORDER );
+ for ( $i = 0; $i < $ct; $i++ ) {
+ $m = $mm[$i];
+ if ( $this->phpBug53823 ) {
+ $c = ord( $m['phpBug53823'][0] );
+ if ( $c >= 0x80 && $c <= 0xbf ) {
+ continue;
+ }
+ }
+ $c = [ $m[0][0] ];
+ foreach ( $this->addCapturesFromMatch( [], $s, $m, $capt, false ) as $k => $v ) {
+ $k++;
+ $c["m$k"] = $v;
+ }
+ $captures[] = $c;
+ if ( $n >= 0 && count( $captures ) >= $n ) {
+ break;
+ }
+ }
+ }
+
+ switch ( $this->getLuaType( $repl ) ) {
+ case 'string':
+ case 'number':
+ $cb = function ( $m ) use ( $repl, $anypos, &$captures ) {
+ if ( $anypos ) {
+ $m = array_shift( $captures );
+ }
+ return preg_replace_callback( '/%([%0-9])/', function ( $m2 ) use ( $m ) {
+ $x = $m2[1];
+ if ( $x === '%' ) {
+ return '%';
+ } elseif ( $x === '0' ) {
+ return $m[0];
+ } elseif ( isset( $m["m$x"] ) ) {
+ return $m["m$x"];
+ } else {
+ throw new Scribunto_LuaError( "invalid capture index %$x in replacement string" );
+ }
+ }, $repl );
+ };
+ break;
+
+ case 'table':
+ $cb = function ( $m ) use ( $repl, $anypos, &$captures ) {
+ if ( $anypos ) {
+ $m = array_shift( $captures );
+ }
+ $x = isset( $m['m1'] ) ? $m['m1'] : $m[0];
+ return isset( $repl[$x] ) ? $repl[$x] : $m[0];
+ };
+ break;
+
+ case 'function':
+ $interpreter = $this->getInterpreter();
+ $cb = function ( $m ) use ( $interpreter, $capt, $repl, $anypos, &$captures ) {
+ if ( $anypos ) {
+ $m = array_shift( $captures );
+ }
+ $args = [ $repl ];
+ if ( count( $capt ) ) {
+ foreach ( $capt as $i => $pos ) {
+ $args[] = $m["m$i"];
+ }
+ } else {
+ $args[] = $m[0];
+ }
+ $ret = call_user_func_array( [ $interpreter, 'callFunction' ], $args );
+ if ( count( $ret ) === 0 || $ret[0] === null ) {
+ return $m[0];
+ }
+ return $ret[0];
+ };
+ break;
+
+ default:
+ $this->checkType( 'gsub', 3, $repl, 'function or table or string' );
+ }
+
+ $skippedMatches = 0;
+ if ( $this->phpBug53823 ) {
+ // Since we're having bogus matches, we need to keep track of the
+ // necessary adjustment and stop manually once we hit the limit.
+ $maxMatches = $n < 0 ? INF : $n;
+ $n = -1;
+ $realCallback = $cb;
+ $cb = function ( $m ) use ( $realCallback, &$skippedMatches, &$maxMatches ) {
+ $c = ord( $m['phpBug53823'] );
+ if ( $c >= 0x80 && $c <= 0xbf || $maxMatches <= 0 ) {
+ $skippedMatches++;
+ return $m[0];
+ } else {
+ $maxMatches--;
+ return $realCallback( $m );
+ }
+ };
+ }
+
+ $count = 0;
+ $s2 = preg_replace_callback( $re, $cb, $s, $n, $count );
+ if ( $s2 === null ) {
+ self::handlePCREError( preg_last_error(), $pattern );
+ }
+ return [ $s2, $count - $skippedMatches ];
+ }
+
+ /**
+ * Handle a PCRE error
+ * @param int $error From preg_last_error()
+ * @param string $pattern Pattern being matched
+ * @throws Scribunto_LuaError
+ */
+ private function handlePCREError( $error, $pattern ) {
+ $PREG_JIT_STACKLIMIT_ERROR = defined( 'PREG_JIT_STACKLIMIT_ERROR' )
+ ? PREG_JIT_STACKLIMIT_ERROR
+ : 'PREG_JIT_STACKLIMIT_ERROR';
+
+ $error = preg_last_error();
+ switch ( $error ) {
+ case PREG_NO_ERROR:
+ // Huh?
+ break;
+ case PREG_INTERNAL_ERROR:
+ throw new Scribunto_LuaError( "PCRE internal error" );
+ case PREG_BACKTRACK_LIMIT_ERROR:
+ throw new Scribunto_LuaError(
+ "PCRE backtrack limit reached while matching pattern '$pattern'"
+ );
+ case PREG_RECURSION_LIMIT_ERROR:
+ throw new Scribunto_LuaError(
+ "PCRE recursion limit reached while matching pattern '$pattern'"
+ );
+ case PREG_BAD_UTF8_ERROR:
+ // Should have alreay been caught, but just in case
+ throw new Scribunto_LuaError( "PCRE bad UTF-8 error" );
+ case PREG_BAD_UTF8_OFFSET_ERROR:
+ // Shouldn't happen, but just in case
+ throw new Scribunto_LuaError( "PCRE bad UTF-8 offset error" );
+ case $PREG_JIT_STACKLIMIT_ERROR:
+ throw new Scribunto_LuaError(
+ "PCRE JIT stack limit reached while matching pattern '$pattern'"
+ );
+ default:
+ throw new Scribunto_LuaError(
+ "PCRE error code $error while matching pattern '$pattern'"
+ );
+ }
+ }
+}
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/bit32.lua b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/bit32.lua
new file mode 100644
index 00000000..3063bfde
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/bit32.lua
@@ -0,0 +1,209 @@
+---
+-- An implementation of the lua 5.2 bit32 library, in pure Lua
+
+-- Note that in Lua, "x % n" is defined such that will always return a number
+-- between 0 and n-1 for positive n. We take advantage of that a lot here.
+
+local bit32 = {}
+
+local function checkint( name, argidx, x, level )
+ local n = tonumber( x )
+ if not n then
+ error( string.format(
+ "bad argument #%d to '%s' (number expected, got %s)",
+ argidx, name, type( x )
+ ), level + 1 )
+ end
+ return math.floor( n )
+end
+
+local function checkint32( name, argidx, x, level )
+ local n = tonumber( x )
+ if not n then
+ error( string.format(
+ "bad argument #%d to '%s' (number expected, got %s)",
+ argidx, name, type( x )
+ ), level + 1 )
+ end
+ return math.floor( n ) % 0x100000000
+end
+
+
+function bit32.bnot( x )
+ x = checkint32( 'bnot', 1, x, 2 )
+
+ -- In two's complement, -x = not(x) + 1
+ -- So not(x) = -x - 1
+ return ( -x - 1 ) % 0x100000000
+end
+
+
+---
+-- Logic tables for and/or/xor. We do pairs of bits here as a tradeoff between
+-- table space and speed. If you change the number of bits, also change the
+-- constants 2 and 4 in comb() below, and the initial value in bit32.band and
+-- bit32.btest
+local logic_and = {
+ [0] = { [0] = 0, 0, 0, 0},
+ [1] = { [0] = 0, 1, 0, 1},
+ [2] = { [0] = 0, 0, 2, 2},
+ [3] = { [0] = 0, 1, 2, 3},
+}
+local logic_or = {
+ [0] = { [0] = 0, 1, 2, 3},
+ [1] = { [0] = 1, 1, 3, 3},
+ [2] = { [0] = 2, 3, 2, 3},
+ [3] = { [0] = 3, 3, 3, 3},
+}
+local logic_xor = {
+ [0] = { [0] = 0, 1, 2, 3},
+ [1] = { [0] = 1, 0, 3, 2},
+ [2] = { [0] = 2, 3, 0, 1},
+ [3] = { [0] = 3, 2, 1, 0},
+}
+
+---
+-- @param name string Function name
+-- @param args table Function args
+-- @param nargs number Arg count
+-- @param s number Start value, 0-3
+-- @param t table Logic table
+-- @return number result
+local function comb( name, args, nargs, s, t )
+ for i = 1, nargs do
+ args[i] = checkint32( name, i, args[i], 3 )
+ end
+
+ local pow = 1
+ local ret = 0
+ for b = 0, 31, 2 do
+ local c = s
+ for i = 1, nargs do
+ c = t[c][args[i] % 4]
+ args[i] = math.floor( args[i] / 4 )
+ end
+ ret = ret + c * pow
+ pow = pow * 4
+ end
+ return ret
+end
+
+function bit32.band( ... )
+ return comb( 'band', { ... }, select( '#', ... ), 3, logic_and )
+end
+
+function bit32.bor( ... )
+ return comb( 'bor', { ... }, select( '#', ... ), 0, logic_or )
+end
+
+function bit32.bxor( ... )
+ return comb( 'bxor', { ... }, select( '#', ... ), 0, logic_xor )
+end
+
+function bit32.btest( ... )
+ return comb( 'btest', { ... }, select( '#', ... ), 3, logic_and ) ~= 0
+end
+
+
+function bit32.extract( n, field, width )
+ n = checkint32( 'extract', 1, n, 2 )
+ field = checkint( 'extract', 2, field, 2 )
+ width = checkint( 'extract', 3, width or 1, 2 )
+ if field < 0 then
+ error( "bad argument #2 to 'extract' (field cannot be negative)", 2 )
+ end
+ if width <= 0 then
+ error( "bad argument #3 to 'extract' (width must be positive)", 2 )
+ end
+ if field + width > 32 then
+ error( 'trying to access non-existent bits', 2 )
+ end
+
+ return math.floor( n / 2^field ) % 2^width
+end
+
+function bit32.replace( n, v, field, width )
+ n = checkint32( 'replace', 1, n, 2 )
+ v = checkint32( 'replace', 2, v, 2 )
+ field = checkint( 'replace', 3, field, 2 )
+ width = checkint( 'replace', 4, width or 1, 2 )
+ if field < 0 then
+ error( "bad argument #3 to 'replace' (field cannot be negative)", 2 )
+ end
+ if width <= 0 then
+ error( "bad argument #4 to 'replace' (width must be positive)", 2 )
+ end
+ if field + width > 32 then
+ error( 'trying to access non-existent bits', 2 )
+ end
+
+ local f = 2^field
+ local w = 2^width
+ local fw = f * w
+ return ( n % f ) + ( v % w ) * f + math.floor( n / fw ) * fw
+end
+
+
+-- For the shifting functions, anything over 32 is the same as 32
+-- and limiting to 32 prevents overflow/underflow
+local function checkdisp( name, x )
+ x = checkint( name, 2, x, 3 )
+ return math.min( math.max( -32, x ), 32 )
+end
+
+function bit32.lshift( x, disp )
+ x = checkint32( 'lshift', 1, x, 2 )
+ disp = checkdisp( 'lshift', disp )
+
+ return math.floor( x * 2^disp ) % 0x100000000
+end
+
+function bit32.rshift( x, disp )
+ x = checkint32( 'rshift', 1, x, 2 )
+ disp = checkdisp( 'rshift', disp )
+
+ return math.floor( x / 2^disp ) % 0x100000000
+end
+
+function bit32.arshift( x, disp )
+ x = checkint32( 'arshift', 1, x, 2 )
+ disp = checkdisp( 'arshift', disp )
+
+ if disp <= 0 then
+ -- Non-positive displacement == left shift
+ -- (since exponent is non-negative, the multipication can never result
+ -- in a fractional part)
+ return ( x * 2^-disp ) % 0x100000000
+ elseif x < 0x80000000 then
+ -- High bit is 0 == right shift
+ -- (since exponent is positive, the division will never increase x)
+ return math.floor( x / 2^disp )
+ elseif disp > 31 then
+ -- Shifting off all bits
+ return 0xffffffff
+ else
+ -- 0x100000000 - 2 ^ ( 32 - disp ) creates a number with the high disp
+ -- bits set. So shift right then add that number.
+ return math.floor( x / 2^disp ) + ( 0x100000000 - 2 ^ ( 32 - disp ) )
+ end
+end
+
+-- For the rotation functions, disp works mod 32.
+-- Note that lrotate( x, disp ) == rrotate( x, -disp ).
+function bit32.lrotate( x, disp )
+ x = checkint32( 'lrotate', 1, x, 2 )
+ disp = checkint( 'lrotate', 2, disp, 2 ) % 32
+
+ local x = x * 2^disp
+ return ( x % 0x100000000 ) + math.floor( x / 0x100000000 )
+end
+
+function bit32.rrotate( x, disp )
+ x = checkint32( 'rrotate', 1, x, 2 )
+ disp = -checkint( 'rrotate', 2, disp, 2 ) % 32
+
+ local x = x * 2^disp
+ return ( x % 0x100000000 ) + math.floor( x / 0x100000000 )
+end
+
+return bit32
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/libraryUtil.lua b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/libraryUtil.lua
new file mode 100644
index 00000000..f14a7950
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/libraryUtil.lua
@@ -0,0 +1,71 @@
+local libraryUtil = {}
+
+function libraryUtil.checkType( name, argIdx, arg, expectType, nilOk )
+ if arg == nil and nilOk then
+ return
+ end
+ if type( arg ) ~= expectType then
+ local msg = string.format( "bad argument #%d to '%s' (%s expected, got %s)",
+ argIdx, name, expectType, type( arg )
+ )
+ error( msg, 3 )
+ end
+end
+
+function libraryUtil.checkTypeMulti( name, argIdx, arg, expectTypes )
+ local argType = type( arg )
+ for _, expectType in ipairs( expectTypes ) do
+ if argType == expectType then
+ return
+ end
+ end
+ local n = #expectTypes
+ local typeList
+ if n > 1 then
+ typeList = table.concat( expectTypes, ', ', 1, n - 1 ) .. ' or ' .. expectTypes[n]
+ else
+ typeList = expectTypes[1]
+ end
+ local msg = string.format( "bad argument #%d to '%s' (%s expected, got %s)",
+ argIdx,
+ name,
+ typeList,
+ type( arg )
+ )
+ error( msg, 3 )
+end
+
+function libraryUtil.checkTypeForIndex( index, value, expectType )
+ if type( value ) ~= expectType then
+ local msg = string.format( "value for index '%s' must be %s, %s given",
+ index, expectType, type( value )
+ )
+ error( msg, 3 )
+ end
+end
+
+function libraryUtil.checkTypeForNamedArg( name, argName, arg, expectType, nilOk )
+ if arg == nil and nilOk then
+ return
+ end
+ if type( arg ) ~= expectType then
+ local msg = string.format( "bad named argument %s to '%s' (%s expected, got %s)",
+ argName, name, expectType, type( arg )
+ )
+ error( msg, 3 )
+ end
+end
+
+function libraryUtil.makeCheckSelfFunction( libraryName, varName, selfObj, selfObjDesc )
+ return function ( self, method )
+ if self ~= selfObj then
+ error( string.format(
+ "%s: invalid %s. Did you call %s with a dot instead of a colon, i.e. " ..
+ "%s.%s() instead of %s:%s()?",
+ libraryName, selfObjDesc, method, varName, method, varName, method
+ ), 3 )
+ end
+ end
+end
+
+return libraryUtil
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/luabit/bit.lua b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/luabit/bit.lua
new file mode 100644
index 00000000..6bb3f487
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/luabit/bit.lua
@@ -0,0 +1,264 @@
+--[[---------------
+LuaBit v0.4
+-------------------
+a bitwise operation lib for lua.
+
+http://luaforge.net/projects/bit/
+
+How to use:
+-------------------
+ bit.bnot(n) -- bitwise not (~n)
+ bit.band(m, n) -- bitwise and (m & n)
+ bit.bor(m, n) -- bitwise or (m | n)
+ bit.bxor(m, n) -- bitwise xor (m ^ n)
+ bit.brshift(n, bits) -- right shift (n >> bits)
+ bit.blshift(n, bits) -- left shift (n << bits)
+ bit.blogic_rshift(n, bits) -- logic right shift(zero fill >>>)
+
+Please note that bit.brshift and bit.blshift only support number within
+32 bits.
+
+2 utility functions are provided too:
+ bit.tobits(n) -- convert n into a bit table(which is a 1/0 sequence)
+ -- high bits first
+ bit.tonumb(bit_tbl) -- convert a bit table into a number
+-------------------
+
+Under the MIT license.
+
+copyright(c) 2006~2007 hanzhao (abrash_han@hotmail.com)
+
+2013-02-20: Brad Jorsch: Fix to not try messing with globals, doesn't work in Scribunto
+--]]---------------
+
+do
+
+------------------------
+-- bit lib implementions
+
+local function check_int(n)
+ -- checking not float
+ if(n - math.floor(n) > 0) then
+ error("trying to use bitwise operation on non-integer!")
+ end
+end
+
+local function to_bits(n)
+ check_int(n)
+ if(n < 0) then
+ -- negative
+ return to_bits(bit.bnot(math.abs(n)) + 1)
+ end
+ -- to bits table
+ local tbl = {}
+ local cnt = 1
+ while (n > 0) do
+ local last = math.mod(n,2)
+ if(last == 1) then
+ tbl[cnt] = 1
+ else
+ tbl[cnt] = 0
+ end
+ n = (n-last)/2
+ cnt = cnt + 1
+ end
+
+ return tbl
+end
+
+local function tbl_to_number(tbl)
+ local n = table.getn(tbl)
+
+ local rslt = 0
+ local power = 1
+ for i = 1, n do
+ rslt = rslt + tbl[i]*power
+ power = power*2
+ end
+
+ return rslt
+end
+
+local function expand(tbl_m, tbl_n)
+ local big = {}
+ local small = {}
+ if(table.getn(tbl_m) > table.getn(tbl_n)) then
+ big = tbl_m
+ small = tbl_n
+ else
+ big = tbl_n
+ small = tbl_m
+ end
+ -- expand small
+ for i = table.getn(small) + 1, table.getn(big) do
+ small[i] = 0
+ end
+
+end
+
+local function bit_or(m, n)
+ local tbl_m = to_bits(m)
+ local tbl_n = to_bits(n)
+ expand(tbl_m, tbl_n)
+
+ local tbl = {}
+ local rslt = math.max(table.getn(tbl_m), table.getn(tbl_n))
+ for i = 1, rslt do
+ if(tbl_m[i]== 0 and tbl_n[i] == 0) then
+ tbl[i] = 0
+ else
+ tbl[i] = 1
+ end
+ end
+
+ return tbl_to_number(tbl)
+end
+
+local function bit_and(m, n)
+ local tbl_m = to_bits(m)
+ local tbl_n = to_bits(n)
+ expand(tbl_m, tbl_n)
+
+ local tbl = {}
+ local rslt = math.max(table.getn(tbl_m), table.getn(tbl_n))
+ for i = 1, rslt do
+ if(tbl_m[i]== 0 or tbl_n[i] == 0) then
+ tbl[i] = 0
+ else
+ tbl[i] = 1
+ end
+ end
+
+ return tbl_to_number(tbl)
+end
+
+local function bit_not(n)
+
+ local tbl = to_bits(n)
+ local size = math.max(table.getn(tbl), 32)
+ for i = 1, size do
+ if(tbl[i] == 1) then
+ tbl[i] = 0
+ else
+ tbl[i] = 1
+ end
+ end
+ return tbl_to_number(tbl)
+end
+
+local function bit_xor(m, n)
+ local tbl_m = to_bits(m)
+ local tbl_n = to_bits(n)
+ expand(tbl_m, tbl_n)
+
+ local tbl = {}
+ local rslt = math.max(table.getn(tbl_m), table.getn(tbl_n))
+ for i = 1, rslt do
+ if(tbl_m[i] ~= tbl_n[i]) then
+ tbl[i] = 1
+ else
+ tbl[i] = 0
+ end
+ end
+
+ --table.foreach(tbl, print)
+
+ return tbl_to_number(tbl)
+end
+
+local function bit_rshift(n, bits)
+ check_int(n)
+
+ local high_bit = 0
+ if(n < 0) then
+ -- negative
+ n = bit_not(math.abs(n)) + 1
+ high_bit = 2147483648 -- 0x80000000
+ end
+
+ for i=1, bits do
+ n = n/2
+ n = bit_or(math.floor(n), high_bit)
+ end
+ return math.floor(n)
+end
+
+-- logic rightshift assures zero filling shift
+local function bit_logic_rshift(n, bits)
+ check_int(n)
+ if(n < 0) then
+ -- negative
+ n = bit_not(math.abs(n)) + 1
+ end
+ for i=1, bits do
+ n = n/2
+ end
+ return math.floor(n)
+end
+
+local function bit_lshift(n, bits)
+ check_int(n)
+
+ if(n < 0) then
+ -- negative
+ n = bit_not(math.abs(n)) + 1
+ end
+
+ for i=1, bits do
+ n = n*2
+ end
+ return bit_and(n, 4294967295) -- 0xFFFFFFFF
+end
+
+local function bit_xor2(m, n)
+ local rhs = bit_or(bit_not(m), bit_not(n))
+ local lhs = bit_or(m, n)
+ local rslt = bit_and(lhs, rhs)
+ return rslt
+end
+
+--------------------
+-- bit lib interface
+
+local bit = {
+ -- bit operations
+ bnot = bit_not,
+ band = bit_and,
+ bor = bit_or,
+ bxor = bit_xor,
+ brshift = bit_rshift,
+ blshift = bit_lshift,
+ bxor2 = bit_xor2,
+ blogic_rshift = bit_logic_rshift,
+
+ -- utility func
+ tobits = to_bits,
+ tonumb = tbl_to_number,
+}
+
+return bit
+
+end
+
+--[[
+for i = 1, 100 do
+ for j = 1, 100 do
+ if(bit.bxor(i, j) ~= bit.bxor2(i, j)) then
+ error("bit.xor failed.")
+ end
+ end
+end
+--]]
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/luabit/hex.lua b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/luabit/hex.lua
new file mode 100644
index 00000000..ee6a69e3
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/luabit/hex.lua
@@ -0,0 +1,99 @@
+--[[---------------
+Hex v0.4
+-------------------
+Hex conversion lib for lua.
+
+How to use:
+ hex.to_hex(n) -- convert a number to a hex string
+ hex.to_dec(hex) -- convert a hex string(prefix with '0x' or '0X') to number
+
+Part of LuaBit(http://luaforge.net/projects/bit/).
+
+Under the MIT license.
+
+copyright(c) 2006~2007 hanzhao (abrash_han@hotmail.com)
+
+2013-02-20: Brad Jorsch: Fix to not try messing with globals, doesn't work in Scribunto
+--]]---------------
+
+local bit = require 'bit'
+
+do
+
+local function to_hex(n)
+ if(type(n) ~= "number") then
+ error("non-number type passed in.")
+ end
+
+ -- checking not float
+ if(n - math.floor(n) > 0) then
+ error("trying to apply bitwise operation on non-integer!")
+ end
+
+ if(n < 0) then
+ -- negative
+ n = bit.tobits(bit.bnot(math.abs(n)) + 1)
+ n = bit.tonumb(n)
+ end
+
+ hex_tbl = {'A', 'B', 'C', 'D', 'E', 'F'}
+ hex_str = ""
+
+ while(n ~= 0) do
+ last = math.mod(n, 16)
+ if(last < 10) then
+ hex_str = tostring(last) .. hex_str
+ else
+ hex_str = hex_tbl[last-10+1] .. hex_str
+ end
+ n = math.floor(n/16)
+ end
+ if(hex_str == "") then
+ hex_str = "0"
+ end
+ return "0x" .. hex_str
+end
+
+local function to_dec(hex)
+ if(type(hex) ~= "string") then
+ error("non-string type passed in.")
+ end
+
+ head = string.sub(hex, 1, 2)
+
+ if( head ~= "0x" and head ~= "0X") then
+ error("wrong hex format, should lead by 0x or 0X.")
+ end
+
+ v = tonumber(string.sub(hex, 3), 16)
+
+ return v;
+end
+
+--------------------
+-- hex lib interface
+local hex = {
+ to_dec = to_dec,
+ to_hex = to_hex,
+}
+
+return hex
+
+end
+
+--[[
+-- test
+d = 4341688
+h = to_hex(d)
+print(h)
+print(to_dec(h))
+
+
+for i = 1, 100000 do
+ h = hex.to_hex(i)
+ d = hex.to_dec(h)
+ if(d ~= i) then
+ error("failed " .. i .. ", " .. h)
+ end
+end
+--]]
diff --git a/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/luabit/readme.txt b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/luabit/readme.txt
new file mode 100644
index 00000000..db831723
--- /dev/null
+++ b/www/wiki/extensions/Scribunto/includes/engines/LuaCommon/lualib/luabit/readme.txt
@@ -0,0 +1,143 @@
+LuaBit
+------
+LuaBit is a bitwise operation lib completely written in Lua. It's
+written in the belief that Lua is self-contained.
+
+The supported operations are: not, and, or, xor, right shift, logic
+right shift and left shift.
+
+Several utilities are designed to leverage the power of bit operation:
+ 1. hex: a dec <-> hex number converter
+ 2. utf8: convert utf8 string to ucs2
+ 3. noki: convert nokia pc suite backuped SMS file to .txt
+
+Under the MIT license.
+
+Visit http://luaforge.net/projects/bit/ to get latest version.
+
+Status
+------
+Now LuaBit is in v0.4.
+Release date: Mar 18, 2007
+
+Content
+-------
+3 files are there for LuaBit:
+ 1) bit.lua
+ is the bitwise operation lib, all operations are implemented here.
+
+ 2) hex.lua
+ is a helper lib for ease of using hex numbers with bitwise
+ operation.
+
+ 3) noki.lua
+ a utility(based on bit and hex) to convert Nokia PC Suite backuped
+ SMS to a unicode .txt file, which is more accessible than the
+ original .nfb or .nfc file.
+
+ 4) utf8.lua
+ convert utf8 string to ucs2 string
+
+How to use
+----------
+Bit
+---
+Just require 'bit' in your project and the bit lib will be
+available:
+ bit.bnot(n) -- bitwise not (~n)
+ bit.band(m, n) -- bitwise and (m & n)
+ bit.bor(m, n) -- bitwise or (m | n)
+ bit.bxor(m, n) -- bitwise xor (m ^ n)
+ bit.brshift(n, bits) -- right shift (n >> bits)
+ bit.blshift(n, bits) -- left shift (n << bits)
+ bit.blogic_rshift(n, bits) -- logic right shift(zero fill >>>)
+
+Please note that bit.brshift and bit.blshift only support number within
+32 bits.
+
+2 utility functions are provided too:
+ bit.tobits(n) -- convert n into a bit table(which is a 1/0 sequence)
+ -- high bits first
+ bit.tonumb(bit_tbl) -- convert a bit table into a number
+
+Hex
+---
+For ease of using hex numbers, a utility hex lib is also included in
+LuaBit. You can require 'hex' to use them:
+ hex.to_hex(n) -- convert a number to a hex string
+ hex.to_dec(hex) -- convert a hex string(prefix with '0x' or '0X') to number
+
+With hex, you can write code like:
+ bit.band(258, hex.to_dec('0xFF'))
+to get the lower 8 bits of 258, that's 2.
+
+Noki
+----
+require 'noki', to save your sms to .txt file:
+ noki.save_sms('nokia.nfb', 'sms.txt')
+and you can view the output sms.txt in notepad or other editor which
+support unicode.
+
+Utf8
+----
+require 'utf8', to convert a utf8 string:
+ ucs2_string = utf8.utf_to_uni(utf8_string)
+
+History
+-------
+v0.4
+* utf8 to ucs2 converter(utf8.lua).
+* clean up for compatible with Lua5.1 and 5.0.
+* add 'How to use' section for