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 |
1 | 129 | + Id |
Added: svn:eol-style |
2 | 130 | + 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 |
1 | 930 | + 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 |
1 | 83 | + 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 |
1 | 384 | + 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 |
1 | 73 | + 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 |
1 | 11 | + 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 |
1 | 108 | + 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 |
1 | 566 | + native |