summaryrefslogtreecommitdiff
path: root/www/wiki/extensions
diff options
context:
space:
mode:
authorYaco <franco@reevo.org>2019-01-06 01:26:56 -0300
committerYaco <franco@reevo.org>2019-01-06 01:26:56 -0300
commit7f758b8eb3e0dc81aa27aba21dded2b2f1cca0c3 (patch)
treef53fea31875e09a68043b5c6c272dd6b0d1ff2f1 /www/wiki/extensions
parentf8b67f7d649de1785393f026a3f3eed463b5238b (diff)
agrega extensiones faltantes
Diffstat (limited to 'www/wiki/extensions')
-rw-r--r--www/wiki/extensions/DataTransfer/COPYING348
-rw-r--r--www/wiki/extensions/DataTransfer/DataTransfer.i18n.alias.php411
-rw-r--r--www/wiki/extensions/DataTransfer/DataTransfer.php70
-rw-r--r--www/wiki/extensions/DataTransfer/Gruntfile.js21
-rw-r--r--www/wiki/extensions/DataTransfer/INSTALL34
-rw-r--r--www/wiki/extensions/DataTransfer/README31
-rw-r--r--www/wiki/extensions/DataTransfer/composer.json97
-rw-r--r--www/wiki/extensions/DataTransfer/extension.json72
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/af.json38
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ais.json8
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/aln.json31
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/am.json12
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/an.json13
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ar.json43
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/arc.json18
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/arn.json8
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/arz.json27
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ast.json39
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/atj.json8
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/az.json17
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/azb.json8
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ba.json42
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/bcc.json8
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/be-tarask.json42
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/be.json9
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/bg.json27
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/bn.json35
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/br.json42
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/bs.json37
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ca.json43
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ce.json25
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ckb.json14
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/cs.json34
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/cu.json8
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/cv.json10
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/da.json26
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/de.json44
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/diq.json33
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/dsb.json37
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ee.json4
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/el.json34
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/en.json41
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/eo.json33
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/es.json48
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/et.json22
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/eu.json40
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/fa.json39
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/fi.json42
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/fr.json47
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/frp.json34
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/fy.json14
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ga.json15
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/gl.json42
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/got.json9
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/grc.json18
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/gsw.json37
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/gv.json13
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ha.json5
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/haw.json9
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/he.json42
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/hi.json29
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/hr.json10
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/hsb.json37
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/hu.json38
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ia.json39
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/id.json40
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ig.json15
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/inh.json10
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/io.json10
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/is.json16
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/it.json41
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ja.json47
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/jv.json17
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ka.json30
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/km.json38
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/kn.json16
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ko.json44
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/krj.json9
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ksh.json39
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ku-latn.json14
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/kw.json11
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/lb.json40
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/li.json9
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/lki.json8
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/lt.json34
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ltg.json10
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/lv.json18
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/mhr.json9
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/min.json8
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/mk.json39
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ml.json31
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/mn.json11
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/mr.json25
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ms.json37
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/mt.json37
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/mwl.json8
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/my.json16
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/myv.json15
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/mzn.json8
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/nah.json16
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/nb.json42
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/nds.json17
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/nl.json42
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/nn.json34
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/oc.json34
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/or.json17
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/os.json10
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/pdc.json16
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/pl.json41
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/pms.json37
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ps.json20
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/pt-br.json46
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/pt.json44
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/qqq.json49
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ro.json31
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/roa-tara.json39
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/rtm.json8
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ru.json43
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/rue.json20
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/scn.json9
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/sd.json8
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/si.json32
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/sk.json31
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/sl.json39
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/sr-ec.json37
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/sr-el.json27
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/stq.json18
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/su.json8
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/sv.json46
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/szl.json9
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ta.json37
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/te.json27
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/tet.json14
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/tg-cyrl.json14
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/tg-latn.json14
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/th.json10
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/tk.json9
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/tl.json36
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/tly.json8
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/tr.json37
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/tt-cyrl.json22
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/tzm.json10
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ug-latn.json8
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/uk.json43
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/ur.json18
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/vi.json34
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/vo.json21
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/yi.json9
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/zh-hans.json45
-rw-r--r--www/wiki/extensions/DataTransfer/i18n/zh-hant.json43
-rw-r--r--www/wiki/extensions/DataTransfer/includes/DT_Hooks.php26
-rw-r--r--www/wiki/extensions/DataTransfer/includes/DT_ImportJob.php69
-rw-r--r--www/wiki/extensions/DataTransfer/includes/DT_Page.php56
-rw-r--r--www/wiki/extensions/DataTransfer/includes/DT_PageComponent.php131
-rw-r--r--www/wiki/extensions/DataTransfer/includes/DT_PageStructure.php243
-rw-r--r--www/wiki/extensions/DataTransfer/includes/DT_Utils.php86
-rw-r--r--www/wiki/extensions/DataTransfer/includes/DT_WikiPage.php40
-rw-r--r--www/wiki/extensions/DataTransfer/includes/DT_WikiTemplate.php37
-rw-r--r--www/wiki/extensions/DataTransfer/includes/DT_XMLParser.php215
-rw-r--r--www/wiki/extensions/DataTransfer/package.json11
-rw-r--r--www/wiki/extensions/DataTransfer/specials/DT_ImportCSV.php217
-rw-r--r--www/wiki/extensions/DataTransfer/specials/DT_ImportSpreadsheet.php53
-rw-r--r--www/wiki/extensions/DataTransfer/specials/DT_ImportXML.php73
-rw-r--r--www/wiki/extensions/DataTransfer/specials/DT_ViewXML.php269
-rw-r--r--www/wiki/extensions/DataTransfer/styles/DataTransfer.css4
-rw-r--r--www/wiki/extensions/ExternalData/COPYING339
-rw-r--r--www/wiki/extensions/ExternalData/ExternalData.hooks.php27
-rw-r--r--www/wiki/extensions/ExternalData/ExternalData.i18n.alias.php14
-rw-r--r--www/wiki/extensions/ExternalData/ExternalData.i18n.magic.php233
-rw-r--r--www/wiki/extensions/ExternalData/ExternalData.php64
-rw-r--r--www/wiki/extensions/ExternalData/Gruntfile.js21
-rw-r--r--www/wiki/extensions/ExternalData/README107
-rw-r--r--www/wiki/extensions/ExternalData/composer.json16
-rw-r--r--www/wiki/extensions/ExternalData/extension.json55
-rw-r--r--www/wiki/extensions/ExternalData/i18n/af.json12
-rw-r--r--www/wiki/extensions/ExternalData/i18n/aln.json17
-rw-r--r--www/wiki/extensions/ExternalData/i18n/ar.json25
-rw-r--r--www/wiki/extensions/ExternalData/i18n/arz.json10
-rw-r--r--www/wiki/extensions/ExternalData/i18n/ast.json21
-rw-r--r--www/wiki/extensions/ExternalData/i18n/ba.json23
-rw-r--r--www/wiki/extensions/ExternalData/i18n/be-tarask.json24
-rw-r--r--www/wiki/extensions/ExternalData/i18n/br.json22
-rw-r--r--www/wiki/extensions/ExternalData/i18n/bs.json17
-rw-r--r--www/wiki/extensions/ExternalData/i18n/ca.json13
-rw-r--r--www/wiki/extensions/ExternalData/i18n/cs.json25
-rw-r--r--www/wiki/extensions/ExternalData/i18n/cy.json21
-rw-r--r--www/wiki/extensions/ExternalData/i18n/da.json10
-rw-r--r--www/wiki/extensions/ExternalData/i18n/de.json27
-rw-r--r--www/wiki/extensions/ExternalData/i18n/dsb.json18
-rw-r--r--www/wiki/extensions/ExternalData/i18n/el.json25
-rw-r--r--www/wiki/extensions/ExternalData/i18n/en.json21
-rw-r--r--www/wiki/extensions/ExternalData/i18n/eo.json8
-rw-r--r--www/wiki/extensions/ExternalData/i18n/es.json28
-rw-r--r--www/wiki/extensions/ExternalData/i18n/et.json10
-rw-r--r--www/wiki/extensions/ExternalData/i18n/eu.json8
-rw-r--r--www/wiki/extensions/ExternalData/i18n/fa.json22
-rw-r--r--www/wiki/extensions/ExternalData/i18n/fi.json23
-rw-r--r--www/wiki/extensions/ExternalData/i18n/fr.json26
-rw-r--r--www/wiki/extensions/ExternalData/i18n/frp.json16
-rw-r--r--www/wiki/extensions/ExternalData/i18n/gl.json21
-rw-r--r--www/wiki/extensions/ExternalData/i18n/gsw.json19
-rw-r--r--www/wiki/extensions/ExternalData/i18n/gu.json11
-rw-r--r--www/wiki/extensions/ExternalData/i18n/he.json24
-rw-r--r--www/wiki/extensions/ExternalData/i18n/hsb.json21
-rw-r--r--www/wiki/extensions/ExternalData/i18n/hu.json19
-rw-r--r--www/wiki/extensions/ExternalData/i18n/hy.json8
-rw-r--r--www/wiki/extensions/ExternalData/i18n/ia.json21
-rw-r--r--www/wiki/extensions/ExternalData/i18n/id.json21
-rw-r--r--www/wiki/extensions/ExternalData/i18n/ilo.json21
-rw-r--r--www/wiki/extensions/ExternalData/i18n/it.json22
-rw-r--r--www/wiki/extensions/ExternalData/i18n/ja.json24
-rw-r--r--www/wiki/extensions/ExternalData/i18n/ka.json8
-rw-r--r--www/wiki/extensions/ExternalData/i18n/km.json8
-rw-r--r--www/wiki/extensions/ExternalData/i18n/kn.json15
-rw-r--r--www/wiki/extensions/ExternalData/i18n/ko.json24
-rw-r--r--www/wiki/extensions/ExternalData/i18n/ksh.json21
-rw-r--r--www/wiki/extensions/ExternalData/i18n/lb.json21
-rw-r--r--www/wiki/extensions/ExternalData/i18n/lt.json19
-rw-r--r--www/wiki/extensions/ExternalData/i18n/lv.json8
-rw-r--r--www/wiki/extensions/ExternalData/i18n/mk.json21
-rw-r--r--www/wiki/extensions/ExternalData/i18n/ms.json19
-rw-r--r--www/wiki/extensions/ExternalData/i18n/myv.json8
-rw-r--r--www/wiki/extensions/ExternalData/i18n/nb.json25
-rw-r--r--www/wiki/extensions/ExternalData/i18n/nl.json23
-rw-r--r--www/wiki/extensions/ExternalData/i18n/nn.json19
-rw-r--r--www/wiki/extensions/ExternalData/i18n/oc.json17
-rw-r--r--www/wiki/extensions/ExternalData/i18n/or.json10
-rw-r--r--www/wiki/extensions/ExternalData/i18n/pl.json24
-rw-r--r--www/wiki/extensions/ExternalData/i18n/pms.json20
-rw-r--r--www/wiki/extensions/ExternalData/i18n/pt-br.json23
-rw-r--r--www/wiki/extensions/ExternalData/i18n/pt.json24
-rw-r--r--www/wiki/extensions/ExternalData/i18n/qqq.json24
-rw-r--r--www/wiki/extensions/ExternalData/i18n/ro.json17
-rw-r--r--www/wiki/extensions/ExternalData/i18n/roa-tara.json21
-rw-r--r--www/wiki/extensions/ExternalData/i18n/ru.json24
-rw-r--r--www/wiki/extensions/ExternalData/i18n/sah.json8
-rw-r--r--www/wiki/extensions/ExternalData/i18n/sco.json21
-rw-r--r--www/wiki/extensions/ExternalData/i18n/si.json14
-rw-r--r--www/wiki/extensions/ExternalData/i18n/sk.json17
-rw-r--r--www/wiki/extensions/ExternalData/i18n/sr-ec.json19
-rw-r--r--www/wiki/extensions/ExternalData/i18n/sr-el.json18
-rw-r--r--www/wiki/extensions/ExternalData/i18n/sv.json27
-rw-r--r--www/wiki/extensions/ExternalData/i18n/ta.json12
-rw-r--r--www/wiki/extensions/ExternalData/i18n/te.json10
-rw-r--r--www/wiki/extensions/ExternalData/i18n/tl.json19
-rw-r--r--www/wiki/extensions/ExternalData/i18n/tr.json13
-rw-r--r--www/wiki/extensions/ExternalData/i18n/uk.json24
-rw-r--r--www/wiki/extensions/ExternalData/i18n/vep.json8
-rw-r--r--www/wiki/extensions/ExternalData/i18n/vi.json11
-rw-r--r--www/wiki/extensions/ExternalData/i18n/yi.json8
-rw-r--r--www/wiki/extensions/ExternalData/i18n/zh-hans.json23
-rw-r--r--www/wiki/extensions/ExternalData/i18n/zh-hant.json22
-rw-r--r--www/wiki/extensions/ExternalData/includes/ED_GetData.php75
-rw-r--r--www/wiki/extensions/ExternalData/includes/ED_ParserFunctions.php663
-rw-r--r--www/wiki/extensions/ExternalData/includes/ED_Utils.php1071
-rw-r--r--www/wiki/extensions/ExternalData/package.json11
-rw-r--r--www/wiki/extensions/ExternalData/sql/ExternalData.sql9
257 files changed, 10356 insertions, 0 deletions
diff --git a/www/wiki/extensions/DataTransfer/COPYING b/www/wiki/extensions/DataTransfer/COPYING
new file mode 100644
index 00000000..a8659280
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/COPYING
@@ -0,0 +1,348 @@
+The license text below "----" applies to all files within this distribution, other
+than those that are in a directory which contains files named "LICENSE" or
+"COPYING", or a subdirectory thereof. For those files, the license text contained in
+said file overrides any license information contained in directories of smaller depth.
+Alternative licenses are typically used for software that is provided by external
+parties, and merely packaged with the Data Transfer release for convenience.
+----
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library General
+Public License instead of this License.
diff --git a/www/wiki/extensions/DataTransfer/DataTransfer.i18n.alias.php b/www/wiki/extensions/DataTransfer/DataTransfer.i18n.alias.php
new file mode 100644
index 00000000..56edd9ef
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/DataTransfer.i18n.alias.php
@@ -0,0 +1,411 @@
+<?php
+/**
+ * Aliases for special pages
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+$specialPageAliases = array();
+
+/** English (English) */
+$specialPageAliases['en'] = array(
+ 'ImportCSV' => array( 'ImportCSV' ),
+ 'ImportXML' => array( 'ImportXML' ),
+ 'ImportSpreadsheet' => array( 'ImportSpreadsheet' ),
+ 'ViewXML' => array( 'ViewXML' ),
+);
+
+/** Afrikaans (Afrikaans) */
+$specialPageAliases['af'] = array(
+ 'ViewXML' => array( 'WysXML' ),
+);
+
+/** Arabic (العربية) */
+$specialPageAliases['ar'] = array(
+ 'ImportCSV' => array( 'استيراد_سي_إس_في' ),
+ 'ImportXML' => array( 'استيراد_إكس_إم_إل' ),
+ 'ViewXML' => array( 'عرض_إكس_إم_إل' ),
+);
+
+/** Egyptian Arabic (مصرى) */
+$specialPageAliases['arz'] = array(
+ 'ImportCSV' => array( 'استيراد_سى_اس_فى' ),
+ 'ImportXML' => array( 'استيراد_اكس_ام_ال' ),
+ 'ViewXML' => array( 'عرض_اكس_ام_ال' ),
+);
+
+/** Assamese (অসমীয়া) */
+$specialPageAliases['as'] = array(
+ 'ImportCSV' => array( 'CSV_আমদানি' ),
+ 'ImportXML' => array( 'XML_আমদানি' ),
+ 'ViewXML' => array( 'XML_পৰিদৰ্শন' ),
+);
+
+/** Western Balochi (بلوچی رخشانی) */
+$specialPageAliases['bgn'] = array(
+ 'ImportCSV' => array( 'سی_اس_وی_ئی_درون_ریچی' ),
+ 'ImportXML' => array( 'اکس_ام_ال_ئی_درون_ریچی' ),
+ 'ViewXML' => array( 'اکس_ام_ال_ئی_دیستین' ),
+);
+
+/** Banjar (Bahasa Banjar) */
+$specialPageAliases['bjn'] = array(
+ 'ViewXML' => array( 'Itihi_XML' ),
+);
+
+/** Breton (brezhoneg) */
+$specialPageAliases['br'] = array(
+ 'ImportCSV' => array( 'EnporzhiañCSV' ),
+ 'ImportXML' => array( 'EnporzhiañXML' ),
+ 'ViewXML' => array( 'GweletXML' ),
+);
+
+/** Bosnian (bosanski) */
+$specialPageAliases['bs'] = array(
+ 'ViewXML' => array( 'VidiXML' ),
+);
+
+/** Min Dong Chinese (Mìng-dĕ̤ng-ngṳ̄) */
+$specialPageAliases['cdo'] = array(
+ 'ImportCSV' => array( '導底CSV' ),
+ 'ImportXML' => array( '導底XML' ),
+ 'ViewXML' => array( '看蜀看XML' ),
+);
+
+/** German (Deutsch) */
+$specialPageAliases['de'] = array(
+ 'ImportCSV' => array( 'CSV_importieren' ),
+ 'ImportXML' => array( 'XML_importieren' ),
+ 'ViewXML' => array( 'XML_anzeigen' ),
+);
+
+/** Zazaki (Zazaki) */
+$specialPageAliases['diq'] = array(
+ 'ImportCSV' => array( 'CSVCıKe' ),
+ 'ImportXML' => array( 'XMLCıKe' ),
+ 'ViewXML' => array( 'XMLBivêne' ),
+);
+
+/** Greek (Ελληνικά) */
+$specialPageAliases['el'] = array(
+ 'ImportCSV' => array( 'ΕισαγωγήCSV' ),
+ 'ImportXML' => array( 'ΕισαγωγήXML' ),
+ 'ViewXML' => array( 'ΠροβολήXML' ),
+);
+
+/** Esperanto (Esperanto) */
+$specialPageAliases['eo'] = array(
+ 'ImportCSV' => array( 'Enporti_CSV', 'Importi_CSV' ),
+ 'ImportXML' => array( 'Enporti_XML', 'Importi_XML' ),
+ 'ViewXML' => array( 'Montri_XML' ),
+);
+
+/** Spanish (español) */
+$specialPageAliases['es'] = array(
+ 'ViewXML' => array( 'Ver_XML', 'VerXML' ),
+);
+
+/** Basque (euskara) */
+$specialPageAliases['eu'] = array(
+ 'ViewXML' => array( 'XMLIkusi' ),
+);
+
+/** Persian (فارسی) */
+$specialPageAliases['fa'] = array(
+ 'ImportCSV' => array( 'درون‌ریزی_سی‌اس‌وی' ),
+ 'ImportXML' => array( 'درون‌ریزی_اکس‌ام‌ال' ),
+ 'ViewXML' => array( 'مشاهدهٔ_اکس‌ام‌ال' ),
+);
+
+/** Finnish (suomi) */
+$specialPageAliases['fi'] = array(
+ 'ImportCSV' => array( 'Tuo_CSV' ),
+ 'ImportXML' => array( 'Tuo_XML' ),
+ 'ViewXML' => array( 'Näytä_XML' ),
+);
+
+/** French (français) */
+$specialPageAliases['fr'] = array(
+ 'ImportCSV' => array( 'Importer_CVS', 'ImporterCVS' ),
+ 'ImportXML' => array( 'Importer_XML', 'ImporterXML' ),
+ 'ViewXML' => array( 'Voir_le_XML', 'Voir_XML', 'VoirXML' ),
+);
+
+/** Arpitan (arpetan) */
+$specialPageAliases['frp'] = array(
+ 'ViewXML' => array( 'Vêre_lo_XML', 'VêreLoXML' ),
+);
+
+/** Galician (galego) */
+$specialPageAliases['gl'] = array(
+ 'ImportCSV' => array( 'Importar_o_CSV' ),
+ 'ImportXML' => array( 'Importar_o_XML' ),
+ 'ViewXML' => array( 'Ver_o_XML' ),
+);
+
+/** Swiss German (Alemannisch) */
+$specialPageAliases['gsw'] = array(
+ 'ViewXML' => array( 'Lueg_XML' ),
+);
+
+/** Gujarati (ગુજરાતી) */
+$specialPageAliases['gu'] = array(
+ 'ViewXML' => array( 'XMLજુઓ' ),
+);
+
+/** Hawaiian (Hawai`i) */
+$specialPageAliases['haw'] = array(
+ 'ImportCSV' => array( 'KākomoCSV', 'KakomoCSV' ),
+ 'ImportXML' => array( 'KākomoXML', 'KakomoXML' ),
+ 'ViewXML' => array( 'NānāXML', 'NanaXML' ),
+);
+
+/** Upper Sorbian (hornjoserbsce) */
+$specialPageAliases['hsb'] = array(
+ 'ImportCSV' => array( 'CSV_importować' ),
+ 'ImportXML' => array( 'XML_importować' ),
+ 'ViewXML' => array( 'XML_pokazać' ),
+);
+
+/** Haitian (Kreyòl ayisyen) */
+$specialPageAliases['ht'] = array(
+ 'ImportCSV' => array( 'EnpòteCSV' ),
+ 'ImportXML' => array( 'EnpòteXML' ),
+ 'ViewXML' => array( 'WèXML' ),
+);
+
+/** Hungarian (magyar) */
+$specialPageAliases['hu'] = array(
+ 'ViewXML' => array( 'XML_megtekintése' ),
+);
+
+/** Interlingua (interlingua) */
+$specialPageAliases['ia'] = array(
+ 'ImportCSV' => array( 'Importar_CSV' ),
+ 'ImportXML' => array( 'Importar_XML' ),
+ 'ViewXML' => array( 'Visualisar_XML' ),
+);
+
+/** Indonesian (Bahasa Indonesia) */
+$specialPageAliases['id'] = array(
+ 'ImportCSV' => array( 'Impor_CSV', 'ImporCSV' ),
+ 'ImportXML' => array( 'Impor_XML', 'ImporXML' ),
+ 'ViewXML' => array( 'Lihat_XML', 'LihatXML' ),
+);
+
+/** Italian (italiano) */
+$specialPageAliases['it'] = array(
+ 'ImportCSV' => array( 'ImportaCSV' ),
+ 'ImportXML' => array( 'ImportaXML' ),
+ 'ViewXML' => array( 'VediXML' ),
+);
+
+/** Japanese (日本語) */
+$specialPageAliases['ja'] = array(
+ 'ImportCSV' => array( 'CSV取り込み', 'CSVインポート' ),
+ 'ImportXML' => array( 'XML取り込み', 'XMLインポート' ),
+ 'ViewXML' => array( 'XML表示', 'XML表示' ),
+);
+
+/** Khmer (ភាសាខ្មែរ) */
+$specialPageAliases['km'] = array(
+ 'ViewXML' => array( 'មើលXML' ),
+);
+
+/** Korean (한국어) */
+$specialPageAliases['ko'] = array(
+ 'ImportCSV' => array( 'CSV가져오기' ),
+ 'ImportXML' => array( 'XML가져오기' ),
+ 'ViewXML' => array( 'XML보기' ),
+);
+
+/** Colognian (Ripoarisch) */
+$specialPageAliases['ksh'] = array(
+ 'ImportCSV' => array( 'CSV_Empotteere' ),
+ 'ImportXML' => array( 'XML_Empoteere' ),
+ 'ViewXML' => array( 'XML_beloore' ),
+);
+
+/** Cornish (kernowek) */
+$specialPageAliases['kw'] = array(
+ 'ImportCSV' => array( 'YmperthiCSV' ),
+ 'ImportXML' => array( 'YmperthiXML' ),
+ 'ViewXML' => array( 'GwelesXML' ),
+);
+
+/** Ladino (Ladino) */
+$specialPageAliases['lad'] = array(
+ 'ImportCSV' => array( 'Aktarear_CSV_Ariento' ),
+ 'ImportXML' => array( 'Aktarear_XML_Ariento' ),
+ 'ViewXML' => array( 'Ver_XML' ),
+);
+
+/** Luxembourgish (Lëtzebuergesch) */
+$specialPageAliases['lb'] = array(
+ 'ImportCSV' => array( 'CSV_importéieren' ),
+ 'ImportXML' => array( 'XML_importéieren' ),
+ 'ViewXML' => array( 'XML_weisen' ),
+);
+
+/** Northern Luri (لۊری شومالی) */
+$specialPageAliases['lrc'] = array(
+ 'ImportCSV' => array( 'ڤامین_اآڤوردئن_سی_ئس_ڤی' ),
+ 'ImportXML' => array( 'ڤامین_آڤوردئن_ئیکس_ئم_ئل' ),
+ 'ViewXML' => array( 'دیئن_ئیکس_ئم_ئل' ),
+);
+
+/** Malagasy (Malagasy) */
+$specialPageAliases['mg'] = array(
+ 'ImportCSV' => array( 'HanafatraCSV' ),
+ 'ImportXML' => array( 'HanafatraXML' ),
+ 'ViewXML' => array( 'HijeryXML' ),
+);
+
+/** Macedonian (македонски) */
+$specialPageAliases['mk'] = array(
+ 'ImportCSV' => array( 'УвезиCSV' ),
+ 'ImportXML' => array( 'УвезиXML' ),
+ 'ViewXML' => array( 'ВидиXML' ),
+);
+
+/** Malayalam (മലയാളം) */
+$specialPageAliases['ml'] = array(
+ 'ImportCSV' => array( 'സി.എസ്.വി.ഇറക്കുമതി' ),
+ 'ImportXML' => array( 'എക്സ്.എം.എൽ.ഇറക്കുമതി' ),
+ 'ViewXML' => array( 'എക്സ്.എം.എൽ.കാണുക' ),
+);
+
+/** Marathi (मराठी) */
+$specialPageAliases['mr'] = array(
+ 'ViewXML' => array( 'XMLपहा' ),
+);
+
+/** Maltese (Malti) */
+$specialPageAliases['mt'] = array(
+ 'ViewXML' => array( 'UriXML' ),
+);
+
+/** Norwegian Bokmål (norsk bokmål) */
+$specialPageAliases['nb'] = array(
+ 'ImportCSV' => array( 'Importer_CSV' ),
+ 'ImportXML' => array( 'Importer_XML' ),
+ 'ViewXML' => array( 'Vis_XML' ),
+);
+
+/** Low Saxon (Netherlands) (Nedersaksies) */
+$specialPageAliases['nds-nl'] = array(
+ 'ImportCSV' => array( 'CSV_invoeren' ),
+ 'ImportXML' => array( 'XML_invoeren' ),
+ 'ViewXML' => array( 'XML_bekieken' ),
+);
+
+/** Dutch (Nederlands) */
+$specialPageAliases['nl'] = array(
+ 'ImportCSV' => array( 'CSVImporteren' ),
+ 'ImportXML' => array( 'XMLImporteren' ),
+ 'ViewXML' => array( 'XMLBekijken' ),
+);
+
+/** Occitan (occitan) */
+$specialPageAliases['oc'] = array(
+ 'ViewXML' => array( 'Veire_XML', 'VeireXML' ),
+);
+
+/** Polish (polski) */
+$specialPageAliases['pl'] = array(
+ 'ViewXML' => array( 'XML' ),
+);
+
+/** Portuguese (português) */
+$specialPageAliases['pt'] = array(
+ 'ImportCSV' => array( 'Importar_CSV' ),
+ 'ImportXML' => array( 'Importar_XML' ),
+ 'ViewXML' => array( 'Ver_XML' ),
+);
+
+/** Romanian (română) */
+$specialPageAliases['ro'] = array(
+ 'ImportCSV' => array( 'Import_CSV' ),
+ 'ImportXML' => array( 'Import_XML' ),
+ 'ViewXML' => array( 'Vizualizare_XML' ),
+);
+
+/** Sanskrit (संस्कृतम्) */
+$specialPageAliases['sa'] = array(
+ 'ViewXML' => array( 'XMLपश्यति' ),
+);
+
+/** Sicilian (sicilianu) */
+$specialPageAliases['scn'] = array(
+ 'ImportCSV' => array( 'ImportaCSV' ),
+ 'ImportXML' => array( 'ImportaXML' ),
+ 'ViewXML' => array( 'VediXML' ),
+);
+
+/** Slovak (slovenčina) */
+$specialPageAliases['sk'] = array(
+ 'ViewXML' => array( 'ZobraziťXML' ),
+);
+
+/** Albanian (shqip) */
+$specialPageAliases['sq'] = array(
+ 'ViewXML' => array( 'ShihXML' ),
+);
+
+/** Swedish (svenska) */
+$specialPageAliases['sv'] = array(
+ 'ImportCSV' => array( 'Importera_CSV' ),
+ 'ImportXML' => array( 'Importera_XML' ),
+ 'ViewXML' => array( 'Visa_XML' ),
+);
+
+/** Swahili (Kiswahili) */
+$specialPageAliases['sw'] = array(
+ 'ViewXML' => array( 'OnyeshaXML' ),
+);
+
+/** Tagalog (Tagalog) */
+$specialPageAliases['tl'] = array(
+ 'ViewXML' => array( 'Tingnan_ang_XML' ),
+);
+
+/** Turkish (Türkçe) */
+$specialPageAliases['tr'] = array(
+ 'ImportCSV' => array( 'CSVAktar', 'CSVİçeAktar' ),
+ 'ImportXML' => array( 'XMLAktar', 'XMLİçeAktar' ),
+ 'ViewXML' => array( 'XMLGör' ),
+);
+
+/** Tatar (Cyrillic script) (татарча) */
+$specialPageAliases['tt-cyrl'] = array(
+ 'ImportCSV' => array( 'CSV_импорт' ),
+ 'ImportXML' => array( 'XML_импорт' ),
+ 'ViewXML' => array( 'XML_иттереп_ачу' ),
+);
+
+/** Venetian (vèneto) */
+$specialPageAliases['vec'] = array(
+ 'ViewXML' => array( 'VardaXML' ),
+);
+
+/** Vietnamese (Tiếng Việt) */
+$specialPageAliases['vi'] = array(
+ 'ImportCSV' => array( 'Nhập_CSV' ),
+ 'ImportXML' => array( 'Nhập_XML' ),
+ 'ViewXML' => array( 'Xem_XML' ),
+);
+
+/** Simplified Chinese (中文(简体)‎) */
+$specialPageAliases['zh-hans'] = array(
+ 'ImportCSV' => array( '导入CSV' ),
+ 'ImportXML' => array( '导入XML' ),
+ 'ViewXML' => array( '查看XML' ),
+);
+
+/** Traditional Chinese (中文(繁體)‎) */
+$specialPageAliases['zh-hant'] = array(
+ 'ImportCSV' => array( '匯入CSV' ),
+ 'ImportXML' => array( '匯入XML' ),
+ 'ViewXML' => array( '檢視XML' ),
+); \ No newline at end of file
diff --git a/www/wiki/extensions/DataTransfer/DataTransfer.php b/www/wiki/extensions/DataTransfer/DataTransfer.php
new file mode 100644
index 00000000..71bafced
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/DataTransfer.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Global functions and constants for the Data Transfer extension.
+ *
+ * @author Yaron Koren
+ * @ingroup DataTransfer
+ */
+
+if ( !defined( 'MEDIAWIKI' ) ) die();
+
+define( 'DATA_TRANSFER_VERSION', '1.0' );
+
+$wgExtensionCredits['specialpage'][] = array(
+ 'path' => __FILE__,
+ 'name' => 'Data Transfer',
+ 'version' => DATA_TRANSFER_VERSION,
+ 'author' => 'Yaron Koren',
+ 'url' => 'https://www.mediawiki.org/wiki/Extension:Data_Transfer',
+ 'descriptionmsg' => 'datatransfer-desc',
+ 'license-name' => 'GPL-2.0-or-later'
+);
+
+###
+# This is the path to your installation of DataTransfer as
+# seen on your local filesystem. Used against some PHP file path
+# issues.
+##
+$dtgIP = dirname( __FILE__ );
+##
+
+$wgResourceModules[ 'ext.datatransfer' ] = array(
+ 'localBasePath' => $dtgIP,
+ 'styles' => 'styles/DataTransfer.css',
+ 'position' => 'bottom',
+);
+
+// Register all special pages and other classes.
+$wgAutoloadClasses['DTPageStructure'] = $dtgIP . '/includes/DT_PageStructure.php';
+$wgAutoloadClasses['DTPageComponent'] = $dtgIP . '/includes/DT_PageComponent.php';
+$wgAutoloadClasses['DTPage'] = $dtgIP . '/includes/DT_Page.php';
+$wgAutoloadClasses['DTUtils'] = $dtgIP . '/includes/DT_Utils.php';
+$wgSpecialPages['ViewXML'] = 'DTViewXML';
+$wgAutoloadClasses['DTViewXML'] = $dtgIP . '/specials/DT_ViewXML.php';
+$wgSpecialPages['ImportXML'] = 'DTImportXML';
+$wgAutoloadClasses['DTImportXML'] = $dtgIP . '/specials/DT_ImportXML.php';
+$wgSpecialPages['ImportCSV'] = 'DTImportCSV';
+$wgAutoloadClasses['DTImportCSV'] = $dtgIP . '/specials/DT_ImportCSV.php';
+$wgSpecialPages['ImportSpreadsheet'] = 'DTImportSpreadsheet';
+$wgAutoloadClasses['DTImportSpreadsheet'] = $dtgIP . '/specials/DT_ImportSpreadsheet.php';
+$wgJobClasses['dtImport'] = 'DTImportJob';
+$wgAutoloadClasses['DTImportJob'] = $dtgIP . '/includes/DT_ImportJob.php';
+$wgAutoloadClasses['DTXMLParser'] = $dtgIP . '/includes/DT_XMLParser.php';
+$wgAutoloadClasses['DTWikiTemplate'] = $dtgIP . '/includes/DT_WikiTemplate.php';
+$wgAutoloadClasses['DTWikiPage'] = $dtgIP . '/includes/DT_WikiPage.php';
+$wgAutoloadClasses['DTHooks'] = $dtgIP . '/includes/DT_Hooks.php';
+
+$wgHooks['AdminLinks'][] = 'DTHooks::addToAdminLinks';
+
+###
+# Permission to import files
+###
+$wgGroupPermissions['sysop']['datatransferimport'] = true;
+$wgAvailableRights[] = 'datatransferimport';
+
+// Global settings
+$wgDataTransferViewXMLParseFields = false;
+$wgDataTransferViewXMLParseFreeText = true;
+
+$wgMessagesDirs['DataTransfer'] = __DIR__ . '/i18n';
+$wgExtensionMessagesFiles['DataTransferAlias'] = $dtgIP . '/DataTransfer.i18n.alias.php'; \ No newline at end of file
diff --git a/www/wiki/extensions/DataTransfer/Gruntfile.js b/www/wiki/extensions/DataTransfer/Gruntfile.js
new file mode 100644
index 00000000..a45071e1
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/Gruntfile.js
@@ -0,0 +1,21 @@
+/*jshint node:true */
+module.exports = function ( grunt ) {
+ grunt.loadNpmTasks( 'grunt-jsonlint' );
+ grunt.loadNpmTasks( 'grunt-banana-checker' );
+
+ grunt.initConfig( {
+ banana: {
+ all: 'i18n/'
+ },
+ jsonlint: {
+ all: [
+ '**/*.json',
+ '!node_modules/**',
+ '!vendor/**'
+ ]
+ }
+ } );
+
+ grunt.registerTask( 'test', [ 'jsonlint', 'banana' ] );
+ grunt.registerTask( 'default', 'test' );
+};
diff --git a/www/wiki/extensions/DataTransfer/INSTALL b/www/wiki/extensions/DataTransfer/INSTALL
new file mode 100644
index 00000000..800980a8
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/INSTALL
@@ -0,0 +1,34 @@
+[[Data Transfer 1.0]]
+
+Contents:
+* Disclaimer
+* Requirements
+* Installation
+* Contact
+
+== Disclaimer ==
+
+For a proper legal disclaimer, see the file "COPYING".
+
+== Requirements ==
+
+This extension requires MediaWiki 1.23 or greater.
+
+== Installation ==
+
+(1) Extract the archive to obtain the directory "DataTransfer"
+ that contains all relevant files. Copy this directory (or
+ extract/download it) to "[wikipath]/extensions/".
+(2) Insert either of the following lines into the file
+ "[wikipath]/LocalSettings.php":
+ include_once( "$IP/extensions/DataTransfer/DataTransfer.php" );
+ wfLoadExtension( 'DataTransfer' );
+(3) To enable importing spreadsheet files (Excel, OOCalc, Gnumeric, ...),
+ use Composer to install the phpoffice/phpexcel module. From the MediaWiki
+ installation directory call:
+ composer require "phpoffice/phpexcel:~1.8"
+
+== Contact ==
+
+If you have any issues or questions, please send them to
+yaron57@gmail.com.
diff --git a/www/wiki/extensions/DataTransfer/README b/www/wiki/extensions/DataTransfer/README
new file mode 100644
index 00000000..192b04e0
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/README
@@ -0,0 +1,31 @@
+== About ==
+
+Data Transfer is an extension to MediaWiki that both exports data,
+based on the current contents of pages in a wiki; and imports pages.
+In both cases, it uses template calls, and the fields within them,
+to define the data structure.
+
+The export is done in XML format, while the import can be done in
+either XML, CSV or spreadsheet (.xls, .ods etc.) formats.
+
+For the export, any text that is not within a template call gets
+placed into one or more "free text" fields.
+
+For more information on Data Transfer, see the extension
+homepage at
+http://www.mediawiki.org/wiki/Extension:Data_Transfer
+
+Notes on installing Data Transfer can be found in the file INSTALL.
+
+== Credits ==
+
+Data Transfer was mostly written by Yaron Koren. The spreadsheet import
+functionality was written by Stephan Gambke.
+
+The spreadsheet import functionality makes use of the PHPExcel
+library, if it is available.
+
+== Contact ==
+
+Comments, questions, suggestions and bug reports should be
+sent to Yaron at yaron57@gmail.com.
diff --git a/www/wiki/extensions/DataTransfer/composer.json b/www/wiki/extensions/DataTransfer/composer.json
new file mode 100644
index 00000000..973fb5b0
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/composer.json
@@ -0,0 +1,97 @@
+{
+ "name": "mediawiki/data-transfer",
+ "type": "mediawiki-extension",
+ "description": "A MediaWiki extension for importing and exporting data in CSV and XML formats.",
+ "keywords": [
+ "MediaWiki",
+ "CSV",
+ "XML",
+ "import",
+ "export"
+ ],
+ "homepage": "https://www.mediawiki.org/wiki/Extension:Data_Transfer",
+ "license": "GPL-2.0-or-later",
+ "authors": [
+ {
+ "name": "Alexandre Emsenhuber"
+ },
+ {
+ "name": "Brion Vibber"
+ },
+ {
+ "name": "Chad Horohoe"
+ },
+ {
+ "name": "Daniel Friesen"
+ },
+ {
+ "name": "Jeroen De Dauw"
+ },
+ {
+ "name": "kghbln"
+ },
+ {
+ "name": "Meno25"
+ },
+ {
+ "name": "Niklas Laxström"
+ },
+ {
+ "name": "Raimond Spekking"
+ },
+ {
+ "name": "Sam Reed"
+ },
+ {
+ "name": "Siebrand Mazeland"
+ },
+ {
+ "name": "Shinjiman"
+ },
+ {
+ "name": "shirayuki"
+ },
+ {
+ "name": "Stephan Gambke"
+ },
+ {
+ "name": "umherirrender"
+ },
+ {
+ "name": "Yaron Koren"
+ }
+ ],
+ "support": {
+ "issues": "https://phabricator.wikimedia.org/project/profile/791/",
+ "irc": "irc://irc.freenode.net/mediawiki",
+ "wiki": "https://www.mediawiki.org/wiki/Extension:Data_Transfer",
+ "source": "https://phabricator.wikimedia.org/diffusion/EDTR/extension-datatransfer.git"
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "composer/installers": "1.*,>=1.0.1"
+ },
+ "config": {
+ "optimize-autoloader": true,
+ "prepend-autoloader": false
+ },
+ "autoload": {
+ "files": [
+ "DataTransfer.php"
+ ]
+ },
+ "require-dev": {
+ "jakub-onderka/php-parallel-lint": "1.0.0",
+ "jakub-onderka/php-console-highlighter": "0.3.2",
+ "mediawiki/minus-x": "0.3.1"
+ },
+ "scripts": {
+ "test": [
+ "parallel-lint . --exclude vendor --exclude node_modules",
+ "minus-x check ."
+ ],
+ "fix": [
+ "minus-x fix ."
+ ]
+ }
+}
diff --git a/www/wiki/extensions/DataTransfer/extension.json b/www/wiki/extensions/DataTransfer/extension.json
new file mode 100644
index 00000000..3fb2ce3c
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/extension.json
@@ -0,0 +1,72 @@
+{
+ "@Note": "When updating this file please also update DataTransfer.php with the same changes.",
+ "name": "Data Transfer",
+ "version": "1.0",
+ "author": [
+ "Yaron Koren",
+ "..."
+ ],
+ "url": "https://www.mediawiki.org/wiki/Extension:Data_Transfer",
+ "descriptionmsg": "datatransfer-desc",
+ "license-name": "GPL-2.0-or-later",
+ "type": "specialpage",
+ "GroupPermissions": {
+ "sysop": {
+ "datatransferimport": true
+ }
+ },
+ "AvailableRights": [
+ "datatransferimport"
+ ],
+ "SpecialPages": {
+ "ViewXML": "DTViewXML",
+ "ImportXML": "DTImportXML",
+ "ImportCSV": "DTImportCSV",
+ "ImportSpreadsheet": "DTImportSpreadsheet"
+ },
+ "JobClasses": {
+ "dtImport": "DTImportJob"
+ },
+ "MessagesDirs": {
+ "DataTransfer": [
+ "i18n"
+ ]
+ },
+ "ExtensionMessagesFiles": {
+ "DataTransferAlias": "DataTransfer.i18n.alias.php"
+ },
+ "AutoloadClasses": {
+ "DTPageStructure": "includes/DT_PageStructure.php",
+ "DTPageComponent": "includes/DT_PageComponent.php",
+ "DTPage": "includes/DT_Page.php",
+ "DTUtils": "includes/DT_Utils.php",
+ "DTImportJob": "includes/DT_ImportJob.php",
+ "DTXMLParser": "includes/DT_XMLParser.php",
+ "DTWikiTemplate": "includes/DT_WikiTemplate.php",
+ "DTWikiPage": "includes/DT_WikiPage.php",
+ "DTHooks": "includes/DT_Hooks.php",
+ "DTViewXML": "specials/DT_ViewXML.php",
+ "DTImportXML": "specials/DT_ImportXML.php",
+ "DTImportCSV": "specials/DT_ImportCSV.php",
+ "DTImportSpreadsheet": "specials/DT_ImportSpreadsheet.php"
+ },
+ "ResourceModules": {
+ "ext.datatransfer": {
+ "styles": "styles/DataTransfer.css"
+ }
+ },
+ "ResourceFileModulePaths": {
+ "localBasePath": "",
+ "remoteExtPath": "DataTransfer"
+ },
+ "Hooks": {
+ "AdminLinks": [
+ "DTHooks::addToAdminLinks"
+ ]
+ },
+ "config": {
+ "DataTransferViewXMLParseFields": false,
+ "DataTransferViewXMLParseFreeText": true
+ },
+ "manifest_version": 1
+} \ No newline at end of file
diff --git a/www/wiki/extensions/DataTransfer/i18n/af.json b/www/wiki/extensions/DataTransfer/i18n/af.json
new file mode 100644
index 00000000..e40300ed
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/af.json
@@ -0,0 +1,38 @@
+{
+ "@metadata": {
+ "authors": [
+ "Arnobarnard",
+ "Naudefj"
+ ]
+ },
+ "datatransfer-desc": "Maak die laai en ontlaai van gestruktureerde gegewens in sjabloonaanroepe moontlik",
+ "viewxml": "Sien XML",
+ "dt_viewxml_docu": "Kies een van die volgende kategorieë en naamruimtes om in XML-formaat te sien.",
+ "dt_viewxml_categories": "Kategorieë",
+ "dt_viewxml_namespaces": "Naamruimtes",
+ "dt_viewxml_simplifiedformat": "Vereenvoudigde formaat",
+ "dt_xml_namespace": "Naamruimte",
+ "dt_xml_pages": "Bladsye",
+ "dt_xml_page": "Bladsy",
+ "dt_xml_template": "Sjabloon",
+ "dt_xml_field": "Veld",
+ "dt_xml_name": "Naam",
+ "dt_xml_title": "Titel",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Vrye teks",
+ "importxml": "Laai XML",
+ "dt_import_selectfile": "Kies die $1 lêer om te laai:",
+ "dt_import_encodingtype": "Enkoderingstipe:",
+ "dt_import_forexisting": "Vir bladsye wat reeds bestaan:",
+ "dt_import_overwriteexisting": "Oorskryf bestaande inhoud",
+ "dt_import_mergeintoexisting": "Oorskryf slegs velde wat in die lêer voorkom",
+ "dt_import_skipexisting": "Slaan oor",
+ "dt_import_appendtoexisting": "Voeg by bestaande inhoud",
+ "dt_import_summarydesc": "Samevatting van die import:",
+ "dt_import_editsummary": "$1-laai",
+ "dt_import_importing": "Besig om te laai...",
+ "dt_import_success": "$1 {{PLURAL:$1|bladsy|bladsye}} sal geskep word vanaf die lêer $2.",
+ "importcsv": "Laai CSV",
+ "dt_importcsv_badheader": "Fout: Die opskrif van kolom $1, \"$2\", moet \"$3\" of \"$4\" wees, of in die vorm \"sjabloonnaam[veldnaam]\" genoteer word.",
+ "right-datatransferimport": "Laai data"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ais.json b/www/wiki/extensions/DataTransfer/i18n/ais.json
new file mode 100644
index 00000000..9ea8c417
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ais.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Benel"
+ ]
+ },
+ "viewxml": "ciwsace XML"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/aln.json b/www/wiki/extensions/DataTransfer/i18n/aln.json
new file mode 100644
index 00000000..522902b7
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/aln.json
@@ -0,0 +1,31 @@
+{
+ "@metadata": {
+ "authors": [
+ "Mdupont"
+ ]
+ },
+ "datatransfer-desc": "Lejon për import dhe eksport të dhënave të përmbajtura në modelin e quan",
+ "viewxml": "Shiko XML",
+ "dt_viewxml_docu": "Ju lutem zgjidhni midis kategorive të mëposhtme dhe hapësira për të parë në formatin XML.",
+ "dt_viewxml_categories": "Kategoritë",
+ "dt_viewxml_namespaces": "Hapësira",
+ "dt_viewxml_simplifiedformat": "Formati i thjeshtuar",
+ "dt_xml_namespace": "Hapësira",
+ "dt_xml_pages": "Faqet",
+ "dt_xml_page": "Faqe",
+ "dt_xml_template": "Shabllon",
+ "dt_xml_field": "Fushë",
+ "dt_xml_name": "Emër",
+ "dt_xml_title": "Titull",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Free Tekst",
+ "importxml": "Importi XML",
+ "dt_import_selectfile": "Ju lutem përzgjidhni kartelën $1 për të importuar:",
+ "dt_import_encodingtype": "Encoding lloj:",
+ "dt_import_editsummary": "$1 importit",
+ "dt_import_importing": "Importimi ...",
+ "dt_import_success": "$1 {{PLURAL:$1|faqe|faqe}} do të krijohet nga file $2.",
+ "importcsv": "Importi CSV",
+ "dt_importcsv_badheader": "Gabim: $1 column header, '$2', duhet të jenë ose '$3', '$4' ose të formës 'template_name [field_name]'",
+ "right-datatransferimport": "Të dhënat e importit"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/am.json b/www/wiki/extensions/DataTransfer/i18n/am.json
new file mode 100644
index 00000000..1a48bc6e
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/am.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Codex Sinaiticus"
+ ]
+ },
+ "dt_viewxml_categories": "መደቦች",
+ "dt_viewxml_namespaces": "ክፍለ-ዊኪዎች",
+ "dt_xml_namespace": "ክፍለ-ዊኪ",
+ "dt_xml_name": "ስም",
+ "dt_xml_title": "አርዕስት"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/an.json b/www/wiki/extensions/DataTransfer/i18n/an.json
new file mode 100644
index 00000000..0a0bc749
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/an.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Juanpabl",
+ "Remember the dot"
+ ]
+ },
+ "dt_viewxml_namespaces": "Espacios de nombres",
+ "dt_xml_namespace": "Espacio de nombres",
+ "dt_xml_page": "Pachina",
+ "dt_xml_template": "Plantilla",
+ "dt_xml_name": "Nombre"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ar.json b/www/wiki/extensions/DataTransfer/i18n/ar.json
new file mode 100644
index 00000000..5817f1cd
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ar.json
@@ -0,0 +1,43 @@
+{
+ "@metadata": {
+ "authors": [
+ "Meno25",
+ "Mutarjem horr",
+ "OsamaK",
+ "Mido",
+ "ديفيد"
+ ]
+ },
+ "datatransfer-desc": "يسمح باستيراد وتصدير بيانات محتواة في استدعاءات قالب",
+ "viewxml": "عرض XML",
+ "dt_viewxml_docu": "من فضلك اختر من بين التصنيفات والنطاقات التالية للعرض في صيغة XML.",
+ "dt_viewxml_categories": "تصنيفات",
+ "dt_viewxml_namespaces": "نطاقات",
+ "dt_viewxml_simplifiedformat": "صيغة مبسطة",
+ "dt_xml_namespace": "نطاق",
+ "dt_xml_pages": "صفحات",
+ "dt_xml_page": "الصفحة",
+ "dt_xml_template": "قالب",
+ "dt_xml_field": "حقل",
+ "dt_xml_name": "الاسم",
+ "dt_xml_title": "عنوان",
+ "dt_xml_id": "رقم",
+ "dt_xml_freetext": "نص حر",
+ "importxml": "استيراد XML",
+ "dt_import_selectfile": "من فضلك اختر ملف $1 للاستيراد:",
+ "dt_import_encodingtype": "نوع الترميز:",
+ "dt_import_forexisting": "لصفحات موجودة مسبقاّ :",
+ "dt_import_overwriteexisting": "أكتب على المحتوى الموجود",
+ "dt_import_mergeintoexisting": "استبدال الحقول الموجودة في الملف فقط",
+ "dt_import_skipexisting": "أقفز",
+ "dt_import_appendtoexisting": "إلحاق بالمحتوى الموجود",
+ "dt_import_summarydesc": "موجز الاستيراد :",
+ "dt_import_editsummary": "استيراد {{ucfirst:$1}}",
+ "dt_import_importing": "جارٍ الاستيراد...",
+ "dt_import_success": "سوف تُنشأ {{PLURAL:$1||صفحة واحدة|صفحتين|$1 صفحات|$1 صفحة}} من ملف $2.",
+ "importcsv": "استورد CSV",
+ "importspreadsheet": "استيراد جدول البيانات",
+ "dt_importcsv_badheader": "خطأ: عنوان العامود $1، '$2'، يجب أن يكون إما '$3'، '$4' أو من الصيغة 'template_name[field_name]'",
+ "right-datatransferimport": "استورد بيانات",
+ "dt_filetype_spreadsheet": "جدول بيانات"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/arc.json b/www/wiki/extensions/DataTransfer/i18n/arc.json
new file mode 100644
index 00000000..c7b7edb1
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/arc.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "Basharh"
+ ]
+ },
+ "dt_viewxml_categories": "ܣܕܪ̈ܐ",
+ "dt_viewxml_namespaces": "ܚܩܠܬ̈ܐ",
+ "dt_xml_namespace": "ܚܩܠܐ",
+ "dt_xml_pages": "ܦܐܬܬ̈ܐ",
+ "dt_xml_page": "ܦܐܬܐ",
+ "dt_xml_template": "ܩܠܒܐ",
+ "dt_xml_name": "ܫܡܐ",
+ "dt_xml_title": "ܟܘܢܝܐ",
+ "dt_xml_id": "ܗܝܝܘܬܐ",
+ "dt_import_summarydesc": "ܦܣܝܩܬ̈ܐ ܕܡܥܠܢܘܬܐ:",
+ "right-datatransferimport": "ܡܥܠܢܘܬܐ ܕܓܠܝܬ̈ܐ"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/arn.json b/www/wiki/extensions/DataTransfer/i18n/arn.json
new file mode 100644
index 00000000..9d61280a
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/arn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Remember the dot"
+ ]
+ },
+ "dt_xml_page": "Pakina"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/arz.json b/www/wiki/extensions/DataTransfer/i18n/arz.json
new file mode 100644
index 00000000..352b08d9
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/arz.json
@@ -0,0 +1,27 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dudi",
+ "Ghaly",
+ "Meno25"
+ ]
+ },
+ "datatransfer-desc": "بيسمح بـ import و export للداتا اللى جوّا القالب",
+ "viewxml": "شوف XML",
+ "dt_viewxml_docu": "لو سمحت اختار من التصانيف و اسامى المساحات الجايه علشان العرض فى XML format.",
+ "dt_viewxml_categories": "تصانيف",
+ "dt_viewxml_namespaces": "مساحات اسامى",
+ "dt_viewxml_simplifiedformat": "format متبسطه",
+ "dt_xml_namespace": "اسم مساحه",
+ "dt_xml_pages": "صفح",
+ "dt_xml_page": "صفحه",
+ "dt_xml_template": "قالب",
+ "dt_xml_field": "حقل",
+ "dt_xml_name": "اسم",
+ "dt_xml_title": "عنوان",
+ "dt_xml_id": "رقم",
+ "dt_xml_freetext": "نص حر",
+ "dt_import_selectfile": "لو سمحت اختار فايل $1 علشان تعمل import:",
+ "dt_import_editsummary": "استوراد $1",
+ "dt_import_success": "$1 {{PLURAL:$1|صفحه|صفحه}} ح يتعملو من الفايل $2."
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ast.json b/www/wiki/extensions/DataTransfer/i18n/ast.json
new file mode 100644
index 00000000..cc8b815e
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ast.json
@@ -0,0 +1,39 @@
+{
+ "@metadata": {
+ "authors": [
+ "Xuacu"
+ ]
+ },
+ "datatransfer-desc": "Permite importar y esportar los datos que contienen les llamaes de les plantíes",
+ "viewxml": "Ver XML",
+ "dt_viewxml_docu": "Por favor, esbilla entre les siguientes categoríes y espacios de nome pa ver en formatu XML.",
+ "dt_viewxml_categories": "Categoríes",
+ "dt_viewxml_namespaces": "Espacios de nome",
+ "dt_viewxml_simplifiedformat": "Formatu simplificáu",
+ "dt_xml_namespace": "Espaciu de nomes",
+ "dt_xml_pages": "Páxines",
+ "dt_xml_page": "Páxina",
+ "dt_xml_template": "Plantía",
+ "dt_xml_field": "Campu",
+ "dt_xml_name": "Nome",
+ "dt_xml_title": "Títulu",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Testu llibre",
+ "importxml": "Importar XML",
+ "dt_import_selectfile": "Por favor, seleiciona el ficheru $1 a importar:",
+ "dt_import_encodingtype": "Triba de codificación:",
+ "dt_import_forexisting": "Pa páxines que yá esisten:",
+ "dt_import_overwriteexisting": "Sobreescribir el conteníu esistente",
+ "dt_import_mergeintoexisting": "Sobrescribir sólo los campos conteníos nel ficheru",
+ "dt_import_skipexisting": "Saltar",
+ "dt_import_appendtoexisting": "Amestar al conteníu esistente",
+ "dt_import_summarydesc": "Resume de la importación:",
+ "dt_import_editsummary": "Importación {{ucfirst:$1}}",
+ "dt_import_importing": "Importando...",
+ "dt_import_success": "Se {{PLURAL:$1|creará|crearán}} $1 {{PLURAL:$1|páxina|páxines}} del ficheru $2.",
+ "importcsv": "Importar CSV",
+ "importspreadsheet": "Importar fueya de cálculu",
+ "dt_importcsv_badheader": "Error : la testera de columna $1, \"$2\", tien de ser o \"$3\", \"$4\" o de la forma 'nome_de_plantía[nome_de_campu]'",
+ "right-datatransferimport": "Importar datos",
+ "dt_filetype_spreadsheet": "Fueya de cálculu"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/atj.json b/www/wiki/extensions/DataTransfer/i18n/atj.json
new file mode 100644
index 00000000..24a88c10
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/atj.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Benoit Rochon"
+ ]
+ },
+ "dt_xml_pages": "Masinahikana"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/az.json b/www/wiki/extensions/DataTransfer/i18n/az.json
new file mode 100644
index 00000000..ee2abd46
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/az.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Cekli829",
+ "Vago"
+ ]
+ },
+ "dt_viewxml_categories": "Kateqoriyalar",
+ "dt_viewxml_namespaces": "Adlar fəzaları",
+ "dt_xml_namespace": "Adlar fəzası",
+ "dt_xml_pages": "Səhifələr",
+ "dt_xml_page": "Səhifə",
+ "dt_xml_template": "Şablon",
+ "dt_xml_name": "Ad",
+ "dt_xml_title": "Başlıq",
+ "dt_xml_id": "ID"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/azb.json b/www/wiki/extensions/DataTransfer/i18n/azb.json
new file mode 100644
index 00000000..8e2714f2
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/azb.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Erdemaslancan"
+ ]
+ },
+ "dt_viewxml_namespaces": "آدلار فضاسی:"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ba.json b/www/wiki/extensions/DataTransfer/i18n/ba.json
new file mode 100644
index 00000000..43c1ec93
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ba.json
@@ -0,0 +1,42 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ләйсән",
+ "Аҡҡашҡа",
+ "Мухамадеева",
+ "Айбикә"
+ ]
+ },
+ "datatransfer-desc": "Ҡалыпты һорап алыу эстәлегендәге мәғлүмәтте импортлау һәм экспортлау",
+ "viewxml": "XMLды ҡарап сығыу",
+ "dt_viewxml_docu": "XML форматында исем категорияларын һәм арауығын ҡарап сығыуҙы һайлағыҙ.",
+ "dt_viewxml_categories": "Категориялар",
+ "dt_viewxml_namespaces": "Исем арауыҡтары",
+ "dt_viewxml_simplifiedformat": "Ябайлаштырылған формат",
+ "dt_xml_namespace": "Исемдәр арауығы",
+ "dt_xml_pages": "Биттәр",
+ "dt_xml_page": "Бит",
+ "dt_xml_template": "Ҡалып",
+ "dt_xml_field": "майҙан.",
+ "dt_xml_name": "Исем.",
+ "dt_xml_title": "Атама",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Ирекле текст",
+ "importxml": "XML импорты",
+ "dt_import_selectfile": " импорт өсөн $1 файлын һайлағыҙ",
+ "dt_import_encodingtype": "кодлау төрө",
+ "dt_import_forexisting": "Булған биттәр өсөн",
+ "dt_import_overwriteexisting": "Булған мәғлүмәттәрҙе яңынан күсереп яҙыу",
+ "dt_import_mergeintoexisting": "Файлда булған майҙандарҙы ғына яңынан яҙыу",
+ "dt_import_skipexisting": "Ҡалдырып торорға",
+ "dt_import_appendtoexisting": "Булған мәғлүмәттәргә өҫтәргә",
+ "dt_import_summarydesc": "Импортты һүрәтләү",
+ "dt_import_editsummary": " {{ucfirst:$1}}-тан импорт",
+ "dt_import_importing": "Индереү",
+ "dt_import_success": "$1 {{PLURAL:$1|бите булған|биттәр булған|бит булған}} $2 файлынан булдырылған.",
+ "importcsv": "CSV импорты",
+ "importspreadsheet": "Таблицаның импорты",
+ "dt_importcsv_badheader": "Хата. №$1 «$2» колонкаларының атмаһы «$3», йәки «$4», йәки «template_name[field_name]» формаһында булырға тейеш.",
+ "right-datatransferimport": "Мәғлүмәттәр импорты",
+ "dt_filetype_spreadsheet": "таблица"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/bcc.json b/www/wiki/extensions/DataTransfer/i18n/bcc.json
new file mode 100644
index 00000000..74b1d6a8
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/bcc.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Baloch Afghanistan"
+ ]
+ },
+ "dt_xml_template": "تراشوان"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/be-tarask.json b/www/wiki/extensions/DataTransfer/i18n/be-tarask.json
new file mode 100644
index 00000000..2cc7c880
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/be-tarask.json
@@ -0,0 +1,42 @@
+{
+ "@metadata": {
+ "authors": [
+ "EugeneZelenko",
+ "Jim-by",
+ "Wizardist",
+ "Red Winged Duck"
+ ]
+ },
+ "datatransfer-desc": "Дазваляе імпартаваць і экспартаваць зьвесткі, якія ўтрымліваюцца ў выкліках шаблёнах",
+ "viewxml": "Паказаць XML",
+ "dt_viewxml_docu": "Калі ласка, выберыце што праглядаць у фармаце XML сярод наступных катэгорыяў і прастораў назваў.",
+ "dt_viewxml_categories": "Катэгорыі",
+ "dt_viewxml_namespaces": "Прасторы назваў",
+ "dt_viewxml_simplifiedformat": "Спрошчаны фармат",
+ "dt_xml_namespace": "Прастора назваў",
+ "dt_xml_pages": "Старонкі",
+ "dt_xml_page": "Старонка",
+ "dt_xml_template": "Шаблён",
+ "dt_xml_field": "Поле",
+ "dt_xml_name": "Назва",
+ "dt_xml_title": "Назва",
+ "dt_xml_id": "Ідэнтыфікатар",
+ "dt_xml_freetext": "Вольны тэкст",
+ "importxml": "Імпарт XML",
+ "dt_import_selectfile": "Калі ласка, выберыце файл у фармаце $1 для імпарту:",
+ "dt_import_encodingtype": "Тып кадыроўкі:",
+ "dt_import_forexisting": "Для старонак якія ўжо існуюць:",
+ "dt_import_overwriteexisting": "Перазапісваць існуючы зьмест",
+ "dt_import_mergeintoexisting": "Перазапісваць толькі палі, што ўтрымліваюцца ў файле",
+ "dt_import_skipexisting": "Прапускаць",
+ "dt_import_appendtoexisting": "Далучаць да існуючага зьместу",
+ "dt_import_summarydesc": "Кароткае апісаньне імпарту:",
+ "dt_import_editsummary": "імпарт з {{ucfirst:$1}}",
+ "dt_import_importing": "Імпартаваньне...",
+ "dt_import_success": "$1 {{PLURAL:$1|старонка будзе|старонкі будуць|старонак будзе}} створана з файла ў фармаце $2.",
+ "importcsv": "Імпарт CSV",
+ "importspreadsheet": "Імпарт табліцы",
+ "dt_importcsv_badheader": "Памылка: загаловак слупка $1, '$2', павінен быць адным з '$3', '$4' альбо у форме 'назва_шаблёну[назва_поля]'",
+ "right-datatransferimport": "імпарт зьвестак",
+ "dt_filetype_spreadsheet": "табліца"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/be.json b/www/wiki/extensions/DataTransfer/i18n/be.json
new file mode 100644
index 00000000..9b01bd71
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/be.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Тест"
+ ]
+ },
+ "dt_viewxml_categories": "Катэгорыі",
+ "dt_xml_template": "Шаблон"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/bg.json b/www/wiki/extensions/DataTransfer/i18n/bg.json
new file mode 100644
index 00000000..2ccb7f16
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/bg.json
@@ -0,0 +1,27 @@
+{
+ "@metadata": {
+ "authors": [
+ "DCLXVI",
+ "පසිඳු කාවින්ද",
+ "StanProg"
+ ]
+ },
+ "viewxml": "Преглед на XML",
+ "dt_viewxml_categories": "Категории",
+ "dt_viewxml_namespaces": "Именни пространства",
+ "dt_viewxml_simplifiedformat": "Опростен формат",
+ "dt_xml_namespace": "Именно пространство",
+ "dt_xml_pages": "Страници",
+ "dt_xml_page": "Страница",
+ "dt_xml_template": "Шаблон",
+ "dt_xml_field": "Поле",
+ "dt_xml_name": "Име",
+ "dt_xml_title": "Заглавие",
+ "dt_xml_id": "Номер",
+ "dt_xml_freetext": "Свободен текст",
+ "importxml": "Внасяне на XML",
+ "dt_import_skipexisting": "Пропускане",
+ "dt_import_importing": "Внасяне...",
+ "importcsv": "Внасяне на CSV",
+ "right-datatransferimport": "Внасяне на данни"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/bn.json b/www/wiki/extensions/DataTransfer/i18n/bn.json
new file mode 100644
index 00000000..ab3d2831
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/bn.json
@@ -0,0 +1,35 @@
+{
+ "@metadata": {
+ "authors": [
+ "Wikitanvir",
+ "Aftab1995",
+ "Aftabuzzaman",
+ "আফতাবুজ্জামান"
+ ]
+ },
+ "viewxml": "এক্সএমএল দেখাও",
+ "dt_viewxml_categories": "বিষয়শ্রেণীসমূহ",
+ "dt_viewxml_namespaces": "নামস্থানসমূহ",
+ "dt_viewxml_simplifiedformat": "সাধারণকৃত কাঠামো",
+ "dt_xml_namespace": "নামস্থান",
+ "dt_xml_pages": "পাতা",
+ "dt_xml_page": "পাতা",
+ "dt_xml_template": "টেম্পলেট",
+ "dt_xml_field": "ফিল্ড",
+ "dt_xml_name": "নাম",
+ "dt_xml_title": "শিরোনাম",
+ "dt_xml_id": "আইডি",
+ "dt_xml_freetext": "মুক্ত লেখা",
+ "importxml": "এক্সএমএল আমদানি",
+ "dt_import_selectfile": "অনুগ্রহ করে আমদানির জন্য $1 ফাইল নির্বাচন করুন:",
+ "dt_import_encodingtype": "এনকোডিংয়ের ধরন:",
+ "dt_import_forexisting": "যে পাতাগুলো ইতিমধ্যেই আছে তার জন্য:",
+ "dt_import_overwriteexisting": "বিদ্যমান বিষয়সমূহ প্রতিস্থাপন করো",
+ "dt_import_skipexisting": "উপেক্ষা করো",
+ "dt_import_summarydesc": "আমদানির সারাংশ",
+ "dt_import_editsummary": "{{ucfirst:$1}} আমদানি",
+ "dt_import_importing": "আমদানি হচ্ছে...",
+ "dt_import_success": "$2টি ফাইল থেকে $1টি {{PLURAL:$1|পাতা|পাতা}} তৈরি করা হবে।",
+ "importcsv": "সিএসভি আমদানি",
+ "right-datatransferimport": "উপাত্ত আমদানি"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/br.json b/www/wiki/extensions/DataTransfer/i18n/br.json
new file mode 100644
index 00000000..d9a36d19
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/br.json
@@ -0,0 +1,42 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fohanno",
+ "Fulup",
+ "Gwendal",
+ "Y-M D"
+ ]
+ },
+ "datatransfer-desc": "Aotren a ra enporzhiañ hag ezporzhiañ roadennoù zo e galvoù patromoù",
+ "viewxml": "Gwelet XML",
+ "dt_viewxml_docu": "Dibabit e-touez ar rummadoù hag an esaouennoù anv da heul evit gwelet er furmad XML.",
+ "dt_viewxml_categories": "Rummadoù",
+ "dt_viewxml_namespaces": "Esaouennoù anv",
+ "dt_viewxml_simplifiedformat": "Furmad eeunaet",
+ "dt_xml_namespace": "Esaouenn anv",
+ "dt_xml_pages": "Pajennoù",
+ "dt_xml_page": "Pajenn",
+ "dt_xml_template": "Patrom",
+ "dt_xml_field": "Maezienn",
+ "dt_xml_name": "Anv",
+ "dt_xml_title": "Titl",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Testenn dieub",
+ "importxml": "Enporzhiañ XML",
+ "dt_import_selectfile": "Dibabit ar restr $1 da enporzhiañ :",
+ "dt_import_encodingtype": "Seurt enkodadur :",
+ "dt_import_forexisting": "Evit pajennoù zo anezho dija :",
+ "dt_import_overwriteexisting": "erlec'hiañ an endalc'had zo anezhañ dija",
+ "dt_import_mergeintoexisting": "Erlec'hiañ hepken ar maeziennoù a gaver er restr",
+ "dt_import_skipexisting": "Lezel a-gostez",
+ "dt_import_appendtoexisting": "Ouzhpennañ d'an endalc'had zo anezhañ dija",
+ "dt_import_summarydesc": "Diverradenn an enporzh :",
+ "dt_import_editsummary": "Enporzhiadur {{ucfirst:$1}}",
+ "dt_import_importing": "Oc'h enporzhiañ...",
+ "dt_import_success": "$1 {{PLURAL:$1|bajenn|pajenn}} a vo krouet diwar ar restr $2.",
+ "importcsv": "Enporzh CSV",
+ "importspreadsheet": "Enporzhiañ ur follenn jediñ",
+ "dt_importcsv_badheader": "Fazi : titl ar bann $1, \"$2\", a rank bezañ \"$3\", \"$4\" pe gant ar stumm \"anv_ar_patrom[anv_ar_vaezienn]\"",
+ "right-datatransferimport": "Enporzhiañ roadennoù",
+ "dt_filetype_spreadsheet": "follenn jediñ"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/bs.json b/www/wiki/extensions/DataTransfer/i18n/bs.json
new file mode 100644
index 00000000..348c0802
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/bs.json
@@ -0,0 +1,37 @@
+{
+ "@metadata": {
+ "authors": [
+ "CERminator",
+ "Srdjan m"
+ ]
+ },
+ "datatransfer-desc": "Omogućuje uvoz i izvoz podataka koji su sadržani u pozivima šablona",
+ "viewxml": "Pregledaj XML",
+ "dt_viewxml_docu": "Molimo Vas odaberite unutar slijedećih kategorija i imenskih prostora za pregled u XML formatu.",
+ "dt_viewxml_categories": "Kategorije",
+ "dt_viewxml_namespaces": "Imenski prostori",
+ "dt_viewxml_simplifiedformat": "Pojednostavljeni format",
+ "dt_xml_namespace": "Imenski prostor",
+ "dt_xml_pages": "Stranice",
+ "dt_xml_page": "Stranica",
+ "dt_xml_template": "Šablon",
+ "dt_xml_field": "Polje",
+ "dt_xml_name": "Naziv",
+ "dt_xml_title": "Naslov",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Slobodni tekst",
+ "importxml": "Uvezi XML",
+ "dt_import_selectfile": "Molimo odaberite $1 datoteku za uvoz:",
+ "dt_import_encodingtype": "Tip šifriranja:",
+ "dt_import_forexisting": "Za stranice koje već postoje:",
+ "dt_import_overwriteexisting": "Piši preko postojećeg sadržaja",
+ "dt_import_skipexisting": "Preskoči",
+ "dt_import_appendtoexisting": "Dodaj na postojeći sadržaj",
+ "dt_import_summarydesc": "Sažetak uvoza:",
+ "dt_import_editsummary": "{{ucfirst:$1}} uvoz",
+ "dt_import_importing": "Uvoz...",
+ "dt_import_success": "$1 {{PLURAL:$1|stranica|stranice|stranica}} će biti napravljeno iz $2 datoteke.",
+ "importcsv": "Uvoz CSV",
+ "dt_importcsv_badheader": "Greška: zaglavlje $1 kolone, '$2', mora biti ili '$3', '$4' ili od obrasca 'template_name[field_name]'",
+ "right-datatransferimport": "Uvoz podataka"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ca.json b/www/wiki/extensions/DataTransfer/i18n/ca.json
new file mode 100644
index 00000000..ff554ca9
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ca.json
@@ -0,0 +1,43 @@
+{
+ "@metadata": {
+ "authors": [
+ "Arnaugir",
+ "Jordi Roqué",
+ "SMP",
+ "Solde",
+ "Toniher"
+ ]
+ },
+ "datatransfer-desc": "Permet importar i exportar les dades que contenen les crides de les plantilles",
+ "viewxml": "Visualitza l'XML",
+ "dt_viewxml_docu": "Seleccioneu d'entre les següents categories i espais de noms per a veure'l en format XML.",
+ "dt_viewxml_categories": "Categories",
+ "dt_viewxml_namespaces": "Espais de noms",
+ "dt_viewxml_simplifiedformat": "Format simplificat",
+ "dt_xml_namespace": "Espai de noms",
+ "dt_xml_pages": "Pàgines",
+ "dt_xml_page": "Pàgina",
+ "dt_xml_template": "Plantilla",
+ "dt_xml_field": "Camp",
+ "dt_xml_name": "Nom",
+ "dt_xml_title": "Títol",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Text lliure",
+ "importxml": "Importa un XML",
+ "dt_import_selectfile": "Seleccioneu el fitxer $1 per importar:",
+ "dt_import_encodingtype": "Joc de caràcters:",
+ "dt_import_forexisting": "Per a pàgines que ja existeixen:",
+ "dt_import_overwriteexisting": "Sobreescriu el contingut que ja existeix",
+ "dt_import_mergeintoexisting": "Sobreescriu només els camps continguts en el fitxer",
+ "dt_import_skipexisting": "Omet",
+ "dt_import_appendtoexisting": "Afegeix-ho al contingut existent",
+ "dt_import_summarydesc": "Resum de la importació:",
+ "dt_import_editsummary": "Importació de $1",
+ "dt_import_importing": "S'està important...",
+ "dt_import_success": "$1 {{PLURAL:$1|pàgina|pàgines}} es crearan des del fitxer $2.",
+ "importcsv": "Importa un CSV",
+ "importspreadsheet": "Importa el full de càlcul",
+ "dt_importcsv_badheader": "Error: la capçalera de la columna $1, '$2', ha de ser o bé '$3', '$4' o bé de la forma 'template_name[field_name]'",
+ "right-datatransferimport": "Importar dades",
+ "dt_filetype_spreadsheet": "full de càlcul"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ce.json b/www/wiki/extensions/DataTransfer/i18n/ce.json
new file mode 100644
index 00000000..821fba36
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ce.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Sasan700",
+ "Умар"
+ ]
+ },
+ "dt_viewxml_categories": "Категореш",
+ "dt_xml_pages": "АгӀонаш",
+ "dt_xml_page": "АгӀо",
+ "dt_xml_template": "Кеп",
+ "dt_xml_field": "Меттиг",
+ "dt_xml_name": "ЦӀе",
+ "dt_xml_title": "Корта",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Маьрша йоза",
+ "importxml": "Импорт XML",
+ "dt_import_summarydesc": "Импортах лаьцна:",
+ "dt_import_editsummary": "{{ucfirst:$1}} чура импорт",
+ "dt_import_importing": "Импорт яр...",
+ "dt_import_success": "$1 {{PLURAL:$1|агӀо кхоьллина|агӀонаш кхоьллина}} $2 файлах.",
+ "importcsv": "Импорт CSV",
+ "importspreadsheet": "Таблицам импорт",
+ "dt_filetype_spreadsheet": "таблица"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ckb.json b/www/wiki/extensions/DataTransfer/i18n/ckb.json
new file mode 100644
index 00000000..d0d99a2a
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ckb.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "Calak",
+ "Asoxor"
+ ]
+ },
+ "dt_xml_pages": "پەڕەکان",
+ "dt_xml_page": "پەڕە",
+ "dt_xml_template": "داڕێژە",
+ "dt_xml_name": "ناو",
+ "dt_xml_title": "سەردێڕ",
+ "dt_xml_id": "پێناسە"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/cs.json b/www/wiki/extensions/DataTransfer/i18n/cs.json
new file mode 100644
index 00000000..b3ff2860
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/cs.json
@@ -0,0 +1,34 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jkjk",
+ "Matěj Grabovský"
+ ]
+ },
+ "datatransfer-desc": "Umožňuje import a export strukturovaných údajů v buňkách šablon.",
+ "viewxml": "Zobrazit XML",
+ "dt_viewxml_categories": "Kategorie",
+ "dt_viewxml_namespaces": "Jmenné prostory",
+ "dt_viewxml_simplifiedformat": "Zjednodušený formát",
+ "dt_xml_namespace": "Jmenný prostor",
+ "dt_xml_pages": "Stránky",
+ "dt_xml_page": "Stránka",
+ "dt_xml_template": "Šablona",
+ "dt_xml_field": "Pole",
+ "dt_xml_name": "Název",
+ "dt_xml_title": "Název",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Libovolný text",
+ "importxml": "Importovat XML",
+ "dt_import_selectfile": "Prosím vyberte $1 soubor k importu:",
+ "dt_import_encodingtype": "Typ kódování:",
+ "dt_import_overwriteexisting": "Přepsat stávající obsah",
+ "dt_import_skipexisting": "Přeskočit",
+ "dt_import_appendtoexisting": "Připojit ke stávajícímu obsahu",
+ "dt_import_summarydesc": "Shrnutí importu:",
+ "dt_import_editsummary": "import $1",
+ "dt_import_importing": "Probíhá import...",
+ "dt_import_success": " $1 {{PLURAL:$1|stránky|stránky|stránek}} bude vytvořeno z $2 souboru.",
+ "importcsv": "Import CSV",
+ "right-datatransferimport": "Importovat data"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/cu.json b/www/wiki/extensions/DataTransfer/i18n/cu.json
new file mode 100644
index 00000000..cd00195f
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/cu.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "ОйЛ"
+ ]
+ },
+ "dt_xml_name": "имѧ"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/cv.json b/www/wiki/extensions/DataTransfer/i18n/cv.json
new file mode 100644
index 00000000..459c70e9
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/cv.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chuvash2014"
+ ]
+ },
+ "dt_viewxml_categories": "Категорисем",
+ "dt_xml_name": "Ят",
+ "dt_import_skipexisting": "Ирттер"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/da.json b/www/wiki/extensions/DataTransfer/i18n/da.json
new file mode 100644
index 00000000..bfb085d1
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/da.json
@@ -0,0 +1,26 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jon Harald Søby",
+ "Tjernobyl",
+ "Saederup92"
+ ]
+ },
+ "viewxml": "Vis XML",
+ "dt_viewxml_categories": "Kategorier",
+ "dt_viewxml_namespaces": "Navnerum",
+ "dt_viewxml_simplifiedformat": "Forenklet format",
+ "dt_xml_namespace": "Navnerum",
+ "dt_xml_pages": "Sider",
+ "dt_xml_page": "Side",
+ "dt_xml_template": "Skabelon",
+ "dt_xml_field": "Felt",
+ "dt_xml_name": "Navn",
+ "dt_xml_title": "Titel",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Fritekst",
+ "importxml": "Importer XML",
+ "dt_import_overwriteexisting": "Overskriv eksisterende indhold",
+ "dt_import_skipexisting": "Spring over",
+ "dt_import_importing": "Importerer..."
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/de.json b/www/wiki/extensions/DataTransfer/i18n/de.json
new file mode 100644
index 00000000..cd2a6f2c
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/de.json
@@ -0,0 +1,44 @@
+{
+ "@metadata": {
+ "authors": [
+ "Als-Holder",
+ "Kghbln",
+ "Krabina",
+ "Metalhead64",
+ "Revolus",
+ "Umherirrender"
+ ]
+ },
+ "datatransfer-desc": "Ermöglicht den Im- und Export von Daten",
+ "viewxml": "XML ansehen",
+ "dt_viewxml_docu": "Bitte auswählen, welche Kategorien und Namensräume im XML-Format angezeigt werden sollen:",
+ "dt_viewxml_categories": "Kategorien",
+ "dt_viewxml_namespaces": "Namensräume",
+ "dt_viewxml_simplifiedformat": "Vereinfachtes Format",
+ "dt_xml_namespace": "Namensraum",
+ "dt_xml_pages": "Seiten",
+ "dt_xml_page": "Seite",
+ "dt_xml_template": "Vorlage",
+ "dt_xml_field": "Feld",
+ "dt_xml_name": "Name",
+ "dt_xml_title": "Titel",
+ "dt_xml_id": "Kennung",
+ "dt_xml_freetext": "Freitext",
+ "importxml": "XML-Datei importieren",
+ "dt_import_selectfile": "Bitte die zu importierende $1-Datei auswählen:",
+ "dt_import_encodingtype": "Zeichenkodierung:",
+ "dt_import_forexisting": "Im Fall von Seiten, die bereits vorhanden sind:",
+ "dt_import_overwriteexisting": "Vorhandenen Inhalt überschreiben",
+ "dt_import_mergeintoexisting": "Nur in der Datei enthaltene Felder überschreiben",
+ "dt_import_skipexisting": "Seite nicht importieren",
+ "dt_import_appendtoexisting": "Vorhandenen Inhalt ergänzen",
+ "dt_import_summarydesc": "Zusammenfassung zum Import:",
+ "dt_import_editsummary": "{{ucfirst:$1}}-Import",
+ "dt_import_importing": "Importiere …",
+ "dt_import_success": "{{PLURAL:$1|Eine Seite|$1 Seiten}} werden aus der $2-Datei importiert.",
+ "importcsv": "CSV-Datei importieren",
+ "importspreadsheet": "Tabellenkalkulationsdatei importieren",
+ "dt_importcsv_badheader": "'''Fehler:''' Der Kopf der Spalte $1, „$2“, muss entweder „$3“, „$4“ oder im Format „Vorlagenname[Feldname]“ sein",
+ "right-datatransferimport": "Daten importieren",
+ "dt_filetype_spreadsheet": "Tabellenkalkulations"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/diq.json b/www/wiki/extensions/DataTransfer/i18n/diq.json
new file mode 100644
index 00000000..83e935c3
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/diq.json
@@ -0,0 +1,33 @@
+{
+ "@metadata": {
+ "authors": [
+ "Erdemaslancan",
+ "Mirzali",
+ "Marmase",
+ "Kumkumuk",
+ "Gırd"
+ ]
+ },
+ "viewxml": "XML'i bıvin",
+ "dt_viewxml_categories": "Kategoriyi",
+ "dt_viewxml_namespaces": "Heruna naman",
+ "dt_viewxml_simplifiedformat": "Basit kerde format",
+ "dt_xml_namespace": "Heruna namey",
+ "dt_xml_pages": "Peli",
+ "dt_xml_page": "Pele",
+ "dt_xml_template": "Şablon",
+ "dt_xml_field": "Ca",
+ "dt_xml_name": "Name",
+ "dt_xml_title": "Sername",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Xoser metin",
+ "importxml": "XML'i azere ke",
+ "dt_import_selectfile": "Azere kerdışi rê dosyay $1 weçinê",
+ "dt_import_encodingtype": "Babeta kod kerdışi",
+ "dt_import_skipexisting": "Çerme",
+ "dt_import_summarydesc": "Xulasaya azere kerdışi :",
+ "dt_import_editsummary": "{{ucfirst:$1}} azere de",
+ "dt_import_importing": "Dano azere...",
+ "importcsv": "TSV'yi azere de",
+ "right-datatransferimport": "Malumata zerre ke"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/dsb.json b/www/wiki/extensions/DataTransfer/i18n/dsb.json
new file mode 100644
index 00000000..889225e0
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/dsb.json
@@ -0,0 +1,37 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michawiki"
+ ]
+ },
+ "datatransfer-desc": "Zmóžnja importěrowanje a eksportěrowanje datow w zawołanjach pśedłogow",
+ "viewxml": "XML se woglědaś",
+ "dt_viewxml_docu": "Pšosym wubjeŕ, kótare slědujucych kategorijow a mjenjowych rumow maju se pokazaś w formaśe XML.",
+ "dt_viewxml_categories": "Kategorije",
+ "dt_viewxml_namespaces": "Mjenjowe rumy",
+ "dt_viewxml_simplifiedformat": "Zjadnorjony format",
+ "dt_xml_namespace": "Mjenjowy rum",
+ "dt_xml_pages": "Boki",
+ "dt_xml_page": "Bok",
+ "dt_xml_template": "Pśedłoga",
+ "dt_xml_field": "Pólo",
+ "dt_xml_name": "Mě",
+ "dt_xml_title": "Titel",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Lichy tekst",
+ "importxml": "XML importěrowaś",
+ "dt_import_selectfile": "Pšosym wubjeŕ dataju $1 za importěrowanje:",
+ "dt_import_encodingtype": "Typ znamuškowego koda:",
+ "dt_import_forexisting": "Za boki, kótarež južo ekistěruju:",
+ "dt_import_overwriteexisting": "Eksistěrujuce wopśimjeśe pśepisaś",
+ "dt_import_mergeintoexisting": "Jano póla pśepisaś, kótarež su w dataji wopśimjone.",
+ "dt_import_skipexisting": "Pśeskócyś",
+ "dt_import_appendtoexisting": "K eksistěrujucemu wopśimjeśoju pśipowjesyś",
+ "dt_import_summarydesc": "Zespominanje importa:",
+ "dt_import_editsummary": "Importěrowanje $1",
+ "dt_import_importing": "Importěrujo se...",
+ "dt_import_success": "$1 {{PLURAL:$1|bok twóri|boka twóritej|boki twórje|bokow twóri}} se z dataje $2.",
+ "importcsv": "Importěrowanje CSV",
+ "dt_importcsv_badheader": "Zmólka: głowa słupa $1, '$2', musy pak '$3', '$4' byś pak formu 'mě_pśedłogi[mě_póla]' měś",
+ "right-datatransferimport": "Daty importěrowaś"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ee.json b/www/wiki/extensions/DataTransfer/i18n/ee.json
new file mode 100644
index 00000000..a4eef5f3
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ee.json
@@ -0,0 +1,4 @@
+{
+ "@metadata": [],
+ "dt_xml_page": "Axa"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/el.json b/www/wiki/extensions/DataTransfer/i18n/el.json
new file mode 100644
index 00000000..647a9a2f
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/el.json
@@ -0,0 +1,34 @@
+{
+ "@metadata": {
+ "authors": [
+ "Consta",
+ "Crazymadlover",
+ "Glavkos",
+ "Omnipaedista",
+ "ZaDiak",
+ "Nikosgranturismogt"
+ ]
+ },
+ "viewxml": "Προβολή XML",
+ "dt_viewxml_categories": "Κατηγορίες",
+ "dt_viewxml_namespaces": "Περιοχές ονομάτων",
+ "dt_xml_namespace": "Ονοματοχώρος",
+ "dt_xml_pages": "Σελίδες",
+ "dt_xml_page": "Σελίδα",
+ "dt_xml_template": "Πρότυπο",
+ "dt_xml_field": "Πεδίο",
+ "dt_xml_name": "Όνομα",
+ "dt_xml_title": "Τίτλος",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Ελεύθερο Κείμενο",
+ "importxml": "Εισαγωγή σε XML",
+ "dt_import_selectfile": "Παρακαλούμε επιλέξτε το αρχείο $1 για εισαγωγή:",
+ "dt_import_encodingtype": "Τύπος κωδικοποίησης",
+ "dt_import_forexisting": "Για σελίδες που υπάρχουν ήδη:",
+ "dt_import_skipexisting": "Παράβλεψη",
+ "dt_import_summarydesc": "Σύνοψη εισαγωγής:",
+ "dt_import_editsummary": "{{ucfirst:$1}} εισαγωγή",
+ "dt_import_importing": "Εισάγεται...",
+ "importcsv": "Εισαγωγή CSV",
+ "right-datatransferimport": "Εισαγωγή δεδομένων"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/en.json b/www/wiki/extensions/DataTransfer/i18n/en.json
new file mode 100644
index 00000000..46995176
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/en.json
@@ -0,0 +1,41 @@
+{
+ "@metadata": {
+ "authors": [
+ "Yaron Koren"
+ ]
+ },
+ "datatransfer-desc": "Allows for importing and exporting data contained in template calls",
+ "viewxml": "View XML",
+ "dt_viewxml_docu": "Please select among the following categories and namespaces to view in XML format.",
+ "dt_viewxml_categories": "Categories",
+ "dt_viewxml_namespaces": "Namespaces",
+ "dt_viewxml_simplifiedformat": "Simplified format",
+ "dt_xml_namespace": "Namespace",
+ "dt_xml_pages": "Pages",
+ "dt_xml_page": "Page",
+ "dt_xml_template": "Template",
+ "dt_xml_field": "Field",
+ "dt_xml_name": "Name",
+ "dt_xml_title": "Title",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Free Text",
+ "importxml": "Import XML",
+ "dt_import_selectfile": "Please select the $1 file to import:",
+ "dt_import_encodingtype": "Encoding type:",
+ "dt_import_forexisting": "For pages that already exist:",
+ "dt_import_overwriteexisting": "Overwrite existing content",
+ "dt_import_mergeintoexisting": "Overwrite only fields contained in the file",
+ "dt_import_skipexisting": "Skip",
+ "dt_import_appendtoexisting": "Append to existing content",
+ "dt_import_summarydesc": "Summary of import:",
+ "dt_import_editsummary": "{{ucfirst:$1}} import",
+ "dt_import_importing": "Importing...",
+ "dt_import_success": "$1 {{PLURAL:$1|page|pages}} will be created from the $2 file.",
+ "importcsv": "Import CSV",
+ "importspreadsheet": "Import spreadsheet",
+ "dt_importcsv_badheader": "Error: the column $1 header, '$2', must be either '$3', '$4' or of the form 'template_name[field_name]'",
+ "right-datatransferimport": "Import data",
+ "dt_filetype_xml": "XML",
+ "dt_filetype_csv": "CSV",
+ "dt_filetype_spreadsheet": "spreadsheet"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/eo.json b/www/wiki/extensions/DataTransfer/i18n/eo.json
new file mode 100644
index 00000000..12b3a5a4
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/eo.json
@@ -0,0 +1,33 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michawiki",
+ "Yekrats",
+ "Robin van der Vliet",
+ "Psychoslave",
+ "Lucas"
+ ]
+ },
+ "datatransfer-desc": "Permesas enportadon kaj elportadon de datumoj enhave en ŝablonaj vokoj",
+ "viewxml": "Vidi XML-on",
+ "dt_viewxml_docu": "Bonvolu elekti inter la subaj kategorioj kaj nomspacoj por rigardi en XML-formato.",
+ "dt_viewxml_categories": "Kategorioj",
+ "dt_viewxml_namespaces": "Nomspacoj",
+ "dt_viewxml_simplifiedformat": "Simpligita formato",
+ "dt_xml_namespace": "Nomspaco",
+ "dt_xml_pages": "Paĝoj",
+ "dt_xml_page": "Paĝo",
+ "dt_xml_template": "Ŝablono",
+ "dt_xml_field": "Kampo",
+ "dt_xml_name": "Nomo",
+ "dt_xml_title": "Titolo",
+ "dt_xml_id": "identigo",
+ "dt_xml_freetext": "Libera Teksto",
+ "importxml": "Importi XML",
+ "dt_import_editsummary": "{{ucfirst:$1}}-enporto",
+ "dt_import_importing": "Enportante...",
+ "importcsv": "Importi CSV",
+ "importspreadsheet": "Importi kalkultabelon",
+ "right-datatransferimport": "Importi datenojn",
+ "dt_filetype_spreadsheet": "kalkultabelo"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/es.json b/www/wiki/extensions/DataTransfer/i18n/es.json
new file mode 100644
index 00000000..05e5559c
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/es.json
@@ -0,0 +1,48 @@
+{
+ "@metadata": {
+ "authors": [
+ "Armando-Martin",
+ "Crazymadlover",
+ "Fitoschido",
+ "Imre",
+ "Locos epraix",
+ "Peter17",
+ "Sanbec",
+ "Translationista",
+ "VegaDark",
+ "Macofe"
+ ]
+ },
+ "datatransfer-desc": "Permite importar y exportar datos contenidos en llamadas de plantilla",
+ "viewxml": "Ver XML",
+ "dt_viewxml_docu": "Selecciona entre las siguientes categorías y espacios de nombres para ver en formato XML.",
+ "dt_viewxml_categories": "Categorías",
+ "dt_viewxml_namespaces": "Espacios de nombres",
+ "dt_viewxml_simplifiedformat": "Formato simplificado",
+ "dt_xml_namespace": "Espacio de nombres",
+ "dt_xml_pages": "Páginas",
+ "dt_xml_page": "Página",
+ "dt_xml_template": "Plantilla",
+ "dt_xml_field": "Campo",
+ "dt_xml_name": "Nombre",
+ "dt_xml_title": "Título",
+ "dt_xml_id": "Id.",
+ "dt_xml_freetext": "Texto libre",
+ "importxml": "Importar XML",
+ "dt_import_selectfile": "Selecciona el archivo $1 que importar:",
+ "dt_import_encodingtype": "Tipo de codificación:",
+ "dt_import_forexisting": "Para las páginas que ya existen:",
+ "dt_import_overwriteexisting": "Sobrescribir el contenido existente",
+ "dt_import_mergeintoexisting": "Sobrescribir solo los campos contenidos en el archivo",
+ "dt_import_skipexisting": "Omitir",
+ "dt_import_appendtoexisting": "Anexar al contenido existente",
+ "dt_import_summarydesc": "Resumen de importación:",
+ "dt_import_editsummary": "importación {{ucfirst:$1}}",
+ "dt_import_importing": "Importando...",
+ "dt_import_success": "$1 {{PLURAL:$1|página se creará|páginas se crearán}} del archivo $2.",
+ "importcsv": "Importar CSV",
+ "importspreadsheet": "Importar hoja de cálculo",
+ "dt_importcsv_badheader": "Error: el título de columna $1, \"$2\", tiene que ser \"$3\", \"$4\" o de la forma 'nombre_de_plantilla[nombre_del_campo]'",
+ "right-datatransferimport": "Importar datos",
+ "dt_filetype_spreadsheet": "hoja de cálculo"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/et.json b/www/wiki/extensions/DataTransfer/i18n/et.json
new file mode 100644
index 00000000..a0c2b96b
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/et.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Avjoska",
+ "Pikne"
+ ]
+ },
+ "dt_viewxml_categories": "Kategooriad",
+ "dt_viewxml_namespaces": "Nimeruumid",
+ "dt_viewxml_simplifiedformat": "Lihtsustatud vorming",
+ "dt_xml_namespace": "Nimeruum",
+ "dt_xml_pages": "Leheküljed",
+ "dt_xml_page": "Lehekülg",
+ "dt_xml_template": "Mall",
+ "dt_xml_field": "Väli",
+ "dt_xml_name": "Nimi",
+ "dt_xml_title": "Pealkiri",
+ "dt_xml_id": "ID",
+ "dt_import_skipexisting": "Jäta vahele",
+ "dt_import_importing": "Importimine...",
+ "right-datatransferimport": "Impordiandmed"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/eu.json b/www/wiki/extensions/DataTransfer/i18n/eu.json
new file mode 100644
index 00000000..26cc67a1
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/eu.json
@@ -0,0 +1,40 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kobazulo",
+ "Theklan",
+ "පසිඳු කාවින්ද",
+ "Xabier Armendaritz",
+ "An13sa",
+ "Subi"
+ ]
+ },
+ "viewxml": "XML ikusi",
+ "dt_viewxml_categories": "Kategoriak",
+ "dt_viewxml_namespaces": "Izen-tarteak",
+ "dt_viewxml_simplifiedformat": "Formatu sinplifikatua",
+ "dt_xml_namespace": "Izen-tartea",
+ "dt_xml_pages": "Orrialdeak",
+ "dt_xml_page": "Orria",
+ "dt_xml_template": "Txantiloia",
+ "dt_xml_field": "Eremua",
+ "dt_xml_name": "Izena",
+ "dt_xml_title": "Izenburua",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Testu askea",
+ "importxml": "XML inportatu",
+ "dt_import_selectfile": "Mesedez, aukera ezazu inportatzeko $1 fitxategia:",
+ "dt_import_encodingtype": "Kodetze mota:",
+ "dt_import_forexisting": "Jada existitzen diren orrialdeak:",
+ "dt_import_overwriteexisting": "Jada existitzen den eduki bat gainidatzi",
+ "dt_import_mergeintoexisting": "Fitxategian dauden eremuak bakarrik gain-idatzi",
+ "dt_import_skipexisting": "Utzi",
+ "dt_import_appendtoexisting": "Jada baden edukiari gehitu",
+ "dt_import_summarydesc": "Inportatze laburpena:",
+ "dt_import_editsummary": "{{ucfirst:$1}} inportatu",
+ "dt_import_importing": "Inportatzen...",
+ "dt_import_success": "{{PLURAL:$1|Orri bat sortuko da|$1 orri sortuko dira}} $2 fitxategitik.",
+ "importcsv": "CSV inportatu",
+ "right-datatransferimport": "Datuak inportatu",
+ "dt_filetype_spreadsheet": "kalkulu-orria"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/fa.json b/www/wiki/extensions/DataTransfer/i18n/fa.json
new file mode 100644
index 00000000..56da6c2d
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/fa.json
@@ -0,0 +1,39 @@
+{
+ "@metadata": {
+ "authors": [
+ "Armin1392",
+ "Mjbmr",
+ "Alirezaaa"
+ ]
+ },
+ "datatransfer-desc": "اجازه برای واردات و صادرات اطلاعات حاوی الگوهای تماس",
+ "viewxml": "مشاهده XML",
+ "dt_viewxml_docu": "لطفاً برای مشاهده فرمت ایکس‌ام‌ال، از بین دسته‌بندی‌ها و فضاهای نامی زیر انتخاب کنید.",
+ "dt_viewxml_categories": "رده‌ها",
+ "dt_viewxml_namespaces": "فضاهای نام",
+ "dt_viewxml_simplifiedformat": "فرمت ساده شده",
+ "dt_xml_namespace": "فضای نام",
+ "dt_xml_pages": "صفحات",
+ "dt_xml_page": "صفحه",
+ "dt_xml_template": "الگو",
+ "dt_xml_field": "زمینه",
+ "dt_xml_name": "نام",
+ "dt_xml_title": "عنوان",
+ "dt_xml_id": "شناسه",
+ "dt_xml_freetext": "متن آزاد",
+ "importxml": "درون‌ریزی ایکس‌ام‌ال",
+ "dt_import_selectfile": "لطفاً برای وارد کردن،پوشهٔ $1 را انتخاب کنید:",
+ "dt_import_encodingtype": "نوع کدگذاری:",
+ "dt_import_forexisting": "برای صفحاتی که در حال حاضر وجود دارند:",
+ "dt_import_overwriteexisting": "رونویسی محتوای موجود",
+ "dt_import_mergeintoexisting": "رونویسی فقط زمینه‌های شامل در پوشه",
+ "dt_import_skipexisting": "پرش",
+ "dt_import_appendtoexisting": "ضمیمه کردن به محتوای موجود",
+ "dt_import_summarydesc": "خلاصهٔ درون‌ریزی:",
+ "dt_import_editsummary": "درون‌ریزی $1",
+ "dt_import_importing": "در حال درون‌ریزی...",
+ "dt_import_success": "$1 {{PLURAL:$1|page|pages}} از پوشهٔ $2 ایجاد خواهدشد.",
+ "importcsv": "درون‌ریزی سی‌اس‌وی",
+ "dt_importcsv_badheader": "خطا: سر فصل ستون $1،$2، باید یا $3،$4 یا فرم 'template_name[field_name]' باشد",
+ "right-datatransferimport": "درون‌ریزی داده‌ها"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/fi.json b/www/wiki/extensions/DataTransfer/i18n/fi.json
new file mode 100644
index 00000000..bb164d2f
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/fi.json
@@ -0,0 +1,42 @@
+{
+ "@metadata": {
+ "authors": [
+ "Centerlink",
+ "Crt",
+ "Nedergard",
+ "Nike",
+ "Str4nd",
+ "Vililikku",
+ "McSalama"
+ ]
+ },
+ "datatransfer-desc": "Mahdollistaa tuoda ja viedä dataa, joka on mallinekutsuissa.",
+ "viewxml": "Näytä XML",
+ "dt_viewxml_docu": "Valitse yksi seuraavista luokista ja nimiavaruuksista tarkasteltavaksi XML-muodossa.",
+ "dt_viewxml_categories": "Luokat",
+ "dt_viewxml_namespaces": "Nimiavaruudet",
+ "dt_viewxml_simplifiedformat": "Yksinkertaistettu muoto",
+ "dt_xml_namespace": "Nimiavaruus",
+ "dt_xml_pages": "Sivut",
+ "dt_xml_page": "Sivu",
+ "dt_xml_template": "Malline",
+ "dt_xml_field": "Kenttä",
+ "dt_xml_name": "Nimi",
+ "dt_xml_title": "Otsikko",
+ "dt_xml_id": "Tunniste",
+ "dt_xml_freetext": "Vapaa teksti",
+ "importxml": "XML-tuonti",
+ "dt_import_selectfile": "Valitse $1-tiedosto tuotavaksi:",
+ "dt_import_encodingtype": "Merkistötyyppi:",
+ "dt_import_forexisting": "Nykyisille sivuille:",
+ "dt_import_overwriteexisting": "Korvaa nykyinen sisältö",
+ "dt_import_skipexisting": "Ohita",
+ "dt_import_appendtoexisting": "Liitä nykyiseen sisältöön",
+ "dt_import_summarydesc": "Tuonnin yhteenveto",
+ "dt_import_editsummary": "{{ucfirst:$1}} tuo",
+ "dt_import_importing": "Tuodaan...",
+ "dt_import_success": "$1 {{PLURAL:$1|sivu|sivua}} luodaan $2-tiedostosta.",
+ "importcsv": "CSV-tuonti",
+ "dt_importcsv_badheader": "Virhe: sarake $1 otsake, '$2', on oltava joko '$3', '$4' tai muotoa 'mallinne_nimi[kenttä_nimi]'",
+ "right-datatransferimport": "Tuoda tiedot"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/fr.json b/www/wiki/extensions/DataTransfer/i18n/fr.json
new file mode 100644
index 00000000..15e29c7a
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/fr.json
@@ -0,0 +1,47 @@
+{
+ "@metadata": {
+ "authors": [
+ "Crochet.david",
+ "Grondin",
+ "IAlex",
+ "Metroitendo",
+ "Peter17",
+ "PieRRoMaN",
+ "Verdy p",
+ "Zetud",
+ "Gomoko"
+ ]
+ },
+ "datatransfer-desc": "Permet l’import et l’export de données contenues dans des appels de modèles",
+ "viewxml": "Voir XML",
+ "dt_viewxml_docu": "Veuillez sélectionner parmi les catégories et les espaces de noms suivants afin de visionner au format XML.",
+ "dt_viewxml_categories": "Catégories",
+ "dt_viewxml_namespaces": "Espaces de noms",
+ "dt_viewxml_simplifiedformat": "Format simplifié",
+ "dt_xml_namespace": "Espace de noms",
+ "dt_xml_pages": "Pages",
+ "dt_xml_page": "Page",
+ "dt_xml_template": "Modèle",
+ "dt_xml_field": "Champ",
+ "dt_xml_name": "Nom",
+ "dt_xml_title": "Titre",
+ "dt_xml_id": "Identifiant",
+ "dt_xml_freetext": "Texte libre",
+ "importxml": "Import en XML",
+ "dt_import_selectfile": "Veuillez sélectionner le fichier $1 à importer :",
+ "dt_import_encodingtype": "Type d’encodage:",
+ "dt_import_forexisting": "Pour les pages qui existent déjà :",
+ "dt_import_overwriteexisting": "Remplacer le contenu existant",
+ "dt_import_mergeintoexisting": "Remplacer uniquement les champs contenus dans le fichier",
+ "dt_import_skipexisting": "Passer",
+ "dt_import_appendtoexisting": "Ajouter au contenu existant",
+ "dt_import_summarydesc": "Résumé de l’import :",
+ "dt_import_editsummary": "importer en {{ucfirst:$1}}",
+ "dt_import_importing": "Import en cours...",
+ "dt_import_success": "$1 {{PLURAL:$1|page sera créée|pages seront créées}} depuis le fichier $2.",
+ "importcsv": "Import CSV",
+ "importspreadsheet": "Importer la feuille de calcul",
+ "dt_importcsv_badheader": "Erreur : le titre de colonne $1, « $2 », doit être soit « $3 », « $4 » ou de la forme « nom_du_modèle[nom_du_champ] »",
+ "right-datatransferimport": "Importer des données",
+ "dt_filetype_spreadsheet": "feuille de calcul"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/frp.json b/www/wiki/extensions/DataTransfer/i18n/frp.json
new file mode 100644
index 00000000..4e02903b
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/frp.json
@@ -0,0 +1,34 @@
+{
+ "@metadata": {
+ "authors": [
+ "Cedric31",
+ "ChrisPtDe"
+ ]
+ },
+ "viewxml": "Vêre XML",
+ "dt_viewxml_categories": "Catègories",
+ "dt_viewxml_namespaces": "Èspâços de noms",
+ "dt_viewxml_simplifiedformat": "Format simplifiâ",
+ "dt_xml_namespace": "Èspâço de noms",
+ "dt_xml_pages": "Pâges",
+ "dt_xml_page": "Pâge",
+ "dt_xml_template": "Modèlo",
+ "dt_xml_field": "Champ",
+ "dt_xml_name": "Nom",
+ "dt_xml_title": "Titro",
+ "dt_xml_id": "Numerô",
+ "dt_xml_freetext": "Tèxto libro",
+ "importxml": "Importar un XML",
+ "dt_import_selectfile": "Volyéd chouèsir lo fichiér $1 a importar :",
+ "dt_import_encodingtype": "Tipo d’encodâjo :",
+ "dt_import_forexisting": "Por les pâges qu’ègzistont ja :",
+ "dt_import_overwriteexisting": "Ècllafar lo contegnu ègzistent",
+ "dt_import_skipexisting": "Passar",
+ "dt_import_appendtoexisting": "Apondre u contegnu ègzistent",
+ "dt_import_summarydesc": "Rèsumâ de l’importacion :",
+ "dt_import_editsummary": "Importacion de $1",
+ "dt_import_importing": "Importacion en cors...",
+ "dt_import_success": "$1 {{PLURAL:$1|pâge serat fêta|pâges seront fêtes}} dês lo fichiér $2.",
+ "importcsv": "Importar des balyês CSV",
+ "right-datatransferimport": "Importar des balyês"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/fy.json b/www/wiki/extensions/DataTransfer/i18n/fy.json
new file mode 100644
index 00000000..75d8cbf9
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/fy.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "Snakesteuben",
+ "Robin0van0der0vliet",
+ "Robin van der Vliet"
+ ]
+ },
+ "dt_viewxml_categories": "Kategoryen",
+ "dt_viewxml_namespaces": "Nammeromten",
+ "dt_xml_namespace": "Nammeromte",
+ "dt_xml_page": "Side",
+ "dt_xml_name": "Namme"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ga.json b/www/wiki/extensions/DataTransfer/i18n/ga.json
new file mode 100644
index 00000000..971c2b17
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ga.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "Alison",
+ "පසිඳු කාවින්ද"
+ ]
+ },
+ "dt_viewxml_categories": "Catagóirí",
+ "dt_xml_namespace": "Ainmspás",
+ "dt_xml_pages": "Leathanaigh",
+ "dt_xml_page": "Leathanach",
+ "dt_xml_template": "Teimpléad",
+ "dt_xml_name": "Ainm",
+ "dt_xml_title": "Teideal"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/gl.json b/www/wiki/extensions/DataTransfer/i18n/gl.json
new file mode 100644
index 00000000..9c127743
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/gl.json
@@ -0,0 +1,42 @@
+{
+ "@metadata": {
+ "authors": [
+ "Alma",
+ "Toliño",
+ "Elisardojm",
+ "Banjo"
+ ]
+ },
+ "datatransfer-desc": "Permite importar e exportar datos contidos en chamadas de modelos",
+ "viewxml": "Ver XML",
+ "dt_viewxml_docu": "Por favor seleccione entre as seguintes categorías e espazos de nomes para ver en formato XML.",
+ "dt_viewxml_categories": "Categorías",
+ "dt_viewxml_namespaces": "Espazos de nomes",
+ "dt_viewxml_simplifiedformat": "Formato simplificado",
+ "dt_xml_namespace": "Espazo de nomes",
+ "dt_xml_pages": "Páxinas",
+ "dt_xml_page": "Páxina",
+ "dt_xml_template": "Modelo",
+ "dt_xml_field": "Campo",
+ "dt_xml_name": "Nome",
+ "dt_xml_title": "Título",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Texto libre",
+ "importxml": "Importar XML",
+ "dt_import_selectfile": "Por favor, seleccione o ficheiro $1 a importar:",
+ "dt_import_encodingtype": "Tipo de codificación:",
+ "dt_import_forexisting": "Para páxinas que xa existen:",
+ "dt_import_overwriteexisting": "Sobrescribir o contido existente",
+ "dt_import_mergeintoexisting": "Sobrescribir só os campos contidos no ficheiro",
+ "dt_import_skipexisting": "Omitir",
+ "dt_import_appendtoexisting": "Engadir ao contido existente",
+ "dt_import_summarydesc": "Resumo da importación:",
+ "dt_import_editsummary": "Importación de {{ucfirst:$1}}",
+ "dt_import_importing": "Importando...",
+ "dt_import_success": "{{PLURAL:$1|Unha páxina será creada|$1 páxinas serán creadas}} a partir do ficheiro $2.",
+ "importcsv": "Importación en CSV",
+ "importspreadsheet": "Importar folla de cálculo",
+ "dt_importcsv_badheader": "Erro: a cabeceira da columna $1, \"$2\", debe ser un \"$3\", \"$4\" ou do formulario \"template_name[field_name]\"",
+ "right-datatransferimport": "Importar datos",
+ "dt_filetype_spreadsheet": "folla de cálculo"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/got.json b/www/wiki/extensions/DataTransfer/i18n/got.json
new file mode 100644
index 00000000..54292635
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/got.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jocke Pirat",
+ "Gothicspeaker"
+ ]
+ },
+ "dt_xml_namespace": "𐌽𐌰𐌼𐌰𐍂𐌿𐌼"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/grc.json b/www/wiki/extensions/DataTransfer/i18n/grc.json
new file mode 100644
index 00000000..51d6e80a
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/grc.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "Crazymadlover",
+ "Omnipaedista"
+ ]
+ },
+ "dt_viewxml_categories": "Κατηγορίαι",
+ "dt_viewxml_namespaces": "Ὀνοματεῖα",
+ "dt_xml_namespace": "Ὀνοματεῖον",
+ "dt_xml_pages": "Δέλτοι",
+ "dt_xml_page": "Δέλτος",
+ "dt_xml_template": "Πρότυπον",
+ "dt_xml_field": "Πεδίον",
+ "dt_xml_name": "Ὄνομα",
+ "dt_xml_title": "Ἐπιγραφή",
+ "dt_xml_freetext": "Ἐλεύθερον κείμενον"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/gsw.json b/www/wiki/extensions/DataTransfer/i18n/gsw.json
new file mode 100644
index 00000000..b6e011f3
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/gsw.json
@@ -0,0 +1,37 @@
+{
+ "@metadata": {
+ "authors": [
+ "Als-Holder",
+ "J. 'mach' wust"
+ ]
+ },
+ "datatransfer-desc": "Macht dr Import un dr Export vu strukturierte Date megli, wu in Ufrief vu Vorlage bruucht wäre.",
+ "viewxml": "XML aaluege",
+ "dt_viewxml_docu": "Bitte wehl uus, weli Kategorien un Namensryym im XML-Format solle aazeigt wäre.",
+ "dt_viewxml_categories": "Kategorie",
+ "dt_viewxml_namespaces": "Namensryym",
+ "dt_viewxml_simplifiedformat": "Vereifacht Format",
+ "dt_xml_namespace": "Namensruum",
+ "dt_xml_pages": "Syte",
+ "dt_xml_page": "Syte",
+ "dt_xml_template": "Vorlag",
+ "dt_xml_field": "Fäld",
+ "dt_xml_name": "Name",
+ "dt_xml_title": "Titel",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Freje Täxt",
+ "importxml": "XML importiere",
+ "dt_import_selectfile": "Bitte wehl d $1-Datei zum importiere uus:",
+ "dt_import_encodingtype": "Verschlisseligstyp:",
+ "dt_import_forexisting": "Im Fall vu Syte, wu s scho git:",
+ "dt_import_overwriteexisting": "Vorhandene Inhalt iberschryybe",
+ "dt_import_skipexisting": "Ibergumpe",
+ "dt_import_appendtoexisting": "Vorhandene Inhalt ergänze",
+ "dt_import_summarydesc": "Zämmefassig vum Import:",
+ "dt_import_editsummary": "$1-Import",
+ "dt_import_importing": "Am Importiere ...",
+ "dt_import_success": "$1 {{PLURAL:$1|Syte|Syte}} wäre us dr $2-Datei aagleit.",
+ "importcsv": "CSV-Datei importiere",
+ "dt_importcsv_badheader": "Fähler: d Spalte $1 Iberschrift, '$2', muess entwäder '$3', '$4' syy oder us em Format 'template_name[field_name]'",
+ "right-datatransferimport": "Date importiere"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/gv.json b/www/wiki/extensions/DataTransfer/i18n/gv.json
new file mode 100644
index 00000000..4c9e5f7b
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/gv.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "MacTire02"
+ ]
+ },
+ "viewxml": "Jeeagh er XML",
+ "dt_viewxml_categories": "Ronnaghyn",
+ "dt_xml_page": "Duillag",
+ "dt_xml_name": "Ennym",
+ "dt_xml_title": "Ard-ennym",
+ "dt_xml_freetext": "Teks seyr"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ha.json b/www/wiki/extensions/DataTransfer/i18n/ha.json
new file mode 100644
index 00000000..189d5659
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ha.json
@@ -0,0 +1,5 @@
+{
+ "@metadata": [],
+ "dt_xml_namespace": "Sararin suna",
+ "dt_xml_page": "Shafi"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/haw.json b/www/wiki/extensions/DataTransfer/i18n/haw.json
new file mode 100644
index 00000000..20a735bc
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/haw.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Singularity"
+ ]
+ },
+ "dt_xml_page": "‘Ao‘ao",
+ "dt_xml_name": "Inoa"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/he.json b/www/wiki/extensions/DataTransfer/i18n/he.json
new file mode 100644
index 00000000..bd1de980
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/he.json
@@ -0,0 +1,42 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Rotemliss",
+ "YaronSh",
+ "Guycn2"
+ ]
+ },
+ "datatransfer-desc": "מתן אפשרות לייבא ולייצא נתונים בקריאות לתבניות",
+ "viewxml": "הצגת XML",
+ "dt_viewxml_docu": "יש לבחור את הקטגוריות ואת מרחבי השם שיוצגו בפורמט XML.",
+ "dt_viewxml_categories": "קטגוריות",
+ "dt_viewxml_namespaces": "מרחבי שם",
+ "dt_viewxml_simplifiedformat": "מבנה מפושט",
+ "dt_xml_namespace": "מרחב שם",
+ "dt_xml_pages": "דפים",
+ "dt_xml_page": "דף",
+ "dt_xml_template": "תבנית",
+ "dt_xml_field": "שדה",
+ "dt_xml_name": "שם",
+ "dt_xml_title": "כותרת",
+ "dt_xml_id": "מזהה (ID)",
+ "dt_xml_freetext": "טקסט חופשי",
+ "importxml": "ייבוא XML",
+ "dt_import_selectfile": "נא לבחור את קובץ ה־$1 לייבוא:",
+ "dt_import_encodingtype": "סוג הקידוד:",
+ "dt_import_forexisting": "עבור הדפים שכבר קיימים:",
+ "dt_import_overwriteexisting": "לדרוס את התוכן הקיים",
+ "dt_import_mergeintoexisting": "לדרוס רק שדות שהקובץ מכיל",
+ "dt_import_skipexisting": "לדלג",
+ "dt_import_appendtoexisting": "לצרף את התוכן הקיים",
+ "dt_import_summarydesc": "תקציר היבוא:",
+ "dt_import_editsummary": "ייבוא של {{ucfirst:$1}}",
+ "dt_import_importing": "מתבצע יבוא...",
+ "dt_import_success": "{{PLURAL:$1|דף אחד ייווצר|$1 דפים ייווצרו}} מקובץ ה־$2.",
+ "importcsv": "יבוא CSV",
+ "importspreadsheet": "גיליון נתונים של ייבוא",
+ "dt_importcsv_badheader": "שגיאה: כותרת העמודה $1, '$2', חייבת להיות או '$3', '$4' או מהצורה 'שם_התבנית[שם_השדה]'",
+ "right-datatransferimport": "ייבוא נתונים",
+ "dt_filetype_spreadsheet": "גיליון נתונים"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/hi.json b/www/wiki/extensions/DataTransfer/i18n/hi.json
new file mode 100644
index 00000000..181ea301
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/hi.json
@@ -0,0 +1,29 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ansumang",
+ "Kaustubh",
+ "Siddhartha Ghai",
+ "Sfic",
+ "Rajat11"
+ ]
+ },
+ "datatransfer-desc": "टेम्प्लेट कॉल में उपलब्ध डाटाकी आयात-निर्यात करने की अनुमति देता हैं",
+ "viewxml": "XML देखें",
+ "dt_viewxml_docu": "कॄपया XML में देखने के लिये श्रेणीयाँ और नामस्थान चुनें।",
+ "dt_viewxml_categories": "श्रेणियाँ",
+ "dt_viewxml_namespaces": "नामस्थान",
+ "dt_viewxml_simplifiedformat": "आसान फॉरमैट",
+ "dt_xml_namespace": "नामस्थान",
+ "dt_xml_pages": "पृष्ठ",
+ "dt_xml_page": "पन्ना",
+ "dt_xml_template": "साँचा",
+ "dt_xml_field": "फ़ील्ड",
+ "dt_xml_name": "नाम",
+ "dt_xml_title": "शीर्षक",
+ "dt_xml_id": "आईडी",
+ "dt_xml_freetext": "मुक्त पाठ",
+ "dt_import_skipexisting": "छोड़ें",
+ "dt_import_editsummary": "{{ucfirst:$1}} आयात",
+ "right-datatransferimport": "डेटा आयात करें"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/hr.json b/www/wiki/extensions/DataTransfer/i18n/hr.json
new file mode 100644
index 00000000..9347643d
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/hr.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dalibor Bosits"
+ ]
+ },
+ "dt_viewxml_categories": "Kategorije",
+ "dt_xml_namespace": "Imenski prostor",
+ "dt_xml_page": "Stranica"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/hsb.json b/www/wiki/extensions/DataTransfer/i18n/hsb.json
new file mode 100644
index 00000000..c711906b
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/hsb.json
@@ -0,0 +1,37 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michawiki"
+ ]
+ },
+ "datatransfer-desc": "Dowola importowanje a eksportowanje datow, kotrež su we wołanjach předłohow wobsahowane",
+ "viewxml": "XML wobhladać",
+ "dt_viewxml_docu": "Prošu wubjer ze slědowacych kategorijow a mjenowych rumow, zo by w XML-formaće wobhladał.",
+ "dt_viewxml_categories": "Kategorije",
+ "dt_viewxml_namespaces": "Mjenowe rumy",
+ "dt_viewxml_simplifiedformat": "Zjednorjeny format",
+ "dt_xml_namespace": "Mjenowy rum",
+ "dt_xml_pages": "Strony",
+ "dt_xml_page": "Strona",
+ "dt_xml_template": "Předłoha",
+ "dt_xml_field": "Polo",
+ "dt_xml_name": "Mjeno",
+ "dt_xml_title": "Titul",
+ "dt_xml_id": "Id",
+ "dt_xml_freetext": "Swobodny tekst",
+ "importxml": "XML importować",
+ "dt_import_selectfile": "Prošu wubjer dataju $1 za importowanje:",
+ "dt_import_encodingtype": "Typ znamješkoweho koda:",
+ "dt_import_forexisting": "Za strony, kotrež hižo eksistuja:",
+ "dt_import_overwriteexisting": "Eksistowacy wobsah přepisać",
+ "dt_import_mergeintoexisting": "Jenož pola přepisać, kotrež su w dataji wobsahowane.",
+ "dt_import_skipexisting": "Přeskočić",
+ "dt_import_appendtoexisting": "K eksistowacemu wobsahej připowěsnyć",
+ "dt_import_summarydesc": "Zjeće importa:",
+ "dt_import_editsummary": "Importowanje $1",
+ "dt_import_importing": "Importuje so...",
+ "dt_import_success": "$1 {{PLURAL:$1|strona so z dataje $2 twori|stronje so z dataje $2 tworitej|strony so z dataje $2 tworja|stronow so z dataje $2 twori}}.",
+ "importcsv": "Importowanje CSV",
+ "dt_importcsv_badheader": "Zmylk: hłowa špalty $1, '$2', dyrbi pak '$3', '$4' być pak formu 'mjeno_předłohi[mjeno_pola]' měć",
+ "right-datatransferimport": "Daty importować"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/hu.json b/www/wiki/extensions/DataTransfer/i18n/hu.json
new file mode 100644
index 00000000..49ae99c8
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/hu.json
@@ -0,0 +1,38 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dani",
+ "Dj",
+ "Glanthor Reviol"
+ ]
+ },
+ "datatransfer-desc": "Lehetővé teszi a sablonhívásokban található adatok importálását és exportálását",
+ "viewxml": "XML megtekintése",
+ "dt_viewxml_docu": "Válaszd ki a kategóriák és a névterek közül azt, amelyiket meg akarod tekinteni XML formátumban.",
+ "dt_viewxml_categories": "Kategóriák",
+ "dt_viewxml_namespaces": "Névterek",
+ "dt_viewxml_simplifiedformat": "Egyszerűsített formátum",
+ "dt_xml_namespace": "Névtér",
+ "dt_xml_pages": "Lapok",
+ "dt_xml_page": "Lap",
+ "dt_xml_template": "Sablon",
+ "dt_xml_field": "Mező",
+ "dt_xml_name": "Név",
+ "dt_xml_title": "Cím",
+ "dt_xml_id": "Azonosító",
+ "dt_xml_freetext": "Szabad szöveg",
+ "importxml": "XML importálás",
+ "dt_import_selectfile": "Kérlek válaszd ki az importálandó $1 fájlt:",
+ "dt_import_encodingtype": "Kódolás típusa:",
+ "dt_import_forexisting": "Már létező lapok esetén:",
+ "dt_import_overwriteexisting": "Meglévő tartalom felülírása",
+ "dt_import_skipexisting": "Kihagyás",
+ "dt_import_appendtoexisting": "Hozzáfűzés a meglévő tartalomhoz",
+ "dt_import_summarydesc": "Az importálás összefoglalója:",
+ "dt_import_editsummary": "$1 importálás",
+ "dt_import_importing": "Importálás…",
+ "dt_import_success": "{{PLURAL:$1|egy|$1}} lap fog készülni a(z) $2 fájlból.",
+ "importcsv": "CSV importálása",
+ "dt_importcsv_badheader": "Hiba: a(z) $1 oszlop fejlécének („$2”) vagy „$3”, „$4”, vagy pedig „sablonnév[mezőnév]” formátumúnak kell lennie",
+ "right-datatransferimport": "Adatok importálása"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ia.json b/www/wiki/extensions/DataTransfer/i18n/ia.json
new file mode 100644
index 00000000..117b666f
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ia.json
@@ -0,0 +1,39 @@
+{
+ "@metadata": {
+ "authors": [
+ "McDutchie"
+ ]
+ },
+ "datatransfer-desc": "Permitte importar e exportar datos continite in appellos a patronos",
+ "viewxml": "Vider XML",
+ "dt_viewxml_docu": "Per favor selige inter le sequente categorias e spatios de nomines pro vider in formato XML.",
+ "dt_viewxml_categories": "Categorias",
+ "dt_viewxml_namespaces": "Spatios de nomines",
+ "dt_viewxml_simplifiedformat": "Formato simplificate",
+ "dt_xml_namespace": "Spatio de nomines",
+ "dt_xml_pages": "Paginas",
+ "dt_xml_page": "Pagina",
+ "dt_xml_template": "Patrono",
+ "dt_xml_field": "Campo",
+ "dt_xml_name": "Nomine",
+ "dt_xml_title": "Titulo",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Texto libere",
+ "importxml": "Importar XML",
+ "dt_import_selectfile": "Per favor selige le file $1 a importar:",
+ "dt_import_encodingtype": "Typo de codification:",
+ "dt_import_forexisting": "Pro paginas que ja existe:",
+ "dt_import_overwriteexisting": "Superscriber le contento existente",
+ "dt_import_mergeintoexisting": "Superscriber solmente le campos continite in le file",
+ "dt_import_skipexisting": "Saltar",
+ "dt_import_appendtoexisting": "Adjunger al contento existente",
+ "dt_import_summarydesc": "Summario de importation:",
+ "dt_import_editsummary": "Importation de {{ucfirst:$1}}",
+ "dt_import_importing": "Importation in curso…",
+ "dt_import_success": "$1 {{PLURAL:$1|pagina|paginas}} essera create ex le file $2.",
+ "importcsv": "Importar CSV",
+ "importspreadsheet": "Importar folio de calculo",
+ "dt_importcsv_badheader": "Error: le capite del columna $1, '$2', debe esser '$3', '$4' o in le forma 'nomine_de_patrono[nomine_de_campo]'",
+ "right-datatransferimport": "Importar datos",
+ "dt_filetype_spreadsheet": "folio de calculo"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/id.json b/www/wiki/extensions/DataTransfer/i18n/id.json
new file mode 100644
index 00000000..68903678
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/id.json
@@ -0,0 +1,40 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bennylin",
+ "Farras",
+ "Irwangatot",
+ "IvanLanin",
+ "Rex"
+ ]
+ },
+ "datatransfer-desc": "Membolehkan untuk impor dan ekspor data diisikan pada pemangilan templat",
+ "viewxml": "Tilik XML",
+ "dt_viewxml_docu": "Silakan pilih di antara kategori dan ruang nama berikut untuk melihat dalam format XML",
+ "dt_viewxml_categories": "Kategori",
+ "dt_viewxml_namespaces": "Ruang nama",
+ "dt_viewxml_simplifiedformat": "Penyederhanaan format",
+ "dt_xml_namespace": "Ruang nama",
+ "dt_xml_pages": "Halaman",
+ "dt_xml_page": "Halaman",
+ "dt_xml_template": "Templat",
+ "dt_xml_field": "Ruas",
+ "dt_xml_name": "Nama",
+ "dt_xml_title": "Judul",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Teks Bebas",
+ "importxml": "Impor XML",
+ "dt_import_selectfile": "Pilih berkas $1 untuk di impor:",
+ "dt_import_encodingtype": "Tipe penyandian:",
+ "dt_import_forexisting": "Untuk halaman yang sudah ada:",
+ "dt_import_overwriteexisting": "Menimpa konten yang ada",
+ "dt_import_skipexisting": "Lewati",
+ "dt_import_appendtoexisting": "Tambahkan kepada konten yang ada",
+ "dt_import_summarydesc": "Ringkasan impor:",
+ "dt_import_editsummary": "$1 impor",
+ "dt_import_importing": "Mengimpor...",
+ "dt_import_success": "$1 {{PLURAL:$1|halaman|halaman}} akan di buat dari berkas $2.",
+ "importcsv": "Impor CSV",
+ "dt_importcsv_badheader": "Kesalahan: kepala kolom $1, '$2', harus berupa '$3', '$4' atau bentuk 'template_name [field_name]'",
+ "right-datatransferimport": "Impor data"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ig.json b/www/wiki/extensions/DataTransfer/i18n/ig.json
new file mode 100644
index 00000000..1314934f
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ig.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ukabia"
+ ]
+ },
+ "dt_viewxml_categories": "Ụdàkọ",
+ "dt_viewxml_namespaces": "Ahàm̀bara",
+ "dt_xml_namespace": "Ahàm̀bara",
+ "dt_xml_pages": "Ihü",
+ "dt_xml_page": "Ihü",
+ "dt_xml_template": "Àtụ",
+ "dt_xml_name": "Áhà",
+ "dt_import_skipexisting": "Gáfè"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/inh.json b/www/wiki/extensions/DataTransfer/i18n/inh.json
new file mode 100644
index 00000000..2b3fb19f
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/inh.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Adam-Yourist",
+ "Kaganer"
+ ]
+ },
+ "dt_viewxml_namespaces": "ЦӀерий моттигаш",
+ "dt_xml_template": "Ло"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/io.json b/www/wiki/extensions/DataTransfer/i18n/io.json
new file mode 100644
index 00000000..0edc7386
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/io.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Malafaya"
+ ]
+ },
+ "dt_xml_template": "Shablono",
+ "dt_xml_name": "Nomo",
+ "dt_xml_title": "Titulo"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/is.json b/www/wiki/extensions/DataTransfer/i18n/is.json
new file mode 100644
index 00000000..ec4ea646
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/is.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "S.Örvarr.S",
+ "පසිඳු කාවින්ද"
+ ]
+ },
+ "dt_viewxml_namespaces": "Nafnrými",
+ "dt_xml_namespace": "Nafnrými",
+ "dt_xml_pages": "Síður",
+ "dt_xml_page": "Síða",
+ "dt_xml_field": "Svæði",
+ "dt_xml_name": "Nafn",
+ "dt_xml_title": "Titill",
+ "dt_import_skipexisting": "Sleppa"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/it.json b/www/wiki/extensions/DataTransfer/i18n/it.json
new file mode 100644
index 00000000..a4806f40
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/it.json
@@ -0,0 +1,41 @@
+{
+ "@metadata": {
+ "authors": [
+ "Beta16",
+ "BrokenArrow",
+ "Darth Kule"
+ ]
+ },
+ "datatransfer-desc": "Permette l'importazione e l'esportazione di dati strutturati contenuti in chiamate a template",
+ "viewxml": "Vedi XML",
+ "dt_viewxml_docu": "Selezionare tra le categorie e namespace indicati di seguito quelli da visualizzare in formato XML.",
+ "dt_viewxml_categories": "Categorie",
+ "dt_viewxml_namespaces": "Namespace",
+ "dt_viewxml_simplifiedformat": "Formato semplificato",
+ "dt_xml_namespace": "Namespace",
+ "dt_xml_pages": "Pagine",
+ "dt_xml_page": "Pagina",
+ "dt_xml_template": "Template",
+ "dt_xml_field": "Campo",
+ "dt_xml_name": "Nome",
+ "dt_xml_title": "Titolo",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Testo libero",
+ "importxml": "Importa XML",
+ "dt_import_selectfile": "Seleziona il file $1 da importare:",
+ "dt_import_encodingtype": "Tipo di codifica",
+ "dt_import_forexisting": "Per le pagine già esistenti:",
+ "dt_import_overwriteexisting": "Sovrascrivi il contenuto esistente",
+ "dt_import_mergeintoexisting": "Sovrascrivi solo i campi contenuti nel file",
+ "dt_import_skipexisting": "Salta",
+ "dt_import_appendtoexisting": "Aggiungi al contenuto esistente",
+ "dt_import_summarydesc": "Oggetto dell'importazione:",
+ "dt_import_editsummary": "Importazione {{ucfirst:$1}}",
+ "dt_import_importing": "Sto importando...",
+ "dt_import_success": "$1 {{PLURAL:$1|pagina|pagine}} saranno create dal file $2.",
+ "importcsv": "Importa CSV",
+ "importspreadsheet": "Importa foglio di calcolo",
+ "dt_importcsv_badheader": "Errore: l'intestazione della colonna $1, \"$2\", deve avere uno dei seguenti valori: '$3', '$4' o il formato 'nome_template[nome_campo]'",
+ "right-datatransferimport": "Importa dati",
+ "dt_filetype_spreadsheet": "foglio di calcolo"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ja.json b/www/wiki/extensions/DataTransfer/i18n/ja.json
new file mode 100644
index 00000000..9cbf0c9b
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ja.json
@@ -0,0 +1,47 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aotake",
+ "Fryed-peach",
+ "JtFuruhata",
+ "Ohgi",
+ "Shirayuki",
+ "青子守歌",
+ "Shield-9",
+ "Otokoume",
+ "2nd-player"
+ ]
+ },
+ "datatransfer-desc": "テンプレート呼び出しに含まれるデータの取り込みおよび書き出しができるようにする",
+ "viewxml": "XMLを表示",
+ "dt_viewxml_docu": "XML 形式で表示するカテゴリや名前空間を以下から選択してください。",
+ "dt_viewxml_categories": "カテゴリ",
+ "dt_viewxml_namespaces": "名前空間",
+ "dt_viewxml_simplifiedformat": "簡易形式",
+ "dt_xml_namespace": "名前空間",
+ "dt_xml_pages": "ページ群",
+ "dt_xml_page": "ページ",
+ "dt_xml_template": "テンプレート",
+ "dt_xml_field": "フィールド",
+ "dt_xml_name": "名前",
+ "dt_xml_title": "タイトル",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "自由形式テキスト",
+ "importxml": "XMLを取り込む",
+ "dt_import_selectfile": "取り込む $1 ファイルを選択してください:",
+ "dt_import_encodingtype": "エンコーディング方式:",
+ "dt_import_forexisting": "既存のページの場合:",
+ "dt_import_overwriteexisting": "既存の内容に上書き",
+ "dt_import_mergeintoexisting": "ファイルに含まれるフィールドのみを上書き",
+ "dt_import_skipexisting": "スキップ",
+ "dt_import_appendtoexisting": "既存の内容に追加",
+ "dt_import_summarydesc": "取り込みの要約:",
+ "dt_import_editsummary": "{{ucfirst:$1}} の取り込み",
+ "dt_import_importing": "取り込み中...",
+ "dt_import_success": "$2 ファイルから $1 {{PLURAL:$1|ページ}}が作成されます。",
+ "importcsv": "CSVの取り込み",
+ "importspreadsheet": "スプレッドシートの取り込み",
+ "dt_importcsv_badheader": "エラー: 列 $1 のヘッダー「$2」は、「$3」または「$4」であるか、「テンプレート名[フィールド名]」の形式である必要があります",
+ "right-datatransferimport": "データを取り込む",
+ "dt_filetype_spreadsheet": "スプレッドシート"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/jv.json b/www/wiki/extensions/DataTransfer/i18n/jv.json
new file mode 100644
index 00000000..c2c30ecc
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/jv.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Meursault2004",
+ "NoiX180"
+ ]
+ },
+ "viewxml": "Deleng XML",
+ "dt_viewxml_categories": "Kategori",
+ "dt_viewxml_simplifiedformat": "Format prasaja",
+ "dt_xml_namespace": "Bilik nama",
+ "dt_xml_page": "Kaca",
+ "dt_xml_name": "Jeneng",
+ "dt_xml_title": "Sesirah",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Tèks Bébas"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ka.json b/www/wiki/extensions/DataTransfer/i18n/ka.json
new file mode 100644
index 00000000..69a979ec
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ka.json
@@ -0,0 +1,30 @@
+{
+ "@metadata": {
+ "authors": [
+ "David1010"
+ ]
+ },
+ "viewxml": "XML-ის ხილვა",
+ "dt_viewxml_categories": "კატეგორიები",
+ "dt_viewxml_namespaces": "სახელთა სივრცეები",
+ "dt_viewxml_simplifiedformat": "გამარტივებული ფორმატი",
+ "dt_xml_namespace": "სახელთა სივრცე",
+ "dt_xml_pages": "გვერდები",
+ "dt_xml_page": "გვერდი",
+ "dt_xml_template": "თარგი",
+ "dt_xml_field": "ველი",
+ "dt_xml_name": "სახელი",
+ "dt_xml_title": "სათაური",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "თავისუფალი ტექსტი",
+ "importxml": "XML-ის იმპორტი",
+ "dt_import_selectfile": "გთხოვთ, აირჩიეთ $1 ფაილი იმპორტისათვის:",
+ "dt_import_encodingtype": "კოდირების ტიპი:",
+ "dt_import_forexisting": "გვერდებისათვის რომლებიც უკვე არსებობენ:",
+ "dt_import_skipexisting": "გამოტოვება",
+ "dt_import_summarydesc": "იმპორტის აღწერა:",
+ "dt_import_editsummary": "{{ucfirst:$1}} იმპორტი",
+ "dt_import_importing": "იმპორტირება...",
+ "importcsv": "CSV-ის იმპორტი",
+ "right-datatransferimport": "მონაცემების იმპორტირება"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/km.json b/www/wiki/extensions/DataTransfer/i18n/km.json
new file mode 100644
index 00000000..5c2c8d15
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/km.json
@@ -0,0 +1,38 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chhorran",
+ "Lovekhmer",
+ "Thearith",
+ "គីមស៊្រុន",
+ "វ័ណថារិទ្ធ"
+ ]
+ },
+ "viewxml": "មើល XML",
+ "dt_viewxml_docu": "ជ្រើសយកក្នុងចំណោមចំណាត់ថ្នាក់ក្រុមនិងលំហឈ្មោះដើម្បីមើលជាទម្រង់ XML ។",
+ "dt_viewxml_categories": "ចំណាត់ថ្នាក់ក្រុម",
+ "dt_viewxml_namespaces": "ប្រភេទ",
+ "dt_viewxml_simplifiedformat": "ទម្រង់សាមញ្ញ",
+ "dt_xml_namespace": "លំហឈ្មោះ",
+ "dt_xml_pages": "ទំព័រ",
+ "dt_xml_page": "ទំព័រ",
+ "dt_xml_template": "ទំព័រគំរូ",
+ "dt_xml_field": "ផ្នែក",
+ "dt_xml_name": "ឈ្មោះ",
+ "dt_xml_title": "ចំណងជើង",
+ "dt_xml_id": "អត្តសញ្ញាណ",
+ "dt_xml_freetext": "អត្ថបទសេរី",
+ "importxml": "នាំចូល XML",
+ "dt_import_selectfile": "សូម​ជ្រើស​រើស​ឯកសារ $1 ដើម្បី​នាំ​ចូល​៖",
+ "dt_import_encodingtype": "ប្រភេទនៃការធ្វើកូដ៖",
+ "dt_import_forexisting": "សំរាប់ទំព័រដែលមានរួចហើយ៖",
+ "dt_import_overwriteexisting": "សរសេរជាន់ពីលើខ្លឹមសារដែលមានហើយ",
+ "dt_import_skipexisting": "រំលង",
+ "dt_import_appendtoexisting": "សរសេរបន្ថែមទៅលើខ្លឹមសារដែលមានហើយ",
+ "dt_import_summarydesc": "ចំណារពន្យល់ស្ដីពីការនាំចូល៖",
+ "dt_import_editsummary": "$1 នាំចូល​",
+ "dt_import_importing": "កំពុងនាំចូល​...",
+ "dt_import_success": "ទំព័រចំនួន $1 នឹងត្រូវបានបង្កើតពីឯកសារ $2 នេះ។",
+ "importcsv": "នាំចូល CSV",
+ "right-datatransferimport": "នាំចូល​ទិន្នន័យ​"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/kn.json b/www/wiki/extensions/DataTransfer/i18n/kn.json
new file mode 100644
index 00000000..5bd3c398
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/kn.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Nayvik",
+ "VASANTH S.N."
+ ]
+ },
+ "dt_viewxml_categories": "ವರ್ಗಗಳು",
+ "dt_viewxml_namespaces": "ನಾಮವರ್ಗಗಳು",
+ "dt_xml_namespace": "ನಾಮವರ್ಗ",
+ "dt_xml_pages": "ಪುಟಗಳು",
+ "dt_xml_page": "ಪುಟ",
+ "dt_xml_template": "ಟೆಂಪ್ಲೇಟು",
+ "dt_xml_name": "ಹೆಸರು",
+ "dt_xml_title": "ಶೀರ್ಷಿಕೆ"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ko.json b/www/wiki/extensions/DataTransfer/i18n/ko.json
new file mode 100644
index 00000000..bfdaecc7
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ko.json
@@ -0,0 +1,44 @@
+{
+ "@metadata": {
+ "authors": [
+ "Daisy2002",
+ "Yjs5497",
+ "아라",
+ "Hwangjy9",
+ "Revi",
+ "Ykhwong"
+ ]
+ },
+ "datatransfer-desc": "틀 호출에 포함된 데이터를 가져오기와 내보내기를 할 수 있게 합니다",
+ "viewxml": "XML 보기",
+ "dt_viewxml_docu": "XML 형식으로 보려면 다음 분류와 이름공간 중에서 선택하세요.",
+ "dt_viewxml_categories": "분류",
+ "dt_viewxml_namespaces": "이름공간",
+ "dt_viewxml_simplifiedformat": "단순화된 형식",
+ "dt_xml_namespace": "이름공간",
+ "dt_xml_pages": "문서",
+ "dt_xml_page": "문서",
+ "dt_xml_template": "틀",
+ "dt_xml_field": "필드",
+ "dt_xml_name": "이름",
+ "dt_xml_title": "제목",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "자유 텍스트",
+ "importxml": "XML 가져오기",
+ "dt_import_selectfile": "가져오려면 $1 파일을 선택하세요:",
+ "dt_import_encodingtype": "인코딩 유형:",
+ "dt_import_forexisting": "이미 존재하는 문서이면:",
+ "dt_import_overwriteexisting": "기존 내용을 덮어쓰기",
+ "dt_import_mergeintoexisting": "파일에 포함된 필드만 덮어쓰기",
+ "dt_import_skipexisting": "건너뛰기",
+ "dt_import_appendtoexisting": "기존 내용에 추가",
+ "dt_import_summarydesc": "가져오기의 요약:",
+ "dt_import_editsummary": "{{ucfirst:$1}} 가져오기",
+ "dt_import_importing": "가져오는 중...",
+ "dt_import_success": "{{PLURAL:$1|문서}} $1개가 $2 파일에서 만들어집니다.",
+ "importcsv": "CSV 가져오기",
+ "importspreadsheet": "스프레드시트 들여오기",
+ "dt_importcsv_badheader": "오류: $1열의 머리인, '$2'은(는) '$3', '$4'나 '틀_이름[필드_이름]' 형식 중 하나여야 합니다",
+ "right-datatransferimport": "데이터 가져오기",
+ "dt_filetype_spreadsheet": "스프레드시트"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/krj.json b/www/wiki/extensions/DataTransfer/i18n/krj.json
new file mode 100644
index 00000000..37d7525c
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/krj.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jose77"
+ ]
+ },
+ "dt_viewxml_categories": "Manga Kategorya",
+ "dt_xml_page": "Pahina"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ksh.json b/www/wiki/extensions/DataTransfer/i18n/ksh.json
new file mode 100644
index 00000000..a6e1300d
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ksh.json
@@ -0,0 +1,39 @@
+{
+ "@metadata": {
+ "authors": [
+ "Purodha"
+ ]
+ },
+ "datatransfer-desc": "Määt et müjjelesch, Date uß Schabloone ier Oproofe ze emporteere un ze exporteere.",
+ "viewxml": "<i lang=\"en\">XML</i> beloore",
+ "dt_viewxml_docu": "Don ußsöhke, wat fö_n Saachjroppe un Appachtemangs De em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Fommahd aanlohre wells.",
+ "dt_viewxml_categories": "Saachjroppe",
+ "dt_viewxml_namespaces": "Appachtemangs",
+ "dt_viewxml_simplifiedformat": "Em eijfachere Fommaat",
+ "dt_xml_namespace": "Appachtemang",
+ "dt_xml_pages": "Sigge",
+ "dt_xml_page": "Sigg",
+ "dt_xml_template": "Schablohn",
+ "dt_xml_field": "Felldt",
+ "dt_xml_name": "Nahme",
+ "dt_xml_title": "Tėttel",
+ "dt_xml_id": "Kännong",
+ "dt_xml_freetext": "Freije Täx",
+ "importxml": "<i lang=\"en\">XML</i> Empotteere",
+ "dt_import_selectfile": "Söhk de <i lang=\"en\">$1</i>-Dattei för zem Empotteere uß:",
+ "dt_import_encodingtype": "Zoot Kodeerung för de Bohchshtahbe un Zeishe:",
+ "dt_import_forexisting": "För Sigge, di et ald jitt:",
+ "dt_import_overwriteexisting": "Övverschrieve, wat ald doh es",
+ "dt_import_mergeintoexisting": "Donn bloß Fälder övverschriive, di ald en dä Dattei schtonn",
+ "dt_import_skipexisting": "Övverjonn",
+ "dt_import_appendtoexisting": "An dat aanhange, wat ald doh es",
+ "dt_import_summarydesc": "Zesammefassung vun däm Empoot:",
+ "dt_import_editsummary": "uss ene $1-Datei empotteet <!-- https://translatewiki.net/wiki/Thread:Support/About_MediaWiki:Dt_import_editsummary/ksh https://phabricator.wikimedia.org/T130188 -->",
+ "dt_import_importing": "Ben aam Empotteere{{int:Ellipsis}}",
+ "dt_import_success": "{{PLURAL:$1|Ein Sigg weed_uß|$1 Sigge weede uß|Kein einzelne Sigg weed_uß}} dä <i lang=\"en\">$2</i>-Dattei empotteet.",
+ "importcsv": "<i lang=\"en\">CSV</i>-Dattei empoteere",
+ "importspreadsheet": "Räscheblatt Empottehre",
+ "dt_importcsv_badheader": "Fähler: De Shpallde-Övverschreff för $1 es „$2“, mööt ävver „$3“ udder „$4“ sin, udder dat Fommaat „<code>Name_vun_ene_Schablohn[Name_vun_enem_Felldt]</code>“ han.",
+ "right-datatransferimport": "Daate empoteere",
+ "dt_filetype_spreadsheet": "Räscheblatt"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ku-latn.json b/www/wiki/extensions/DataTransfer/i18n/ku-latn.json
new file mode 100644
index 00000000..cb558120
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ku-latn.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "George Animal"
+ ]
+ },
+ "dt_viewxml_categories": "Kategorî",
+ "dt_xml_pages": "Rûpel",
+ "dt_xml_page": "Rûpel",
+ "dt_xml_template": "Şablon",
+ "dt_xml_name": "Nav",
+ "dt_xml_title": "Sernav",
+ "dt_import_summarydesc": "Kurteya împortê:"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/kw.json b/www/wiki/extensions/DataTransfer/i18n/kw.json
new file mode 100644
index 00000000..6a9f2ab2
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/kw.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kernoweger",
+ "Kw-Moon",
+ "Nrowe"
+ ]
+ },
+ "dt_viewxml_categories": "Klassys",
+ "dt_xml_page": "Folen"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/lb.json b/www/wiki/extensions/DataTransfer/i18n/lb.json
new file mode 100644
index 00000000..77cc8910
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/lb.json
@@ -0,0 +1,40 @@
+{
+ "@metadata": {
+ "authors": [
+ "Robby",
+ "Soued031"
+ ]
+ },
+ "datatransfer-desc": "Erlaabt et Daten déi an Opruffer vu Schabloune benotzt ginn z'importéieren an z'exportéieren",
+ "viewxml": "XML weisen",
+ "dt_viewxml_docu": "Wielt w.e.g. ënner dëse Kategorien an Nimmraim fir am XML-Format unzeweisen.",
+ "dt_viewxml_categories": "Kategorien",
+ "dt_viewxml_namespaces": "Nummraim",
+ "dt_viewxml_simplifiedformat": "Vereinfachte Format",
+ "dt_xml_namespace": "Nummraum",
+ "dt_xml_pages": "Säiten",
+ "dt_xml_page": "Säit",
+ "dt_xml_template": "Schabloun",
+ "dt_xml_field": "Feld",
+ "dt_xml_name": "Numm",
+ "dt_xml_title": "Titel",
+ "dt_xml_id": "Nummer",
+ "dt_xml_freetext": "Fräien Text",
+ "importxml": "XML importéieren",
+ "dt_import_selectfile": "Sicht de(n) $1-Fichier eraus fir z'importéieren:",
+ "dt_import_encodingtype": "Encoding-Typ:",
+ "dt_import_forexisting": "Fir Säiten déi et scho gëtt:",
+ "dt_import_overwriteexisting": "Den Inhalt den et gëtt iwwerschreiwen",
+ "dt_import_mergeintoexisting": "Nëmme Felder iwwerschreiwen déi am Fichier dra sinn",
+ "dt_import_skipexisting": "Iwwersprangen",
+ "dt_import_appendtoexisting": "Bei den Inhalt deen et gëtt dobäisetzen",
+ "dt_import_summarydesc": "Resumé vum Import:",
+ "dt_import_editsummary": "{{ucfirst:$1}}-Import",
+ "dt_import_importing": "Import am gaang ...",
+ "dt_import_success": "$1 {{PLURAL:$1|Säit gëtt|Säite ginn}} aus dem $2-Fichier ugeluecht.",
+ "importcsv": "CSV importéieren",
+ "importspreadsheet": "Tabelleberechnungsblad importéieren",
+ "dt_importcsv_badheader": "Feeler: D'Iwwerschrëft vun der Kolonn $1, '$2', muss entweder '$3', '$4' oder am Format 'Numm_vun_der_Schabloun(Numm_vum_Feld)' sinn",
+ "right-datatransferimport": "Donnéeën importéieren",
+ "dt_filetype_spreadsheet": "Tabelleberechnungsblad"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/li.json b/www/wiki/extensions/DataTransfer/i18n/li.json
new file mode 100644
index 00000000..6d024cfe
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/li.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aelske",
+ "Remember the dot"
+ ]
+ },
+ "dt_xml_page": "Pagina"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/lki.json b/www/wiki/extensions/DataTransfer/i18n/lki.json
new file mode 100644
index 00000000..9f64ae35
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/lki.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lakzon"
+ ]
+ },
+ "dt_xml_pages": "وةڵگةل"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/lt.json b/www/wiki/extensions/DataTransfer/i18n/lt.json
new file mode 100644
index 00000000..b69395bb
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/lt.json
@@ -0,0 +1,34 @@
+{
+ "@metadata": {
+ "authors": [
+ "Eitvys200",
+ "Tomasdd"
+ ]
+ },
+ "viewxml": "Žiūrėti XML",
+ "dt_viewxml_categories": "Kategorijos",
+ "dt_viewxml_simplifiedformat": "Supaprastintas formatas",
+ "dt_xml_namespace": "Vardų sritis",
+ "dt_xml_pages": "Puslapiai",
+ "dt_xml_page": "Puslapis",
+ "dt_xml_template": "Šablonas",
+ "dt_xml_field": "Laukas",
+ "dt_xml_name": "Vardas",
+ "dt_xml_title": "Pavadinimas",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Laisvas tekstas",
+ "importxml": "Importuoti XML",
+ "dt_import_selectfile": "Prašome pasirinkti $1 failą importavimui:",
+ "dt_import_encodingtype": "Kodavimo tipas:",
+ "dt_import_forexisting": "Puslapiams kurie jau egzistuoja:",
+ "dt_import_overwriteexisting": "Perrašyti egzistuojantį turinį",
+ "dt_import_skipexisting": "Praleisti",
+ "dt_import_summarydesc": "Importo santrauka:",
+ "dt_import_editsummary": "{{ucfirst:$1}} importas",
+ "dt_import_importing": "Importuojama...",
+ "dt_import_success": "$1 {{PLURAL:$1|puslapis bus sukurtas|puslapiai bus sukurti}} iš $2 failo.",
+ "importcsv": "Importuoti CSV",
+ "importspreadsheet": "Importuoti skaičiuoklę",
+ "right-datatransferimport": "Importuoti duomenis",
+ "dt_filetype_spreadsheet": "skaičiuoklė"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ltg.json b/www/wiki/extensions/DataTransfer/i18n/ltg.json
new file mode 100644
index 00000000..0521eb85
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ltg.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dark Eagle"
+ ]
+ },
+ "dt_viewxml_namespaces": "Vuordu pluoti",
+ "dt_xml_namespace": "Vuordu pluots",
+ "dt_xml_pages": "Puslopys"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/lv.json b/www/wiki/extensions/DataTransfer/i18n/lv.json
new file mode 100644
index 00000000..2bb45272
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/lv.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "GreenZeb"
+ ]
+ },
+ "dt_viewxml_categories": "Kategorijas",
+ "dt_viewxml_namespaces": "Vārdtelpas",
+ "dt_viewxml_simplifiedformat": "Vienkāršots formāts",
+ "dt_xml_namespace": "Vārdtelpa",
+ "dt_xml_pages": "Lapas",
+ "dt_xml_page": "Lapa",
+ "dt_xml_template": "Veidne",
+ "dt_xml_field": "Lauks",
+ "dt_xml_name": "Vārds",
+ "dt_xml_title": "Nosaukums",
+ "dt_xml_id": "ID"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/mhr.json b/www/wiki/extensions/DataTransfer/i18n/mhr.json
new file mode 100644
index 00000000..999356b4
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/mhr.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Сай"
+ ]
+ },
+ "dt_xml_namespace": "Лӱм-влакын кумдыкышт",
+ "dt_xml_page": "Лаштык"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/min.json b/www/wiki/extensions/DataTransfer/i18n/min.json
new file mode 100644
index 00000000..eb11585f
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/min.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Iwan Novirion"
+ ]
+ },
+ "dt_import_importing": "Mangimpor..."
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/mk.json b/www/wiki/extensions/DataTransfer/i18n/mk.json
new file mode 100644
index 00000000..7c32f0c6
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/mk.json
@@ -0,0 +1,39 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bjankuloski06"
+ ]
+ },
+ "datatransfer-desc": "Овозможува увоз и извоз на податоци содржани во повикувањата на шаблоните",
+ "viewxml": "Преглед на XML",
+ "dt_viewxml_docu": "Одберете од следиве категории и именски простори за преглед во XML формат.",
+ "dt_viewxml_categories": "Категории",
+ "dt_viewxml_namespaces": "Именски простори",
+ "dt_viewxml_simplifiedformat": "Упростен формат",
+ "dt_xml_namespace": "Именски простор",
+ "dt_xml_pages": "Страници",
+ "dt_xml_page": "Страница",
+ "dt_xml_template": "Шаблон",
+ "dt_xml_field": "Поле",
+ "dt_xml_name": "Име",
+ "dt_xml_title": "Наслов",
+ "dt_xml_id": "Назнака",
+ "dt_xml_freetext": "Слободен текст",
+ "importxml": "Увоз на XML",
+ "dt_import_selectfile": "Одберете ја $1 податотеката за увоз:",
+ "dt_import_encodingtype": "Тип на кодирање:",
+ "dt_import_forexisting": "За страници што веќе постојат:",
+ "dt_import_overwriteexisting": "Презапиши врз постоечките содржини",
+ "dt_import_mergeintoexisting": "Презапиши само врз полињата што се содржат во податотеката",
+ "dt_import_skipexisting": "Прескокни",
+ "dt_import_appendtoexisting": "Додај во постоечката содржина",
+ "dt_import_summarydesc": "Опис на увозот:",
+ "dt_import_editsummary": "Увоз на {{ucfirst:$1}}",
+ "dt_import_importing": "Увезувам...",
+ "dt_import_success": "$1 {{PLURAL:$1|страница ќе биде создадена|страници ќе бидат создадени}} од $2 податотеката.",
+ "importcsv": "Увоз на CSV",
+ "importspreadsheet": "Увези табеларна пресметка",
+ "dt_importcsv_badheader": "Грешка: насловот на столбот бр. $1, „$2“, мора да биде или „$3“, или „$4“, или пак од обликот „template_name[field_name]“",
+ "right-datatransferimport": "Увезување податоци",
+ "dt_filetype_spreadsheet": "табеларна пресметка"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ml.json b/www/wiki/extensions/DataTransfer/i18n/ml.json
new file mode 100644
index 00000000..9ab03774
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ml.json
@@ -0,0 +1,31 @@
+{
+ "@metadata": {
+ "authors": [
+ "Junaidpv",
+ "Praveenp",
+ "Shijualex"
+ ]
+ },
+ "viewxml": "XML കാണുക",
+ "dt_viewxml_categories": "വർഗ്ഗങ്ങൾ",
+ "dt_viewxml_namespaces": "നാമമേഖലകൾ",
+ "dt_viewxml_simplifiedformat": "ലളിതവത്ക്കരിക്കപ്പെട്ട ഫോർമാറ്റ്",
+ "dt_xml_namespace": "നാമമേഖല",
+ "dt_xml_pages": "താളുകൾ",
+ "dt_xml_page": "താൾ",
+ "dt_xml_template": "ഫലകം",
+ "dt_xml_field": "ഫീൽഡ്",
+ "dt_xml_name": "പേര്",
+ "dt_xml_title": "ശീർഷകം",
+ "dt_xml_id": "ഐ.ഡി.",
+ "dt_xml_freetext": "സ്വതന്ത്ര എഴുത്ത്",
+ "importxml": "എക്സ്.എം.എൽ. ഇറക്കുമതി",
+ "dt_import_selectfile": "ദയവായി ഇറക്കുമതിക്കായി $1 പ്രമാണം തിരഞ്ഞെടുക്കുക:",
+ "dt_import_encodingtype": "എൻ‌കോഡിങ് തരം:",
+ "dt_import_forexisting": "നിലവിലുള്ള താളുകൾക്ക് വേണ്ടി:",
+ "dt_import_appendtoexisting": "നിലവിലുള്ള ഉള്ളടക്കത്തോട് കൂട്ടിച്ചേർക്കുക",
+ "dt_import_summarydesc": "ഇറക്കുമതിയുടെ സംഗ്രഹം:",
+ "dt_import_editsummary": "$1 ഇറക്കുമതി",
+ "dt_import_importing": "ഇറക്കുമതി ചെയ്യുന്നു...",
+ "importcsv": "സി.എസ്.വി. ഇറക്കുമതി"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/mn.json b/www/wiki/extensions/DataTransfer/i18n/mn.json
new file mode 100644
index 00000000..0bb686e8
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/mn.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chinneeb"
+ ]
+ },
+ "dt_viewxml_categories": "Ангиллууд",
+ "dt_viewxml_namespaces": "Нэрний зайнууд",
+ "dt_xml_namespace": "Нэрний зай",
+ "dt_xml_page": "Хуудас"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/mr.json b/www/wiki/extensions/DataTransfer/i18n/mr.json
new file mode 100644
index 00000000..047978d9
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/mr.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kaustubh",
+ "V.narsikar"
+ ]
+ },
+ "datatransfer-desc": "साचा कॉल मध्ये असणार्‍या डाटाची आयात निर्यात करण्याची परवानगी देतो",
+ "viewxml": "XML पहा",
+ "dt_viewxml_docu": "कॄपया XML मध्ये पाहण्यासाठी खालीलपैकी वर्ग व नामविश्वे निवडा.",
+ "dt_viewxml_categories": "वर्ग",
+ "dt_viewxml_namespaces": "नामविश्वे",
+ "dt_viewxml_simplifiedformat": "सोपे प्रारुप",
+ "dt_xml_namespace": "नामविश्व",
+ "dt_xml_pages": "पाने",
+ "dt_xml_page": "पान",
+ "dt_xml_template": "साचा",
+ "dt_xml_field": "रकाना",
+ "dt_xml_name": "नाव",
+ "dt_xml_title": "शीर्षक",
+ "dt_xml_id": "आयडी",
+ "dt_xml_freetext": "मुक्त मजकूर",
+ "importxml": "एक्सएमएल आयात करा",
+ "dt_import_selectfile": "आयात करावयाची $1 संचिका निवडा:"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ms.json b/www/wiki/extensions/DataTransfer/i18n/ms.json
new file mode 100644
index 00000000..0532f373
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ms.json
@@ -0,0 +1,37 @@
+{
+ "@metadata": {
+ "authors": [
+ "Anakmalaysia"
+ ]
+ },
+ "datatransfer-desc": "Membolehkan pengimportan dan pengeksportan data yang terkandung dalam panggilan tempat",
+ "viewxml": "Paparkan XML",
+ "dt_viewxml_docu": "Sila pilih antara kategori-kategori dan ruang-ruang nama yang berikut untuk dipaparkan dalam format XML.",
+ "dt_viewxml_categories": "Kategori",
+ "dt_viewxml_namespaces": "Ruang nama",
+ "dt_viewxml_simplifiedformat": "Format ringkas",
+ "dt_xml_namespace": "Ruang nama",
+ "dt_xml_pages": "Halaman",
+ "dt_xml_page": "Laman",
+ "dt_xml_template": "Templat",
+ "dt_xml_field": "Medan",
+ "dt_xml_name": "Nama",
+ "dt_xml_title": "Tajuk",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Teks Bebas",
+ "importxml": "Import XML",
+ "dt_import_selectfile": "Sila pilih fail $1 yang hendak diimport:",
+ "dt_import_encodingtype": "Jenis pengekodan:",
+ "dt_import_forexisting": "Untuk halaman-halaman yang sedia ada:",
+ "dt_import_overwriteexisting": "Tulis ganti kandungan sedia ada",
+ "dt_import_mergeintoexisting": "Hanya tulis ganti medan-medan yang terkandung dalam fail",
+ "dt_import_skipexisting": "Langkau",
+ "dt_import_appendtoexisting": "Tambah kandungan sedia ada",
+ "dt_import_summarydesc": "Ringkasan pengimportan:",
+ "dt_import_editsummary": "Pengimportan $1",
+ "dt_import_importing": "Sedang mengimport...",
+ "dt_import_success": "$1 halaman akan dibuat dari fail $2.",
+ "importcsv": "Import CSV",
+ "dt_importcsv_badheader": "Ralat: pengatas lajur $1, '$2', mestilah sama ada '$3', '$4' atau dalam bentuk 'nama_templat[nama_medan]'",
+ "right-datatransferimport": "Mengimport data"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/mt.json b/www/wiki/extensions/DataTransfer/i18n/mt.json
new file mode 100644
index 00000000..05df02c9
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/mt.json
@@ -0,0 +1,37 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chrisportelli",
+ "Leli Forte"
+ ]
+ },
+ "datatransfer-desc": "Tippermetti l-importazzjoni u l-esportazzjoni ta' dejta li tinsab f'sejħiet ta' mudelli",
+ "viewxml": "Ara XML",
+ "dt_viewxml_docu": "Jekk jogħġbok agħżel fost il-kategoriji u l-ispazji tal-isem segwenti sabiex tarahom f'format XML.",
+ "dt_viewxml_categories": "Kategoriji",
+ "dt_viewxml_namespaces": "Spazji tal-isem",
+ "dt_viewxml_simplifiedformat": "Format simplifikat",
+ "dt_xml_namespace": "Spazju tal-ismijiet",
+ "dt_xml_pages": "Paġni",
+ "dt_xml_page": "Paġna",
+ "dt_xml_template": "Mudell",
+ "dt_xml_field": "Qasam",
+ "dt_xml_name": "Isem",
+ "dt_xml_title": "Titlu",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Test ħieles",
+ "importxml": "Importa XML",
+ "dt_import_selectfile": "Jekk jogħġbok agħżel il-fajl $1 li tixtieq timporta:",
+ "dt_import_encodingtype": "Tip ta' kodifikar:",
+ "dt_import_forexisting": "Għal paġni li diġà jeżistu:",
+ "dt_import_overwriteexisting": "Erġa' ikteb fuq kontenut eżistenti",
+ "dt_import_skipexisting": "Aqbeż",
+ "dt_import_appendtoexisting": "Żid mal-kontenut eżistenti",
+ "dt_import_summarydesc": "Sommarju tal-importazzjoni:",
+ "dt_import_editsummary": "Importazzjoni $1",
+ "dt_import_importing": "Qiegħed timporta...",
+ "dt_import_success": "$1 {{PLURAL:$1|paġna|paġni}} se jinħolqu mill-fajl $2.",
+ "importcsv": "Importa CSV",
+ "dt_importcsv_badheader": "Żball: l-intestazzjoni tal-kolonna $1, \"$2\", trid tkun waħda minn dawn il-valuri: '$3', '$4' jew fil-format ta' 'isem_mudell[isem_qasam]'",
+ "right-datatransferimport": "Jimporta d-dejta"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/mwl.json b/www/wiki/extensions/DataTransfer/i18n/mwl.json
new file mode 100644
index 00000000..9b4bdca8
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/mwl.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Malafaya"
+ ]
+ },
+ "dt_xml_page": "Páigina"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/my.json b/www/wiki/extensions/DataTransfer/i18n/my.json
new file mode 100644
index 00000000..10242fe8
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/my.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ninjastrikers",
+ "Dr Lotus Black"
+ ]
+ },
+ "dt_viewxml_categories": "ကဏ္ဍများ",
+ "dt_viewxml_namespaces": "အမည်ညွှန်းများ",
+ "dt_xml_namespace": "အမည်ညွှန်း",
+ "dt_xml_pages": "စာမျက်နှာများ",
+ "dt_xml_page": "စာမျက်နှာ",
+ "dt_xml_template": "တမ်းပလိတ်",
+ "dt_xml_name": "အမည်",
+ "dt_import_skipexisting": "ကျော်ရန်"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/myv.json b/www/wiki/extensions/DataTransfer/i18n/myv.json
new file mode 100644
index 00000000..c52a91d7
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/myv.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "Botuzhaleny-sodamo"
+ ]
+ },
+ "dt_viewxml_categories": "Категорият",
+ "dt_viewxml_namespaces": "Лем потмот",
+ "dt_xml_namespace": "Лемпотмо",
+ "dt_xml_page": "Лопа",
+ "dt_xml_template": "Лопа парцун",
+ "dt_xml_field": "Пакся",
+ "dt_xml_name": "Лемезэ",
+ "dt_xml_title": "Конякс"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/mzn.json b/www/wiki/extensions/DataTransfer/i18n/mzn.json
new file mode 100644
index 00000000..7783988e
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/mzn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "محک"
+ ]
+ },
+ "dt_viewxml_categories": "رج‌ئون"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/nah.json b/www/wiki/extensions/DataTransfer/i18n/nah.json
new file mode 100644
index 00000000..e5290ccc
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/nah.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fluence",
+ "Teòtlalili",
+ "Akapochtli"
+ ]
+ },
+ "dt_viewxml_categories": "Neneuhcayomeh",
+ "dt_viewxml_namespaces": "Tōcātzin",
+ "dt_xml_namespace": "Tōcātzin",
+ "dt_xml_page": "Tlahcuilolamatl",
+ "dt_xml_name": "Tocaitl",
+ "dt_xml_title": "Tocaitl",
+ "dt_xml_id": "ID"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/nb.json b/www/wiki/extensions/DataTransfer/i18n/nb.json
new file mode 100644
index 00000000..621ec94d
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/nb.json
@@ -0,0 +1,42 @@
+{
+ "@metadata": {
+ "authors": [
+ "Event",
+ "Nghtwlkr",
+ "Emilbk",
+ "Jon Harald Søby"
+ ]
+ },
+ "datatransfer-desc": "Gjør det mulig å importere og eksportere data som finnes i maloppkallinger",
+ "viewxml": "Se XML",
+ "dt_viewxml_docu": "Velg blant følgende kategorier og navnerom for å se dem i XML-format.",
+ "dt_viewxml_categories": "Kategorier",
+ "dt_viewxml_namespaces": "Navnerom",
+ "dt_viewxml_simplifiedformat": "Forenklet format",
+ "dt_xml_namespace": "Navnerom",
+ "dt_xml_pages": "Sider",
+ "dt_xml_page": "Side",
+ "dt_xml_template": "Mal",
+ "dt_xml_field": "Felt",
+ "dt_xml_name": "Navn",
+ "dt_xml_title": "Tittel",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Fritekst",
+ "importxml": "Importer XML",
+ "dt_import_selectfile": "Vennligst velg $1-filen som skal importeres:",
+ "dt_import_encodingtype": "Tegnkodingstype:",
+ "dt_import_forexisting": "For sider som allerede finnes:",
+ "dt_import_overwriteexisting": "Skriv over eksisterende innhold",
+ "dt_import_mergeintoexisting": "Overskriv bare felter som inngår i filen",
+ "dt_import_skipexisting": "Hopp over",
+ "dt_import_appendtoexisting": "Tilføy til eksisterende innhold",
+ "dt_import_summarydesc": "Importsammendrag:",
+ "dt_import_editsummary": "{{ucfirst:$1}}-importering",
+ "dt_import_importing": "Importerer...",
+ "dt_import_success": "{{PLURAL:$1|Én side|$1 sider}} vil bli importert fra $2-filen.",
+ "importcsv": "Importer CSV",
+ "importspreadsheet": "Importer regneark",
+ "dt_importcsv_badheader": "Feil: kolonneoverskriften $1, '$2', må være enten '$3', '$4' eller på formen 'malnavn[feltnavn]'",
+ "right-datatransferimport": "Importer data",
+ "dt_filetype_spreadsheet": "regneark"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/nds.json b/www/wiki/extensions/DataTransfer/i18n/nds.json
new file mode 100644
index 00000000..dc503d91
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/nds.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Joachim Mos",
+ "Slomox"
+ ]
+ },
+ "dt_viewxml_categories": "Kategorien",
+ "dt_viewxml_namespaces": "Naamrüüm",
+ "dt_xml_namespace": "Naamruum",
+ "dt_xml_pages": "Sieden",
+ "dt_xml_page": "Sied",
+ "dt_xml_template": "Vörlaag",
+ "dt_xml_name": "Naam",
+ "dt_xml_title": "Titel",
+ "dt_xml_id": "ID"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/nl.json b/www/wiki/extensions/DataTransfer/i18n/nl.json
new file mode 100644
index 00000000..0a92d68d
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/nl.json
@@ -0,0 +1,42 @@
+{
+ "@metadata": {
+ "authors": [
+ "Siebrand",
+ "Tvdm",
+ "Sjoerddebruin",
+ "Esketti"
+ ]
+ },
+ "datatransfer-desc": "Maakt het importeren en exporteren van gestructureerde gegevens in sjabloonaanroepen mogelijk",
+ "viewxml": "XML bekijken",
+ "dt_viewxml_docu": "Selecteer uit de volgende categorieën en naamruimten om in XML-formaat te bekijken.",
+ "dt_viewxml_categories": "Categorieën",
+ "dt_viewxml_namespaces": "Naamruimten",
+ "dt_viewxml_simplifiedformat": "Vereenvoudigd formaat",
+ "dt_xml_namespace": "Naamruimte",
+ "dt_xml_pages": "Pagina's",
+ "dt_xml_page": "Pagina",
+ "dt_xml_template": "Sjabloon",
+ "dt_xml_field": "Veld",
+ "dt_xml_name": "Naam",
+ "dt_xml_title": "Titel",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Vrije tekst",
+ "importxml": "XML importeren",
+ "dt_import_selectfile": "Selecteer het te importeren bestand van het type $1:",
+ "dt_import_encodingtype": "Coderingstype:",
+ "dt_import_forexisting": "Voor pagina's die al bestaan:",
+ "dt_import_overwriteexisting": "Bestaande inhoud overschrijven",
+ "dt_import_mergeintoexisting": "Alleen velden uit het bestand overschrijven",
+ "dt_import_skipexisting": "Overslaan",
+ "dt_import_appendtoexisting": "Toevoegen aan bestaande inhoud",
+ "dt_import_summarydesc": "Samenvatting van de import:",
+ "dt_import_editsummary": "{{ucfirst:$1}}-import",
+ "dt_import_importing": "Bezig met importeren…",
+ "dt_import_success": "Uit het $2-bestand {{PLURAL:$1|wordt één pagina|worden $1 pagina's}} geïmporteerd.",
+ "importcsv": "CSV importeren",
+ "importspreadsheet": "Werkblad importeren",
+ "dt_importcsv_badheader": "Fout: De kop van kolom $1, \"$2\", moet \"$3\" of \"$4\" zijn, of in de vorm \"sjabloonnaam[veldnaam]\" genoteerd worden.",
+ "right-datatransferimport": "Gegevens importeren",
+ "dt_filetype_spreadsheet": "spreadsheet"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/nn.json b/www/wiki/extensions/DataTransfer/i18n/nn.json
new file mode 100644
index 00000000..bf1eb95c
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/nn.json
@@ -0,0 +1,34 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gunnernett",
+ "Harald Khan",
+ "Jon Harald Søby",
+ "Njardarlogar"
+ ]
+ },
+ "datatransfer-desc": "Gjer det mogleg å importera og eksportera data i maloppkallingar",
+ "viewxml": "Syn XML",
+ "dt_viewxml_docu": "Vel mellom følgjande kategoriar og namnerom for å syna dei i XML-format.",
+ "dt_viewxml_categories": "Kategoriar",
+ "dt_viewxml_namespaces": "Namnerom",
+ "dt_viewxml_simplifiedformat": "Forenkla format",
+ "dt_xml_namespace": "Namnerom",
+ "dt_xml_pages": "Sider",
+ "dt_xml_page": "Side",
+ "dt_xml_template": "Mal",
+ "dt_xml_field": "Felt",
+ "dt_xml_name": "Namn",
+ "dt_xml_title": "Tittel",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Fritekst",
+ "importxml": "Importer XML",
+ "dt_import_selectfile": "Ver venleg og vel $1-fila som skal verta importert:",
+ "dt_import_encodingtype": "Teiknkodingstype:",
+ "dt_import_editsummary": "$1-importering",
+ "dt_import_importing": "Importerer...",
+ "dt_import_success": "$1 {{PLURAL:$1|Éi side vil verta importert|$1 sider vil verta importerte}} frå $2-fila.",
+ "importcsv": "Importer CSV",
+ "dt_importcsv_badheader": "Feil: kolonneoverskrifta $1, '$2', må vera anten '$3', '$4' eller på forma 'malnamn[feltnamn]'",
+ "right-datatransferimport": "Importer data"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/oc.json b/www/wiki/extensions/DataTransfer/i18n/oc.json
new file mode 100644
index 00000000..2c37c065
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/oc.json
@@ -0,0 +1,34 @@
+{
+ "@metadata": {
+ "authors": [
+ "Cedric31"
+ ]
+ },
+ "datatransfer-desc": "Permet l’impòrt e l’expòrt de donadas contengudas dins d'apèls de modèls",
+ "viewxml": "Veire XML",
+ "dt_viewxml_docu": "Seleccionatz demest las categorias e los espacis de nomenatges per visionar en format XML.",
+ "dt_viewxml_categories": "Categorias",
+ "dt_viewxml_namespaces": "Espacis de nomenatge",
+ "dt_viewxml_simplifiedformat": "Format simplificat",
+ "dt_xml_namespace": "Espaci de nom",
+ "dt_xml_pages": "Paginas",
+ "dt_xml_page": "Pagina",
+ "dt_xml_template": "Modèl",
+ "dt_xml_field": "Camp",
+ "dt_xml_name": "Nom",
+ "dt_xml_title": "Títol",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Tèxte Liure",
+ "importxml": "Impòrt en XML",
+ "dt_import_selectfile": "Seleccionatz lo fichièr $1 d'importar :",
+ "dt_import_encodingtype": "Tipe d’encodatge:",
+ "dt_import_forexisting": "Per las paginas qu'existisson ja :",
+ "dt_import_skipexisting": "Passar",
+ "dt_import_summarydesc": "Resumit de l’impòrt :",
+ "dt_import_editsummary": "importar en {{ucfirst:$1}}",
+ "dt_import_importing": "Impòrt en cors...",
+ "dt_import_success": "$1 {{PLURAL:$1|pagina serà creada|paginas seràn creadas}} dempuèi lo fichièr $2.",
+ "importcsv": "Impòrt CSV",
+ "dt_importcsv_badheader": "Error : lo títol de colomna $1, « $2 », deu èsser siá « $3 », « $4 » o de la forma « nom_del_modèl[nom_del_camp] »",
+ "right-datatransferimport": "Importar de donadas"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/or.json b/www/wiki/extensions/DataTransfer/i18n/or.json
new file mode 100644
index 00000000..d3b36281
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/or.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Odisha1",
+ "Psubhashish"
+ ]
+ },
+ "dt_viewxml_categories": "ଶ୍ରେଣୀସମୂହ",
+ "dt_xml_pages": "ପୃଷ୍ଠା",
+ "dt_xml_page": "ପୃଷ୍ଠା",
+ "dt_xml_template": "ଛାଞ୍ଚ",
+ "dt_xml_field": "କ୍ଷେତ୍ର",
+ "dt_xml_name": "ନାମ",
+ "dt_xml_title": "ଶିରୋନାମା",
+ "dt_xml_id": "ପରିଚୟ",
+ "dt_import_editsummary": "$1 ଆମଦାନୀ"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/os.json b/www/wiki/extensions/DataTransfer/i18n/os.json
new file mode 100644
index 00000000..4a9453e5
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/os.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amikeco"
+ ]
+ },
+ "dt_xml_page": "Фарс",
+ "dt_xml_template": "Шаблон",
+ "dt_xml_title": "Сæргонд"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/pdc.json b/www/wiki/extensions/DataTransfer/i18n/pdc.json
new file mode 100644
index 00000000..d9b19a32
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/pdc.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "Xqt",
+ "Purodha"
+ ]
+ },
+ "dt_viewxml_categories": "Abdeelinge",
+ "dt_viewxml_namespaces": "Blatznaame",
+ "dt_xml_namespace": "Blatznaame",
+ "dt_xml_pages": "Bledder",
+ "dt_xml_page": "Blatt",
+ "dt_xml_template": "Moddel",
+ "dt_xml_name": "Naame",
+ "dt_xml_title": "Titel"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/pl.json b/www/wiki/extensions/DataTransfer/i18n/pl.json
new file mode 100644
index 00000000..aaf785b7
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/pl.json
@@ -0,0 +1,41 @@
+{
+ "@metadata": {
+ "authors": [
+ "McMonster",
+ "Sp5uhe",
+ "Wpedzich",
+ "Chrumps"
+ ]
+ },
+ "datatransfer-desc": "Pozwala na importowanie i eksportowanie danych zawartych w wywołaniach szablonu",
+ "viewxml": "Podgląd XML",
+ "dt_viewxml_docu": "Wybierz, które spośród następujących kategorii i przestrzeni nazw chcesz podejrzeć w formacie XML.",
+ "dt_viewxml_categories": "Kategorie",
+ "dt_viewxml_namespaces": "Przestrzenie nazw",
+ "dt_viewxml_simplifiedformat": "Format uproszczony",
+ "dt_xml_namespace": "Przestrzeń nazw",
+ "dt_xml_pages": "Strony",
+ "dt_xml_page": "Strona",
+ "dt_xml_template": "Szablon",
+ "dt_xml_field": "Pole",
+ "dt_xml_name": "Nazwa",
+ "dt_xml_title": "Tytuł",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Dowolny tekst",
+ "importxml": "Import XML",
+ "dt_import_selectfile": "Wybierz plik $1 do zaimportowania",
+ "dt_import_encodingtype": "Typ kodowania",
+ "dt_import_forexisting": "Dla stron, które już istnieją:",
+ "dt_import_overwriteexisting": "Zastąp istniejącą zawartość",
+ "dt_import_skipexisting": "Pomiń",
+ "dt_import_appendtoexisting": "Dołącz do istniejącej zawartości",
+ "dt_import_summarydesc": "Podsumowanie importu",
+ "dt_import_editsummary": "Import {{ucfirst:$1}}",
+ "dt_import_importing": "Importowanie...",
+ "dt_import_success": "$1 {{PLURAL:$1|strona zostanie utworzona|strony zostaną utworzone|stron zostanie utworzonych}} z pliku $2.",
+ "importcsv": "Import CSV",
+ "importspreadsheet": "Import arkusza kalkulacyjnego",
+ "dt_importcsv_badheader": "Błąd – w kolumnie $1 nagłówka jest „$2”, a powinno być: „$3”, „$4” lub „nazwa_szablonu[nazwa_pola]”",
+ "right-datatransferimport": "Importowanie danych",
+ "dt_filetype_spreadsheet": "arkusz kalkulacyjny"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/pms.json b/www/wiki/extensions/DataTransfer/i18n/pms.json
new file mode 100644
index 00000000..a5f3e081
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/pms.json
@@ -0,0 +1,37 @@
+{
+ "@metadata": {
+ "authors": [
+ "Borichèt",
+ "Dragonòt"
+ ]
+ },
+ "datatransfer-desc": "A përmëtt d'amporté e esporté ij dat contnù ant le ciamà a stamp",
+ "viewxml": "Varda XML",
+ "dt_viewxml_docu": "Për piasì selession-a an tra le categorìe sota e jë spassi nominaj për vëdde an formà XLM.",
+ "dt_viewxml_categories": "Categorìe",
+ "dt_viewxml_namespaces": "Spassi nominaj",
+ "dt_viewxml_simplifiedformat": "Formà semplificà",
+ "dt_xml_namespace": "Spassi nominal",
+ "dt_xml_pages": "Pàgine",
+ "dt_xml_page": "Pàgina",
+ "dt_xml_template": "Stamp",
+ "dt_xml_field": "Camp",
+ "dt_xml_name": "Nòm",
+ "dt_xml_title": "Tìtol",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Test lìber",
+ "importxml": "Ampòrta XML",
+ "dt_import_selectfile": "Për piasì selession-a ël file $1 da amporté:",
+ "dt_import_encodingtype": "Tipo ëd codìfica:",
+ "dt_import_forexisting": "Për pàgine ch'a esisto già:",
+ "dt_import_overwriteexisting": "Coaté ël contnù esistent",
+ "dt_import_skipexisting": "Saoté",
+ "dt_import_appendtoexisting": "Gionté al contnù esistent",
+ "dt_import_summarydesc": "Somari dj'amportassion:",
+ "dt_import_editsummary": "$1 ampòrta",
+ "dt_import_importing": "An camin ch'as ampòrta...",
+ "dt_import_success": "$1 {{PLURAL:$1|pàgina|pàgine}} a saran creà da l'archivi $2.",
+ "importcsv": "Ampòrta CSV",
+ "dt_importcsv_badheader": "Eror: l'antestassion ëd la colòna $1, '$2', a deuv esse '$3', '$4' o ëd la forma 'template_name[field_name]'",
+ "right-datatransferimport": "Ampòrta dat"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ps.json b/www/wiki/extensions/DataTransfer/i18n/ps.json
new file mode 100644
index 00000000..92e7aac6
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ps.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ahmed-Najib-Biabani-Ibrahimkhel"
+ ]
+ },
+ "viewxml": "XML کتل",
+ "dt_viewxml_categories": "وېشنيزې",
+ "dt_viewxml_namespaces": "نوم-تشيالونه",
+ "dt_viewxml_simplifiedformat": "ساده بڼه",
+ "dt_xml_namespace": "نوم-تشيال",
+ "dt_xml_pages": "مخونه",
+ "dt_xml_page": "مخ",
+ "dt_xml_template": "کينډۍ",
+ "dt_xml_name": "نوم",
+ "dt_xml_title": "سرليک",
+ "dt_xml_id": "پېژند",
+ "dt_xml_freetext": "خپلواکه متن",
+ "dt_import_skipexisting": "تېرېدل"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/pt-br.json b/www/wiki/extensions/DataTransfer/i18n/pt-br.json
new file mode 100644
index 00000000..49425cdd
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/pt-br.json
@@ -0,0 +1,46 @@
+{
+ "@metadata": {
+ "authors": [
+ "Eduardo.mps",
+ "Giro720",
+ "Jaideraf",
+ "555",
+ "Fabsouza1",
+ "Smmvinicius",
+ "V6rg",
+ "C.R."
+ ]
+ },
+ "datatransfer-desc": "Permite a importação e exportação de dados contidos em chamadas de predefinições",
+ "viewxml": "Ver XML",
+ "dt_viewxml_docu": "Selecione entre as categorias e espaços nominais a seguir para ver em formato XML.",
+ "dt_viewxml_categories": "Categorias",
+ "dt_viewxml_namespaces": "Namespaces",
+ "dt_viewxml_simplifiedformat": "Formato simplificado",
+ "dt_xml_namespace": "Namespace",
+ "dt_xml_pages": "Páginas",
+ "dt_xml_page": "Página",
+ "dt_xml_template": "Modelo",
+ "dt_xml_field": "Campo",
+ "dt_xml_name": "Nome",
+ "dt_xml_title": "Titulo",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Free Text",
+ "importxml": "Importar XML",
+ "dt_import_selectfile": "Selecione o arquivo $1 para importar:",
+ "dt_import_encodingtype": "Codificação:",
+ "dt_import_forexisting": "Para páginas que já existem:",
+ "dt_import_overwriteexisting": "Sobrescrever o conteúdo existente",
+ "dt_import_mergeintoexisting": "Sobrescreva apenas campos contidos no arquivo",
+ "dt_import_skipexisting": "Pular",
+ "dt_import_appendtoexisting": "Adicionar ao conteúdo existente",
+ "dt_import_summarydesc": "Resumo da importação:",
+ "dt_import_editsummary": "Importação de {{ucfirst:$1}}",
+ "dt_import_importing": "Importando...",
+ "dt_import_success": "$1 {{PLURAL:$1|página será importada|páginas serão importadas}} do arquivo $2.",
+ "importcsv": "Importar CSV",
+ "importspreadsheet": "Importar planilha",
+ "dt_importcsv_badheader": "Erro: o cabeçalho da coluna $1, '$2', deve ser '$3', ou '$4' ou da forma 'nome_da_predefinição[nome_do_campo]'",
+ "right-datatransferimport": "Importar dados",
+ "dt_filetype_spreadsheet": "planilha"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/pt.json b/www/wiki/extensions/DataTransfer/i18n/pt.json
new file mode 100644
index 00000000..dfdd41e6
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/pt.json
@@ -0,0 +1,44 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hamilton Abreu",
+ "Lijealso",
+ "Luckas",
+ "Malafaya",
+ "Fúlvio",
+ "Vitorvicentevalente"
+ ]
+ },
+ "datatransfer-desc": "Permite importação e exportação de dados contidos em chamadas de predefinições",
+ "viewxml": "Ver XML",
+ "dt_viewxml_docu": "Por favor, selecione de entre as categorias e espaços nominais seguintes para ver em formato XML.",
+ "dt_viewxml_categories": "Categorias",
+ "dt_viewxml_namespaces": "Espaços nominais",
+ "dt_viewxml_simplifiedformat": "Formato simplificado",
+ "dt_xml_namespace": "Espaço nominal",
+ "dt_xml_pages": "Páginas",
+ "dt_xml_page": "Página",
+ "dt_xml_template": "Predefinição",
+ "dt_xml_field": "Campo",
+ "dt_xml_name": "Nome",
+ "dt_xml_title": "Título",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Texto Livre",
+ "importxml": "Importar XML",
+ "dt_import_selectfile": "Por favor, selecione o ficheiro $1 a importar:",
+ "dt_import_encodingtype": "Tipo de codificação:",
+ "dt_import_forexisting": "Para páginas que já existem:",
+ "dt_import_overwriteexisting": "Sobrescrever o conteúdo existente",
+ "dt_import_mergeintoexisting": "Sobrescrever apenas os campos contidos no ficheiro",
+ "dt_import_skipexisting": "Saltar",
+ "dt_import_appendtoexisting": "Acrescentar ao conteúdo existente",
+ "dt_import_summarydesc": "Resumo da importação:",
+ "dt_import_editsummary": "Importação de {{ucfirst:$1}}",
+ "dt_import_importing": "Importando...",
+ "dt_import_success": "{{PLURAL:$1|A página será importada|As páginas serão importadas}} a partir do ficheiro $2.",
+ "importcsv": "Importar CSV",
+ "importspreadsheet": "Importar folha de cálculo",
+ "dt_importcsv_badheader": "Erro: o cabeçalho da coluna $1, '$2', deve ser '$3', '$4' ou ter a forma 'nome_da_predefinição[nome_do_campo]'",
+ "right-datatransferimport": "Importar dados",
+ "dt_filetype_spreadsheet": "folha de cálculo"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/qqq.json b/www/wiki/extensions/DataTransfer/i18n/qqq.json
new file mode 100644
index 00000000..a6a60b7b
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/qqq.json
@@ -0,0 +1,49 @@
+{
+ "@metadata": {
+ "authors": [
+ "EugeneZelenko",
+ "Fryed-peach",
+ "Jon Harald Søby",
+ "Kghbln",
+ "Purodha",
+ "Raymond",
+ "Shirayuki",
+ "Siebrand",
+ "Umherirrender"
+ ]
+ },
+ "datatransfer-desc": "{{Desc|name=Data Transfer|url=https://www.mediawiki.org/wiki/Extension:Data_Transfer}}",
+ "viewxml": "{{doc-special|ViewXML|unlisted=1}}",
+ "dt_viewxml_docu": "Used as heading of the form.\n\nThis message is followed by HTML <code><nowiki><h2></nowiki></code> heading {{msg-mw|Dt viewxml categories}}.",
+ "dt_viewxml_categories": "{{Identical|Category}}",
+ "dt_viewxml_namespaces": "{{Identical|Namespace}}",
+ "dt_viewxml_simplifiedformat": "Used as checkbox label in the \"View XML\" form.\n\nIf enabled, the extension generates simplified XML.",
+ "dt_xml_namespace": "Used as XML tag name.\n{{Identical|Namespace}}",
+ "dt_xml_pages": "Used as XML tag name.\n{{Identical|Page}}",
+ "dt_xml_page": "Used as XML tag name.\n{{Identical|Page}}",
+ "dt_xml_template": "Used as XML tag name.\n{{Identical|Template}}",
+ "dt_xml_field": "Used as XML tag name.\n{{Identical|Field}}",
+ "dt_xml_name": "Used as XML tag name.\n{{Identical|Name}}",
+ "dt_xml_title": "Used as XML tag name.\n{{Identical|Title}}",
+ "dt_xml_id": "Used as XML tag name.\n{{Identical|ID}}",
+ "dt_xml_freetext": "Used as XML tag name.\n{{Identical|Free text}}",
+ "importxml": "{{doc-special|ImportXML|unlisted=1}}",
+ "dt_import_selectfile": "Used as label for the File selector. Parameters:\n* $1 - the file format: CSV, XML or spreadsheet",
+ "dt_import_encodingtype": "The type of encoding for the file: either UTF-8 or UTF-16",
+ "dt_import_forexisting": "This message is followed by the following radio boxes:\n* {{msg-mw|Dt import overwriteexisting}}\n* {{msg-mw|Dt import mergeintoexisting}}\n* {{msg-mw|Dt import skipexisting}}\n* {{msg-mw|Dt import appendtoexisting}}",
+ "dt_import_overwriteexisting": "Used as label for the radiobutton.\n{{Related|Dt import forexisting}}",
+ "dt_import_mergeintoexisting": "Used as label for the radiobutton.\n{{Related|Dt import forexisting}}",
+ "dt_import_skipexisting": "Used as label for the radiobutton.\n{{Related|Dt import forexisting}}\n{{Identical|Skip}}",
+ "dt_import_appendtoexisting": "Used as label for the radiobutton.\n{{Related|Dt import forexisting}}",
+ "dt_import_summarydesc": "Used as label for the \"Summary text of import\" input box.\n\nThe default value of the input box is {{msg-mw|Dt import editsummary}}.",
+ "dt_import_editsummary": "This message is part of the editsummary. It prints the result of the import in the version history of the respective page content was imported to.\n\nParameters:\n* $1 - the file format: CSV, XML or spreadsheet\n{{Identical|Import}}",
+ "dt_import_importing": "This message indicates the extension is currently importing a CSV file (or an XML file).\n{{Identical|Importing}}",
+ "dt_import_success": "Parameters:\n* $1 - the number of pages\n* $2 - the file format: CSV, XML or spreadsheet",
+ "importcsv": "{{doc-special|ImportCSV|unlisted=1}}\nCSV (comma separated value)",
+ "importspreadsheet": "{{doc-special|ImportSpreadsheet|unlisted=1}}",
+ "dt_importcsv_badheader": "The text \"template_name[field_name]\" can be translated. Parameters:\n* $1 - a column number in the first row of the CVS file\n* $2 - the value found for the $1th column in the first line of the CSV file\n* $3 - the title label\n* $4 - a free text label",
+ "right-datatransferimport": "{{doc-right|datatransferimport}}",
+ "dt_filetype_xml": "The type of the file that is to be imported. This is a descriptive name, NOT a file extension.",
+ "dt_filetype_csv": "The type of the file that is to be imported. This is a descriptive name, NOT a file extension.",
+ "dt_filetype_spreadsheet": "The type of the file that is to be imported. This is a descriptive name, NOT a file extension. Patchwork message with {{msg-mw|Dt import editsummary}} as suffix."
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ro.json b/www/wiki/extensions/DataTransfer/i18n/ro.json
new file mode 100644
index 00000000..7e3d924b
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ro.json
@@ -0,0 +1,31 @@
+{
+ "@metadata": {
+ "authors": [
+ "KlaudiuMihaila",
+ "Minisarm",
+ "Stelistcristi"
+ ]
+ },
+ "viewxml": "Vizualizează XML",
+ "dt_viewxml_categories": "Categorii",
+ "dt_viewxml_namespaces": "Spații de nume",
+ "dt_viewxml_simplifiedformat": "Format simplificat",
+ "dt_xml_namespace": "Spațiu de nume",
+ "dt_xml_pages": "Pagini",
+ "dt_xml_page": "Pagină",
+ "dt_xml_template": "Format",
+ "dt_xml_field": "Câmp",
+ "dt_xml_name": "Nume",
+ "dt_xml_title": "Titlu",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Text liber",
+ "importxml": "Importă XML",
+ "dt_import_encodingtype": "Tipul de codificare:",
+ "dt_import_forexisting": "Pentru pagini care există deja:",
+ "dt_import_skipexisting": "Omite",
+ "dt_import_summarydesc": "Descrierea importului:",
+ "dt_import_editsummary": "Importare {{ucfirst:$1}}",
+ "dt_import_importing": "Importare...",
+ "importcsv": "Importă CSV",
+ "right-datatransferimport": "Importă date"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/roa-tara.json b/www/wiki/extensions/DataTransfer/i18n/roa-tara.json
new file mode 100644
index 00000000..8ecd0140
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/roa-tara.json
@@ -0,0 +1,39 @@
+{
+ "@metadata": {
+ "authors": [
+ "Joetaras"
+ ]
+ },
+ "datatransfer-desc": "Permètte de 'mbortà e esportà date strutturate ca stonne jndr'à le chiamate a le template",
+ "viewxml": "Vide l'XML",
+ "dt_viewxml_docu": "Pe piacere scacchie ìmbrà le categorije seguende e le namespace seguende pe vedè 'u formate XML.",
+ "dt_viewxml_categories": "Categorije",
+ "dt_viewxml_namespaces": "Namespace",
+ "dt_viewxml_simplifiedformat": "Formate semblifichete",
+ "dt_xml_namespace": "Namespace",
+ "dt_xml_pages": "Pàggene",
+ "dt_xml_page": "Pàgene",
+ "dt_xml_template": "Template",
+ "dt_xml_field": "Cambe",
+ "dt_xml_name": "Nome",
+ "dt_xml_title": "Titele",
+ "dt_xml_id": "Codece (ID)",
+ "dt_xml_freetext": "Teste libbere",
+ "importxml": "'Mborte XML",
+ "dt_import_selectfile": "Pe piacere scacchia 'u file $1 da 'mbortà:",
+ "dt_import_encodingtype": "Tipe de codifeche:",
+ "dt_import_forexisting": "Pe le pàggene ca ggià esistene:",
+ "dt_import_overwriteexisting": "Sovrascrive 'u condenute ca esiste",
+ "dt_import_mergeintoexisting": "Sovrascrive sulamende le cambe ca stonne jndr'à 'u file",
+ "dt_import_skipexisting": "Zumbe",
+ "dt_import_appendtoexisting": "'Nzicche a 'u condenute ca esiste",
+ "dt_import_summarydesc": "Ripeloghe de l'imbortazione:",
+ "dt_import_editsummary": "'Mborte {{ucfirst:$1}}",
+ "dt_import_importing": "Stoche a 'mborte...",
+ "dt_import_success": "$1 {{PLURAL:$1|pàgene|pàggene}} ca onna essere ccrejate da 'u file $2.",
+ "importcsv": "'Mborte CSV",
+ "importspreadsheet": "'Mborte 'u foglie de calcole",
+ "dt_importcsv_badheader": "Errore: 'a testate d'a colonne $1, '$2', adda essere o '$3' o '$4' o une de le module 'template_name[field_name]'",
+ "right-datatransferimport": "'Mborte date",
+ "dt_filetype_spreadsheet": "foglie de calcole"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/rtm.json b/www/wiki/extensions/DataTransfer/i18n/rtm.json
new file mode 100644
index 00000000..7e0847d2
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/rtm.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jose77"
+ ]
+ },
+ "dt_viewxml_categories": "Katekori"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ru.json b/www/wiki/extensions/DataTransfer/i18n/ru.json
new file mode 100644
index 00000000..80f1d0d2
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ru.json
@@ -0,0 +1,43 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ferrer",
+ "Innv",
+ "Lockal",
+ "Okras",
+ "Александр Сигачёв"
+ ]
+ },
+ "datatransfer-desc": "Позволяет импортировать и экспортировать данные, содержащиеся в вызовах шаблонов",
+ "viewxml": "Просмотр XML",
+ "dt_viewxml_docu": "Пожалуйста, выберите категории и пространства имён для просмотра в формате XML.",
+ "dt_viewxml_categories": "Категории",
+ "dt_viewxml_namespaces": "Пространства имён",
+ "dt_viewxml_simplifiedformat": "Упрощённый формат",
+ "dt_xml_namespace": "Пространство имён",
+ "dt_xml_pages": "Страницы",
+ "dt_xml_page": "Страница",
+ "dt_xml_template": "Шаблон",
+ "dt_xml_field": "Поле",
+ "dt_xml_name": "Имя",
+ "dt_xml_title": "Заголовок",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Свободный текст",
+ "importxml": "Импорт XML",
+ "dt_import_selectfile": "Пожалуйста, выберите файл $1 для импорта:",
+ "dt_import_encodingtype": "Тип кодировки:",
+ "dt_import_forexisting": "Для страниц, которые уже существуют:",
+ "dt_import_overwriteexisting": "Переписать существующие данные",
+ "dt_import_mergeintoexisting": "Перезаписывать только поля, содержащиеся в файле",
+ "dt_import_skipexisting": "Пропустить",
+ "dt_import_appendtoexisting": "Добавить к существующим данным",
+ "dt_import_summarydesc": "Описание импорта:",
+ "dt_import_editsummary": "импорт из {{ucfirst:$1}}",
+ "dt_import_importing": "Импортирование...",
+ "dt_import_success": "$1 {{PLURAL:$1|страница была|страницы были|страниц были}} созданы из файла $2.",
+ "importcsv": "Импорт CSV",
+ "importspreadsheet": "Импорт таблицы",
+ "dt_importcsv_badheader": "Ошибка. Заголовок колонки №$1 «$2» должен быть или «$3», или «$4», или в форме «template_name[field_name]»",
+ "right-datatransferimport": "Импорт данных",
+ "dt_filetype_spreadsheet": "таблица"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/rue.json b/www/wiki/extensions/DataTransfer/i18n/rue.json
new file mode 100644
index 00000000..18d78896
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/rue.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gazeb"
+ ]
+ },
+ "dt_viewxml_categories": "Катеґорії",
+ "dt_viewxml_namespaces": "Просторы назв",
+ "dt_viewxml_simplifiedformat": "Простый формат",
+ "dt_xml_namespace": "Простор назв",
+ "dt_xml_pages": "Сторінкы",
+ "dt_xml_page": "Сторінка",
+ "dt_xml_template": "Шаблона",
+ "dt_xml_field": "Поле",
+ "dt_xml_name": "Назва",
+ "dt_xml_title": "Надпис",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Вольный текст",
+ "importxml": "Імпортовати XML"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/scn.json b/www/wiki/extensions/DataTransfer/i18n/scn.json
new file mode 100644
index 00000000..43903ccf
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/scn.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Aushulz"
+ ]
+ },
+ "dt_xml_name": "Nomu",
+ "dt_xml_id": "ID"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/sd.json b/www/wiki/extensions/DataTransfer/i18n/sd.json
new file mode 100644
index 00000000..6dc63ac3
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/sd.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Mehtab ahmed"
+ ]
+ },
+ "dt_xml_pages": "صفحا"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/si.json b/www/wiki/extensions/DataTransfer/i18n/si.json
new file mode 100644
index 00000000..7c1bf082
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/si.json
@@ -0,0 +1,32 @@
+{
+ "@metadata": {
+ "authors": [
+ "පසිඳු කාවින්ද"
+ ]
+ },
+ "viewxml": "XML නරඹන්න",
+ "dt_viewxml_categories": "ප්‍රවර්ගයන්",
+ "dt_viewxml_namespaces": "නාමඅවකාශයන්",
+ "dt_viewxml_simplifiedformat": "සුළු කළ ආකෘතිය",
+ "dt_xml_namespace": "නාමඅවකාශය",
+ "dt_xml_pages": "පිටු",
+ "dt_xml_page": "පිටුව",
+ "dt_xml_template": "සැකිල්ල",
+ "dt_xml_field": "ක්ෂේත්‍රය",
+ "dt_xml_name": "නම",
+ "dt_xml_title": "ශීර්ෂය",
+ "dt_xml_id": "හැඳුනුම",
+ "dt_xml_freetext": "නිදහස් පාඨය",
+ "importxml": "XML ආයාත කරන්න",
+ "dt_import_selectfile": "ආයාත කිරීම සඳහා කරුණාකර $1 ගොනුව තෝරන්න:",
+ "dt_import_encodingtype": "කේතීකරණ වර්ගය:",
+ "dt_import_forexisting": "දැනටමත් පවතින පිටු සඳහා:",
+ "dt_import_overwriteexisting": "පවතින අන්තර්ගතය අධිලිවීමකට ලක්කරන්න",
+ "dt_import_skipexisting": "මඟ හරින්න",
+ "dt_import_appendtoexisting": "පවත්නා අන්තර්ගතයට අමුණන්න",
+ "dt_import_summarydesc": "ආයාත කිරීමේ සාරාංශය:",
+ "dt_import_editsummary": "$1 ආයාත කරන්න",
+ "dt_import_importing": "ආයාත කරමින්...",
+ "importcsv": "CSV ආයාත කරන්න",
+ "right-datatransferimport": "දත්ත ආයාත කරන්න"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/sk.json b/www/wiki/extensions/DataTransfer/i18n/sk.json
new file mode 100644
index 00000000..494f1d1a
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/sk.json
@@ -0,0 +1,31 @@
+{
+ "@metadata": {
+ "authors": [
+ "Helix84"
+ ]
+ },
+ "datatransfer-desc": "Umožňuje import a export údajov obsiahnutých v bunkách šablón",
+ "viewxml": "Zobraziť XML",
+ "dt_viewxml_docu": "Prosím, vyberte ktorý spomedzi nasledovných kategórií a menných priestorov zobraziť vo formáte XML.",
+ "dt_viewxml_categories": "Kategórie",
+ "dt_viewxml_namespaces": "Menné priestory",
+ "dt_viewxml_simplifiedformat": "Zjednodušený formát",
+ "dt_xml_namespace": "Menný priestor",
+ "dt_xml_pages": "Stránky",
+ "dt_xml_page": "Stránka",
+ "dt_xml_template": "Šablóna",
+ "dt_xml_field": "Pole",
+ "dt_xml_name": "Názov",
+ "dt_xml_title": "Nadpis",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Voľný text",
+ "importxml": "Importovať XML",
+ "dt_import_selectfile": "Prosím, vyberte $1 súbor, ktorý chcete importovať:",
+ "dt_import_encodingtype": "Typ kódovania:",
+ "dt_import_editsummary": "Import $1",
+ "dt_import_importing": "Prebieha import...",
+ "dt_import_success": "Z $2 súboru sa {{PLURAL:$1|importuje $1 stránka|importujú $1 stránky|importuje $1 stránok}}.",
+ "importcsv": "Import CSV",
+ "dt_importcsv_badheader": "Chyba: stĺpec $1 hlavičky, „$2“ musí mať hodnotu buď „$3“, „$4“ alebo byť v tvare „názov_šablóny[názov_poľa]“",
+ "right-datatransferimport": "Importovať údaje"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/sl.json b/www/wiki/extensions/DataTransfer/i18n/sl.json
new file mode 100644
index 00000000..3fe235e0
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/sl.json
@@ -0,0 +1,39 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dbc334"
+ ]
+ },
+ "datatransfer-desc": "Omogoča uvažanje in izvažanje podatkov iz klicev predlog",
+ "viewxml": "Ogled XML",
+ "dt_viewxml_docu": "Prosimo, izberite med naslednjimi kategorijami in imenskimi prostori za ogled v obliki XML.",
+ "dt_viewxml_categories": "Kategorije",
+ "dt_viewxml_namespaces": "Imenski prostori",
+ "dt_viewxml_simplifiedformat": "Poenostavljena oblika",
+ "dt_xml_namespace": "Imenski prostor",
+ "dt_xml_pages": "Strani",
+ "dt_xml_page": "Stran",
+ "dt_xml_template": "Predloga",
+ "dt_xml_field": "Polje",
+ "dt_xml_name": "Ime",
+ "dt_xml_title": "Naslov",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Prosto besedilo",
+ "importxml": "Uvozi XML",
+ "dt_import_selectfile": "Prosimo, izberite datoteko $1 za uvoz:",
+ "dt_import_encodingtype": "Vrsta kodiranja:",
+ "dt_import_forexisting": "Za že obstoječe strani:",
+ "dt_import_overwriteexisting": "Prepiši obstoječo vsebino",
+ "dt_import_mergeintoexisting": "Prepiši samo polja iz datoteke",
+ "dt_import_skipexisting": "Preskoči",
+ "dt_import_appendtoexisting": "Dodaj obstoječi vsebini",
+ "dt_import_summarydesc": "Povzetek uvoza:",
+ "dt_import_editsummary": "uvoz $1",
+ "dt_import_importing": "Uvažanje ...",
+ "dt_import_success": "Iz datoteke $2 bom ustvaril $1 {{PLURAL:$1|stran|strani}}.",
+ "importcsv": "Uvozi CSV",
+ "importspreadsheet": "Uvoz preglednice",
+ "dt_importcsv_badheader": "Napaka: glava stolpca $1, '$2', mora biti '$3', '$4' ali oblike 'template_name[field_name]'",
+ "right-datatransferimport": "Uvoz podatkov",
+ "dt_filetype_spreadsheet": "preglednice"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/sr-ec.json b/www/wiki/extensions/DataTransfer/i18n/sr-ec.json
new file mode 100644
index 00000000..8d05f0ab
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/sr-ec.json
@@ -0,0 +1,37 @@
+{
+ "@metadata": {
+ "authors": [
+ "Rancher",
+ "Sasa Stefanovic",
+ "Жељко Тодоровић",
+ "Михајло Анђелковић",
+ "Milicevic01",
+ "Acamicamacaraca",
+ "BadDog"
+ ]
+ },
+ "viewxml": "Приказ XML-а",
+ "dt_viewxml_categories": "Категорије",
+ "dt_viewxml_namespaces": "Именски простори",
+ "dt_viewxml_simplifiedformat": "Поједностављени формат",
+ "dt_xml_namespace": "Именски простор",
+ "dt_xml_pages": "Странице",
+ "dt_xml_page": "Страница",
+ "dt_xml_template": "Шаблон",
+ "dt_xml_field": "Поље",
+ "dt_xml_name": "Име",
+ "dt_xml_title": "Наслов",
+ "dt_xml_id": "Назнака",
+ "dt_xml_freetext": "Слободан текст",
+ "importxml": "Увези XML",
+ "dt_import_encodingtype": "Врста кодирања:",
+ "dt_import_forexisting": "За странице које већ постоје:",
+ "dt_import_overwriteexisting": "Замени постојећи садржај",
+ "dt_import_skipexisting": "Прескочи",
+ "dt_import_appendtoexisting": "Додај у постојећи садржај",
+ "dt_import_summarydesc": "Опис увоза:",
+ "dt_import_editsummary": "{{ucfirst:$1}} увоз",
+ "dt_import_importing": "Увоз у току...",
+ "importcsv": "Увези CSV",
+ "right-datatransferimport": "Увези податке"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/sr-el.json b/www/wiki/extensions/DataTransfer/i18n/sr-el.json
new file mode 100644
index 00000000..f7c388b8
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/sr-el.json
@@ -0,0 +1,27 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michaello",
+ "Жељко Тодоровић",
+ "Milicevic01"
+ ]
+ },
+ "viewxml": "Vidi XML",
+ "dt_viewxml_categories": "Kategorije",
+ "dt_viewxml_namespaces": "Imenski prostori",
+ "dt_viewxml_simplifiedformat": "Pojednostavljeni format",
+ "dt_xml_namespace": "Imenski prostor",
+ "dt_xml_pages": "Članci",
+ "dt_xml_page": "Stranica",
+ "dt_xml_template": "Šablon",
+ "dt_xml_field": "Polje",
+ "dt_xml_name": "Ime",
+ "dt_xml_title": "Naslov",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Slobodan tekst",
+ "importxml": "Uvezi XML",
+ "dt_import_editsummary": "{{ucfirst:$1}} uvoz",
+ "dt_import_importing": "Uvoz u toku...",
+ "importcsv": "Uvezi CSV",
+ "right-datatransferimport": "Uvezi podatke"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/stq.json b/www/wiki/extensions/DataTransfer/i18n/stq.json
new file mode 100644
index 00000000..0f8b4ae3
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/stq.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "Pyt"
+ ]
+ },
+ "datatransfer-desc": "Ferlööwet dän Import un Export fon strukturierde Doaten, do der in Aproupen un Foarloagen ferwoand wäide.",
+ "viewxml": "XML ankiekje",
+ "dt_viewxml_docu": "Wääl uut, wäkke Kategorien in dät XML-Formoat anwiesd wäide skällen.",
+ "dt_viewxml_categories": "Kategorien",
+ "dt_viewxml_namespaces": "Noomensruume",
+ "dt_viewxml_simplifiedformat": "Fereenfacht Formoat",
+ "dt_xml_namespace": "Noomensruum",
+ "dt_xml_page": "Siede",
+ "dt_xml_field": "Fäild",
+ "dt_xml_name": "Noome",
+ "dt_xml_title": "Tittel"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/su.json b/www/wiki/extensions/DataTransfer/i18n/su.json
new file mode 100644
index 00000000..78f90b4d
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/su.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Irwangatot"
+ ]
+ },
+ "dt_viewxml_namespaces": "Ngaranspasi"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/sv.json b/www/wiki/extensions/DataTransfer/i18n/sv.json
new file mode 100644
index 00000000..4c216e61
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/sv.json
@@ -0,0 +1,46 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fluff",
+ "Gabbe.g",
+ "Jopparn",
+ "Lejonel",
+ "M.M.S.",
+ "Per",
+ "Rotsee",
+ "WikiPhoenix"
+ ]
+ },
+ "datatransfer-desc": "Tillåter import och export av data som finns i mallanrop",
+ "viewxml": "Visa XML",
+ "dt_viewxml_docu": "Välj vilka av följande kategorier och namnrymder som ska visas i XML-format.",
+ "dt_viewxml_categories": "Kategorier",
+ "dt_viewxml_namespaces": "Namnrymder",
+ "dt_viewxml_simplifiedformat": "Förenklat format",
+ "dt_xml_namespace": "Namnrymd",
+ "dt_xml_pages": "Sidor",
+ "dt_xml_page": "Sida",
+ "dt_xml_template": "Mall",
+ "dt_xml_field": "Fält",
+ "dt_xml_name": "Namn",
+ "dt_xml_title": "Titel",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Fritext",
+ "importxml": "Importera XML",
+ "dt_import_selectfile": "Vänligen välj $1-filen som skall importeras:",
+ "dt_import_encodingtype": "Teckenkodningstyp:",
+ "dt_import_forexisting": "För sidor som redan finns:",
+ "dt_import_overwriteexisting": "Skriv över existerande innehåll",
+ "dt_import_mergeintoexisting": "Skriv endast över fält som finns i filen",
+ "dt_import_skipexisting": "Hoppa över",
+ "dt_import_appendtoexisting": "Lägg till efter befintligt innehåll",
+ "dt_import_summarydesc": "Sammanfattning av importen:",
+ "dt_import_editsummary": "importera {{ucfirst:$1}}",
+ "dt_import_importing": "Importerar...",
+ "dt_import_success": "$1 {{PLURAL:$1|sida|sidor}} kommer skapas från $2-filen.",
+ "importcsv": "Importera CSV",
+ "importspreadsheet": "Importera kalkylblad",
+ "dt_importcsv_badheader": "Fel: Titeln $2 för kolumnen $1 måste vara antingen $3, $4 eller på formen 'mallnamn[fältnamn]'",
+ "right-datatransferimport": "Importera data",
+ "dt_filetype_spreadsheet": "kalkylblad"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/szl.json b/www/wiki/extensions/DataTransfer/i18n/szl.json
new file mode 100644
index 00000000..1b968c70
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/szl.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Herr Kriss"
+ ]
+ },
+ "dt_xml_page": "Zajta",
+ "dt_xml_name": "Mjano"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ta.json b/www/wiki/extensions/DataTransfer/i18n/ta.json
new file mode 100644
index 00000000..45310bf7
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ta.json
@@ -0,0 +1,37 @@
+{
+ "@metadata": {
+ "authors": [
+ "Karthi.dr",
+ "Shanmugamp7",
+ "TRYPPN",
+ "Trengarasu",
+ "Ulmo",
+ "மதனாஹரன்",
+ "ElangoRamanujam"
+ ]
+ },
+ "viewxml": "XML ஐப் பார்",
+ "dt_viewxml_categories": "பகுப்புகள்",
+ "dt_viewxml_namespaces": "பெயர்வெளிகள்",
+ "dt_viewxml_simplifiedformat": "எளிதாக்கப்பட்ட வடிவம்",
+ "dt_xml_namespace": "பெயர்வெளி",
+ "dt_xml_pages": "பக்கங்கள்",
+ "dt_xml_page": "பக்கம்",
+ "dt_xml_template": "வார்ப்புரு",
+ "dt_xml_field": "புலம்",
+ "dt_xml_name": "பெயர்",
+ "dt_xml_title": "தலைப்பு",
+ "dt_xml_id": "அடையாளம்",
+ "dt_xml_freetext": "எந்த கட்டுப்பாடும் இல்லா சொற்றொடர்",
+ "importxml": "XML இறக்குமதி செய்",
+ "dt_import_selectfile": "தயவுசெய்து $1 கோப்பை இறக்குமதிக்காக தேர்வுசெய்யவும்:",
+ "dt_import_forexisting": "ஏற்கனவே உள்ள பக்கங்களுக்கு:",
+ "dt_import_overwriteexisting": "தற்போதுள்ள உள்ளடக்கத்தை அழித்தெழுது",
+ "dt_import_skipexisting": "தவிர்",
+ "dt_import_appendtoexisting": "ஏற்கனவே உள்ள உள்ளடக்கத்துடன் இணை",
+ "dt_import_summarydesc": "இறக்குமதிச் சுருக்கம்:",
+ "dt_import_editsummary": "{{ucfirst:$1}} இறக்குமதி",
+ "dt_import_importing": "இறக்குமதியாகிறது...",
+ "dt_import_success": "$2 கோப்பிலிருந்து $1 {{PLURAL:$1|பக்கம்|பக்கங்கள்}} உருவாக்கப்படும்.",
+ "right-datatransferimport": "தரவுகளை ஏற்றுமதி செய்யவும்"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/te.json b/www/wiki/extensions/DataTransfer/i18n/te.json
new file mode 100644
index 00000000..28783b71
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/te.json
@@ -0,0 +1,27 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chaduvari",
+ "Veeven"
+ ]
+ },
+ "viewxml": "XMLని చూడండి",
+ "dt_viewxml_categories": "వర్గాలు",
+ "dt_viewxml_namespaces": "పేరుబరులు",
+ "dt_xml_namespace": "పేరుబరి",
+ "dt_xml_pages": "పేజీలు",
+ "dt_xml_page": "పేజీ",
+ "dt_xml_template": "మూస",
+ "dt_xml_name": "పేరు",
+ "dt_xml_title": "శీర్షిక",
+ "dt_xml_id": "ఐడీ",
+ "dt_xml_freetext": "స్వేచ్ఛా పాఠ్యం",
+ "dt_import_appendtoexisting": "ఈసరికే ఉన్న కంటెంటు వెనుక చేర్చు",
+ "dt_import_summarydesc": "దిగుమతి సారాంశం:",
+ "dt_import_editsummary": "$1 దిగుమతి",
+ "dt_import_importing": "దిగుమతి చేస్తున్నాం...",
+ "dt_import_success": "ఫైలు $2 నుండి $1 {{PLURAL:$1|పేజీ|పేజీలు}} సృష్టించబడతాయి.",
+ "importcsv": "CSV ని దిగుమతి చెయ్యి",
+ "dt_importcsv_badheader": "లోపం: నిలువు వరుస $1 శీర్షం, '$2', '$3' అయినా లేక '$4' అయినా ఉండాలి. లేదా 'template_name[field_name]' రూపంలో అయినా ఉండాలి",
+ "right-datatransferimport": "డేటాను దిగుమతి చెయ్యి"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/tet.json b/www/wiki/extensions/DataTransfer/i18n/tet.json
new file mode 100644
index 00000000..8c5b348f
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/tet.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "MF-Warburg"
+ ]
+ },
+ "dt_viewxml_categories": "Kategoria sira",
+ "dt_xml_namespace": "Espasu pájina nian",
+ "dt_xml_pages": "Pájina sira",
+ "dt_xml_page": "Pájina",
+ "dt_xml_name": "Naran",
+ "dt_xml_title": "Títulu:",
+ "dt_xml_id": "ID"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/tg-cyrl.json b/www/wiki/extensions/DataTransfer/i18n/tg-cyrl.json
new file mode 100644
index 00000000..8eafde42
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/tg-cyrl.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ibrahim"
+ ]
+ },
+ "dt_viewxml_categories": "Гурӯҳҳо",
+ "dt_viewxml_namespaces": "Фазоҳои ном",
+ "dt_xml_namespace": "Фазоином",
+ "dt_xml_page": "Саҳифа",
+ "dt_xml_name": "Ном",
+ "dt_xml_title": "Унвон",
+ "dt_xml_freetext": "Матни дилхоҳ"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/tg-latn.json b/www/wiki/extensions/DataTransfer/i18n/tg-latn.json
new file mode 100644
index 00000000..1763bdb5
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/tg-latn.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "Liangent"
+ ]
+ },
+ "dt_viewxml_categories": "Gurūhho",
+ "dt_viewxml_namespaces": "Fazohoi nom",
+ "dt_xml_namespace": "Fazoinom",
+ "dt_xml_page": "Sahifa",
+ "dt_xml_name": "Nom",
+ "dt_xml_title": "Unvon",
+ "dt_xml_freetext": "Matni dilxoh"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/th.json b/www/wiki/extensions/DataTransfer/i18n/th.json
new file mode 100644
index 00000000..e9c26545
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/th.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Octahedron80"
+ ]
+ },
+ "dt_viewxml_categories": "หมวดหมู่",
+ "dt_viewxml_namespaces": "เนมสเปซ",
+ "dt_xml_namespace": "เนมสเปซ"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/tk.json b/www/wiki/extensions/DataTransfer/i18n/tk.json
new file mode 100644
index 00000000..c73200d3
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/tk.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hanberke"
+ ]
+ },
+ "dt_xml_page": "Sahypa",
+ "dt_xml_name": "At"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/tl.json b/www/wiki/extensions/DataTransfer/i18n/tl.json
new file mode 100644
index 00000000..3bc4d120
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/tl.json
@@ -0,0 +1,36 @@
+{
+ "@metadata": {
+ "authors": [
+ "AnakngAraw"
+ ]
+ },
+ "datatransfer-desc": "Nagpapahintulot sa pag-aangkat at pagluluwas ng mga datong nasa loob ng mga pagtawag sa suleras",
+ "viewxml": "Tingnan ang XML",
+ "dt_viewxml_docu": "Pumili po lamang mula sa sumusunod na mga kaurian at mga espasyo ng pangalan upang makita ang anyong XML.",
+ "dt_viewxml_categories": "Mga kaurian",
+ "dt_viewxml_namespaces": "Mga espasyo ng pangalan",
+ "dt_viewxml_simplifiedformat": "Pinapayak na anyo",
+ "dt_xml_namespace": "Espasyo ng pangalan",
+ "dt_xml_pages": "Mga pahina",
+ "dt_xml_page": "Pahina",
+ "dt_xml_template": "Suleras",
+ "dt_xml_field": "Hanay",
+ "dt_xml_name": "Pangalan",
+ "dt_xml_title": "Pamagat",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Malayang Teksto",
+ "importxml": "Angkatin ang XML",
+ "dt_import_selectfile": "Pakipili ang talaksang $1 na aangkatin:",
+ "dt_import_encodingtype": "Uri ng pagkokodigo:",
+ "dt_import_forexisting": "Para sa mga pahinang umiiral na:",
+ "dt_import_overwriteexisting": "Patungan ang umiiral na nilalaman",
+ "dt_import_skipexisting": "Laktawan",
+ "dt_import_appendtoexisting": "Isugpong sa umiiral na nilalaman",
+ "dt_import_summarydesc": "Buod ng pag-angkat:",
+ "dt_import_editsummary": "Pag-angkat ng $1",
+ "dt_import_importing": "Inaangkat...",
+ "dt_import_success": "$1 {{PLURAL:$1|pahina|mga pahina}} ang lilikhain mula sa talaksang $2.",
+ "importcsv": "Angkatin ang CSV",
+ "dt_importcsv_badheader": "Kamalian: ang patayong hanay ng paulong $1, '$2', ay dapat na '$3', '$4' o nasa pormang 'template_name[field_name]'",
+ "right-datatransferimport": "Angkatin ang dato"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/tly.json b/www/wiki/extensions/DataTransfer/i18n/tly.json
new file mode 100644
index 00000000..2390b306
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/tly.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Erdemaslancan"
+ ]
+ },
+ "dt_xml_page": "Сәһифә"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/tr.json b/www/wiki/extensions/DataTransfer/i18n/tr.json
new file mode 100644
index 00000000..d6acb5e1
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/tr.json
@@ -0,0 +1,37 @@
+{
+ "@metadata": {
+ "authors": [
+ "Joseph",
+ "Karduelis",
+ "Mach",
+ "Manco Capac",
+ "Srhat",
+ "Vito Genovese"
+ ]
+ },
+ "datatransfer-desc": "Şablon çağrılarında içerilen verilerin içe ve dışa aktarımına izin verir",
+ "viewxml": "XML'i gör",
+ "dt_viewxml_docu": "Lütfen, XML formatında görüntülemek için aşağıdaki kategori ve ad alanları arasından seçin.",
+ "dt_viewxml_categories": "Kategoriler",
+ "dt_viewxml_namespaces": "İsim alanları",
+ "dt_viewxml_simplifiedformat": "Basitleştirilmiş format",
+ "dt_xml_namespace": "Ad alanı",
+ "dt_xml_pages": "Sayfalar",
+ "dt_xml_page": "Sayfa",
+ "dt_xml_template": "Şablon",
+ "dt_xml_field": "Alan",
+ "dt_xml_name": "İsim",
+ "dt_xml_title": "Başlık",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Özgür Metin",
+ "importxml": "XML içe aktar",
+ "dt_import_selectfile": "Lütfen içe aktarmak için $1 dosyasını seçin:",
+ "dt_import_encodingtype": "Kodlama türü:",
+ "dt_import_summarydesc": "İçe aktarma özeti:",
+ "dt_import_editsummary": "$1 içe aktarımı",
+ "dt_import_importing": "İçe aktarıyor...",
+ "dt_import_success": "$2 dosyasından $1 {{PLURAL:$1|sayfa|sayfa}} oluşturulacak.",
+ "importcsv": "CSV'yi içe aktar",
+ "dt_importcsv_badheader": "Hata: $1 kolonunun başlığı olan '$2', '$3', '$4' ya da 'şablon_adı[alan_adı]' şeklinde olmalıdır",
+ "right-datatransferimport": "Verileri içe aktarır"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/tt-cyrl.json b/www/wiki/extensions/DataTransfer/i18n/tt-cyrl.json
new file mode 100644
index 00000000..f2389914
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/tt-cyrl.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ильнар"
+ ]
+ },
+ "dt_viewxml_categories": "Төркемнәр",
+ "dt_viewxml_namespaces": "Исемнәр мәйданы",
+ "dt_viewxml_simplifiedformat": "Гадиләштерелгән формат",
+ "dt_xml_namespace": "Исемнәр мәйданы",
+ "dt_xml_pages": "Битләр",
+ "dt_xml_page": "Бит",
+ "dt_xml_template": "Калып",
+ "dt_xml_field": "Мәйдан",
+ "dt_xml_name": "Исем",
+ "dt_xml_title": "Башлам",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Ирекле текст",
+ "importxml": "XML импорты",
+ "dt_import_selectfile": "Зинһар, импорт өчен $1 файлын сайлагыз:",
+ "dt_import_encodingtype": "Кодлау төре"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/tzm.json b/www/wiki/extensions/DataTransfer/i18n/tzm.json
new file mode 100644
index 00000000..84eb2071
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/tzm.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Tifinaghes"
+ ]
+ },
+ "viewxml": "ⵥⵕ XML",
+ "dt_xml_name": "ⴰⵙⵙⴰⵖ",
+ "dt_xml_freetext": "ⴰⴹⵔⵉⵙ ⴰⴷⵔⴼ"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ug-latn.json b/www/wiki/extensions/DataTransfer/i18n/ug-latn.json
new file mode 100644
index 00000000..afb7dd15
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ug-latn.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jose77"
+ ]
+ },
+ "dt_xml_page": "Bet"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/uk.json b/www/wiki/extensions/DataTransfer/i18n/uk.json
new file mode 100644
index 00000000..af7d019d
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/uk.json
@@ -0,0 +1,43 @@
+{
+ "@metadata": {
+ "authors": [
+ "AS",
+ "Arturyatsko",
+ "Prima klasy4na",
+ "Ата",
+ "Тест"
+ ]
+ },
+ "datatransfer-desc": "Дозволяє імпортувати та експортувати дані, які містяться в викликах шаблонів",
+ "viewxml": "Перегляд XML",
+ "dt_viewxml_docu": "Будь ласка, виберіть одну з наступних категорій та імен для перегляду в форматі XML.",
+ "dt_viewxml_categories": "Категорії",
+ "dt_viewxml_namespaces": "Простори назв",
+ "dt_viewxml_simplifiedformat": "Спрощений формат",
+ "dt_xml_namespace": "Простір назв",
+ "dt_xml_pages": "Сторінки",
+ "dt_xml_page": "Сторінка",
+ "dt_xml_template": "Шаблон",
+ "dt_xml_field": "Поле",
+ "dt_xml_name": "Назва",
+ "dt_xml_title": "Заголовок",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Вільний текст",
+ "importxml": "Імпорт XML",
+ "dt_import_selectfile": "Будь ласка, виберіть файл $1 для імпорту:",
+ "dt_import_encodingtype": "Тип кодування:",
+ "dt_import_forexisting": "Для сторінок, які вже існують:",
+ "dt_import_overwriteexisting": "Перезаписати існуючий вміст",
+ "dt_import_mergeintoexisting": "Перезаписати лише поля, що містяться у файлі",
+ "dt_import_skipexisting": "Пропустити",
+ "dt_import_appendtoexisting": "Додати до існуючого вмісту",
+ "dt_import_summarydesc": "Опис імпорту:",
+ "dt_import_editsummary": "імпорт {{ucfirst:$1}}",
+ "dt_import_importing": "Імпорт ...",
+ "dt_import_success": "$1 {{PLURAL:$1|сторінка була|сторінки було|сторінок було}} створено з файлу $2.",
+ "importcsv": "Імпорт CSV",
+ "importspreadsheet": "Імпорт таблиці",
+ "dt_importcsv_badheader": "Помилка. Заголовок колонки №$1 «$2» повинен бути або «$3», або «$4», або у формі «template_name[field_name]»",
+ "right-datatransferimport": "Імпорт даних",
+ "dt_filetype_spreadsheet": "таблиця"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/ur.json b/www/wiki/extensions/DataTransfer/i18n/ur.json
new file mode 100644
index 00000000..dc0cd98d
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/ur.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "පසිඳු කාවින්ද"
+ ]
+ },
+ "dt_viewxml_categories": "زمرہ جات",
+ "dt_viewxml_namespaces": "فضاہائےنام",
+ "dt_xml_namespace": "نیم سپیس",
+ "dt_xml_pages": "صفحات",
+ "dt_xml_page": "صفحہ",
+ "dt_xml_template": "سانچے",
+ "dt_xml_field": "میدان",
+ "dt_xml_name": "نام",
+ "dt_xml_title": "عنوان",
+ "dt_import_skipexisting": "پر",
+ "right-datatransferimport": "درآمد کے اعداد و شمار"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/vi.json b/www/wiki/extensions/DataTransfer/i18n/vi.json
new file mode 100644
index 00000000..4abfef6f
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/vi.json
@@ -0,0 +1,34 @@
+{
+ "@metadata": {
+ "authors": [
+ "Minh Nguyen",
+ "Vinhtantran",
+ "පසිඳු කාවින්ද"
+ ]
+ },
+ "datatransfer-desc": "Cho phép nhập xuất dữ liệu có cấu trúc được chứa trong lời gọi bản mẫu",
+ "viewxml": "Xem XML",
+ "dt_viewxml_docu": "Xin hãy chọn trong những thể loại và không gian tên dưới đây để xem ở dạng XML.",
+ "dt_viewxml_categories": "Thể loại",
+ "dt_viewxml_namespaces": "Không gian tên",
+ "dt_viewxml_simplifiedformat": "Định dạng đơn giản hóa",
+ "dt_xml_namespace": "Không gian tên",
+ "dt_xml_pages": "Trang",
+ "dt_xml_page": "Trang",
+ "dt_xml_template": "Bản mẫu",
+ "dt_xml_field": "Trường",
+ "dt_xml_name": "Tên",
+ "dt_xml_title": "Tựa đề",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "Văn bản Tự do",
+ "importxml": "Nhập XML",
+ "dt_import_selectfile": "Xin hãy chọn tập tin $1 để nhập:",
+ "dt_import_encodingtype": "Bảng mã:",
+ "dt_import_skipexisting": "Bỏ qua",
+ "dt_import_editsummary": "Nhập $1",
+ "dt_import_importing": "Đang nhập…",
+ "dt_import_success": "{{PLURAL:$1|Trang|$1 trang}} sẽ được nhập từ tập tin $2.",
+ "importcsv": "Nhập CSV",
+ "dt_importcsv_badheader": "Lỗi: tên của cột $1, “$2”, phải là “$3” hay “$4”, hoặc phải theo định dạng “tên_tiêu_bản[tên_trường]”",
+ "right-datatransferimport": "Nhập dữ liệu"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/vo.json b/www/wiki/extensions/DataTransfer/i18n/vo.json
new file mode 100644
index 00000000..43c83976
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/vo.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Malafaya",
+ "Smeira"
+ ]
+ },
+ "datatransfer-desc": "Dälon nüveigi e seveigi nünodas peleodüköl in samafomotilüvoks paninädöls",
+ "viewxml": "Logön eli XML",
+ "dt_viewxml_docu": "Välolös bevü klads e nemaspads foviks utosi, kelosi vilol logön fomätü XML.",
+ "dt_viewxml_categories": "Klads",
+ "dt_viewxml_namespaces": "Nemaspads",
+ "dt_viewxml_simplifiedformat": "Fomät pebalugüköl",
+ "dt_xml_namespace": "Nemaspad",
+ "dt_xml_page": "Pad",
+ "dt_xml_field": "Fel",
+ "dt_xml_name": "Nem",
+ "dt_xml_title": "Tiäd",
+ "dt_xml_id": "Dientifanüm",
+ "dt_xml_freetext": "Vödem libik"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/yi.json b/www/wiki/extensions/DataTransfer/i18n/yi.json
new file mode 100644
index 00000000..22205eeb
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/yi.json
@@ -0,0 +1,9 @@
+{
+ "@metadata": {
+ "authors": [
+ "פוילישער"
+ ]
+ },
+ "dt_xml_name": "נאָמען",
+ "dt_xml_title": "טיטל"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/zh-hans.json b/www/wiki/extensions/DataTransfer/i18n/zh-hans.json
new file mode 100644
index 00000000..0ee649e0
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/zh-hans.json
@@ -0,0 +1,45 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gaoxuewei",
+ "Hydra",
+ "Linforest",
+ "PhiLiP",
+ "Qiyue2001",
+ "Shirayuki",
+ "Liuxinyu970226"
+ ]
+ },
+ "datatransfer-desc": "允许根据模板的要求导入导出结构化的数据",
+ "viewxml": "查看XML",
+ "dt_viewxml_docu": "请选择要使用XML格式查看的分类和名字空间。",
+ "dt_viewxml_categories": "分类",
+ "dt_viewxml_namespaces": "名字空间",
+ "dt_viewxml_simplifiedformat": "简化格式",
+ "dt_xml_namespace": "名字空间",
+ "dt_xml_pages": "页面",
+ "dt_xml_page": "页面",
+ "dt_xml_template": "模板",
+ "dt_xml_field": "事件",
+ "dt_xml_name": "名称",
+ "dt_xml_title": "标题",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "自由文本",
+ "importxml": "导入 XML",
+ "dt_import_selectfile": "请选择 $1 要导入的文件:",
+ "dt_import_encodingtype": "编码类型:",
+ "dt_import_forexisting": "对于已经存在的页面:",
+ "dt_import_overwriteexisting": "覆盖现有内容",
+ "dt_import_mergeintoexisting": "覆盖只包含在文件中的字段",
+ "dt_import_skipexisting": "跳过",
+ "dt_import_appendtoexisting": "追加到现有内容",
+ "dt_import_summarydesc": "导入摘要:",
+ "dt_import_editsummary": "{{ucfirst:$1}}导入",
+ "dt_import_importing": "正在导入...",
+ "dt_import_success": "将依据此$2文件创建$1个{{PLURAL:$1|个页面}}。",
+ "importcsv": "导入 CSV",
+ "importspreadsheet": "导入电子表格",
+ "dt_importcsv_badheader": "错误:第$1列的标题'$2'必须为'$3'、或者'$4'、或者采取'模板名称[字段名称]'的形式",
+ "right-datatransferimport": "导入数据",
+ "dt_filetype_spreadsheet": "电子表格"
+}
diff --git a/www/wiki/extensions/DataTransfer/i18n/zh-hant.json b/www/wiki/extensions/DataTransfer/i18n/zh-hant.json
new file mode 100644
index 00000000..ced8a87d
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/i18n/zh-hant.json
@@ -0,0 +1,43 @@
+{
+ "@metadata": {
+ "authors": [
+ "Liangent",
+ "Mark85296341",
+ "LNDDYL",
+ "Kly",
+ "Liuxinyu970226"
+ ]
+ },
+ "datatransfer-desc": "允許根據模板的要求匯入匯出結構化的資料",
+ "viewxml": "檢視XML",
+ "dt_viewxml_docu": "請在下列分類、名稱空間中選擇,以使用XML格式查看。",
+ "dt_viewxml_categories": "分類",
+ "dt_viewxml_namespaces": "命名空間",
+ "dt_viewxml_simplifiedformat": "簡化格式",
+ "dt_xml_namespace": "命名空間",
+ "dt_xml_pages": "頁面",
+ "dt_xml_page": "頁面",
+ "dt_xml_template": "模板",
+ "dt_xml_field": "事件",
+ "dt_xml_name": "名稱",
+ "dt_xml_title": "標題",
+ "dt_xml_id": "ID",
+ "dt_xml_freetext": "自由文字",
+ "importxml": "匯入 XML",
+ "dt_import_selectfile": "請選擇 $1 要匯入的檔案:",
+ "dt_import_encodingtype": "編碼類型:",
+ "dt_import_forexisting": "對於已經存在的頁面:",
+ "dt_import_overwriteexisting": "覆蓋現有內容",
+ "dt_import_mergeintoexisting": "僅覆蓋包含在檔案裡的欄位",
+ "dt_import_skipexisting": "跳過",
+ "dt_import_appendtoexisting": "追加到現有內容",
+ "dt_import_summarydesc": "匯入摘要:",
+ "dt_import_editsummary": "{{ucfirst:$1}} 匯入",
+ "dt_import_importing": "正在匯入…",
+ "dt_import_success": "將依據此$2檔案建立$1個{{PLURAL:$1|個頁面|個頁面}}。",
+ "importcsv": "匯入 CSV",
+ "importspreadsheet": "匯入試算表",
+ "dt_importcsv_badheader": "錯誤:第$1列的標題'$2'必須為'$3'、或者'$4'、或者採取'模板名稱[字段名稱]'的形式",
+ "right-datatransferimport": "匯入資料",
+ "dt_filetype_spreadsheet": "試算表"
+}
diff --git a/www/wiki/extensions/DataTransfer/includes/DT_Hooks.php b/www/wiki/extensions/DataTransfer/includes/DT_Hooks.php
new file mode 100644
index 00000000..95999339
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/includes/DT_Hooks.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Static functions called by various outside hooks.
+ *
+ * @author Yaron Koren
+ * @ingroup DataTransfer
+ */
+class DTHooks {
+
+ /**
+ * Add links to the 'AdminLinks' special page, defined by the Admin Links
+ * extension
+ */
+ public static function addToAdminLinks( $admin_links_tree ) {
+ $import_export_section = $admin_links_tree->getSection( wfMessage( 'adminlinks_importexport' )->text() );
+ $main_row = $import_export_section->getRow( 'main' );
+ $main_row->addItem( ALItem::newFromSpecialPage( 'ViewXML' ) );
+ $main_row->addItem( ALItem::newFromSpecialPage( 'ImportXML' ) );
+ $main_row->addItem( ALItem::newFromSpecialPage( 'ImportCSV' ) );
+ if ( class_exists( 'PHPExcel' )) {
+ $main_row->addItem( ALItem::newFromSpecialPage( 'ImportSpreadsheet' ) );
+ }
+ return true;
+ }
+
+} \ No newline at end of file
diff --git a/www/wiki/extensions/DataTransfer/includes/DT_ImportJob.php b/www/wiki/extensions/DataTransfer/includes/DT_ImportJob.php
new file mode 100644
index 00000000..67a31489
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/includes/DT_ImportJob.php
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * Background job to import a page into the wiki, for use by Data Transfer
+ *
+ * @author Yaron Koren
+ */
+class DTImportJob extends Job {
+
+ function __construct( $title, $params = '', $id = 0 ) {
+ parent::__construct( 'dtImport', $title, $params, $id );
+ }
+
+ /**
+ * Run a dtImport job
+ * @return boolean success
+ */
+ function run() {
+ if ( is_null( $this->title ) ) {
+ $this->error = "dtImport: Invalid title";
+ return false;
+ }
+
+ $wikiPage = WikiPage::factory( $this->title );
+ if ( !$wikiPage ) {
+ $this->error = 'dtImport: Wiki page not found "' . $this->title->getPrefixedDBkey() . '"';
+ return false;
+ }
+
+ $for_pages_that_exist = $this->params['for_pages_that_exist'];
+ if ( $for_pages_that_exist == 'skip' && $this->title->exists() ) {
+ return true;
+ }
+
+ // Change global $wgUser variable to the one specified by
+ // the job only for the extent of this import.
+ global $wgUser;
+ $actual_user = $wgUser;
+ $wgUser = User::newFromId( $this->params['user_id'] );
+ $text = $this->params['text'];
+ if ( $this->title->exists() ) {
+ if ( $for_pages_that_exist == 'append' ) {
+ $existingText = ContentHandler::getContentText( $wikiPage->getContent() );
+ $text = $existingText . "\n" . $text;
+ } elseif ( $for_pages_that_exist == 'merge' ) {
+ $existingPageStructure = DTPageStructure::newFromTitle( $this->title );
+ $newPageStructure = new DTPageStructure;
+ $newPageStructure->parsePageContents( $text );
+ $existingPageStructure->mergeInPageStructure( $newPageStructure );
+ $text = $existingPageStructure->toWikitext();
+ }
+ // otherwise, $for_pages_that_exist == 'overwrite'
+ }
+ $edit_summary = $this->params['edit_summary'];
+ $new_content = new WikitextContent( $text );
+ // It's strange that doEditContent() doesn't
+ // automatically attach the 'bot' flag when the user
+ // is a bot...
+ if ( $wgUser->isAllowed( 'bot' ) ) {
+ $flags = EDIT_FORCE_BOT;
+ } else {
+ $flags = 0;
+ }
+ $wikiPage->doEditContent( $new_content, $edit_summary, $flags );
+
+ $wgUser = $actual_user;
+ return true;
+ }
+}
diff --git a/www/wiki/extensions/DataTransfer/includes/DT_Page.php b/www/wiki/extensions/DataTransfer/includes/DT_Page.php
new file mode 100644
index 00000000..eb3c92fc
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/includes/DT_Page.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Class holding the data of a page to be imported
+ *
+ * @author Yaron Koren
+ */
+
+class DTPage {
+ var $mName;
+ var $mTemplates;
+ var $mFreeText;
+
+ public function __construct() {
+ $this->mTemplates = array();
+ }
+
+ function setName( $name ) {
+ $this->mName = $name;
+ }
+
+ function getName() {
+ return $this->mName;
+ }
+
+ function addTemplateField( $template_name, $field_name, $value ) {
+
+ if ( !array_key_exists( $template_name, $this->mTemplates ) ) {
+ $this->mTemplates[$template_name] = array();
+ }
+ $this->mTemplates[$template_name][$field_name] = $value;
+ }
+
+ function setFreeText( $free_text ) {
+ $this->mFreeText = $free_text;
+ }
+
+ function createText() {
+ $text = "";
+ foreach ( $this->mTemplates as $template_name => $fields ) {
+ $fieldsAdded = false;
+ $text .= '{{' . $template_name;
+ foreach ( $fields as $field_name => $val ) {
+ if ( $val != '' ) {
+ $text .= "\n|$field_name=$val";
+ $fieldsAdded = true;
+ }
+ }
+ if ( $fieldsAdded ) {
+ $text .= "\n";
+ }
+ $text .= '}}' . "\n";
+ }
+ $text .= $this->mFreeText;
+ return $text;
+ }
+}
diff --git a/www/wiki/extensions/DataTransfer/includes/DT_PageComponent.php b/www/wiki/extensions/DataTransfer/includes/DT_PageComponent.php
new file mode 100644
index 00000000..24c91719
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/includes/DT_PageComponent.php
@@ -0,0 +1,131 @@
+<?php
+/**
+ * Class that represents a single "component" of a page - either a template
+ * or a piece of free text.
+ *
+ * @author Yaron Koren
+ * @author DataTransfer
+ */
+class DTPageComponent {
+ var $mIsTemplate = false;
+ var $mTemplateName;
+ static $mUnnamedFieldCounter;
+ var $mFields;
+ var $mFreeText;
+ static $mFreeTextIDCounter = 1;
+ var $mFreeTextID;
+
+ public static function newTemplate( $templateName ) {
+ $dtPageComponent = new DTPageComponent();
+ $dtPageComponent->mTemplateName = trim( $templateName );
+ $dtPageComponent->mIsTemplate = true;
+ $dtPageComponent->mFields = array();
+ self::$mUnnamedFieldCounter = 1;
+ return $dtPageComponent;
+ }
+ public static function newFreeText( $freeText ) {
+ $dtPageComponent = new DTPageComponent();
+ $dtPageComponent->mIsTemplate = false;
+ $dtPageComponent->mFreeText = $freeText;
+ $dtPageComponent->mFreeTextID = self::$mFreeTextIDCounter++;
+ return $dtPageComponent;
+ }
+
+ public function addNamedField( $fieldName, $fieldValue ) {
+ $this->mFields[trim( $fieldName )] = trim( $fieldValue );
+ }
+
+ public function addUnnamedField( $fieldValue ) {
+ $fieldName = self::$mUnnamedFieldCounter++;
+ $this->mFields[$fieldName] = trim( $fieldValue );
+ }
+
+ public function toWikitext() {
+ if ( $this->mIsTemplate ) {
+ $wikitext = '{{' . $this->mTemplateName;
+ foreach ( $this->mFields as $fieldName => $fieldValue ) {
+ if ( is_numeric( $fieldName ) ) {
+ $wikitext .= '|' . $fieldValue;
+ } else {
+ $wikitext .= "\n|$fieldName=$fieldValue";
+ }
+ }
+ $wikitext .= "\n}}";
+ return $wikitext;
+ } else {
+ return $this->mFreeText;
+ }
+ }
+
+ public function toXML( $isSimplified ) {
+ global $wgDataTransferViewXMLParseFields;
+ global $wgDataTransferViewXMLParseFreeText;
+ global $wgParser, $wgTitle;
+
+ if ( $this->mIsTemplate ) {
+ global $wgContLang;
+ $namespace_labels = $wgContLang->getNamespaces();
+ $template_label = $namespace_labels[NS_TEMPLATE];
+ $field_str = str_replace( ' ', '_', wfMessage( 'dt_xml_field' )->inContentLanguage()->text() );
+ $name_str = str_replace( ' ', '_', wfMessage( 'dt_xml_name' )->inContentLanguage()->text() );
+
+ $bodyXML = '';
+ foreach ( $this->mFields as $fieldName => $fieldValue ) {
+ // If this field itself holds template calls,
+ // get the XML for those calls.
+ if ( is_array( $fieldValue ) ) {
+ $fieldValueXML = '';
+ foreach ( $fieldValue as $subComponent ) {
+ $fieldValueXML .= $subComponent->toXML( $isSimplified );
+ }
+ } elseif ( $wgDataTransferViewXMLParseFields ) {
+ // Avoid table of contents and "edit" links
+ $fieldValue = $wgParser->parse( "__NOTOC__ __NOEDITSECTION__\n" . $fieldValue, $wgTitle, new ParserOptions() )->getText();
+ }
+
+ if ( $isSimplified ) {
+ if ( is_numeric( $fieldName ) ) {
+ // add "Field" to the beginning of the file name, since
+ // XML tags that are simply numbers aren't allowed
+ $fieldTag = $field_str . '_' . $fieldName;
+ } else {
+ $fieldTag = str_replace( ' ', '_', trim( $fieldName ) );
+ }
+ $attrs = null;
+ } else {
+ $fieldTag = $field_str;
+ $attrs = array( $name_str => $fieldName );
+ }
+ if ( is_array( $fieldValue ) ) {
+ $bodyXML .= Xml::tags( $fieldTag, $attrs, $fieldValueXML );
+ } else {
+ $bodyXML .= Xml::element( $fieldTag, $attrs, $fieldValue );
+ }
+ }
+
+ if ( $isSimplified ) {
+ $templateName = str_replace( ' ', '_', $this->mTemplateName );
+ return Xml::tags( $templateName, null, $bodyXML );
+ } else {
+ return Xml::tags( $template_label, array( $name_str => $this->mTemplateName ), $bodyXML );
+ }
+ } else {
+ $free_text_str = str_replace( ' ', '_', wfMessage( 'dt_xml_freetext' )->inContentLanguage()->text() );
+ if ( $wgDataTransferViewXMLParseFreeText ) {
+ $freeText = $this->mFreeText;
+ // Undo the escaping that happened before.
+ $freeText = str_replace( array( '&#123;', '&#125;' ), array( '{', '}' ), $freeText );
+ // Get rid of table of contents.
+ $mw = MagicWord::get( 'toc' );
+ if ( $mw->match( $freeText ) ) {
+ $freeText = $mw->replace( '', $freeText );
+ }
+ // Avoid "edit" links.
+ $freeText = $wgParser->parse( "__NOTOC__ __NOEDITSECTION__\n" . $freeText, $wgTitle, new ParserOptions() )->getText();
+ } else {
+ $freeText = $this->mFreeText;
+ }
+ return XML::element( $free_text_str, array( 'id' => $this->mFreeTextID ), $freeText );
+ }
+ }
+} \ No newline at end of file
diff --git a/www/wiki/extensions/DataTransfer/includes/DT_PageStructure.php b/www/wiki/extensions/DataTransfer/includes/DT_PageStructure.php
new file mode 100644
index 00000000..253cd99e
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/includes/DT_PageStructure.php
@@ -0,0 +1,243 @@
+<?php
+
+/**
+ * Class that holds the structure of a single wiki page. It is used for both
+ * turning wikitext into XML, and vice versa.
+ *
+ * @author Yaron Koren
+ * @ingroup DataTransfer
+ */
+class DTPageStructure {
+ var $mPageTitle;
+ var $mComponents = array();
+
+ function addComponent( $dtPageComponent ) {
+ $this->mComponents[] = $dtPageComponent;
+ DTPageComponent::$mFreeTextIDCounter = 1;
+ }
+
+ public static function newFromTitle( $pageTitle ) {
+ $pageStructure = new DTPageStructure();
+ $pageStructure->mPageTitle = $pageTitle;
+
+ $wiki_page = WikiPage::factory( $pageTitle );
+ $page_contents = ContentHandler::getContentText( $wiki_page->getContent() );
+
+ $pageStructure->parsePageContents( $page_contents );
+
+ // Now, go through the field values and see if any of them
+ // hold template calls - if any of them do, parse the value
+ // as if it's the full contents of a page, and add the
+ // resulting "components" to that field.
+ foreach ( $pageStructure->mComponents as $pageComponent ) {
+ if ( $pageComponent->mIsTemplate ) {
+ foreach ( $pageComponent->mFields as $fieldName => $fieldValue ) {
+ if ( strpos( $fieldValue, '{{' ) !== false ) {
+ $dummyPageStructure = new DTPageStructure();
+ $dummyPageStructure->parsePageContents( $fieldValue );
+ $pageComponent->mFields[$fieldName] = $dummyPageStructure->mComponents;
+ }
+ }
+ }
+ }
+ return $pageStructure;
+ }
+
+ /**
+ * Parses the contents of a wiki page, turning template calls into
+ * an arracy of DTPageComponent objects.
+ */
+ public function parsePageContents( $page_contents ) {
+ // escape out variables like "{{PAGENAME}}"
+ $page_contents = str_replace( '{{PAGENAME}}', '&#123;&#123;PAGENAME&#125;&#125;', $page_contents );
+ // escape out parser functions
+ $page_contents = preg_replace( '/{{(#.+)}}/', '&#123;&#123;$1&#125;&#125;', $page_contents );
+ // escape out transclusions, and calls like "DEFAULTSORT"
+ $page_contents = preg_replace( '/{{(.*:.+)}}/', '&#123;&#123;$1&#125;&#125;', $page_contents );
+ // escape out variable names
+ $page_contents = str_replace( '{{{', '&#123;&#123;&#123;', $page_contents );
+ $page_contents = str_replace( '}}}', '&#125;&#125;&#125;', $page_contents );
+ // escape out tables
+ $page_contents = str_replace( '{|', '&#123;|', $page_contents );
+ $page_contents = str_replace( '|}', '|&#125;', $page_contents );
+
+ // traverse the page contents, one character at a time
+ $uncompleted_curly_brackets = 0;
+ $free_text = "";
+ $template_name = "";
+ $field_name = "";
+ $field_value = "";
+ $field_has_name = false;
+ for ( $i = 0; $i < strlen( $page_contents ); $i++ ) {
+ $c = $page_contents[$i];
+ if ( $uncompleted_curly_brackets == 0 ) {
+ if ( $c == "{" || $i == strlen( $page_contents ) - 1 ) {
+ if ( $i == strlen( $page_contents ) - 1 )
+ $free_text .= $c;
+ $uncompleted_curly_brackets++;
+ $free_text = trim( $free_text );
+ if ( $free_text != "" ) {
+ $freeTextComponent = DTPageComponent::newFreeText( $free_text );
+ $this->addComponent( $freeTextComponent );
+ $free_text = "";
+ }
+ } elseif ( $c == "{" ) {
+ // do nothing
+ } else {
+ $free_text .= $c;
+ }
+ } elseif ( $uncompleted_curly_brackets == 1 ) {
+ if ( $c == "{" ) {
+ $uncompleted_curly_brackets++;
+ $creating_template_name = true;
+ } elseif ( $c == "}" ) {
+ $uncompleted_curly_brackets--;
+ // is this needed?
+ // if ($field_name != "") {
+ // $field_name = "";
+ // }
+ if ( $page_contents[$i - 1] == '}' ) {
+ $this->addComponent( $curTemplate );
+ }
+ $template_name = "";
+ }
+ } elseif ( $uncompleted_curly_brackets == 2 ) {
+ if ( $c == "}" ) {
+ $uncompleted_curly_brackets--;
+ }
+ if ( $c == "{" ) {
+ $uncompleted_curly_brackets++;
+ $field_value .= $c;
+ } else {
+ if ( $creating_template_name ) {
+ if ( $c == "|" || $c == "}" ) {
+ $curTemplate = DTPageComponent::newTemplate( $template_name );
+ $template_name = str_replace( ' ', '_', trim( $template_name ) );
+ $template_name = str_replace( '&', '&amp;', $template_name );
+ $creating_template_name = false;
+ $creating_field_name = true;
+ $field_id = 1;
+ } else {
+ $template_name .= $c;
+ }
+ } else {
+ if ( $c == "|" || $c == "}" ) {
+ if ( $field_has_name ) {
+ $curTemplate->addNamedField( $field_name, $field_value );
+ $field_value = "";
+ $field_has_name = false;
+ } else {
+ // "field_name" is actually the value
+ $curTemplate->addUnnamedField( $field_name );
+ }
+ $creating_field_name = true;
+ $field_name = "";
+ } elseif ( $c == "=" ) {
+ // handle case of = in value
+ if ( ! $creating_field_name ) {
+ $field_value .= $c;
+ } else {
+ $creating_field_name = false;
+ $field_has_name = true;
+ }
+ } elseif ( $creating_field_name ) {
+ $field_name .= $c;
+ } else {
+ $field_value .= $c;
+ }
+ }
+ }
+ } else { // greater than 2
+ if ( $c == "}" ) {
+ $uncompleted_curly_brackets--;
+ } elseif ( $c == "{" ) {
+ $uncompleted_curly_brackets++;
+ }
+ $field_value .= $c;
+ }
+ }
+ }
+
+ /**
+ * Helper function for mergeInPageStructure().
+ */
+ private function getSingleInstanceTemplates() {
+ $instancesPerTemplate = array();
+ foreach ( $this->mComponents as $pageComponent ) {
+ if ( $pageComponent->mIsTemplate ) {
+ $templateName = $pageComponent->mTemplateName;
+ if ( array_key_exists( $templateName, $instancesPerTemplate ) ) {
+ $instancesPerTemplate[$templateName]++;
+ } else {
+ $instancesPerTemplate[$templateName] = 1;
+ }
+ }
+ }
+
+ $singleInstanceTemplates = array();
+ foreach ( $instancesPerTemplate as $templateName => $instances ) {
+ if ( $instances == 1 ) {
+ $singleInstanceTemplates[] = $templateName;
+ }
+ }
+ return $singleInstanceTemplates;
+ }
+
+ private function getIndexOfTemplateName( $templateName ) {
+ foreach ( $this->mComponents as $i => $pageComponent ) {
+ if ( $pageComponent->mTemplateName == $templateName ) {
+ return $i;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Used when doing a "merge" in an XML or CSV import.
+ */
+ public function mergeInPageStructure( $secondPageStructure ) {
+ // If there are any templates that have one instance in both
+ // pages, replace values for their fields with values from
+ // the second page.
+ $singleInstanceTemplatesHere = $this->getSingleInstanceTemplates();
+ $singleInstanceTemplatesThere = $secondPageStructure->getSingleInstanceTemplates();
+ $singleInstanceTemplatesInBoth = array_intersect( $singleInstanceTemplatesHere, $singleInstanceTemplatesThere );
+ foreach ( $secondPageStructure->mComponents as $pageComponent ) {
+ if ( in_array( $pageComponent->mTemplateName, $singleInstanceTemplatesInBoth ) ) {
+ $indexOfThisTemplate = $this->getIndexOfTemplateName( $pageComponent->mTemplateName );
+ foreach ( $pageComponent->mFields as $fieldName => $fieldValue ) {
+ $this->mComponents[$indexOfThisTemplate]->mFields[$fieldName] = $fieldValue;
+ }
+ } else {
+ $this->mComponents[] = $pageComponent;
+ }
+ }
+ }
+
+ public function toWikitext() {
+ $wikitext = '';
+ foreach ( $this->mComponents as $pageComponent ) {
+ $wikitext .= $pageComponent->toWikitext() . "\n";
+ }
+ return trim( $wikitext );
+ }
+
+ public function toXML( $isSimplified ) {
+ $page_str = str_replace( ' ', '_', wfMessage( 'dt_xml_page' )->inContentLanguage()->text() );
+ $id_str = str_replace( ' ', '_', wfMessage( 'dt_xml_id' )->inContentLanguage()->text() );
+ $title_str = str_replace( ' ', '_', wfMessage( 'dt_xml_title' )->inContentLanguage()->text() );
+
+ $bodyXML = '';
+ foreach ( $this->mComponents as $pageComponent ) {
+ $bodyXML .= $pageComponent->toXML( $isSimplified );
+ }
+ $articleID = $this->mPageTitle->getArticleID();
+ $pageName = $this->mPageTitle->getText();
+ if ( $isSimplified ) {
+ return Xml::tags( $page_str, null, Xml::tags( $id_str, null, $articleID ) . Xml::tags( $title_str, null, $pageName ) . $bodyXML );
+ } else {
+ return Xml::tags( $page_str, array( $id_str => $articleID, $title_str => $pageName ), $bodyXML );
+ }
+ }
+
+}
diff --git a/www/wiki/extensions/DataTransfer/includes/DT_Utils.php b/www/wiki/extensions/DataTransfer/includes/DT_Utils.php
new file mode 100644
index 00000000..03af8e6a
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/includes/DT_Utils.php
@@ -0,0 +1,86 @@
+<?php
+
+/**
+ * Utility functions for the Data Transfer extension.
+ *
+ * @author Yaron Koren
+ */
+class DTUtils {
+
+ static function printImportingMessage() {
+ return "\t" . Xml::element( 'p', null, wfMessage( 'dt_import_importing' )->text() ) . "\n";
+ }
+
+ static function printFileSelector( $fileType ) {
+ $text = "\n\t" . Xml::element( 'p', null, wfMessage( 'dt_import_selectfile', $fileType )->text() ) . "\n";
+ $text .= <<<END
+ <p><input type="file" name="file_name" size="25" /></p>
+
+END;
+ $text .= "\t" . '<hr style="margin: 10px 0 10px 0" />' . "\n";
+ return $text;
+ }
+
+ static function printExistingPagesHandling() {
+ $text = "\t" . Xml::element( 'p', null, wfMessage( 'dt_import_forexisting' )->text() ) . "\n";
+ $existingPagesText = "\n\t" .
+ Xml::element( 'input',
+ array(
+ 'type' => 'radio',
+ 'name' => 'pagesThatExist',
+ 'value' => 'overwrite',
+ 'checked' => 'checked'
+ ) ) . "\n" .
+ "\t" . wfMessage( 'dt_import_overwriteexisting' )->text() . "<br />" . "\n" .
+ "\t" . Xml::element( 'input',
+ array(
+ 'type' => 'radio',
+ 'name' => 'pagesThatExist',
+ 'value' => 'merge',
+ ) ) . "\n" .
+ "\t" . wfMessage( 'dt_import_mergeintoexisting' )->text() . "<br />" . "\n\t" .
+ "\t" . Xml::element( 'input',
+ array(
+ 'type' => 'radio',
+ 'name' => 'pagesThatExist',
+ 'value' => 'skip',
+ ) ) . "\n" .
+ "\t" . wfMessage( 'dt_import_skipexisting' )->text() . "<br />" . "\n" .
+ "\t" . Xml::element( 'input',
+ array(
+ 'type' => 'radio',
+ 'name' => 'pagesThatExist',
+ 'value' => 'append',
+ ) ) . "\n" .
+ "\t" . wfMessage( 'dt_import_appendtoexisting' )->text() . "<br />" . "\n\t";
+ $text .= "\t" . Xml::tags( 'p', null, $existingPagesText ) . "\n";
+ $text .= "\t" . '<hr style="margin: 10px 0 10px 0" />' . "\n";
+ return $text;
+ }
+
+ static function printImportSummaryInput( $fileType ) {
+ $importSummaryText = "\t" . Xml::element( 'input',
+ array(
+ 'type' => 'text',
+ 'id' => 'wpSummary', // ID is necessary for CSS formatting
+ 'class' => 'mw-summary',
+ 'name' => 'import_summary',
+ 'value' => wfMessage( 'dt_import_editsummary', $fileType )->inContentLanguage()->text()
+ )
+ ) . "\n";
+ return "\t" . Xml::tags( 'p', null,
+ wfMessage( 'dt_import_summarydesc' )->text() . "\n" .
+ $importSummaryText ) . "\n";
+ }
+
+ static function printSubmitButton() {
+ $formSubmitText = Xml::element( 'input',
+ array(
+ 'type' => 'submit',
+ 'name' => 'import_file',
+ 'value' => wfMessage( 'import-interwiki-submit' )->text()
+ )
+ );
+ return "\t" . Xml::tags( 'p', null, $formSubmitText ) . "\n";
+ }
+}
diff --git a/www/wiki/extensions/DataTransfer/includes/DT_WikiPage.php b/www/wiki/extensions/DataTransfer/includes/DT_WikiPage.php
new file mode 100644
index 00000000..1bfc848f
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/includes/DT_WikiPage.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Class for representing a wiki page.
+ *
+ * @author Yaron Koren
+ * @ingroup DataTransfer
+ */
+
+class DTWikiPage {
+ private $mPageName = null;
+ private $mElements = array();
+
+ public function __construct( $name ) {
+ $this->mPageName = $name;
+ }
+
+ function getName() {
+ return $this->mPageName;
+ }
+
+ function addTemplate( $template ) {
+ $this->mElements[] = $template;
+ }
+
+ function addFreeText( $free_text ) {
+ $this->mElements[] = $free_text;
+ }
+
+ function createText() {
+ $text = "";
+ foreach ( $this->mElements as $elem ) {
+ if ( $elem instanceof DTWikiTemplate ) {
+ $text .= $elem->createText();
+ } else {
+ $text .= $elem;
+ }
+ }
+ return $text;
+ }
+} \ No newline at end of file
diff --git a/www/wiki/extensions/DataTransfer/includes/DT_WikiTemplate.php b/www/wiki/extensions/DataTransfer/includes/DT_WikiTemplate.php
new file mode 100644
index 00000000..9ab2864e
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/includes/DT_WikiTemplate.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Class for representing a template call within a wiki page.
+ *
+ * @author Yaron Koren
+ * @ingroup DataTransfer
+ */
+
+class DTWikiTemplate {
+ private $mName = null;
+ private $mFields = array();
+
+ public function __construct( $name ) {
+ $this->mName = $name;
+ }
+
+ function addField( $name, $value ) {
+ $this->mFields[$name] = $value;
+ }
+
+ function createText() {
+ $multi_line_template = false;
+ $text = '{{' . $this->mName;
+ foreach ( $this->mFields as $field_name => $field_val ) {
+ if ( is_numeric( $field_name ) ) {
+ $text .= "|$field_val";
+ } else {
+ $text .= "\n|$field_name=$field_val";
+ $multi_line_template = true;
+ }
+ }
+ if ( $multi_line_template )
+ $text .= "\n";
+ $text .= '}}' . "\n";
+ return $text;
+ }
+} \ No newline at end of file
diff --git a/www/wiki/extensions/DataTransfer/includes/DT_XMLParser.php b/www/wiki/extensions/DataTransfer/includes/DT_XMLParser.php
new file mode 100644
index 00000000..259e6f5b
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/includes/DT_XMLParser.php
@@ -0,0 +1,215 @@
+<?php
+/**
+ * Class for parsing XML representing wiki pages and their template calls
+ *
+ * @author Yaron Koren
+ * @ingroup DataTransfer
+ */
+
+class DTXMLParser {
+ var $mDebug = false;
+ var $mSource = null;
+ var $mCurFieldName = null;
+ var $mCurFieldValue = '';
+ var $mCurTemplate = null;
+ var $mCurPage = null; // new DTWikiPage();
+ var $mPages = array();
+
+ function __construct( $source ) {
+ $this->mSource = $source;
+ }
+
+ function debug( $text ) {
+ // print "$text. ";
+ }
+
+ function throwXMLerror( $text ) {
+ print htmlspecialchars( $text );
+ }
+
+ function doParse() {
+ $parser = xml_parser_create( "UTF-8" );
+
+ # case folding violates XML standard, turn it off
+ xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
+
+ xml_set_object( $parser, $this );
+ xml_set_element_handler( $parser, "in_start", "" );
+
+ $offset = 0; // for context extraction on error reporting
+ do {
+ $chunk = $this->mSource->readChunk();
+ if ( !xml_parse( $parser, $chunk, $this->mSource->atEnd() ) ) {
+ wfDebug( "WikiImporter::doImport encountered XML parsing error\n" );
+ // return new WikiXmlError( $parser, wfMessage( 'import-parse-failure' )->escaped(), $chunk, $offset );
+ }
+ $offset += strlen( $chunk );
+ } while ( $chunk !== false && !$this->mSource->atEnd() );
+ xml_parser_free( $parser );
+ }
+
+ function donothing( $parser, $x, $y = "" ) {
+ # $this->debug( "donothing" );
+ }
+
+
+ function in_start( $parser, $name, $attribs ) {
+ // $this->debug( "in_start $name" );
+ $pages_str = str_replace( ' ', '_', wfMessage( 'dt_xml_pages' )->inContentLanguage()->text() );
+ if ( $name != $pages_str ) {
+ print( "Expected '$pages_str', got '$name'" );
+ }
+ xml_set_element_handler( $parser, "in_pages", "out_pages" );
+ }
+
+ function in_pages( $parser, $name, $attribs ) {
+ $this->debug( "in_pages $name" );
+ $page_str = str_replace( ' ', '_', wfMessage( 'dt_xml_page' )->inContentLanguage()->text() );
+ if ( $name == $page_str ) {
+ $title_str = str_replace( ' ', '_', wfMessage( 'dt_xml_title' )->inContentLanguage()->text() );
+ if ( array_key_exists( $title_str, $attribs ) ) {
+ $this->mCurPage = new DTWikiPage( $attribs[$title_str] );
+ xml_set_element_handler( $parser, "in_page", "out_page" );
+ } else {
+ $this->throwXMLerror( "'$title_str' attribute missing for page" );
+ return;
+ }
+ } else {
+ $this->throwXMLerror( "Expected <$page_str>, got <$name>" );
+ }
+
+ return;
+ }
+
+ function out_pages( $parser, $name ) {
+ $this->debug( "out_pages $name" );
+ xml_set_element_handler( $parser, "donothing", "donothing" );
+ }
+
+ function in_category( $parser, $name, $attribs ) {
+ $this->debug( "in_category $name" );
+ $page_str = str_replace( ' ', '_', wfMessage( 'dt_xml_page' )->inContentLanguage()->text() );
+ if ( $name == $page_str ) {
+ if ( array_key_exists( $title_str, $attribs ) ) {
+ $this->mCurPage = new DTWikiPage( $attribs[$title_str] );
+ xml_set_element_handler( $parser, "in_page", "out_page" );
+ } else {
+ $this->throwXMLerror( "'$title_str' attribute missing for page" );
+ return;
+ }
+ } else {
+ $this->throwXMLerror( "Expected <$page_str>, got <$name>" );
+ return;
+ }
+ }
+
+ function out_category( $parser, $name ) {
+ $this->debug( "out_category $name" );
+ if ( $name != "category" ) {
+ $this->throwXMLerror( "Expected </category>, got </$name>" );
+ return;
+ }
+ xml_set_element_handler( $parser, "donothing", "donothing" );
+ }
+
+ function in_page( $parser, $name, $attribs ) {
+ $this->debug( "in_page $name" );
+ $template_str = str_replace( ' ', '_', wfMessage( 'dt_xml_template' )->inContentLanguage()->text() );
+ $name_str = str_replace( ' ', '_', wfMessage( 'dt_xml_name' )->inContentLanguage()->text() );
+ $free_text_str = str_replace( ' ', '_', wfMessage( 'dt_xml_freetext' )->inContentLanguage()->text() );
+ if ( $name == $template_str ) {
+ if ( array_key_exists( $name_str, $attribs ) ) {
+ $this->mCurTemplate = new DTWikiTemplate( $attribs[$name_str] );
+ xml_set_element_handler( $parser, "in_template", "out_template" );
+ } else {
+ $this->throwXMLerror( "'$name_str' attribute missing for template" );
+ return;
+ }
+ } elseif ( $name == $free_text_str ) {
+ xml_set_element_handler( $parser, "in_freetext", "out_freetext" );
+ xml_set_character_data_handler( $parser, "freetext_value" );
+ } else {
+ $this->throwXMLerror( "Expected <$template_str>, got <$name>" );
+ return;
+ }
+ }
+
+ function out_page( $parser, $name ) {
+ $this->debug( "out_page $name" );
+ $page_str = str_replace( ' ', '_', wfMessage( 'dt_xml_page' )->inContentLanguage()->text() );
+ if ( $name != $page_str ) {
+ $this->throwXMLerror( "Expected </$page_str>, got </$name>" );
+ return;
+ }
+ $this->mPages[] = $this->mCurPage;
+ xml_set_element_handler( $parser, "in_pages", "out_pages" );
+ }
+
+ function in_template( $parser, $name, $attribs ) {
+ $this->debug( "in_template $name" );
+ $field_str = str_replace( ' ', '_', wfMessage( 'dt_xml_field' )->inContentLanguage()->text() );
+ if ( $name == $field_str ) {
+ $name_str = str_replace( ' ', '_', wfMessage( 'dt_xml_name' )->inContentLanguage()->text() );
+ if ( array_key_exists( $name_str, $attribs ) ) {
+ $this->mCurFieldName = $attribs[$name_str];
+ // $this->push( $name );
+ $this->workRevisionCount = 0;
+ $this->workSuccessCount = 0;
+ $this->uploadCount = 0;
+ $this->uploadSuccessCount = 0;
+ xml_set_element_handler( $parser, "in_field", "out_field" );
+ xml_set_character_data_handler( $parser, "field_value" );
+ } else {
+ $this->throwXMLerror( "'$name_str' attribute missing for field" );
+ return;
+ }
+ } else {
+ $this->throwXMLerror( "Expected <$field_str>, got <$name>" );
+ return;
+ }
+ }
+
+ function out_template( $parser, $name ) {
+ $this->debug( "out_template $name" );
+ $template_str = str_replace( ' ', '_', wfMessage( 'dt_xml_template' )->inContentLanguage()->text() );
+ if ( $name != $template_str ) {
+ $this->throwXMLerror( "Expected </$template_str>, got </$name>" );
+ return;
+ }
+ $this->mCurPage->addTemplate( $this->mCurTemplate );
+ xml_set_element_handler( $parser, "in_page", "out_page" );
+ }
+
+ function in_field( $parser, $name, $attribs ) {
+ // xml_set_element_handler( $parser, "donothing", "donothing" );
+ }
+
+ function out_field( $parser, $name ) {
+ $this->debug( "out_field $name" );
+ $field_str = str_replace( ' ', '_', wfMessage( 'dt_xml_field' )->inContentLanguage()->text() );
+ if ( $name == $field_str ) {
+ $this->mCurTemplate->addField( $this->mCurFieldName, $this->mCurFieldValue );
+ $this->mCurFieldValue = '';
+ } else {
+ $this->throwXMLerror( "Expected </$field_str>, got </$name>" );
+ return;
+ }
+ xml_set_element_handler( $parser, "in_template", "out_template" );
+ }
+
+ function field_value( $parser, $data ) {
+ $this->mCurFieldValue .= $data;
+ }
+
+ function in_freetext( $parser, $name, $attribs ) {
+ // xml_set_element_handler( $parser, "donothing", "donothing" );
+ }
+
+ function out_freetext( $parser, $name ) {
+ xml_set_element_handler( $parser, "in_page", "out_page" );
+ }
+
+ function freetext_value( $parser, $data ) {
+ $this->mCurPage->addFreeText( $data );
+ }
+}
diff --git a/www/wiki/extensions/DataTransfer/package.json b/www/wiki/extensions/DataTransfer/package.json
new file mode 100644
index 00000000..ea62e434
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/package.json
@@ -0,0 +1,11 @@
+{
+ "private": true,
+ "scripts": {
+ "test": "grunt test"
+ },
+ "devDependencies": {
+ "grunt": "1.0.3",
+ "grunt-banana-checker": "0.4.0",
+ "grunt-jsonlint": "1.0.7"
+ }
+}
diff --git a/www/wiki/extensions/DataTransfer/specials/DT_ImportCSV.php b/www/wiki/extensions/DataTransfer/specials/DT_ImportCSV.php
new file mode 100644
index 00000000..ec8c4d41
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/specials/DT_ImportCSV.php
@@ -0,0 +1,217 @@
+<?php
+/**
+ * Lets the user import a CSV file to turn into wiki pages
+ *
+ * @author Yaron Koren
+ */
+
+class DTImportCSV extends SpecialPage {
+
+ /**
+ * Constructor
+ */
+ public function __construct( $name='ImportCSV' ) {
+ parent::__construct( $name );
+ }
+
+ public function doesWrites() {
+ return true;
+ }
+
+ function execute( $query ) {
+ $this->setHeaders();
+
+ if ( ! $this->getUser()->isAllowed( 'datatransferimport' ) ) {
+ throw new PermissionsError( 'datatransferimport' );
+ }
+
+ if ( $this->getRequest()->getCheck( 'import_file' ) ) {
+ $text = $this->importFromUploadAndModifyPages();
+ } else {
+ $text = $this->printForm();
+ }
+
+ $this->getOutput()->addModuleStyles( 'ext.datatransfer');
+ $this->getOutput()->addHTML( $text );
+ }
+
+ protected function importFromUploadAndModifyPages () {
+
+ $text = DTUtils::printImportingMessage();
+ $uploadResult = ImportStreamSource::newFromUpload( "file_name" );
+
+ if ( !$uploadResult->isOK() ) {
+ $uploadError = $this->getOutput()->parse( $uploadResult->getWikiText() );
+ $text .= $uploadError;
+ return $text;
+ }
+
+ $source = $uploadResult->value;
+
+ $encoding = $this->getRequest()->getVal( 'encoding' );
+ $pages = array();
+
+ $error_msg = $this->importFromFile( $source->mHandle, $encoding, $pages );
+
+ if ( ! is_null( $error_msg ) ) {
+ $text .= $error_msg;
+ return $text;
+ }
+
+ $importSummary = $this->getRequest()->getVal( 'import_summary' );
+ $forPagesThatExist = $this->getRequest()->getVal( 'pagesThatExist' );
+
+ $text .= self::modifyPages( $pages, $importSummary, $forPagesThatExist );
+
+ return $text;
+ }
+
+ protected function printForm() {
+ $formText = DTUtils::printFileSelector( $this->getFiletype() );
+ $utf8OptionText = "\t" . Xml::element( 'option',
+ array(
+ 'selected' => 'selected',
+ 'value' => 'utf8'
+ ), 'UTF-8' ) . "\n";
+ $utf16OptionText = "\t" . Xml::element( 'option',
+ array(
+ 'value' => 'utf16'
+ ), 'UTF-16' ) . "\n";
+ $encodingSelectText = Xml::tags( 'select',
+ array( 'name' => 'encoding' ),
+ "\n" . $utf8OptionText . $utf16OptionText. "\t" ) . "\n\t";
+ $formText .= "\t" . Xml::tags( 'p', null, $this->msg( 'dt_import_encodingtype', 'CSV' )->text() . " " . $encodingSelectText ) . "\n";
+ $formText .= "\t" . '<hr style="margin: 10px 0 10px 0" />' . "\n";
+ $formText .= DTUtils::printExistingPagesHandling();
+ $formText .= DTUtils::printImportSummaryInput( $this->getFiletype() );
+ $formText .= DTUtils::printSubmitButton();
+ $text = "\t" . Xml::tags( 'form',
+ array(
+ 'enctype' => 'multipart/form-data',
+ 'action' => '',
+ 'method' => 'post'
+ ), $formText ) . "\n";
+ return $text;
+ }
+
+ protected function importFromFile( $csv_file, $encoding, &$pages ) {
+ if ( is_null( $csv_file ) ) {
+ return wfMessage( 'emptyfile' )->text();
+ }
+
+ $table = array();
+ if ( $encoding == 'utf16' ) {
+ // Change encoding to UTF-8.
+ // Starting with PHP 5.3 we could use str_getcsv(),
+ // which would save the tempfile hassle.
+ $tempfile = tmpfile();
+ $csv_string = '';
+ while ( !feof( $csv_file ) ) {
+ $csv_string .= fgets( $csv_file, 65535 );
+ }
+ fwrite( $tempfile, iconv( 'UTF-16', 'UTF-8', $csv_string ) );
+ fseek( $tempfile, 0 );
+ while ( $line = fgetcsv( $tempfile ) ) {
+ array_push( $table, $line );
+ }
+ fclose( $tempfile );
+ } else {
+ while ( $line = fgetcsv( $csv_file ) ) {
+ // Convert from UTF-8 to ASCII - htmlentities()
+ // fails for UTF-8 if there are non-ASCII
+ // characters.
+ $convertedLine = array();
+ foreach ( $line as $value ) {
+ $convertedLine[] = mb_convert_encoding( $value, 'UTF-8', 'ASCII' );
+ }
+ array_push( $table, $convertedLine );
+ }
+ }
+ fclose( $csv_file );
+
+ // Get rid of the "byte order mark", if it's there - this is
+ // a three-character string sometimes put at the beginning
+ // of files to indicate its encoding.
+ // Code copied from:
+ // http://www.dotvoid.com/2010/04/detecting-utf-bom-byte-order-mark/
+ $byteOrderMark = pack( "CCC", 0xef, 0xbb, 0xbf );
+ if ( 0 == strncmp( $table[0][0], $byteOrderMark, 3 ) ) {
+ $table[0][0] = substr( $table[0][0], 3 );
+ // If there were quotation marks around this value,
+ // they didn't get removed, so remove them now.
+ $table[0][0] = trim( $table[0][0], '"' );
+ }
+
+ return $this->importFromArray( $table, $pages );
+
+ }
+
+ protected function importFromArray( $table, &$pages ) {
+ // Check header line to make sure every term is in the
+ // correct format.
+ $titleLabels = array( wfMessage( 'dt_xml_title' )->inContentLanguage()->text() );
+ $freeTextLabels = array( wfMessage( 'dt_xml_freetext' )->inContentLanguage()->text() );
+ // Add the English-language values as well, if this isn't an
+ // English-language wiki.
+ if ( $this->getLanguage()->getCode() !== 'en' ) {
+ $titleLabels[] = wfMessage( 'dt_xml_title' )->inLanguage( 'en' )->text();
+ $freeTextLabels[] = wfMessage( 'dt_xml_freetext' )->inLanguage( 'en' )->text();
+ }
+ foreach ( $table[0] as $i => $headerVal ) {
+ if ( !in_array( $headerVal, $titleLabels )
+ && !in_array( $headerVal, $freeTextLabels )
+ && $headerVal !== ''
+ && !preg_match( '/^[^\[\]]+\[[^\[\]]+]$/', $headerVal ) ) {
+ $errorMsg = wfMessage( 'dt_importcsv_badheader', $i, $headerVal, $titleLabels[0], $freeTextLabels[0] )->text();
+ return $errorMsg;
+ }
+ }
+ foreach ( $table as $i => $line ) {
+ if ( $i == 0 ) continue;
+ $page = new DTPage();
+ foreach ( $line as $j => $val ) {
+ if ( $table[0][$j] === '' ) {
+ continue;
+ }
+ if ( in_array( $table[0][$j], $titleLabels ) ) {
+ $page->setName( $val );
+ } elseif ( in_array( $table[0][$j], $freeTextLabels ) ) {
+ $page->setFreeText( $val );
+ } else {
+ list( $templateName, $fieldName ) = explode( '[', str_replace( ']', '', $table[0][$j] ) );
+ $page->addTemplateField( $templateName, $fieldName, $val );
+ }
+ }
+ $pages[] = $page;
+ }
+
+ return null;
+ }
+
+ protected function modifyPages( $pages, $editSummary, $forPagesThatExist ) {
+ $text = "";
+ $jobs = array();
+ $jobParams = array();
+ $jobParams['user_id'] = $this->getUser()->getId();
+ $jobParams['edit_summary'] = $editSummary;
+ $jobParams['for_pages_that_exist'] = $forPagesThatExist;
+ foreach ( $pages as $page ) {
+ $title = Title::newFromText( $page->getName() );
+ if ( is_null( $title ) ) {
+ $text .= '<p>' . $this->msg( 'img-auth-badtitle', $page->getName() )->text() . "</p>\n";
+ continue;
+ }
+ $jobParams['text'] = $page->createText();
+ $jobs[] = new DTImportJob( $title, $jobParams );
+ }
+ JobQueueGroup::singleton()->push( $jobs );
+
+ $text .= $this->msg( 'dt_import_success' )->numParams( count( $jobs ) )->params( $this->getFiletype() )->parseAsBlock();
+
+ return $text;
+ }
+
+ protected function getFiletype() {
+ return wfMessage( 'dt_filetype_csv' )->text();
+ }
+}
diff --git a/www/wiki/extensions/DataTransfer/specials/DT_ImportSpreadsheet.php b/www/wiki/extensions/DataTransfer/specials/DT_ImportSpreadsheet.php
new file mode 100644
index 00000000..c1da80aa
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/specials/DT_ImportSpreadsheet.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Lets the user import a spreadsheet file to turn into wiki pages
+ *
+ * @author Stephan Gambke
+ * @ingroup DataTransfer
+ */
+
+class DTImportSpreadsheet extends DTImportCSV {
+
+ public function __construct( $name='ImportSpreadsheet' ) {
+ parent::__construct( $name );
+ }
+
+ protected function printForm() {
+ if ( !class_exists( 'PHPExcel' ) ) {
+ return '<div class="error">You must have the PHPExcel library installed to run this page.</div>';
+ }
+
+ $formText = DTUtils::printFileSelector( $this->getFiletype() );
+ $formText .= DTUtils::printExistingPagesHandling();
+ $formText .= DTUtils::printImportSummaryInput( $this->getFiletype() );
+ $formText .= DTUtils::printSubmitButton();
+ $text = "\t" . Xml::tags( 'form',
+ array(
+ 'enctype' => 'multipart/form-data',
+ 'action' => '',
+ 'method' => 'post'
+ ), $formText ) . "\n";
+ return $text;
+ }
+
+ protected function importFromFile( $file, $encoding, &$pages ) {
+
+ if ( is_null( $file ) ) {
+ return wfMessage( 'emptyfile' )->text();
+ }
+
+ $metadata = stream_get_meta_data( $file );
+ $filename = $metadata['uri'];
+
+ @$objPHPExcel = PHPExcel_IOFactory::load( $filename );
+
+ $table = $objPHPExcel->getSheet(0)->toArray( '', true, true, false );
+
+ return $this->importFromArray( $table, $pages );
+
+ }
+
+ protected function getFiletype() {
+ return wfMessage( 'dt_filetype_spreadsheet' )->text();
+ }
+} \ No newline at end of file
diff --git a/www/wiki/extensions/DataTransfer/specials/DT_ImportXML.php b/www/wiki/extensions/DataTransfer/specials/DT_ImportXML.php
new file mode 100644
index 00000000..42f7d14d
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/specials/DT_ImportXML.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Lets the user import an XML file to turn into wiki pages
+ *
+ * @author Yaron Koren
+ */
+
+class DTImportXML extends SpecialPage {
+
+ /**
+ * Constructor
+ */
+ public function __construct( $name = 'ImportXML' ) {
+ parent::__construct( $name );
+ }
+
+ public function doesWrites() {
+ return true;
+ }
+
+ function execute( $query ) {
+ $this->setHeaders();
+
+ if ( ! $this->getUser()->isAllowed( 'datatransferimport' ) ) {
+ throw new PermissionsError( 'datatransferimport' );
+ }
+
+ $request = $this->getRequest();
+ if ( $request->getCheck( 'import_file' ) ) {
+ $text = DTUtils::printImportingMessage();
+ $uploadResult = ImportStreamSource::newFromUpload( "file_name" );
+ $source = $uploadResult->value;
+ $importSummary = $request->getVal( 'import_summary' );
+ $forPagesThatExist = $request->getVal( 'pagesThatExist' );
+ $text .= self::modifyPages( $source, $importSummary, $forPagesThatExist );
+ } else {
+ $formText = DTUtils::printFileSelector( wfMessage( 'dt_filetype_xml' )->text() );
+ $formText .= DTUtils::printExistingPagesHandling();
+ $formText .= DTUtils::printImportSummaryInput( wfMessage( 'dt_filetype_xml' )->text() );
+ $formText .= DTUtils::printSubmitButton();
+ $text = "\t" . Xml::tags( 'form',
+ array(
+ 'enctype' => 'multipart/form-data',
+ 'action' => '',
+ 'method' => 'post'
+ ), $formText ) . "\n";
+ }
+
+ $this->getOutput()->addHTML( $text );
+ }
+
+ function modifyPages( $source, $editSummary, $forPagesThatExist ) {
+ $text = "";
+ $xml_parser = new DTXMLParser( $source );
+ $xml_parser->doParse();
+ $jobs = array();
+ $job_params = array();
+ $job_params['user_id'] = $this->getUser()->getId();
+ $job_params['edit_summary'] = $editSummary;
+ $job_params['for_pages_that_exist'] = $forPagesThatExist;
+
+ foreach ( $xml_parser->mPages as $page ) {
+ $title = Title::newFromText( $page->getName() );
+ $job_params['text'] = $page->createText();
+ $jobs[] = new DTImportJob( $title, $job_params );
+ }
+ JobQueueGroup::singleton()->push( $jobs );
+
+ $text .= $this->msg( 'dt_import_success' )->numParams( count( $jobs ) )->params( 'XML' )
+ ->parseAsBlock();
+ return $text;
+ }
+}
diff --git a/www/wiki/extensions/DataTransfer/specials/DT_ViewXML.php b/www/wiki/extensions/DataTransfer/specials/DT_ViewXML.php
new file mode 100644
index 00000000..797aa8f9
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/specials/DT_ViewXML.php
@@ -0,0 +1,269 @@
+<?php
+/**
+ * Displays an interface to let the user export pages from the wiki in XML form
+ *
+ * @author Yaron Koren
+ */
+
+class DTViewXML extends SpecialPage {
+
+ /**
+ * Constructor
+ */
+ public function __construct( $name = 'ViewXML' ) {
+ parent::__construct( $name );
+ }
+
+ function execute( $query ) {
+ $this->setHeaders();
+ $this->doSpecialViewXML( $query );
+ }
+
+ static function getCategoriesList() {
+ $dbr = wfGetDB( DB_SLAVE );
+ $categorylinks = $dbr->tableName( 'categorylinks' );
+ $res = $dbr->query( "SELECT DISTINCT cl_to FROM $categorylinks" );
+ $categories = array();
+ while ( $row = $dbr->fetchRow( $res ) ) {
+ $categories[] = $row[0];
+ }
+ $dbr->freeResult( $res );
+ sort( $categories );
+ return $categories;
+ }
+
+ static function getNamespacesList() {
+ $dbr = wfGetDB( DB_SLAVE );
+ $page = $dbr->tableName( 'page' );
+ $res = $dbr->query( "SELECT DISTINCT page_namespace FROM $page" );
+ $namespaces = array();
+ while ( $row = $dbr->fetchRow( $res ) ) {
+ $namespaces[] = $row[0];
+ }
+ $dbr->freeResult( $res );
+ return $namespaces;
+ }
+
+ /*
+ * Get all the pages that belong to a category and all its
+ * subcategories, down a certain number of levels - heavily based
+ * on SMW's SMWInlineQuery::includeSubcategories()
+ */
+ static function getPagesForCategory( $top_category, $num_levels ) {
+ if ( 0 == $num_levels ) return $top_category;
+
+ $db = wfGetDB( DB_SLAVE );
+ $fname = "getPagesForCategory";
+ $categories = array( $top_category );
+ $checkcategories = array( $top_category );
+ $titles = array();
+ for ( $level = $num_levels; $level > 0; $level-- ) {
+ $newcategories = array();
+ foreach ( $checkcategories as $category ) {
+ $res = $db->select( // make the query
+ array( 'categorylinks', 'page' ),
+ array( 'page_id', 'page_title', 'page_namespace' ),
+ array( 'cl_from = page_id',
+ 'cl_to = ' . $db->addQuotes( $category )
+ ),
+ $fname
+ );
+ if ( $res ) {
+ while ( $row = $db->fetchRow( $res ) ) {
+ if ( array_key_exists( 'page_title', $row ) ) {
+ $page_namespace = $row['page_namespace'];
+ if ( $page_namespace == NS_CATEGORY ) {
+ $new_category = $row[ 'page_title' ];
+ if ( !in_array( $new_category, $categories ) ) {
+ $newcategories[] = $new_category;
+ }
+ } else {
+ $titles[] = Title::newFromID( $row['page_id'] );
+ }
+ }
+ }
+ $db->freeResult( $res );
+ }
+ }
+ if ( count( $newcategories ) == 0 ) {
+ return $titles;
+ } else {
+ $categories = array_merge( $categories, $newcategories );
+ }
+ $checkcategories = array_diff( $newcategories, array() );
+ }
+ return $titles;
+ }
+
+ static function getPagesForNamespace( $namespace ) {
+ $dbr = wfGetDB( DB_SLAVE );
+ $page = $dbr->tableName( 'page' );
+ $res = $dbr->query( "SELECT page_id FROM $page WHERE page_namespace = '$namespace'" );
+ $titles = array();
+ while ( $row = $dbr->fetchRow( $res ) ) {
+ $titles[] = Title::newFromID( $row[0] );
+ }
+ $dbr->freeResult( $res );
+ return $titles;
+ }
+
+ /**
+ * Helper function for getXMLForPage()
+ */
+ static function treeContainsElement( $tree, $element ) {
+ // escape out if there's no tree (i.e., category)
+ if ( $tree == null ) {
+ return false;
+ }
+
+ foreach ( $tree as $node => $child_tree ) {
+ if ( $node === $element ) {
+ return true;
+ } elseif ( count( $child_tree ) > 0 ) {
+ if ( self::treeContainsElement( $child_tree, $element ) ) {
+ return true;
+ }
+ }
+ }
+ // no match found
+ return false;
+ }
+
+
+ static function getXMLForPage( $title, $simplified_format, $depth = 0 ) {
+ if ( $depth > 5 ) { return ""; }
+
+ $pageStructure = DTPageStructure::newFromTitle( $title );
+ $text = $pageStructure->toXML( $simplified_format );
+
+ // escape back the curly brackets that were escaped out at the beginning
+ $text = str_replace( '&amp;#123;', '{', $text );
+ $text = str_replace( '&amp;#125;', '}', $text );
+ return $text;
+ }
+
+ function doSpecialViewXML() {
+ global $wgContLang;
+
+ $out = $this->getOutput();
+ $request = $this->getRequest();
+
+ $namespace_labels = $wgContLang->getNamespaces();
+ $category_label = $namespace_labels[NS_CATEGORY];
+ $name_str = str_replace( ' ', '_', wfMessage( 'dt_xml_name' )->inContentLanguage()->text() );
+ $namespace_str = str_replace( ' ', '_', wfMessage( 'dt_xml_namespace' )->text() );
+ $pages_str = str_replace( ' ', '_', wfMessage( 'dt_xml_pages' )->inContentLanguage()->text() );
+
+ $form_submitted = false;
+ $cats = $request->getArray( 'categories' );
+ $nses = $request->getArray( 'namespaces' );
+ $requestedTitles = $request->getVal( 'titles' );
+ if ( ! empty( $cats ) || ! empty( $nses ) || $requestedTitles != null ) {
+ $form_submitted = true;
+ }
+
+ if ( $form_submitted ) {
+ $out->disable();
+
+ // Cancel output buffering and gzipping if set
+ // This should provide safer streaming for pages with history
+ wfResetOutputBuffers();
+ header( "Content-type: application/xml; charset=utf-8" );
+
+ $simplified_format = $request->getVal( 'simplified_format' );
+ $text = "<$pages_str>";
+ if ( $cats ) {
+ foreach ( $cats as $cat => $val ) {
+ if ( $simplified_format )
+ $text .= '<' . str_replace( ' ', '_', $cat ) . ">\n";
+ else
+ $text .= "<$category_label $name_str=\"$cat\">\n";
+ $titles = self::getPagesForCategory( $cat, 10 );
+ foreach ( $titles as $title ) {
+ $text .= self::getXMLForPage( $title, $simplified_format );
+ }
+ if ( $simplified_format ) {
+ $text .= '</' . str_replace( ' ', '_', $cat ) . ">\n";
+ } else {
+ $text .= "</$category_label>\n";
+ }
+ }
+ }
+
+ if ( $nses ) {
+ foreach ( $nses as $ns => $val ) {
+ if ( $ns == 0 ) {
+ $ns_name = "Main";
+ } else {
+ $ns_name = MWNamespace::getCanonicalName( $ns );
+ }
+ if ( $simplified_format ) {
+ $text .= '<' . str_replace( ' ', '_', $ns_name ) . ">\n";
+ } else {
+ $text .= "<$namespace_str $name_str=\"$ns_name\">\n";
+ }
+ $titles = self::getPagesForNamespace( $ns );
+ foreach ( $titles as $title ) {
+ $text .= self::getXMLForPage( $title, $simplified_format );
+ }
+ if ( $simplified_format )
+ $text .= '</' . str_replace( ' ', '_', $ns_name ) . ">\n";
+ else
+ $text .= "</$namespace_str>\n";
+ }
+ }
+
+ // The user can specify a set of page names to view
+ // the XML of, using a "titles=" parameter, separated
+ // by "|", in the manner of the MediaWiki API.
+ // Hm... perhaps all of Special:ViewXML should just
+ // be replaced by an API action?
+ if ( $requestedTitles ) {
+ $pageNames = explode( '|', $requestedTitles );
+ foreach ( $pageNames as $pageName ) {
+ $title = Title::newFromText( $pageName );
+ $text .= self::getXMLForPage( $title, $simplified_format );
+ }
+ }
+
+ $text .= "</$pages_str>";
+ print $text;
+ } else {
+ // set 'title' as hidden field, in case there's no URL niceness
+ global $wgContLang;
+ $mw_namespace_labels = $wgContLang->getNamespaces();
+ $special_namespace = $mw_namespace_labels[NS_SPECIAL];
+ $text = <<<END
+ <form action="" method="get">
+ <input type="hidden" name="title" value="$special_namespace:ViewXML">
+
+END;
+ $text .= "<p>" . wfMessage( 'dt_viewxml_docu' )->text() . "</p>\n";
+ $text .= "<h2>" . wfMessage( 'dt_viewxml_categories' )->text() . "</h2>\n";
+ $categories = self::getCategoriesList();
+ foreach ( $categories as $category ) {
+ $text .= Html::input( "categories[$category]", null, 'checkbox' );
+ $title = Title::makeTitle( NS_CATEGORY, $category );
+ $link = Linker::link( $title, htmlspecialchars( $title->getText() ) );
+ $text .= " $link<br />\n";
+ }
+ $text .= "<h2>" . wfMessage( 'dt_viewxml_namespaces' )->text() . "</h2>\n";
+ $namespaces = self::getNamespacesList();
+ foreach ( $namespaces as $nsCode ) {
+ if ( $nsCode === '0' ) {
+ $nsName = wfMessage( 'blanknamespace' )->escaped();
+ } else {
+ $nsName = htmlspecialchars( $wgContLang->getFormattedNsText( $nsCode ) );
+ if ( $nsName === '' ) continue;
+ }
+ $text .= Html::input( "namespaces[$nsCode]", null, 'checkbox' );
+ $text .= ' ' . str_replace( '_', ' ', $nsName ) . "<br />\n";
+ }
+ $text .= "<br /><p><label><input type=\"checkbox\" name=\"simplified_format\" /> " . wfMessage( 'dt_viewxml_simplifiedformat' )->text() . "</label></p>\n";
+ $text .= "<input type=\"submit\" value=\"" . wfMessage( 'viewxml' )->text() . "\">\n";
+ $text .= "</form>\n";
+
+ $out->addHTML( $text );
+ }
+ }
+}
diff --git a/www/wiki/extensions/DataTransfer/styles/DataTransfer.css b/www/wiki/extensions/DataTransfer/styles/DataTransfer.css
new file mode 100644
index 00000000..b634ed86
--- /dev/null
+++ b/www/wiki/extensions/DataTransfer/styles/DataTransfer.css
@@ -0,0 +1,4 @@
+input.mw-summary {
+ width: 400px;
+ max-width: 100%;
+} \ No newline at end of file
diff --git a/www/wiki/extensions/ExternalData/COPYING b/www/wiki/extensions/ExternalData/COPYING
new file mode 100644
index 00000000..d159169d
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/COPYING
@@ -0,0 +1,339 @@
+ 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.
diff --git a/www/wiki/extensions/ExternalData/ExternalData.hooks.php b/www/wiki/extensions/ExternalData/ExternalData.hooks.php
new file mode 100644
index 00000000..7bd254b7
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/ExternalData.hooks.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * Hook functions for the External Data extension.
+ *
+ * @file
+ * @ingroup ExternalData
+ * @author Yaron Koren
+ */
+class ExternalDataHooks {
+
+ public static function registerParser( &$parser ) {
+ $parser->setFunctionHook( 'get_web_data', array( 'EDParserFunctions', 'doGetWebData' ) );
+ $parser->setFunctionHook( 'get_file_data', array( 'EDParserFunctions', 'doGetFileData' ) );
+ $parser->setFunctionHook( 'get_soap_data', array( 'EDParserFunctions', 'doGetSOAPData' ) );
+ $parser->setFunctionHook( 'get_ldap_data', array( 'EDParserFunctions', 'doGetLDAPData' ) );
+ $parser->setFunctionHook( 'get_db_data', array( 'EDParserFunctions', 'doGetDBData' ) );
+ $parser->setFunctionHook( 'external_value', array( 'EDParserFunctions', 'doExternalValue' ) );
+ $parser->setFunctionHook( 'for_external_table', array( 'EDParserFunctions', 'doForExternalTable' ) );
+ $parser->setFunctionHook( 'display_external_table', array( 'EDParserFunctions', 'doDisplayExternalTable' ) );
+ $parser->setFunctionHook( 'store_external_table', array( 'EDParserFunctions', 'doStoreExternalTable' ) );
+ $parser->setFunctionHook( 'clear_external_data', array( 'EDParserFunctions', 'doClearExternalData' ) );
+
+ return true; // always return true, in order not to stop MW's hook processing!
+ }
+
+}
diff --git a/www/wiki/extensions/ExternalData/ExternalData.i18n.alias.php b/www/wiki/extensions/ExternalData/ExternalData.i18n.alias.php
new file mode 100644
index 00000000..c440c345
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/ExternalData.i18n.alias.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Aliases for special pages
+ *
+ * @file
+ * @ingroup Extensions
+ */
+
+$specialPageAliases = array();
+
+/** English (English) */
+$specialPageAliases['en'] = array(
+ 'GetData' => array( 'GetData' ),
+);
diff --git a/www/wiki/extensions/ExternalData/ExternalData.i18n.magic.php b/www/wiki/extensions/ExternalData/ExternalData.i18n.magic.php
new file mode 100644
index 00000000..ddca6441
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/ExternalData.i18n.magic.php
@@ -0,0 +1,233 @@
+<?php
+/**
+ *
+ */
+
+$magicWords = array();
+
+/** English (English) */
+$magicWords['en'] = array(
+ 'get_web_data' => array( 0, 'get_web_data' ),
+ 'get_file_data' => array( 0, 'get_file_data' ),
+ 'get_soap_data' => array( 0, 'get_soap_data' ),
+ 'get_ldap_data' => array( 0, 'get_ldap_data' ),
+ 'get_db_data' => array( 0, 'get_db_data' ),
+ 'external_value' => array( 0, 'external_value' ),
+ 'for_external_table' => array( 0, 'for_external_table' ),
+ 'display_external_table' => array( 0, 'display_external_table' ),
+ 'store_external_table' => array( 0, 'store_external_table' ),
+ 'clear_external_data' => array( 0, 'clear_external_data' ),
+);
+
+/** Arabic (العربية) */
+$magicWords['ar'] = array(
+ 'get_web_data' => array( 0, 'عرض_بيانات_الويب' ),
+ 'get_file_data' => array( 0, 'عرض_بيانات_الملف' ),
+ 'get_soap_data' => array( 0, 'عرض_بيانات_السوب' ),
+ 'get_ldap_data' => array( 0, 'عرض_بيانات_لداب' ),
+ 'get_db_data' => array( 0, 'عرض_بيانات_قب' ),
+ 'external_value' => array( 0, 'قيمة_خارجية' ),
+ 'for_external_table' => array( 0, 'لجدول_خارجي' ),
+ 'display_external_table' => array( 0, 'عرض_جدول_خارجي' ),
+ 'store_external_table' => array( 0, 'تخزين_جدول_خارجي' ),
+ 'clear_external_data' => array( 0, 'إزالة_بيانات_خارجية' ),
+);
+
+/** Egyptian Arabic (مصرى) */
+$magicWords['arz'] = array(
+ 'get_web_data' => array( 0, 'عرض_بيانات_الويب' ),
+ 'get_ldap_data' => array( 0, 'عرض_بيانات_لداب' ),
+ 'get_db_data' => array( 0, 'عرض_بيانات_قب' ),
+ 'external_value' => array( 0, 'قيمه_خارجيه' ),
+ 'for_external_table' => array( 0, 'لجدول_خارجي' ),
+ 'display_external_table' => array( 0, 'عرض_جدول_خارجى' ),
+ 'store_external_table' => array( 0, 'تخزين_جدول_خارجى', 'تخزين_جدول_خارجي' ),
+ 'clear_external_data' => array( 0, 'مسح_بيانات_خارجيه' ),
+);
+
+/** Chechen (нохчийн) */
+$magicWords['ce'] = array(
+ 'get_ldap_data' => array( 0, 'схьаэца_хаамаш_ldap', 'получить_данные_ldap' ),
+ 'get_db_data' => array( 0, 'схьаэца_хаамаш_db', 'получить_данные_db' ),
+ 'external_value' => array( 0, 'архьара_дозалла', 'внешнее_значение' ),
+ 'for_external_table' => array( 0, 'оцу_архьара_тебалецlаш', 'для_внешней_таблицы' ),
+);
+
+/** German (Deutsch) */
+$magicWords['de'] = array(
+ 'get_web_data' => array( 0, 'hole_webdaten' ),
+ 'get_ldap_data' => array( 0, 'hole_ldapdaten' ),
+ 'get_db_data' => array( 0, 'hole_dbdaten' ),
+ 'external_value' => array( 0, 'externer_wert' ),
+ 'for_external_table' => array( 0, 'für_externe_tabelle' ),
+ 'display_external_table' => array( 0, 'zeige_externe_tabelle' ),
+ 'store_external_table' => array( 0, 'speichere_externe_tabelle' ),
+ 'clear_external_data' => array( 0, 'leere_externe_tabelle' ),
+);
+
+/** Greek (Ελληνικά) */
+$magicWords['el'] = array(
+ 'get_web_data' => array( 0, 'λήψη_δεδομένων_ιστού' ),
+ 'get_ldap_data' => array( 0, 'λήψη_δεδομένων_ldap' ),
+ 'get_db_data' => array( 0, 'λήψη_δεδομένων_βδ' ),
+ 'external_value' => array( 0, 'εξωτερική_τιμή' ),
+ 'for_external_table' => array( 0, 'για_εξωτερικό_πίνακα' ),
+ 'display_external_table' => array( 0, 'προβολή_εξωτερικού_πίνακα' ),
+ 'store_external_table' => array( 0, 'αποθήκευση_εξωτερικού_πίνακα' ),
+ 'clear_external_data' => array( 0, 'εκκαθάριση_εξωτερικών_δεδομένων' ),
+);
+
+/** Spanish (español) */
+$magicWords['es'] = array(
+ 'get_db_data' => array( 0, 'obtener_datos_db' ),
+ 'external_value' => array( 0, 'valor_externo' ),
+);
+
+/** Persian (فارسی) */
+$magicWords['fa'] = array(
+ 'get_web_data' => array( 0, 'گرفتن_داده_وب' ),
+);
+
+/** Western Frisian (Frysk) */
+$magicWords['fy'] = array(
+ 'external_value' => array( 0, 'eksterne_wearde' ),
+);
+
+/** Japanese (日本語) */
+$magicWords['ja'] = array(
+ 'get_ldap_data' => array( 0, 'ldapデータ取得' ),
+ 'get_db_data' => array( 0, 'dbデータ取得' ),
+ 'external_value' => array( 0, '外部値' ),
+ 'for_external_table' => array( 0, '外部テーブル用' ),
+ 'store_external_table' => array( 0, '外部テーブル格納' ),
+);
+
+/** Korean (한국어) */
+$magicWords['ko'] = array(
+ 'get_web_data' => array( 0, '웹_데이터_얻기' ),
+ 'get_file_data' => array( 0, '파일_데이터_얻기' ),
+ 'get_soap_data' => array( 0, 'soap_데이터_얻기' ),
+ 'get_ldap_data' => array( 0, 'ldap_데이터_얻기' ),
+ 'get_db_data' => array( 0, 'db_데이터_얻기' ),
+ 'external_value' => array( 0, '바깥_값' ),
+ 'for_external_table' => array( 0, '바깥_표_대해' ),
+ 'display_external_table' => array( 0, '바깥_표_보기' ),
+ 'store_external_table' => array( 0, '바깥_표_저장' ),
+ 'clear_external_data' => array( 0, '바깥_데이터_지우기' ),
+);
+
+/** Macedonian (македонски) */
+$magicWords['mk'] = array(
+ 'get_web_data' => array( 0, 'преземи_семрежни_податоци' ),
+ 'get_file_data' => array( 0, 'преземи_податотечни_податоци' ),
+ 'get_soap_data' => array( 0, 'преземи_soap_податоци' ),
+ 'get_ldap_data' => array( 0, 'преземи_ldap_податоци' ),
+ 'get_db_data' => array( 0, 'преземи_db_податоци' ),
+ 'external_value' => array( 0, 'надворешна_вредност' ),
+ 'for_external_table' => array( 0, 'за_надворешна_табела' ),
+ 'display_external_table' => array( 0, 'прикажи_надворешна_табела' ),
+ 'store_external_table' => array( 0, 'складирај_надворешна_табела' ),
+ 'clear_external_data' => array( 0, 'исчисти_надворешни_податоци' ),
+);
+
+/** Malayalam (മലയാളം) */
+$magicWords['ml'] = array(
+ 'get_web_data' => array( 0, 'വെബ്_വിവരങ്ങൾ_എടുക്കുക' ),
+ 'external_value' => array( 0, 'ബാഹ്യ_മൂല്യം' ),
+);
+
+/** Marathi (मराठी) */
+$magicWords['mr'] = array(
+ 'get_ldap_data' => array( 0, 'मिळवा__एलडॅप_विदा' ),
+ 'for_external_table' => array( 0, 'बाह्य_सारणी_करिता' ),
+);
+
+/** Low Saxon (Netherlands) (Nedersaksies) */
+$magicWords['nds-nl'] = array(
+ 'get_web_data' => array( 0, 'webgegevens_ophaolen' ),
+ 'get_ldap_data' => array( 0, 'ldap-gegevens_ophaolen' ),
+ 'get_db_data' => array( 0, 'db-gegevens_ophaolen' ),
+ 'external_value' => array( 0, 'externe_weerde' ),
+ 'for_external_table' => array( 0, 'veur_externe_tabel' ),
+ 'store_external_table' => array( 0, 'opslaon_externe_tabel' ),
+);
+
+/** Dutch (Nederlands) */
+$magicWords['nl'] = array(
+ 'get_web_data' => array( 0, 'webgegevens_ophalen' ),
+ 'get_file_data' => array( 0, 'bestandsgegevens_ophalen' ),
+ 'get_soap_data' => array( 0, 'soapgegevens_ophalen' ),
+ 'get_ldap_data' => array( 0, 'ldap_gegevens_ophalen' ),
+ 'get_db_data' => array( 0, 'db_gegevens_ophalen' ),
+ 'external_value' => array( 0, 'externe_waarde' ),
+ 'for_external_table' => array( 0, 'voor_externe_tabel' ),
+ 'display_external_table' => array( 0, 'externe_tabel_weergeven' ),
+ 'store_external_table' => array( 0, 'opslaan_externe_tabel' ),
+ 'clear_external_data' => array( 0, 'externe_gegevens_opschonen' ),
+);
+
+/** Russian (русский) */
+$magicWords['ru'] = array(
+ 'get_ldap_data' => array( 0, 'получить_данные_ldap' ),
+ 'get_db_data' => array( 0, 'получить_данные_db' ),
+ 'external_value' => array( 0, 'внешнее_значение' ),
+ 'for_external_table' => array( 0, 'для_внешней_таблицы' ),
+ 'store_external_table' => array( 0, 'внешняя_таблица_хранения' ),
+);
+
+/** Serbian (Cyrillic script) (српски (ћирилица)‎) */
+$magicWords['sr-ec'] = array(
+ 'get_web_data' => array( 0, 'добави_веб_податке' ),
+ 'get_ldap_data' => array( 0, 'добави_лдап_податке' ),
+ 'get_db_data' => array( 0, 'добави_податке_базе' ),
+ 'external_value' => array( 0, 'спољна_вредност' ),
+ 'for_external_table' => array( 0, 'за_спољну_табелу' ),
+ 'store_external_table' => array( 0, 'смести_спољну_табелу' ),
+);
+
+/** Serbian (Latin script) (srpski (latinica)‎) */
+$magicWords['sr-el'] = array(
+ 'get_web_data' => array( 0, 'dobavi_mrežne_podatke' ),
+ 'get_ldap_data' => array( 0, 'dobavi_ldap_podatke' ),
+ 'get_db_data' => array( 0, 'dobavi_podatke_baze' ),
+ 'external_value' => array( 0, 'spoljna_vrednost' ),
+ 'for_external_table' => array( 0, 'za_spoljnu_tabelu' ),
+ 'store_external_table' => array( 0, 'smesti_spoljnu_tabelu' ),
+ 'clear_external_data' => array( 0, 'očisti_spoljne_podatke' ),
+);
+
+/** Ukrainian (українська) */
+$magicWords['uk'] = array(
+ 'get_ldap_data' => array( 0, 'отримати_дані_ldap' ),
+ 'get_db_data' => array( 0, 'отримати_дані_db' ),
+ 'external_value' => array( 0, 'зовнішнє_значення' ),
+ 'for_external_table' => array( 0, 'для_зовнішньої_таблиці' ),
+ 'store_external_table' => array( 0, 'зовнішня_таблиця_зберігання' ),
+);
+
+/** Simplified Chinese (中文(简体)‎) */
+$magicWords['zh-hans'] = array(
+ 'get_web_data' => array( 0, '获取网络数据' ),
+ 'get_file_data' => array( 0, '获取文件数据' ),
+ 'get_soap_data' => array( 0, '获取soap数据' ),
+ 'get_ldap_data' => array( 0, '获取ldap数据' ),
+ 'get_db_data' => array( 0, '获取数据库数据' ),
+ 'external_value' => array( 0, '外部取值' ),
+ 'for_external_table' => array( 0, '用于外部表单' ),
+ 'display_external_table' => array( 0, '显示外部表单' ),
+ 'store_external_table' => array( 0, '存储外部表单' ),
+ 'clear_external_data' => array( 0, '清空外部数据' ),
+);
+
+/** Traditional Chinese (中文(繁體)‎) */
+$magicWords['zh-hant'] = array(
+ 'get_web_data' => array( 0, '取得網路數據' ),
+ 'get_file_data' => array( 0, '取得檔案數據' ),
+ 'get_soap_data' => array( 0, '取得soap數據' ),
+ 'get_ldap_data' => array( 0, '取得ldap數據' ),
+ 'get_db_data' => array( 0, '取得資料庫數據' ),
+ 'for_external_table' => array( 0, '用於外部表單' ),
+ 'display_external_table' => array( 0, '顯示外部表單' ),
+ 'store_external_table' => array( 0, '儲存外部表單' ),
+ 'clear_external_data' => array( 0, '清空外部數據' ),
+); \ No newline at end of file
diff --git a/www/wiki/extensions/ExternalData/ExternalData.php b/www/wiki/extensions/ExternalData/ExternalData.php
new file mode 100644
index 00000000..cad5ab7c
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/ExternalData.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Initialization file for the External Data extension
+ *
+ * @file
+ * @ingroup ExternalData
+ * @author Yaron Koren
+ */
+
+if ( function_exists( 'wfLoadExtension' ) ) {
+ wfLoadExtension( 'ExternalData' );
+ // Keep i18n globals so mergeMessageFileList.php doesn't break
+ $wgMessagesDirs['ExternalData'] = __DIR__ . '/i18n';
+ $wgExtensionMessagesFiles['ExternalDataMagic'] = __DIR__ . '/ExternalData.i18n.magic.php';
+ /* wfWarn(
+ 'Deprecated PHP entry point used for External Data extension. Please use wfLoadExtension instead, ' .
+ 'see https://www.mediawiki.org/wiki/Extension_registration for more details.'
+ ); */
+ return;
+}
+
+if ( !defined( 'MEDIAWIKI' ) ) die();
+
+$wgExtensionCredits['parserhook'][] = array(
+ 'path' => __FILE__,
+ 'name' => 'External Data',
+ 'version' => '1.9',
+ 'author' => array( 'Yaron Koren', '...' ),
+ 'url' => 'https://www.mediawiki.org/wiki/Extension:External_Data',
+ 'descriptionmsg' => 'externaldata-desc',
+ 'license-name' => 'GPL-2.0-or-later'
+);
+
+$wgHooks['ParserFirstCallInit'][] = 'ExternalDataHooks::registerParser';
+$wgMessagesDirs['ExternalData'] = __DIR__ . '/i18n';
+$wgExtensionMessagesFiles['ExternalDataMagic'] = __DIR__ . '/ExternalData.i18n.magic.php';
+
+// Register all special pages and other classes
+$wgAutoloadClasses['ExternalDataHooks'] = __DIR__ . '/ExternalData.hooks.php';
+$wgAutoloadClasses['EDUtils'] = __DIR__ . '/includes/ED_Utils.php';
+$wgAutoloadClasses['EDParserFunctions'] = __DIR__ . '/includes/ED_ParserFunctions.php';
+$wgSpecialPages['GetData'] = 'EDGetData';
+$wgAutoloadClasses['EDGetData'] = __DIR__ . '/includes/ED_GetData.php';
+
+$edgValues = array();
+$edgStringReplacements = array();
+$edgCacheTable = null;
+$edgAllowSSL = true;
+$edgExternalValueVerbose = true;
+
+// Value is in seconds - set to one week
+$edgCacheExpireTime = 60 * 60 * 24 * 7;
+
+$edgDBServer = array();
+$edgDBServerType = array();
+$edgDBName = array();
+$edgDBUser = array();
+$edgDBPass = array();
+$edgDBDirectory = array();
+$edgDBFlags = array();
+$edgDBTablePrefix = array();
+
+$edgDirectoryPath = array();
+$edgFilePath = array();
diff --git a/www/wiki/extensions/ExternalData/Gruntfile.js b/www/wiki/extensions/ExternalData/Gruntfile.js
new file mode 100644
index 00000000..a45071e1
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/Gruntfile.js
@@ -0,0 +1,21 @@
+/*jshint node:true */
+module.exports = function ( grunt ) {
+ grunt.loadNpmTasks( 'grunt-jsonlint' );
+ grunt.loadNpmTasks( 'grunt-banana-checker' );
+
+ grunt.initConfig( {
+ banana: {
+ all: 'i18n/'
+ },
+ jsonlint: {
+ all: [
+ '**/*.json',
+ '!node_modules/**',
+ '!vendor/**'
+ ]
+ }
+ } );
+
+ grunt.registerTask( 'test', [ 'jsonlint', 'banana' ] );
+ grunt.registerTask( 'default', 'test' );
+};
diff --git a/www/wiki/extensions/ExternalData/README b/www/wiki/extensions/ExternalData/README
new file mode 100644
index 00000000..72d7a26c
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/README
@@ -0,0 +1,107 @@
+External Data extension
+
+ Version 1.9
+ Yaron Koren and (many) others
+
+This is free software licensed under the GNU General Public License. Please
+see http://www.gnu.org/copyleft/gpl.html for further details, including the
+full text and terms of the license.
+
+== Overview ==
+
+External Data is an extension to MediaWiki that allows for retrieving data
+from various sources: external URLs, local wiki pages and files on the
+server (all in CSV, GFF, JSON and XML formats), plus database tables and
+LDAP servers.
+
+The extension defines the following parser functions: #get_web_data,
+#get_soap_data, #get_file_data, #get_db_data, #get_ldap_data,
+#external_value, #for_external_table, #display_external_table,
+#store_external_table and #clear_external_data. They are described below:
+
+* #get_web_data retrieves the data from a URL that holds CSV, GFF,
+JSON or XML, and assigns it to local variables or arrays.
+
+* #get_soap_data retrieves data from a URL via SOAP.
+
+* #get_file_data retrieves data from a local file, which can be in any of
+the same formats that #get_web_data handles.
+
+* #get_db_data retrieves data from a database, using (in most cases)
+SQL-like syntax, and assigns it to local variables or arrays.
+
+* #get_ldap_data retrieves data from an LDAP server and assigns it to
+local variables.
+
+* #external_value displays the value of any retrieved variable, or the
+first value if it's an array.
+
+* #for_external_table applies processing onto multiple rows retrieved by
+any of the #get_*_data functions
+
+* #display_external_table is like #for_external_table, but passes the
+values of each row to a template, which handles the formatting.
+
+* #store_external_table mimics a call to the Semantic MediaWiki
+extension's #subobject parser function onto each row retrieved by
+any of the #get_*_data functions, in order to store the entire array
+of data semantically.
+
+* #clear_external_data erases the current set of retrieved data.
+
+In addition, the extension defines a new special page, 'GetData', which
+exports selected rows from a wiki page that holds CSV data, in a format
+that is readable by #get_web_data.
+
+For more information, see the extension homepage at:
+http://www.mediawiki.org/wiki/Extension:External_Data
+
+== Requirements ==
+
+This version of the External Data extension requires MediaWiki 1.23 or
+higher.
+
+== Installation ==
+
+To install the extension, place the entire 'ExternalData' directory
+within your MediaWiki 'extensions' directory, then add the following
+line to your 'LocalSettings.php' file:
+
+ require_once( "$IP/extensions/ExternalData/ExternalData.php" );
+
+To cache the data from the URLs being accessed, you can call the contents
+of ExternalData.sql in your database, then add the following to
+LocalSettings.php:
+
+ $edgCacheTable = 'ed_url_cache';
+
+You should also add a line like the following, to set the expiration time
+of the cache, in seconds; this line will cache data for a week:
+
+ $edgCacheExpireTime = 7 * 24 * 60 * 60;
+
+You can also set for string replacements to be done on the URLs you call,
+for instance to hide API keys:
+
+ $edgStringReplacements['MY_API_KEY'] = 'abcd1324';
+
+You can create a "whitelist" to allow retrieval of data only from trusted
+sites, in the manner of MediaWiki's $wgAllowExternalImagesFrom - if you
+are hiding API keys, it is very much recommended to create such a
+whitelist, to prevent users from being able to discover their values:
+
+ $edgAllowExternalDataFrom = array('http://example.com/api');
+
+Finally, to use the database or LDAP retrieval capabilities, you need to
+set connection settings as well - see the online documentation for more
+information.
+
+== Contact ==
+
+Most comments, questions, suggestions and bug reports should be sent to
+the main MediaWiki mailing list:
+
+ https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+
+If possible, please add "[ED]" at the beginning of the subject line, to
+clarify the subject matter.
diff --git a/www/wiki/extensions/ExternalData/composer.json b/www/wiki/extensions/ExternalData/composer.json
new file mode 100644
index 00000000..b071b83c
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/composer.json
@@ -0,0 +1,16 @@
+{
+ "require-dev": {
+ "jakub-onderka/php-parallel-lint": "1.0.0",
+ "jakub-onderka/php-console-highlighter": "0.3.2",
+ "mediawiki/minus-x": "0.3.1"
+ },
+ "scripts": {
+ "test": [
+ "parallel-lint . --exclude vendor --exclude node_modules",
+ "minus-x check ."
+ ],
+ "fix": [
+ "minus-x fix ."
+ ]
+ }
+}
diff --git a/www/wiki/extensions/ExternalData/extension.json b/www/wiki/extensions/ExternalData/extension.json
new file mode 100644
index 00000000..9bc364e5
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/extension.json
@@ -0,0 +1,55 @@
+{
+ "name": "External Data",
+ "version": "1.9",
+ "author": [
+ "Yaron Koren",
+ "..."
+ ],
+ "url": "https://www.mediawiki.org/wiki/Extension:External_Data",
+ "descriptionmsg": "externaldata-desc",
+ "license-name": "GPL-2.0-or-later",
+ "type": "parserhook",
+ "SpecialPages": {
+ "GetData": "EDGetData"
+ },
+ "MessagesDirs": {
+ "ExternalData": [
+ "i18n"
+ ]
+ },
+ "ExtensionMessagesFiles": {
+ "ExternalDataMagic": "ExternalData.i18n.magic.php",
+ "ExternalDataAlias": "ExternalData.i18n.alias.php"
+ },
+ "AutoloadClasses": {
+ "ExternalDataHooks": "ExternalData.hooks.php",
+ "EDUtils": "includes/ED_Utils.php",
+ "EDParserFunctions": "includes/ED_ParserFunctions.php",
+ "EDGetData": "includes/ED_GetData.php"
+ },
+ "Hooks": {
+ "ParserFirstCallInit": [
+ "ExternalDataHooks::registerParser"
+ ]
+ },
+ "config": {
+ "_prefix": "edg",
+ "Values": [],
+ "StringReplacements": [],
+ "CacheTable": null,
+ "AllowSSL": true,
+ "ExternalValueVerbose": true,
+ "CacheExpireTime": 604800,
+ "DBServer": [],
+ "DBServerType ": [],
+ "DBName": [],
+ "DBUser": [],
+ "DBPass": [],
+ "DBDirectory": [],
+ "DBFlags": [],
+ "DBTablePrefix": [],
+ "DirectoryPath": [],
+ "FilePath": []
+ },
+ "manifest_version": 1
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/af.json b/www/wiki/extensions/ExternalData/i18n/af.json
new file mode 100644
index 00000000..168afd48
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/af.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Naudefj"
+ ]
+ },
+ "getdata": "Kry data",
+ "externaldata-xml-error": "XML-fout: $1 op reël $2",
+ "externaldata-db-unknown-type": "Fout: onbekende databasistipe.",
+ "externaldata-db-could-not-connect": "Fout: kon nie 'n verbinding met databasis bewerkstellig nie.",
+ "externaldata-db-invalid-query": "Ongeldige navraag."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/aln.json b/www/wiki/extensions/ExternalData/i18n/aln.json
new file mode 100644
index 00000000..a5f23163
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/aln.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Mdupont"
+ ]
+ },
+ "getdata": "Merr të dhëna",
+ "externaldata-desc": "Lejon retrieving të dhënat e strukturuar nga URL jashtme, bazat e të dhënave dhe burimet tjera",
+ "externaldata-ldap-unable-to-connect": "Në pamundësi për t'u lidhur tek $1",
+ "externaldata-xml-error": "XML error: $1 tek $2 linjë",
+ "externaldata-db-incomplete-information": "Gabim: informata jo të plota për këtë server të identitetit.",
+ "externaldata-db-could-not-get-url": "Nuk mund te merrni URL pasi $1 {{PLURAL:$1|provoni|përpiqet}}.",
+ "externaldata-db-unknown-type": "Gabim: Lloj i panjohur bazës së të dhënave.",
+ "externaldata-db-could-not-connect": "Gabim: Nuk mund të lidheni me bazën e të dhënave.",
+ "externaldata-db-no-return-values": "Gabim: Nuk ka kthim vlerat e caktuara.",
+ "externaldata-db-invalid-query": "pyetje e pavlefshme."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/ar.json b/www/wiki/extensions/ExternalData/i18n/ar.json
new file mode 100644
index 00000000..fac90e73
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/ar.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "DRIHEM",
+ "Imksa",
+ "Meno25",
+ "OsamaK",
+ "ديفيد"
+ ]
+ },
+ "getdata": "الحصول على البيانات",
+ "externaldata-desc": "يسمح باسترجاع البيانات الهيكلية من مسارات خارجية، قواعد البيانات ومصادر أخرى",
+ "externaldata-no-param-specified": "خطأ: لم يتم تحديد وسيط \"$1\".",
+ "externaldata-web-invalid-format": "إمتداد خاطئ: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "تعذّر الاتصال ب$1",
+ "externaldata-xml-error": "خطأ XML: $1 عند السطر $2",
+ "externaldata-invalid-json": "خطأ: جسون غير صالح.",
+ "externaldata-db-incomplete-information": "خطأ: معلومات غير كاملة عن هوية هذا الخادوم.",
+ "externaldata-db-could-not-get-url": "تعذّر الحصول على المسار بعد {{PLURAL:$1||محاولة واحدة|محاوتين|$1 محاولات|$1 محاولة }}.",
+ "externaldata-db-unknown-type": "خطأ: نوع قاعدة بيانات غير معروف.",
+ "externaldata-db-could-not-connect": "خطأ: تعذّر الاتصال بقاعدة البيانات.",
+ "externaldata-db-unknown-collection": "خطأ: مجموعة مونغو دي بي غير معروفة.",
+ "externaldata-db-no-return-values": "خطأ: لم تحدد أي قيم عائدة.",
+ "externaldata-db-invalid-query": "استعلام غير صالح."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/arz.json b/www/wiki/extensions/ExternalData/i18n/arz.json
new file mode 100644
index 00000000..7f3f8a12
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/arz.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dudi",
+ "Meno25"
+ ]
+ },
+ "getdata": "الحصول على البيانات",
+ "externaldata-desc": "بيسمح انك تجيب الداتا المتركبه من URLات برّانيه, و قواعد بيانات (databases) و مصادر تانيه"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/ast.json b/www/wiki/extensions/ExternalData/i18n/ast.json
new file mode 100644
index 00000000..c5d1975c
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/ast.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Xuacu"
+ ]
+ },
+ "getdata": "Recuperar datos",
+ "externaldata-desc": "Permite recuperar datos estructuraos de direiciones URL, bases de datos y otres fontes esternes",
+ "externaldata-no-param-specified": "Error: Nun s'especificó dengún parámetru «$1».",
+ "externaldata-web-invalid-format": "Formatu inválidu: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Nun se pudo coneutar con $1",
+ "externaldata-xml-error": "Error XML: $1 na llinia $2",
+ "externaldata-invalid-json": "Error: JSON inválidu",
+ "externaldata-db-incomplete-information": "Error: Información incompleta pa esta ID de sirvidor.",
+ "externaldata-db-could-not-get-url": "Nun se pudo recuperar la URL dempués de $1 {{PLURAL:$1|intentu|intentos}}.",
+ "externaldata-db-unknown-type": "Error: Triba de base de datos desconocida.",
+ "externaldata-db-could-not-connect": "Error: Nun se pudo coneutar cola base de datos.",
+ "externaldata-db-unknown-collection": "Fallu: Coleición MongoDB desconocida.",
+ "externaldata-db-no-return-values": "Error: Nun s'especificaron valores de retornu.",
+ "externaldata-db-invalid-query": "Consulta inválida."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/ba.json b/www/wiki/extensions/ExternalData/i18n/ba.json
new file mode 100644
index 00000000..c5fd28e0
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/ba.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Азат Хәлилов",
+ "Айбикә",
+ "Ләйсән"
+ ]
+ },
+ "getdata": "Мәғлүмәттәр алырға",
+ "externaldata-desc": "Тышҡы адрестарҙан, мәғлүмәттәр базаһынан һәм башҡа сығанаҡтарҙан структураға һалынған мәғлүмәттәр алырға ярҙам итә",
+ "externaldata-no-param-specified": "Хата: «$1» параметры күрһәтелмәгән.",
+ "externaldata-web-invalid-format": "Рөхсәт ителмәгән формат: \"$1\"",
+ "externaldata-ldap-unable-to-connect": " $1 тоташып булмай.",
+ "externaldata-xml-error": "XML хата. $1 $2 юлында",
+ "externaldata-invalid-json": "Хата: Рөхсәт ителмәгән JSON",
+ "externaldata-db-incomplete-information": "Хата: Был ID сервер өсөн мәғлүмәт тулы түгел.",
+ "externaldata-db-could-not-get-url": "$1 {{PLURAL:$1|мөмкинлектән}} һуң URL алып булманы.",
+ "externaldata-db-unknown-type": "ХАТА: Билдәһеҙ мәғлүмәт базаһы.",
+ "externaldata-db-could-not-connect": "ХАТА: Мәғлүмәт базаһы менән бәйләнеш булдырып булмай.",
+ "externaldata-db-unknown-collection": "Хата: Билдәһеҙ коллекция MongoDB.",
+ "externaldata-db-no-return-values": "Хата: Кире ҡайтара торған билдәләр күрһәтелмәгән",
+ "externaldata-db-invalid-query": "Хаталы һорау"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/be-tarask.json b/www/wiki/extensions/ExternalData/i18n/be-tarask.json
new file mode 100644
index 00000000..94add57a
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/be-tarask.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "EugeneZelenko",
+ "Jim-by",
+ "Wizardist",
+ "Red Winged Duck"
+ ]
+ },
+ "getdata": "Атрымаць зьвесткі",
+ "externaldata-desc": "Дазваляе атрымліваць структураваныя зьвесткі з вонкавых URL-адрасоў, базаў зьвестак і іншых крыніц",
+ "externaldata-no-param-specified": "Памылка: парамэтар «$1» ня вызначаны.",
+ "externaldata-web-invalid-format": "Няслушны фармат: «$1»",
+ "externaldata-ldap-unable-to-connect": "Немагчыма далучыцца да $1",
+ "externaldata-xml-error": "Памылка XML: $1 у радку $2",
+ "externaldata-invalid-json": "Памылка: няправільны JSON.",
+ "externaldata-db-incomplete-information": "Памылка: Няпоўная інфармацыя для гэтага ідэнтыфікатара сэрвэра.",
+ "externaldata-db-could-not-get-url": "Немагчыма атрымаць URL-адрас пасьля $1 {{PLURAL:$1|спробы|спробаў|спробаў}}.",
+ "externaldata-db-unknown-type": "Памылка: Невядомы тып базы зьвестак.",
+ "externaldata-db-could-not-connect": "Памылка: Немагчыма далучыцца да базы зьвестак.",
+ "externaldata-db-unknown-collection": "Памылка: невядомая калецыя MongoDB.",
+ "externaldata-db-no-return-values": "Памылка: Не пазначаныя выніковыя значэньні.",
+ "externaldata-db-invalid-query": "Няслушны запыт."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/br.json b/www/wiki/extensions/ExternalData/i18n/br.json
new file mode 100644
index 00000000..8835619a
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/br.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fohanno",
+ "Fulup",
+ "Y-M D"
+ ]
+ },
+ "getdata": "Tapout roadennoù",
+ "externaldata-desc": "Talvezout a ra da adtapout roadennoù frammet adalek URLoù diavaez, diazoù titouroù ha mammennoù all.",
+ "externaldata-no-param-specified": "Fazi : an arventenn \"$1\" n'eo ket bet diferet.",
+ "externaldata-web-invalid-format": "Furmad direizh : \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Ne c'haller ket kevreañ ouzh $1",
+ "externaldata-xml-error": "Fazi XML : $1 el linenn $2",
+ "externaldata-invalid-json": "Fazi : JSON direizh",
+ "externaldata-db-incomplete-information": "Fazi : Titouroù diglok evit an ID servijer-mañ.",
+ "externaldata-db-could-not-get-url": "Dibosupl eo tapout an URL goude $1 {{PLURAL:$1|taol-esae|taol-esae}}.",
+ "externaldata-db-unknown-type": "Fazi : Seurt diaz roadennoù dianav",
+ "externaldata-db-could-not-connect": "Fazi : Ne c'haller ket kevreañ ouzh an diaz roadennoù.",
+ "externaldata-db-no-return-values": "Fazi : N'eus bet resisaet talvoud distro ebet.",
+ "externaldata-db-invalid-query": "Reked direizh."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/bs.json b/www/wiki/extensions/ExternalData/i18n/bs.json
new file mode 100644
index 00000000..61bb9373
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/bs.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "CERminator"
+ ]
+ },
+ "getdata": "Uzmi podatke",
+ "externaldata-desc": "Omogućuje za preuzimanje strukturnih podataka iz vanjskih URLova, baza podataka i drugih izvora",
+ "externaldata-ldap-unable-to-connect": "Ne može se spojiti na $1",
+ "externaldata-xml-error": "XML greška: $1 na liniji $2",
+ "externaldata-db-incomplete-information": "Greška: Nepotpune informacije za ovaj ID servera.",
+ "externaldata-db-could-not-get-url": "Nije pronađen URL nakon $1 {{PLURAL:$1|pokušaja|pokušaja}}.",
+ "externaldata-db-unknown-type": "Greška: Nepoznat tip baze podataka.",
+ "externaldata-db-could-not-connect": "Greška: Ne može se spojiti na bazu podataka.",
+ "externaldata-db-no-return-values": "Greška: Nije navedena povratna vrijednost.",
+ "externaldata-db-invalid-query": "Nevaljan upit."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/ca.json b/www/wiki/extensions/ExternalData/i18n/ca.json
new file mode 100644
index 00000000..731e67ec
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/ca.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Paucabot",
+ "Solde"
+ ]
+ },
+ "getdata": "Obtenir dades",
+ "externaldata-xml-error": "Error XML: $1 a la línia $2",
+ "externaldata-db-unknown-type": "Error: Tipus de base de dades desconegut.",
+ "externaldata-db-could-not-connect": "Error: No s'ha pogut connectar a la base de dades.",
+ "externaldata-db-invalid-query": "Consulta no vàlida."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/cs.json b/www/wiki/extensions/ExternalData/i18n/cs.json
new file mode 100644
index 00000000..3b155ea8
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/cs.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jkjk",
+ "Matěj Grabovský",
+ "Mormegil",
+ "Reaperman",
+ "XenoPheX"
+ ]
+ },
+ "getdata": "Získat data",
+ "externaldata-desc": "Umožňuje získávání strukturovaných dat z externích webových stránek, databází a jiných zdrojů",
+ "externaldata-no-param-specified": "Chyba: Nebyl zadán parametr „$1“.",
+ "externaldata-web-invalid-format": "Neplatný formát: „$1“",
+ "externaldata-ldap-unable-to-connect": "Nepodařilo se spojit s $1",
+ "externaldata-xml-error": "Chyba XML: $1 na řádku $2",
+ "externaldata-invalid-json": "Chyba: Neplatný JSON.",
+ "externaldata-db-incomplete-information": "Chyba: Nekompletní informace pro toto ID databáze.",
+ "externaldata-db-could-not-get-url": "Nepodařilo se získat URL po $1 {{PLURAL:$1|pokusu|pokusech}}.",
+ "externaldata-db-unknown-type": "Chyba: Neznámý typ databáze.",
+ "externaldata-db-could-not-connect": "Chyba: Nepodařilo se připojit k databázi.",
+ "externaldata-db-unknown-collection": "Chyba: Neznámá kolekce MongoDB.",
+ "externaldata-db-no-return-values": "Chyba: Nebyly zadány návratové hodnoty.",
+ "externaldata-db-invalid-query": "Neplatný požadavek."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/cy.json b/www/wiki/extensions/ExternalData/i18n/cy.json
new file mode 100644
index 00000000..b7167b98
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/cy.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lloffiwr"
+ ]
+ },
+ "getdata": "Nôl y data",
+ "externaldata-desc": "Yn galluogi nôl data strwythuredig o ffynnonellau allanol megis URLs a chronfeydd data",
+ "externaldata-no-param-specified": "Gwall: Ni phenwyd y paramedr \"$1\".",
+ "externaldata-web-invalid-format": "Fformat annilys: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Ni lwyddwyd i gysylltu â $1",
+ "externaldata-xml-error": "Gwall XML: $1 yn y llinell $2",
+ "externaldata-invalid-json": "Gwall: JSON annilys.",
+ "externaldata-db-incomplete-information": "Gwall: Gwybodaeth anghyflawn i ID y gronfa ddata.",
+ "externaldata-db-could-not-get-url": "Ni chafwyd hyd i'r URL o geisio {{PLURAL:$1||unwaith|dwywaith|teirgwaith|$1 gwaith}}.",
+ "externaldata-db-unknown-type": "Gwall: Math anhysbys i'r gronfa ddata.",
+ "externaldata-db-could-not-connect": "Gwall: Ni lwyddwyd i gysylltu â'r gronfa ddata.",
+ "externaldata-db-unknown-collection": "Gwall: Casgliad MongoDB anhysbys.",
+ "externaldata-db-no-return-values": "Gwall: Ni phenwyd unrhyw werthoedd i'w nôl.",
+ "externaldata-db-invalid-query": "Gofyniad annilys."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/da.json b/www/wiki/extensions/ExternalData/i18n/da.json
new file mode 100644
index 00000000..5f08159c
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/da.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Tjernobyl",
+ "Saederup92"
+ ]
+ },
+ "externaldata-invalid-json": "Fejl: Ugyldigt JSON.",
+ "externaldata-db-invalid-query": "Ugyldig forespørgsel."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/de.json b/www/wiki/extensions/ExternalData/i18n/de.json
new file mode 100644
index 00000000..a15fd009
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/de.json
@@ -0,0 +1,27 @@
+{
+ "@metadata": {
+ "authors": [
+ "Imre",
+ "Kghbln",
+ "MF-Warburg",
+ "Merlissimo",
+ "Metalhead64",
+ "Purodha",
+ "Umherirrender"
+ ]
+ },
+ "getdata": "Daten holen",
+ "externaldata-desc": "Ermöglicht das Abrufen strukturierter Daten von externen URLs, Datenbanken und anderen Quellen",
+ "externaldata-no-param-specified": "Fehler: Kein Parameter „$1“ angegeben.",
+ "externaldata-web-invalid-format": "Ungültiges Format: „$1“",
+ "externaldata-ldap-unable-to-connect": "Es konnte keine Verbindung zu $1 hergestellt werden",
+ "externaldata-xml-error": "XML-Fehler: $1 in Zeile $2",
+ "externaldata-invalid-json": "Fehler: Ungültiges JSON",
+ "externaldata-db-incomplete-information": "Fehler: Es liegen nur unvollständige Informationen für diese Serverkennung vor.",
+ "externaldata-db-could-not-get-url": "Die URL konnte mit {{PLURAL:$1|einem Versuch|$1 Versuchen}} nicht abgerufen werden.",
+ "externaldata-db-unknown-type": "Fehler: Es handelt sich um einen unbekannten Datenbanktyp.",
+ "externaldata-db-could-not-connect": "Fehler: Es konnte keine Verbindung zur Datenbank hergestellt werden.",
+ "externaldata-db-unknown-collection": "Fehler: Unbekannte MongoDB-Sammlung",
+ "externaldata-db-no-return-values": "Fehler: Es wurden keine Rückgabewerte festgelegt.",
+ "externaldata-db-invalid-query": "Ungültige Abfrage."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/dsb.json b/www/wiki/extensions/ExternalData/i18n/dsb.json
new file mode 100644
index 00000000..a72319d9
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/dsb.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michawiki"
+ ]
+ },
+ "getdata": "Daty wobstaraś",
+ "externaldata-desc": "Zmóžnja wótwołowanje strukturěrowanych datow z eksternych URL, datowych bankow a drugich žrědłow",
+ "externaldata-web-invalid-format": "Njepłaśiwy format: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Njemóžno z $1 zwězaś",
+ "externaldata-xml-error": "Zmólka XML: $1 na smužce $2",
+ "externaldata-db-incomplete-information": "'''Zmólka: Njedopołne informacije za toś ten serwerowy ID.'''",
+ "externaldata-db-could-not-get-url": "Njemóžno URL pó $1 {{PLURAL:$1|wopyśe|wopytoma|wopytach|wopytach}} dostaś.",
+ "externaldata-db-unknown-type": "'''Zmólka: Njeznata datowa banka.'''",
+ "externaldata-db-could-not-connect": "'''Zmólka: Njemóžno z datoweju banku zwězaś.'''",
+ "externaldata-db-no-return-values": "'''Zmólka: Žedne gódnoty slědkdaśa pódane.'''",
+ "externaldata-db-invalid-query": "Njepłaśiwe napšašowanje."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/el.json b/www/wiki/extensions/ExternalData/i18n/el.json
new file mode 100644
index 00000000..b18947dc
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/el.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dead3y3",
+ "Glavkos",
+ "Omnipaedista",
+ "Protnet",
+ "ZaDiak"
+ ]
+ },
+ "getdata": "Λήψη δεδομένων",
+ "externaldata-desc": "Επιτρέπει την ανάκτηση δομημένων δεδομένων από εξωτερικά URL, βάσεις δεδομένων και άλλες πηγές",
+ "externaldata-no-param-specified": "Σφάλμα: Δεν καθορίστηκε παράμετρος «$1».",
+ "externaldata-web-invalid-format": "Μη έγκυρη μορφή: «$1».",
+ "externaldata-ldap-unable-to-connect": "Δεν είναι δυνατή η σύνδεση με $1.",
+ "externaldata-xml-error": "Σφάλμα XML: $1 στη γραμμή $2",
+ "externaldata-invalid-json": "Σφάλμα: Μη έγκυρο JSON.",
+ "externaldata-db-incomplete-information": "Σφάλμα: Ελλιπείς πληροφορίες για αυτό το αναγνωριστικό βάσης δεδομένων.",
+ "externaldata-db-could-not-get-url": "Δεν ήταν δυνατή η λήψη του URL μετά από $1 {{PLURAL:$1|προσπάθεια|προσπάθειες}}.",
+ "externaldata-db-unknown-type": "Σφάλμα: Άγνωστος τύπος βάσης δεδομένων.",
+ "externaldata-db-could-not-connect": "Σφάλμα: Αδυναμία σύνδεσης στη βάση δεδομένων.",
+ "externaldata-db-unknown-collection": "Σφάλα: Άγνωστη συλλογή MongoDB.",
+ "externaldata-db-no-return-values": "Σφάλμα: Δεν καθορίστηκαν τιμές επιστροφής.",
+ "externaldata-db-invalid-query": "Μη έγκυρο ερώτημα."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/en.json b/www/wiki/extensions/ExternalData/i18n/en.json
new file mode 100644
index 00000000..081c7f0e
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/en.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Yaron Koren"
+ ]
+ },
+ "getdata": "Get data",
+ "externaldata-desc": "Allows for retrieving structured data from external URLs, databases and other sources",
+ "externaldata-no-param-specified": "Error: No \"$1\" parameter specified.",
+ "externaldata-web-invalid-format": "Invalid format: \"$1\".",
+ "externaldata-ldap-unable-to-connect": "Unable to connect to $1.",
+ "externaldata-xml-error": "XML error: $1 at line $2.",
+ "externaldata-invalid-json": "Error: Invalid JSON.",
+ "externaldata-db-incomplete-information": "Error: Incomplete information for this database ID.",
+ "externaldata-db-could-not-get-url": "Could not get URL after $1 {{PLURAL:$1|try|tries}}.",
+ "externaldata-db-unknown-type": "Error: Unknown database type.",
+ "externaldata-db-could-not-connect": "Error: Could not connect to database.",
+ "externaldata-db-unknown-collection": "Error: Unknown MongoDB collection.",
+ "externaldata-db-no-return-values": "Error: No return values specified.",
+ "externaldata-db-invalid-query": "Invalid query."
+} \ No newline at end of file
diff --git a/www/wiki/extensions/ExternalData/i18n/eo.json b/www/wiki/extensions/ExternalData/i18n/eo.json
new file mode 100644
index 00000000..14df5915
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/eo.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Yekrats"
+ ]
+ },
+ "externaldata-db-invalid-query": "Malvalida serĉomendo."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/es.json b/www/wiki/extensions/ExternalData/i18n/es.json
new file mode 100644
index 00000000..f150efc1
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/es.json
@@ -0,0 +1,28 @@
+{
+ "@metadata": {
+ "authors": [
+ "Armando-Martin",
+ "Crazymadlover",
+ "Fitoschido",
+ "Imre",
+ "Manuelt15",
+ "Sanbec",
+ "Translationista",
+ "Indiralena"
+ ]
+ },
+ "getdata": "Obtener datos",
+ "externaldata-desc": "Permite la recuperación de datos estructurados a partir de direcciones URL externas, bases de datos y otras fuentes",
+ "externaldata-no-param-specified": "Error: No se ha especificado el parámetro «$1».",
+ "externaldata-web-invalid-format": "El formato «$1» no es válido.",
+ "externaldata-ldap-unable-to-connect": "No se pudo conectar con $1",
+ "externaldata-xml-error": "Error XML: $1 en línea $2",
+ "externaldata-invalid-json": "Error: JSON no válido",
+ "externaldata-db-incomplete-information": "Error: Información incompleta para este ID de servidor.",
+ "externaldata-db-could-not-get-url": "No se pudo obtener la URL después de $1 {{PLURAL:$1|intento|intentos}}.",
+ "externaldata-db-unknown-type": "Error: Tipo de base de datos desconocido.",
+ "externaldata-db-could-not-connect": "Error: No se pudo lograr conexión con la base de datos.",
+ "externaldata-db-unknown-collection": "Error: colección de MongoDB desconocida.",
+ "externaldata-db-no-return-values": "Error: No se ha especificado valores de retorno.",
+ "externaldata-db-invalid-query": "Consulta no válida."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/et.json b/www/wiki/extensions/ExternalData/i18n/et.json
new file mode 100644
index 00000000..9e76879d
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/et.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Pikne"
+ ]
+ },
+ "externaldata-db-unknown-type": "Tõrge: Tundmatu andmebaasi tüüp.",
+ "externaldata-db-could-not-connect": "Tõrge: Andmebaasiga ei saa ühendust.",
+ "externaldata-db-invalid-query": "Vigane päring."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/eu.json b/www/wiki/extensions/ExternalData/i18n/eu.json
new file mode 100644
index 00000000..094369b6
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/eu.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Kobazulo"
+ ]
+ },
+ "getdata": "Datuak eskuratu"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/fa.json b/www/wiki/extensions/ExternalData/i18n/fa.json
new file mode 100644
index 00000000..b89b79b0
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/fa.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Armin1392",
+ "Mjbmr"
+ ]
+ },
+ "getdata": "دریافت اطلاعات",
+ "externaldata-desc": "اجازه برای بازیابی اطلاعات ساخته شده از یوآرال‌های خارجی، پایگاه‌های اطلاعاتی و دیگر منابع",
+ "externaldata-no-param-specified": "خطا: هیچ پارامتر \"$1\" تعیین نشده‌است.",
+ "externaldata-web-invalid-format": "فرمت نامعتبر: \"$1\".",
+ "externaldata-ldap-unable-to-connect": "قادر نبودن اتصال به $1",
+ "externaldata-xml-error": "خطای ایکس‌ام‌ال: $1 در خط $2",
+ "externaldata-invalid-json": "خطا: جی‌سون نامعتبر.",
+ "externaldata-db-incomplete-information": "خطا: اطلاعات ناقص برای شناسهٔ این پایگاه اطلاعاتی.",
+ "externaldata-db-could-not-get-url": "پس از $1 {{PLURAL:$1|try|tries}}، یوآرال نتوانست دریافت شود.",
+ "externaldata-db-unknown-type": "خطا: نوع پایگاه اطلاعاتی ناشناخته.",
+ "externaldata-db-could-not-connect": "خطا: نتوانست به پایگاه اطلاعاتی متصل شود.",
+ "externaldata-db-unknown-collection": "خطا: مجموعهٔ مونگودی‌بی ناشناخته.",
+ "externaldata-db-no-return-values": "خطا: بدون بازگشت ارزش‌های تعیین شده.",
+ "externaldata-db-invalid-query": "سوال نامعتبر."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/fi.json b/www/wiki/extensions/ExternalData/i18n/fi.json
new file mode 100644
index 00000000..ca77dcb6
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/fi.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Centerlink",
+ "Crt",
+ "Nedergard",
+ "Silvonen",
+ "Str4nd"
+ ]
+ },
+ "getdata": "Hae data",
+ "externaldata-desc": "Mahdollistaa muotoillun datan noutamisen ulkoisista verkko-osoitteista, tietokannoista ja muista lähteistä.",
+ "externaldata-web-invalid-format": "Virheellinen muoto: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Ei voitu yhdistää palvelimelle $1",
+ "externaldata-xml-error": "XML-virhe: $1 rivillä $2",
+ "externaldata-db-incomplete-information": "Virhe: Vaillinaiset tiedot tälle palvelintunnukselle.",
+ "externaldata-db-could-not-get-url": "Ei voitu hakea verkko-osoitetta $1 {{PLURAL:$1|yrityksen|yrityksen}} jälkeen.",
+ "externaldata-db-unknown-type": "Virhe: Tuntematon tietokantatyyppi.",
+ "externaldata-db-could-not-connect": "Virhe: Ei yhteyttä tietokantaan.",
+ "externaldata-db-unknown-collection": "Virhe: Tuntematon MongoDB-kokoelma.",
+ "externaldata-db-no-return-values": "Virhe: Paluuarvoja ei ole annettu.",
+ "externaldata-db-invalid-query": "Virheellinen kysely."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/fr.json b/www/wiki/extensions/ExternalData/i18n/fr.json
new file mode 100644
index 00000000..552b612f
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/fr.json
@@ -0,0 +1,26 @@
+{
+ "@metadata": {
+ "authors": [
+ "Crochet.david",
+ "Gomoko",
+ "IAlex",
+ "McDutchie",
+ "PieRRoMaN",
+ "Shirayuki"
+ ]
+ },
+ "getdata": "Obtenir des données",
+ "externaldata-desc": "Permet de récupérer des données structurées à partir d'URL externes, de bases de données et d'autres sources",
+ "externaldata-no-param-specified": "Erreur : Aucun paramètre « $1 » spécifié.",
+ "externaldata-web-invalid-format": "Format invalide: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Impossible de se connecter à $1",
+ "externaldata-xml-error": "Erreur XML : $1 à la ligne $2",
+ "externaldata-invalid-json": "Erreur : JSON non valide",
+ "externaldata-db-incomplete-information": "Erreur : Informations incomplètes pour cet identifiant de serveur.",
+ "externaldata-db-could-not-get-url": "Impossible d'obtenir l'URL après $1 {{PLURAL:$1|essais}}.",
+ "externaldata-db-unknown-type": "ERREUR: Type de base de données inconnu.",
+ "externaldata-db-could-not-connect": "Erreur : Impossible de se connecter à la base de données.",
+ "externaldata-db-unknown-collection": "Erreur: Collection MongoDB inconnue.",
+ "externaldata-db-no-return-values": "Erreur : Aucune valeur de retour n'a été spécifiée.",
+ "externaldata-db-invalid-query": "Requête invalide."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/frp.json b/www/wiki/extensions/ExternalData/i18n/frp.json
new file mode 100644
index 00000000..cf3b5aaf
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/frp.json
@@ -0,0 +1,16 @@
+{
+ "@metadata": {
+ "authors": [
+ "ChrisPtDe"
+ ]
+ },
+ "getdata": "Avêr des balyês",
+ "externaldata-web-invalid-format": "Format envalido : « $1 »",
+ "externaldata-ldap-unable-to-connect": "Empossiblo de sè branchiér a $1",
+ "externaldata-xml-error": "Èrror XML : $1 a la legne $2",
+ "externaldata-db-could-not-get-url": "Empossiblo d’avêr l’URL aprés $1 tentativ{{PLURAL:$1|a|es}}.",
+ "externaldata-db-unknown-type": "Èrror : tipo de bâsa de balyês encognu.",
+ "externaldata-db-could-not-connect": "Èrror : empossiblo de sè branchiér a la bâsa de balyês.",
+ "externaldata-db-no-return-values": "Èrror : niona valor de retôrn at étâ spècefiâ.",
+ "externaldata-db-invalid-query": "Requéta envalida."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/gl.json b/www/wiki/extensions/ExternalData/i18n/gl.json
new file mode 100644
index 00000000..cfabd336
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/gl.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Toliño"
+ ]
+ },
+ "getdata": "Obter os datos",
+ "externaldata-desc": "Permite a recuperación de datos estruturados a partir de enderezos URL externos, bases de datos e outras fontes",
+ "externaldata-no-param-specified": "Erro: Non se especificou ningún parámetro \"$1\".",
+ "externaldata-web-invalid-format": "Formato incorrecto: \"$1\".",
+ "externaldata-ldap-unable-to-connect": "Non se pode conectar con $1.",
+ "externaldata-xml-error": "Erro XML: $1 na liña $2.",
+ "externaldata-invalid-json": "Erro: JSON non válido.",
+ "externaldata-db-incomplete-information": "Erro: Información incompleta para este ID de servidor.",
+ "externaldata-db-could-not-get-url": "Non se puido obter o enderezo URL despois de $1 {{PLURAL:$1|intento|intentos}}.",
+ "externaldata-db-unknown-type": "Erro: Tipo de base de datos descoñecido.",
+ "externaldata-db-could-not-connect": "Erro: Non se puido conectar coa base de datos.",
+ "externaldata-db-unknown-collection": "Erro: Colección MongoDB descoñecida.",
+ "externaldata-db-no-return-values": "Erro: Non se especificou ningún valor de retorno.",
+ "externaldata-db-invalid-query": "A consulta non é válida."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/gsw.json b/www/wiki/extensions/ExternalData/i18n/gsw.json
new file mode 100644
index 00000000..66f7cc1a
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/gsw.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "Als-Chlämens",
+ "Als-Holder"
+ ]
+ },
+ "getdata": "Date hole",
+ "externaldata-desc": "Erlaubt strukturierti Daten abzruefe vu extärne URL un andre Quälle",
+ "externaldata-web-invalid-format": "Ungültigs Format: „$1“",
+ "externaldata-ldap-unable-to-connect": "Cha kei Verbindig härstellen zue $1",
+ "externaldata-xml-error": "XML-Fähler: $1 in dr Zyyle $2",
+ "externaldata-db-incomplete-information": "Fähler: Nit vollständigi Information fir die Server-ID.",
+ "externaldata-db-could-not-get-url": "Cha d URL nit finde no $1 {{PLURAL:$1|Versuech|Versuech}}.",
+ "externaldata-db-unknown-type": "Fähler: Nit bekannte Datebanktyp.",
+ "externaldata-db-could-not-connect": "Fähler: Cha kei Verbindig härstelle zue dr Datebank.",
+ "externaldata-db-no-return-values": "Fähler: Kei Ruckgabewärt spezifiziert.",
+ "externaldata-db-invalid-query": "Nit giltigi Umfrog."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/gu.json b/www/wiki/extensions/ExternalData/i18n/gu.json
new file mode 100644
index 00000000..20c6124d
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/gu.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ashok modhvadia",
+ "KartikMistry"
+ ]
+ },
+ "getdata": "માહિતી પ્રાપ્ત કરો",
+ "externaldata-desc": "બાહ્ય કડીઓ, ડેટાબેઝ અને અન્ય સ્રોતોમાંથી માહિતીની પુન:પ્રાપ્તિની છુટ",
+ "externaldata-invalid-json": "ક્ષતિ: અયોગ્ય JSON"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/he.json b/www/wiki/extensions/ExternalData/i18n/he.json
new file mode 100644
index 00000000..3c4b85fb
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/he.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Amire80",
+ "Rotemliss",
+ "YaronSh",
+ "Yona b"
+ ]
+ },
+ "getdata": "קבלת נתונים",
+ "externaldata-desc": "אפשרות לקבלת נתונים במבנים מכתובות חיצוניות, מסדי נתונים ומקורות אחרים",
+ "externaldata-no-param-specified": "שגיאה: נבחר פרמטר \"$1\" מסוים.",
+ "externaldata-web-invalid-format": "תסדיר בלתי־תקין: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "לא ניתן להתחבר ל־$1",
+ "externaldata-xml-error": "שגיאת XML: $1 בשורה $2",
+ "externaldata-invalid-json": "שגיאה: JSON בלתי־תקין",
+ "externaldata-db-incomplete-information": "שגיאה: יש רק מידע חלקי על מספר השרת הזה.",
+ "externaldata-db-could-not-get-url": "לא ניתן לקבל את כתובת ה־URL לאחר {{PLURAL:$1|נסיון אחד|$1 נסיונות}}.",
+ "externaldata-db-unknown-type": "שגיאה: סוג מסד הנתונים אינו מוכר.",
+ "externaldata-db-could-not-connect": "שגיאה: לא ניתן להתחבר אל מסד הנתונים.",
+ "externaldata-db-unknown-collection": "שגיאה: אוסף MongoDB לא ידוע.",
+ "externaldata-db-no-return-values": "שגיאה: לא הוגדרו ערכים להחזרה.",
+ "externaldata-db-invalid-query": "שאילתה בלתי תקינה."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/hsb.json b/www/wiki/extensions/ExternalData/i18n/hsb.json
new file mode 100644
index 00000000..9e181cb2
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/hsb.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michawiki"
+ ]
+ },
+ "getdata": "Daty wobstarać",
+ "externaldata-desc": "Zmóžnja wotwołowanje strukturowanych datow z eksternych URL, datowych bankow a druhich žórłow",
+ "externaldata-no-param-specified": "Zmylk: Žadyn parameter \"$1\" podaty.",
+ "externaldata-web-invalid-format": "Njepłaćiwy format: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Njemóžno z $1 zwjazać",
+ "externaldata-xml-error": "Zmylk XML: $1 na lince $2",
+ "externaldata-invalid-json": "Zmylk: Njepłaćiwy JSON.",
+ "externaldata-db-incomplete-information": "'''Zmylk: Njedospołne informacije za ID tutoho serwera.'''",
+ "externaldata-db-could-not-get-url": "Njebě móžno URL po $1 {{PLURAL:$1|pospyće|pospytomaj|pospytach|pospytach}} dóstać.",
+ "externaldata-db-unknown-type": "'''Zmylk: Njeznaty typ datoweje banki.'''",
+ "externaldata-db-could-not-connect": "'''Zmylk: Njemóžno z datowej banku zwjazać.'''",
+ "externaldata-db-unknown-collection": "Zmylk: Njeznata MongoDB-zběrka.",
+ "externaldata-db-no-return-values": "'''Zmylk: Žane hódnoty wróćenja podate.'''",
+ "externaldata-db-invalid-query": "Njepłaćiwe naprašowanje."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/hu.json b/www/wiki/extensions/ExternalData/i18n/hu.json
new file mode 100644
index 00000000..7cf3e08f
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/hu.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dj",
+ "Glanthor Reviol"
+ ]
+ },
+ "getdata": "Adatok lekérése",
+ "externaldata-desc": "Strukturált adatok lekérése külső URL-ekről, adatbázisokból vagy más forrásokból",
+ "externaldata-web-invalid-format": "Érvénytelen formátum: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Sikertelen csatlakozás a következőhöz: $1",
+ "externaldata-xml-error": "$1 XML hiba, $2. sor",
+ "externaldata-db-incomplete-information": "Hiba: hiányos információ a szerver azonosítóhoz.",
+ "externaldata-db-could-not-get-url": "Nem sikerült lekérni az URL-t {{PLURAL:$1|egy|$1}} próbálkozás alatt.",
+ "externaldata-db-unknown-type": "Hiba: ismeretlen adatbázis típus.",
+ "externaldata-db-could-not-connect": "Hiba: nem sikerült csatlakozni az adatbázishoz.",
+ "externaldata-db-no-return-values": "Hiba: nem lettek megadva visszatérési értékek.",
+ "externaldata-db-invalid-query": "Érvénytelen lekérdezés."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/hy.json b/www/wiki/extensions/ExternalData/i18n/hy.json
new file mode 100644
index 00000000..60689141
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/hy.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "M hamlet"
+ ]
+ },
+ "externaldata-invalid-json": "Սխալ․ Թերի JSON"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/ia.json b/www/wiki/extensions/ExternalData/i18n/ia.json
new file mode 100644
index 00000000..74552c5f
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/ia.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "McDutchie"
+ ]
+ },
+ "getdata": "Obtener datos",
+ "externaldata-desc": "Permitte recuperar datos structurate ab adresses URL, bases de datos e altere fontes externe",
+ "externaldata-no-param-specified": "Error: Nulle parametro \"$1\" specificate.",
+ "externaldata-web-invalid-format": "Formato invalide: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Impossibile connecter se a $1",
+ "externaldata-xml-error": "Error de XML: $1 al linea $2",
+ "externaldata-invalid-json": "Error: JSON invalide.",
+ "externaldata-db-incomplete-information": "Error: Information incomplete pro iste ID de servitor.",
+ "externaldata-db-could-not-get-url": "Non poteva obtener le URL post $1 {{PLURAL:$1|tentativa|tentativas}}.",
+ "externaldata-db-unknown-type": "Error: Typo de base de datos incognite.",
+ "externaldata-db-could-not-connect": "Error: Impossibile connecter se al base de datos.",
+ "externaldata-db-unknown-collection": "Error: Collection MongoDB incognite.",
+ "externaldata-db-no-return-values": "Error: Nulle valor de retorno specificate.",
+ "externaldata-db-invalid-query": "Consulta invalide."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/id.json b/www/wiki/extensions/ExternalData/i18n/id.json
new file mode 100644
index 00000000..47eb05e9
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/id.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bennylin",
+ "Farras",
+ "IvanLanin",
+ "Iwan Novirion"
+ ]
+ },
+ "getdata": "Ambil data",
+ "externaldata-desc": "Memungkinkan untuk mengambil data terstruktur dari URL eksternal, database dan sumber lainnya",
+ "externaldata-web-invalid-format": "Format salah: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Tidak dapat terhubung ke $1",
+ "externaldata-xml-error": "Galat XML: $1 pada baris $2",
+ "externaldata-db-incomplete-information": "Galat: Informasi tak lengkap untuk ID server ini.",
+ "externaldata-db-could-not-get-url": "Tidak dapat mengambil URL setelah dicoba {{PLURAL:$1||}}$1 kali.",
+ "externaldata-db-unknown-type": "Galat: Jenis basis data tidak diketahui.",
+ "externaldata-db-could-not-connect": "Galat: Tidak dapat terhubung ke basis data.",
+ "externaldata-db-no-return-values": "Galat: Nilai pengembalian tidak dispesifikasi.",
+ "externaldata-db-invalid-query": "Kueri tidak sah."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/ilo.json b/www/wiki/extensions/ExternalData/i18n/ilo.json
new file mode 100644
index 00000000..04ea47d0
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/ilo.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Lam-ang"
+ ]
+ },
+ "getdata": "Agala ti datos",
+ "externaldata-desc": "Mangipalubos para iti panagala ti naestruktura a datos manipud kadagiti akin-ruar nga URL, dagiti database ken dagiti dadduma pay a taudan",
+ "externaldata-no-param-specified": "Biddut: Awan ti parametro ti \"$1\" a nainaganan.",
+ "externaldata-web-invalid-format": "Imbalido a pormat: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Di mabalin a maikonekta iti $1",
+ "externaldata-xml-error": "Biddut ti XML: $1 iti linia $2",
+ "externaldata-invalid-json": "Biddut: Imbalido a JSON.",
+ "externaldata-db-incomplete-information": "Biddut: Saan a kompleto a pakaammo para iti daytoy nga ID ti database.",
+ "externaldata-db-could-not-get-url": "Saan a makaala iti URL kalpasan ti $1 {{PLURAL:$1|panagipadas|panagipadpadas}}.",
+ "externaldata-db-unknown-type": "Biddut: Di ammo a kita ti database.",
+ "externaldata-db-could-not-connect": "Biddut: Saan a makaikonekta iti database.",
+ "externaldata-db-unknown-collection": "Biddut: Di ammo nga urnong ti MongoDB.",
+ "externaldata-db-no-return-values": "Biddut: Awan ti naisubli kadagiti pateg a nainaganan.",
+ "externaldata-db-invalid-query": "Imbalido a panagusisa."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/it.json b/www/wiki/extensions/ExternalData/i18n/it.json
new file mode 100644
index 00000000..3c5bcd24
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/it.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "Beta16",
+ "Pietrodn"
+ ]
+ },
+ "getdata": "Ottieni dati",
+ "externaldata-desc": "Consente di recuperare dati strutturati da URL esterni, database o altre sorgenti",
+ "externaldata-no-param-specified": "Errore: nessun parametro \"$1\" specificato.",
+ "externaldata-web-invalid-format": "Formato non valido: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Impossibile connettersi a $1",
+ "externaldata-xml-error": "Errore XML: $1 alla linea $2",
+ "externaldata-invalid-json": "Errore: JSON non valido",
+ "externaldata-db-incomplete-information": "Errore: informazioni incomplete per questo server ID.",
+ "externaldata-db-could-not-get-url": "Impossibile raggiungere l'URL dopo $1 {{PLURAL:$1|tentativo|tentativi}}.",
+ "externaldata-db-unknown-type": "Errore: tipo di database sconosciuto.",
+ "externaldata-db-could-not-connect": "Errore: impossibile connettersi al database.",
+ "externaldata-db-unknown-collection": "Errore: collezione MongoDB sconosciuta.",
+ "externaldata-db-no-return-values": "Errore: non è stato specificato alcun valore di ritorno.",
+ "externaldata-db-invalid-query": "Query non valida."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/ja.json b/www/wiki/extensions/ExternalData/i18n/ja.json
new file mode 100644
index 00000000..ab29011a
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/ja.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Fryed-peach",
+ "Schu",
+ "Shirayuki",
+ "青子守歌"
+ ]
+ },
+ "getdata": "データ取得",
+ "externaldata-desc": "外部 URL やデータベース、その他のソースからデータを取得できるようにする",
+ "externaldata-no-param-specified": "エラー: パラメーター「$1」が指定されていません。",
+ "externaldata-web-invalid-format": "無効な書式:「$1」",
+ "externaldata-ldap-unable-to-connect": "$1 に接続できません。",
+ "externaldata-xml-error": "XML エラー: 行 $2 で $1",
+ "externaldata-invalid-json": "エラー: 無効な JSON です。",
+ "externaldata-db-incomplete-information": "エラー: このデータベース ID に対する情報が不十分です。",
+ "externaldata-db-could-not-get-url": "$1 回試行しましたが URL を取得できませんでした。",
+ "externaldata-db-unknown-type": "エラー: データベースの種類が不明です。",
+ "externaldata-db-could-not-connect": "エラー: データベースに接続できませんでした。",
+ "externaldata-db-unknown-collection": "エラー: 不明な MongoDB コレクションです。",
+ "externaldata-db-no-return-values": "エラー: 戻り値が指定されていません。",
+ "externaldata-db-invalid-query": "無効なクエリです。"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/ka.json b/www/wiki/extensions/ExternalData/i18n/ka.json
new file mode 100644
index 00000000..4ad6b1b7
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/ka.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "David1010"
+ ]
+ },
+ "externaldata-db-invalid-query": "არასწორი მოთხონა."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/km.json b/www/wiki/extensions/ExternalData/i18n/km.json
new file mode 100644
index 00000000..cdeabe25
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/km.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "វ័ណថារិទ្ធ"
+ ]
+ },
+ "getdata": "យក​ទិន្នន័យ"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/kn.json b/www/wiki/extensions/ExternalData/i18n/kn.json
new file mode 100644
index 00000000..449a4f3a
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/kn.json
@@ -0,0 +1,15 @@
+{
+ "@metadata": {
+ "authors": [
+ "VASANTH S.N."
+ ]
+ },
+ "getdata": "ಮಾಹಿತಿಯನ್ನು ಪಡೆ",
+ "externaldata-web-invalid-format": "ಅಸಿಂಧು ವಿನ್ಯಾಸ: \"$1\".",
+ "externaldata-ldap-unable-to-connect": "$1.ಗೆ ಸಂಪರ್ಕಿಸಲು ಸಾದ್ಯವಾಗುತ್ತಿಲ್ಲ",
+ "externaldata-invalid-json": "ದೋಷ:ಅಸಮರ್ಪಕ JSON.",
+ "externaldata-db-incomplete-information": "ದೋಷ:ದತ್ತಾಂಶ ಐಡಿ ಬಗ್ಗೆ ಅಸಂಪೂರ್ಣ ಮಾಹಿತಿ.",
+ "externaldata-db-unknown-type": "ದೋಷ:ಆಜ್ಞಾತ ದತ್ತಸಂಚಯ ಮಾದರಿ.",
+ "externaldata-db-could-not-connect": "ದೋಷ:ದತ್ತಸಂಚಯವನ್ನು ಸಂಪರ್ಕಿಸಲು ಸಾದ್ಯವಾಗುತ್ತಿಲ್ಲ.",
+ "externaldata-db-invalid-query": "ಅಸಿಂಧು ಪ್ರಶ್ನೆ."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/ko.json b/www/wiki/extensions/ExternalData/i18n/ko.json
new file mode 100644
index 00000000..d4b71ca7
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/ko.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Daisy2002",
+ "Priviet",
+ "Yjs5497",
+ "아라"
+ ]
+ },
+ "getdata": "데이터 가져오기",
+ "externaldata-desc": "외부 URL, 데이터베이스 및 다른 출처에서 구조화된 데이터를 가져올 수 있게 하기",
+ "externaldata-no-param-specified": "오류: 지정된 \"$1\" 변수가 없습니다.",
+ "externaldata-web-invalid-format": "\"$1\" 상태가 잘못되었습니다.",
+ "externaldata-ldap-unable-to-connect": "$1에 연결할 수 없습니다.",
+ "externaldata-xml-error": "XML 오류: $2 줄에서 $1 오류 발생.",
+ "externaldata-invalid-json": "오류: 잘못된 JSON입니다.",
+ "externaldata-db-incomplete-information": "오류: 데이터베이스 ID 정보가 충분하지 않습니다.",
+ "externaldata-db-could-not-get-url": "$1 {{PLURAL:$1|번의 시도}}에도 URL을 가져올 수 없었습니다.",
+ "externaldata-db-unknown-type": "오류: 알 수 없는 데이터베이스 형식입니다.",
+ "externaldata-db-could-not-connect": "오류: 데이터베이스에 연결할 수 없습니다.",
+ "externaldata-db-unknown-collection": "오류: 알 수 없는 MongoDB 집합입니다.",
+ "externaldata-db-no-return-values": "오류: 지정된 반환 값이 없습니다.",
+ "externaldata-db-invalid-query": "유효하지 않은 쿼리"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/ksh.json b/www/wiki/extensions/ExternalData/i18n/ksh.json
new file mode 100644
index 00000000..9c121056
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/ksh.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Purodha"
+ ]
+ },
+ "getdata": "Daate holle!",
+ "externaldata-desc": "Määt et müjjelich, Date en beshtemmpte Fomaate fun främbde <i lang=\"en\">URLs</i>, Daatebangke, un ander Quälle ze holle.",
+ "externaldata-no-param-specified": "Fähler: Dä Parramehter „$1“ es nit aanjejovve.",
+ "externaldata-web-invalid-format": "Dat Formaat es onjöltsch: „$1“",
+ "externaldata-ldap-unable-to-connect": "Kann nit noh $1 verbenge",
+ "externaldata-xml-error": "Fähler em XML, op Reih $2: $1",
+ "externaldata-invalid-json": "Fähler: Onjöltesch <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"JavaScript Object Notation\">JSON</i>.",
+ "externaldata-db-incomplete-information": "<span style=\"text-transform: uppercase\">Fähler:</span> De Enfomazjuhne vör di ẞööver-Kännong sin nit kumplätt.",
+ "externaldata-db-could-not-get-url": "Kunnt {{PLURAL:$1|noh eimohl Versöhke|och noh $1 Mohl Versöhke|ohne enne Versöhk}} nix vun däm <i lang=\"en\">URL</i> krijje.",
+ "externaldata-db-unknown-type": "<span style=\"text-transform: uppercase\">Fähler:</span> Di Zoot Datebangk es unbikannt.",
+ "externaldata-db-could-not-connect": "<span style=\"text-transform: uppercase\">Fähler:</span> Kunnt kein Verbendung noh dä Datebangk krijje.",
+ "externaldata-db-unknown-collection": "<span style=\"text-transform: uppercase\">Fähler:</span> Dat es en onbikannte <i lang\"en\">MongoDB</i>-Zosammeschtällong.",
+ "externaldata-db-no-return-values": "<span style=\"text-transform: uppercase\">Fähler:</span> Kein Wääte för Zerökzeävve aanjejovve.",
+ "externaldata-db-invalid-query": "Onjöltesch Frooch aan de Datebangk."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/lb.json b/www/wiki/extensions/ExternalData/i18n/lb.json
new file mode 100644
index 00000000..a1bcc76c
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/lb.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Robby"
+ ]
+ },
+ "getdata": "Donnéeë kréien",
+ "externaldata-desc": "Erlaabt et Donnéeën vun externen URLen, Datebanken an anere Quellen ze verschaffen",
+ "externaldata-no-param-specified": "Feeler: Keen \"$1\"-Parameter spezifizéiert.",
+ "externaldata-web-invalid-format": "Net valabele Format: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Onméiglech sech op $1 ze connectéieren",
+ "externaldata-xml-error": "XML Feeler: $1 an der Linn $2",
+ "externaldata-invalid-json": "Feeler:JSON net valabel.",
+ "externaldata-db-incomplete-information": "Feeler: Informatioun fir dës Server ID net komplett.",
+ "externaldata-db-could-not-get-url": "D'URL konnt no {{PLURAL:$1|enger Kéier|$1 Versich}} net opgemaach ginn.",
+ "externaldata-db-unknown-type": "Feeler: Onbekannten Datebank-Typ.",
+ "externaldata-db-could-not-connect": "Feeler: D'Verbindung mat der Datebank konnt net opgebaut ginn.",
+ "externaldata-db-unknown-collection": "Feeler:Onbekannte MongoDB Sammlung.",
+ "externaldata-db-no-return-values": "Feeler: Kee Retour-Wäert festgeluecht.",
+ "externaldata-db-invalid-query": "Net valabel Ufro."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/lt.json b/www/wiki/extensions/ExternalData/i18n/lt.json
new file mode 100644
index 00000000..913db87c
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/lt.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "Eitvys200"
+ ]
+ },
+ "getdata": "Gauti duomenys",
+ "externaldata-no-param-specified": "Klaida\" Nenurodytas joks „$1“ parametras.",
+ "externaldata-web-invalid-format": "Negalimas formatas: „$1“.",
+ "externaldata-ldap-unable-to-connect": "Negalima prisijungti prie $1.",
+ "externaldata-xml-error": "XML klaida: $1, eilutėje $2.",
+ "externaldata-invalid-json": "Klaida: Negalimas JSON.",
+ "externaldata-db-could-not-get-url": "Nepavyko gauti URL po $1 {{PLURAL:$1|bandymo|bandymų}}.",
+ "externaldata-db-unknown-type": "Klaida: Nežinomas duomenų bazės tipas.",
+ "externaldata-db-could-not-connect": "Klaida: Nepavyko prisijungti prie duomenų bazės.",
+ "externaldata-db-unknown-collection": "Klaida: Nežinoma MongoDB kolekcija.",
+ "externaldata-db-no-return-values": "Klaida: Nenurodytos jokios gražinimo reikšmės.",
+ "externaldata-db-invalid-query": "Negalima užklausa."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/lv.json b/www/wiki/extensions/ExternalData/i18n/lv.json
new file mode 100644
index 00000000..ebf66083
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/lv.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Papuass"
+ ]
+ },
+ "getdata": "Saņemt datus"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/mk.json b/www/wiki/extensions/ExternalData/i18n/mk.json
new file mode 100644
index 00000000..07f04e82
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/mk.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Bjankuloski06"
+ ]
+ },
+ "getdata": "Земи податоци",
+ "externaldata-desc": "Овозможува добивање структурирани податоци од надворешни URL-адреси, бази на податоци и други извори",
+ "externaldata-no-param-specified": "Грешка: Го немате укажано параметарот „$1“.",
+ "externaldata-web-invalid-format": "Неважечки формат: „$1“",
+ "externaldata-ldap-unable-to-connect": "Не можам да се поврзам со $1",
+ "externaldata-xml-error": "XML грешка: $1 во ред $2",
+ "externaldata-invalid-json": "Грешка: Неважечки JSON",
+ "externaldata-db-incomplete-information": "Грешка: Нецелосни информации за овој опслужувачки ид. бр.",
+ "externaldata-db-could-not-get-url": "Не можев да ја добијам URL адресата по $1 {{PLURAL:$1|обид|обиди}}.",
+ "externaldata-db-unknown-type": "Грешка: Непознат тип на база на податоци.",
+ "externaldata-db-could-not-connect": "Грешка: Не можев да се поврзам со базата на податоци.",
+ "externaldata-db-unknown-collection": "Грешка: Непозната збирка од MongoDB.",
+ "externaldata-db-no-return-values": "Грешка: Нема назначено повратни вредности.",
+ "externaldata-db-invalid-query": "Грешно барање."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/ms.json b/www/wiki/extensions/ExternalData/i18n/ms.json
new file mode 100644
index 00000000..b40f6ae9
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/ms.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "Anakmalaysia"
+ ]
+ },
+ "getdata": "Dapatkan data",
+ "externaldata-desc": "Membolehkan pengambilan data berstruktur dari URL luaran, pangkalan data atau sumber-sumber lain",
+ "externaldata-web-invalid-format": "Format tidak sah: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Tidak dapat bersambung dengan $1",
+ "externaldata-xml-error": "Ralat XML: $1 di baris $2",
+ "externaldata-db-incomplete-information": "Ralat: Maklumat tidak lengkap untuk ID pelayan ini.",
+ "externaldata-db-could-not-get-url": "URL tidak dapat diterima selepas $1 cubaan.",
+ "externaldata-db-unknown-type": "Ralat: Jenis pangkalan data tidak dikenali.",
+ "externaldata-db-could-not-connect": "Ralat: Tidak dapat bersambung dengan pangkalan data.",
+ "externaldata-db-unknown-collection": "Ralat: Koleksi MongoDB tidak dikenali.",
+ "externaldata-db-no-return-values": "Ralat: Tiada nilai pulangan yang ditentukan.",
+ "externaldata-db-invalid-query": "Pertanyaan tidak sah."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/myv.json b/www/wiki/extensions/ExternalData/i18n/myv.json
new file mode 100644
index 00000000..7df6a260
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/myv.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Botuzhaleny-sodamo"
+ ]
+ },
+ "getdata": "Дата мельга"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/nb.json b/www/wiki/extensions/ExternalData/i18n/nb.json
new file mode 100644
index 00000000..62fc39d2
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/nb.json
@@ -0,0 +1,25 @@
+{
+ "@metadata": {
+ "authors": [
+ "Harald Khan",
+ "Nghtwlkr",
+ "Njardarlogar",
+ "Danmichaelo",
+ "Jon Harald Søby"
+ ]
+ },
+ "getdata": "Hent data",
+ "externaldata-desc": "Gir mulighet til å hente strukturerte data fra eksterne internettadresser, databaser og andre kilder",
+ "externaldata-no-param-specified": "Feil: Ingen parameter «$1» oppgitt.",
+ "externaldata-web-invalid-format": "Ugyldig format: «$1»",
+ "externaldata-ldap-unable-to-connect": "Klarte ikke å koble til $1",
+ "externaldata-xml-error": "XML-feil: $1 på linje $2",
+ "externaldata-invalid-json": "Feil: Ugyldig JSON.",
+ "externaldata-db-incomplete-information": "Feil: Ufullstendig informasjon for denne tjener-IDen.",
+ "externaldata-db-could-not-get-url": "Klarte ikke hente URL etter {{PLURAL:$1|ett forsøk|$1 forsøk}}.",
+ "externaldata-db-unknown-type": "Feil: Ukjent databasetype.",
+ "externaldata-db-could-not-connect": "Feil: Kunne ikke koble til database.",
+ "externaldata-db-unknown-collection": "Feil: Ukjent MongoDB-samling.",
+ "externaldata-db-no-return-values": "Feil: Ingen returverdi spesifisert.",
+ "externaldata-db-invalid-query": "Ugyldig spørring."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/nl.json b/www/wiki/extensions/ExternalData/i18n/nl.json
new file mode 100644
index 00000000..9f5d9b82
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/nl.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Effeietsanders",
+ "SPQRobin",
+ "Siebrand"
+ ]
+ },
+ "getdata": "Gegevens ophalen",
+ "externaldata-desc": "Maakt het mogelijk gegevens van externe URL's, database en andere externe bronnen op te halen",
+ "externaldata-no-param-specified": "Fout: er is geen parameter \"$1\" opgegeven.",
+ "externaldata-web-invalid-format": "Ongeldige indeling: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Het was niet mogelijk te verbinden met $1",
+ "externaldata-xml-error": "XML-fout: $1 op regel $2",
+ "externaldata-invalid-json": "Fout: ongeldige JSON",
+ "externaldata-db-incomplete-information": "Fout: onvolledige informatie voor dit servernummer.",
+ "externaldata-db-could-not-get-url": "Na $1 {{PLURAL:$1|poging|pogingen}} gaf de URL geen resultaat.",
+ "externaldata-db-unknown-type": "Fout: onbekend databasetype.",
+ "externaldata-db-could-not-connect": "Fout: het was niet mogelijk met de database te verbinden.",
+ "externaldata-db-unknown-collection": "Fout: onbekende MongoDB-verzameling.",
+ "externaldata-db-no-return-values": "Fout: er zijn geen return-waarden ingesteld.",
+ "externaldata-db-invalid-query": "Ongeldige zoekopdracht."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/nn.json b/www/wiki/extensions/ExternalData/i18n/nn.json
new file mode 100644
index 00000000..a8552bcd
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/nn.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "Gunnernett",
+ "Harald Khan",
+ "Njardarlogar"
+ ]
+ },
+ "getdata": "Hent data",
+ "externaldata-desc": "Gjev høve til å henta strukturerte data frå eksterne URL-ar, databasar og andre kjelder",
+ "externaldata-ldap-unable-to-connect": "Kunne ikkje kopla til $1",
+ "externaldata-xml-error": "XML-feil: $1 på line $2",
+ "externaldata-db-incomplete-information": "Feil: Ufullstendig informasjon for denne tenar-ID-en.",
+ "externaldata-db-could-not-get-url": "Kunne ikkje henta URL etter {{PLURAL:$1|eitt forsøk|$1 forsøk}}.",
+ "externaldata-db-unknown-type": "Feil: Ukjend databasetype.",
+ "externaldata-db-could-not-connect": "Feil: Kunne ikkje kopla til databasen.",
+ "externaldata-db-no-return-values": "Feil: Ingen returverdiar oppgjevne.",
+ "externaldata-db-invalid-query": "Ugyldig spørjing."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/oc.json b/www/wiki/extensions/ExternalData/i18n/oc.json
new file mode 100644
index 00000000..898d940d
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/oc.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Cedric31"
+ ]
+ },
+ "getdata": "Obténer de donadas",
+ "externaldata-desc": "Permet de recuperar de donadas estructuradas a partir d'URL extèrnas, de basas de donadas e d'autras fonts",
+ "externaldata-ldap-unable-to-connect": "Impossible de se connectar a $1",
+ "externaldata-xml-error": "Error XML : $1 a la linha $2",
+ "externaldata-db-incomplete-information": "Error : Informacions incompletas per aqueste identificant de servidor.",
+ "externaldata-db-could-not-get-url": "Impossible d'obténer l'URL aprèp $1 {{PLURAL:$1|ensag|ensages}}.",
+ "externaldata-db-unknown-type": "ERROR: Tipe de basa de donadas desconegut.",
+ "externaldata-db-could-not-connect": "Error : Impossible de se connectar a la basa de donadas.",
+ "externaldata-db-no-return-values": "Error : Cap de valor de retorn es pas estada especificada.",
+ "externaldata-db-invalid-query": "Requèsta invalida."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/or.json b/www/wiki/extensions/ExternalData/i18n/or.json
new file mode 100644
index 00000000..0340fd61
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/or.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Jnanaranjan Sahu"
+ ]
+ },
+ "getdata": "ତଥ୍ୟ ହାସଲ କରିବେ",
+ "externaldata-ldap-unable-to-connect": "$1ସହ ସଂଯୋଗ କରାଯାଇପାରିଲା ନାହିଁ",
+ "externaldata-db-could-not-connect": "ଅସୁବିଧା : ଡାଟାବେସ ସହ ସଂଯୋଗ କରାଯାଇପାରିଲା ନାହିଁ ।"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/pl.json b/www/wiki/extensions/ExternalData/i18n/pl.json
new file mode 100644
index 00000000..44d87bb7
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/pl.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "BeginaFelicysym",
+ "Chrumps",
+ "Leinad",
+ "Sp5uhe"
+ ]
+ },
+ "getdata": "Pobierz dane",
+ "externaldata-desc": "Umożliwia pobieranie strukturalnych danych z zewnętrznych adresów URL, baz danych i innych źródeł",
+ "externaldata-no-param-specified": "Błąd: Nie podano parametru „$1”.",
+ "externaldata-web-invalid-format": "Nieprawidłowy format: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Nie można połączyć się z $1",
+ "externaldata-xml-error": "Błąd XML – $1 w wierszu $2",
+ "externaldata-invalid-json": "Błąd: Nieprawidłowy JSON",
+ "externaldata-db-incomplete-information": "Błąd – niepełne informacje o tym identyfikatorze serwera.",
+ "externaldata-db-could-not-get-url": "Nie można uzyskać adresu URL po $1 {{PLURAL:$1|próbie|próbach}}.",
+ "externaldata-db-unknown-type": "Błąd: Nieznany typ bazy danych.",
+ "externaldata-db-could-not-connect": "Błąd: Nie można połączyć się z bazą danych.",
+ "externaldata-db-unknown-collection": "Błąd: Nieznany zbiór MongoDB.",
+ "externaldata-db-no-return-values": "Błąd – nie określono zwracanej wartości.",
+ "externaldata-db-invalid-query": "Nieprawidłowe zapytanie."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/pms.json b/www/wiki/extensions/ExternalData/i18n/pms.json
new file mode 100644
index 00000000..19af566e
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/pms.json
@@ -0,0 +1,20 @@
+{
+ "@metadata": {
+ "authors": [
+ "Borichèt",
+ "Dragonòt"
+ ]
+ },
+ "getdata": "Oten dij dat",
+ "externaldata-desc": "A përmët d'arcuperé dat struturà da adrësse dl'aragnà esterne, base ëd dàit e d'àutre sorgiss",
+ "externaldata-web-invalid-format": "Formà pa bon: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "A peul pa coleghesse a $1",
+ "externaldata-xml-error": "Eror XML: $1 a la linia $2",
+ "externaldata-db-incomplete-information": "Eror: Anformassion pa completa për sto server ID-sì.",
+ "externaldata-db-could-not-get-url": "A peul pa oten-e l'URL d'apress ëd $1 {{PLURAL:$1|preuva|preuve}}.",
+ "externaldata-db-unknown-type": "Eror: Sòrt ëd database pa conossùa",
+ "externaldata-db-could-not-connect": "Eror: a peul pa coleghesse al database.",
+ "externaldata-db-unknown-collection": "Eoro: Colession MongoDB pa conossùa.",
+ "externaldata-db-no-return-values": "Eror: Pa gnun valor d'artorn spessifià.",
+ "externaldata-db-invalid-query": "Ciamà pa bon-a."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/pt-br.json b/www/wiki/extensions/ExternalData/i18n/pt-br.json
new file mode 100644
index 00000000..ad64b486
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/pt-br.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Eduardo.mps",
+ "Giro720",
+ "Jaideraf"
+ ]
+ },
+ "getdata": "Obter dados",
+ "externaldata-desc": "Permite a obtenção de dados em CSV, JSON e XML a partir de URLs externos, banco de dados e outras fontes",
+ "externaldata-no-param-specified": "Erro: nenhum parâmetro \"$1\" especificado.",
+ "externaldata-web-invalid-format": "Formato inválido: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Não foi possível conectar-se a $1",
+ "externaldata-xml-error": "Erro no XML: $1 na linha $2",
+ "externaldata-invalid-json": "Erro: JSON inválido.",
+ "externaldata-db-incomplete-information": "Erro: informação incompleta para o ID deste servidor</P>",
+ "externaldata-db-could-not-get-url": "Não foi possível obter o URL após $1 {{PLURAL:$1|tentativa|tentativas}}.",
+ "externaldata-db-unknown-type": "Erro: tipo de base de dados desconhecido.",
+ "externaldata-db-could-not-connect": "Erro: não foi possível conectar-se a base de dados.",
+ "externaldata-db-unknown-collection": "Erro: coleção do MongoDB desconhecida.",
+ "externaldata-db-no-return-values": "Erro: nenhum valor de retorno especificado.",
+ "externaldata-db-invalid-query": "Consulta inválida."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/pt.json b/www/wiki/extensions/ExternalData/i18n/pt.json
new file mode 100644
index 00000000..c69e0275
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/pt.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Giro720",
+ "Hamilton Abreu",
+ "Waldir",
+ "Vitorvicentevalente"
+ ]
+ },
+ "getdata": "Obter dados",
+ "externaldata-desc": "Permite a importação de dados estruturados a partir de endereços URL, bases de dados e outras fontes externas",
+ "externaldata-no-param-specified": "Erro: Nenhum parâmetro \"$1\" especificado.",
+ "externaldata-web-invalid-format": "Formato inválido: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Não foi possível estabelecer ligação a $1",
+ "externaldata-xml-error": "Erro XML: $1 na linha $2",
+ "externaldata-invalid-json": "Erro: Código JSON inválido.",
+ "externaldata-db-incomplete-information": "Erro: Informação incompleta para este identificador de servidor.",
+ "externaldata-db-could-not-get-url": "Não foi possível importar o URL após {{PLURAL:$1|uma tentativa|$1 tentativas}}.",
+ "externaldata-db-unknown-type": "Erro: Tipo de base de dados desconhecido.",
+ "externaldata-db-could-not-connect": "Erro: Não foi possível estabelecer ligação à base de dados.",
+ "externaldata-db-unknown-collection": "Erro: Coleção desconhecida no MongoDB.",
+ "externaldata-db-no-return-values": "Erro: Não foram especificados valores de retorno.",
+ "externaldata-db-invalid-query": "Consulta inválida."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/qqq.json b/www/wiki/extensions/ExternalData/i18n/qqq.json
new file mode 100644
index 00000000..46fddcd5
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/qqq.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Dead3y3",
+ "Fryed-peach",
+ "Shirayuki",
+ "Umherirrender"
+ ]
+ },
+ "getdata": "{{doc-special|GetData}}",
+ "externaldata-desc": "{{desc|name=External Data|url=https://www.mediawiki.org/wiki/Extension:External_Data}}",
+ "externaldata-no-param-specified": "The error message if a parameter to some parser function is not set. Parameters:\n* $1 - parameter name. any one of the following: <code>url</code>, <code>data</code>, <code>filter</code>, <code>domain</code>, <code>db</code>, <code>from</code>",
+ "externaldata-web-invalid-format": "The error message if #get_web_data is called with an invalid format value.\n\nParameters:\n* $1 - invalid file format. Valid formats are: \"xml\", \"xml with xpath\", \"csv\", \"csv with header\", \"json\", and \"gff\"",
+ "externaldata-ldap-unable-to-connect": "The error message if #get_ldap_data can't connect to the LDAP server.\n\nParameters:\n* $1 - the LDAP server name",
+ "externaldata-xml-error": "The error message if #get_web_data can't parse an XML file. Parameters:\n* $1 - error message which are returned by PHP's <code>xml_error_string()</code>\n* $2 - line number",
+ "externaldata-invalid-json": "The error message if the URL being accessed does not contain valid JSON",
+ "externaldata-db-incomplete-information": "Used as error message.\n\nDatabase server, database type, database directory, database username and/or database password are not specified.",
+ "externaldata-db-could-not-get-url": "Parameters:\n* $1 - number of HTTP tries",
+ "externaldata-db-unknown-type": "Used as error message when creating a database object with using the specified information.",
+ "externaldata-db-could-not-connect": "Used as error message when connecting to the database system.",
+ "externaldata-db-unknown-collection": "The error message if #get_db_data can't find the specified \"collection\" when connecting to MongoDB.",
+ "externaldata-db-no-return-values": "Used as error message, if the number of the specified columns is zero.\n\nIf successful, the system returns values in the specified columns.",
+ "externaldata-db-invalid-query": "Used as error message, if the query has been failed."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/ro.json b/www/wiki/extensions/ExternalData/i18n/ro.json
new file mode 100644
index 00000000..eeb12c58
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/ro.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Firilacroco",
+ "KlaudiuMihaila",
+ "Stelistcristi"
+ ]
+ },
+ "getdata": "Obține date",
+ "externaldata-desc": "Permite obținerea datelor în format CSV, JSON și XML din atât adrese URL externe, cât și pagini wiki locale",
+ "externaldata-web-invalid-format": "Fomat invalid: „$1”",
+ "externaldata-ldap-unable-to-connect": "Nu se poate conecta la $1",
+ "externaldata-xml-error": "Eroare XML: $1 la linia $2",
+ "externaldata-db-unknown-type": "Eroare: Tipul bazei de date necunoscut.",
+ "externaldata-db-could-not-connect": "Eroare: Nu s-a putut conecta la baza de date.",
+ "externaldata-db-invalid-query": "Interogare invalidă."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/roa-tara.json b/www/wiki/extensions/ExternalData/i18n/roa-tara.json
new file mode 100644
index 00000000..eb1a37e8
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/roa-tara.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "Joetaras"
+ ]
+ },
+ "getdata": "Pigghie le date",
+ "externaldata-desc": "Permette de repigghià data strutturate da URL fore a Uicchipèdie, database e otre sorgende",
+ "externaldata-no-param-specified": "Errore: Nisciune parametre \"$1\" specificate.",
+ "externaldata-web-invalid-format": "Formate invalide: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Indisponibbile a collegarse a $1",
+ "externaldata-xml-error": "Errore XML: $1 sus a linèe $2",
+ "externaldata-invalid-json": "Errore: JSON invalide.",
+ "externaldata-db-incomplete-information": "Errore: 'Mbormazione ingomblete pe stu ID d'u database.",
+ "externaldata-db-could-not-get-url": "Non ge pozze pigghià 'a URL apprisse $1 {{PLURAL:$1|prove}}.",
+ "externaldata-db-unknown-type": "Errore: Tipe de database scanusciute.",
+ "externaldata-db-could-not-connect": "Errore: Non ge me pozze collegà a 'u database.",
+ "externaldata-db-unknown-collection": "Errore: Collezzione scanusciute MongoDB.",
+ "externaldata-db-no-return-values": "Errore: Nisciune valore de retorne specificate.",
+ "externaldata-db-invalid-query": "Inderrogazione invalide."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/ru.json b/www/wiki/extensions/ExternalData/i18n/ru.json
new file mode 100644
index 00000000..698a22dd
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/ru.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ferrer",
+ "Kaganer",
+ "Okras",
+ "Александр Сигачёв"
+ ]
+ },
+ "getdata": "Получить данные",
+ "externaldata-desc": "Позволяет получать структурированные данные с внешних адресов, баз данных и других источников",
+ "externaldata-no-param-specified": "Ошибка: Не указан параметр «$1».",
+ "externaldata-web-invalid-format": "Недопустимый формат: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Не удаётся подключиться к $1",
+ "externaldata-xml-error": "Ошибка XML. $1 в строке $2",
+ "externaldata-invalid-json": "Ошибка: Недопустимый JSON",
+ "externaldata-db-incomplete-information": "ОШИБКА. Неполная информация для этого ID сервера.",
+ "externaldata-db-could-not-get-url": "Не удалось получить URL после $1 {{PLURAL:$1|попытки|попыток}}.",
+ "externaldata-db-unknown-type": "ОШИБКА. Неизвестный тип базы данных.",
+ "externaldata-db-could-not-connect": "ОШИБКА. Не удаётся подключиться к базе данных.",
+ "externaldata-db-unknown-collection": "Ошибка: Неизвестная коллекция MongoDB.",
+ "externaldata-db-no-return-values": "ОШИБКА. Не указаны возвращаемые значение.",
+ "externaldata-db-invalid-query": "Ошибочный запрос."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/sah.json b/www/wiki/extensions/ExternalData/i18n/sah.json
new file mode 100644
index 00000000..1eb13ea6
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/sah.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "HalanTul"
+ ]
+ },
+ "getdata": "Дааннайдары ыларга"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/sco.json b/www/wiki/extensions/ExternalData/i18n/sco.json
new file mode 100644
index 00000000..34ca143a
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/sco.json
@@ -0,0 +1,21 @@
+{
+ "@metadata": {
+ "authors": [
+ "AmaryllisGardener"
+ ]
+ },
+ "getdata": "Get data",
+ "externaldata-desc": "Allaes for retrievin structurt data frae freemit URLs, databases an ither soorces",
+ "externaldata-no-param-specified": "Error: No \"$1\" parameter specified.",
+ "externaldata-web-invalid-format": "Invalid format: \"$1\".",
+ "externaldata-ldap-unable-to-connect": "Unable tae connect tae $1.",
+ "externaldata-xml-error": "XML error: $1 at line $2.",
+ "externaldata-invalid-json": "Error: Invalid JSON.",
+ "externaldata-db-incomplete-information": "Error: Incomplete information for this database ID.",
+ "externaldata-db-could-not-get-url": "Couldna get URL efter $1 {{PLURAL:$1|try|tries}}.",
+ "externaldata-db-unknown-type": "Error: Unkent database teep.",
+ "externaldata-db-could-not-connect": "Error: Couldna connect tae database.",
+ "externaldata-db-unknown-collection": "Error: Unkent MongoDB collection.",
+ "externaldata-db-no-return-values": "Error: No return values specified.",
+ "externaldata-db-invalid-query": "Invalid query."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/si.json b/www/wiki/extensions/ExternalData/i18n/si.json
new file mode 100644
index 00000000..939e7a21
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/si.json
@@ -0,0 +1,14 @@
+{
+ "@metadata": {
+ "authors": [
+ "පසිඳු කාවින්ද"
+ ]
+ },
+ "getdata": "දත්ත ලබා ගන්න",
+ "externaldata-web-invalid-format": "වලංගු නොවන ආකෘතිය: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "$1 වෙත සම්බන්ධ විය නොහැක",
+ "externaldata-xml-error": "XML දෝෂය: $1 පේළිය $2",
+ "externaldata-db-unknown-type": "දෝෂය: නොදන්නා දත්ත සංචිත වර්ගය.",
+ "externaldata-db-could-not-connect": "දෝෂය: දත්ත සංචිතය වෙත සම්බන්ධ විය නොහැක.",
+ "externaldata-db-invalid-query": "වලංගු නොවන ප්‍රශ්නය."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/sk.json b/www/wiki/extensions/ExternalData/i18n/sk.json
new file mode 100644
index 00000000..68706fde
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/sk.json
@@ -0,0 +1,17 @@
+{
+ "@metadata": {
+ "authors": [
+ "Helix84"
+ ]
+ },
+ "getdata": "Získať dáta",
+ "externaldata-desc": "Umožňuje získavanie štrukturovaných údajov z externých URL, databáz a iných zdrojov",
+ "externaldata-ldap-unable-to-connect": "Nepodarilo sa pripojiť k $1",
+ "externaldata-xml-error": "Chyba XML: $1 na riadku $2",
+ "externaldata-db-incomplete-information": "Chyba: Nekompletné informácie s týmto ID servera.",
+ "externaldata-db-could-not-get-url": "Nepodarilo sa získať URL po $1 {{PLURAL:$1|pokuse|pokusoch}}.",
+ "externaldata-db-unknown-type": "Chyba: Neznámy typ databázy.",
+ "externaldata-db-could-not-connect": "Chyba: Nepodarilo sa pripojiť k databáze.",
+ "externaldata-db-no-return-values": "Chyba: Neboli zadané žiadne návratové hodnoty.",
+ "externaldata-db-invalid-query": "Neplatná požiadavka."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/sr-ec.json b/www/wiki/extensions/ExternalData/i18n/sr-ec.json
new file mode 100644
index 00000000..9ba567e2
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/sr-ec.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "Charmed94",
+ "Milicevic01",
+ "Михајло Анђелковић"
+ ]
+ },
+ "getdata": "Преузми податке",
+ "externaldata-desc": "Омогућава преузимање података из спољашњих адреса, бази података и других извора",
+ "externaldata-ldap-unable-to-connect": "Повезивање на $1 није успело",
+ "externaldata-xml-error": "XML грешка: $1 по линији $2",
+ "externaldata-db-incomplete-information": "Грешка: Непотпуни подаци за овај ID сервера.",
+ "externaldata-db-could-not-get-url": "Преузимање адресе после $1 {{PLURAL:$1|покушаја}} није успело.",
+ "externaldata-db-unknown-type": "Грешка: Непозната врста базе података.",
+ "externaldata-db-could-not-connect": "Грешка: Повезивање с базом података није успело.",
+ "externaldata-db-no-return-values": "Грешка: Повратне вредности нису одређене.",
+ "externaldata-db-invalid-query": "Неисправан упит."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/sr-el.json b/www/wiki/extensions/ExternalData/i18n/sr-el.json
new file mode 100644
index 00000000..9f3123f5
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/sr-el.json
@@ -0,0 +1,18 @@
+{
+ "@metadata": {
+ "authors": [
+ "Michaello",
+ "Milicevic01"
+ ]
+ },
+ "getdata": "Preuzmi podatke",
+ "externaldata-desc": "Omogućava preuzimanje podataka iz spoljašnjih adresa, bazi podataka i drugih izvora",
+ "externaldata-ldap-unable-to-connect": "Povezivanje na $1 nije uspelo",
+ "externaldata-xml-error": "XML greška: $1 po liniji $2",
+ "externaldata-db-incomplete-information": "Greška: Nepotpuni podaci za ovaj ID servera.",
+ "externaldata-db-could-not-get-url": "Preuzimanje adrese posle $1 {{PLURAL:$1|pokušaja}} nije uspelo.",
+ "externaldata-db-unknown-type": "Greška: Nepoznata vrsta baze podataka.",
+ "externaldata-db-could-not-connect": "Greška: Povezivanje s bazom podataka nije uspelo.",
+ "externaldata-db-no-return-values": "Greška: Povratne vrednosti nisu određene.",
+ "externaldata-db-invalid-query": "Neispravan upit."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/sv.json b/www/wiki/extensions/ExternalData/i18n/sv.json
new file mode 100644
index 00000000..b0fc14e8
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/sv.json
@@ -0,0 +1,27 @@
+{
+ "@metadata": {
+ "authors": [
+ "Ainali",
+ "Boivie",
+ "Lokal Profil",
+ "Najami",
+ "Per",
+ "Tobulos1",
+ "WikiPhoenix"
+ ]
+ },
+ "getdata": "Hämta data",
+ "externaldata-desc": "Ger möjlighet att hämta strukturerad data från externa URL:er, databaser och andra källor",
+ "externaldata-no-param-specified": "Fel: Ingen \"$1\" parameter specificerad.",
+ "externaldata-web-invalid-format": "Ogiltigt format: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Kunde inte koppla till $1",
+ "externaldata-xml-error": "XML-fel: $1 på rad $2",
+ "externaldata-invalid-json": "Fel: Ogiltig JSON.",
+ "externaldata-db-incomplete-information": "Fel: Informationen för server-ID inte komplett.",
+ "externaldata-db-could-not-get-url": "Kunde inte hämta URL på $1 {{PLURAL:$1|försök|försök}}.",
+ "externaldata-db-unknown-type": "Fel: Okänd databastyp.",
+ "externaldata-db-could-not-connect": "Fel: Kunde inte koppla till databasen.",
+ "externaldata-db-unknown-collection": "Fel: Okänd MongoDB samling.",
+ "externaldata-db-no-return-values": "Fel: Inga returvärden specificerade.",
+ "externaldata-db-invalid-query": "Ogiltig fråga."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/ta.json b/www/wiki/extensions/ExternalData/i18n/ta.json
new file mode 100644
index 00000000..6a673b38
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/ta.json
@@ -0,0 +1,12 @@
+{
+ "@metadata": {
+ "authors": [
+ "Karthi.dr",
+ "மதனாஹரன்"
+ ]
+ },
+ "getdata": "தகவலைப் பெறு",
+ "externaldata-db-unknown-type": "தவறு: அறியாத தரவுத் தள வகை.",
+ "externaldata-db-could-not-connect": "தவறு: தரவுத் தளத்துடன் தொடர்பு கொள்ள முடியவில்லை.",
+ "externaldata-db-invalid-query": "செல்லாத வினவல்."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/te.json b/www/wiki/extensions/ExternalData/i18n/te.json
new file mode 100644
index 00000000..5734bee6
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/te.json
@@ -0,0 +1,10 @@
+{
+ "@metadata": {
+ "authors": [
+ "Chaduvari",
+ "Kiranmayee"
+ ]
+ },
+ "getdata": "విషయములు తీసుకునిరా",
+ "externaldata-ldap-unable-to-connect": "$1 కు కనెక్టు కాలేకున్నాం"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/tl.json b/www/wiki/extensions/ExternalData/i18n/tl.json
new file mode 100644
index 00000000..4904d02d
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/tl.json
@@ -0,0 +1,19 @@
+{
+ "@metadata": {
+ "authors": [
+ "AnakngAraw",
+ "Sky Harbor"
+ ]
+ },
+ "getdata": "Kunin ang dato",
+ "externaldata-desc": "Nagpapahintulot sa pagkuha ng nakabalangkas na datos mula sa panlabas na mga URL, mga kalipunan ng datos at sa ibang mga pinagmulan",
+ "externaldata-web-invalid-format": "Hindi katanggap-tanggap na anyo: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Hindi makakunekta sa $1",
+ "externaldata-xml-error": "Kamalian sa XML: $1 sa linyang $2",
+ "externaldata-db-incomplete-information": "Kamalian: Hindi-kumpletong impormasyon para sa itong ID ng serbidor.",
+ "externaldata-db-could-not-get-url": "Hindi makuha ang URL pagkatapos ng $1 {{PLURAL:$1|pagsubok|pagsubok}}",
+ "externaldata-db-unknown-type": "Kamalian: Hindi-kilalang uri ng kalipunan ng datos.",
+ "externaldata-db-could-not-connect": "Kamalian: Hindi makakunekta sa talaan ng dato.",
+ "externaldata-db-no-return-values": "Kamalian: Walang tinukoy na halagang pabalik.",
+ "externaldata-db-invalid-query": "Hindi tanggap na katanungan."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/tr.json b/www/wiki/extensions/ExternalData/i18n/tr.json
new file mode 100644
index 00000000..78fdb552
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/tr.json
@@ -0,0 +1,13 @@
+{
+ "@metadata": {
+ "authors": [
+ "Karduelis",
+ "Vito Genovese"
+ ]
+ },
+ "getdata": "Veri al",
+ "externaldata-db-unknown-type": "Hata: Bilinmeyen veritabanı türü.",
+ "externaldata-db-could-not-connect": "Hata: Veritabanına bağlanılamıyor.",
+ "externaldata-db-no-return-values": "Hata: Dönüş değeri belirtilmedi.",
+ "externaldata-db-invalid-query": "Geçersiz sorgu."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/uk.json b/www/wiki/extensions/ExternalData/i18n/uk.json
new file mode 100644
index 00000000..8c5fbdab
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/uk.json
@@ -0,0 +1,24 @@
+{
+ "@metadata": {
+ "authors": [
+ "Andriykopanytsia",
+ "Base",
+ "Ата",
+ "Тест"
+ ]
+ },
+ "getdata": "Отримати дані",
+ "externaldata-desc": "Дозволяє отримувати структуровані дані із зовнішніх URL-адрес, баз даних та інших джерел",
+ "externaldata-no-param-specified": "Помилка: параметр \"$1\" - не вказаний.",
+ "externaldata-web-invalid-format": "Неприпустимий формат: \"$1\"",
+ "externaldata-ldap-unable-to-connect": "Не вдається підключитися до $1",
+ "externaldata-xml-error": "Помилка XML: $1 в рядку $2",
+ "externaldata-invalid-json": "Помилка: Неправильний JSON",
+ "externaldata-db-incomplete-information": "Помилка: Неповна інформація для цього ID сервера.",
+ "externaldata-db-could-not-get-url": "Не вдалося отримати URL після $1 {{PLURAL:$1|1=спроби|спроб}}.",
+ "externaldata-db-unknown-type": "Помилка: Невідомий тип бази даних.",
+ "externaldata-db-could-not-connect": "Помилка: не вдалося підключитися до бази даних.",
+ "externaldata-db-unknown-collection": "Помилка: Невідома колекція MongoDB.",
+ "externaldata-db-no-return-values": "Помилка: Не вказано зворотних значень.",
+ "externaldata-db-invalid-query": "Неприпустимий запит."
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/vep.json b/www/wiki/extensions/ExternalData/i18n/vep.json
new file mode 100644
index 00000000..abad0f38
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/vep.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "Игорь Бродский"
+ ]
+ },
+ "getdata": "Sada andmused"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/vi.json b/www/wiki/extensions/ExternalData/i18n/vi.json
new file mode 100644
index 00000000..22c110e6
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/vi.json
@@ -0,0 +1,11 @@
+{
+ "@metadata": {
+ "authors": [
+ "Minh Nguyen",
+ "Vinhtantran"
+ ]
+ },
+ "getdata": "Lấy dữ liệu",
+ "externaldata-desc": "Cho phép truy xuất dữ liệu từ các địa chỉ URL bên ngoài, cơ sở dữ liệu, và nguồn khác",
+ "externaldata-xml-error": "Lỗi XML ở dòng $2: $1"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/yi.json b/www/wiki/extensions/ExternalData/i18n/yi.json
new file mode 100644
index 00000000..67d767ad
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/yi.json
@@ -0,0 +1,8 @@
+{
+ "@metadata": {
+ "authors": [
+ "פוילישער"
+ ]
+ },
+ "getdata": "באַקומען דאַטן"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/zh-hans.json b/www/wiki/extensions/ExternalData/i18n/zh-hans.json
new file mode 100644
index 00000000..d42ea52d
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/zh-hans.json
@@ -0,0 +1,23 @@
+{
+ "@metadata": {
+ "authors": [
+ "Hydra",
+ "Liuxinyu970226",
+ "Yfdyh000"
+ ]
+ },
+ "getdata": "获取数据",
+ "externaldata-desc": "允许从外部URL,数据库及其他来源接收结构化数据",
+ "externaldata-no-param-specified": "错误:未指定“$1”参数。",
+ "externaldata-web-invalid-format": "无效的格式:“$1”",
+ "externaldata-ldap-unable-to-connect": "无法连接到 $1",
+ "externaldata-xml-error": "XML错误:$1 在行 $2",
+ "externaldata-invalid-json": "错误:无效的JSON",
+ "externaldata-db-incomplete-information": "错误:此服务器ID信息不完整。",
+ "externaldata-db-could-not-get-url": "$1次尝试后仍无法获取URL。",
+ "externaldata-db-unknown-type": "错误:未知的数据库类型。",
+ "externaldata-db-could-not-connect": "错误:无法连接到数据库。",
+ "externaldata-db-unknown-collection": "错误:未知的MongoDB集合。",
+ "externaldata-db-no-return-values": "错误:没有返回指定的值。",
+ "externaldata-db-invalid-query": "无效的查询。"
+}
diff --git a/www/wiki/extensions/ExternalData/i18n/zh-hant.json b/www/wiki/extensions/ExternalData/i18n/zh-hant.json
new file mode 100644
index 00000000..6fcebe64
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/i18n/zh-hant.json
@@ -0,0 +1,22 @@
+{
+ "@metadata": {
+ "authors": [
+ "LNDDYL",
+ "Kly"
+ ]
+ },
+ "getdata": "取得資料",
+ "externaldata-desc": "允許外部 URL、資料庫,以及其它來源檢索結構化資料",
+ "externaldata-no-param-specified": "錯誤:未指定「$1」參數。",
+ "externaldata-web-invalid-format": "無效格式:「$1」。",
+ "externaldata-ldap-unable-to-connect": "無法連結至 $1。",
+ "externaldata-xml-error": "XML 錯誤:在第 $2 行出現 $1。",
+ "externaldata-invalid-json": "錯誤:無效的 JSON。",
+ "externaldata-db-incomplete-information": "錯誤:此資料庫的 ID 訊息不完整。",
+ "externaldata-db-could-not-get-url": "在 $1 {{PLURAL:$1| 次嘗試| 次嘗試}}後仍無法取得 URL。",
+ "externaldata-db-unknown-type": "錯誤:無效資料庫類型。",
+ "externaldata-db-could-not-connect": "錯誤:無法連結至資料庫。",
+ "externaldata-db-unknown-collection": "錯誤:未知的 MongoDB 集合。",
+ "externaldata-db-no-return-values": "錯誤:沒有回傳指定的值。",
+ "externaldata-db-invalid-query": "無效的查詢。"
+}
diff --git a/www/wiki/extensions/ExternalData/includes/ED_GetData.php b/www/wiki/extensions/ExternalData/includes/ED_GetData.php
new file mode 100644
index 00000000..ab084426
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/includes/ED_GetData.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * A special page for retrieving selected rows of any wiki page that contains
+ * data in CSV format
+ */
+
+class EDGetData extends SpecialPage {
+
+ /**
+ * Constructor
+ */
+ function __construct() {
+ parent::__construct( 'GetData' );
+ }
+
+ function execute( $query ) {
+ global $wgRequest, $wgOut;
+
+ $wgOut->disable();
+ $this->setHeaders();
+ $page_name = $query;
+ $title = Title::newFromText( $page_name );
+ if ( is_null( $title ) ) {
+ return;
+ }
+ if ( ! $title->userCan( 'read' ) ) {
+ return;
+ }
+ $wikiPage = WikiPage::factory( $title );
+ $page_text = ContentHandler::getContentText( $wikiPage->getContent() );
+ // Remove <noinclude> sections and <includeonly> tags from text
+ $page_text = StringUtils::delimiterReplace( '<noinclude>', '</noinclude>', '', $page_text );
+ $page_text = strtr( $page_text, array( '<includeonly>' => '', '</includeonly>' => '' ) );
+ $orig_lines = explode( "\n", $page_text );
+ // ignore lines that are either blank or start with a semicolon
+ $page_lines = array();
+ foreach ( $orig_lines as $i => $line ) {
+ if ( $line != '' && $line[0] != ';' ) {
+ $page_lines[] = $line;
+ }
+ }
+ $headers = EDUtils::getValuesFromCSVLine( $page_lines[0] );
+ $queried_headers = array();
+ foreach ( $wgRequest->getValues() as $key => $value ) {
+ foreach ( $headers as $header_index => $header_value ) {
+ $header_value = str_replace( ' ', '_', $header_value );
+ if ( $key == $header_value ) {
+ $queried_headers[$header_index] = $value;
+ }
+ }
+ }
+ // include header in output
+ $text = $page_lines[0];
+ foreach ( $page_lines as $i => $line ) {
+ if ( $i == 0 ) continue;
+ $row_values = EDUtils::getValuesFromCSVLine( $line );
+ $found_match = true;
+ foreach ( $queried_headers as $i => $query_value ) {
+ $single_value = str_replace( ' ', '_', $row_values[$i] );
+ if ( $single_value != $query_value ) {
+ $found_match = false;
+ }
+ }
+ if ( $found_match ) {
+ if ( $text != '' ) $text .= "\n";
+ $text .= $line;
+ }
+ }
+ print $text;
+ }
+
+ protected function getGroupName() {
+ return 'pagetools';
+ }
+}
diff --git a/www/wiki/extensions/ExternalData/includes/ED_ParserFunctions.php b/www/wiki/extensions/ExternalData/includes/ED_ParserFunctions.php
new file mode 100644
index 00000000..8edc7e17
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/includes/ED_ParserFunctions.php
@@ -0,0 +1,663 @@
+<?php
+/**
+ * Class for handling the parser functions for External Data
+ */
+
+class EDParserFunctions {
+
+ /**
+ * A helper function, called by doGetWebData().
+ */
+ static public function setGlobalValuesArray( $external_values, $filters, $mappings ) {
+ global $edgValues;
+
+ foreach ( $filters as $filter_var => $filter_value ) {
+ // Find the entry of $external_values that matches
+ // the filter variable; if none exists, just ignore
+ // the filter.
+ if ( array_key_exists( $filter_var, $external_values ) ) {
+ if ( is_array( $external_values[$filter_var] ) ) {
+ $column_values = $external_values[$filter_var];
+ foreach ( $column_values as $i => $single_value ) {
+ // if a value doesn't match
+ // the filter value, remove
+ // the value from this row for
+ // all columns
+ if ( trim( $single_value ) != trim( $filter_value ) ) {
+ foreach ( $external_values as $external_var => $external_value ) {
+ unset( $external_values[$external_var][$i] );
+ }
+ }
+ }
+ } else {
+ // if we have only one row of values,
+ // and the filter doesn't match, just
+ // keep the results array blank and
+ // return
+ if ( $external_values[$filter_var] != $filter_value ) {
+ return;
+ }
+ }
+ }
+ }
+ // for each external variable name specified in the function
+ // call, get its value or values (if any exist), and attach it
+ // or them to the local variable name
+ foreach ( $mappings as $local_var => $external_var ) {
+ if ( array_key_exists( $external_var, $external_values ) ) {
+ if ( is_array( $external_values[$external_var] ) ) {
+ // array_values() restores regular
+ // 1, 2, 3 indexes to array, after unset()
+ // in filtering may have removed some
+ $edgValues[$local_var] = array_values( $external_values[$external_var] );
+ } else {
+ $edgValues[$local_var][] = $external_values[$external_var];
+ }
+ }
+ }
+ }
+
+ /**
+ * Render the #get_web_data parser function.
+ */
+ static function doGetWebData( &$parser ) {
+ global $edgCurPageName, $edgValues, $edgCacheExpireTime;
+
+ // If we're handling multiple pages, reset $edgValues
+ // when we move from one page to another.
+ $cur_page_name = $parser->getTitle()->getText();
+ if ( ! isset( $edgCurPageName ) || $edgCurPageName != $cur_page_name ) {
+ $edgValues = array();
+ $edgCurPageName = $cur_page_name;
+ }
+
+ $params = func_get_args();
+ array_shift( $params ); // we already know the $parser ...
+ $args = EDUtils::parseParams( $params ); // parse params into name-value pairs
+ if ( array_key_exists( 'url', $args ) ) {
+ $url = $args['url'];
+ } else {
+ return EDUtils::formatErrorMessage( wfMessage( 'externaldata-no-param-specified', 'url')->parse() );
+ }
+ $url = str_replace( ' ', '%20', $url ); // do some minor URL-encoding
+ // if the URL isn't allowed (based on a whitelist), exit
+ if ( ! EDUtils::isURLAllowed( $url ) ) {
+ return EDUtils::formatErrorMessage( "URL is not allowed" );
+ }
+
+ if ( array_key_exists( 'format', $args ) ) {
+ $format = strtolower( $args['format'] );
+ } else {
+ $format = '';
+ }
+ if ( $format == 'xml' ) {
+ if ( array_key_exists( 'use xpath', $args ) ) {
+ // Somewhat of a hack - store the fact that
+ // we're using XPath within the format, even
+ // though the format is still XML.
+ $format = 'xml with xpath';
+ }
+ } elseif ( $format == 'csv' || $format == 'csv with header' ) {
+ if ( array_key_exists( 'delimiter', $args ) ) {
+ $delimiter = $args['delimiter'];
+ // Hopefully this solution isn't "too clever".
+ $format = array( $format, $args['delimiter'] );
+ }
+ }
+
+ if ( array_key_exists( 'data', $args ) ) {
+ // parse the 'data' arg into mappings
+ if ( $format == 'xml with xpath' ) {
+ $mappings = EDUtils::paramToArray( $args['data'], false, false );
+ } else {
+ $mappings = EDUtils::paramToArray( $args['data'], false, true );
+ }
+ } else {
+ return EDUtils::formatErrorMessage( wfMessage( 'externaldata-no-param-specified', 'data')->parse() );
+ }
+
+ if ( array_key_exists( 'cache seconds', $args) ) {
+ // set cache expire time
+ $cacheExpireTime = $args['cache seconds'];
+ } else {
+ $cacheExpireTime = $edgCacheExpireTime;
+ }
+
+ if ( array_key_exists( 'json offset', $args) ) {
+ $prefixLength = $args['json offset'];
+ } else {
+ $prefixLength = 0;
+ }
+
+ $postData = array_key_exists( 'post data', $args ) ? $args['post data'] : '';
+ $external_values = EDUtils::getDataFromURL( $url, $format, $mappings, $postData, $cacheExpireTime, $prefixLength );
+ if ( is_string( $external_values ) ) {
+ // It's an error message - display it on the screen.
+ return EDUtils::formatErrorMessage( $external_values );
+ }
+ if ( count( $external_values ) == 0 ) {
+ return;
+ }
+
+ if ( array_key_exists( 'filters', $args ) ) {
+ // parse the 'filters' arg
+ $filters = EDUtils::paramToArray( $args['filters'], true, false );
+ } else {
+ $filters = array();
+ }
+
+ self::setGlobalValuesArray( $external_values, $filters, $mappings );
+ }
+
+ /**
+ * Render the #get_file_data parser function.
+ */
+ static function doGetFileData( &$parser ) {
+ global $edgCurPageName, $edgValues, $edgCacheExpireTime;
+
+ // If we're handling multiple pages, reset $edgValues
+ // when we move from one page to another.
+ $cur_page_name = $parser->getTitle()->getText();
+ if ( ! isset( $edgCurPageName ) || $edgCurPageName != $cur_page_name ) {
+ $edgValues = array();
+ $edgCurPageName = $cur_page_name;
+ }
+
+ $params = func_get_args();
+ array_shift( $params ); // we already know the $parser ...
+ $args = EDUtils::parseParams( $params ); // parse params into name-value pairs
+ if ( array_key_exists( 'file', $args ) ) {
+ $file = $args['file'];
+ } elseif ( array_key_exists( 'directory', $args ) ) {
+ $directory = $args['directory'];
+ if ( array_key_exists( 'file name', $args ) ) {
+ $fileName = $args['file name'];
+ } else {
+ return EDUtils::formatErrorMessage( wfMessage( 'externaldata-no-param-specified', 'file name')->parse() );
+ }
+ } else {
+ return EDUtils::formatErrorMessage( wfMessage( 'externaldata-no-param-specified', 'file|directory')->parse() );
+ }
+
+ if ( array_key_exists( 'format', $args ) ) {
+ $format = strtolower( $args['format'] );
+ } else {
+ $format = '';
+ }
+ if ( $format == 'xml' ) {
+ if ( array_key_exists( 'use xpath', $args ) ) {
+ // Somewhat of a hack - store the fact that
+ // we're using XPath within the format, even
+ // though the format is still XML.
+ $format = 'xml with xpath';
+ }
+ } elseif ( $format == 'csv' || $format == 'csv with header' ) {
+ if ( array_key_exists( 'delimiter', $args ) ) {
+ $delimiter = $args['delimiter'];
+ // Hopefully this solution isn't "too clever".
+ $format = array( $format, $args['delimiter'] );
+ }
+ }
+
+ if ( array_key_exists( 'data', $args ) ) {
+ // parse the 'data' arg into mappings
+ if ( $format == 'xml with xpath' ) {
+ $mappings = EDUtils::paramToArray( $args['data'], false, false );
+ } else {
+ $mappings = EDUtils::paramToArray( $args['data'], false, true );
+ }
+ } else {
+ return EDUtils::formatErrorMessage( wfMessage( 'externaldata-no-param-specified', 'data')->parse() );
+ }
+
+ if ( array_key_exists( 'cache seconds', $args) ) {
+ // set cache expire time
+ $cacheExpireTime = $args['cache seconds'];
+ } else {
+ $cacheExpireTime = $edgCacheExpireTime;
+ }
+
+ if ( isset( $file ) ) {
+ $external_values = EDUtils::getDataFromFile( $file, $format, $mappings );
+ } else {
+ $external_values = EDUtils::getDataFromDirectory( $directory, $fileName, $format, $mappings );
+ }
+
+ if ( is_string( $external_values ) ) {
+ // It's an error message - display it on the screen.
+ return EDUtils::formatErrorMessage( $external_values );
+ }
+ if ( count( $external_values ) == 0 ) {
+ return;
+ }
+
+ if ( array_key_exists( 'filters', $args ) ) {
+ // parse the 'filters' arg
+ $filters = EDUtils::paramToArray( $args['filters'], true, false );
+ } else {
+ $filters = array();
+ }
+
+ self::setGlobalValuesArray( $external_values, $filters, $mappings );
+ }
+ /**
+ * Render the #get_soap_data parser function.
+ */
+ static function doGetSOAPData( &$parser ) {
+ global $edgCurPageName, $edgValues, $edgCacheExpireTime;
+
+ // If we're handling multiple pages, reset $edgValues
+ // when we move from one page to another.
+ $cur_page_name = $parser->getTitle()->getText();
+ if ( ! isset( $edgCurPageName ) || $edgCurPageName != $cur_page_name ) {
+ $edgValues = array();
+ $edgCurPageName = $cur_page_name;
+ }
+
+ $params = func_get_args();
+ array_shift( $params ); // we already know the $parser ...
+ $args = EDUtils::parseParams( $params ); // parse params into name-value pairs
+ if ( array_key_exists( 'url', $args ) ) {
+ $url = $args['url'];
+ } else {
+ return EDUtils::formatErrorMessage( wfMessage( 'externaldata-no-param-specified', 'url')->parse() );
+ }
+ $url = str_replace( ' ', '%20', $url ); // do some minor URL-encoding
+ // if the URL isn't allowed (based on a whitelist), exit
+ if ( ! EDUtils::isURLAllowed( $url ) ) {
+ return EDUtils::formatErrorMessage( "URL is not allowed" );
+ }
+
+ if ( array_key_exists( 'request', $args ) ) {
+ $requestName = $args['request'];
+ } else {
+ return EDUtils::formatErrorMessage( wfMessage( 'externaldata-no-param-specified', 'request')->parse() );
+ }
+
+ if ( array_key_exists( 'requestData', $args ) ) {
+ $requestData = EDUtils::paramToArray( $args['requestData'] );
+ } else {
+ return EDUtils::formatErrorMessage( wfMessage( 'externaldata-no-param-specified', 'requestData')->parse() );
+ }
+
+ if ( array_key_exists( 'response', $args ) ) {
+ $responseName = $args['response'];
+ } else {
+ return EDUtils::formatErrorMessage( wfMessage( 'externaldata-no-param-specified', 'response')->parse() );
+ }
+
+ if ( array_key_exists( 'data', $args ) ) {
+ $mappings = EDUtils::paramToArray( $args['data'] ); // parse the data arg into mappings
+ } else {
+ return EDUtils::formatErrorMessage( wfMessage( 'externaldata-no-param-specified', 'data')->parse() );
+ }
+
+ $external_values = EDUtils::getSOAPData( $url, $requestName, $requestData, $responseName, $mappings);
+ if ( is_string( $external_values ) ) {
+ // It's an error message - display it on the screen.
+ return EDUtils::formatErrorMessage( $external_values );
+ }
+
+ self::setGlobalValuesArray( $external_values, array(), $mappings );
+ }
+
+ /**
+ * Render the #get_ldap_data parser function
+ */
+ static function doGetLDAPData( &$parser ) {
+ global $edgCurPageName, $edgValues;
+
+ // if we're handling multiple pages, reset $edgValues
+ // when we move from one page to another
+ $cur_page_name = $parser->getTitle()->getText();
+ if ( ! isset( $edgCurPageName ) || $edgCurPageName != $cur_page_name ) {
+ $edgValues = array();
+ $edgCurPageName = $cur_page_name;
+ }
+
+ $params = func_get_args();
+ array_shift( $params ); // we already know the $parser ...
+ $args = EDUtils::parseParams( $params ); // parse params into name-value pairs
+ if ( array_key_exists( 'data', $args ) ) {
+ $mappings = EDUtils::paramToArray( $args['data'] ); // parse the data arg into mappings
+ } else {
+ return EDUtils::formatErrorMessage( wfMessage( 'externaldata-no-param-specified', 'data')->parse() );
+ }
+
+ if ( !array_key_exists( 'filter', $args ) ) {
+ return EDUtils::formatErrorMessage( wfMessage( 'externaldata-no-param-specified', 'filter')->parse() );
+ } elseif ( !array_key_exists( 'domain', $args ) ) {
+ return EDUtils::formatErrorMessage( wfMessage( 'externaldata-no-param-specified', 'domain')->parse() );
+ } else {
+ $external_values = EDUtils::getLDAPData( $args['filter'], $args['domain'], array_values( $mappings ) );
+ }
+
+ // Build $edgValues
+ foreach ( $external_values as $i => $row ) {
+ if ( !is_array( $row ) ) {
+ continue;
+ }
+ foreach ( $mappings as $local_var => $external_var ) {
+ if ( array_key_exists( $external_var, $row ) ) {
+ $edgValues[$local_var][] = $row[$external_var][0];
+ } else {
+ $edgValues[$local_var][] = '';
+ }
+ }
+ }
+ }
+
+ /**
+ * Render the #get_db_data parser function
+ */
+ static function doGetDBData( &$parser ) {
+ global $edgCurPageName, $edgValues;
+
+ // if we're handling multiple pages, reset $edgValues
+ // when we move from one page to another
+ $cur_page_name = $parser->getTitle()->getText();
+ if ( ! isset( $edgCurPageName ) || $edgCurPageName != $cur_page_name ) {
+ $edgValues = array();
+ $edgCurPageName = $cur_page_name;
+ }
+
+ $params = func_get_args();
+ array_shift( $params ); // we already know the $parser ...
+ $args = EDUtils::parseParams( $params ); // parse params into name-value pairs
+ $data = ( array_key_exists( 'data', $args ) ) ? $args['data'] : null;
+ if ( array_key_exists( 'db', $args ) ) {
+ $dbID = $args['db'];
+ } elseif ( array_key_exists( 'server', $args ) ) {
+ // For backwards-compatibility - 'db' parameter was
+ // added in External Data version 1.3.
+ $dbID = $args['server'];
+ } else {
+ return EDUtils::formatErrorMessage( wfMessage( 'externaldata-no-param-specified', 'db' )->parse() );
+ }
+ if ( array_key_exists( 'from', $args ) ) {
+ $from = $args['from'];
+ } else {
+ return EDUtils::formatErrorMessage( wfMessage( 'externaldata-no-param-specified', 'from')->parse() );
+ }
+ $conds = ( array_key_exists( 'where', $args ) ) ? $args['where'] : null;
+ $limit = ( array_key_exists( 'limit', $args ) ) ? $args['limit'] : null;
+ $orderBy = ( array_key_exists( 'order by', $args ) ) ? $args['order by'] : null;
+ $groupBy = ( array_key_exists( 'group by', $args ) ) ? $args['group by'] : null;
+ $sqlOptions = array( 'LIMIT' => $limit, 'ORDER BY' => $orderBy, 'GROUP BY' => $groupBy );
+ $joinOn = ( array_key_exists( 'join on', $args ) ) ? $args['join on'] : null;
+ $otherParams = array();
+ if ( array_key_exists('aggregate', $args ) ) {
+ $otherParams['aggregate'] = $args['aggregate'];
+ } elseif ( array_key_exists( 'find query', $args ) ) {
+ $otherParams['find query'] = $args['find query'];
+ }
+ $mappings = EDUtils::paramToArray( $data ); // parse the data arg into mappings
+
+ $external_values = EDUtils::getDBData( $dbID, $from, array_values( $mappings ), $conds, $sqlOptions, $joinOn, $otherParams );
+
+ // Handle error cases.
+ if ( !is_array( $external_values ) ) {
+ return EDUtils::formatErrorMessage( $external_values );
+ }
+
+ // Build $edgValues.
+ foreach ( $mappings as $local_var => $external_var ) {
+ if ( array_key_exists( $external_var, $external_values ) ) {
+ foreach ( $external_values[$external_var] as $value ) {
+ $edgValues[$local_var][] = $value;
+ }
+ }
+ }
+ }
+
+ /**
+ * Get the specified index of the array for the specified local
+ * variable retrieved by one of the #get... parser functions.
+ */
+ static function getIndexedValue( $var, $i ) {
+ global $edgValues;
+ if ( array_key_exists( $var, $edgValues ) && array_key_exists( $i, $edgValues[$var] ) ) {
+ return $edgValues[$var][$i];
+ } else {
+ return '';
+ }
+ }
+
+ /**
+ * Render the #external_value parser function
+ */
+ static function doExternalValue( &$parser, $local_var = '' ) {
+ global $edgValues, $edgExternalValueVerbose;
+ if ( ! array_key_exists( $local_var, $edgValues ) ) {
+ return $edgExternalValueVerbose ? EDUtils::formatErrorMessage( "Error: no local variable \"$local_var\" was set." ) : '';
+ } elseif ( is_array( $edgValues[$local_var] ) ) {
+ return $edgValues[$local_var][0];
+ } else {
+ return $edgValues[$local_var];
+ }
+ }
+
+ /**
+ * Render the #for_external_table parser function
+ */
+ static function doForExternalTable( &$parser, $expression = '' ) {
+ global $edgValues;
+
+ // Get the variables used in this expression, get the number
+ // of values for each, and loop through.
+ $matches = array();
+ preg_match_all( '/{{{([^}]*)}}}/', $expression, $matches );
+ $variables = $matches[1];
+ $num_loops = 0;
+
+ $commands = array( "urlencode", "htmlencode" );
+ // Used for a regexp check.
+ $commandsStr = implode( '|', $commands );
+
+ foreach ( $variables as $variable ) {
+ // If it ends with one of the pre-defined "commands",
+ // ignore the command to get the actual variable name.
+ foreach ( $commands as $command ) {
+ $variable = str_replace( $command, '', $variable );
+ }
+ $variable = str_replace( '.urlencode', '', $variable );
+ if ( array_key_exists( $variable, $edgValues ) ) {
+ $num_loops = max( $num_loops, count( $edgValues[$variable] ) );
+ }
+ }
+
+ $text = "";
+ for ( $i = 0; $i < $num_loops; $i++ ) {
+ $cur_expression = $expression;
+ foreach ( $variables as $variable ) {
+ // If it ends with one of the pre-defined "commands",
+ // ignore the command to get the actual variable name.
+ $matches = array();
+ preg_match( "/([^.]*)\.?($commandsStr)?$/", $variable, $matches );
+
+ $real_var = $matches[1];
+ if ( count( $matches ) == 3 ) {
+ $command = $matches[2];
+ } else {
+ $command = null;
+ }
+
+ switch( $command ) {
+ case "htmlencode":
+ $value = htmlentities( self::getIndexedValue( $real_var, $i ), ENT_COMPAT | ENT_HTML401| ENT_SUBSTITUTE, null, false );
+ break;
+ case "urlencode":
+ $value = urlencode( self::getIndexedValue( $real_var, $i ) );
+ break;
+ default:
+ $value = self::getIndexedValue( $real_var, $i );
+ }
+
+ $cur_expression = str_replace( '{{{' . $variable . '}}}', $value, $cur_expression );
+ }
+ $text .= $cur_expression;
+ }
+ return $text;
+ }
+
+ /**
+ * Render the #display_external_table parser function
+ *
+ * @author Dan Bolser
+ */
+ static function doDisplayExternalTable( &$parser ) {
+ global $edgValues;
+
+ $params = func_get_args();
+ array_shift( $params ); // we already know the $parser ...
+ $args = EDUtils::parseParams( $params ); // parse params into name-value pairs
+
+ if ( array_key_exists( 'template', $args ) ) {
+ $template = $args['template'];
+ } else {
+ return EDUtils::formatErrorMessage( "No template specified" );
+ }
+
+ if ( array_key_exists( 'data', $args ) ) {
+ // parse the 'data' arg into mappings
+ $mappings = EDUtils::paramToArray( $args['data'], false, false );
+ } else {
+ // or just use keys from edgValues
+ foreach ( $edgValues as $local_variable => $values ) {
+ $mappings[$local_variable] = $local_variable;
+ }
+ }
+
+ // The string placed in the wikitext between template calls -
+ // default is a newline.
+ if ( array_key_exists( 'delimiter', $args ) ) {
+ $delimiter = str_replace( '\n', "\n", $args['delimiter'] );
+ } else {
+ $delimiter = "\n";
+ }
+
+ $num_loops = 0; // May differ when multiple '#get_'s are used in one page
+ foreach ( $mappings as $template_param => $local_variable ) {
+ if ( !array_key_exists( $local_variable, $edgValues ) ) {
+ // Don't throw an error message - the source may just
+ // not publish this variable.
+ continue;
+ }
+ $num_loops = max( $num_loops, count( $edgValues[$local_variable] ) );
+ }
+
+ if ( array_key_exists( 'intro template', $args ) && $num_loops > 0) {
+ $text = '{{' . $args['intro template'] . '}}';
+ } else {
+ $text = "";
+ }
+ for ( $i = 0; $i < $num_loops; $i++ ) {
+ if ( $i > 0 ) {
+ $text .= $delimiter;
+ }
+ $text .= '{{' . $template;
+ foreach ( $mappings as $template_param => $local_variable ) {
+ $value = self::getIndexedValue( $local_variable, $i );
+ $text .= "|$template_param=$value";
+ }
+ $text .= "}}";
+ }
+ if ( array_key_exists( 'outro template', $args ) && $num_loops > 0 ) {
+ $text .= '{{' . $args['outro template'] . '}}';
+ }
+
+ // This actually 'calls' the template that we built above
+ return array( $text, 'noparse' => false );
+ }
+
+ /**
+ * Based on Semantic Internal Objects'
+ * SIOSubobjectHandler::doSetInternal().
+ */
+ public static function callSubobject( $parser, $params ) {
+ // This is a hack, since SMW's SMWSubobject::render() call is
+ // not meant to be called outside of SMW. However, this seemed
+ // like the better solution than copying over all of that
+ // method's code. Ideally, a true public function can be
+ // added to SMW, that handles a subobject creation, that this
+ // code can then call.
+
+ $subobjectArgs = array( &$parser );
+ // Blank first argument, so that subobject ID will be
+ // an automatically-generated random number.
+ $subobjectArgs[1] = '';
+ // "main" property, pointing back to the page.
+ $mainPageName = $parser->getTitle()->getText();
+ $mainPageNamespace = $parser->getTitle()->getNsText();
+ if ( $mainPageNamespace != '' ) {
+ $mainPageName = $mainPageNamespace . ':' . $mainPageName;
+ }
+ $subobjectArgs[2] = $params[0] . '=' . $mainPageName;
+
+ foreach ( $params as $i => $value ) {
+ if ( $i == 0 ) continue;
+ $subobjectArgs[] = $value;
+ }
+
+ // SMW 1.9+
+ $instance = \SMW\ParserFunctionFactory::newFromParser( $parser )->getSubobjectParser();
+ return $instance->parse( new SMW\ParserParameterFormatter( $subobjectArgs ) );
+ }
+
+ /**
+ * Render the #store_external_table parser function
+ */
+ static function doStoreExternalTable( &$parser ) {
+ global $edgValues;
+
+ $params = func_get_args();
+ array_shift( $params ); // we already know the $parser...
+
+ // Get the variables used in this expression, get the number
+ // of values for each, and loop through.
+ $expression = implode( '|', $params );
+ $matches = array();
+ preg_match_all( '/{{{([^}]*)}}}/', $expression, $matches );
+ $variables = $matches[1];
+ $num_loops = 0;
+ foreach ( $variables as $variable ) {
+ // ignore the presence of '.urlencode' - it's a command,
+ // not part of the actual variable name
+ $variable = str_replace( '.urlencode', '', $variable );
+ if ( array_key_exists( $variable, $edgValues ) ) {
+ $num_loops = max( $num_loops, count( $edgValues[$variable] ) );
+ }
+ }
+ $text = "";
+ for ( $i = 0; $i < $num_loops; $i++ ) {
+ // re-get $params
+ $params = func_get_args();
+ array_shift( $params );
+ foreach ( $params as $j => $param ) {
+ foreach ( $variables as $variable ) {
+ // If variable name ends with a ".urlencode",
+ // that's a command - URL-encode the value of
+ // the actual variable.
+ if ( strrpos( $variable, '.urlencode' ) === strlen( $variable ) - strlen( '.urlencode' ) ) {
+ $real_var = str_replace( '.urlencode', '', $variable );
+ $value = urlencode( self::getIndexedValue( $real_var , $i ) );
+ } else {
+ $value = self::getIndexedValue( $variable , $i );
+ }
+ $params[$j] = str_replace( '{{{' . $variable . '}}}', $value, $params[$j] );
+ }
+ }
+
+ self::callSubobject( $parser, $params );
+ }
+ return null;
+ }
+
+ /**
+ * Render the #clear_external_data parser function
+ */
+ static function doClearExternalData( &$parser ) {
+ global $edgValues;
+ $edgValues = array();
+ }
+}
diff --git a/www/wiki/extensions/ExternalData/includes/ED_Utils.php b/www/wiki/extensions/ExternalData/includes/ED_Utils.php
new file mode 100644
index 00000000..dc0ee222
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/includes/ED_Utils.php
@@ -0,0 +1,1071 @@
+<?php
+/**
+ * Utility functions for External Data
+ */
+
+class EDUtils {
+ // how many times to try an HTTP request
+ private static $http_number_of_tries = 3;
+
+ private static $ampersandReplacement = "THIS IS A LONG STRING USED AS A REPLACEMENT FOR AMPERSANDS 55555555";
+
+ /**
+ * Wraps error message in a span with the "error" class, for better
+ * display, and so that it can be handled correctly by #iferror and
+ * possibly others.
+ */
+ static function formatErrorMessage( $msg ) {
+ return '<span class="error">' . $msg . '</span>';
+ }
+
+ // XML-handling functions based on code found at
+ // http://us.php.net/xml_set_element_handler
+ static function startElement( $parser, $name, $attrs ) {
+ global $edgCurrentXMLTag, $edgCurrentValue, $edgXMLValues;
+ // set to all lowercase to avoid casing issues
+ $edgCurrentXMLTag = strtolower( $name );
+ $edgCurrentValue = '';
+ foreach ( $attrs as $attr => $value ) {
+ $attr = strtolower( $attr );
+ $value = str_replace( self::$ampersandReplacement, '&amp;', $value );
+ if ( array_key_exists( $attr, $edgXMLValues ) ) {
+ $edgXMLValues[$attr][] = $value;
+ } else {
+ $edgXMLValues[$attr] = array( $value );
+ }
+ }
+ }
+
+ static function endElement( $parser, $name ) {
+ global $edgCurrentXMLTag, $edgCurrentValue, $edgXMLValues;
+
+ if ( array_key_exists( $edgCurrentXMLTag, $edgXMLValues ) ) {
+ $edgXMLValues[$edgCurrentXMLTag][] = $edgCurrentValue;
+ } else {
+ $edgXMLValues[$edgCurrentXMLTag] = array( $edgCurrentValue );
+ }
+ // Clear the value both here and in startElement(), in case this
+ // is an embedded tag.
+ $edgCurrentValue = '';
+ }
+
+ /**
+ * Due to the strange way xml_set_character_data_handler() runs,
+ * getContent() may get called multiple times, once for each fragment
+ * of the text, for very long XML values. Given that, we keep a global
+ * variable with the current value and add to it.
+ */
+ static function getContent( $parser, $content ) {
+ global $edgCurrentValue;
+
+ // Replace ampersands, to avoid the XML getting split up
+ // around them.
+ // Note that this is *escaped* ampersands being replaced -
+ // this is unrelated to the fact that bare ampersands aren't
+ // allowed in XML.
+ $content = str_replace( self::$ampersandReplacement, '&amp;', $content );
+ $edgCurrentValue .= $content;
+ }
+
+ static function parseParams( $params ) {
+ $args = array();
+ foreach ( $params as $param ) {
+ $param = preg_replace ( "/\s\s+/", ' ', $param ); // whitespace
+ $param_parts = explode( "=", $param, 2 );
+ if ( count( $param_parts ) < 2 ) {
+ $args[$param_parts[0]] = null;
+ } else {
+ list( $name, $value ) = $param_parts;
+ $args[$name] = $value;
+ }
+ }
+ return $args;
+ }
+
+ /**
+ * Parses an argument of the form "a=b,c=d,..." into an array
+ */
+ static function paramToArray( $arg, $lowercaseKeys = false, $lowercaseValues = false ) {
+ $arg = preg_replace ( "/\s\s+/", ' ', $arg ); // whitespace
+
+ // Split text on commas, except for commas found within quotes
+ // and parentheses. Regular expression based on:
+ // http://stackoverflow.com/questions/1373735/regexp-split-string-by-commas-and-spaces-but-ignore-the-inside-quotes-and-parent#1381895
+ // ...with modifications by Nick Lindridge, ionCube Ltd.
+ $pattern = <<<END
+ /
+ [,]
+ (?=(?:(?:[^"]*"){2})*[^"]*$)
+ (?=(?:(?:[^']*'){2})*[^']*$)
+ (?=(?:[^()]*+\([^()]*+\))*+[^()]*+$)
+ /x
+END;
+ // " - fix for color highlighting in vi :)
+ $keyValuePairs = preg_split( $pattern, $arg );
+
+ $returnArray = array();
+ foreach ( $keyValuePairs as $keyValuePair ) {
+ $keyAndValue = explode( '=', $keyValuePair, 2 );
+ if ( count( $keyAndValue ) == 2 ) {
+ $key = trim( $keyAndValue[0] );
+ if ( $lowercaseKeys ) {
+ $key = strtolower( $key );
+ }
+ $value = trim( $keyAndValue[1] );
+ if ( $lowercaseValues ) {
+ $value = strtolower( $value );
+ }
+ $returnArray[$key] = $value;
+ }
+ }
+ return $returnArray;
+ }
+
+ static function getLDAPData( $filter, $domain, $params ) {
+ global $edgLDAPServer;
+ global $edgLDAPUser;
+ global $edgLDAPPass;
+
+ $ds = self::connectLDAP( $edgLDAPServer[$domain], $edgLDAPUser[$domain], $edgLDAPPass[$domain] );
+ $results = self::searchLDAP( $ds, $domain, $filter, $params );
+
+ return $results;
+ }
+
+ static function connectLDAP( $server, $username, $password ) {
+ $ds = ldap_connect( $server );
+ if ( $ds ) {
+ // these options for Active Directory only?
+ ldap_set_option( $ds, LDAP_OPT_PROTOCOL_VERSION, 3 );
+ ldap_set_option( $ds, LDAP_OPT_REFERRALS, 0 );
+
+ if ( $username ) {
+ $r = ldap_bind( $ds, $username, $password );
+ } else {
+ # no username, so do anonymous bind
+ $r = ldap_bind( $ds );
+ }
+
+ # should check the result of the bind here
+ return $ds;
+ } else {
+ echo wfMessage( "externaldata-ldap-unable-to-connect", $server )->text();
+ }
+ }
+
+ static function searchLDAP( $ds, $domain, $filter, $attributes ) {
+ global $edgLDAPBaseDN;
+
+ $sr = ldap_search( $ds, $edgLDAPBaseDN[$domain], $filter, $attributes );
+ $results = ldap_get_entries( $ds, $sr );
+ return $results;
+ }
+
+ static function getArrayValue( $arrayName, $key ) {
+ if ( array_key_exists( $key, $arrayName ) ) {
+ return $arrayName[$key];
+ } else {
+ return null;
+ }
+ }
+
+ static function getDBData( $dbID, $from, $columns, $where, $sqlOptions, $joinOn, $otherParams ) {
+ global $edgDBServerType;
+ global $edgDBServer;
+ global $edgDBDirectory;
+ global $edgDBName;
+ global $edgDBUser;
+ global $edgDBPass;
+ global $edgDBFlags;
+ global $edgDBTablePrefix;
+
+ // Get all possible parameters
+ $db_type = self::getArrayValue( $edgDBServerType, $dbID );
+ $db_server = self::getArrayValue( $edgDBServer, $dbID );
+ $db_directory = self::getArrayValue( $edgDBDirectory, $dbID );
+ $db_name = self::getArrayValue( $edgDBName, $dbID );
+ $db_username = self::getArrayValue( $edgDBUser, $dbID );
+ $db_password = self::getArrayValue( $edgDBPass, $dbID );
+ $db_flags = self::getArrayValue( $edgDBFlags, $dbID );
+ $db_tableprefix = self::getArrayValue( $edgDBTablePrefix, $dbID );
+
+ // MongoDB has entirely different handling from the rest.
+ if ( $db_type == 'mongodb' ) {
+ if ( $db_name == '' ) {
+ return wfMessage( "externaldata-db-incomplete-information" )->text();
+ }
+ return self::getMongoDBData( $db_server, $db_username, $db_password, $db_name, $from, $columns, $where, $sqlOptions, $otherParams );
+ }
+
+ // Validate parameters
+ if ( $db_type == '' ) {
+ return wfMessage( "externaldata-db-incomplete-information" )->text();
+ } elseif ( $db_type == 'sqlite' ) {
+ if ( $db_directory == '' || $db_name == '' ) {
+ return wfMessage( "externaldata-db-incomplete-information" )->text();
+ }
+ } else {
+ // We don't check the username or password because they
+ // could legitimately be blank or null.
+ if ( $db_server == '' || $db_name == '' ) {
+ return wfMessage( "externaldata-db-incomplete-information" )->text();
+ }
+ }
+
+ if ( $db_flags == '' ) {
+ $db_flags = DBO_DEFAULT;
+ }
+
+ $dbConnectionParams = array(
+ 'host' => $db_server,
+ 'user' => $db_username,
+ 'password' => $db_password,
+ 'dbname' => $db_name,
+ 'flags' => $db_flags,
+ 'tablePrefix' => $db_tableprefix,
+ );
+ if ( $db_type == 'sqlite' ) {
+ $dbConnectionParams['dbDirectory'] = $db_directory;
+ }
+
+ // DatabaseBase::factory() was replaced by Database::factory()
+ // in MW 1.28.
+ if ( method_exists( 'Database', 'factory' ) ) {
+ $db = Database::factory( $db_type, $dbConnectionParams );
+ } else {
+ $db = DatabaseBase::factory( $db_type, $dbConnectionParams );
+ }
+
+ if ( $db == null ) {
+ return wfMessage( "externaldata-db-unknown-type" )->text();
+ }
+
+ if ( ! $db->isOpen() ) {
+ return wfMessage( "externaldata-db-could-not-connect" )->text();
+ }
+
+ if ( count( $columns ) == 0 ) {
+ return wfMessage( "externaldata-db-no-return-values" )->text();
+ }
+
+ $rows = self::searchDB( $db, $from, $columns, $where, $sqlOptions, $joinOn );
+ $db->close();
+
+ if ( !is_array( $rows ) ) {
+ // It's an error message.
+ return $rows;
+ }
+
+ $values = array();
+ foreach ( $rows as $row ) {
+ foreach ( $columns as $column ) {
+ $values[$column][] = $row[$column];
+ }
+ }
+
+ return $values;
+ }
+
+ static function getValueFromJSONArray( array $origArray, $path, $default = null ) {
+ $current = $origArray;
+ $token = strtok( $path, '.' );
+
+ while ( $token !== false ) {
+ if ( !isset( $current[$token] ) ) {
+ return $default;
+ }
+ $current = $current[$token];
+ $token = strtok( '.' );
+ }
+ return $current;
+ }
+
+ /**
+ * Handles #get_db_data for the non-relational database system
+ * MongoDB.
+ */
+ static function getMongoDBData( $db_server, $db_username, $db_password, $db_name, $from, $columns, $where, $sqlOptions, $otherParams ) {
+ global $wgMainCacheType, $wgMemc, $edgMemCachedMongoDBSeconds;
+
+ // Use MEMCACHED if configured to cache mongodb queries.
+ if ($wgMainCacheType === CACHE_MEMCACHED && $edgMemCachedMongoDBSeconds > 0) {
+ // Check if cache entry exists.
+ $mckey = wfMemcKey( 'mongodb', $from, md5(json_encode($otherParams) . json_encode($columns) . $where . json_encode($sqlOptions) . $db_name . $db_server));
+ $values = $wgMemc->get( $mckey );
+
+ if ($values !== false) {
+ return $values;
+ }
+ }
+
+ // MongoDB login is done using a single string.
+ // When specifying extra connect string options (e.g. replicasets,timeout, etc.),
+ // use $db_server to pass these values
+ // see http://docs.mongodb.org/manual/reference/connection-string
+ $connect_string = "mongodb://";
+ if ( $db_username != '' ) {
+ $connect_string .= $db_username . ':' . $db_password . '@';
+ }
+ if ( $db_server != '') {
+ $connect_string .= $db_server;
+ } else {
+ $connect_string .= 'localhost:27017';
+ }
+
+ // Use try/catch to suppress error messages, which would show
+ // the MongoDB connect string, which may have sensitive
+ // information.
+ try {
+ $m = new MongoClient( $connect_string );
+ } catch ( Exception $e ) {
+ return wfMessage( "externaldata-db-could-not-connect" )->text();
+ }
+
+ $db = $m->selectDB( $db_name );
+
+ // Check if collection exists
+ if ( $db->system->namespaces->findOne( array( 'name'=>$db_name . "." . $from ) ) === null ){
+ return wfMessage( "externaldata-db-unknown-collection:")->text() . $db_name . "." . $from;
+ }
+
+ $collection = new MongoCollection( $db, $from );
+
+ $findArray = array();
+ $aggregateArray = array();
+ // Was an aggregation pipeline command issued?
+ if ( array_key_exists('aggregate', $otherParams ) ) {
+ // The 'aggregate' parameter should be an array of
+ // aggregation JSON pipeline commands.
+ // Note to users: be sure to use spaces between curly
+ // brackets in the 'aggregate' JSON so as not to trip up the
+ // MW parser.
+ $aggregateArray = json_decode ($otherParams['aggregate'], true);
+ } elseif ( array_key_exists( 'find query', $otherParams ) ) {
+ // Otherwise, was a direct MongoDB "find" query JSON string provided?
+ // If so, use that. As with 'aggregate' JSON, use spaces
+ // between curly brackets
+ $findArray = json_decode ($otherParams['find query'], true);
+ } elseif ( $where != '' ) {
+ // If not, turn the SQL of the "where=" parameter into
+ // a "find" array for MongoDB. Note that this approach
+ // is only appropriate for simple find queries, that
+ // use the operators OR, AND, >=, >, <=, < and LIKE
+ // - and NO NUMERIC LITERALS.
+ $where = str_ireplace( ' and ', ' AND ', $where );
+ $where = str_ireplace( ' like ', ' LIKE ', $where );
+ $whereElements = explode( ' AND ', $where );
+ foreach ( $whereElements as $whereElement ) {
+ if ( strpos( $whereElement, '>=' ) ) {
+ list( $fieldName, $value ) = explode( '>=', $whereElement );
+ $findArray[trim( $fieldName )] = array( '$gte' => trim( $value ) );
+ } elseif ( strpos( $whereElement, '>' ) ) {
+ list( $fieldName, $value ) = explode( '>', $whereElement );
+ $findArray[trim( $fieldName )] = array( '$gt' => trim( $value ) );
+ } elseif ( strpos( $whereElement, '<=' ) ) {
+ list( $fieldName, $value ) = explode( '<=', $whereElement );
+ $findArray[trim( $fieldName )] = array( '$lte' => trim( $value ) );
+ } elseif ( strpos( $whereElement, '<' ) ) {
+ list( $fieldName, $value ) = explode( '<', $whereElement );
+ $findArray[trim( $fieldName )] = array( '$lt' => trim( $value ) );
+ } elseif ( strpos( $whereElement, ' LIKE ' ) ) {
+ list( $fieldName, $value ) = explode( ' LIKE ', $whereElement );
+ $value = trim( $value );
+ $regex = new MongoRegex( "/$value/i" );
+ $findArray[trim( $fieldName )] = $regex;
+ } else {
+ list( $fieldName, $value ) = explode( '=', $whereElement );
+ $findArray[trim( $fieldName )] = trim( $value );
+ }
+ }
+ }
+
+ // Do the same for the "order=" parameter as the "where=" parameter
+ $sortArray = array();
+ if ( $sqlOptions['ORDER BY'] != '' ) {
+ $sortElements = explode( ',', $sqlOptions['ORDER BY'] );
+ foreach ( $sortElements as $sortElement ) {
+ $parts = explode( ' ', $sortElement );
+ $fieldName = $parts[0];
+ $orderingNum = 1;
+ if ( count( $parts ) > 1 ) {
+ if ( strtolower( $parts[1] ) == 'desc' ) {
+ $orderingNum = -1;
+ }
+ }
+ $sortArray[$fieldName] = $orderingNum;
+ }
+ }
+
+ // Get the data!
+ if ( array_key_exists( 'aggregate', $otherParams ) ) {
+ if ( $sqlOptions['ORDER BY'] != '') {
+ $aggregateArray[] = array( '$sort' => $sortArray );
+ }
+ if ( $sqlOptions['LIMIT'] != '' ) {
+ $aggregateArray[] = array( '$limit' => intval( $sqlOptions['LIMIT'] ) );
+ }
+ $aggregateResult = $collection->aggregate( $aggregateArray );
+ $resultsCursor = $aggregateResult['result'];
+ } else {
+ $resultsCursor = $collection->find( $findArray, $columns )->sort( $sortArray )->limit( $sqlOptions['LIMIT'] );
+ }
+
+ $values = array();
+ foreach ( $resultsCursor as $doc ) {
+ foreach ( $columns as $column ) {
+ if ( strstr($column, ".") ) {
+ // If the exact path of the value was
+ // specified using dots (e.g., "a.b.c"),
+ // get the value that way.
+ $values[$column][] = self::getValueFromJSONArray( $doc, $column );
+ } elseif ( isset( $doc[$column] ) && is_array( $doc[$column] ) ) {
+ // If MongoDB returns an array for a column,
+ // but the exact location of the value wasn't specified,
+ // do some extra processing.
+ if ( $column == 'geometry' && array_key_exists( 'coordinates', $doc['geometry'] ) ) {
+ // Check if it's GeoJSON geometry:
+ // http://www.geojson.org/geojson-spec.html#geometry-objects
+ // If so, return it in a format that
+ // the Maps extension can understand.
+ $coordinates = $doc['geometry']['coordinates'][0];
+ $coordinateStrings = array();
+ foreach ( $coordinates as $coordinate ) {
+ $coordinateStrings[] = $coordinate[1] . ',' . $coordinate[0];
+ }
+ $values[$column][] = implode( ':', $coordinateStrings );
+ } else {
+ // Just return it as JSON, the
+ // lingua franca of MongoDB.
+ $values[$column][] = json_encode( $doc[$column] );
+ }
+ } else {
+ // It's a simple literal.
+ $values[$column][] = (isset( $doc[$column] ) ? $doc[$column] : null);
+ }
+ }
+ }
+
+ if ($wgMainCacheType === CACHE_MEMCACHED && $edgMemCachedMongoDBSeconds > 0 ) {
+ $wgMemc->set( $mckey, $values, $edgMemCachedMongoDBSeconds );
+ }
+
+ return $values;
+ }
+
+ static function searchDB( $db, $from, $vars, $conds, $sqlOptions, $joinOn ) {
+ // The format of $from can be just "TableName", or the more
+ // complex "Table1=Alias1,Table2=Alias2,...".
+ $tables = array();
+ $tableStrings = explode( ',', $from );
+ foreach ( $tableStrings as $tableString ) {
+ if ( strpos( $tableString, '=' ) !== false ) {
+ $tableStringParts = explode( '=', $tableString, 2 );
+ $tableName = trim( $tableStringParts[0] );
+ $alias = trim( $tableStringParts[1] );
+ } else {
+ $tableName = $alias = trim( $tableString);
+ }
+ $tables[$alias] = $tableName;
+ }
+ $joinConds = array();
+ $joinStrings = explode( ',', $joinOn );
+ foreach ( $joinStrings as $i => $joinString ) {
+ if ( $joinString == '' ) {
+ continue;
+ }
+ if ( strpos( $joinString, '=' ) === false ) {
+ return "Error: every \"join on\" string must contain an \"=\" sign.";
+ }
+ if ( count( $tables ) <= $i + 1 ) {
+ return "Error: too many \"join on\" conditions.";
+ }
+ $aliases = array_keys( $tables );
+ $alias = $aliases[$i + 1];
+ $joinConds[$alias] = array( 'JOIN', $joinString );
+ }
+ $result = $db->select( $tables, $vars, $conds, 'EDUtils::searchDB', $sqlOptions, $joinConds );
+ if ( !$result ) {
+ return wfMessage( "externaldata-db-invalid-query" )->text();
+ }
+
+ $rows = array();
+ while ( $row = $db->fetchRow( $result ) ) {
+ // Create a new row object that uses the passed-in
+ // column names as keys, so that there's always an
+ // exact match between what's in the query and what's
+ // in the return value (so that "a.b", for instance,
+ // doesn't get chopped off to just "b").
+ $new_row = array();
+ foreach ( $vars as $i => $column_name ) {
+ $dbField = $row[$i];
+ // This can happen with MSSQL.
+ if ( $dbField instanceof DateTime ) {
+ $dbField = $dbField->format('Y-m-d H:i:s');
+ }
+ // Convert the encoding to UTF-8
+ // if necessary - based on code at
+ // http://www.php.net/manual/en/function.mb-detect-encoding.php#102510
+ if ( !function_exists( 'mb_detect_encoding' ) ||
+ mb_detect_encoding( $dbField, 'UTF-8', true ) == 'UTF-8' ) {
+ $new_row[$column_name] = $dbField;
+ } else {
+ $new_row[$column_name] = utf8_encode( $dbField );
+ }
+ }
+ $rows[] = $new_row;
+ }
+ return $rows;
+ }
+
+ static function getXMLData( $xml ) {
+ global $edgXMLValues;
+ $edgXMLValues = array();
+
+ // Remove comments from XML - for some reason, xml_parse()
+ // can't handle them.
+ $xml = preg_replace( '/<!--.*?-->/s', '', $xml );
+
+ // Also, re-insert ampersands, after they were removed to
+ // avoid parsing problems.
+ $xml = str_replace( '&amp;', self::$ampersandReplacement, $xml );
+
+ $xml_parser = xml_parser_create();
+ xml_set_element_handler( $xml_parser, array( 'EDUtils', 'startElement' ), array( 'EDUtils', 'endElement' ) );
+ xml_set_character_data_handler( $xml_parser, array( 'EDUtils', 'getContent' ) );
+ if ( !xml_parse( $xml_parser, $xml, true ) ) {
+ return wfMessage( 'externaldata-xml-error',
+ xml_error_string( xml_get_error_code( $xml_parser ) ),
+ xml_get_current_line_number( $xml_parser ) )->text();
+ }
+ xml_parser_free( $xml_parser );
+ return $edgXMLValues;
+ }
+
+ static function isNodeNotEmpty( $node ) {
+ return trim( $node[0] ) != '';
+ }
+
+ static function filterEmptyNodes( $nodes ) {
+ if ( !is_array( $nodes ) ) return $nodes;
+ return array_filter( $nodes, array( 'EDUtils', 'isNodeNotEmpty' ) );
+ }
+
+ static function getXPathData( $xml, $mappings, $ns ) {
+ global $edgXMLValues;
+
+ try {
+ $sxml = new SimpleXMLElement( $xml );
+ } catch ( Exception $e ) {
+ return "Caught exception parsing XML: " . $e->getMessage();
+ }
+ $edgXMLValues = array();
+
+ foreach ( $mappings as $local_var => $xpath ) {
+ // First, register any necessary XML namespaces, to
+ // avoid "Undefined namespace prefix" errors.
+ $matches = array();
+ preg_match_all( '/[\/\@]([a-zA-Z0-9]*):/', $xpath, $matches );
+ foreach ( $matches[1] as $namespace ) {
+ $sxml->registerXPathNamespace( $namespace, $ns );
+ }
+
+ // Now, get all the matching values, and remove any
+ // empty results.
+ $nodes = self::filterEmptyNodes( $sxml->xpath( $xpath ) );
+ if ( !$nodes ) {
+ continue;
+ }
+
+ // Convert from SimpleXMLElement to string.
+ $nodesArray = array();
+ foreach ( $nodes as $xmlNode ) {
+ $nodesArray[] = (string)$xmlNode;
+ }
+
+ if ( array_key_exists( $xpath, $edgXMLValues ) ) {
+ // At the moment, this code will never get
+ // called, because duplicate values in
+ // $mappings will have been removed already.
+ $edgXMLValues[$xpath] = array_merge( $edgXMLValues[$xpath], $nodesArray );
+ } else {
+ $edgXMLValues[$xpath] = $nodesArray;
+ }
+ }
+ return $edgXMLValues;
+ }
+
+ static function getValuesFromCSVLine( $csv_line ) {
+ // regular expression copied from http://us.php.net/fgetcsv
+ $vals = preg_split( '/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/', $csv_line );
+ $vals2 = array();
+ foreach ( $vals as $val ) {
+ $vals2[] = trim( $val, '"' );
+ }
+ return $vals2;
+ }
+
+ static function getCSVData( $csv, $has_header, $delimiter = ',' ) {
+ // from http://us.php.net/manual/en/function.str-getcsv.php#88311
+ // str_getcsv() is a function that was only added in PHP 5.3.0,
+ // so use the much older fgetcsv() if it's not there
+
+ // actually, for now, always use fgetcsv(), since this call to
+ // str_getcsv() doesn't work, and I can't test/debug it at the
+ // moment
+ //if ( function_exists( 'str_getcsv' ) ) {
+ // $table = str_getcsv( $csv );
+ //} else {
+ $fiveMBs = 5 * 1024 * 1024;
+ $fp = fopen( "php://temp/maxmemory:$fiveMBs", 'r+' );
+ fputs( $fp, $csv );
+ rewind( $fp );
+ $table = array();
+ while ( $line = fgetcsv( $fp, 0, $delimiter ) ) {
+ array_push( $table, $line );
+ }
+ fclose( $fp );
+ //}
+
+ // Get rid of blank characters - these sometimes show up
+ // for certain encodings.
+ foreach( $table as $i => $row ) {
+ foreach ( $row as $j => $cell ) {
+ $table[$i][$j] = str_replace( chr(0), '', $cell );
+ }
+ }
+
+ // Get rid of the "byte order mark", if it's there - it could
+ // be one of a variety of options, depending on the encoding.
+ // Code copied in part from:
+ // http://artur.ejsmont.org/blog/content/annoying-utf-byte-order-marks
+ $sets = array(
+ "\xFE",
+ "\xFF",
+ "\xFE\xFF",
+ "\xFF\xFE",
+ "\xEF\xBB\xBF",
+ "\x2B\x2F\x76",
+ "\xF7\x64\x4C",
+ "\x0E\xFE\xFF",
+ "\xFB\xEE\x28",
+ "\x00\x00\xFE\xFF",
+ "\xDD\x73\x66\x73",
+ );
+ $decodedFirstCell = utf8_decode( $table[0][0] );
+ foreach ( $sets as $set ) {
+ if ( 0 == strncmp( $decodedFirstCell, $set, strlen( $set ) ) ) {
+ $table[0][0] = substr( $decodedFirstCell, strlen( $set ) + 1 );
+ break;
+ }
+ }
+
+ // Another "byte order mark" test, this one copied from the
+ // Data Transfer extension - somehow the first one doesn't work
+ // in all cases.
+ $byteOrderMark = pack( "CCC", 0xef, 0xbb, 0xbf );
+ if ( 0 == strncmp( $table[0][0], $byteOrderMark, 3 ) ) {
+ $table[0][0] = substr( $table[0][0], 3 );
+ }
+
+ // Get header values, if this is 'csv with header'
+ if ( $has_header ) {
+ $header_vals = array_shift( $table );
+ // On the off chance that there are one or more blank
+ // lines at the beginning, cycle through.
+ while ( count( $header_vals ) == 0 ) {
+ $header_vals = array_shift( $table );
+ }
+ }
+
+ // Unfortunately, some subpar CSV generators don't include
+ // trailing commas, so that a line that should look like
+ // "A,B,,," instead is just printed as "A,B".
+ // To get around this, we first figure out the correct number
+ // of columns in this table - which depends on whether the
+ // CSV has a header or not.
+ if ( $has_header ) {
+ $num_columns = count( $header_vals );
+ } else {
+ $num_columns = 0;
+ foreach ( $table as $line ) {
+ $num_columns = max( $num_columns, count( $line ) );
+ }
+ }
+
+ // Now "flip" the data, turning it into a column-by-column
+ // array, instead of row-by-row.
+ $values = array();
+ foreach ( $table as $line ) {
+ for ( $i = 0; $i < $num_columns; $i++ ) {
+ // This check is needed in case it's an
+ // uneven CSV file (see above).
+ if ( array_key_exists( $i, $line ) ) {
+ $row_val = trim( $line[$i] );
+ } else {
+ $row_val = '';
+ }
+ if ( $has_header ) {
+ $column = strtolower( trim( $header_vals[$i] ) );
+ } else {
+ // start with an index of 1 instead of 0
+ $column = $i + 1;
+ }
+ if ( array_key_exists( $column, $values ) ) {
+ $values[$column][] = $row_val;
+ } else {
+ $values[$column] = array( $row_val );
+ }
+ }
+ }
+ return $values;
+ }
+
+ /**
+ * This function handles version 3 of the genomic-data format GFF,
+ * defined here:
+ * http://www.sequenceontology.org/gff3.shtml
+ */
+ static function getGFFData( $gff ) {
+ // use an fgetcsv() call, similar to the one in getCSVData()
+ // (fgetcsv() can handle delimiters other than commas, in this
+ // case a tab)
+ $fiveMBs = 5 * 1024 * 1024;
+ $fp = fopen( "php://temp/maxmemory:$fiveMBs", 'r+' );
+ fputs( $fp, $gff );
+ rewind( $fp );
+ $table = array();
+ while ( $line = fgetcsv( $fp, null, "\t" ) ) {
+ // ignore comment lines
+ if ( strpos( $line[0], '##' ) !== 0 ) {
+ // special handling for final 'attributes' column
+ if ( array_key_exists( 8, $line ) ) {
+ $attributes = explode( ';', $line[8] );
+ foreach ( $attributes as $attribute ) {
+ $keyAndValue = explode( '=', $attribute, 2 );
+ if ( count( $keyAndValue ) == 2 ) {
+ $key = strtolower( $keyAndValue[0] );
+ $value = $keyAndValue[1];
+ $line[$key] = $value;
+ }
+ }
+ }
+ array_push( $table, $line );
+ }
+ }
+ fclose( $fp );
+
+ $values = array();
+ foreach ( $table as $line ) {
+ foreach ( $line as $i => $row_val ) {
+ // each of the columns in GFF have a
+ // pre-defined name - even the last column
+ // has its own name, "attributes"
+ if ( $i === 0 ) {
+ $column = 'seqid';
+ } elseif ( $i == 1 ) {
+ $column = 'source';
+ } elseif ( $i == 2 ) {
+ $column = 'type';
+ } elseif ( $i == 3 ) {
+ $column = 'start';
+ } elseif ( $i == 4 ) {
+ $column = 'end';
+ } elseif ( $i == 5 ) {
+ $column = 'score';
+ } elseif ( $i == 6 ) {
+ $column = 'strand';
+ } elseif ( $i == 7 ) {
+ $column = 'phase';
+ } elseif ( $i == 8 ) {
+ $column = 'attributes';
+ } else {
+ // this is hopefully an attribute key
+ $column = $i;
+ }
+ if ( array_key_exists( $column, $values ) ) {
+ $values[$column][] = $row_val;
+ } else {
+ $values[$column] = array( $row_val );
+ }
+ }
+ }
+ return $values;
+ }
+
+ /**
+ * Helper function that determines whether an array holds a simple
+ * list of scalar values, with no keys (i.e., not an associative
+ * array).
+ */
+ static function holdsSimpleList( $arr ) {
+ $expectedKey = 0;
+ foreach( $arr as $key => $val ) {
+ if ( is_array( $val ) || $key != $expectedKey++ ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Recursive JSON-parsing function for use by getJSONData().
+ */
+ static function parseTree( $tree, &$retrieved_values ) {
+ foreach ( $tree as $key => $val ) {
+ // TODO - this logic could probably be a little nicer.
+ if ( is_array( $val ) && self::holdsSimpleList( $val ) ) {
+ // If it just holds a simple list, turn the
+ // array into a comma-separated list, then
+ // pass it back in in order to do the final // processing.
+ $val = array( $key => implode( ', ', $val ) );
+ self::parseTree( $val, $retrieved_values );
+ } elseif ( is_array( $val ) && count( $val ) > 1 ) {
+ self::parseTree( $val, $retrieved_values );
+ } elseif ( is_array( $val ) && count( $val ) == 1 && is_array( current( $val ) ) ) {
+ self::parseTree( current( $val ), $retrieved_values );
+ } else {
+ // If it's an array with just one element,
+ // treat it like a regular value.
+ // (Why is the null check necessary?)
+ if ( $val != null && is_array( $val ) ) {
+ $val = current( $val );
+ }
+ $key = strtolower( $key );
+ if ( array_key_exists( $key, $retrieved_values ) ) {
+ $retrieved_values[$key][] = $val;
+ } else {
+ $retrieved_values[$key] = array( $val );
+ }
+ }
+ }
+ }
+
+ static function getJSONData( $json, $prefixLength ) {
+ $json = substr( $json, $prefixLength );
+ $json_tree = FormatJson::decode( $json, true );
+ if ( is_null( $json_tree ) ) {
+ // It's probably invalid JSON.
+ return wfMessage( 'externaldata-invalid-json' )->text();
+ }
+ $values = array();
+ if ( is_array( $json_tree ) ) {
+ self::parseTree( $json_tree, $values );
+ }
+ return $values;
+ }
+
+ static function fetchURL( $url, $post_vars = array(), $cacheExpireTime = 0, $get_fresh = false, $try_count = 1 ) {
+ $dbr = wfGetDB( DB_SLAVE );
+ global $edgStringReplacements, $edgCacheTable, $edgAllowSSL;
+
+ if ( $post_vars ) {
+ return Http::post( $url, array( 'postData' => $post_vars ) );
+ }
+
+ // do any special variable replacements in the URLs, for
+ // secret API keys and the like
+ foreach ( $edgStringReplacements as $key => $value ) {
+ $url = str_replace( $key, $value, $url );
+ }
+
+ if ( !isset( $edgCacheTable ) || is_null( $edgCacheTable ) ) {
+ if ( $edgAllowSSL ) {
+ $contents = Http::get( $url, 'default', array( 'sslVerifyCert' => false, 'followRedirects' => false ) );
+ } else {
+ $contents = Http::get( $url );
+ }
+ // Handle non-UTF-8 encodings.
+ // Copied from http://www.php.net/manual/en/function.file-get-contents.php#85008
+ // Unfortunately, 'mbstring' functions are not available
+ // in all PHP installations.
+ if ( function_exists( 'mb_convert_encoding' ) ) {
+ $contents = mb_convert_encoding( $contents, 'UTF-8',
+ mb_detect_encoding( $contents, 'UTF-8, ISO-8859-1', true ) );
+ }
+ return $contents;
+ }
+
+ // check the cache (only the first 254 chars of the url)
+ $row = $dbr->selectRow( $edgCacheTable, '*', array( 'url' => substr( $url, 0, 254 ) ), 'EDUtils::fetchURL' );
+
+ if ( $row && ( ( time() - $row->req_time ) > $cacheExpireTime ) ) {
+ $get_fresh = true;
+ }
+
+ if ( !$row || $get_fresh ) {
+ if ( $edgAllowSSL ) {
+ $page = Http::get( $url, 'default', array( CURLOPT_SSL_VERIFYPEER => false ) );
+ } else {
+ $page = Http::get( $url );
+ }
+ if ( $page === false ) {
+ sleep( 1 );
+ if ( $try_count >= self::$http_number_of_tries ) {
+ echo wfMessage( 'externaldata-db-could-not-get-url', self::$http_number_of_tries )->text();
+ return '';
+ }
+ $try_count++;
+ return self::fetchURL( $url, $post_vars, $cacheExpireTime, $get_fresh, $try_count );
+ }
+ if ( $page != '' ) {
+ $dbw = wfGetDB( DB_MASTER );
+ // Delete the old entry, if one exists.
+ $dbw->delete( $edgCacheTable, array( 'url' => substr( $url, 0, 254 )));
+ // Insert contents into the cache table.
+ $dbw->insert( $edgCacheTable, array( 'url' => substr( $url, 0, 254 ), 'result' => $page, 'req_time' => time() ) );
+ return $page;
+ }
+ } else {
+ return $row->result;
+ }
+ }
+
+ static private function getDataFromText( $contents, $format, $mappings, $source, $prefixLength = 0 ) {
+ // For now, this is only done for the CSV formats.
+ if ( is_array( $format ) ) {
+ list( $format, $delimiter ) = $format;
+ } else {
+ $delimiter = ',';
+ }
+
+ if ( $format == 'xml' ) {
+ return self::getXMLData( $contents );
+ } elseif ( $format == 'xml with xpath' ) {
+ return self::getXPathData( $contents, $mappings, $source );
+ } elseif ( $format == 'csv' ) {
+ return self::getCSVData( $contents, false, $delimiter );
+ } elseif ( $format == 'csv with header' ) {
+ return self::getCSVData( $contents, true, $delimiter );
+ } elseif ( $format == 'json' ) {
+ return self::getJSONData( $contents, $prefixLength );
+ } elseif ( $format == 'gff' ) {
+ return self::getGFFData( $contents );
+ } else {
+ return wfMessage( 'externaldata-web-invalid-format', $format )->text();
+ }
+ }
+
+ /**
+ * Checks whether this URL is allowed, based on the
+ * $edgAllowExternalDataFrom whitelist
+ */
+ static public function isURLAllowed( $url ) {
+ // this code is based on Parser::maybeMakeExternalImage()
+ global $edgAllowExternalDataFrom;
+ $data_from = $edgAllowExternalDataFrom;
+ $text = false;
+ if ( empty( $data_from ) ) {
+ return true;
+ } elseif ( is_array( $data_from ) ) {
+ foreach ( $data_from as $match ) {
+ if ( strpos( $url, $match ) === 0 ) {
+ return true;
+ }
+ }
+ return false;
+ } else {
+ if ( strpos( $url, $data_from ) === 0 ) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+
+ static public function getDataFromURL( $url, $format, $mappings, $postData = null, $cacheExpireTime, $prefixLength ) {
+ $url_contents = self::fetchURL( $url, $postData, $cacheExpireTime );
+ // Show an error message if there's nothing there.
+ if ( empty( $url_contents ) ) {
+ return "Error: No contents found at URL $url.";
+ }
+
+ return self::getDataFromText( $url_contents, $format, $mappings, $url, $prefixLength );
+ }
+
+ static private function getDataFromPath( $path, $format, $mappings ) {
+ if ( !file_exists( $path ) ) {
+ return "Error: No file found.";
+ }
+ $file_contents = file_get_contents( $path );
+ // Show an error message if there's nothing there.
+ if ( empty( $file_contents ) ) {
+ return "Error: Unable to get file contents.";
+ }
+
+ return self::getDataFromText( $file_contents, $format, $mappings, $path );
+ }
+
+ static public function getDataFromFile( $file, $format, $mappings ) {
+ global $edgFilePath;
+
+ if ( array_key_exists( $file, $edgFilePath ) ) {
+ return self::getDataFromPath( $edgFilePath[$file], $format, $mappings );
+ } else {
+ return "Error: No file is set for ID \"$file\".";
+ }
+ }
+
+ static public function getDataFromDirectory( $directory, $fileName, $format, $mappings ) {
+ global $edgDirectoryPath;
+
+ if ( array_key_exists( $directory, $edgDirectoryPath ) ) {
+ $directoryPath = $edgDirectoryPath[$directory];
+ $path = realpath( $directoryPath . $fileName );
+ if ( $path !== false && strpos( $path, $directoryPath ) === 0 ) {
+ return self::getDataFromPath( $path, $format, $mappings );
+ } else {
+ return "Error: File name \"$fileName\" is not allowed for directory ID \"$directory\".";
+ }
+ } else {
+ return "Error: No directory is set for ID \"$directory\".";
+ }
+ }
+
+ /**
+ * Recursive function, used by getSOAPData().
+ */
+ static public function getValuesForKeyInTree( $key, $tree ) {
+ // The passed-in tree can be either an array or a stdObject -
+ // we need it to be an array.
+ if ( is_object( $tree ) ) {
+ $tree = get_object_vars( $tree );
+ }
+ $values = array();
+ foreach ( $tree as $curKey => $curValue ) {
+ if ( is_object( $curValue ) || is_array( $curValue ) ) {
+ $additionalValues = self::getValuesForKeyInTree( $key, $curValue );
+ $values = array_merge( $values, $additionalValues );
+ } elseif ( $curKey == $key ) {
+ $values[] = $curValue;
+ }
+ }
+ return $values;
+ }
+
+ static public function getSOAPData( $url, $requestName, $requestData, $responseName, $mappings) {
+ $client = new SoapClient( $url );
+ try {
+ $result = $client->$requestName( $requestData );
+ } catch ( Exception $e ) {
+ return "Caught exception: " . $e->getMessage();
+ }
+
+ $realResultJSON = $result->$responseName;
+ if ( $realResultJSON == '' ) {
+ return 'Error: no data found for this set of "requestData" fields.';
+ }
+
+ $realResult = json_decode( $realResultJSON );
+ $errorKey = '#Error:';
+ if ( array_key_exists( $errorKey, $realResult ) ) {
+ return 'Error: ' . $realResult->$errorKey;
+ }
+
+ $values = array();
+ foreach ( $mappings as $fieldName ) {
+ $values[$fieldName] = self::getValuesForKeyInTree( $fieldName, $realResult );
+ }
+ return $values;
+ }
+
+}
diff --git a/www/wiki/extensions/ExternalData/package.json b/www/wiki/extensions/ExternalData/package.json
new file mode 100644
index 00000000..ea62e434
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/package.json
@@ -0,0 +1,11 @@
+{
+ "private": true,
+ "scripts": {
+ "test": "grunt test"
+ },
+ "devDependencies": {
+ "grunt": "1.0.3",
+ "grunt-banana-checker": "0.4.0",
+ "grunt-jsonlint": "1.0.7"
+ }
+}
diff --git a/www/wiki/extensions/ExternalData/sql/ExternalData.sql b/www/wiki/extensions/ExternalData/sql/ExternalData.sql
new file mode 100644
index 00000000..009362bb
--- /dev/null
+++ b/www/wiki/extensions/ExternalData/sql/ExternalData.sql
@@ -0,0 +1,9 @@
+CREATE TABLE IF NOT EXISTS `ed_url_cache` (
+ `id` int(10) unsigned NOT NULL auto_increment,
+ `url` varchar(255) NOT NULL,
+ `post_vars` text,
+ `req_time` int(11) NOT NULL,
+ `result` longtext character set utf8 collate utf8_unicode_ci,
+ UNIQUE KEY `id` (`id`),
+ KEY `url` (`url`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1; \ No newline at end of file