r96691 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r96690‎ | r96691 | r96692 >
Date:20:19, 9 September 2011
Author:yaron
Status:deferred
Tags:
Comment:
Tag for version 1.3.2
Modified paths:
  • /tags/extensions/ExternalData/REL_1_3_2 (added) (history)

Diff [purge]

Index: tags/extensions/ExternalData/REL_1_3_2/ExternalData.i18n.magic.php
@@ -0,0 +1,127 @@
 2+<?php
 3+/**
 4+ *
 5+ */
 6+
 7+$magicWords = array();
 8+
 9+/** English (English) */
 10+$magicWords['en'] = array(
 11+ 'get_external_data' => array( 0, 'get_external_data' ),
 12+ 'get_web_data' => array( 0, 'get_web_data' ),
 13+ 'get_ldap_data' => array( 0, 'get_ldap_data' ),
 14+ 'get_db_data' => array( 0, 'get_db_data' ),
 15+ 'external_value' => array( 0, 'external_value' ),
 16+ 'for_external_table' => array( 0, 'for_external_table' ),
 17+ 'store_external_table' => array( 0, 'store_external_table' ),
 18+ 'clear_external_data' => array( 0, 'clear_external_data' ),
 19+);
 20+
 21+/** Arabic (العربية) */
 22+$magicWords['ar'] = array(
 23+ 'get_external_data' => array( 0, 'عرض_بيانات_خارجية' ),
 24+ 'get_web_data' => array( 0, 'عرض_بيانات_الويب' ),
 25+ 'get_ldap_data' => array( 0, 'عرض_بيانات_لداب' ),
 26+ 'get_db_data' => array( 0, 'عرض_بيانات_قب' ),
 27+ 'external_value' => array( 0, 'قيمة_خارجية' ),
 28+ 'for_external_table' => array( 0, 'لجدول_خارجي' ),
 29+ 'store_external_table' => array( 0, 'تخزين_جدول_خارجي' ),
 30+);
 31+
 32+/** Egyptian Spoken Arabic (مصرى) */
 33+$magicWords['arz'] = array(
 34+ 'get_external_data' => array( 0, 'عرض_بيانات_خارجية', 'get_external_data' ),
 35+ 'get_ldap_data' => array( 0, 'عرض_بيانات_لداب', 'get_ldap_data' ),
 36+ 'get_db_data' => array( 0, 'عرض_بيانات_قب', 'get_db_data' ),
 37+ 'external_value' => array( 0, 'قيمة_خارجية', 'external_value' ),
 38+ 'for_external_table' => array( 0, 'لجدول_خارجي', 'for_external_table' ),
 39+ 'store_external_table' => array( 0, 'تخزين_جدول_خارجى', 'تخزين_جدول_خارجي', 'store_external_table' ),
 40+);
 41+
 42+/** Chechen (Нохчийн) */
 43+$magicWords['ce'] = array(
 44+ 'get_external_data' => array( 0, 'схьаэца_архьара_хаамаш', 'получить_внешние_данные', 'get_external_data' ),
 45+ 'get_ldap_data' => array( 0, 'схьаэца_хаамаш_ldap', 'получить_данные_ldap', 'get_ldap_data' ),
 46+ 'get_db_data' => array( 0, 'схьаэца_хаамаш_db', 'получить_данные_db', 'get_db_data' ),
 47+ 'external_value' => array( 0, 'архьара_дозалла', 'внешнее_значение', 'external_value' ),
 48+ 'for_external_table' => array( 0, 'оцу_архьара_тебалецlаш', 'для_внешней_таблицы', 'for_external_table' ),
 49+);
 50+
 51+/** Spanish (Español) */
 52+$magicWords['es'] = array(
 53+ 'get_external_data' => array( 0, 'obtener_datos_externos', 'get_external_data' ),
 54+ 'get_db_data' => array( 0, 'obtener_datos_db', 'get_db_data' ),
 55+ 'external_value' => array( 0, 'valor_externo', 'external_value' ),
 56+);
 57+
 58+/** Japanese (日本語) */
 59+$magicWords['ja'] = array(
 60+ 'get_external_data' => array( 0, '外部データ取得' ),
 61+ 'get_ldap_data' => array( 0, 'ldapデータ取得' ),
 62+ 'get_db_data' => array( 0, 'dbデータ取得' ),
 63+ 'external_value' => array( 0, '外部値' ),
 64+ 'for_external_table' => array( 0, '外部テーブル用' ),
 65+ 'store_external_table' => array( 0, '外部テーブル格納' ),
 66+);
 67+
 68+/** Macedonian (Македонски) */
 69+$magicWords['mk'] = array(
 70+ 'get_external_data' => array( 0, 'преземи_надворешни_податоци' ),
 71+ 'external_value' => array( 0, 'надворешна_вредност' ),
 72+ 'for_external_table' => array( 0, 'за_надворешна_табела' ),
 73+ 'store_external_table' => array( 0, 'складирај_надворешна_табела' ),
 74+);
 75+
 76+/** Malayalam (മലയാളം) */
 77+$magicWords['ml'] = array(
 78+ 'get_external_data' => array( 0, 'ബാഹ്യ_വിവരങ്ങൾ_എടുക്കുക' ),
 79+ 'external_value' => array( 0, 'ബാഹ്യ_മൂല്യം' ),
 80+);
 81+
 82+/** Marathi (मराठी) */
 83+$magicWords['mr'] = array(
 84+ 'get_external_data' => array( 0, 'मिळवा_बाह्य_विदा', 'get_external_data' ),
 85+ 'get_ldap_data' => array( 0, 'मिळवा__एलडॅप_विदा', 'get_ldap_data' ),
 86+ 'for_external_table' => array( 0, 'बाह्य_सारणी_करिता', 'for_external_table' ),
 87+);
 88+
 89+/** Nedersaksisch (Nedersaksisch) */
 90+$magicWords['nds-nl'] = array(
 91+ 'get_external_data' => array( 0, 'externe_gegevens_ophaolen', 'externe_gegevens_ophalen', 'get_external_data' ),
 92+ 'get_ldap_data' => array( 0, 'ldap-gegevens_ophaolen', 'ldap_gegevens_ophalen', 'get_ldap_data' ),
 93+ 'get_db_data' => array( 0, 'db-gegevens_ophaolen', 'db_gegevens_ophalen', 'get_db_data' ),
 94+ 'external_value' => array( 0, 'externe_weerde', 'externe_waarde', 'external_value' ),
 95+ 'for_external_table' => array( 0, 'veur_externe_tebel', 'voor_externe_tabel', 'for_external_table' ),
 96+);
 97+
 98+/** Dutch (Nederlands) */
 99+$magicWords['nl'] = array(
 100+ 'get_external_data' => array( 0, 'externe_gegevens_ophalen' ),
 101+ 'get_web_data' => array( 0, 'webgegevens_ophalen' ),
 102+ 'get_ldap_data' => array( 0, 'ldap_gegevens_ophalen' ),
 103+ 'get_db_data' => array( 0, 'db_gegevens_ophalen' ),
 104+ 'external_value' => array( 0, 'externe_waarde' ),
 105+ 'for_external_table' => array( 0, 'voor_externe_tabel' ),
 106+ 'store_external_table' => array( 0, 'opslaan_externe_tabel' ),
 107+);
 108+
 109+/** Russian (Русский) */
 110+$magicWords['ru'] = array(
 111+ 'get_external_data' => array( 0, 'получить_внешние_данные' ),
 112+ 'get_ldap_data' => array( 0, 'получить_данные_ldap' ),
 113+ 'get_db_data' => array( 0, 'получить_данные_db' ),
 114+ 'external_value' => array( 0, 'внешнее_значение' ),
 115+ 'for_external_table' => array( 0, 'для_внешней_таблицы' ),
 116+ 'store_external_table' => array( 0, 'внешняя_таблица_хранения' ),
 117+);
 118+
 119+/** Serbian Cyrillic ekavian (‪Српски (ћирилица)‬) */
 120+$magicWords['sr-ec'] = array(
 121+ 'get_external_data' => array( 0, 'добави_спољне_податке' ),
 122+ 'get_web_data' => array( 0, 'добави_веб_податке' ),
 123+ 'get_ldap_data' => array( 0, 'добави_лдап_податке' ),
 124+ 'get_db_data' => array( 0, 'добави_податке_базе' ),
 125+ 'external_value' => array( 0, 'спољна_вредност' ),
 126+ 'for_external_table' => array( 0, 'за_спољну_табелу' ),
 127+ 'store_external_table' => array( 0, 'смести_спољну_табелу' ),
 128+);
Property changes on: tags/extensions/ExternalData/REL_1_3_2/ExternalData.i18n.magic.php
___________________________________________________________________
Added: svn:keywords
1129 + Id
Added: svn:eol-style
2130 + native
Index: tags/extensions/ExternalData/REL_1_3_2/ExternalData.i18n.php
@@ -0,0 +1,928 @@
 2+<?php
 3+/**
 4+ * Internationalization file for the External Data extension
 5+ *
 6+ * @addtogroup Extensions
 7+ */
 8+
 9+$messages = array();
 10+
 11+/** English
 12+ * @author Yaron Koren
 13+ */
 14+$messages['en'] = array(
 15+ // user messages
 16+ 'getdata' => 'Get data',
 17+ 'externaldata-desc' => 'Allows for retrieving structured data from external URLs, databases and other sources',
 18+ 'externaldata-ldap-unable-to-connect' => 'Unable to connect to $1',
 19+ 'externaldata-json-decode-not-supported' => 'Error: json_decode() is not supported in this version of PHP',
 20+ 'externaldata-xml-error' => 'XML error: $1 at line $2',
 21+ 'externaldata-db-incomplete-information' => 'Error: Incomplete information for this server ID.',
 22+ 'externaldata-db-could-not-get-url' => 'Could not get URL after $1 {{PLURAL:$1|try|tries}}.',
 23+ 'externaldata-db-unknown-type' => 'Error: Unknown database type.',
 24+ 'externaldata-db-could-not-connect' => 'Error: Could not connect to database.',
 25+ 'externaldata-db-no-return-values' => 'Error: No return values specified.',
 26+ 'externaldata-db-invalid-query' => 'Invalid query.',
 27+ 'externaldata-db-option-unsupported' => 'Error: Parameters $1 and $2 are not supported in this version of MediaWiki.',
 28+);
 29+
 30+/** Message documentation (Message documentation)
 31+ * @author Dead3y3
 32+ * @author Fryed-peach
 33+ */
 34+$messages['qqq'] = array(
 35+ 'externaldata-desc' => '{{desc}}',
 36+);
 37+
 38+/** Afrikaans (Afrikaans)
 39+ * @author Naudefj
 40+ */
 41+$messages['af'] = array(
 42+ 'getdata' => 'Kry data',
 43+ 'externaldata-xml-error' => 'XML-fout: $1 op reël $2',
 44+ 'externaldata-db-unknown-type' => 'Fout: onbekende databasistipe.',
 45+ 'externaldata-db-could-not-connect' => "Fout: kon nie 'n verbinding met databasis bewerkstellig nie.",
 46+ 'externaldata-db-invalid-query' => 'Ongeldige navraag.',
 47+);
 48+
 49+/** Gheg Albanian (Gegë)
 50+ * @author Mdupont
 51+ */
 52+$messages['aln'] = array(
 53+ 'getdata' => 'Merr të dhëna',
 54+ 'externaldata-desc' => 'Lejon retrieving të dhënat e strukturuar nga URL jashtme, bazat e të dhënave dhe burimet tjera',
 55+ 'externaldata-ldap-unable-to-connect' => "Në pamundësi për t'u lidhur tek $1",
 56+ 'externaldata-json-decode-not-supported' => 'Gabim: json_decode() nuk është i mbështetur në këtë version të PHP',
 57+ 'externaldata-xml-error' => 'XML error: $1 tek $2 linjë',
 58+ 'externaldata-db-incomplete-information' => 'Gabim: informata jo të plota për këtë server të identitetit.',
 59+ 'externaldata-db-could-not-get-url' => 'Nuk mund te merrni URL pasi $1 {{PLURAL:$1|provoni|përpiqet}}.',
 60+ 'externaldata-db-unknown-type' => 'Gabim: Lloj i panjohur bazës së të dhënave.',
 61+ 'externaldata-db-could-not-connect' => 'Gabim: Nuk mund të lidheni me bazën e të dhënave.',
 62+ 'externaldata-db-no-return-values' => 'Gabim: Nuk ka kthim vlerat e caktuara.',
 63+ 'externaldata-db-invalid-query' => 'pyetje e pavlefshme.',
 64+);
 65+
 66+/** Arabic (العربية)
 67+ * @author Imksa
 68+ * @author Meno25
 69+ * @author OsamaK
 70+ */
 71+$messages['ar'] = array(
 72+ 'getdata' => 'الحصول على البيانات',
 73+ 'externaldata-desc' => 'يسمح باسترجاع البيانات الهيكلية من مسارات خارجية، قواعد البيانات ومصادر أخرى',
 74+ 'externaldata-ldap-unable-to-connect' => 'تعذّر الاتصال ب$1',
 75+ 'externaldata-json-decode-not-supported' => 'خطأ: json_decode() غير مدعوم في نسخة PHP هذه',
 76+ 'externaldata-xml-error' => 'خطأ XML: $1 عند السطر $2',
 77+ 'externaldata-db-incomplete-information' => 'خطأ: معلومات غير كاملة عن هوية هذا الخادوم.',
 78+ 'externaldata-db-could-not-get-url' => 'تعذّر الحصول على المسار بعد {{PLURAL:$1||محاولة واحدة|محاوتين|$1 محاولات|$1 محاولة }}.',
 79+ 'externaldata-db-unknown-type' => 'خطأ: نوع قاعدة بيانات غير معروف.',
 80+ 'externaldata-db-could-not-connect' => 'خطأ: تعذّر الاتصال بقاعدة البيانات.',
 81+ 'externaldata-db-no-return-values' => 'خطأ: لم تحدد أي قيم عائدة.',
 82+ 'externaldata-db-invalid-query' => 'استعلام غير صالح.',
 83+ 'externaldata-db-option-unsupported' => 'خطأ: معلمات $1 و $2 غير معتمدة في هذا الإصدار من ميدياويكي.',
 84+);
 85+
 86+/** Egyptian Spoken Arabic (مصرى)
 87+ * @author Dudi
 88+ * @author Meno25
 89+ */
 90+$messages['arz'] = array(
 91+ 'getdata' => 'الحصول على البيانات',
 92+ 'externaldata-desc' => 'بيسمح انك تجيب الداتا المتركبه من URLات برّانيه, و قواعد بيانات (databases) و مصادر تانيه',
 93+);
 94+
 95+/** Belarusian (Taraškievica orthography) (‪Беларуская (тарашкевіца)‬)
 96+ * @author EugeneZelenko
 97+ * @author Jim-by
 98+ */
 99+$messages['be-tarask'] = array(
 100+ 'getdata' => 'Атрымаць зьвесткі',
 101+ 'externaldata-desc' => 'Дазваляе атрымліваць структураваныя зьвесткі з вонкавых URL-адрасоў, базаў зьвестак і іншых крыніц',
 102+ 'externaldata-ldap-unable-to-connect' => 'Немагчыма далучыцца да $1',
 103+ 'externaldata-json-decode-not-supported' => 'Памылка: json_decode() не падтрымліваецца ў гэтай вэрсіі PHP',
 104+ 'externaldata-xml-error' => 'Памылка XML: $1 у радку $2',
 105+ 'externaldata-db-incomplete-information' => 'Памылка: Няпоўная інфармацыя для гэтага ідэнтыфікатара сэрвэра.',
 106+ 'externaldata-db-could-not-get-url' => 'Немагчыма атрымаць URL-адрас пасьля $1 {{PLURAL:$1|спробы|спробаў|спробаў}}.',
 107+ 'externaldata-db-unknown-type' => 'Памылка: Невядомы тып базы зьвестак.',
 108+ 'externaldata-db-could-not-connect' => 'Памылка: Немагчыма далучыцца да базы зьвестак.',
 109+ 'externaldata-db-no-return-values' => 'Памылка: Не пазначаныя выніковыя значэньні.',
 110+ 'externaldata-db-invalid-query' => 'Няслушны запыт.',
 111+ 'externaldata-db-option-unsupported' => 'Памылка: Парамэтры $1 і $2 не падтрымліваюцца ў гэтай вэрсіі MediaWiki.',
 112+);
 113+
 114+/** Breton (Brezhoneg)
 115+ * @author Fohanno
 116+ * @author Fulup
 117+ * @author Y-M D
 118+ */
 119+$messages['br'] = array(
 120+ 'getdata' => 'Tapout roadennoù',
 121+ 'externaldata-desc' => 'Talvezout a ra da adtapout roadennoù frammet adalek URLoù diavaez, diazoù titouroù ha mammennoù all.',
 122+ 'externaldata-ldap-unable-to-connect' => "Ne c'haller ket kevreañ ouzh $1",
 123+ 'externaldata-json-decode-not-supported' => "Fazi : json_decode() n'eo ket skoret er stumm-mañ eus PHP",
 124+ 'externaldata-xml-error' => 'Fazi XML : $1 el linenn $2',
 125+ 'externaldata-db-incomplete-information' => 'Fazi : Titouroù diglok evit an ID servijer-mañ.',
 126+ 'externaldata-db-could-not-get-url' => 'Dibosupl eo tapout an URL goude $1 {{PLURAL:$1|taol-esae|taol-esae}}.',
 127+ 'externaldata-db-unknown-type' => 'Fazi : Seurt diaz roadennoù dianav',
 128+ 'externaldata-db-could-not-connect' => "Fazi : Ne c'haller ket kevreañ ouzh an diaz roadennoù.",
 129+ 'externaldata-db-no-return-values' => "Fazi : N'eus bet resisaet talvoud distro ebet.",
 130+ 'externaldata-db-invalid-query' => 'Reked direizh.',
 131+ 'externaldata-db-option-unsupported' => "Fazi : N'eo ket skoret an arventennoù $1 ha $2 er stumm-mañ eus MediaWiki.",
 132+);
 133+
 134+/** Bosnian (Bosanski)
 135+ * @author CERminator
 136+ */
 137+$messages['bs'] = array(
 138+ 'getdata' => 'Uzmi podatke',
 139+ 'externaldata-desc' => 'Omogućuje za preuzimanje strukturnih podataka iz vanjskih URLova, baza podataka i drugih izvora',
 140+ 'externaldata-ldap-unable-to-connect' => 'Ne može se spojiti na $1',
 141+ 'externaldata-json-decode-not-supported' => 'Greška: json_decode() nije podržan u ovoj PHP verziji',
 142+ 'externaldata-xml-error' => 'XML greška: $1 na liniji $2',
 143+ 'externaldata-db-incomplete-information' => 'Greška: Nepotpune informacije za ovaj ID servera.',
 144+ 'externaldata-db-could-not-get-url' => 'Nije pronađen URL nakon $1 {{PLURAL:$1|pokušaja|pokušaja}}.',
 145+ 'externaldata-db-unknown-type' => 'Greška: Nepoznat tip baze podataka.',
 146+ 'externaldata-db-could-not-connect' => 'Greška: Ne može se spojiti na bazu podataka.',
 147+ 'externaldata-db-no-return-values' => 'Greška: Nije navedena povratna vrijednost.',
 148+ 'externaldata-db-invalid-query' => 'Nevaljan upit.',
 149+ 'externaldata-db-option-unsupported' => 'Greška: Parametri $1 i $2 nisu podržani u ovoj verziji MediaWiki.',
 150+);
 151+
 152+/** Catalan (Català)
 153+ * @author Paucabot
 154+ * @author Solde
 155+ */
 156+$messages['ca'] = array(
 157+ 'getdata' => 'Obtenir dades',
 158+ 'externaldata-xml-error' => 'Error XML: $1 a la línia $2',
 159+ 'externaldata-db-unknown-type' => 'Error: Tipus de base de dades desconegut.',
 160+ 'externaldata-db-could-not-connect' => "Error: No s'ha pogut connectar a la base de dades.",
 161+ 'externaldata-db-invalid-query' => 'Consulta no vàlida.',
 162+);
 163+
 164+/** Czech (Česky)
 165+ * @author Jkjk
 166+ */
 167+$messages['cs'] = array(
 168+ 'getdata' => 'Získat data',
 169+ 'externaldata-desc' => 'Umožňuje získávání strukturovaných dat z externích webových stránek, databází a jiných zdrojů',
 170+ 'externaldata-ldap-unable-to-connect' => 'Nepodařilo se spojit s $1',
 171+ 'externaldata-json-decode-not-supported' => 'Chyba:tato verzie PHP nepodporuje json_decode()',
 172+ 'externaldata-xml-error' => 'Chyba XML: $1 na řádku $2',
 173+ 'externaldata-db-incomplete-information' => 'Chyba: Nekompletní informace pro toto ID serveru',
 174+ 'externaldata-db-unknown-type' => 'Chyba: Neznámý typ databáze.',
 175+ 'externaldata-db-could-not-connect' => 'Chyba: Nepodařilo se připojit k databázi.',
 176+ 'externaldata-db-no-return-values' => 'Chyba: Nebyly zadány návratové hodnoty.',
 177+ 'externaldata-db-invalid-query' => 'Neplatný požadavek.',
 178+);
 179+
 180+/** German (Deutsch)
 181+ * @author Imre
 182+ * @author Kghbln
 183+ * @author MF-Warburg
 184+ * @author Merlissimo
 185+ * @author Purodha
 186+ * @author Umherirrender
 187+ */
 188+$messages['de'] = array(
 189+ 'getdata' => 'Daten holen',
 190+ 'externaldata-desc' => 'Ermöglicht das Einfügen strukturierter Daten von externen URLs, Datenbanken und anderen Quellen',
 191+ 'externaldata-ldap-unable-to-connect' => 'Keine Verbindung zu $1',
 192+ 'externaldata-json-decode-not-supported' => 'Fehler: json_decode() wird nicht von dieser PHP-Version unterstützt.',
 193+ 'externaldata-xml-error' => 'XML-Fehler: $1 in Zeile $2',
 194+ 'externaldata-db-incomplete-information' => 'Fehler: Unvollständige Informationen für diese Server-ID.',
 195+ 'externaldata-db-could-not-get-url' => 'URL konnte nach $1 {{PLURAL:$1|Versuch|Versuchen}} nicht abgerufen werden.',
 196+ 'externaldata-db-unknown-type' => 'Fehler: Unbekannter Datenbanktyp.',
 197+ 'externaldata-db-could-not-connect' => 'Fehler: Keine Verbindung zur Datenbank.',
 198+ 'externaldata-db-no-return-values' => 'Fehler: Keine Rückgabewerte festgelegt.',
 199+ 'externaldata-db-invalid-query' => 'Ungültige Abfrage.',
 200+ 'externaldata-db-option-unsupported' => 'Fehler: Die Parameter $1 und $2 werden von dieser MediaWiki-Version nicht unterstützt.',
 201+);
 202+
 203+/** Lower Sorbian (Dolnoserbski)
 204+ * @author Michawiki
 205+ */
 206+$messages['dsb'] = array(
 207+ 'getdata' => 'Daty wobstaraś',
 208+ 'externaldata-desc' => 'Zmóžnja wótwołowanje strukturěrowanych datow z eksternych URL, datowych bankow a drugich žrědłow',
 209+ 'externaldata-ldap-unable-to-connect' => 'Njemóžno z $1 zwězaś',
 210+ 'externaldata-json-decode-not-supported' => 'Zmólka: json_decode() njepódpěra se w toś tej wersiji PHP',
 211+ 'externaldata-xml-error' => 'Zmólka XML: $1 na smužce $2',
 212+ 'externaldata-db-incomplete-information' => "'''Zmólka: Njedopołne informacije za toś ten serwerowy ID.'''",
 213+ 'externaldata-db-could-not-get-url' => 'Njemóžno URL pó $1 {{PLURAL:$1|wopyśe|wopytoma|wopytach|wopytach}} dostaś.',
 214+ 'externaldata-db-unknown-type' => "'''Zmólka: Njeznata datowa banka.'''",
 215+ 'externaldata-db-could-not-connect' => "'''Zmólka: Njemóžno z datoweju banku zwězaś.'''",
 216+ 'externaldata-db-no-return-values' => "'''Zmólka: Žedne gódnoty slědkdaśa pódane.'''",
 217+ 'externaldata-db-invalid-query' => 'Njepłaśiwe napšašowanje.',
 218+);
 219+
 220+/** Greek (Ελληνικά)
 221+ * @author Dead3y3
 222+ * @author Omnipaedista
 223+ */
 224+$messages['el'] = array(
 225+ 'getdata' => 'Πάρε δεδομένα',
 226+ 'externaldata-desc' => 'Επιτρέπει την ανάκτηση δεδομένων σε μορφές CSV, JSON και XML και για εξωτερικά URLs και για σελίδες του τοπικού wiki',
 227+ 'externaldata-xml-error' => 'Σφάλμα XML : $1 στη γραμμή $2',
 228+ 'externaldata-db-invalid-query' => 'Άκυρο αίτημα.',
 229+);
 230+
 231+/** Esperanto (Esperanto)
 232+ * @author Yekrats
 233+ */
 234+$messages['eo'] = array(
 235+ 'externaldata-db-invalid-query' => 'Malvalida serĉomendo.',
 236+);
 237+
 238+/** Spanish (Español)
 239+ * @author Crazymadlover
 240+ * @author Imre
 241+ * @author Manuelt15
 242+ * @author Sanbec
 243+ * @author Translationista
 244+ */
 245+$messages['es'] = array(
 246+ 'getdata' => 'Obtener datos',
 247+ 'externaldata-desc' => 'Permite la recuperación de datos estructurados a partir de direcciones URL externas, bases de datos y otras fuentes',
 248+ 'externaldata-ldap-unable-to-connect' => 'No se pudo conectar con $1',
 249+ 'externaldata-json-decode-not-supported' => 'Error: json_decode() no es compatible con esta versión de PHP',
 250+ 'externaldata-xml-error' => 'Error XML: $1 en línea $2',
 251+ 'externaldata-db-incomplete-information' => 'Error: Información incompleta para este ID de servidor.',
 252+ 'externaldata-db-could-not-get-url' => 'No se pudo obtener la URL después de $1 {{PLURAL:$1|intento|intentos}}.',
 253+ 'externaldata-db-unknown-type' => 'Error: Tipo de base de datos desconocido.',
 254+ 'externaldata-db-could-not-connect' => 'Error: No se pudo lograr conexión con la base de datos.',
 255+ 'externaldata-db-no-return-values' => 'Error: No se ha especificado valores de retorno.',
 256+ 'externaldata-db-invalid-query' => 'Consulta inválida.',
 257+);
 258+
 259+/** Basque (Euskara)
 260+ * @author Kobazulo
 261+ */
 262+$messages['eu'] = array(
 263+ 'getdata' => 'Datuak eskuratu',
 264+);
 265+
 266+/** Finnish (Suomi)
 267+ * @author Centerlink
 268+ * @author Crt
 269+ * @author Silvonen
 270+ * @author Str4nd
 271+ */
 272+$messages['fi'] = array(
 273+ 'getdata' => 'Hae data',
 274+ 'externaldata-desc' => 'Mahdollistaa muotoillun datan noutamisen ulkoisista verkko-osoitteista, tietokannoista ja muista lähteistä.',
 275+ 'externaldata-ldap-unable-to-connect' => 'Ei voitu yhdistää palvelimelle $1',
 276+ 'externaldata-json-decode-not-supported' => 'Virhe: json_decode() ei ole tuettu tässä PHP:n versiossa',
 277+ 'externaldata-xml-error' => 'XML-virhe: $1 rivillä $2',
 278+ 'externaldata-db-incomplete-information' => 'Virhe: Vaillinaiset tiedot tälle palvelintunnukselle.',
 279+ 'externaldata-db-could-not-get-url' => 'Ei voitu hakea verkko-osoitetta $1 {{PLURAL:$1|yrityksen|yrityksen}} jälkeen.',
 280+ 'externaldata-db-unknown-type' => 'Virhe: Tuntematon tietokantatyyppi.',
 281+ 'externaldata-db-could-not-connect' => 'Virhe: Ei yhteyttä tietokantaan.',
 282+ 'externaldata-db-no-return-values' => 'Virhe: Paluuarvoja ei ole annettu.',
 283+ 'externaldata-db-invalid-query' => 'Virheellinen kysely.',
 284+);
 285+
 286+/** French (Français)
 287+ * @author Crochet.david
 288+ * @author IAlex
 289+ * @author McDutchie
 290+ * @author PieRRoMaN
 291+ */
 292+$messages['fr'] = array(
 293+ 'getdata' => 'Obtenir des données',
 294+ '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",
 295+ 'externaldata-ldap-unable-to-connect' => 'Impossible de se connecter à $1',
 296+ 'externaldata-json-decode-not-supported' => "Erreur : json_decode() n'est pas supportée dans cette version de PHP",
 297+ 'externaldata-xml-error' => 'Erreur XML : $1 à la ligne $2',
 298+ 'externaldata-db-incomplete-information' => 'Erreur : Informations incomplètes pour cet identifiant de serveur.',
 299+ 'externaldata-db-could-not-get-url' => "Impossible d'obtenir l'URL après $1 essai{{PLURAL:$1|s|s}}.",
 300+ 'externaldata-db-unknown-type' => 'ERREUR: Type de base de données inconnu.',
 301+ 'externaldata-db-could-not-connect' => 'Erreur : Impossible de se connecter à la base de données.',
 302+ 'externaldata-db-no-return-values' => "Erreur : Aucune valeur de retour n'a été spécifiée.",
 303+ 'externaldata-db-invalid-query' => 'Requête invalide.',
 304+ 'externaldata-db-option-unsupported' => 'Erreur: Les paramètres $1 et $2 ne sont pas supportés dans cette version de MediaWiki.',
 305+);
 306+
 307+/** Franco-Provençal (Arpetan)
 308+ * @author ChrisPtDe
 309+ */
 310+$messages['frp'] = array(
 311+ 'getdata' => 'Avêr des balyês',
 312+ 'externaldata-ldap-unable-to-connect' => 'Empossiblo de sè branchiér a $1',
 313+ 'externaldata-xml-error' => 'Èrror XML : $1 a la legne $2',
 314+ 'externaldata-db-could-not-get-url' => 'Empossiblo d’avêr l’URL aprés $1 tentativ{{PLURAL:$1|a|es}}.',
 315+ 'externaldata-db-unknown-type' => 'Èrror : tipo de bâsa de balyês encognu.',
 316+ 'externaldata-db-could-not-connect' => 'Èrror : empossiblo de sè branchiér a la bâsa de balyês.',
 317+ 'externaldata-db-no-return-values' => 'Èrror : niona valor de retôrn at étâ spècefiâ.',
 318+ 'externaldata-db-invalid-query' => 'Requéta envalida.',
 319+);
 320+
 321+/** Galician (Galego)
 322+ * @author Toliño
 323+ */
 324+$messages['gl'] = array(
 325+ 'getdata' => 'Obter os datos',
 326+ 'externaldata-desc' => 'Permite a recuperación de datos estruturados a partir de enderezos URL externos, bases de datos e outras fontes',
 327+ 'externaldata-ldap-unable-to-connect' => 'Non se pode conectar a $1',
 328+ 'externaldata-json-decode-not-supported' => 'Erro: json_decode() non está soportado nesta versión de PHP',
 329+ 'externaldata-xml-error' => 'Erro XML: $1 na liña $2',
 330+ 'externaldata-db-incomplete-information' => 'Erro: información incompleta para este ID de servidor.',
 331+ 'externaldata-db-could-not-get-url' => 'Non se puido obter o enderezo URL despois de $1 {{PLURAL:$1|intento|intentos}}.',
 332+ 'externaldata-db-unknown-type' => 'Erro: tipo de base de datos descoñecido.',
 333+ 'externaldata-db-could-not-connect' => 'Erro: non se puido conectar á base de datos.',
 334+ 'externaldata-db-no-return-values' => 'Erro: non se especificou ningún valor de retorno.',
 335+ 'externaldata-db-invalid-query' => 'Consulta non válida.',
 336+ 'externaldata-db-option-unsupported' => 'Erro: Os parámetros $1 e $2 non están soportados nesta versión de MediaWiki.',
 337+);
 338+
 339+/** Swiss German (Alemannisch)
 340+ * @author Als-Holder
 341+ */
 342+$messages['gsw'] = array(
 343+ 'getdata' => 'Date hole',
 344+ 'externaldata-desc' => 'Erlaubt strukturierti Daten abzruefe vu extärne URL un andre Quälle',
 345+ 'externaldata-ldap-unable-to-connect' => 'Cha kei Verbindig härstellen zue $1',
 346+ 'externaldata-json-decode-not-supported' => 'Fähler: json_decode() wird nit unterstitzt in däre Version vu PHP',
 347+ 'externaldata-xml-error' => 'XML-Fähler: $1 in dr Zyyle $2',
 348+ 'externaldata-db-incomplete-information' => 'Fähler: Nit vollständigi Information fir die Server-ID.',
 349+ 'externaldata-db-could-not-get-url' => 'Cha d URL nit finde no $1 {{PLURAL:$1|Versuech|Versuech}}.',
 350+ 'externaldata-db-unknown-type' => 'Fähler: Nit bekannte Datebanktyp.',
 351+ 'externaldata-db-could-not-connect' => 'Fähler: Cha kei Verbindig härstelle zue dr Datebank.',
 352+ 'externaldata-db-no-return-values' => 'Fähler: Kei Ruckgabewärt spezifiziert.',
 353+ 'externaldata-db-invalid-query' => 'Nit giltigi Umfrog.',
 354+);
 355+
 356+/** Gujarati (ગુજરાતી)
 357+ * @author Ashok modhvadia
 358+ */
 359+$messages['gu'] = array(
 360+ 'getdata' => 'માહિતી પ્રાપ્ત કરો',
 361+ 'externaldata-desc' => 'બાહ્ય કડીઓ અને સ્થાનિક વિકિ પાનાઓ પરથી CSV, JSON અને XML શૈલીમાં માહિતીની પુન:પ્રાપ્તિની છુટ',
 362+);
 363+
 364+/** Hebrew (עברית)
 365+ * @author Amire80
 366+ * @author Rotemliss
 367+ * @author YaronSh
 368+ */
 369+$messages['he'] = array(
 370+ 'getdata' => 'קבלת נתונים',
 371+ 'externaldata-desc' => 'אפשרות לקבלת נתונים במבנים מכתובות חיצוניות, מסדי נתונים ומקורות אחרים',
 372+ 'externaldata-ldap-unable-to-connect' => 'לא ניתן להתחבר ל־$1',
 373+ 'externaldata-json-decode-not-supported' => 'שגיאה: הפקודה json_decode() אינה נתמכת בגרסה זו של PHP',
 374+ 'externaldata-xml-error' => 'שגיאת XML: $1 בשורה $2',
 375+ 'externaldata-db-incomplete-information' => 'שגיאה: יש רק מידע חלקי על מספר השרת הזה.',
 376+ 'externaldata-db-could-not-get-url' => 'לא ניתן לקבל את כתובת ה־URL לאחר {{PLURAL:$1|נסיון אחד|$1 נסיונות}}.',
 377+ 'externaldata-db-unknown-type' => 'שגיאה: סוג בסיס הנתונים אינו מוכר.',
 378+ 'externaldata-db-could-not-connect' => 'שגיאה: לא ניתן להתחבר אל בסיס הנתונים.',
 379+ 'externaldata-db-no-return-values' => 'שגיאה: לא הוגדרו ערכים להחזרה.',
 380+ 'externaldata-db-invalid-query' => 'שאילתה בלתי תקינה.',
 381+ 'externaldata-db-option-unsupported' => 'שגיאה: הפרמטרים $1 ו{{GRAMMAR:תחילית|$2}} אינם נתמכים בגרסה הזאת של מדיה־ויקי',
 382+);
 383+
 384+/** Upper Sorbian (Hornjoserbsce)
 385+ * @author Michawiki
 386+ */
 387+$messages['hsb'] = array(
 388+ 'getdata' => 'Daty wobstarać',
 389+ 'externaldata-desc' => 'Zmóžnja wotwołowanje strukturowanych datow z eksternych URL, datowych bankow a druhich žórłow',
 390+ 'externaldata-ldap-unable-to-connect' => 'Njemóžno z $1 zwjazać',
 391+ 'externaldata-json-decode-not-supported' => 'Zmylk: json_decode() so w tutej wersiji PHP njepodpěruje',
 392+ 'externaldata-xml-error' => 'Zmylk XML: $1 na lince $2',
 393+ 'externaldata-db-incomplete-information' => "'''Zmylk: Njedospołne informacije za ID tutoho serwera.'''",
 394+ 'externaldata-db-could-not-get-url' => 'Njebě móžno URL po $1 {{PLURAL:$1|pospyće|pospytomaj|pospytach|pospytach}} dóstać.',
 395+ 'externaldata-db-unknown-type' => "'''Zmylk: Njeznaty typ datoweje banki.'''",
 396+ 'externaldata-db-could-not-connect' => "'''Zmylk: Njemóžno z datowej banku zwjazać.'''",
 397+ 'externaldata-db-no-return-values' => "'''Zmylk: Žane hódnoty wróćenja podate.'''",
 398+ 'externaldata-db-invalid-query' => 'Njepłaćiwe naprašowanje.',
 399+);
 400+
 401+/** Hungarian (Magyar)
 402+ * @author Glanthor Reviol
 403+ */
 404+$messages['hu'] = array(
 405+ 'getdata' => 'Adatok lekérése',
 406+ 'externaldata-desc' => 'Strukturált adatok lekérése külső URL-ekről, adatbázisokból vagy más forrásokból',
 407+ 'externaldata-ldap-unable-to-connect' => 'Sikertelen csatlakozás a következőhöz: $1',
 408+ 'externaldata-json-decode-not-supported' => 'Hiba: a json_decode() nem támogatott ebben a PHP verzióban',
 409+ 'externaldata-xml-error' => '$1 XML hiba, $2. sor',
 410+ 'externaldata-db-incomplete-information' => 'Hiba: hiányos információ a szerver azonosítóhoz.',
 411+ 'externaldata-db-could-not-get-url' => 'Nem sikerült lekérni az URL-t {{PLURAL:$1|egy|$1}} próbálkozás alatt.',
 412+ 'externaldata-db-unknown-type' => 'Hiba: ismeretlen adatbázis típus.',
 413+ 'externaldata-db-could-not-connect' => 'Hiba: nem sikerült csatlakozni az adatbázishoz.',
 414+ 'externaldata-db-no-return-values' => 'Hiba: nem lettek megadva visszatérési értékek.',
 415+ 'externaldata-db-invalid-query' => 'Érvénytelen lekérdezés.',
 416+);
 417+
 418+/** Interlingua (Interlingua)
 419+ * @author McDutchie
 420+ */
 421+$messages['ia'] = array(
 422+ 'getdata' => 'Obtener datos',
 423+ 'externaldata-desc' => 'Permitte recuperar datos structurate ab adresses URL, bases de datos e altere fontes externe',
 424+ 'externaldata-ldap-unable-to-connect' => 'Impossibile connecter se a $1',
 425+ 'externaldata-json-decode-not-supported' => 'Error: json_decode() non es supportate in iste version de PHP',
 426+ 'externaldata-xml-error' => 'Error de XML: $1 al linea $2',
 427+ 'externaldata-db-incomplete-information' => 'Error: Information incomplete pro iste ID de servitor.',
 428+ 'externaldata-db-could-not-get-url' => 'Non poteva obtener le URL post $1 {{PLURAL:$1|tentativa|tentativas}}.',
 429+ 'externaldata-db-unknown-type' => 'Error: Typo de base de datos incognite.',
 430+ 'externaldata-db-could-not-connect' => 'Error: Impossibile connecter se al base de datos.',
 431+ 'externaldata-db-no-return-values' => 'Error: Nulle valor de retorno specificate.',
 432+ 'externaldata-db-invalid-query' => 'Consulta invalide.',
 433+ 'externaldata-db-option-unsupported' => 'Error: Le parametros $1 e $2 non es supportate in iste version de MediaWiki.',
 434+);
 435+
 436+/** Indonesian (Bahasa Indonesia)
 437+ * @author Bennylin
 438+ * @author IvanLanin
 439+ * @author Iwan Novirion
 440+ */
 441+$messages['id'] = array(
 442+ 'getdata' => 'Ambil data',
 443+ 'externaldata-desc' => 'Memungkinkan untuk mengambil data terstruktur dari URL eksternal, database dan sumber lainnya',
 444+ 'externaldata-ldap-unable-to-connect' => 'Tidak dapat terhubung ke $1',
 445+ 'externaldata-json-decode-not-supported' => 'Galat: json_decode() tidak didukung oleh versi PHP ini',
 446+ 'externaldata-xml-error' => 'Galat XML: $1 pada baris $2',
 447+ 'externaldata-db-incomplete-information' => 'Galat: Informasi tak lengkap untuk ID server ini.',
 448+ 'externaldata-db-could-not-get-url' => 'Tidak dapat mengambil URL setelah dicoba {{PLURAL:$1||}}$1 kali.',
 449+ 'externaldata-db-unknown-type' => 'Galat: Jenis basis data tidak diketahui.',
 450+ 'externaldata-db-could-not-connect' => 'Galat: Tidak dapat terhubung ke basis data.',
 451+ 'externaldata-db-no-return-values' => 'Galat: Nilai pengembalian tidak dispesifikasi.',
 452+ 'externaldata-db-invalid-query' => 'Kueri tidak sah.',
 453+ 'externaldata-db-option-unsupported' => 'Galat: Parameter $1 dan $2 tidak didukung oleh versi MediaWiki ini.',
 454+);
 455+
 456+/** Italian (Italiano)
 457+ * @author Beta16
 458+ * @author Pietrodn
 459+ */
 460+$messages['it'] = array(
 461+ 'getdata' => 'Ottieni dati',
 462+ 'externaldata-desc' => 'Consente di recuperare dati strutturati da URL esterni, database o altre sorgenti',
 463+ 'externaldata-ldap-unable-to-connect' => 'Impossibile connettersi a $1',
 464+ 'externaldata-json-decode-not-supported' => 'Errore: json_decode() non è supportato in questa versione di PHP',
 465+ 'externaldata-xml-error' => 'Errore XML: $1 alla linea $2',
 466+ 'externaldata-db-incomplete-information' => 'Errore: informazioni incomplete per questo server ID.',
 467+ 'externaldata-db-could-not-get-url' => "Impossibile raggiungere l'URL dopo $1 {{PLURAL:$1|tentativo|tentativi}}.",
 468+ 'externaldata-db-unknown-type' => 'Errore: tipo di database sconosciuto.',
 469+ 'externaldata-db-could-not-connect' => 'Errore: impossibile connettersi al database.',
 470+ 'externaldata-db-no-return-values' => 'Errore: non è stato specificato alcun valore di ritorno.',
 471+ 'externaldata-db-invalid-query' => 'Query non valida.',
 472+ 'externaldata-db-option-unsupported' => 'Errore: i parametri $1 e $2 non sono supportati in questa versione di MediaWiki.',
 473+);
 474+
 475+/** Japanese (日本語)
 476+ * @author Fryed-peach
 477+ * @author Schu
 478+ * @author 青子守歌
 479+ */
 480+$messages['ja'] = array(
 481+ 'getdata' => 'データ取得',
 482+ 'externaldata-desc' => '外部URLやデータベース、その他のソースからデータを取得できるようにする',
 483+ 'externaldata-ldap-unable-to-connect' => '$1 に接続できません',
 484+ 'externaldata-json-decode-not-supported' => 'エラー: json_decode() はこのバージョンの PHP ではサポートされていません',
 485+ 'externaldata-xml-error' => 'XMLエラー: 行$2で$1',
 486+ 'externaldata-db-incomplete-information' => 'エラー: このサーバーIDに対する情報が不十分です。',
 487+ 'externaldata-db-could-not-get-url' => '$1回の試行を行いましたが URL を取得できませんでした。',
 488+ 'externaldata-db-unknown-type' => 'エラー: データベースの種類が不明です。',
 489+ 'externaldata-db-could-not-connect' => 'エラー: データベースに接続できませんでした。',
 490+ 'externaldata-db-no-return-values' => 'エラー: 戻り値が指定されていません。',
 491+ 'externaldata-db-invalid-query' => '不正なクエリー',
 492+ 'externaldata-db-option-unsupported' => 'エラー: パラメータ $1 と $2 は MediaWiki のこのバージョンではサポートされていません。',
 493+);
 494+
 495+/** Khmer (ភាសាខ្មែរ)
 496+ * @author វ័ណថារិទ្ធ
 497+ */
 498+$messages['km'] = array(
 499+ 'getdata' => 'យក​ទិន្នន័យ',
 500+);
 501+
 502+/** Colognian (Ripoarisch)
 503+ * @author Purodha
 504+ */
 505+$messages['ksh'] = array(
 506+ 'getdata' => 'Date holle!',
 507+ '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.',
 508+ 'externaldata-ldap-unable-to-connect' => 'Kann nit noh $1 verbenge',
 509+ 'externaldata-json-decode-not-supported' => '<span style="text-transform: uppercase">Fähler:</span> De Fungxuhn <code lang="en">json_decode()</code> weedt vun heh dä Version vun <i lang="en">PHP</i> nit ongerschtöz.',
 510+ 'externaldata-xml-error' => 'Fähler em XML, op Reih $2: $1',
 511+ 'externaldata-db-incomplete-information' => '<span style="text-transform: uppercase">Fähler:</span> De Enfomazjuhne vör di ẞööver-Kännong sin nit kumplätt.',
 512+ '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.',
 513+ 'externaldata-db-unknown-type' => '<span style="text-transform: uppercase">Fähler:</span> Di Zoot Datebangk es unbikannt.',
 514+ 'externaldata-db-could-not-connect' => '<span style="text-transform: uppercase">Fähler:</span> Kunnt kein Verbendung noh dä Datebangk krijje.',
 515+ 'externaldata-db-no-return-values' => '<span style="text-transform: uppercase">Fähler:</span> Kein Wääte för Zerökzeävve aanjejovve.',
 516+ 'externaldata-db-invalid-query' => 'Onjöltesch Frooch aan de Datebangk.',
 517+ 'externaldata-db-option-unsupported' => 'Fähler: Heh di Version vum MediaWiki vershteiht de Parrmeetere $1 un $2 nit.',
 518+);
 519+
 520+/** Luxembourgish (Lëtzebuergesch)
 521+ * @author Robby
 522+ */
 523+$messages['lb'] = array(
 524+ 'getdata' => 'Donnéeë kréien',
 525+ 'externaldata-desc' => 'Erlaabt et Donnéeën vun externen URLen, Datebanken an anere Quellen ze verschaffen',
 526+ 'externaldata-ldap-unable-to-connect' => 'Onméiglech sech op $1 ze connectéieren',
 527+ 'externaldata-json-decode-not-supported' => 'Feeler: json_decode() gëtt an dëser Versioun vu PHP net ënnerstëtzt',
 528+ 'externaldata-xml-error' => 'XML Feeler: $1 an der Linn $2',
 529+ 'externaldata-db-incomplete-information' => 'Feeler: Informatioun fir dës Server ID net komplett.',
 530+ 'externaldata-db-could-not-get-url' => "D'URL konnt no {{PLURAL:$1|enger Kéier|$1 Versich}} net opgemaach ginn.",
 531+ 'externaldata-db-unknown-type' => 'Feeler: Onbekannten Datebank-Typ.',
 532+ 'externaldata-db-could-not-connect' => "Feeler: D'Verbindung mat der Datebank konnt net opgebaut ginn.",
 533+ 'externaldata-db-no-return-values' => 'Feeler: Kee Retour-Wäert festgeluecht.',
 534+ 'externaldata-db-invalid-query' => 'Net valabel Ufro.',
 535+ 'externaldata-db-option-unsupported' => "Feeler: D'Parametere(n) $1 a(n) $2 gi vun dëser Versioun vu MediaWiki net ënnerstëtzt.",
 536+);
 537+
 538+/** Macedonian (Македонски)
 539+ * @author Bjankuloski06
 540+ */
 541+$messages['mk'] = array(
 542+ 'getdata' => 'Земи податоци',
 543+ 'externaldata-desc' => 'Овозможува добивање структурирани податоци од надворешни URL-адреси, бази на податоци и други извори',
 544+ 'externaldata-ldap-unable-to-connect' => 'Не можам да се поврзам со $1',
 545+ 'externaldata-json-decode-not-supported' => 'Грешка: json_decode() не е поддржан во оваа верзија на PHP',
 546+ 'externaldata-xml-error' => 'XML грешка: $1 во ред $2',
 547+ 'externaldata-db-incomplete-information' => 'Грешка: Нецелосни информации за овој опслужувачки ид. бр.',
 548+ 'externaldata-db-could-not-get-url' => 'Не можев да ја добијам URL адресата по $1 {{PLURAL:$1|обид|обиди}}.',
 549+ 'externaldata-db-unknown-type' => 'Грешка: Непознат тип на база на податоци.',
 550+ 'externaldata-db-could-not-connect' => 'Грешка: Не можев да се поврзам со базата на податоци.',
 551+ 'externaldata-db-no-return-values' => 'Грешка: Нема назначено повратни вредности.',
 552+ 'externaldata-db-invalid-query' => 'Грешно барање.',
 553+ 'externaldata-db-option-unsupported' => 'Грешка: Параметрите $1 и $2 не се поддржани во оваа верзија на МедијаВики.',
 554+);
 555+
 556+/** Malay (Bahasa Melayu)
 557+ * @author Anakmalaysia
 558+ */
 559+$messages['ms'] = array(
 560+ 'getdata' => 'Dapatkan data',
 561+ 'externaldata-desc' => 'Membolehkan pengambilan data berstruktur dari URL luaran, pangkalan data atau sumber-sumber lain',
 562+ 'externaldata-ldap-unable-to-connect' => 'Tidak dapat bersambung dengan $1',
 563+ 'externaldata-json-decode-not-supported' => 'Ralat: json_decode() tidak disokong dalam versi PHP ini',
 564+ 'externaldata-xml-error' => 'Ralat XML: $1 di baris $2',
 565+ 'externaldata-db-incomplete-information' => 'Ralat: Maklumat tidak lengkap untuk ID pelayan ini.',
 566+ 'externaldata-db-could-not-get-url' => 'URL tidak dapat diterima selepas $1 cubaan.',
 567+ 'externaldata-db-unknown-type' => 'Ralat: Jenis pangkalan data tidak dikenali.',
 568+ 'externaldata-db-could-not-connect' => 'Ralat: Tidak dapat bersambung dengan pangkalan data.',
 569+ 'externaldata-db-no-return-values' => 'Ralat: Tiada nilai pulangan yang ditentukan.',
 570+ 'externaldata-db-invalid-query' => 'Pertanyaan tidak sah.',
 571+ 'externaldata-db-option-unsupported' => 'Ralat: Parameter $1 dan $2 tidak disokong dalam versi Mediawiki ini.',
 572+);
 573+
 574+/** Erzya (Эрзянь)
 575+ * @author Botuzhaleny-sodamo
 576+ */
 577+$messages['myv'] = array(
 578+ 'getdata' => 'Дата мельга',
 579+);
 580+
 581+/** Dutch (Nederlands)
 582+ * @author Siebrand
 583+ */
 584+$messages['nl'] = array(
 585+ 'getdata' => 'Gegevens ophalen',
 586+ 'externaldata-desc' => "Maakt het mogelijk gegevens van externe URL's, database en andere externe bronnen op te halen",
 587+ 'externaldata-ldap-unable-to-connect' => 'Het was niet mogelijk te verbinden met $1',
 588+ 'externaldata-json-decode-not-supported' => 'Fout: json_decode() wordt niet ondersteund in deze versie van PHP',
 589+ 'externaldata-xml-error' => 'XML-fout: $1 op regel $2',
 590+ 'externaldata-db-incomplete-information' => 'Fout: Onvolledige informatie voor dit servernummer.',
 591+ 'externaldata-db-could-not-get-url' => 'Na $1 {{PLURAL:$1|poging|pogingen}} gaf de URL geen resultaat.',
 592+ 'externaldata-db-unknown-type' => 'Fout: onbekend databasetype.',
 593+ 'externaldata-db-could-not-connect' => 'Fout: het was niet mogelijk met de database te verbinden.',
 594+ 'externaldata-db-no-return-values' => 'Fout: er zijn geen return-waarden ingesteld.',
 595+ 'externaldata-db-invalid-query' => 'Ongeldige zoekopdracht.',
 596+ 'externaldata-db-option-unsupported' => 'Fout: de parameters $1 en $2 worden niet ondersteund in deze versie van MediaWiki.',
 597+);
 598+
 599+/** Norwegian Nynorsk (‪Norsk (nynorsk)‬)
 600+ * @author Gunnernett
 601+ * @author Harald Khan
 602+ */
 603+$messages['nn'] = array(
 604+ 'getdata' => 'Hent data',
 605+ 'externaldata-desc' => 'Gjev høve til å henta strukturerte data frå eksterne URL-ar, databasar og andre kjelder',
 606+ 'externaldata-ldap-unable-to-connect' => 'Kunne ikkje kopla til $1',
 607+ 'externaldata-json-decode-not-supported' => 'Feil: json_decode() er ikkje stødd i denne versjonen av PHP',
 608+ 'externaldata-xml-error' => 'XML-feil: $1 på line $2',
 609+ 'externaldata-db-incomplete-information' => 'Feil: Ufullstendig informasjon for denne tenar-ID-en.',
 610+ 'externaldata-db-could-not-get-url' => 'Kunne ikkje henta URL etter {{PLURAL:$1|eitt forsøk|$1 forsøk}}.',
 611+ 'externaldata-db-unknown-type' => 'Feil: Ukjend databasetype.',
 612+ 'externaldata-db-could-not-connect' => 'Feil: Kunne ikkje kopla til databasen.',
 613+ 'externaldata-db-no-return-values' => 'Feil: Ingen returverdiar oppgjevne.',
 614+ 'externaldata-db-invalid-query' => 'Ugyldig spørjing.',
 615+);
 616+
 617+/** Norwegian (bokmål)‬ (‪Norsk (bokmål)‬)
 618+ * @author Harald Khan
 619+ * @author Nghtwlkr
 620+ */
 621+$messages['no'] = array(
 622+ 'getdata' => 'Hent data',
 623+ 'externaldata-desc' => 'Gir mulighet til å hente strukturerte data fra eksterne internettadresser, databaser og andre kilder',
 624+ 'externaldata-ldap-unable-to-connect' => 'Klarte ikke å koble til $1',
 625+ 'externaldata-json-decode-not-supported' => 'Feil: json_decode() er ikke støttet i denne versjonen av PHP',
 626+ 'externaldata-xml-error' => 'XML-feil: $1 på linje $2',
 627+ 'externaldata-db-incomplete-information' => 'Feil: Ufullstendig informasjon for denne tjener-IDen.',
 628+ 'externaldata-db-could-not-get-url' => 'Kunne ikke hente URL etter {{PLURAL:$1|ett forsøk|$1 forsøk}}.',
 629+ 'externaldata-db-unknown-type' => 'Feil: Ukjent databasetype.',
 630+ 'externaldata-db-could-not-connect' => 'Feil: Kunne ikke koble til database.',
 631+ 'externaldata-db-no-return-values' => 'Feil: Ingen returverdi spesifisert.',
 632+ 'externaldata-db-invalid-query' => 'Ugyldig spørring.',
 633+ 'externaldata-db-option-unsupported' => 'Feil: Parameterne $1 og $2 er ikke støttet i denne versjonen av MediaWiki.',
 634+);
 635+
 636+/** Occitan (Occitan)
 637+ * @author Cedric31
 638+ */
 639+$messages['oc'] = array(
 640+ 'getdata' => 'Obténer de donadas',
 641+ 'externaldata-desc' => "Permet de recuperar de donadas estructuradas a partir d'URL extèrnas, de bancas de donadas e d'autras fonts",
 642+ 'externaldata-ldap-unable-to-connect' => 'Impossible de se connectar a $1',
 643+ 'externaldata-json-decode-not-supported' => 'Error : json_decode() es pas suportada dins aquesta version de PHP',
 644+ 'externaldata-xml-error' => 'Error XML : $1 a la linha $2',
 645+ 'externaldata-db-incomplete-information' => 'Error : Informacions incompletas per aqueste identificant de servidor.',
 646+ 'externaldata-db-could-not-get-url' => "Impossible d'obténer l'URL aprèp $1 {{PLURAL:$1|ensag|ensages}}.",
 647+ 'externaldata-db-unknown-type' => 'ERROR: Tipe de banca de donadas desconegut.',
 648+ 'externaldata-db-could-not-connect' => 'Error : Impossible de se connectar a la banca de donadas.',
 649+ 'externaldata-db-no-return-values' => 'Error : Cap de valor de retorn es pas estada especificada.',
 650+ 'externaldata-db-invalid-query' => 'Requèsta invalida.',
 651+);
 652+
 653+/** Polish (Polski)
 654+ * @author Leinad
 655+ * @author Sp5uhe
 656+ */
 657+$messages['pl'] = array(
 658+ 'getdata' => 'Pobierz dane',
 659+ 'externaldata-desc' => 'Umożliwia pobieranie strukturalnych danych z zewnętrznych adresów URL, baz danych i innych źródeł',
 660+ 'externaldata-ldap-unable-to-connect' => 'Nie można połączyć się z $1',
 661+ 'externaldata-json-decode-not-supported' => 'Błąd – json_decode() nie jest obsługiwana w tej wersji PHP',
 662+ 'externaldata-xml-error' => 'Błąd XML – $1 w wierszu $2',
 663+ 'externaldata-db-incomplete-information' => 'Błąd – niepełne informacje o tym identyfikatorze serwera.',
 664+ 'externaldata-db-could-not-get-url' => 'Nie można uzyskać adresu URL po $1 {{PLURAL:$1|próbie|próbach}}.',
 665+ 'externaldata-db-unknown-type' => 'Błąd: Nieznany typ bazy danych.',
 666+ 'externaldata-db-could-not-connect' => 'Błąd: Nie można połączyć się z bazą danych.',
 667+ 'externaldata-db-no-return-values' => 'Błąd – nie określono zwracanej wartości.',
 668+ 'externaldata-db-invalid-query' => 'Nieprawidłowe zapytanie.',
 669+ 'externaldata-db-option-unsupported' => 'Błąd – parametry $1 i $2 nie są obsługiwane w tej wersji MediaWiki.',
 670+);
 671+
 672+/** Piedmontese (Piemontèis)
 673+ * @author Borichèt
 674+ * @author Dragonòt
 675+ */
 676+$messages['pms'] = array(
 677+ 'getdata' => 'Oten dij dat',
 678+ 'externaldata-desc' => "A përmët d'arcuperé dat struturà da adrësse dl'aragnà esterne, base ëd dàit e d'àutre sorgiss",
 679+ 'externaldata-ldap-unable-to-connect' => 'A peul pa coleghesse a $1',
 680+ 'externaldata-json-decode-not-supported' => "Eror: json_decode() a l'é pa suportà an sta vërsion ëd PHP",
 681+ 'externaldata-xml-error' => 'Eror XML: $1 a la linia $2',
 682+ 'externaldata-db-incomplete-information' => 'Eror: Anformassion pa completa për sto server ID-sì.',
 683+ 'externaldata-db-could-not-get-url' => "A peul pa oten-e l'URL d'apress ëd $1 {{PLURAL:$1|preuva|preuve}}.",
 684+ 'externaldata-db-unknown-type' => 'Eror: Sòrt ëd database pa conossùa',
 685+ 'externaldata-db-could-not-connect' => 'Eror: a peul pa coleghesse al database.',
 686+ 'externaldata-db-no-return-values' => "Eror: Pa gnun valor d'artorn spessifià.",
 687+ 'externaldata-db-invalid-query' => 'Ciamà pa bon-a.',
 688+ 'externaldata-db-option-unsupported' => 'Eror: Ij paràmetr $1 e $2 a son pa mantnù an costa version ëd MediaWiki.',
 689+);
 690+
 691+/** Portuguese (Português)
 692+ * @author Giro720
 693+ * @author Hamilton Abreu
 694+ * @author Waldir
 695+ */
 696+$messages['pt'] = array(
 697+ 'getdata' => 'Obter dados',
 698+ 'externaldata-desc' => 'Permite a importação de dados estruturados a partir de URLs, bases de dados e outras fontes externas',
 699+ 'externaldata-ldap-unable-to-connect' => 'Não foi possível estabelecer ligação a $1',
 700+ 'externaldata-json-decode-not-supported' => 'Erro: json_decode() não é suportado nesta versão do PHP',
 701+ 'externaldata-xml-error' => 'Erro XML: $1 na linha $2',
 702+ 'externaldata-db-incomplete-information' => 'Erro: Informação incompleta para o ID deste servidor.',
 703+ 'externaldata-db-could-not-get-url' => 'Não foi possível importar a URL após {{PLURAL:$1|uma tentativa|$1 tentativas}}.',
 704+ 'externaldata-db-unknown-type' => 'Erro: Tipo de base de dados desconhecido.',
 705+ 'externaldata-db-could-not-connect' => 'Erro: Não foi possível estabelecer ligação à base de dados.',
 706+ 'externaldata-db-no-return-values' => 'Erro: Não foram especificados nenhuns valores de retorno.',
 707+ 'externaldata-db-invalid-query' => "''Query'' inválida.",
 708+ 'externaldata-db-option-unsupported' => 'Erro: Os parâmetros $1 e $2 não são suportados nesta versão do MediaWiki.',
 709+);
 710+
 711+/** Brazilian Portuguese (Português do Brasil)
 712+ * @author Eduardo.mps
 713+ * @author Giro720
 714+ */
 715+$messages['pt-br'] = array(
 716+ 'getdata' => 'Obter dados',
 717+ 'externaldata-desc' => 'Permite a obtenção de dados em CSV, JSON e XML a partir de URLs externos, banco de dados e outras fontes',
 718+ 'externaldata-ldap-unable-to-connect' => 'Não foi possível conectar-se a $1',
 719+ 'externaldata-json-decode-not-supported' => 'Erro: json_decode() não é suportado nesta versão do PHP',
 720+ 'externaldata-xml-error' => 'Erro no XML: $1 na linha $2',
 721+ 'externaldata-db-incomplete-information' => 'Erro: Informação incompleta para o ID deste servidor</P>',
 722+ 'externaldata-db-could-not-get-url' => 'Não foi possível obter o URL após $1 {{PLURAL:$1|tentativa|tentativas}}.',
 723+ 'externaldata-db-unknown-type' => 'Erro: Tipo de base de dados desconhecido.',
 724+ 'externaldata-db-could-not-connect' => 'Erro: Não foi possível conectar-se a base de dados.',
 725+ 'externaldata-db-no-return-values' => 'Erro: Nenhum valor de retorno especificado.',
 726+ 'externaldata-db-invalid-query' => 'Consulta inválida.',
 727+ 'externaldata-db-option-unsupported' => 'Erro: Os parâmetros $1 e $2 não são suportados nesta versão do MediaWiki.',
 728+);
 729+
 730+/** Romanian (Română)
 731+ * @author Firilacroco
 732+ * @author KlaudiuMihaila
 733+ * @author Stelistcristi
 734+ */
 735+$messages['ro'] = array(
 736+ 'getdata' => 'Obține date',
 737+ 'externaldata-desc' => 'Permite obținerea datelor în format CSV, JSON și XML din atât adrese URL externe, cât și pagini wiki locale',
 738+ 'externaldata-ldap-unable-to-connect' => 'Nu se poate conecta la $1',
 739+ 'externaldata-xml-error' => 'Eroare XML: $1 la linia $2',
 740+ 'externaldata-db-unknown-type' => 'Eroare: Tipul bazei de date necunoscut.',
 741+ 'externaldata-db-could-not-connect' => 'Eroare: Nu s-a putut conecta la baza de date.',
 742+ 'externaldata-db-invalid-query' => 'Interogare invalidă.',
 743+);
 744+
 745+/** Tarandíne (Tarandíne)
 746+ * @author Joetaras
 747+ */
 748+$messages['roa-tara'] = array(
 749+ 'getdata' => 'Pigghie le date',
 750+ 'externaldata-desc' => 'Permette de repigghià data strutturate da URL fore a Uicchipèdie, database e otre sorgende',
 751+);
 752+
 753+/** Russian (Русский)
 754+ * @author Ferrer
 755+ * @author Александр Сигачёв
 756+ */
 757+$messages['ru'] = array(
 758+ 'getdata' => 'Получить данные',
 759+ 'externaldata-desc' => 'Позволяет получать структурированные данные с внешних адресов, баз данных и других источников',
 760+ 'externaldata-ldap-unable-to-connect' => 'Не удаётся подключиться к $1',
 761+ 'externaldata-json-decode-not-supported' => 'Ошибка. json_decode() не поддерживается в данной версии PHP',
 762+ 'externaldata-xml-error' => 'Ошибка XML. $1 в строке $2',
 763+ 'externaldata-db-incomplete-information' => 'ОШИБКА. Неполная информация для этого ID сервера.',
 764+ 'externaldata-db-could-not-get-url' => 'Не удалось получить URL после $1 {{PLURAL:$1|попытки|попыток|попыток}}.',
 765+ 'externaldata-db-unknown-type' => 'ОШИБКА. Неизвестный тип базы данных.',
 766+ 'externaldata-db-could-not-connect' => 'ОШИБКА. Не удаётся подключиться к базе данных.',
 767+ 'externaldata-db-no-return-values' => 'ОШИБКА. Не указаны возвращаемые значение.',
 768+ 'externaldata-db-invalid-query' => 'Ошибочный запрос.',
 769+ 'externaldata-db-option-unsupported' => 'Ошибка. Параметры $1 и $2 не поддерживаются в этой версии MediaWiki.',
 770+);
 771+
 772+/** Slovak (Slovenčina)
 773+ * @author Helix84
 774+ */
 775+$messages['sk'] = array(
 776+ 'getdata' => 'Získať dáta',
 777+ 'externaldata-desc' => 'Umožňuje získavanie štrukturovaných údajov z externých URL, databáz a iných zdrojov',
 778+ 'externaldata-ldap-unable-to-connect' => 'Nepodarilo sa pripojiť k $1',
 779+ 'externaldata-json-decode-not-supported' => 'Chyba: táto verzia PHP nepodporuje json_decode()',
 780+ 'externaldata-xml-error' => 'Chyba XML: $1 na riadku $2',
 781+ 'externaldata-db-incomplete-information' => 'Chyba: Nekompletné informácie s týmto ID servera.',
 782+ 'externaldata-db-could-not-get-url' => 'Nepodarilo sa získať URL po $1 {{PLURAL:$1|pokuse|pokusoch}}.',
 783+ 'externaldata-db-unknown-type' => 'Chyba: Neznámy typ databázy.',
 784+ 'externaldata-db-could-not-connect' => 'Chyba: Nepodarilo sa pripojiť k databáze.',
 785+ 'externaldata-db-no-return-values' => 'Chyba: Neboli zadané žiadne návratové hodnoty.',
 786+ 'externaldata-db-invalid-query' => 'Neplatná požiadavka.',
 787+);
 788+
 789+/** Serbian Cyrillic ekavian (‪Српски (ћирилица)‬)
 790+ * @author Charmed94
 791+ * @author Михајло Анђелковић
 792+ */
 793+$messages['sr-ec'] = array(
 794+ 'getdata' => 'Преузми податке',
 795+ 'externaldata-desc' => 'Омогућава преузимање података из спољашњих адреса, бази података и других извора',
 796+ 'externaldata-ldap-unable-to-connect' => 'Повезивање на $1 није успело',
 797+ 'externaldata-json-decode-not-supported' => 'Грешка: json_decode() није подржан у овом издању PHP-а',
 798+ 'externaldata-xml-error' => 'XML грешка: $1 по линији $2',
 799+ 'externaldata-db-incomplete-information' => 'Грешка: Непотпуни подаци за овај ID сервера.',
 800+ 'externaldata-db-could-not-get-url' => 'Преузимање адресе после $1 {{PLURAL:$1|try|покушаја}} није успело.',
 801+ 'externaldata-db-unknown-type' => 'Грешка: Непозната врста базе података.',
 802+ 'externaldata-db-could-not-connect' => 'Грешка: Повезивање с базом података није успело.',
 803+ 'externaldata-db-no-return-values' => 'Грешка: Повратне вредности нису одређене.',
 804+ 'externaldata-db-invalid-query' => 'Неисправан упит.',
 805+);
 806+
 807+/** Serbian Latin ekavian (‪Srpski (latinica)‬)
 808+ * @author Michaello
 809+ */
 810+$messages['sr-el'] = array(
 811+ 'getdata' => 'Preuzmi podatke',
 812+ 'externaldata-desc' => 'Omogućava preuzimanje podataka iz spoljašnjih adresa, bazi podataka i drugih izvora',
 813+ 'externaldata-ldap-unable-to-connect' => 'Povezivanje na $1 nije uspelo',
 814+ 'externaldata-json-decode-not-supported' => 'Greška: json_decode() nije podržan u ovom izdanju PHP-a',
 815+ 'externaldata-xml-error' => 'XML greška: $1 po liniji $2',
 816+ 'externaldata-db-incomplete-information' => 'Greška: Nepotpuni podaci za ovaj ID servera.',
 817+ 'externaldata-db-could-not-get-url' => 'Preuzimanje adrese posle $1 {{PLURAL:$1|try|pokušaja}} nije uspelo.',
 818+ 'externaldata-db-unknown-type' => 'Greška: Nepoznata vrsta baze podataka.',
 819+ 'externaldata-db-could-not-connect' => 'Greška: Povezivanje s bazom podataka nije uspelo.',
 820+ 'externaldata-db-no-return-values' => 'Greška: Povratne vrednosti nisu određene.',
 821+ 'externaldata-db-invalid-query' => 'Neispravan upit.',
 822+);
 823+
 824+/** Swedish (Svenska)
 825+ * @author Ainali
 826+ * @author Boivie
 827+ * @author Najami
 828+ * @author Per
 829+ * @author WikiPhoenix
 830+ */
 831+$messages['sv'] = array(
 832+ 'getdata' => 'Hämta data',
 833+ 'externaldata-desc' => 'Ger möjlighet att hämta strukturerad data från externa URL:er, databaser och andra källor',
 834+ 'externaldata-ldap-unable-to-connect' => 'Kunde inte koppla till $1',
 835+ 'externaldata-json-decode-not-supported' => 'Fel: json_decode() stöds inte i denna version av PHP',
 836+ 'externaldata-xml-error' => 'XML-fel: $1 på rad $2',
 837+ 'externaldata-db-incomplete-information' => 'Fel: Informationen för server-ID inte komplett.',
 838+ 'externaldata-db-could-not-get-url' => 'Kunde inte hämta URL på $1 {{PLURAL:$1|försök|försök}}.',
 839+ 'externaldata-db-unknown-type' => 'Fel: Okänd databastyp.',
 840+ 'externaldata-db-could-not-connect' => 'Fel: Kunde inte koppla till databasen.',
 841+ 'externaldata-db-no-return-values' => 'Fel: Inga returvärden specificerade.',
 842+ 'externaldata-db-invalid-query' => 'Ogiltig fråga.',
 843+ 'externaldata-db-option-unsupported' => 'Fel: Parametrarna $1 och $2 stöds inte i denna version av MediaWiki.',
 844+);
 845+
 846+/** Telugu (తెలుగు)
 847+ * @author Chaduvari
 848+ * @author Kiranmayee
 849+ */
 850+$messages['te'] = array(
 851+ 'getdata' => 'విషయములు తీసుకునిరా',
 852+ 'externaldata-ldap-unable-to-connect' => '$1 కు కనెక్టు కాలేకున్నాం',
 853+);
 854+
 855+/** Tagalog (Tagalog)
 856+ * @author AnakngAraw
 857+ * @author Sky Harbor
 858+ */
 859+$messages['tl'] = array(
 860+ 'getdata' => 'Kunin ang dato',
 861+ 'externaldata-desc' => 'Nagpapahintulot sa pagkuha ng nakabalangkas na datos mula sa panlabas na mga URL, mga kalipunan ng datos at sa ibang mga pinagmulan',
 862+ 'externaldata-ldap-unable-to-connect' => 'Hindi makakunekta sa $1',
 863+ 'externaldata-json-decode-not-supported' => 'Kamalian: hindi sinusuporta ang json_decode() sa bersyong ito ng PHP',
 864+ 'externaldata-xml-error' => 'Kamalian sa XML: $1 sa linyang $2',
 865+ 'externaldata-db-incomplete-information' => 'Kamalian: Hindi-kumpletong impormasyon para sa itong ID ng serbidor.',
 866+ 'externaldata-db-could-not-get-url' => 'Hindi makuha ang URL pagkatapos ng $1 {{PLURAL:$1|pagsubok|pagsubok}}',
 867+ 'externaldata-db-unknown-type' => 'Kamalian: Hindi-kilalang uri ng kalipunan ng datos.',
 868+ 'externaldata-db-could-not-connect' => 'Kamalian: Hindi makakunekta sa talaan ng dato.',
 869+ 'externaldata-db-no-return-values' => 'Kamalian: Walang tinukoy na halagang pabalik.',
 870+ 'externaldata-db-invalid-query' => 'Hindi tanggap na katanungan.',
 871+ 'externaldata-db-option-unsupported' => 'Kamalian: Ang mga parametrong $1 at $2 ay hindi tinatangkilik sa bersyong ito MediaWiki.',
 872+);
 873+
 874+/** Turkish (Türkçe)
 875+ * @author Karduelis
 876+ * @author Vito Genovese
 877+ */
 878+$messages['tr'] = array(
 879+ 'getdata' => 'Veri al',
 880+ 'externaldata-db-unknown-type' => 'Hata: Bilinmeyen veritabanı türü.',
 881+ 'externaldata-db-could-not-connect' => 'Hata: Veritabanına bağlanılamıyor.',
 882+ 'externaldata-db-no-return-values' => 'Hata: Dönüş değeri belirtilmedi.',
 883+ 'externaldata-db-invalid-query' => 'Geçersiz sorgu.',
 884+);
 885+
 886+/** Ukrainian (Українська)
 887+ * @author Тест
 888+ */
 889+$messages['uk'] = array(
 890+ 'getdata' => 'Отримати дані',
 891+ 'externaldata-ldap-unable-to-connect' => 'Не вдається підключитися до $1',
 892+ 'externaldata-xml-error' => 'Помилка XML: $1 в рядку $2',
 893+ 'externaldata-db-could-not-get-url' => 'Не вдалося отримати URL після $1 {{PLURAL:$1|спроби|спроб}}.',
 894+ 'externaldata-db-unknown-type' => 'Помилка: Невідомий тип бази даних.',
 895+ 'externaldata-db-could-not-connect' => 'Помилка: не вдалося підключитися до бази даних.',
 896+);
 897+
 898+/** Veps (Vepsan kel')
 899+ * @author Игорь Бродский
 900+ */
 901+$messages['vep'] = array(
 902+ 'getdata' => 'Sada andmused',
 903+);
 904+
 905+/** Vietnamese (Tiếng Việt)
 906+ * @author Minh Nguyen
 907+ * @author Vinhtantran
 908+ */
 909+$messages['vi'] = array(
 910+ 'getdata' => 'Lấy dữ liệu',
 911+ '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',
 912+ 'externaldata-xml-error' => 'Lỗi XML ở dòng $2: $1',
 913+);
 914+
 915+/** Yiddish (ייִדיש)
 916+ * @author פוילישער
 917+ */
 918+$messages['yi'] = array(
 919+ 'getdata' => 'באַקומען דאַטן',
 920+);
 921+
 922+/** Simplified Chinese (‪中文(简体)‬)
 923+ * @author Hydra
 924+ */
 925+$messages['zh-hans'] = array(
 926+ 'getdata' => '获取数据',
 927+ 'externaldata-db-invalid-query' => '无效的查询。',
 928+);
 929+
Property changes on: tags/extensions/ExternalData/REL_1_3_2/ExternalData.i18n.php
___________________________________________________________________
Added: svn:eol-style
1930 + native
Index: tags/extensions/ExternalData/REL_1_3_2/ExternalData.php
@@ -0,0 +1,81 @@
 2+<?php
 3+/**
 4+ * Initialization file for the External Data extension
 5+ *
 6+ * @file
 7+ * @ingroup ExternalData
 8+ * @author Yaron Koren
 9+ */
 10+
 11+if ( !defined( 'MEDIAWIKI' ) ) die();
 12+
 13+$wgExtensionCredits['parserhook'][] = array(
 14+ 'path' => __FILE__,
 15+ 'name' => 'External Data',
 16+ 'version' => '1.3.2',
 17+ 'author' => array( 'Yaron Koren', 'Michael Dale', 'David Macdonald' ),
 18+ 'url' => 'http://www.mediawiki.org/wiki/Extension:External_Data',
 19+ 'descriptionmsg' => 'externaldata-desc',
 20+);
 21+
 22+$wgHooks['ParserFirstCallInit'][] = 'edgRegisterParser';
 23+$wgExtensionMessagesFiles['ExternalData'] = dirname(__FILE__) . '/ExternalData.i18n.php';
 24+
 25+if ( version_compare( $wgVersion, '1.16alpha', '>=' ) ) {
 26+ $wgExtensionMessagesFiles['ExternalDataMagic'] = dirname(__FILE__) . '/ExternalData.i18n.magic.php';
 27+} else {
 28+ // Pre-1.16alpha backward compatibility for magic words
 29+ $wgHooks['LanguageGetMagic'][] = 'edgLanguageGetMagic';
 30+}
 31+
 32+// Register all special pages and other classes
 33+$wgAutoloadClasses['EDUtils'] = dirname(__FILE__) . '/ED_Utils.php';
 34+$wgAutoloadClasses['EDParserFunctions'] = dirname(__FILE__) . '/ED_ParserFunctions.php';
 35+$wgSpecialPages['GetData'] = 'EDGetData';
 36+$wgAutoloadClasses['EDGetData'] = dirname(__FILE__) . '/ED_GetData.php';
 37+$wgSpecialPageGroups['GetData'] = 'pagetools';
 38+
 39+$edgValues = array();
 40+$edgStringReplacements = array();
 41+$edgCacheTable = null;
 42+$edgAllowSSL = true;
 43+
 44+// Value is in seconds - set to one week
 45+$edgCacheExpireTime = 60 * 60 * 24 * 7;
 46+
 47+$edgDBServer = array();
 48+$edgDBServerType = array();
 49+$edgDBName = array();
 50+$edgDBUser = array();
 51+$edgDBPass = array();
 52+$edgDBFlags = array();
 53+$edgDBTablePrefix = array();
 54+
 55+function edgRegisterParser( &$parser ) {
 56+ $parser->setFunctionHook( 'get_external_data', array( 'EDParserFunctions', 'doGetExternalData' ) );
 57+ $parser->setFunctionHook( 'get_web_data', array( 'EDParserFunctions', 'doGetWebData' ) );
 58+ $parser->setFunctionHook( 'get_ldap_data', array( 'EDParserFunctions', 'doGetLDAPData' ) );
 59+ $parser->setFunctionHook( 'get_db_data', array( 'EDParserFunctions', 'doGetDBData' ) );
 60+ $parser->setFunctionHook( 'external_value', array( 'EDParserFunctions', 'doExternalValue' ) );
 61+ $parser->setFunctionHook( 'for_external_table', array( 'EDParserFunctions', 'doForExternalTable' ) );
 62+ $parser->setFunctionHook( 'store_external_table', array( 'EDParserFunctions', 'doStoreExternalTable' ) );
 63+ $parser->setFunctionHook( 'clear_external_data', array( 'EDParserFunctions', 'doClearExternalData' ) );
 64+
 65+ return true; // always return true, in order not to stop MW's hook processing!
 66+}
 67+
 68+// Pre-1.16alpha backward compatibility for magic words
 69+function edgLanguageGetMagic( &$magicWords, $langCode = "en" ) {
 70+ switch ( $langCode ) {
 71+ default:
 72+ $magicWords['get_external_data'] = array ( 0, 'get_external_data' );
 73+ $magicWords['get_web_data'] = array ( 0, 'get_web_data' );
 74+ $magicWords['get_ldap_data'] = array ( 0, 'get_ldap_data' );
 75+ $magicWords['get_db_data'] = array ( 0, 'get_db_data' );
 76+ $magicWords['external_value'] = array ( 0, 'external_value' );
 77+ $magicWords['for_external_table'] = array ( 0, 'for_external_table' );
 78+ $magicWords['store_external_table'] = array ( 0, 'store_external_table' );
 79+ $magicWords['clear_external_data'] = array ( 0, 'clear_external_data' );
 80+ }
 81+ return true;
 82+}
Property changes on: tags/extensions/ExternalData/REL_1_3_2/ExternalData.php
___________________________________________________________________
Added: svn:eol-style
183 + native
Index: tags/extensions/ExternalData/REL_1_3_2/ED_ParserFunctions.php
@@ -0,0 +1,382 @@
 2+<?php
 3+/**
 4+ * Class for handling the parser functions for External Data
 5+ */
 6+
 7+if ( !defined( 'MEDIAWIKI' ) ) {
 8+ die( 'This file is a MediaWiki extension; it is not a valid entry point' );
 9+}
 10+
 11+class EDParserFunctions {
 12+
 13+ /**
 14+ * Render the #get_external_data parser function
 15+ * @deprecated
 16+ */
 17+ static function doGetExternalData( &$parser ) {
 18+ global $wgTitle, $edgCurPageName, $edgValues;
 19+
 20+ // if we're handling multiple pages, reset $edgValues
 21+ // when we move from one page to another
 22+ $cur_page_name = $wgTitle->getText();
 23+ if ( ! isset( $edgCurPageName ) || $edgCurPageName != $cur_page_name ) {
 24+ $edgValues = array();
 25+ $edgCurPageName = $cur_page_name;
 26+ }
 27+
 28+ $params = func_get_args();
 29+ array_shift( $params ); // we already know the $parser ...
 30+ $url = array_shift( $params );
 31+ $url = str_replace( ' ', '%20', $url ); // do some minor URL-encoding
 32+ // if the URL isn't allowed (based on a whitelist), exit
 33+ if ( ! EDUtils::isURLAllowed( $url ) ) {
 34+ return;
 35+ }
 36+
 37+ $format = strtolower( array_shift( $params ) ); // make case-insensitive
 38+ $external_values = EDUtils::getDataFromURL( $url, $format );
 39+ if ( count( $external_values ) == 0 ) {
 40+ return;
 41+ }
 42+
 43+ // Get set of filters and set of mappings, determining each
 44+ // one by whether there's a double or single equals sign,
 45+ // respectively.
 46+ $filters = array();
 47+ $mappings = array();
 48+ foreach ( $params as $param ) {
 49+ if ( strpos( $param, '==' ) ) {
 50+ list( $external_var, $value ) = explode( '==', $param );
 51+ // set to all lowercase to avoid casing issues
 52+ $external_var = strtolower( $external_var );
 53+ $filters[$external_var] = $value;
 54+ } elseif ( strpos( $param, '=' ) ) {
 55+ list( $local_var, $external_var ) = explode( '=', $param );
 56+ // set to all lowercase to avoid casing issues
 57+ $external_var = strtolower( $external_var );
 58+ $mappings[$local_var] = $external_var;
 59+ } else {
 60+ // if the parameter contains no equals signs,
 61+ // do nothing
 62+ }
 63+ }
 64+ self::setGlobalValuesArray( $external_values, $filters, $mappings );
 65+ }
 66+
 67+ /**
 68+ * A helper function, since it's called by both doGetExternalData()
 69+ * and doGetWebData() - the former is deprecated.
 70+ */
 71+ static public function setGlobalValuesArray( $external_values, $filters, $mappings ) {
 72+ global $edgValues;
 73+
 74+ foreach ( $filters as $filter_var => $filter_value ) {
 75+ // Find the entry of $external_values that matches
 76+ // the filter variable; if none exists, just ignore
 77+ // the filter.
 78+ if ( array_key_exists( $filter_var, $external_values ) ) {
 79+ if ( is_array( $external_values[$filter_var] ) ) {
 80+ $column_values = $external_values[$filter_var];
 81+ foreach ( $column_values as $i => $single_value ) {
 82+ // if a value doesn't match
 83+ // the filter value, remove
 84+ // the value from this row for
 85+ // all columns
 86+ if ( trim( $single_value ) != trim( $filter_value ) ) {
 87+ foreach ( $external_values as $external_var => $external_value ) {
 88+ unset( $external_values[$external_var][$i] );
 89+ }
 90+ }
 91+ }
 92+ } else {
 93+ // if we have only one row of values,
 94+ // and the filter doesn't match, just
 95+ // keep the results array blank and
 96+ // return
 97+ if ( $external_values[$filter_var] != $filter_value ) {
 98+ return;
 99+ }
 100+ }
 101+ }
 102+ }
 103+ // for each external variable name specified in the function
 104+ // call, get its value or values (if any exist), and attach it
 105+ // or them to the local variable name
 106+ foreach ( $mappings as $local_var => $external_var ) {
 107+ if ( array_key_exists( $external_var, $external_values ) ) {
 108+ if ( is_array( $external_values[$external_var] ) )
 109+ // array_values() restores regular
 110+ // 1, 2, 3 indexes to array, after unset()
 111+ // in filtering may have removed some
 112+ $edgValues[$local_var] = array_values( $external_values[$external_var] );
 113+ else
 114+ $edgValues[$local_var][] = $external_values[$external_var];
 115+ }
 116+ }
 117+ }
 118+
 119+ /**
 120+ * Render the #get_web_data parser function
 121+ */
 122+ static function doGetWebData( &$parser ) {
 123+ global $wgTitle, $edgCurPageName, $edgValues;
 124+
 125+ // If we're handling multiple pages, reset $edgValues
 126+ // when we move from one page to another.
 127+ $cur_page_name = $wgTitle->getText();
 128+ if ( ! isset( $edgCurPageName ) || $edgCurPageName != $cur_page_name ) {
 129+ $edgValues = array();
 130+ $edgCurPageName = $cur_page_name;
 131+ }
 132+
 133+ $params = func_get_args();
 134+ array_shift( $params ); // we already know the $parser ...
 135+ $args = EDUtils::parseParams( $params ); // parse params into name-value pairs
 136+ if ( array_key_exists( 'url', $args ) ) {
 137+ $url = $args['url'];
 138+ } else {
 139+ return;
 140+ }
 141+ $url = str_replace( ' ', '%20', $url ); // do some minor URL-encoding
 142+ // if the URL isn't allowed (based on a whitelist), exit
 143+ if ( ! EDUtils::isURLAllowed( $url ) ) {
 144+ return;
 145+ }
 146+
 147+ if ( array_key_exists( 'format', $args ) ) {
 148+ $format = strtolower( $args['format'] );
 149+ } else {
 150+ $format = '';
 151+ }
 152+ $external_values = EDUtils::getDataFromURL( $url, $format );
 153+ if ( count( $external_values ) == 0 ) {
 154+ return;
 155+ }
 156+
 157+ if ( array_key_exists( 'data', $args ) ) {
 158+ // parse the 'data' arg into mappings
 159+ $mappings = EDUtils::paramToArray( $args['data'], false, true );
 160+ } else {
 161+ return;
 162+ }
 163+ if ( array_key_exists( 'filters', $args ) ) {
 164+ // parse the 'filters' arg
 165+ $filters = EDUtils::paramToArray( $args['filters'], true, false );
 166+ } else {
 167+ $filters = array();
 168+ }
 169+
 170+ self::setGlobalValuesArray( $external_values, $filters, $mappings );
 171+ }
 172+
 173+ /**
 174+ * Render the #get_ldap_data parser function
 175+ */
 176+ static function doGetLDAPData( &$parser ) {
 177+ global $wgTitle, $edgCurPageName, $edgValues;
 178+
 179+ // if we're handling multiple pages, reset $edgValues
 180+ // when we move from one page to another
 181+ $cur_page_name = $wgTitle->getText();
 182+ if ( ! isset( $edgCurPageName ) || $edgCurPageName != $cur_page_name ) {
 183+ $edgValues = array();
 184+ $edgCurPageName = $cur_page_name;
 185+ }
 186+
 187+ $params = func_get_args();
 188+ array_shift( $params ); // we already know the $parser ...
 189+ $args = EDUtils::parseParams( $params ); // parse params into name-value pairs
 190+ $mappings = EDUtils::paramToArray( $args['data'] ); // parse the data arg into mappings
 191+
 192+ $external_values = EDUtils::getLDAPData( $args['filter'], $args['domain'], array_values( $mappings ) );
 193+
 194+ // Build $edgValues
 195+ foreach ( $mappings as $local_var => $external_var ) {
 196+ $edgValues[$local_var][] = $external_values[0][$external_var][0];
 197+ }
 198+ return;
 199+ }
 200+
 201+ /**
 202+ * Render the #get_db_data parser function
 203+ */
 204+ static function doGetDBData( &$parser ) {
 205+ global $wgTitle, $edgCurPageName, $edgValues;
 206+
 207+ // if we're handling multiple pages, reset $edgValues
 208+ // when we move from one page to another
 209+ $cur_page_name = $wgTitle->getText();
 210+ if ( ! isset( $edgCurPageName ) || $edgCurPageName != $cur_page_name ) {
 211+ $edgValues = array();
 212+ $edgCurPageName = $cur_page_name;
 213+ }
 214+
 215+ $params = func_get_args();
 216+ array_shift( $params ); // we already know the $parser ...
 217+ $args = EDUtils::parseParams( $params ); // parse params into name-value pairs
 218+ $data = ( array_key_exists( 'data', $args ) ) ? $args['data'] : null;
 219+ $dbID = ( array_key_exists( 'db', $args ) ) ? $args['db'] : null;
 220+ // For backwards-compatibility - 'db' parameter was added
 221+ // in External Data version 1.3.
 222+ if ( is_null( $dbID ) ) {
 223+ $dbID = ( array_key_exists( 'server', $args ) ) ? $args['server'] : null;
 224+ }
 225+ $table = ( array_key_exists( 'from', $args ) ) ? $args['from'] : null;
 226+ $conds = ( array_key_exists( 'where', $args ) ) ? $args['where'] : null;
 227+ $limit = ( array_key_exists( 'limit', $args ) ) ? $args['limit'] : null;
 228+ $orderBy = ( array_key_exists( 'order by', $args ) ) ? $args['order by'] : null;
 229+ $options = array( 'LIMIT' => $limit, 'ORDER BY' => $orderBy );
 230+ $mappings = EDUtils::paramToArray( $data ); // parse the data arg into mappings
 231+
 232+ $external_values = EDUtils::getDBData( $dbID, $table, array_values( $mappings ), $conds, $options );
 233+ // handle error cases
 234+ if ( is_null( $external_values ) )
 235+ return;
 236+
 237+ // Build $edgValues
 238+ foreach ( $mappings as $local_var => $external_var ) {
 239+ if ( array_key_exists( $external_var, $external_values ) ) {
 240+ foreach ( $external_values[$external_var] as $value ) {
 241+ $edgValues[$local_var][] = $value;
 242+ }
 243+ }
 244+ }
 245+ return;
 246+ }
 247+
 248+ /**
 249+ * Get the specified index of the array for the specified local
 250+ * variable retrieved by #get_external_data
 251+ */
 252+ static function getIndexedValue( $var, $i ) {
 253+ global $edgValues;
 254+ if ( array_key_exists( $var, $edgValues ) && count( $edgValues[$var] > $i ) )
 255+ return $edgValues[$var][$i];
 256+ else
 257+ return '';
 258+ }
 259+
 260+ /**
 261+ * Render the #external_value parser function
 262+ */
 263+ static function doExternalValue( &$parser, $local_var = '' ) {
 264+ global $edgValues;
 265+ if ( ! array_key_exists( $local_var, $edgValues ) )
 266+ return '';
 267+ elseif ( is_array( $edgValues[$local_var] ) )
 268+ return $edgValues[$local_var][0];
 269+ else
 270+ return $edgValues[$local_var];
 271+ }
 272+
 273+ /**
 274+ * Render the #for_external_table parser function
 275+ */
 276+ static function doForExternalTable( &$parser, $expression = '' ) {
 277+ global $edgValues;
 278+
 279+ // get the variables used in this expression, get the number
 280+ // of values for each, and loop through
 281+ $matches = array();
 282+ preg_match_all( '/{{{([^}]*)}}}/', $expression, $matches );
 283+ $variables = $matches[1];
 284+ $num_loops = 0;
 285+ foreach ( $variables as $variable ) {
 286+ // ignore the presence of '.urlencode' - it's a command,
 287+ // not part of the actual variable name
 288+ $variable = str_replace( '.urlencode', '', $variable );
 289+ if ( array_key_exists( $variable, $edgValues ) ) {
 290+ $num_loops = max( $num_loops, count( $edgValues[$variable] ) );
 291+ }
 292+ }
 293+ $text = "";
 294+ for ( $i = 0; $i < $num_loops; $i++ ) {
 295+ $cur_expression = $expression;
 296+ foreach ( $variables as $variable ) {
 297+ // if variable name ends with a ".urlencode",
 298+ // that's a command - URL-encode the value of
 299+ // the actual variable
 300+ $loc_of_urlencode = strrpos( $variable, '.urlencode' );
 301+ if ( ( $loc_of_urlencode > 0 ) && ( $loc_of_urlencode == strlen( $variable ) - strlen( '.urlencode' ) ) ) {
 302+ $real_var = str_replace( '.urlencode', '', $variable );
 303+ $value = urlencode( self::getIndexedValue( $real_var , $i ) );
 304+ } else {
 305+ $value = self::getIndexedValue( $variable , $i );
 306+ }
 307+ $cur_expression = str_replace( '{{{' . $variable . '}}}', $value, $cur_expression );
 308+ }
 309+ $text .= $cur_expression;
 310+ }
 311+ return $text;
 312+ }
 313+
 314+ /**
 315+ * Render the #store_external_table parser function
 316+ */
 317+ static function doStoreExternalTable( &$parser ) {
 318+ if ( ! class_exists( 'SIOHandler' ) ) {
 319+ return 'Semantic Internal Objects is not installed';
 320+ }
 321+ global $edgValues;
 322+
 323+ $params = func_get_args();
 324+ array_shift( $params ); // we already know the $parser...
 325+
 326+ // get the variables used in this expression, get the number
 327+ // of values for each, and loop through
 328+ $expression = implode( '|', $params );
 329+ $matches = array();
 330+ preg_match_all( '/{{{([^}]*)}}}/', $expression, $matches );
 331+ $variables = $matches[1];
 332+ $num_loops = 0;
 333+ foreach ( $variables as $variable ) {
 334+ // ignore the presence of '.urlencode' - it's a command,
 335+ // not part of the actual variable name
 336+ $variable = str_replace( '.urlencode', '', $variable );
 337+ if ( array_key_exists( $variable, $edgValues ) ) {
 338+ $num_loops = max( $num_loops, count( $edgValues[$variable] ) );
 339+ }
 340+ }
 341+ $text = "";
 342+ for ( $i = 0; $i < $num_loops; $i++ ) {
 343+ // re-get $params
 344+ $params = func_get_args();
 345+ array_shift( $params );
 346+ foreach ( $params as $j => $param ) {
 347+ foreach ( $variables as $variable ) {
 348+ // if variable name ends with a ".urlencode",
 349+ // that's a command - URL-encode the value of
 350+ // the actual variable
 351+ if ( strrpos( $variable, '.urlencode' ) == strlen( $variable ) - strlen( '.urlencode' ) ) {
 352+ $real_var = str_replace( '.urlencode', '', $variable );
 353+ $value = urlencode( self::getIndexedValue( $real_var , $i ) );
 354+ } else {
 355+ $value = self::getIndexedValue( $variable , $i );
 356+ }
 357+ $params[$j] = str_replace( '{{{' . $variable . '}}}', $value, $params[$j] );
 358+ }
 359+ }
 360+ // Add $parser to the beginning of the $params array,
 361+ // and pass the whole thing in as arguments to
 362+ // doSetInternal, to mimic a call to #set_internal.
 363+ array_unshift( $params, $parser );
 364+ // As of PHP 5.3.1, call_user_func_array() requires that
 365+ // the function params be references. Workaround via
 366+ // http://stackoverflow.com/questions/2045875/pass-by-reference-problem-with-php-5-3-1
 367+ $refParams = array();
 368+ foreach ( $params as $key => $value ) {
 369+ $refParams[$key] = &$params[$key];
 370+ }
 371+ call_user_func_array( array( 'SIOHandler', 'doSetInternal' ), $refParams );
 372+ }
 373+ return null;
 374+ }
 375+
 376+ /**
 377+ * Render the #clear_external_data parser function
 378+ */
 379+ static function doClearExternalData( &$parser ) {
 380+ global $edgValues;
 381+ $edgValues = array();
 382+ }
 383+}
Property changes on: tags/extensions/ExternalData/REL_1_3_2/ED_ParserFunctions.php
___________________________________________________________________
Added: svn:eol-style
1384 + native
Index: tags/extensions/ExternalData/REL_1_3_2/ED_GetData.php
@@ -0,0 +1,71 @@
 2+<?php
 3+/**
 4+ * A special page for retrieving selected rows of any wiki page that contains
 5+ * data in CSV format
 6+ */
 7+
 8+if ( !defined( 'MEDIAWIKI' ) ) die();
 9+
 10+class EDGetData extends SpecialPage {
 11+
 12+ /**
 13+ * Constructor
 14+ */
 15+ function __construct() {
 16+ parent::__construct( 'GetData' );
 17+ EDUtils::loadMessages();
 18+ }
 19+
 20+ function execute( $query ) {
 21+ global $wgRequest, $wgOut;
 22+ $wgOut->disable();
 23+
 24+ $this->setHeaders();
 25+ $page_name = $query;
 26+ $title = Title::newFromText( $page_name );
 27+ if ( is_null( $title ) )
 28+ return;
 29+ if ( ! $title->userCanRead() )
 30+ return;
 31+ $article = new Article( $title );
 32+ $page_text = $article->fetchContent();
 33+ // Remove <noinclude> sections and <includeonly> tags from text
 34+ $page_text = StringUtils::delimiterReplace( '<noinclude>', '</noinclude>', '', $page_text );
 35+ $page_text = strtr( $page_text, array( '<includeonly>' => '', '</includeonly>' => '' ) );
 36+ $orig_lines = explode( "\n", $page_text );
 37+ // ignore lines that are either blank or start with a semicolon
 38+ $page_lines = array();
 39+ foreach ( $orig_lines as $i => $line )
 40+ if ( $line != '' && $line[0] != ';' )
 41+ $page_lines[] = $line;
 42+ $headers = EDUtils::getValuesFromCSVLine( $page_lines[0] );
 43+ $queried_headers = array();
 44+ foreach ( $wgRequest->getValues() as $key => $value ) {
 45+ foreach ( $headers as $header_index => $header_value ) {
 46+ $header_value = str_replace( ' ', '_', $header_value );
 47+ if ( $key == $header_value ) {
 48+ $queried_headers[$header_index] = $value;
 49+ }
 50+ }
 51+ }
 52+ // include header in output
 53+ $text = $page_lines[0];
 54+ foreach ( $page_lines as $i => $line ) {
 55+ if ( $i == 0 ) continue;
 56+ $row_values = EDUtils::getValuesFromCSVLine( $line );
 57+ $found_match = true;
 58+ foreach ( $queried_headers as $i => $query_value ) {
 59+ $single_value = str_replace( ' ', '_', $row_values[$i] );
 60+ if ( $single_value != $query_value ) {
 61+ $found_match = false;
 62+ }
 63+ }
 64+ if ( $found_match ) {
 65+ if ( $text != '' ) $text .= "\n";
 66+ $text .= $line;
 67+ }
 68+ }
 69+ print $text;
 70+ }
 71+
 72+}
Property changes on: tags/extensions/ExternalData/REL_1_3_2/ED_GetData.php
___________________________________________________________________
Added: svn:eol-style
173 + native
Index: tags/extensions/ExternalData/REL_1_3_2/ExternalData.sql
@@ -0,0 +1,9 @@
 2+CREATE TABLE IF NOT EXISTS `ed_url_cache` (
 3+ `id` int(10) unsigned NOT NULL auto_increment,
 4+ `url` varchar(255) NOT NULL,
 5+ `post_vars` text,
 6+ `req_time` int(11) NOT NULL,
 7+ `result` longtext character set utf8 collate utf8_unicode_ci,
 8+ UNIQUE KEY `id` (`id`),
 9+ KEY `url` (`url`)
 10+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
\ No newline at end of file
Property changes on: tags/extensions/ExternalData/REL_1_3_2/ExternalData.sql
___________________________________________________________________
Added: svn:eol-style
111 + native
Index: tags/extensions/ExternalData/REL_1_3_2/README
@@ -0,0 +1,106 @@
 2+External Data extension
 3+
 4+ Version 1.3.2
 5+ Yaron Koren, Michael Dale and David Macdonald
 6+
 7+This is free software licensed under the GNU General Public License. Please
 8+see http://www.gnu.org/copyleft/gpl.html for further details, including the
 9+full text and terms of the license.
 10+
 11+== Overview ==
 12+
 13+External Data is an extension to MediaWiki that allows for retrieving data
 14+from various sources: external URLs and local wiki pages (in CSV, GFF, JSON
 15+and XML formats), database tables, and LDAP servers.
 16+
 17+The extension defines seven parser functions - #get_web_data,
 18+#get_external_data, #get_db_data, #get_ldap_data, #external_value,
 19+#for_external_table, #store_external_table and #clear_external_data.
 20+They are described below:
 21+
 22+* #get_web_data retrieves the data from a URL that holds CSV, GFF,
 23+JSON or XML, and assigns it to local variables or arrays.
 24+
 25+* #get_external_data is an earlier version of #get_web_data that does
 26+the same thing; it is deprecated.
 27+
 28+* #get_db_data retrieves data from a database, using a SQL query, and
 29+assigns it to local variables or arrays.
 30+
 31+* #get_ldap_data retrieves data from an LDAP server and assigns it to
 32+local variables.
 33+
 34+* #external_value displays the value of any retrieved variable, or the
 35+first value if it's an array.
 36+
 37+* #for_external_table applies processing onto multiple rows retrieved by
 38+any of the #get_*_data functions
 39+
 40+* #store_external_table mimics a call to the Semantic Internal Objects
 41+extension's #set_internal parser function onto each row retrieved by
 42+any of the #get_*_data functions, in order to store the entire array
 43+of data semantically.
 44+
 45+* #clear_external_data erases the current set of retrieved data.
 46+
 47+In addition, the extension defines a new special page, 'GetData', that
 48+exports selected rows from a wiki page that holds CSV data, in a format
 49+that is readable by #get_web_data.
 50+
 51+For more information, see the extension homepage at:
 52+http://www.mediawiki.org/wiki/Extension:External_Data
 53+
 54+== Requirements ==
 55+
 56+This version of the External Data extension requires MediaWiki 1.11 or higher.
 57+
 58+== Installation ==
 59+
 60+To install the extension, place the entire 'ExternalData' directory
 61+within your MediaWiki 'extensions' directory, then add the following
 62+line to your 'LocalSettings.php' file:
 63+
 64+ require_once( "$IP/extensions/ExternalData/ExternalData.php" );
 65+
 66+To cache the data from the URLs being accessed, you can call the contents
 67+of ExternalData.sql in your database, then add the following to
 68+LocalSettings.php:
 69+
 70+ $edgCacheTable = 'ed_url_cache';
 71+
 72+You should also add a line like the following, to set the expiration time
 73+of the cache, in seconds; this line will cache data for a week:
 74+
 75+ $edgCacheExpireTime = 7 * 24 * 60 * 60;
 76+
 77+You can also set for string replacements to be done on the URLs you call,
 78+for instance to hide API keys:
 79+
 80+ $edgStringReplacements['MY_API_KEY'] = 'abcd1324';
 81+
 82+You can create a "whitelist" to allow retrieval of data only from trusted
 83+sites, in the manner of MediaWiki's $wgAllowExternalImagesFrom - if you
 84+are hiding API keys, it is very much recommended to create such a
 85+whitelist, to prevent users from being able to discover their values:
 86+
 87+ $edgAllowExternalDataFrom = array('http://example.com/api');
 88+
 89+Finally, to use the database or LDAP retrieval capabilities, you need to
 90+set connection settings as well - see the online documentation for more
 91+information.
 92+
 93+== Contact ==
 94+
 95+Most comments, questions, suggestions and bug reports should be sent to
 96+the Semantic MediaWiki mailing list:
 97+
 98+ https://lists.sourceforge.net/lists/listinfo/semediawiki-user
 99+
 100+Although the External Data extension in general is independent of Semantic
 101+MediaWiki, the fact that it uses Semantic Internal Objects for one of its
 102+functions, along with the fact that the two extensions are often used
 103+together, means that it can be considered part of the Semantic MediaWiki
 104+family for communication purposes.
 105+
 106+If possible, please add "[ED]" at the beginning of the subject line, to
 107+clarify the subject matter.
Property changes on: tags/extensions/ExternalData/REL_1_3_2/README
___________________________________________________________________
Added: svn:eol-style
1108 + native
Index: tags/extensions/ExternalData/REL_1_3_2/ED_Utils.php
@@ -0,0 +1,564 @@
 2+<?php
 3+/**
 4+ * Utility functions for External Data
 5+ */
 6+
 7+if ( !defined( 'MEDIAWIKI' ) ) {
 8+ die( 'This file is a MediaWiki extension; it is not a valid entry point' );
 9+}
 10+
 11+class EDUtils {
 12+ // how many times to try an HTTP request
 13+ private static $http_number_of_tries = 3;
 14+
 15+ /*
 16+ * Loads messages only for MediaWiki versions that need it (< 1.16)
 17+ */
 18+ public static function loadMessages() {
 19+ global $wgVersion;
 20+ if ( version_compare( $wgVersion, '1.16', '<' ) ) {
 21+ wfLoadExtensionMessages( 'ExternalData' );
 22+ }
 23+ }
 24+
 25+ // XML-handling functions based on code found at
 26+ // http://us.php.net/xml_set_element_handler
 27+ static function startElement( $parser, $name, $attrs ) {
 28+ global $edgCurrentXMLTag, $edgXMLValues;
 29+ // set to all lowercase to avoid casing issues
 30+ $edgCurrentXMLTag = strtolower( $name );
 31+ foreach ( $attrs as $attr => $value ) {
 32+ $attr = strtolower( $attr );
 33+ if ( array_key_exists( $attr, $edgXMLValues ) )
 34+ $edgXMLValues[$attr][] = $value;
 35+ else
 36+ $edgXMLValues[$attr] = array( $value );
 37+ }
 38+ }
 39+
 40+ static function endElement( $parser, $name ) {
 41+ global $edgCurrentXMLTag;
 42+ $edgCurrentXMLTag = "";
 43+ }
 44+
 45+ static function getContent( $parser, $content ) {
 46+ global $edgCurrentXMLTag, $edgXMLValues;
 47+ if ( array_key_exists( $edgCurrentXMLTag, $edgXMLValues ) )
 48+ $edgXMLValues[$edgCurrentXMLTag][] = $content;
 49+ else
 50+ $edgXMLValues[$edgCurrentXMLTag] = array( $content );
 51+ }
 52+
 53+ static function parseParams( $params ) {
 54+ $args = array();
 55+ foreach ( $params as $param ) {
 56+ $param = preg_replace ( "/\s\s+/", ' ', $param ); // whitespace
 57+ $param_parts = explode( "=", $param, 2 );
 58+ if ( count( $param_parts ) < 2 ) {
 59+ continue;
 60+ }
 61+ list( $name, $value ) = $param_parts;
 62+ $args[$name] = $value;
 63+ }
 64+ return $args;
 65+ }
 66+
 67+ /**
 68+ * Parses an argument of the form "a=b,c=d,..." into an array
 69+ */
 70+ static function paramToArray( $arg, $lowercaseKeys = false, $lowercaseValues = false ) {
 71+ $arg = preg_replace ( "/\s\s+/", ' ', $arg ); // whitespace
 72+
 73+ // Split text on commas, except for commas found within quotes
 74+ // and parentheses. Code based on:
 75+ // http://stackoverflow.com/questions/1373735/regexp-split-string-by-commas-and-spaces-but-ignore-the-inside-quotes-and-parent#1381895
 76+ $pattern = <<<END
 77+ /
 78+ [,]++
 79+ (?=(?:(?:[^"]*+"){2})*+[^"]*+$)
 80+ (?=(?:(?:[^']*+'){2})*+[^']*+$)
 81+ (?=(?:[^()]*+\([^()]*+\))*+[^()]*+$)
 82+ /x
 83+END;
 84+ // " - fix for color highlighting in vi :)
 85+ $keyValuePairs = preg_split( $pattern, $arg );
 86+
 87+ $returnArray = array();
 88+ foreach ( $keyValuePairs as $keyValuePair ) {
 89+ $keyAndValue = explode( '=', $keyValuePair, 2 );
 90+ if ( count( $keyAndValue ) == 2 ) {
 91+ $key = trim( $keyAndValue[0] );
 92+ if ( $lowercaseKeys ) {
 93+ $key = strtolower( $key );
 94+ }
 95+ $value = trim( $keyAndValue[1] );
 96+ if ( $lowercaseValues ) {
 97+ $value = strtolower( $value );
 98+ }
 99+ $returnArray[$key] = $value;
 100+ }
 101+ }
 102+ return $returnArray;
 103+ }
 104+
 105+ static function getLDAPData( $filter, $domain, $params ) {
 106+ global $edgLDAPServer;
 107+ global $edgLDAPUser;
 108+ global $edgLDAPPass;
 109+
 110+ $ds = EDUtils::connectLDAP( $edgLDAPServer[$domain], $edgLDAPUser[$domain], $edgLDAPPass[$domain] );
 111+ $results = EDUtils::searchLDAP( $ds, $domain, $filter, $params );
 112+
 113+ return $results;
 114+ }
 115+
 116+ static function connectLDAP( $server, $username, $password ) {
 117+ $ds = ldap_connect( $server );
 118+ if ( $ds ) {
 119+ // these options for Active Directory only?
 120+ ldap_set_option( $ds, LDAP_OPT_PROTOCOL_VERSION, 3 );
 121+ ldap_set_option( $ds, LDAP_OPT_REFERRALS, 0 );
 122+
 123+ if ( $username ) {
 124+ $r = ldap_bind( $ds, $username, $password );
 125+ } else {
 126+ # no username, so do anonymous bind
 127+ $r = ldap_bind( $ds );
 128+ }
 129+
 130+ # should check the result of the bind here
 131+ return $ds;
 132+ } else {
 133+ echo ( wfMsgExt( "externaldata-ldap-unable-to-connect", array( 'parse', 'escape' ), $server ) );
 134+ }
 135+ }
 136+
 137+ static function searchLDAP( $ds, $domain, $filter, $attributes ) {
 138+ global $edgLDAPBaseDN;
 139+
 140+ $sr = ldap_search( $ds, $edgLDAPBaseDN[$domain], $filter, $attributes );
 141+ $results = ldap_get_entries( $ds, $sr );
 142+ return $results;
 143+ }
 144+
 145+ static function getDBData( $dbID, $from, $columns, $where, $options ) {
 146+ global $edgDBServerType;
 147+ global $edgDBServer;
 148+ global $edgDBName;
 149+ global $edgDBUser;
 150+ global $edgDBPass;
 151+ global $edgDBFlags;
 152+ global $edgDBTablePrefix;
 153+
 154+ // Mandatory parameters
 155+ if ( ( ! array_key_exists( $dbID, $edgDBServerType ) ) ||
 156+ ( ! array_key_exists( $dbID, $edgDBServer ) ) ||
 157+ ( ! array_key_exists( $dbID, $edgDBName ) ) ||
 158+ ( ! array_key_exists( $dbID, $edgDBUser ) ) ||
 159+ ( ! array_key_exists( $dbID, $edgDBPass ) ) ) {
 160+ echo ( wfMsgExt( "externaldata-db-incomplete-information", array( 'parse', 'escape' ) ) );
 161+ return;
 162+ }
 163+
 164+ $db_type = $edgDBServerType[$dbID];
 165+ $db_server = $edgDBServer[$dbID];
 166+ $db_name = $edgDBName[$dbID];
 167+ $db_username = $edgDBUser[$dbID];
 168+ $db_password = $edgDBPass[$dbID];
 169+
 170+ // Optional parameters
 171+ if ( array_key_exists( $dbID, $edgDBFlags ) ) {
 172+ $db_flags = $edgDBFlags[$dbID];
 173+ } else {
 174+ $db_flags = DBO_DEFAULT;
 175+ }
 176+ if ( array_key_exists( $dbID, $edgDBTablePrefix ) ) {
 177+ $db_tableprefix = $edgDBTablePrefix[$dbID];
 178+ } else {
 179+ $db_tableprefix = '';
 180+ }
 181+
 182+ // DatabaseBase::newFromType() was added in MW 1.17
 183+ $realFunction = array( 'DatabaseBase', 'newFromType' );
 184+ if ( is_callable( $realFunction ) ) {
 185+ $db = DatabaseBase::newFromType( $db_type,
 186+ array(
 187+ 'host' => $db_server,
 188+ 'user' => $db_username,
 189+ 'password' => $db_password,
 190+ 'dbname' => $db_name,
 191+ 'flags' => $db_flags,
 192+ 'tableprefix' => $db_tableprefix,
 193+ )
 194+ );
 195+ } else {
 196+ if ( ( $db_flags !== DBO_DEFAULT ) || ( $db_tableprefix !== '' ) ) {
 197+ print wfMsg( "externaldata-db-option-unsupported", '<code>$edgDBFlags</code>', '<code>$edgDBTablePrefix</code>' );
 198+ return;
 199+ }
 200+
 201+ if ( $db_type == "mysql" ) {
 202+ $db = new Database( $db_server, $db_username, $db_password, $db_name );
 203+ } elseif ( $db_type == "postgres" ) {
 204+ $db = new DatabasePostgres( $db_server, $db_username, $db_password, $db_name );
 205+ } elseif ( $db_type == "mssql" ) {
 206+ $db = new DatabaseMssql( $db_server, $db_username, $db_password, $db_name );
 207+ } elseif ( $db_type == "oracle" ) {
 208+ $db = new DatabaseOracle( $db_server, $db_username, $db_password, $db_name );
 209+ } else {
 210+ $db = null;
 211+ }
 212+ }
 213+
 214+ if ( $db == null ) {
 215+ echo ( wfMsgExt( "externaldata-db-unknown-type", array( 'parse', 'escape' ) ) );
 216+ return;
 217+ }
 218+
 219+ if ( ! $db->isOpen() ) {
 220+ echo ( wfMsgExt( "externaldata-db-could-not-connect", array( 'parse', 'escape' ) ) );
 221+ return;
 222+ }
 223+
 224+ if ( count( $columns ) == 0 ) {
 225+ echo ( wfMsgExt( "externaldata-db-no-return-values", array( 'parse', 'escape' ) ) );
 226+ return;
 227+ }
 228+
 229+ $rows = self::searchDB( $db, $from, $columns, $where, $options );
 230+ $db->close();
 231+
 232+ $values = array();
 233+ foreach ( $rows as $row ) {
 234+ foreach ( $columns as $column ) {
 235+ $values[$column][] = $row[$column];
 236+ }
 237+ }
 238+
 239+ return $values;
 240+ }
 241+
 242+ static function searchDB( $db, $table, $vars, $conds, $options ) {
 243+ // Add on a space at the beginning of $table so that
 244+ // $db->select() will treat it as a literal, instead of
 245+ // putting quotes around it or otherwise trying to parse it.
 246+ $table = ' ' . $table;
 247+ $result = $db->select( $table, $vars, $conds, 'EDUtils::searchDB', $options );
 248+ if ( !$result ) {
 249+ echo ( wfMsgExt( "externaldata-db-invalid-query", array( 'parse', 'escape' ) ) );
 250+ return false;
 251+ } else {
 252+ $rows = array();
 253+ while ( $row = $db->fetchRow( $result ) ) {
 254+ // Create a new row object, that uses the
 255+ // passed-in column names as keys, so that
 256+ // there's always an exact match between
 257+ // what's in the query and what's in the
 258+ // return value (so that "a.b", for instance,
 259+ // doesn't get chopped off to just "b").
 260+ $new_row = array();
 261+ foreach ( $vars as $i => $column_name ) {
 262+ // Convert the encoding to UTF-8
 263+ // if necessary - based on code at
 264+ // http://www.php.net/manual/en/function.mb-detect-encoding.php#102510
 265+ $dbField = $row[$i];
 266+ if ( mb_detect_encoding( $dbField, 'UTF-8', true ) == 'UTF-8' ) {
 267+ $new_row[$column_name] = $dbField;
 268+ } else {
 269+ $new_row[$column_name] = utf8_encode( $dbField );
 270+ }
 271+ }
 272+ $rows[] = $new_row;
 273+ }
 274+ return $rows;
 275+ }
 276+ }
 277+
 278+ static function getXMLData( $xml ) {
 279+ global $edgXMLValues;
 280+ $edgXMLValues = array();
 281+
 282+ // Remove comments from XML - for some reason, xml_parse()
 283+ // can't handle them.
 284+ $xml = preg_replace( '/<!--.*?-->/s', '', $xml );
 285+
 286+ $xml_parser = xml_parser_create();
 287+ xml_set_element_handler( $xml_parser, array( 'EDUtils', 'startElement' ), array( 'EDUtils', 'endElement' ) );
 288+ xml_set_character_data_handler( $xml_parser, array( 'EDUtils', 'getContent' ) );
 289+ if ( !xml_parse( $xml_parser, $xml, true ) ) {
 290+ echo ( wfMsgExt( 'externaldata-xml-error',
 291+ xml_error_string( xml_get_error_code( $xml_parser ) ),
 292+ xml_get_current_line_number( $xml_parser ), array( 'parse', 'escape' ) ) );
 293+ }
 294+ xml_parser_free( $xml_parser );
 295+ return $edgXMLValues;
 296+ }
 297+
 298+ static function getValuesFromCSVLine( $csv_line ) {
 299+ // regular expression copied from http://us.php.net/fgetcsv
 300+ $vals = preg_split( '/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/', $csv_line );
 301+ $vals2 = array();
 302+ foreach ( $vals as $val ) {
 303+ $vals2[] = trim( $val, '"' );
 304+ }
 305+ return $vals2;
 306+ }
 307+
 308+ static function getCSVData( $csv, $has_header ) {
 309+ // from http://us.php.net/manual/en/function.str-getcsv.php#88311
 310+ // str_getcsv() is a function that was only added in PHP 5.3.0,
 311+ // so use the much older fgetcsv() if it's not there
 312+
 313+ // actually, for now, always use fgetcsv(), since this call to
 314+ // str_getcsv() doesn't work, and I can't test/debug it at the
 315+ // moment
 316+ //if ( function_exists( 'str_getcsv' ) ) {
 317+ // $table = str_getcsv( $csv );
 318+ //} else {
 319+ $fiveMBs = 5 * 1024 * 1024;
 320+ $fp = fopen( "php://temp/maxmemory:$fiveMBs", 'r+' );
 321+ fputs( $fp, $csv );
 322+ rewind( $fp );
 323+ $table = array();
 324+ while ( $line = fgetcsv( $fp ) ) {
 325+ array_push( $table, $line );
 326+ }
 327+ fclose( $fp );
 328+ //}
 329+ // Get header values, if this is 'csv with header'
 330+ if ( $has_header ) {
 331+ $header_vals = array_shift( $table );
 332+ // On the off chance that there are one or more blank
 333+ // lines at the beginning, cycle through.
 334+ while ( count( $header_vals ) == 0 ) {
 335+ $header_vals = array_shift( $table );
 336+ }
 337+ }
 338+ // Now "flip" the data, turning it into a column-by-column
 339+ // array, instead of row-by-row.
 340+ $values = array();
 341+ foreach ( $table as $line ) {
 342+ foreach ( $line as $i => $row_val ) {
 343+ if ( $has_header ) {
 344+ $column = strtolower( $header_vals[$i] );
 345+ } else {
 346+ // start with an index of 1 instead of 0
 347+ $column = $i + 1;
 348+ }
 349+ if ( array_key_exists( $column, $values ) )
 350+ $values[$column][] = $row_val;
 351+ else
 352+ $values[$column] = array( $row_val );
 353+ }
 354+ }
 355+ return $values;
 356+ }
 357+
 358+ /**
 359+ * This function handles version 3 of the genomic-data format GFF,
 360+ * defined here:
 361+ * http://www.sequenceontology.org/gff3.shtml
 362+ */
 363+ static function getGFFData( $gff ) {
 364+ // use an fgetcsv() call, similar to the one in getCSVData()
 365+ // (fgetcsv() can handle delimiters other than commas, in this
 366+ // case a tab)
 367+ $fiveMBs = 5 * 1024 * 1024;
 368+ $fp = fopen( "php://temp/maxmemory:$fiveMBs", 'r+' );
 369+ fputs( $fp, $gff );
 370+ rewind( $fp );
 371+ $table = array();
 372+ while ( $line = fgetcsv( $fp, null, "\t" ) ) {
 373+ // ignore comment lines
 374+ if ( strpos( $line[0], '##' ) !== 0 ) {
 375+ // special handling for final 'attributes' column
 376+ if ( array_key_exists( 8, $line ) ) {
 377+ $attributes = explode( ';', $line[8] );
 378+ foreach ( $attributes as $attribute ) {
 379+ $keyAndValue = explode( '=', $attribute, 2 );
 380+ if ( count( $keyAndValue ) == 2 ) {
 381+ $key = strtolower( $keyAndValue[0] );
 382+ $value = $keyAndValue[1];
 383+ $line[$key] = $value;
 384+ }
 385+ }
 386+ }
 387+ array_push( $table, $line );
 388+ }
 389+ }
 390+ fclose( $fp );
 391+ // now "flip" the data, turning it into a column-by-column
 392+ // array, instead of row-by-row
 393+ if ( $has_header ) {
 394+ $header_vals = array_shift( $table );
 395+ }
 396+ $values = array();
 397+ foreach ( $table as $line ) {
 398+ foreach ( $line as $i => $row_val ) {
 399+ // each of the columns in GFF have a
 400+ // pre-defined name - even the last column
 401+ // has its own name, "attributes"
 402+ if ( $i === 0 ) {
 403+ $column = 'seqid';
 404+ } elseif ( $i == 1 ) {
 405+ $column = 'source';
 406+ } elseif ( $i == 2 ) {
 407+ $column = 'type';
 408+ } elseif ( $i == 3 ) {
 409+ $column = 'start';
 410+ } elseif ( $i == 4 ) {
 411+ $column = 'end';
 412+ } elseif ( $i == 5 ) {
 413+ $column = 'score';
 414+ } elseif ( $i == 6 ) {
 415+ $column = 'strand';
 416+ } elseif ( $i == 7 ) {
 417+ $column = 'phase';
 418+ } elseif ( $i == 8 ) {
 419+ $column = 'attributes';
 420+ } else {
 421+ // this is hopefully an attribute key
 422+ $column = $i;
 423+ }
 424+ if ( array_key_exists( $column, $values ) )
 425+ $values[$column][] = $row_val;
 426+ else
 427+ $values[$column] = array( $row_val );
 428+ }
 429+ }
 430+ return $values;
 431+ }
 432+
 433+ /**
 434+ * Recursive function for use by getJSONData()
 435+ */
 436+ static function parseTree( $tree, &$retrieved_values ) {
 437+ foreach ( $tree as $key => $val ) {
 438+ if ( is_array( $val ) ) {
 439+ self::parseTree( $val, $retrieved_values );
 440+ } else {
 441+ $key = strtolower( $key );
 442+ if ( array_key_exists( $key, $retrieved_values ) )
 443+ $retrieved_values[$key][] = $val;
 444+ else
 445+ $retrieved_values[$key] = array( $val );
 446+ }
 447+ }
 448+ }
 449+
 450+ static function getJSONData( $json ) {
 451+ // escape if json_decode() isn't supported
 452+ if ( ! function_exists( 'json_decode' ) ) {
 453+ echo ( wfMsgExt( "externaldata-json-decode-not-supported", array( 'parse', 'escape' ) ) );
 454+ return array();
 455+ }
 456+ $json_tree = json_decode( $json, true );
 457+ $values = array();
 458+ if ( is_array( $json_tree ) ) {
 459+ self::parseTree( $json_tree, $values );
 460+ }
 461+ return $values;
 462+ }
 463+
 464+ static function fetchURL( $url, $post_vars = array(), $get_fresh = false, $try_count = 1 ) {
 465+ $dbr = wfGetDB( DB_SLAVE );
 466+ global $edgStringReplacements, $edgCacheTable,
 467+ $edgCacheExpireTime, $edgAllowSSL;
 468+
 469+ // do any special variable replacements in the URLs, for
 470+ // secret API keys and the like
 471+ foreach ( $edgStringReplacements as $key => $value ) {
 472+ $url = str_replace( $key, $value, $url );
 473+ }
 474+
 475+ if ( !isset( $edgCacheTable ) || is_null( $edgCacheTable ) ) {
 476+ if ( $edgAllowSSL ) {
 477+ // The hardcoded 'CURLOPT_SSL_VERIFYPEER' is
 478+ // needed for MW < 1.17
 479+ return Http::get( $url, 'default', array( CURLOPT_SSL_VERIFYPEER => false, 'sslVerifyCert' => false, 'followRedirects' => false ) );
 480+ } else {
 481+ return Http::get( $url );
 482+ }
 483+ }
 484+
 485+ // check the cache (only the first 254 chars of the url)
 486+ $row = $dbr->selectRow( $edgCacheTable, '*', array( 'url' => substr( $url, 0, 254 ) ), 'EDUtils::fetchURL' );
 487+
 488+ if ( $row && ( ( time() - $row->req_time ) > $edgCacheExpireTime ) ) {
 489+ $get_fresh = true;
 490+ }
 491+
 492+ if ( !$row || $get_fresh ) {
 493+ if ( $edgAllowSSL ) {
 494+ $page = Http::get( $url, 'default', array( CURLOPT_SSL_VERIFYPEER => false ) );
 495+ } else {
 496+ $page = Http::get( $url );
 497+ }
 498+ if ( $page === false ) {
 499+ sleep( 1 );
 500+ if ( $try_count >= self::$http_number_of_tries ) {
 501+ echo ( wfMsgExt( 'externaldata-db-could-not-get-url', array( 'parsemag', 'escape' ), self::$http_number_of_tries ) );
 502+ return '';
 503+ }
 504+ $try_count++;
 505+ return self::fetchURL( $url, $post_vars, $get_fresh, $try_count );
 506+ }
 507+ if ( $page != '' ) {
 508+ $dbw = wfGetDB( DB_MASTER );
 509+ // insert contents into the cache table
 510+ $dbw->insert( $edgCacheTable, array( 'url' => substr( $url, 0, 254 ), 'result' => $page, 'req_time' => time() ) );
 511+ return $page;
 512+ }
 513+ } else {
 514+ return $row->result;
 515+ }
 516+ }
 517+
 518+ /**
 519+ * Checks whether this URL is allowed, based on the
 520+ * $edgAllowExternalDataFrom whitelist
 521+ */
 522+ static public function isURLAllowed( $url ) {
 523+ // this code is based on Parser::maybeMakeExternalImage()
 524+ global $edgAllowExternalDataFrom;
 525+ $data_from = $edgAllowExternalDataFrom;
 526+ $text = false;
 527+ if ( empty( $data_from ) ) {
 528+ return true;
 529+ } elseif ( is_array( $data_from ) ) {
 530+ foreach ( $data_from as $match ) {
 531+ if ( strpos( $url, $match ) === 0 ) {
 532+ return true;
 533+ }
 534+ }
 535+ return false;
 536+ } else {
 537+ if ( strpos( $url, $data_from ) === 0 ) {
 538+ return true;
 539+ } else {
 540+ return false;
 541+ }
 542+ }
 543+ }
 544+
 545+ static public function getDataFromURL( $url, $format ) {
 546+ $url_contents = EDUtils::fetchURL( $url );
 547+ // exit if there's nothing there
 548+ if ( empty( $url_contents ) )
 549+ return array();
 550+
 551+ if ( $format == 'xml' ) {
 552+ return self::getXMLData( $url_contents );
 553+ } elseif ( $format == 'csv' ) {
 554+ return self::getCSVData( $url_contents, false );
 555+ } elseif ( $format == 'csv with header' ) {
 556+ return self::getCSVData( $url_contents, true );
 557+ } elseif ( $format == 'json' ) {
 558+ return self::getJSONData( $url_contents );
 559+ } elseif ( $format == 'gff' ) {
 560+ return self::getGFFData( $url_contents );
 561+ }
 562+ return array();
 563+ }
 564+
 565+}
Property changes on: tags/extensions/ExternalData/REL_1_3_2/ED_Utils.php
___________________________________________________________________
Added: svn:eol-style
1566 + native

Status & tagging log