From a36d1df3dca8ff4ad96682d4d95289353b1e8a1a Mon Sep 17 00:00:00 2001 From: opi Date: Wed, 28 May 2014 09:44:47 +0200 Subject: [PATCH] Update source to 'Ponder Stibbons' version. --- sources/README | 2 +- sources/VERSION | 2 +- sources/bin/gittool.php | 340 + sources/bin/striplangs.php | 2 +- sources/conf/entities.conf | 2 +- sources/conf/interwiki.conf | 3 +- sources/conf/mediameta.php | 2 +- sources/conf/mime.conf | 3 + sources/conf/plugins.required.php | 11 +- sources/data/deleted.files | 158 + sources/data/pages/wiki/dokuwiki.txt | 6 +- sources/data/pages/wiki/syntax.txt | 45 +- sources/doku.php | 2 +- sources/feed.php | 42 +- sources/inc/EmailAddressValidator.php | 20 +- sources/inc/HTTPClient.php | 33 +- sources/inc/Input.class.php | 38 + sources/inc/JpegMeta.php | 3 +- sources/inc/Mailer.class.php | 29 +- sources/inc/RemoteAPICore.php | 28 +- sources/inc/Sitemapper.php | 4 +- sources/inc/Tar.class.php | 2 +- sources/inc/actions.php | 31 +- sources/inc/auth.php | 106 +- sources/inc/cache.php | 126 +- sources/inc/changelog.php | 855 +- sources/inc/cliopts.php | 23 +- sources/inc/common.php | 294 +- sources/inc/confutils.php | 3 +- sources/inc/events.php | 97 +- sources/inc/feedcreator.class.php | 99 +- sources/inc/fetch.functions.php | 15 +- sources/inc/form.php | 40 +- sources/inc/fulltext.php | 30 +- sources/inc/html.php | 499 +- sources/inc/httputils.php | 16 +- sources/inc/indexer.php | 37 +- sources/inc/infoutils.php | 23 +- sources/inc/init.php | 38 +- sources/inc/io.php | 52 +- sources/inc/lang/.htaccess | 3 + sources/inc/lang/af/jquery.ui.datepicker.js | 23 + sources/inc/lang/af/lang.php | 2 +- sources/inc/lang/ar/denied.txt | 2 +- sources/inc/lang/ar/jquery.ui.datepicker.js | 23 + sources/inc/lang/ar/lang.php | 18 +- sources/inc/lang/az/denied.txt | 2 +- sources/inc/lang/az/jquery.ui.datepicker.js | 23 + sources/inc/lang/az/lang.php | 2 +- sources/inc/lang/bg/denied.txt | 2 +- sources/inc/lang/bg/jquery.ui.datepicker.js | 24 + sources/inc/lang/bg/lang.php | 78 +- sources/inc/lang/bg/register.txt | 2 +- sources/inc/lang/bg/resendpwd.txt | 2 +- sources/inc/lang/bn/denied.txt | 2 +- sources/inc/lang/bn/lang.php | 133 + sources/inc/lang/ca-valencia/denied.txt | 2 +- sources/inc/lang/ca-valencia/lang.php | 2 +- sources/inc/lang/ca/denied.txt | 2 +- sources/inc/lang/ca/jquery.ui.datepicker.js | 23 + sources/inc/lang/ca/lang.php | 2 +- sources/inc/lang/cs/denied.txt | 2 +- sources/inc/lang/cs/jquery.ui.datepicker.js | 23 + sources/inc/lang/cs/lang.php | 10 +- sources/inc/lang/da/denied.txt | 2 +- sources/inc/lang/da/jquery.ui.datepicker.js | 23 + sources/inc/lang/da/lang.php | 4 +- sources/inc/lang/de-informal/denied.txt | 2 +- .../lang/de-informal/jquery.ui.datepicker.js | 23 + sources/inc/lang/de-informal/lang.php | 4 +- sources/inc/lang/de/denied.txt | 2 +- sources/inc/lang/de/jquery.ui.datepicker.js | 23 + sources/inc/lang/de/lang.php | 8 +- sources/inc/lang/el/denied.txt | 1 - sources/inc/lang/el/jquery.ui.datepicker.js | 23 + sources/inc/lang/el/lang.php | 5 +- sources/inc/lang/en/denied.txt | 2 +- sources/inc/lang/en/lang.php | 11 +- sources/inc/lang/eo/admin.txt | 2 +- sources/inc/lang/eo/adminplugins.txt | 2 +- sources/inc/lang/eo/denied.txt | 2 +- sources/inc/lang/eo/diff.txt | 2 +- sources/inc/lang/eo/draft.txt | 2 +- sources/inc/lang/eo/edit.txt | 2 +- sources/inc/lang/eo/editrev.txt | 2 +- sources/inc/lang/eo/jquery.ui.datepicker.js | 23 + sources/inc/lang/eo/lang.php | 20 +- sources/inc/lang/es/denied.txt | 3 +- sources/inc/lang/es/jquery.ui.datepicker.js | 23 + sources/inc/lang/es/lang.php | 26 +- sources/inc/lang/et/adminplugins.txt | 1 + sources/inc/lang/et/denied.txt | 3 +- sources/inc/lang/et/index.txt | 2 +- sources/inc/lang/et/jquery.ui.datepicker.js | 23 + sources/inc/lang/et/lang.php | 117 +- sources/inc/lang/et/resetpwd.txt | 3 + sources/inc/lang/et/subscr_digest.txt | 21 + sources/inc/lang/et/subscr_form.txt | 3 + sources/inc/lang/et/subscr_list.txt | 19 + sources/inc/lang/et/subscr_single.txt | 23 + sources/inc/lang/et/uploadmail.txt | 16 + sources/inc/lang/eu/denied.txt | 3 +- sources/inc/lang/eu/jquery.ui.datepicker.js | 23 + sources/inc/lang/eu/lang.php | 4 +- sources/inc/lang/fa/denied.txt | 3 +- sources/inc/lang/fa/jquery.ui.datepicker.js | 59 + sources/inc/lang/fa/lang.php | 6 +- sources/inc/lang/fi/denied.txt | 3 +- sources/inc/lang/fi/jquery.ui.datepicker.js | 23 + sources/inc/lang/fi/lang.php | 4 +- sources/inc/lang/fo/denied.txt | 3 +- sources/inc/lang/fo/jquery.ui.datepicker.js | 23 + sources/inc/lang/fo/lang.php | 2 +- sources/inc/lang/fr/denied.txt | 3 +- sources/inc/lang/fr/jquery.ui.datepicker.js | 25 + sources/inc/lang/fr/lang.php | 22 +- sources/inc/lang/fr/subscr_form.txt | 2 +- sources/inc/lang/gl/denied.txt | 2 +- sources/inc/lang/gl/jquery.ui.datepicker.js | 23 + sources/inc/lang/gl/lang.php | 4 +- sources/inc/lang/he/denied.txt | 3 +- sources/inc/lang/he/jquery.ui.datepicker.js | 23 + sources/inc/lang/he/lang.php | 27 +- sources/inc/lang/hi/jquery.ui.datepicker.js | 23 + sources/inc/lang/hi/lang.php | 2 +- sources/inc/lang/hr/denied.txt | 1 - sources/inc/lang/hr/jquery.ui.datepicker.js | 23 + sources/inc/lang/hr/lang.php | 2 +- sources/inc/lang/hu-formal/admin.txt | 3 + sources/inc/lang/hu-formal/adminplugins.txt | 1 + sources/inc/lang/hu-formal/backlinks.txt | 3 + sources/inc/lang/hu-formal/conflict.txt | 5 + sources/inc/lang/hu-formal/denied.txt | 4 + sources/inc/lang/hu-formal/diff.txt | 3 + sources/inc/lang/hu-formal/draft.txt | 5 + sources/inc/lang/hu-formal/edit.txt | 1 + sources/inc/lang/hu-formal/editrev.txt | 2 + sources/inc/lang/hu-formal/index.txt | 3 + sources/inc/lang/hu-formal/lang.php | 27 + sources/inc/lang/hu/denied.txt | 2 +- sources/inc/lang/hu/jquery.ui.datepicker.js | 23 + sources/inc/lang/hu/lang.php | 10 +- sources/inc/lang/ia/denied.txt | 3 +- sources/inc/lang/ia/lang.php | 2 +- sources/inc/lang/id/adminplugins.txt | 1 + sources/inc/lang/id/denied.txt | 2 +- sources/inc/lang/id/jquery.ui.datepicker.js | 23 + sources/inc/lang/id/lang.php | 138 +- sources/inc/lang/id/resetpwd.txt | 3 + sources/inc/lang/id/subscr_digest.txt | 17 + sources/inc/lang/is/jquery.ui.datepicker.js | 23 + sources/inc/lang/is/lang.php | 2 +- sources/inc/lang/it/denied.txt | 3 +- sources/inc/lang/it/jquery.ui.datepicker.js | 23 + sources/inc/lang/it/lang.php | 4 +- sources/inc/lang/ja/denied.txt | 2 +- sources/inc/lang/ja/jquery.ui.datepicker.js | 23 + sources/inc/lang/ja/lang.php | 4 +- sources/inc/lang/ka/admin.txt | 4 + sources/inc/lang/ka/adminplugins.txt | 1 + sources/inc/lang/ka/backlinks.txt | 4 + sources/inc/lang/ka/conflict.txt | 5 + sources/inc/lang/ka/denied.txt | 3 + sources/inc/lang/ka/diff.txt | 3 + sources/inc/lang/ka/draft.txt | 3 + sources/inc/lang/ka/edit.txt | 2 + sources/inc/lang/ka/editrev.txt | 2 + sources/inc/lang/ka/index.txt | 1 + sources/inc/lang/ka/lang.php | 117 + sources/inc/lang/kk/jquery.ui.datepicker.js | 23 + sources/inc/lang/kk/lang.php | 2 +- sources/inc/lang/km/denied.txt | 1 + sources/inc/lang/km/jquery.ui.datepicker.js | 23 + sources/inc/lang/km/lang.php | 2 +- sources/inc/lang/ko/denied.txt | 3 +- sources/inc/lang/ko/install.html | 26 +- sources/inc/lang/ko/jquery.ui.datepicker.js | 23 + sources/inc/lang/ko/lang.php | 46 +- sources/inc/lang/ko/searchpage.txt | 2 +- sources/inc/lang/ko/subscr_digest.txt | 2 +- sources/inc/lang/ko/updateprofile.txt | 2 +- sources/inc/lang/ku/denied.txt | 2 +- sources/inc/lang/ku/lang.php | 2 +- sources/inc/lang/la/denied.txt | 3 +- sources/inc/lang/la/lang.php | 2 +- sources/inc/lang/lb/denied.txt | 3 +- sources/inc/lang/lb/jquery.ui.datepicker.js | 23 + sources/inc/lang/lb/lang.php | 2 +- sources/inc/lang/lt/denied.txt | 2 +- sources/inc/lang/lt/jquery.ui.datepicker.js | 23 + sources/inc/lang/lt/lang.php | 2 +- sources/inc/lang/lv/denied.txt | 4 +- sources/inc/lang/lv/jquery.ui.datepicker.js | 23 + sources/inc/lang/lv/lang.php | 4 +- sources/inc/lang/mg/denied.txt | 2 +- sources/inc/lang/mk/jquery.ui.datepicker.js | 23 + sources/inc/lang/mk/lang.php | 2 +- sources/inc/lang/mr/denied.txt | 3 +- sources/inc/lang/mr/lang.php | 4 +- sources/inc/lang/ms/jquery.ui.datepicker.js | 23 + sources/inc/lang/ne/denied.txt | 3 +- sources/inc/lang/ne/lang.php | 2 +- sources/inc/lang/nl/denied.txt | 3 +- sources/inc/lang/nl/edit.txt | 2 +- sources/inc/lang/nl/jquery.ui.datepicker.js | 23 + sources/inc/lang/nl/lang.php | 11 +- sources/inc/lang/no/denied.txt | 3 +- sources/inc/lang/no/jquery.ui.datepicker.js | 23 + sources/inc/lang/no/lang.php | 11 +- sources/inc/lang/no/resetpwd.txt | 3 + sources/inc/lang/pl/denied.txt | 2 +- sources/inc/lang/pl/jquery.ui.datepicker.js | 23 + sources/inc/lang/pl/lang.php | 10 +- sources/inc/lang/pt-br/denied.txt | 3 +- .../inc/lang/pt-br/jquery.ui.datepicker.js | 23 + sources/inc/lang/pt-br/lang.php | 4 +- sources/inc/lang/pt/denied.txt | 3 +- sources/inc/lang/pt/jquery.ui.datepicker.js | 22 + sources/inc/lang/pt/lang.php | 4 +- sources/inc/lang/ro/admin.txt | 2 +- sources/inc/lang/ro/adminplugins.txt | 2 +- sources/inc/lang/ro/backlinks.txt | 1 - sources/inc/lang/ro/conflict.txt | 7 +- sources/inc/lang/ro/denied.txt | 4 +- sources/inc/lang/ro/diff.txt | 3 +- sources/inc/lang/ro/draft.txt | 7 +- sources/inc/lang/ro/edit.txt | 3 +- sources/inc/lang/ro/editrev.txt | 3 +- sources/inc/lang/ro/index.txt | 4 +- sources/inc/lang/ro/install.html | 12 +- sources/inc/lang/ro/jquery.ui.datepicker.js | 26 + sources/inc/lang/ro/lang.php | 28 +- sources/inc/lang/ro/locked.txt | 3 +- sources/inc/lang/ro/login.txt | 6 +- sources/inc/lang/ro/mailtext.txt | 23 +- sources/inc/lang/ro/newpage.txt | 4 +- sources/inc/lang/ro/norev.txt | 6 +- sources/inc/lang/ro/password.txt | 8 +- sources/inc/lang/ro/preview.txt | 3 +- sources/inc/lang/ro/pwconfirm.txt | 13 +- sources/inc/lang/ro/read.txt | 4 +- sources/inc/lang/ro/recent.txt | 6 +- sources/inc/lang/ro/register.txt | 3 +- sources/inc/lang/ro/registermail.txt | 13 +- sources/inc/lang/ro/resendpwd.txt | 4 +- sources/inc/lang/ro/resetpwd.txt | 4 +- sources/inc/lang/ro/revisions.txt | 7 +- sources/inc/lang/ro/searchpage.txt | 2 +- sources/inc/lang/ro/showrev.txt | 2 +- sources/inc/lang/ro/stopwords.txt | 6 +- sources/inc/lang/ro/subscr_digest.txt | 18 +- sources/inc/lang/ro/subscr_form.txt | 3 +- sources/inc/lang/ro/subscr_list.txt | 16 +- sources/inc/lang/ro/subscr_single.txt | 22 +- sources/inc/lang/ro/updateprofile.txt | 3 +- sources/inc/lang/ro/uploadmail.txt | 8 +- sources/inc/lang/ru/admin.txt | 2 +- sources/inc/lang/ru/denied.txt | 3 +- sources/inc/lang/ru/jquery.ui.datepicker.js | 23 + sources/inc/lang/ru/lang.php | 41 +- sources/inc/lang/ru/mailtext.txt | 2 +- sources/inc/lang/ru/norev.txt | 1 - sources/inc/lang/ru/password.txt | 2 +- sources/inc/lang/ru/pwconfirm.txt | 2 +- sources/inc/lang/ru/registermail.txt | 2 +- sources/inc/lang/ru/subscr_digest.txt | 4 +- sources/inc/lang/ru/subscr_list.txt | 4 +- sources/inc/lang/ru/subscr_single.txt | 4 +- sources/inc/lang/ru/uploadmail.txt | 2 +- sources/inc/lang/sk/denied.txt | 3 +- sources/inc/lang/sk/jquery.ui.datepicker.js | 23 + sources/inc/lang/sk/lang.php | 5 +- sources/inc/lang/sl/denied.txt | 3 +- sources/inc/lang/sl/jquery.ui.datepicker.js | 24 + sources/inc/lang/sl/lang.php | 14 +- sources/inc/lang/sl/resetpwd.txt | 1 + sources/inc/lang/sq/denied.txt | 3 +- sources/inc/lang/sq/jquery.ui.datepicker.js | 23 + sources/inc/lang/sq/lang.php | 2 +- sources/inc/lang/sr/denied.txt | 2 +- sources/inc/lang/sr/jquery.ui.datepicker.js | 23 + sources/inc/lang/sr/lang.php | 2 +- sources/inc/lang/sv/denied.txt | 2 +- sources/inc/lang/sv/jquery.ui.datepicker.js | 23 + sources/inc/lang/sv/lang.php | 14 +- sources/inc/lang/sv/subscr_digest.txt | 19 + sources/inc/lang/th/denied.txt | 3 +- sources/inc/lang/th/jquery.ui.datepicker.js | 23 + sources/inc/lang/th/lang.php | 2 +- sources/inc/lang/tr/denied.txt | 2 +- sources/inc/lang/tr/jquery.ui.datepicker.js | 23 + sources/inc/lang/tr/lang.php | 17 +- sources/inc/lang/uk/denied.txt | 2 +- sources/inc/lang/uk/jquery.ui.datepicker.js | 24 + sources/inc/lang/uk/lang.php | 2 +- sources/inc/lang/vi/denied.txt | 3 +- sources/inc/lang/vi/jquery.ui.datepicker.js | 23 + sources/inc/lang/vi/lang.php | 225 +- sources/inc/lang/zh-tw/denied.txt | 2 +- .../inc/lang/zh-tw/jquery.ui.datepicker.js | 23 + sources/inc/lang/zh-tw/lang.php | 4 +- sources/inc/lang/zh/denied.txt | 3 +- sources/inc/lang/zh/jquery.ui.datepicker.js | 23 + sources/inc/lang/zh/lang.php | 13 +- sources/inc/lessc.inc.php | 2 +- sources/inc/load.php | 7 + sources/inc/mail.php | 9 +- sources/inc/media.php | 186 +- sources/inc/pageutils.php | 27 +- sources/inc/parser/code.php | 1 - sources/inc/parser/handler.php | 73 +- sources/inc/parser/metadata.php | 4 +- sources/inc/parser/parser.php | 80 +- sources/inc/parser/renderer.php | 64 +- sources/inc/parser/xhtml.php | 168 +- sources/inc/parser/xhtmlsummary.php | 1 - sources/inc/parserutils.php | 64 +- sources/inc/plugin.php | 27 +- sources/inc/pluginutils.php | 2 +- sources/inc/remote.php | 5 +- sources/inc/search.php | 65 +- sources/inc/subscription.php | 28 +- sources/inc/template.php | 185 +- sources/inc/toolbar.php | 6 +- sources/install.php | 1 + sources/lib/exe/ajax.php | 58 +- sources/lib/exe/css.php | 48 +- sources/lib/exe/fetch.php | 6 +- sources/lib/exe/js.php | 16 +- sources/lib/exe/mediamanager.php | 4 +- sources/lib/images/fileicons/32x32/7z.png | Bin 0 -> 992 bytes sources/lib/images/fileicons/32x32/asm.png | Bin 0 -> 989 bytes sources/lib/images/fileicons/32x32/bash.png | Bin 0 -> 993 bytes sources/lib/images/fileicons/32x32/bz2.png | Bin 0 -> 1001 bytes sources/lib/images/fileicons/32x32/c.png | Bin 0 -> 945 bytes sources/lib/images/fileicons/32x32/cc.png | Bin 0 -> 955 bytes sources/lib/images/fileicons/32x32/conf.png | Bin 0 -> 832 bytes sources/lib/images/fileicons/32x32/cpp.png | Bin 0 -> 960 bytes sources/lib/images/fileicons/32x32/cs.png | Bin 0 -> 960 bytes sources/lib/images/fileicons/32x32/csh.png | Bin 0 -> 981 bytes sources/lib/images/fileicons/32x32/css.png | Bin 0 -> 969 bytes sources/lib/images/fileicons/32x32/csv.png | Bin 0 -> 819 bytes sources/lib/images/fileicons/32x32/deb.png | Bin 0 -> 991 bytes sources/lib/images/fileicons/32x32/diff.png | Bin 0 -> 975 bytes sources/lib/images/fileicons/32x32/doc.png | Bin 0 -> 1034 bytes sources/lib/images/fileicons/32x32/docx.png | Bin 0 -> 1078 bytes sources/lib/images/fileicons/32x32/file.png | Bin 0 -> 605 bytes sources/lib/images/fileicons/32x32/gif.png | Bin 0 -> 944 bytes sources/lib/images/fileicons/32x32/gz.png | Bin 0 -> 994 bytes sources/lib/images/fileicons/32x32/h.png | Bin 0 -> 941 bytes sources/lib/images/fileicons/32x32/hpp.png | Bin 0 -> 974 bytes sources/lib/images/fileicons/32x32/htm.png | Bin 0 -> 983 bytes sources/lib/images/fileicons/32x32/html.png | Bin 0 -> 983 bytes sources/lib/images/fileicons/32x32/ico.png | Bin 0 -> 941 bytes sources/lib/images/fileicons/32x32/java.png | Bin 0 -> 992 bytes sources/lib/images/fileicons/32x32/jpeg.png | Bin 0 -> 948 bytes sources/lib/images/fileicons/32x32/jpg.png | Bin 0 -> 948 bytes sources/lib/images/fileicons/32x32/js.png | Bin 0 -> 960 bytes sources/lib/images/fileicons/32x32/json.png | Bin 0 -> 996 bytes sources/lib/images/fileicons/32x32/lua.png | Bin 0 -> 979 bytes sources/lib/images/fileicons/32x32/mp3.png | Bin 0 -> 947 bytes sources/lib/images/fileicons/32x32/mp4.png | Bin 0 -> 1197 bytes sources/lib/images/fileicons/32x32/odc.png | Bin 0 -> 1061 bytes sources/lib/images/fileicons/32x32/odf.png | Bin 0 -> 1059 bytes sources/lib/images/fileicons/32x32/odg.png | Bin 0 -> 1066 bytes sources/lib/images/fileicons/32x32/odi.png | Bin 0 -> 1058 bytes sources/lib/images/fileicons/32x32/odp.png | Bin 0 -> 1060 bytes sources/lib/images/fileicons/32x32/ods.png | Bin 0 -> 1063 bytes sources/lib/images/fileicons/32x32/odt.png | Bin 0 -> 1060 bytes sources/lib/images/fileicons/32x32/ogg.png | Bin 0 -> 950 bytes sources/lib/images/fileicons/32x32/ogv.png | Bin 0 -> 1187 bytes sources/lib/images/fileicons/32x32/pas.png | Bin 0 -> 976 bytes sources/lib/images/fileicons/32x32/pdf.png | Bin 0 -> 1076 bytes sources/lib/images/fileicons/32x32/php.png | Bin 0 -> 974 bytes sources/lib/images/fileicons/32x32/pl.png | Bin 0 -> 951 bytes sources/lib/images/fileicons/32x32/png.png | Bin 0 -> 957 bytes sources/lib/images/fileicons/32x32/ppt.png | Bin 0 -> 871 bytes sources/lib/images/fileicons/32x32/pptx.png | Bin 0 -> 924 bytes sources/lib/images/fileicons/32x32/ps.png | Bin 0 -> 1086 bytes sources/lib/images/fileicons/32x32/py.png | Bin 0 -> 966 bytes sources/lib/images/fileicons/32x32/rar.png | Bin 0 -> 1000 bytes sources/lib/images/fileicons/32x32/rb.png | Bin 0 -> 953 bytes sources/lib/images/fileicons/32x32/rpm.png | Bin 0 -> 1001 bytes sources/lib/images/fileicons/32x32/rtf.png | Bin 0 -> 867 bytes sources/lib/images/fileicons/32x32/sh.png | Bin 0 -> 962 bytes sources/lib/images/fileicons/32x32/sql.png | Bin 0 -> 827 bytes sources/lib/images/fileicons/32x32/swf.png | Bin 0 -> 1268 bytes sources/lib/images/fileicons/32x32/sxc.png | Bin 0 -> 1078 bytes sources/lib/images/fileicons/32x32/sxd.png | Bin 0 -> 1079 bytes sources/lib/images/fileicons/32x32/sxi.png | Bin 0 -> 1067 bytes sources/lib/images/fileicons/32x32/sxw.png | Bin 0 -> 1086 bytes sources/lib/images/fileicons/32x32/tar.png | Bin 0 -> 987 bytes sources/lib/images/fileicons/32x32/tgz.png | Bin 0 -> 999 bytes sources/lib/images/fileicons/32x32/txt.png | Bin 0 -> 836 bytes sources/lib/images/fileicons/32x32/wav.png | Bin 0 -> 944 bytes sources/lib/images/fileicons/32x32/webm.png | Bin 0 -> 1232 bytes sources/lib/images/fileicons/32x32/xls.png | Bin 0 -> 1137 bytes sources/lib/images/fileicons/32x32/xlsx.png | Bin 0 -> 1182 bytes sources/lib/images/fileicons/32x32/xml.png | Bin 0 -> 615 bytes sources/lib/images/fileicons/32x32/zip.png | Bin 0 -> 987 bytes sources/lib/images/fileicons/7z.png | Bin 651 -> 415 bytes sources/lib/images/fileicons/README | 2 + sources/lib/images/fileicons/asm.png | Bin 0 -> 427 bytes sources/lib/images/fileicons/audio.png | Bin 727 -> 0 bytes sources/lib/images/fileicons/bash.png | Bin 0 -> 433 bytes sources/lib/images/fileicons/bz2.png | Bin 641 -> 419 bytes sources/lib/images/fileicons/c.png | Bin 759 -> 412 bytes sources/lib/images/fileicons/cc.png | Bin 0 -> 411 bytes sources/lib/images/fileicons/conf.png | Bin 664 -> 402 bytes sources/lib/images/fileicons/cpp.png | Bin 822 -> 430 bytes sources/lib/images/fileicons/cs.png | Bin 771 -> 419 bytes sources/lib/images/fileicons/csh.png | Bin 0 -> 427 bytes sources/lib/images/fileicons/css.png | Bin 843 -> 427 bytes sources/lib/images/fileicons/csv.png | Bin 400 -> 409 bytes sources/lib/images/fileicons/deb.png | Bin 646 -> 421 bytes sources/lib/images/fileicons/diff.png | Bin 0 -> 425 bytes sources/lib/images/fileicons/doc.png | Bin 583 -> 410 bytes sources/lib/images/fileicons/docx.png | Bin 583 -> 415 bytes sources/lib/images/fileicons/file.png | Bin 581 -> 319 bytes sources/lib/images/fileicons/gif.png | Bin 907 -> 407 bytes sources/lib/images/fileicons/gz.png | Bin 643 -> 417 bytes sources/lib/images/fileicons/h.png | Bin 0 -> 411 bytes sources/lib/images/fileicons/hpp.png | Bin 0 -> 417 bytes sources/lib/images/fileicons/htm.png | Bin 695 -> 417 bytes sources/lib/images/fileicons/html.png | Bin 695 -> 417 bytes sources/lib/images/fileicons/ico.png | Bin 907 -> 405 bytes sources/lib/images/fileicons/index.php | 19 + sources/lib/images/fileicons/java.png | Bin 739 -> 420 bytes sources/lib/images/fileicons/jpeg.png | Bin 907 -> 412 bytes sources/lib/images/fileicons/jpg.png | Bin 907 -> 412 bytes sources/lib/images/fileicons/js.png | Bin 809 -> 420 bytes sources/lib/images/fileicons/json.png | Bin 0 -> 435 bytes sources/lib/images/fileicons/lua.png | Bin 440 -> 418 bytes sources/lib/images/fileicons/mp3.png | Bin 831 -> 415 bytes sources/lib/images/fileicons/mp4.png | Bin 0 -> 419 bytes sources/lib/images/fileicons/odc.png | Bin 682 -> 407 bytes sources/lib/images/fileicons/odf.png | Bin 746 -> 411 bytes sources/lib/images/fileicons/odg.png | Bin 735 -> 411 bytes sources/lib/images/fileicons/odi.png | Bin 735 -> 398 bytes sources/lib/images/fileicons/odp.png | Bin 687 -> 404 bytes sources/lib/images/fileicons/ods.png | Bin 682 -> 416 bytes sources/lib/images/fileicons/odt.png | Bin 522 -> 403 bytes sources/lib/images/fileicons/ogg.png | Bin 807 -> 408 bytes sources/lib/images/fileicons/ogv.png | Bin 0 -> 412 bytes sources/lib/images/fileicons/pas.png | Bin 0 -> 435 bytes sources/lib/images/fileicons/pdf.png | Bin 592 -> 425 bytes sources/lib/images/fileicons/php.png | Bin 749 -> 424 bytes sources/lib/images/fileicons/pl.png | Bin 685 -> 418 bytes sources/lib/images/fileicons/png.png | Bin 907 -> 417 bytes sources/lib/images/fileicons/ppt.png | Bin 697 -> 412 bytes sources/lib/images/fileicons/pptx.png | Bin 697 -> 414 bytes sources/lib/images/fileicons/ps.png | Bin 470 -> 424 bytes sources/lib/images/fileicons/py.png | Bin 683 -> 426 bytes sources/lib/images/fileicons/rar.png | Bin 557 -> 418 bytes sources/lib/images/fileicons/rb.png | Bin 802 -> 421 bytes sources/lib/images/fileicons/rpm.png | Bin 555 -> 415 bytes sources/lib/images/fileicons/rtf.png | Bin 402 -> 418 bytes sources/lib/images/fileicons/sh.png | Bin 0 -> 422 bytes sources/lib/images/fileicons/sql.png | Bin 813 -> 410 bytes sources/lib/images/fileicons/swf.png | Bin 732 -> 416 bytes sources/lib/images/fileicons/sxc.png | Bin 682 -> 420 bytes sources/lib/images/fileicons/sxd.png | Bin 735 -> 424 bytes sources/lib/images/fileicons/sxi.png | Bin 687 -> 414 bytes sources/lib/images/fileicons/sxw.png | Bin 522 -> 417 bytes sources/lib/images/fileicons/tar.png | Bin 663 -> 417 bytes sources/lib/images/fileicons/tgz.png | Bin 643 -> 417 bytes sources/lib/images/fileicons/txt.png | Bin 466 -> 407 bytes sources/lib/images/fileicons/wav.png | Bin 820 -> 415 bytes sources/lib/images/fileicons/webm.png | Bin 0 -> 412 bytes sources/lib/images/fileicons/xls.png | Bin 670 -> 415 bytes sources/lib/images/fileicons/xlsx.png | Bin 670 -> 425 bytes sources/lib/images/fileicons/xml.png | Bin 409 -> 400 bytes sources/lib/images/fileicons/zip.png | Bin 800 -> 418 bytes sources/lib/images/interwiki/user.png | Bin 0 -> 741 bytes sources/lib/plugins/acl/admin.php | 12 +- sources/lib/plugins/acl/lang/bg/lang.php | 4 +- sources/lib/plugins/acl/lang/et/help.txt | 9 + sources/lib/plugins/acl/lang/et/lang.php | 17 +- sources/lib/plugins/acl/lang/hi/lang.php | 7 - sources/lib/plugins/acl/lang/id-ni/lang.php | 7 - sources/lib/plugins/acl/lang/ko/help.txt | 6 +- sources/lib/plugins/acl/lang/ko/lang.php | 2 +- sources/lib/plugins/acl/lang/lb/lang.php | 6 - sources/lib/plugins/acl/lang/ms/lang.php | 6 - sources/lib/plugins/acl/lang/ru/help.txt | 2 +- sources/lib/plugins/acl/lang/vi/lang.php | 71 +- sources/lib/plugins/auth.php | 4 +- sources/lib/plugins/authad/action.php | 91 + sources/lib/plugins/authad/auth.php | 31 +- .../lib/plugins/authad/lang/ar/settings.php | 12 + .../lib/plugins/authad/lang/bg/settings.php | 29 +- sources/lib/plugins/authad/lang/de/lang.php | 8 + sources/lib/plugins/authad/lang/en/lang.php | 10 + sources/lib/plugins/authad/lang/eo/lang.php | 8 + sources/lib/plugins/authad/lang/es/lang.php | 8 + .../lib/plugins/authad/lang/es/settings.php | 10 +- sources/lib/plugins/authad/lang/fr/lang.php | 8 + .../lib/plugins/authad/lang/fr/settings.php | 2 + .../lib/plugins/authad/lang/hu/settings.php | 8 +- sources/lib/plugins/authad/lang/ko/lang.php | 8 + .../lib/plugins/authad/lang/lv/settings.php | 6 - sources/lib/plugins/authad/lang/nl/lang.php | 8 + .../lib/plugins/authad/lang/no/settings.php | 9 + .../lib/plugins/authad/lang/pl/settings.php | 7 + sources/lib/plugins/authad/lang/ru/lang.php | 8 + .../lib/plugins/authad/lang/ru/settings.php | 5 + .../lib/plugins/authad/lang/sk/settings.php | 2 +- .../lib/plugins/authad/lang/sl/settings.php | 11 + .../lib/plugins/authad/lang/zh/settings.php | 2 + sources/lib/plugins/authad/plugin.info.txt | 2 +- sources/lib/plugins/authldap/auth.php | 19 +- .../lib/plugins/authldap/lang/ar/settings.php | 13 + .../lib/plugins/authldap/lang/bg/settings.php | 7 +- .../lib/plugins/authldap/lang/es/settings.php | 14 + .../lib/plugins/authldap/lang/et/settings.php | 9 + .../lib/plugins/authldap/lang/he/settings.php | 8 + .../lib/plugins/authldap/lang/hu/settings.php | 7 +- .../lib/plugins/authldap/lang/ja/settings.php | 2 +- .../lib/plugins/authldap/lang/ko/settings.php | 4 +- .../lib/plugins/authldap/lang/lv/settings.php | 6 - .../lib/plugins/authldap/lang/no/settings.php | 9 + .../lib/plugins/authldap/lang/pl/settings.php | 8 + .../lib/plugins/authldap/lang/ru/settings.php | 10 + .../lib/plugins/authldap/lang/sk/settings.php | 2 +- .../lib/plugins/authldap/lang/sl/settings.php | 10 + .../lib/plugins/authldap/lang/zh/settings.php | 2 + sources/lib/plugins/authmysql/auth.php | 9 +- .../plugins/authmysql/lang/bg/settings.php | 16 +- .../plugins/authmysql/lang/es/settings.php | 23 + .../plugins/authmysql/lang/fi/settings.php | 6 - .../plugins/authmysql/lang/hu/settings.php | 61 +- .../plugins/authmysql/lang/lv/settings.php | 6 - .../plugins/authmysql/lang/pl/settings.php | 3 + .../plugins/authmysql/lang/sk/settings.php | 2 +- sources/lib/plugins/authpgsql/auth.php | 6 +- .../plugins/authpgsql/lang/bg/settings.php | 7 +- .../plugins/authpgsql/lang/es/settings.php | 9 + .../plugins/authpgsql/lang/fi/settings.php | 6 - .../plugins/authpgsql/lang/hu/settings.php | 59 +- .../plugins/authpgsql/lang/it/settings.php | 5 - .../plugins/authpgsql/lang/lv/settings.php | 6 - .../plugins/authpgsql/lang/pl/settings.php | 5 - .../plugins/authpgsql/lang/ru/settings.php | 2 + .../plugins/authpgsql/lang/sk/settings.php | 2 +- .../plugins/authpgsql/lang/sl/settings.php | 9 + sources/lib/plugins/config/lang/bg/lang.php | 4 +- sources/lib/plugins/config/lang/de/lang.php | 2 +- sources/lib/plugins/config/lang/en/lang.php | 10 +- sources/lib/plugins/config/lang/hr/lang.php | 8 - sources/lib/plugins/config/lang/id/lang.php | 7 - sources/lib/plugins/config/lang/kk/lang.php | 6 - sources/lib/plugins/config/lang/ko/intro.txt | 1 - sources/lib/plugins/config/lang/lb/lang.php | 6 - sources/lib/plugins/config/lang/mk/lang.php | 6 - sources/lib/plugins/config/lang/ms/lang.php | 6 - sources/lib/plugins/config/lang/vi/lang.php | 5 - .../plugins/config/settings/config.class.php | 152 +- .../config/settings/config.metadata.php | 4 +- sources/lib/plugins/extension/action.php | 85 + sources/lib/plugins/extension/admin.php | 155 + sources/lib/plugins/extension/all.less | 37 + .../plugins/extension/helper/extension.php | 1093 ++ sources/lib/plugins/extension/helper/gui.php | 193 + sources/lib/plugins/extension/helper/list.php | 568 + .../plugins/extension/helper/repository.php | 191 + .../lib/plugins/extension/images/disabled.png | Bin 0 -> 1486 bytes .../lib/plugins/extension/images/donate.png | Bin 0 -> 724 bytes sources/lib/plugins/extension/images/down.png | Bin 0 -> 280 bytes .../lib/plugins/extension/images/enabled.png | Bin 0 -> 1231 bytes .../lib/plugins/extension/images/icons.xcf | Bin 0 -> 67195 bytes .../lib/plugins/extension/images/license.txt | 4 + .../lib/plugins/extension/images/overlay.png | Bin 0 -> 109 bytes .../lib/plugins/extension/images/plugin.png | Bin 0 -> 6824 bytes sources/lib/plugins/extension/images/tag.png | Bin 0 -> 753 bytes .../lib/plugins/extension/images/template.png | Bin 0 -> 7547 bytes sources/lib/plugins/extension/images/up.png | Bin 0 -> 281 bytes .../lib/plugins/extension/images/warning.png | Bin 0 -> 613 bytes .../extension/lang/de/intro_install.txt | 1 + .../extension/lang/de/intro_plugins.txt | 1 + .../extension/lang/de/intro_search.txt | 1 + .../extension/lang/de/intro_templates.txt | 1 + .../lib/plugins/extension/lang/de/lang.php | 88 + .../extension/lang/en/intro_install.txt | 1 + .../extension/lang/en/intro_plugins.txt | 1 + .../extension/lang/en/intro_search.txt | 1 + .../extension/lang/en/intro_templates.txt | 1 + .../lib/plugins/extension/lang/en/lang.php | 99 + .../extension/lang/eo/intro_install.txt | 1 + .../extension/lang/eo/intro_plugins.txt | 1 + .../extension/lang/eo/intro_search.txt | 1 + .../extension/lang/eo/intro_templates.txt | 1 + .../lib/plugins/extension/lang/eo/lang.php | 87 + .../lib/plugins/extension/lang/es/lang.php | 52 + .../extension/lang/fr/intro_install.txt | 1 + .../extension/lang/fr/intro_plugins.txt | 1 + .../extension/lang/fr/intro_search.txt | 1 + .../extension/lang/fr/intro_templates.txt | 1 + .../lib/plugins/extension/lang/fr/lang.php | 87 + .../extension/lang/ja/intro_install.txt | 1 + .../extension/lang/ja/intro_plugins.txt | 1 + .../extension/lang/ja/intro_search.txt | 1 + .../extension/lang/ja/intro_templates.txt | 1 + .../lib/plugins/extension/lang/ja/lang.php | 54 + .../extension/lang/ko/intro_install.txt | 1 + .../extension/lang/ko/intro_plugins.txt | 1 + .../extension/lang/ko/intro_search.txt | 1 + .../extension/lang/ko/intro_templates.txt | 1 + .../lib/plugins/extension/lang/ko/lang.php | 88 + .../extension/lang/nl/intro_install.txt | 1 + .../extension/lang/nl/intro_plugins.txt | 1 + .../extension/lang/nl/intro_search.txt | 1 + .../extension/lang/nl/intro_templates.txt | 1 + .../lib/plugins/extension/lang/nl/lang.php | 87 + .../lib/plugins/extension/lang/ru/lang.php | 60 + .../lib/plugins/extension/lang/sk/lang.php | 58 + .../extension/lang/zh/intro_install.txt | 1 + .../extension/lang/zh/intro_plugins.txt | 1 + .../extension/lang/zh/intro_search.txt | 1 + .../extension/lang/zh/intro_templates.txt | 1 + .../lib/plugins/extension/lang/zh/lang.php | 72 + sources/lib/plugins/extension/plugin.info.txt | 7 + sources/lib/plugins/extension/script.js | 113 + sources/lib/plugins/extension/style.less | 363 + sources/lib/plugins/info/syntax.php | 4 +- sources/lib/plugins/plugin/admin.php | 137 - .../plugin/classes/ap_delete.class.php | 28 - .../plugin/classes/ap_download.class.php | 288 - .../plugin/classes/ap_enable.class.php | 51 - .../plugins/plugin/classes/ap_info.class.php | 143 - .../plugin/classes/ap_manage.class.php | 202 - .../plugin/classes/ap_update.class.php | 36 - sources/lib/plugins/plugin/lang/af/lang.php | 13 - .../plugins/plugin/lang/ar/admin_plugin.txt | 4 - sources/lib/plugins/plugin/lang/ar/lang.php | 54 - .../plugins/plugin/lang/bg/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/bg/lang.php | 54 - .../plugin/lang/ca-valencia/admin_plugin.txt | 4 - .../plugins/plugin/lang/ca-valencia/lang.php | 53 - .../plugins/plugin/lang/ca/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/ca/lang.php | 55 - .../plugins/plugin/lang/cs/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/cs/lang.php | 65 - .../plugins/plugin/lang/da/admin_plugin.txt | 5 - sources/lib/plugins/plugin/lang/da/lang.php | 61 - .../plugin/lang/de-informal/admin_plugin.txt | 3 - .../plugins/plugin/lang/de-informal/lang.php | 59 - .../plugins/plugin/lang/de/admin_plugin.txt | 5 - sources/lib/plugins/plugin/lang/de/lang.php | 66 - .../plugins/plugin/lang/el/admin_plugin.txt | 5 - sources/lib/plugins/plugin/lang/el/lang.php | 58 - .../plugins/plugin/lang/en/admin_plugin.txt | 5 - sources/lib/plugins/plugin/lang/en/lang.php | 78 - .../plugins/plugin/lang/eo/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/eo/lang.php | 60 - .../plugins/plugin/lang/es/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/es/lang.php | 72 - sources/lib/plugins/plugin/lang/et/lang.php | 32 - .../plugins/plugin/lang/eu/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/eu/lang.php | 52 - .../plugins/plugin/lang/fa/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/fa/lang.php | 58 - .../plugins/plugin/lang/fi/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/fi/lang.php | 55 - .../plugins/plugin/lang/fr/admin_plugin.txt | 4 - sources/lib/plugins/plugin/lang/fr/lang.php | 69 - .../plugins/plugin/lang/gl/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/gl/lang.php | 53 - .../plugins/plugin/lang/he/admin_plugin.txt | 5 - sources/lib/plugins/plugin/lang/he/lang.php | 55 - sources/lib/plugins/plugin/lang/hi/lang.php | 12 - sources/lib/plugins/plugin/lang/hr/lang.php | 8 - .../plugins/plugin/lang/hu/admin_plugin.txt | 4 - sources/lib/plugins/plugin/lang/hu/lang.php | 58 - .../plugins/plugin/lang/ia/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/ia/lang.php | 51 - .../lib/plugins/plugin/lang/id-ni/lang.php | 7 - sources/lib/plugins/plugin/lang/id/lang.php | 32 - sources/lib/plugins/plugin/lang/is/lang.php | 47 - .../plugins/plugin/lang/it/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/it/lang.php | 63 - .../plugins/plugin/lang/ja/admin_plugin.txt | 5 - sources/lib/plugins/plugin/lang/ja/lang.php | 58 - sources/lib/plugins/plugin/lang/kk/lang.php | 6 - .../plugins/plugin/lang/ko/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/ko/lang.php | 58 - .../plugins/plugin/lang/la/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/la/lang.php | 50 - .../plugins/plugin/lang/lb/admin_plugin.txt | 4 - sources/lib/plugins/plugin/lang/lb/lang.php | 6 - .../plugins/plugin/lang/lt/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/lt/lang.php | 13 - .../plugins/plugin/lang/lv/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/lv/lang.php | 51 - sources/lib/plugins/plugin/lang/mk/lang.php | 43 - .../plugins/plugin/lang/mr/admin_plugin.txt | 4 - sources/lib/plugins/plugin/lang/mr/lang.php | 53 - sources/lib/plugins/plugin/lang/ms/lang.php | 6 - sources/lib/plugins/plugin/lang/ne/lang.php | 46 - .../plugins/plugin/lang/nl/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/nl/lang.php | 64 - .../plugins/plugin/lang/no/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/no/lang.php | 64 - .../plugins/plugin/lang/pl/admin_plugin.txt | 5 - sources/lib/plugins/plugin/lang/pl/lang.php | 63 - .../plugin/lang/pt-br/admin_plugin.txt | 3 - .../lib/plugins/plugin/lang/pt-br/lang.php | 66 - .../plugins/plugin/lang/pt/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/pt/lang.php | 56 - .../plugins/plugin/lang/ro/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/ro/lang.php | 59 - .../plugins/plugin/lang/ru/admin_plugin.txt | 5 - sources/lib/plugins/plugin/lang/ru/lang.php | 66 - .../plugins/plugin/lang/sk/admin_plugin.txt | 4 - sources/lib/plugins/plugin/lang/sk/lang.php | 55 - .../plugins/plugin/lang/sl/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/sl/lang.php | 55 - .../plugins/plugin/lang/sq/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/sq/lang.php | 50 - .../plugins/plugin/lang/sr/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/sr/lang.php | 52 - .../plugins/plugin/lang/sv/admin_plugin.txt | 5 - sources/lib/plugins/plugin/lang/sv/lang.php | 64 - .../plugins/plugin/lang/th/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/th/lang.php | 50 - .../plugins/plugin/lang/tr/admin_plugin.txt | 3 - sources/lib/plugins/plugin/lang/tr/lang.php | 55 - .../plugins/plugin/lang/uk/admin_plugin.txt | 7 - sources/lib/plugins/plugin/lang/uk/lang.php | 58 - sources/lib/plugins/plugin/lang/vi/lang.php | 5 - .../plugin/lang/zh-tw/admin_plugin.txt | 3 - .../lib/plugins/plugin/lang/zh-tw/lang.php | 60 - .../plugins/plugin/lang/zh/admin_plugin.txt | 5 - sources/lib/plugins/plugin/lang/zh/lang.php | 64 - sources/lib/plugins/plugin/plugin.info.txt | 7 - sources/lib/plugins/plugin/style.css | 195 - .../lib/plugins/popularity/lang/bg/lang.php | 5 +- .../lib/plugins/popularity/lang/et/lang.php | 7 - .../lib/plugins/popularity/lang/hr/lang.php | 8 - .../lib/plugins/popularity/lang/id/lang.php | 6 - .../lib/plugins/popularity/lang/kk/lang.php | 6 - .../lib/plugins/popularity/lang/lb/lang.php | 6 - .../lib/plugins/popularity/lang/mk/lang.php | 6 - .../lib/plugins/popularity/lang/ms/lang.php | 6 - .../lib/plugins/popularity/lang/ru/intro.txt | 4 +- .../lib/plugins/popularity/lang/vi/lang.php | 5 - sources/lib/plugins/revert/admin.php | 3 +- sources/lib/plugins/revert/lang/af/lang.php | 5 - sources/lib/plugins/revert/lang/ar/lang.php | 1 + sources/lib/plugins/revert/lang/bg/lang.php | 4 +- sources/lib/plugins/revert/lang/cs/lang.php | 1 + sources/lib/plugins/revert/lang/et/lang.php | 10 +- sources/lib/plugins/revert/lang/hi/lang.php | 7 - sources/lib/plugins/revert/lang/hr/lang.php | 8 - sources/lib/plugins/revert/lang/hu/lang.php | 5 +- .../lib/plugins/revert/lang/id-ni/lang.php | 7 - sources/lib/plugins/revert/lang/id/lang.php | 7 - sources/lib/plugins/revert/lang/kk/lang.php | 6 - sources/lib/plugins/revert/lang/lb/lang.php | 6 - sources/lib/plugins/revert/lang/lt/lang.php | 7 - sources/lib/plugins/revert/lang/mk/lang.php | 6 - sources/lib/plugins/revert/lang/ms/lang.php | 6 - sources/lib/plugins/revert/lang/no/lang.php | 1 + sources/lib/plugins/revert/lang/sv/lang.php | 1 + sources/lib/plugins/revert/lang/vi/lang.php | 5 - sources/lib/plugins/syntax.php | 196 +- sources/lib/plugins/testing/action.php | 20 - sources/lib/plugins/testing/plugin.info.txt | 7 - sources/lib/plugins/usermanager/admin.php | 79 +- .../lib/plugins/usermanager/lang/bg/lang.php | 11 +- .../plugins/usermanager/lang/cs/import.txt | 2 +- .../usermanager/lang/de-informal/import.txt | 2 +- .../plugins/usermanager/lang/de/import.txt | 2 +- .../plugins/usermanager/lang/en/import.txt | 2 +- .../lib/plugins/usermanager/lang/en/lang.php | 1 - .../plugins/usermanager/lang/eo/import.txt | 2 +- .../lib/plugins/usermanager/lang/es/lang.php | 3 + .../lib/plugins/usermanager/lang/et/lang.php | 9 +- .../plugins/usermanager/lang/fr/import.txt | 2 +- .../lib/plugins/usermanager/lang/hi/lang.php | 7 - .../lib/plugins/usermanager/lang/hr/lang.php | 8 - .../plugins/usermanager/lang/hu/import.txt | 12 +- .../lib/plugins/usermanager/lang/hu/lang.php | 7 +- .../plugins/usermanager/lang/id-ni/lang.php | 7 - .../plugins/usermanager/lang/ja/import.txt | 2 +- .../lib/plugins/usermanager/lang/ko/edit.txt | 2 +- .../plugins/usermanager/lang/ko/import.txt | 2 +- .../lib/plugins/usermanager/lang/ko/intro.txt | 2 +- .../lib/plugins/usermanager/lang/ko/lang.php | 2 +- .../lib/plugins/usermanager/lang/lb/lang.php | 6 - .../lib/plugins/usermanager/lang/ms/lang.php | 6 - .../plugins/usermanager/lang/nl/import.txt | 2 +- .../plugins/usermanager/lang/ru/import.txt | 8 +- .../lib/plugins/usermanager/lang/ru/lang.php | 3 +- .../plugins/usermanager/lang/sk/import.txt | 2 +- .../lib/plugins/usermanager/lang/sk/lang.php | 2 +- .../lib/plugins/usermanager/lang/sl/lang.php | 8 + .../lib/plugins/usermanager/lang/vi/lang.php | 5 - .../plugins/usermanager/lang/zh-tw/import.txt | 2 +- .../plugins/usermanager/lang/zh/import.txt | 2 +- .../lib/plugins/usermanager/lang/zh/lang.php | 2 + sources/lib/scripts/behaviour.js | 2 +- sources/lib/scripts/compatibility.js | 29 +- sources/lib/scripts/edit.js | 11 +- sources/lib/scripts/editor.js | 8 +- sources/lib/scripts/jquery/jquery-migrate.js | 26 +- .../lib/scripts/jquery/jquery-migrate.min.js | 5 +- .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 212 -> 264 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 208 -> 260 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 335 -> 387 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 207 -> 259 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 262 -> 314 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 262 -> 314 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 332 -> 384 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 280 -> 332 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 6837 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 4549 -> 4601 bytes .../images/ui-icons_454545_256x240.png | Bin 6992 -> 6973 bytes .../images/ui-icons_888888_256x240.png | Bin 6999 -> 7044 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 4549 -> 4601 bytes .../jquery/jquery-ui-theme/smoothness.css | 35 +- sources/lib/scripts/jquery/jquery-ui.js | 14993 ++++++++-------- sources/lib/scripts/jquery/jquery-ui.min.js | 17 +- sources/lib/scripts/jquery/jquery.js | 5166 +++--- sources/lib/scripts/jquery/jquery.min.js | 10 +- sources/lib/scripts/jquery/update.sh | 34 +- sources/lib/scripts/linkwiz.js | 4 +- sources/lib/scripts/qsearch.js | 306 +- sources/lib/scripts/textselection.js | 26 +- sources/lib/scripts/toolbar.js | 8 +- sources/lib/styles/geshi.less | 127 + sources/lib/styles/screen.css | 24 +- sources/lib/tpl/dokuwiki/css/_diff.css | 62 + sources/lib/tpl/dokuwiki/css/basic.less | 5 +- sources/lib/tpl/dokuwiki/css/content.less | 22 +- sources/lib/tpl/dokuwiki/css/design.less | 96 +- sources/lib/tpl/dokuwiki/css/mobile.less | 36 +- sources/lib/tpl/dokuwiki/css/pagetools.less | 1 + sources/lib/tpl/dokuwiki/detail.php | 54 +- sources/lib/tpl/dokuwiki/main.php | 2 +- 839 files changed, 21349 insertions(+), 16632 deletions(-) create mode 100755 sources/bin/gittool.php create mode 100644 sources/inc/lang/.htaccess create mode 100644 sources/inc/lang/af/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/ar/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/az/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/bg/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/ca/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/cs/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/da/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/de-informal/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/de/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/el/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/eo/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/es/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/et/adminplugins.txt create mode 100644 sources/inc/lang/et/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/et/resetpwd.txt create mode 100644 sources/inc/lang/et/subscr_digest.txt create mode 100644 sources/inc/lang/et/subscr_form.txt create mode 100644 sources/inc/lang/et/subscr_list.txt create mode 100644 sources/inc/lang/et/subscr_single.txt create mode 100644 sources/inc/lang/et/uploadmail.txt create mode 100644 sources/inc/lang/eu/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/fa/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/fi/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/fo/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/fr/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/gl/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/he/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/hi/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/hr/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/hu-formal/admin.txt create mode 100644 sources/inc/lang/hu-formal/adminplugins.txt create mode 100644 sources/inc/lang/hu-formal/backlinks.txt create mode 100644 sources/inc/lang/hu-formal/conflict.txt create mode 100644 sources/inc/lang/hu-formal/denied.txt create mode 100644 sources/inc/lang/hu-formal/diff.txt create mode 100644 sources/inc/lang/hu-formal/draft.txt create mode 100644 sources/inc/lang/hu-formal/edit.txt create mode 100644 sources/inc/lang/hu-formal/editrev.txt create mode 100644 sources/inc/lang/hu-formal/index.txt create mode 100644 sources/inc/lang/hu-formal/lang.php create mode 100644 sources/inc/lang/hu/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/id/adminplugins.txt create mode 100644 sources/inc/lang/id/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/id/resetpwd.txt create mode 100644 sources/inc/lang/id/subscr_digest.txt create mode 100644 sources/inc/lang/is/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/it/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/ja/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/ka/admin.txt create mode 100644 sources/inc/lang/ka/adminplugins.txt create mode 100644 sources/inc/lang/ka/backlinks.txt create mode 100644 sources/inc/lang/ka/conflict.txt create mode 100644 sources/inc/lang/ka/denied.txt create mode 100644 sources/inc/lang/ka/diff.txt create mode 100644 sources/inc/lang/ka/draft.txt create mode 100644 sources/inc/lang/ka/edit.txt create mode 100644 sources/inc/lang/ka/editrev.txt create mode 100644 sources/inc/lang/ka/index.txt create mode 100644 sources/inc/lang/ka/lang.php create mode 100644 sources/inc/lang/kk/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/km/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/ko/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/lb/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/lt/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/lv/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/mk/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/ms/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/nl/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/no/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/no/resetpwd.txt create mode 100644 sources/inc/lang/pl/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/pt-br/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/pt/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/ro/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/ru/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/sk/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/sl/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/sl/resetpwd.txt create mode 100644 sources/inc/lang/sq/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/sr/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/sv/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/sv/subscr_digest.txt create mode 100644 sources/inc/lang/th/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/tr/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/uk/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/vi/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/zh-tw/jquery.ui.datepicker.js create mode 100644 sources/inc/lang/zh/jquery.ui.datepicker.js create mode 100644 sources/lib/images/fileicons/32x32/7z.png create mode 100644 sources/lib/images/fileicons/32x32/asm.png create mode 100644 sources/lib/images/fileicons/32x32/bash.png create mode 100644 sources/lib/images/fileicons/32x32/bz2.png create mode 100644 sources/lib/images/fileicons/32x32/c.png create mode 100644 sources/lib/images/fileicons/32x32/cc.png create mode 100644 sources/lib/images/fileicons/32x32/conf.png create mode 100644 sources/lib/images/fileicons/32x32/cpp.png create mode 100644 sources/lib/images/fileicons/32x32/cs.png create mode 100644 sources/lib/images/fileicons/32x32/csh.png create mode 100644 sources/lib/images/fileicons/32x32/css.png create mode 100644 sources/lib/images/fileicons/32x32/csv.png create mode 100644 sources/lib/images/fileicons/32x32/deb.png create mode 100644 sources/lib/images/fileicons/32x32/diff.png create mode 100644 sources/lib/images/fileicons/32x32/doc.png create mode 100644 sources/lib/images/fileicons/32x32/docx.png create mode 100644 sources/lib/images/fileicons/32x32/file.png create mode 100644 sources/lib/images/fileicons/32x32/gif.png create mode 100644 sources/lib/images/fileicons/32x32/gz.png create mode 100644 sources/lib/images/fileicons/32x32/h.png create mode 100644 sources/lib/images/fileicons/32x32/hpp.png create mode 100644 sources/lib/images/fileicons/32x32/htm.png create mode 100644 sources/lib/images/fileicons/32x32/html.png create mode 100644 sources/lib/images/fileicons/32x32/ico.png create mode 100644 sources/lib/images/fileicons/32x32/java.png create mode 100644 sources/lib/images/fileicons/32x32/jpeg.png create mode 100644 sources/lib/images/fileicons/32x32/jpg.png create mode 100644 sources/lib/images/fileicons/32x32/js.png create mode 100644 sources/lib/images/fileicons/32x32/json.png create mode 100644 sources/lib/images/fileicons/32x32/lua.png create mode 100644 sources/lib/images/fileicons/32x32/mp3.png create mode 100644 sources/lib/images/fileicons/32x32/mp4.png create mode 100644 sources/lib/images/fileicons/32x32/odc.png create mode 100644 sources/lib/images/fileicons/32x32/odf.png create mode 100644 sources/lib/images/fileicons/32x32/odg.png create mode 100644 sources/lib/images/fileicons/32x32/odi.png create mode 100644 sources/lib/images/fileicons/32x32/odp.png create mode 100644 sources/lib/images/fileicons/32x32/ods.png create mode 100644 sources/lib/images/fileicons/32x32/odt.png create mode 100644 sources/lib/images/fileicons/32x32/ogg.png create mode 100644 sources/lib/images/fileicons/32x32/ogv.png create mode 100644 sources/lib/images/fileicons/32x32/pas.png create mode 100644 sources/lib/images/fileicons/32x32/pdf.png create mode 100644 sources/lib/images/fileicons/32x32/php.png create mode 100644 sources/lib/images/fileicons/32x32/pl.png create mode 100644 sources/lib/images/fileicons/32x32/png.png create mode 100644 sources/lib/images/fileicons/32x32/ppt.png create mode 100644 sources/lib/images/fileicons/32x32/pptx.png create mode 100644 sources/lib/images/fileicons/32x32/ps.png create mode 100644 sources/lib/images/fileicons/32x32/py.png create mode 100644 sources/lib/images/fileicons/32x32/rar.png create mode 100644 sources/lib/images/fileicons/32x32/rb.png create mode 100644 sources/lib/images/fileicons/32x32/rpm.png create mode 100644 sources/lib/images/fileicons/32x32/rtf.png create mode 100644 sources/lib/images/fileicons/32x32/sh.png create mode 100644 sources/lib/images/fileicons/32x32/sql.png create mode 100644 sources/lib/images/fileicons/32x32/swf.png create mode 100644 sources/lib/images/fileicons/32x32/sxc.png create mode 100644 sources/lib/images/fileicons/32x32/sxd.png create mode 100644 sources/lib/images/fileicons/32x32/sxi.png create mode 100644 sources/lib/images/fileicons/32x32/sxw.png create mode 100644 sources/lib/images/fileicons/32x32/tar.png create mode 100644 sources/lib/images/fileicons/32x32/tgz.png create mode 100644 sources/lib/images/fileicons/32x32/txt.png create mode 100644 sources/lib/images/fileicons/32x32/wav.png create mode 100644 sources/lib/images/fileicons/32x32/webm.png create mode 100644 sources/lib/images/fileicons/32x32/xls.png create mode 100644 sources/lib/images/fileicons/32x32/xlsx.png create mode 100644 sources/lib/images/fileicons/32x32/xml.png create mode 100644 sources/lib/images/fileicons/32x32/zip.png create mode 100644 sources/lib/images/fileicons/README create mode 100644 sources/lib/images/fileicons/asm.png delete mode 100644 sources/lib/images/fileicons/audio.png create mode 100644 sources/lib/images/fileicons/bash.png create mode 100644 sources/lib/images/fileicons/cc.png create mode 100644 sources/lib/images/fileicons/csh.png create mode 100644 sources/lib/images/fileicons/diff.png create mode 100644 sources/lib/images/fileicons/h.png create mode 100644 sources/lib/images/fileicons/hpp.png create mode 100644 sources/lib/images/fileicons/json.png create mode 100644 sources/lib/images/fileicons/mp4.png create mode 100644 sources/lib/images/fileicons/ogv.png create mode 100644 sources/lib/images/fileicons/pas.png create mode 100644 sources/lib/images/fileicons/sh.png create mode 100644 sources/lib/images/fileicons/webm.png create mode 100644 sources/lib/images/interwiki/user.png create mode 100644 sources/lib/plugins/acl/lang/et/help.txt delete mode 100644 sources/lib/plugins/acl/lang/hi/lang.php delete mode 100644 sources/lib/plugins/acl/lang/id-ni/lang.php delete mode 100644 sources/lib/plugins/acl/lang/lb/lang.php delete mode 100644 sources/lib/plugins/acl/lang/ms/lang.php create mode 100644 sources/lib/plugins/authad/action.php create mode 100644 sources/lib/plugins/authad/lang/ar/settings.php create mode 100644 sources/lib/plugins/authad/lang/de/lang.php create mode 100644 sources/lib/plugins/authad/lang/en/lang.php create mode 100644 sources/lib/plugins/authad/lang/eo/lang.php create mode 100644 sources/lib/plugins/authad/lang/es/lang.php create mode 100644 sources/lib/plugins/authad/lang/fr/lang.php create mode 100644 sources/lib/plugins/authad/lang/ko/lang.php delete mode 100644 sources/lib/plugins/authad/lang/lv/settings.php create mode 100644 sources/lib/plugins/authad/lang/nl/lang.php create mode 100644 sources/lib/plugins/authad/lang/no/settings.php create mode 100644 sources/lib/plugins/authad/lang/ru/lang.php create mode 100644 sources/lib/plugins/authad/lang/sl/settings.php create mode 100644 sources/lib/plugins/authldap/lang/ar/settings.php create mode 100644 sources/lib/plugins/authldap/lang/et/settings.php create mode 100644 sources/lib/plugins/authldap/lang/he/settings.php delete mode 100644 sources/lib/plugins/authldap/lang/lv/settings.php create mode 100644 sources/lib/plugins/authldap/lang/no/settings.php create mode 100644 sources/lib/plugins/authldap/lang/sl/settings.php delete mode 100644 sources/lib/plugins/authmysql/lang/fi/settings.php delete mode 100644 sources/lib/plugins/authmysql/lang/lv/settings.php create mode 100644 sources/lib/plugins/authpgsql/lang/es/settings.php delete mode 100644 sources/lib/plugins/authpgsql/lang/fi/settings.php delete mode 100644 sources/lib/plugins/authpgsql/lang/it/settings.php delete mode 100644 sources/lib/plugins/authpgsql/lang/lv/settings.php delete mode 100644 sources/lib/plugins/authpgsql/lang/pl/settings.php delete mode 100644 sources/lib/plugins/config/lang/hr/lang.php delete mode 100644 sources/lib/plugins/config/lang/id/lang.php delete mode 100644 sources/lib/plugins/config/lang/kk/lang.php delete mode 100644 sources/lib/plugins/config/lang/lb/lang.php delete mode 100644 sources/lib/plugins/config/lang/mk/lang.php delete mode 100644 sources/lib/plugins/config/lang/ms/lang.php delete mode 100644 sources/lib/plugins/config/lang/vi/lang.php create mode 100644 sources/lib/plugins/extension/action.php create mode 100644 sources/lib/plugins/extension/admin.php create mode 100644 sources/lib/plugins/extension/all.less create mode 100644 sources/lib/plugins/extension/helper/extension.php create mode 100644 sources/lib/plugins/extension/helper/gui.php create mode 100644 sources/lib/plugins/extension/helper/list.php create mode 100644 sources/lib/plugins/extension/helper/repository.php create mode 100644 sources/lib/plugins/extension/images/disabled.png create mode 100644 sources/lib/plugins/extension/images/donate.png create mode 100644 sources/lib/plugins/extension/images/down.png create mode 100644 sources/lib/plugins/extension/images/enabled.png create mode 100644 sources/lib/plugins/extension/images/icons.xcf create mode 100644 sources/lib/plugins/extension/images/license.txt create mode 100644 sources/lib/plugins/extension/images/overlay.png create mode 100644 sources/lib/plugins/extension/images/plugin.png create mode 100644 sources/lib/plugins/extension/images/tag.png create mode 100644 sources/lib/plugins/extension/images/template.png create mode 100644 sources/lib/plugins/extension/images/up.png create mode 100644 sources/lib/plugins/extension/images/warning.png create mode 100644 sources/lib/plugins/extension/lang/de/intro_install.txt create mode 100644 sources/lib/plugins/extension/lang/de/intro_plugins.txt create mode 100644 sources/lib/plugins/extension/lang/de/intro_search.txt create mode 100644 sources/lib/plugins/extension/lang/de/intro_templates.txt create mode 100644 sources/lib/plugins/extension/lang/de/lang.php create mode 100644 sources/lib/plugins/extension/lang/en/intro_install.txt create mode 100644 sources/lib/plugins/extension/lang/en/intro_plugins.txt create mode 100644 sources/lib/plugins/extension/lang/en/intro_search.txt create mode 100644 sources/lib/plugins/extension/lang/en/intro_templates.txt create mode 100644 sources/lib/plugins/extension/lang/en/lang.php create mode 100644 sources/lib/plugins/extension/lang/eo/intro_install.txt create mode 100644 sources/lib/plugins/extension/lang/eo/intro_plugins.txt create mode 100644 sources/lib/plugins/extension/lang/eo/intro_search.txt create mode 100644 sources/lib/plugins/extension/lang/eo/intro_templates.txt create mode 100644 sources/lib/plugins/extension/lang/eo/lang.php create mode 100644 sources/lib/plugins/extension/lang/es/lang.php create mode 100644 sources/lib/plugins/extension/lang/fr/intro_install.txt create mode 100644 sources/lib/plugins/extension/lang/fr/intro_plugins.txt create mode 100644 sources/lib/plugins/extension/lang/fr/intro_search.txt create mode 100644 sources/lib/plugins/extension/lang/fr/intro_templates.txt create mode 100644 sources/lib/plugins/extension/lang/fr/lang.php create mode 100644 sources/lib/plugins/extension/lang/ja/intro_install.txt create mode 100644 sources/lib/plugins/extension/lang/ja/intro_plugins.txt create mode 100644 sources/lib/plugins/extension/lang/ja/intro_search.txt create mode 100644 sources/lib/plugins/extension/lang/ja/intro_templates.txt create mode 100644 sources/lib/plugins/extension/lang/ja/lang.php create mode 100644 sources/lib/plugins/extension/lang/ko/intro_install.txt create mode 100644 sources/lib/plugins/extension/lang/ko/intro_plugins.txt create mode 100644 sources/lib/plugins/extension/lang/ko/intro_search.txt create mode 100644 sources/lib/plugins/extension/lang/ko/intro_templates.txt create mode 100644 sources/lib/plugins/extension/lang/ko/lang.php create mode 100644 sources/lib/plugins/extension/lang/nl/intro_install.txt create mode 100644 sources/lib/plugins/extension/lang/nl/intro_plugins.txt create mode 100644 sources/lib/plugins/extension/lang/nl/intro_search.txt create mode 100644 sources/lib/plugins/extension/lang/nl/intro_templates.txt create mode 100644 sources/lib/plugins/extension/lang/nl/lang.php create mode 100644 sources/lib/plugins/extension/lang/ru/lang.php create mode 100644 sources/lib/plugins/extension/lang/sk/lang.php create mode 100644 sources/lib/plugins/extension/lang/zh/intro_install.txt create mode 100644 sources/lib/plugins/extension/lang/zh/intro_plugins.txt create mode 100644 sources/lib/plugins/extension/lang/zh/intro_search.txt create mode 100644 sources/lib/plugins/extension/lang/zh/intro_templates.txt create mode 100644 sources/lib/plugins/extension/lang/zh/lang.php create mode 100644 sources/lib/plugins/extension/plugin.info.txt create mode 100644 sources/lib/plugins/extension/script.js create mode 100644 sources/lib/plugins/extension/style.less delete mode 100644 sources/lib/plugins/plugin/admin.php delete mode 100644 sources/lib/plugins/plugin/classes/ap_delete.class.php delete mode 100644 sources/lib/plugins/plugin/classes/ap_download.class.php delete mode 100644 sources/lib/plugins/plugin/classes/ap_enable.class.php delete mode 100644 sources/lib/plugins/plugin/classes/ap_info.class.php delete mode 100644 sources/lib/plugins/plugin/classes/ap_manage.class.php delete mode 100644 sources/lib/plugins/plugin/classes/ap_update.class.php delete mode 100644 sources/lib/plugins/plugin/lang/af/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/ar/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/ar/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/bg/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/bg/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/ca-valencia/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/ca-valencia/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/ca/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/ca/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/cs/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/cs/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/da/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/da/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/de-informal/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/de-informal/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/de/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/de/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/el/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/el/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/en/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/en/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/eo/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/eo/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/es/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/es/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/et/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/eu/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/eu/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/fa/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/fa/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/fi/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/fi/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/fr/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/fr/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/gl/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/gl/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/he/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/he/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/hi/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/hr/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/hu/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/hu/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/ia/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/ia/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/id-ni/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/id/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/is/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/it/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/it/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/ja/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/ja/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/kk/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/ko/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/ko/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/la/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/la/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/lb/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/lb/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/lt/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/lt/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/lv/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/lv/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/mk/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/mr/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/mr/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/ms/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/ne/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/nl/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/nl/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/no/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/no/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/pl/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/pl/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/pt-br/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/pt-br/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/pt/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/pt/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/ro/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/ro/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/ru/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/ru/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/sk/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/sk/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/sl/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/sl/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/sq/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/sq/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/sr/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/sr/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/sv/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/sv/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/th/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/th/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/tr/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/tr/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/uk/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/uk/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/vi/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/zh-tw/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/zh-tw/lang.php delete mode 100644 sources/lib/plugins/plugin/lang/zh/admin_plugin.txt delete mode 100644 sources/lib/plugins/plugin/lang/zh/lang.php delete mode 100644 sources/lib/plugins/plugin/plugin.info.txt delete mode 100644 sources/lib/plugins/plugin/style.css delete mode 100644 sources/lib/plugins/popularity/lang/et/lang.php delete mode 100644 sources/lib/plugins/popularity/lang/hr/lang.php delete mode 100644 sources/lib/plugins/popularity/lang/id/lang.php delete mode 100644 sources/lib/plugins/popularity/lang/kk/lang.php delete mode 100644 sources/lib/plugins/popularity/lang/lb/lang.php delete mode 100644 sources/lib/plugins/popularity/lang/mk/lang.php delete mode 100644 sources/lib/plugins/popularity/lang/ms/lang.php delete mode 100644 sources/lib/plugins/popularity/lang/vi/lang.php delete mode 100644 sources/lib/plugins/revert/lang/af/lang.php delete mode 100644 sources/lib/plugins/revert/lang/hi/lang.php delete mode 100644 sources/lib/plugins/revert/lang/hr/lang.php delete mode 100644 sources/lib/plugins/revert/lang/id-ni/lang.php delete mode 100644 sources/lib/plugins/revert/lang/id/lang.php delete mode 100644 sources/lib/plugins/revert/lang/kk/lang.php delete mode 100644 sources/lib/plugins/revert/lang/lb/lang.php delete mode 100644 sources/lib/plugins/revert/lang/lt/lang.php delete mode 100644 sources/lib/plugins/revert/lang/mk/lang.php delete mode 100644 sources/lib/plugins/revert/lang/ms/lang.php delete mode 100644 sources/lib/plugins/revert/lang/vi/lang.php delete mode 100644 sources/lib/plugins/testing/action.php delete mode 100644 sources/lib/plugins/testing/plugin.info.txt delete mode 100644 sources/lib/plugins/usermanager/lang/hi/lang.php delete mode 100644 sources/lib/plugins/usermanager/lang/hr/lang.php delete mode 100644 sources/lib/plugins/usermanager/lang/id-ni/lang.php delete mode 100644 sources/lib/plugins/usermanager/lang/lb/lang.php delete mode 100644 sources/lib/plugins/usermanager/lang/ms/lang.php delete mode 100644 sources/lib/plugins/usermanager/lang/vi/lang.php create mode 100644 sources/lib/styles/geshi.less diff --git a/sources/README b/sources/README index 3b7cb8a..35de49a 100644 --- a/sources/README +++ b/sources/README @@ -4,7 +4,7 @@ at http://www.dokuwiki.org/ For Installation Instructions see http://www.dokuwiki.org/install -DokuWiki - 2004-2013 (c) Andreas Gohr +DokuWiki - 2004-2014 (c) Andreas Gohr and the DokuWiki Community See COPYING and file headers for license info diff --git a/sources/VERSION b/sources/VERSION index 508f846..e66d3a5 100644 --- a/sources/VERSION +++ b/sources/VERSION @@ -1 +1 @@ -2013-12-08 "Binky" +2014-05-05 "Ponder Stibbons" diff --git a/sources/bin/gittool.php b/sources/bin/gittool.php new file mode 100755 index 0000000..f9f68ac --- /dev/null +++ b/sources/bin/gittool.php @@ -0,0 +1,340 @@ +#!/usr/bin/php +cmd_help(); + break; + case 'clone': + $GitToolCLI->cmd_clone($argv); + break; + case 'install': + $GitToolCLI->cmd_install($argv); + break; + case 'repo': + case 'repos': + $GitToolCLI->cmd_repos(); + break; + default: + $GitToolCLI->cmd_git($command, $argv); +} + +/** + * Easily manage DokuWiki git repositories + * + * @author Andreas Gohr + */ +class GitToolCLI { + private $color = true; + + public function cmd_help() { + echo << [parameters] + +Manage git repositories for DokuWiki and its plugins and templates. + +EXAMPLE + +$> ./bin/gittool.php clone gallery template:ach +$> ./bin/gittool.php repos +$> ./bin/gittool.php origin -v + +COMMANDS + +help + This help screen + +clone + Tries to install a known plugin or template (prefix with template:) via + git. Uses the DokuWiki.org plugin repository to find the proper git + repository. Multiple extensions can be given as parameters + +install + The same as clone, but when no git source repository can be found, the + extension is installed via download + +repos + Lists all git repositories found in this DokuWiki installation + + + Any unknown commands are assumed to be arguments to git and will be + executed in all repositories found within this DokuWiki installation + +EOF; + } + + /** + * Tries to install the given extensions using git clone + * + * @param $extensions + */ + public function cmd_clone($extensions) { + $errors = array(); + $succeeded = array(); + + foreach($extensions as $ext) { + $repo = $this->getSourceRepo($ext); + + if(!$repo) { + $this->msg_error("could not find a repository for $ext"); + $errors[] = $ext; + } else { + if($this->cloneExtension($ext, $repo)) { + $succeeded[] = $ext; + } else { + $errors[] = $ext; + } + } + } + + echo "\n"; + if($succeeded) $this->msg_success('successfully cloned the following extensions: '.join(', ', $succeeded)); + if($errors) $this->msg_error('failed to clone the following extensions: '.join(', ', $errors)); + } + + /** + * Tries to install the given extensions using git clone with fallback to install + * + * @param $extensions + */ + public function cmd_install($extensions) { + $errors = array(); + $succeeded = array(); + + foreach($extensions as $ext) { + $repo = $this->getSourceRepo($ext); + + if(!$repo) { + $this->msg_info("could not find a repository for $ext"); + if($this->downloadExtension($ext)) { + $succeeded[] = $ext; + } else { + $errors[] = $ext; + } + } else { + if($this->cloneExtension($ext, $repo)) { + $succeeded[] = $ext; + } else { + $errors[] = $ext; + } + } + } + + echo "\n"; + if($succeeded) $this->msg_success('successfully installed the following extensions: '.join(', ', $succeeded)); + if($errors) $this->msg_error('failed to install the following extensions: '.join(', ', $errors)); + } + + /** + * Executes the given git command in every repository + * + * @param $cmd + * @param $arg + */ + public function cmd_git($cmd, $arg) { + $repos = $this->findRepos(); + + $shell = array_merge(array('git', $cmd), $arg); + $shell = array_map('escapeshellarg', $shell); + $shell = join(' ', $shell); + + foreach($repos as $repo) { + if(!@chdir($repo)) { + $this->msg_error("Could not change into $repo"); + continue; + } + + echo "\n"; + $this->msg_info("executing $shell in $repo"); + $ret = 0; + system($shell, $ret); + + if($ret == 0) { + $this->msg_success("git succeeded in $repo"); + } else { + $this->msg_error("git failed in $repo"); + } + } + } + + /** + * Simply lists the repositories + */ + public function cmd_repos() { + $repos = $this->findRepos(); + foreach($repos as $repo) { + echo "$repo\n"; + } + } + + /** + * Install extension from the given download URL + * + * @param string $ext + * @return bool + */ + private function downloadExtension($ext) { + /** @var helper_plugin_extension_extension $plugin */ + $plugin = plugin_load('helper', 'extension_extension'); + if(!$ext) die("extension plugin not available, can't continue"); + $plugin->setExtension($ext); + + $url = $plugin->getDownloadURL(); + if(!$url) { + $this->msg_error("no download URL for $ext"); + return false; + } + + $ok = false; + try { + $this->msg_info("installing $ext via download from $url"); + $ok = $plugin->installFromURL($url); + } catch(Exception $e) { + $this->msg_error($e->getMessage()); + } + + if($ok) { + $this->msg_success("installed $ext via download"); + return true; + } else { + $this->msg_success("failed to install $ext via download"); + return false; + } + } + + /** + * Clones the extension from the given repository + * + * @param string $ext + * @param string $repo + * @return bool + */ + private function cloneExtension($ext, $repo) { + if(substr($ext, 0, 9) == 'template:') { + $target = fullpath(tpl_incdir().'../'.substr($ext, 9)); + } else { + $target = DOKU_PLUGIN.$ext; + } + + $this->msg_info("cloning $ext from $repo to $target"); + $ret = 0; + system("git clone $repo $target", $ret); + if($ret === 0) { + $this->msg_success("cloning of $ext succeeded"); + return true; + } else { + $this->msg_error("cloning of $ext failed"); + return false; + } + } + + /** + * Returns all git repositories in this DokuWiki install + * + * Looks in root, template and plugin directories only. + * + * @return array + */ + private function findRepos() { + $this->msg_info('Looking for .git directories'); + $data = array_merge( + glob(DOKU_INC.'.git', GLOB_ONLYDIR), + glob(DOKU_PLUGIN.'*/.git', GLOB_ONLYDIR), + glob(fullpath(tpl_incdir().'../').'/*/.git', GLOB_ONLYDIR) + ); + + if(!$data) { + $this->msg_error('Found no .git directories'); + } else { + $this->msg_success('Found '.count($data).' .git directories'); + } + $data = array_map('fullpath', array_map('dirname', $data)); + return $data; + } + + /** + * Returns the repository for the given extension + * + * @param $extension + * @return bool|string + */ + private function getSourceRepo($extension) { + /** @var helper_plugin_extension_extension $ext */ + $ext = plugin_load('helper', 'extension_extension'); + if(!$ext) die("extension plugin not available, can't continue"); + $ext->setExtension($extension); + + $repourl = $ext->getSourcerepoURL(); + if(!$repourl) return false; + + // match github repos + if(preg_match('/github\.com\/([^\/]+)\/([^\/]+)/i', $repourl, $m)) { + $user = $m[1]; + $repo = $m[2]; + return 'https://github.com/'.$user.'/'.$repo.'.git'; + } + + // match gitorious repos + if(preg_match('/gitorious.org\/([^\/]+)\/([^\/]+)?/i', $repourl, $m)) { + $user = $m[1]; + $repo = $m[2]; + if(!$repo) $repo = $user; + + return 'https://git.gitorious.org/'.$user.'/'.$repo.'.git'; + } + + // match bitbucket repos - most people seem to use mercurial there though + if(preg_match('/bitbucket\.org\/([^\/]+)\/([^\/]+)/i', $repourl, $m)) { + $user = $m[1]; + $repo = $m[2]; + return 'https://bitbucket.org/'.$user.'/'.$repo.'.git'; + } + + return false; + } + + /** + * Print an error message + * + * @param $string + */ + private function msg_error($string) { + if($this->color) echo "\033[31m"; // red + echo "E: $string\n"; + if($this->color) echo "\033[37m"; // reset + } + + /** + * Print a success message + * + * @param $string + */ + private function msg_success($string) { + if($this->color) echo "\033[32m"; // green + echo "S: $string\n"; + if($this->color) echo "\033[37m"; // reset + } + + /** + * Print an info message + * + * @param $string + */ + private function msg_info($string) { + if($this->color) echo "\033[36m"; // cyan + echo "I: $string\n"; + if($this->color) echo "\033[37m"; // reset + } +} \ No newline at end of file diff --git a/sources/bin/striplangs.php b/sources/bin/striplangs.php index ac95626..2bfddce 100755 --- a/sources/bin/striplangs.php +++ b/sources/bin/striplangs.php @@ -15,7 +15,7 @@ require_once DOKU_INC.'inc/cliopts.php'; function usage($show_examples = false) { print "Usage: striplangs.php [-h [-x]] [-e] [-k lang1[,lang2]..[,langN]] - Removes all languages from the instalation, besides the ones + Removes all languages from the installation, besides the ones after the -k option. English language is never removed! OPTIONS diff --git a/sources/conf/entities.conf b/sources/conf/entities.conf index be9ed6d..c0d653c 100644 --- a/sources/conf/entities.conf +++ b/sources/conf/entities.conf @@ -2,7 +2,7 @@ # # Order does matter! # -# You can use HTML entities here, but it is not recomended because it may break +# You can use HTML entities here, but it is not recommended because it may break # non-HTML renderers. Use UTF-8 chars directly instead. <-> ↔ diff --git a/sources/conf/interwiki.conf b/sources/conf/interwiki.conf index 28561a4..d961912 100644 --- a/sources/conf/interwiki.conf +++ b/sources/conf/interwiki.conf @@ -24,12 +24,13 @@ amazon.de http://www.amazon.de/exec/obidos/ASIN/{URL}/splitbrain-21/ amazon.uk http://www.amazon.co.uk/exec/obidos/ASIN/ paypal https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business= phpfn http://www.php.net/{NAME} -coral http://{HOST}.{PORT}.nyud.net:8090/{PATH}?{QUERY} +coral http://{HOST}.{PORT}.nyud.net:8090{PATH}?{QUERY} freecache http://freecache.org/{NAME} sb http://www.splitbrain.org/go/ skype skype:{NAME} google.de http://www.google.de/search?q= go http://www.google.com/search?q={URL}&btnI=lucky +user :user:{NAME} # To support VoIP/SIP links callto callto://{NAME} diff --git a/sources/conf/mediameta.php b/sources/conf/mediameta.php index 0428a4b..f75fa08 100644 --- a/sources/conf/mediameta.php +++ b/sources/conf/mediameta.php @@ -5,7 +5,7 @@ * following contents: * fieldname - Where data will be saved (EXIF or IPTC field) * label - key to lookup in the $lang var, if not found printed as is - * htmltype - 'text' or 'textarea' + * htmltype - 'text', 'textarea' or 'date' * lookups - array additional fields to lookup the data (EXIF or IPTC fields) * * The fields are not ordered continously to make inserting additional items diff --git a/sources/conf/mime.conf b/sources/conf/mime.conf index 381b93f..2a50fab 100644 --- a/sources/conf/mime.conf +++ b/sources/conf/mime.conf @@ -13,6 +13,9 @@ swf application/x-shockwave-flash mp3 audio/mpeg ogg audio/ogg wav audio/wav +webm video/webm +ogv video/ogg +mp4 video/mp4 tgz !application/octet-stream tar !application/x-gtar diff --git a/sources/conf/plugins.required.php b/sources/conf/plugins.required.php index 26eb888..75336da 100644 --- a/sources/conf/plugins.required.php +++ b/sources/conf/plugins.required.php @@ -4,8 +4,9 @@ * from changes by the extention manager. These settings will override any local settings. * It is not recommended to change this file, as it is overwritten on DokuWiki upgrades. */ -$plugins['acl'] = 1; -$plugins['plugin'] = 1; -$plugins['config'] = 1; -$plugins['usermanager'] = 1; -$plugins['revert'] = 1; +$plugins['acl'] = 1; +$plugins['authplain'] = 1; +$plugins['extension'] = 1; +$plugins['config'] = 1; +$plugins['usermanager'] = 1; +$plugins['template:dokuwiki'] = 1; // not a plugin, but this should not be uninstalled either diff --git a/sources/data/deleted.files b/sources/data/deleted.files index 63335d3..cac352c 100644 --- a/sources/data/deleted.files +++ b/sources/data/deleted.files @@ -2,6 +2,164 @@ # but were removed later. An up to date DokuWiki should not have any of # the files installed +# removed in 2014-05-05 +lib/images/fileicons/audio.png +lib/plugins/acl/lang/hi/lang.php +lib/plugins/acl/lang/id-ni/lang.php +lib/plugins/acl/lang/lb/lang.php +lib/plugins/acl/lang/ms/lang.php +lib/plugins/authad/lang/lv/settings.php +lib/plugins/authldap/lang/lv/settings.php +lib/plugins/authmysql/lang/fi/settings.php +lib/plugins/authmysql/lang/lv/settings.php +lib/plugins/authpgsql/lang/fi/settings.php +lib/plugins/authpgsql/lang/it/settings.php +lib/plugins/authpgsql/lang/lv/settings.php +lib/plugins/authpgsql/lang/pl/settings.php +lib/plugins/config/lang/hr/lang.php +lib/plugins/config/lang/id/lang.php +lib/plugins/config/lang/kk/lang.php +lib/plugins/config/lang/lb/lang.php +lib/plugins/config/lang/mk/lang.php +lib/plugins/config/lang/ms/lang.php +lib/plugins/config/lang/vi/lang.php +lib/plugins/plugin/admin.php +lib/plugins/plugin/classes/ap_delete.class.php +lib/plugins/plugin/classes/ap_download.class.php +lib/plugins/plugin/classes/ap_enable.class.php +lib/plugins/plugin/classes/ap_info.class.php +lib/plugins/plugin/classes/ap_manage.class.php +lib/plugins/plugin/classes/ap_update.class.php +lib/plugins/plugin/lang/af/lang.php +lib/plugins/plugin/lang/ar/admin_plugin.txt +lib/plugins/plugin/lang/ar/lang.php +lib/plugins/plugin/lang/bg/admin_plugin.txt +lib/plugins/plugin/lang/bg/lang.php +lib/plugins/plugin/lang/ca-valencia/admin_plugin.txt +lib/plugins/plugin/lang/ca-valencia/lang.php +lib/plugins/plugin/lang/ca/admin_plugin.txt +lib/plugins/plugin/lang/ca/lang.php +lib/plugins/plugin/lang/cs/admin_plugin.txt +lib/plugins/plugin/lang/cs/lang.php +lib/plugins/plugin/lang/da/admin_plugin.txt +lib/plugins/plugin/lang/da/lang.php +lib/plugins/plugin/lang/de-informal/admin_plugin.txt +lib/plugins/plugin/lang/de-informal/lang.php +lib/plugins/plugin/lang/de/admin_plugin.txt +lib/plugins/plugin/lang/de/lang.php +lib/plugins/plugin/lang/el/admin_plugin.txt +lib/plugins/plugin/lang/el/lang.php +lib/plugins/plugin/lang/en/admin_plugin.txt +lib/plugins/plugin/lang/en/lang.php +lib/plugins/plugin/lang/eo/admin_plugin.txt +lib/plugins/plugin/lang/eo/lang.php +lib/plugins/plugin/lang/es/admin_plugin.txt +lib/plugins/plugin/lang/es/lang.php +lib/plugins/plugin/lang/et/lang.php +lib/plugins/plugin/lang/eu/admin_plugin.txt +lib/plugins/plugin/lang/eu/lang.php +lib/plugins/plugin/lang/fa/admin_plugin.txt +lib/plugins/plugin/lang/fa/lang.php +lib/plugins/plugin/lang/fi/admin_plugin.txt +lib/plugins/plugin/lang/fi/lang.php +lib/plugins/plugin/lang/fr/admin_plugin.txt +lib/plugins/plugin/lang/fr/lang.php +lib/plugins/plugin/lang/gl/admin_plugin.txt +lib/plugins/plugin/lang/gl/lang.php +lib/plugins/plugin/lang/he/admin_plugin.txt +lib/plugins/plugin/lang/he/lang.php +lib/plugins/plugin/lang/hi/lang.php +lib/plugins/plugin/lang/hr/lang.php +lib/plugins/plugin/lang/hu/admin_plugin.txt +lib/plugins/plugin/lang/hu/lang.php +lib/plugins/plugin/lang/ia/admin_plugin.txt +lib/plugins/plugin/lang/ia/lang.php +lib/plugins/plugin/lang/id-ni/lang.php +lib/plugins/plugin/lang/id/lang.php +lib/plugins/plugin/lang/is/lang.php +lib/plugins/plugin/lang/it/admin_plugin.txt +lib/plugins/plugin/lang/it/lang.php +lib/plugins/plugin/lang/ja/admin_plugin.txt +lib/plugins/plugin/lang/ja/lang.php +lib/plugins/plugin/lang/kk/lang.php +lib/plugins/plugin/lang/ko/admin_plugin.txt +lib/plugins/plugin/lang/ko/lang.php +lib/plugins/plugin/lang/la/admin_plugin.txt +lib/plugins/plugin/lang/la/lang.php +lib/plugins/plugin/lang/lb/admin_plugin.txt +lib/plugins/plugin/lang/lb/lang.php +lib/plugins/plugin/lang/lt/admin_plugin.txt +lib/plugins/plugin/lang/lt/lang.php +lib/plugins/plugin/lang/lv/admin_plugin.txt +lib/plugins/plugin/lang/lv/lang.php +lib/plugins/plugin/lang/mk/lang.php +lib/plugins/plugin/lang/mr/admin_plugin.txt +lib/plugins/plugin/lang/mr/lang.php +lib/plugins/plugin/lang/ms/lang.php +lib/plugins/plugin/lang/ne/lang.php +lib/plugins/plugin/lang/nl/admin_plugin.txt +lib/plugins/plugin/lang/nl/lang.php +lib/plugins/plugin/lang/no/admin_plugin.txt +lib/plugins/plugin/lang/no/lang.php +lib/plugins/plugin/lang/pl/admin_plugin.txt +lib/plugins/plugin/lang/pl/lang.php +lib/plugins/plugin/lang/pt-br/admin_plugin.txt +lib/plugins/plugin/lang/pt-br/lang.php +lib/plugins/plugin/lang/pt/admin_plugin.txt +lib/plugins/plugin/lang/pt/lang.php +lib/plugins/plugin/lang/ro/admin_plugin.txt +lib/plugins/plugin/lang/ro/lang.php +lib/plugins/plugin/lang/ru/admin_plugin.txt +lib/plugins/plugin/lang/ru/lang.php +lib/plugins/plugin/lang/sk/admin_plugin.txt +lib/plugins/plugin/lang/sk/lang.php +lib/plugins/plugin/lang/sl/admin_plugin.txt +lib/plugins/plugin/lang/sl/lang.php +lib/plugins/plugin/lang/sq/admin_plugin.txt +lib/plugins/plugin/lang/sq/lang.php +lib/plugins/plugin/lang/sr/admin_plugin.txt +lib/plugins/plugin/lang/sr/lang.php +lib/plugins/plugin/lang/sv/admin_plugin.txt +lib/plugins/plugin/lang/sv/lang.php +lib/plugins/plugin/lang/th/admin_plugin.txt +lib/plugins/plugin/lang/th/lang.php +lib/plugins/plugin/lang/tr/admin_plugin.txt +lib/plugins/plugin/lang/tr/lang.php +lib/plugins/plugin/lang/uk/admin_plugin.txt +lib/plugins/plugin/lang/uk/lang.php +lib/plugins/plugin/lang/vi/lang.php +lib/plugins/plugin/lang/zh-tw/admin_plugin.txt +lib/plugins/plugin/lang/zh-tw/lang.php +lib/plugins/plugin/lang/zh/admin_plugin.txt +lib/plugins/plugin/lang/zh/lang.php +lib/plugins/plugin/plugin.info.txt +lib/plugins/plugin/style.css +lib/plugins/popularity/lang/et/lang.php +lib/plugins/popularity/lang/hr/lang.php +lib/plugins/popularity/lang/id/lang.php +lib/plugins/popularity/lang/kk/lang.php +lib/plugins/popularity/lang/lb/lang.php +lib/plugins/popularity/lang/mk/lang.php +lib/plugins/popularity/lang/ms/lang.php +lib/plugins/popularity/lang/vi/lang.php +lib/plugins/revert/lang/af/lang.php +lib/plugins/revert/lang/hi/lang.php +lib/plugins/revert/lang/hr/lang.php +lib/plugins/revert/lang/id-ni/lang.php +lib/plugins/revert/lang/id/lang.php +lib/plugins/revert/lang/kk/lang.php +lib/plugins/revert/lang/lb/lang.php +lib/plugins/revert/lang/lt/lang.php +lib/plugins/revert/lang/mk/lang.php +lib/plugins/revert/lang/ms/lang.php +lib/plugins/revert/lang/vi/lang.php +lib/plugins/usermanager/lang/hi/lang.php +lib/plugins/usermanager/lang/hr/lang.php +lib/plugins/usermanager/lang/id-ni/lang.php +lib/plugins/usermanager/lang/lb/lang.php +lib/plugins/usermanager/lang/ms/lang.php +lib/plugins/usermanager/lang/vi/lang.php + # removed in 2013-11-18 lib/images/arrow_down.gif lib/images/arrow_up.gif diff --git a/sources/data/pages/wiki/dokuwiki.txt b/sources/data/pages/wiki/dokuwiki.txt index 808aea6..0e08fdc 100644 --- a/sources/data/pages/wiki/dokuwiki.txt +++ b/sources/data/pages/wiki/dokuwiki.txt @@ -6,7 +6,7 @@ Read the [[doku>manual|DokuWiki Manual]] to unleash the full power of DokuWiki. ===== Download ===== -DokuWiki is available at http://www.splitbrain.org/go/dokuwiki +DokuWiki is available at http://download.dokuwiki.org/ ===== Read More ===== @@ -24,7 +24,7 @@ All documentation and additional information besides the [[syntax|syntax descrip **Installing DokuWiki** * [[doku>requirements|System Requirements]] - * [[http://www.splitbrain.org/go/dokuwiki|Download DokuWiki]] :!: + * [[http://download.dokuwiki.org/|Download DokuWiki]] :!: * [[doku>changes|Change Log]] * [[doku>Install|How to install or upgrade]] :!: * [[doku>config|Configuration]] @@ -50,7 +50,7 @@ All documentation and additional information besides the [[syntax|syntax descrip * [[doku>mailinglist|Join the mailing list]] * [[http://forum.dokuwiki.org|Check out the user forum]] * [[doku>irc|Talk to other users in the IRC channel]] - * [[http://bugs.splitbrain.org/index.php?project=1|Submit bugs and feature wishes]] + * [[https://github.com/splitbrain/dokuwiki/issues|Submit bugs and feature wishes]] * [[http://www.wikimatrix.org/forum/viewforum.php?id=10|Share your experiences in the WikiMatrix forum]] * [[doku>thanks|Some humble thanks]] diff --git a/sources/data/pages/wiki/syntax.txt b/sources/data/pages/wiki/syntax.txt index f2c2864..86ad815 100644 --- a/sources/data/pages/wiki/syntax.txt +++ b/sources/data/pages/wiki/syntax.txt @@ -121,9 +121,9 @@ By using four or more dashes, you can make a horizontal line: ---- -===== Images and Other Files ===== +===== Media Files ===== -You can include external and internal [[doku>images]] with curly brackets. Optionally you can specify the size of them. +You can include external and internal [[doku>images|images, videos and audio files]] with curly brackets. Optionally you can specify the size of them. Real size: {{wiki:dokuwiki-128.png}} @@ -157,10 +157,31 @@ Of course, you can add a title (displayed as a tooltip by most browsers), too. {{ wiki:dokuwiki-128.png |This is the caption}} -If you specify a filename (external or internal) that is not an image (''gif, jpeg, png''), then it will be displayed as a link instead. - For linking an image to another page see [[#Image Links]] above. +==== Supported Media Formats ==== + +DokuWiki can embed the following media formats directly. + +| Image | ''gif'', ''jpg'', ''png'' | +| Video | ''webm'', ''ogv'', ''mp4'' | +| Audio | ''ogg'', ''mp3'', ''wav'' | +| Flash | ''swf'' | + +If you specify a filename that is not a supported media format, then it will be displayed as a link instead. + +==== Fallback Formats ==== + +Unfortunately not all browsers understand all video and audio formats. To mitigate the problem, you can upload your file in different formats for maximum browser compatibility. + +For example consider this embedded mp4 video: + + {{video.mp4|A funny video}} + +When you upload a ''video.webm'' and ''video.ogv'' next to the referenced ''video.mp4'', DokuWiki will automatically add them as alternatives so that one of the three files is understood by your browser. + +Additionally DokuWiki supports a "poster" image which will be shown before the video has started. That image needs to have the same filename as the video and be either a jpg or png file. In the example above a ''video.jpg'' file would work. + ===== Lists ===== Dokuwiki supports ordered and unordered lists. To create a list item, indent your text by two spaces and use a ''*'' for unordered lists or a ''-'' for ordered ones. @@ -427,25 +448,25 @@ PHP example: -echo 'A logo generated by PHP:'; -echo 'PHP Logo !'; -echo '(generated inline HTML)'; +echo 'The PHP version: '; +echo phpversion(); +echo ' (generated inline HTML)'; echo ''; -echo ''; +echo ''; echo '
The same, but inside a block level element:PHP Logo !'.phpversion().'
';
-echo 'A logo generated by PHP:'; -echo 'PHP Logo !'; -echo '(inline HTML)'; +echo 'The PHP version: '; +echo phpversion(); +echo ' (inline HTML)'; echo ''; -echo ''; +echo ''; echo '
The same, but inside a block level element:PHP Logo !'.phpversion().'
';
diff --git a/sources/doku.php b/sources/doku.php index d861aa4..afaf79c 100644 --- a/sources/doku.php +++ b/sources/doku.php @@ -9,7 +9,7 @@ */ // update message version -$updateVersion = 43; +$updateVersion = 44; // xdebug_start_profiling(); diff --git a/sources/feed.php b/sources/feed.php index bdce666..40f9af6 100644 --- a/sources/feed.php +++ b/sources/feed.php @@ -15,13 +15,19 @@ require_once(DOKU_INC.'inc/init.php'); //close session session_write_close(); +//feed disabled? +if(!actionOK('rss')) { + http_status(404); + echo 'RSS feed is disabled.'; + exit; +} + // get params $opt = rss_parseOptions(); // the feed is dynamic - we need a cache for each combo // (but most people just use the default feed so it's still effective) -$cache = getCacheName(join('', array_values($opt)).$_SERVER['REMOTE_USER'], '.feed'); -$key = join('', array_values($opt)).$_SERVER['REMOTE_USER']; +$key = join('', array_values($opt)).'$'.$_SERVER['REMOTE_USER'].'$'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT']; $cache = new cache($key, '.feed'); // prepare cache depends @@ -135,12 +141,10 @@ function rss_parseOptions() { $opt['guardmail'] = ($conf['mailguard'] != '' && $conf['mailguard'] != 'none'); - $type = valid_input_set( - 'type', array( - 'rss', 'rss2', 'atom', 'atom1', 'rss1', - 'default' => $conf['rss_type'] - ), - $_REQUEST + $type = $INPUT->valid( + 'type', + array( 'rss', 'rss2', 'atom', 'atom1', 'rss1'), + $conf['rss_type'] ); switch($type) { case 'rss': @@ -182,7 +186,7 @@ function rss_parseOptions() { function rss_buildItems(&$rss, &$data, $opt) { global $conf; global $lang; - /* @var auth_basic $auth */ + /* @var DokuWiki_Auth_Plugin $auth */ global $auth; $eventData = array( @@ -293,18 +297,19 @@ function rss_buildItems(&$rss, &$data, $opt) { case 'diff': case 'htmldiff': if($ditem['media']) { - $revs = getRevisions($id, 0, 1, 8192, true); + $medialog = new MediaChangeLog($id); + $revs = $medialog->getRevisions(0, 1); $rev = $revs[0]; $src_r = ''; $src_l = ''; if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)), 300)) { - $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id)); - $src_r = ml($id, $more); + $more = 'w='.$size[0].'&h='.$size[1].'&t='.@filemtime(mediaFN($id)); + $src_r = ml($id, $more, true, '&', true); } if($rev && $size = media_image_preview_size($id, $rev, new JpegMeta(mediaFN($id, $rev)), 300)) { $more = 'rev='.$rev.'&w='.$size[0].'&h='.$size[1]; - $src_l = ml($id, $more); + $src_l = ml($id, $more, true, '&', true); } $content = ''; if($src_r) { @@ -318,7 +323,8 @@ function rss_buildItems(&$rss, &$data, $opt) { } else { require_once(DOKU_INC.'inc/DifferenceEngine.php'); - $revs = getRevisions($id, 0, 1); + $pagelog = new PageChangeLog($id); + $revs = $pagelog->getRevisions(0, 1); $rev = $revs[0]; if($rev) { @@ -347,8 +353,8 @@ function rss_buildItems(&$rss, &$data, $opt) { case 'html': if($ditem['media']) { if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) { - $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id)); - $src = ml($id, $more); + $more = 'w='.$size[0].'&h='.$size[1].'&t='.@filemtime(mediaFN($id)); + $src = ml($id, $more, true, '&', true); $content = ''.$id.''; } else { $content = ''; @@ -378,8 +384,8 @@ function rss_buildItems(&$rss, &$data, $opt) { default: if($ditem['media']) { if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) { - $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id)); - $src = ml($id, $more); + $more = 'w='.$size[0].'&h='.$size[1].'&t='.@filemtime(mediaFN($id)); + $src = ml($id, $more, true, '&', true); $content = ''.$id.''; } else { $content = ''; diff --git a/sources/inc/EmailAddressValidator.php b/sources/inc/EmailAddressValidator.php index bb4ef0c..fd6f327 100644 --- a/sources/inc/EmailAddressValidator.php +++ b/sources/inc/EmailAddressValidator.php @@ -15,8 +15,8 @@ class EmailAddressValidator { /** * Check email address validity - * @param strEmailAddress Email address to be checked - * @return True if email is valid, false if not + * @param string $strEmailAddress Email address to be checked + * @return bool True if email is valid, false if not */ public function check_email_address($strEmailAddress) { @@ -82,8 +82,8 @@ class EmailAddressValidator { /** * Checks email section before "@" symbol for validity - * @param strLocalPortion Text to be checked - * @return True if local portion is valid, false if not + * @param string $strLocalPortion Text to be checked + * @return bool True if local portion is valid, false if not */ protected function check_local_portion($strLocalPortion) { // Local portion can only be from 1 to 64 characters, inclusive. @@ -113,8 +113,8 @@ class EmailAddressValidator { /** * Checks email section after "@" symbol for validity - * @param strDomainPortion Text to be checked - * @return True if domain portion is valid, false if not + * @param string $strDomainPortion Text to be checked + * @return bool True if domain portion is valid, false if not */ protected function check_domain_portion($strDomainPortion) { // Total domain can only be from 1 to 255 characters, inclusive @@ -172,10 +172,10 @@ class EmailAddressValidator { /** * Check given text length is between defined bounds - * @param strText Text to be checked - * @param intMinimum Minimum acceptable length - * @param intMaximum Maximum acceptable length - * @return True if string is within bounds (inclusive), false if not + * @param string $strText Text to be checked + * @param int $intMinimum Minimum acceptable length + * @param int $intMaximum Maximum acceptable length + * @return bool True if string is within bounds (inclusive), false if not */ protected function check_text_length($strText, $intMinimum, $intMaximum) { // Minimum and maximum are both inclusive diff --git a/sources/inc/HTTPClient.php b/sources/inc/HTTPClient.php index 96954fb..f8b8367 100644 --- a/sources/inc/HTTPClient.php +++ b/sources/inc/HTTPClient.php @@ -254,7 +254,13 @@ class HTTPClient { } // add SSL stream prefix if needed - needs SSL support in PHP - if($port == 443 || $this->proxy_ssl) $server = 'ssl://'.$server; + if($port == 443 || $this->proxy_ssl) { + if(!in_array('ssl', stream_get_transports())) { + $this->status = -200; + $this->error = 'This PHP version does not support SSL - cannot connect to server'; + } + $server = 'ssl://'.$server; + } // prepare headers $headers = $this->headers; @@ -304,11 +310,18 @@ class HTTPClient { } // try establish a CONNECT tunnel for SSL - if($this->_ssltunnel($socket, $request_url)){ - // no keep alive for tunnels - $this->keep_alive = false; - // tunnel is authed already - if(isset($headers['Proxy-Authentication'])) unset($headers['Proxy-Authentication']); + try { + if($this->_ssltunnel($socket, $request_url)){ + // no keep alive for tunnels + $this->keep_alive = false; + // tunnel is authed already + if(isset($headers['Proxy-Authentication'])) unset($headers['Proxy-Authentication']); + } + } catch (HTTPClientException $e) { + $this->status = $e->getCode(); + $this->error = $e->getMessage(); + fclose($socket); + return false; } // keep alive? @@ -363,7 +376,7 @@ class HTTPClient { // get Status if (!preg_match('/^HTTP\/(\d\.\d)\s*(\d+).*?\n/', $r_headers, $m)) - throw new HTTPClientException('Server returned bad answer'); + throw new HTTPClientException('Server returned bad answer '.$r_headers); $this->status = $m[2]; @@ -526,6 +539,7 @@ class HTTPClient { * * @param resource &$socket * @param string &$requesturl + * @throws HTTPClientException when a tunnel is needed but could not be established * @return bool true if a tunnel was established */ function _ssltunnel(&$socket, &$requesturl){ @@ -538,7 +552,7 @@ class HTTPClient { $request = "CONNECT {$requestinfo['host']}:{$requestinfo['port']} HTTP/1.0".HTTP_NL; $request .= "Host: {$requestinfo['host']}".HTTP_NL; if($this->proxy_user) { - 'Proxy-Authorization Basic '.base64_encode($this->proxy_user.':'.$this->proxy_pass).HTTP_NL; + $request .= 'Proxy-Authorization: Basic '.base64_encode($this->proxy_user.':'.$this->proxy_pass).HTTP_NL; } $request .= HTTP_NL; @@ -559,7 +573,8 @@ class HTTPClient { return true; } } - return false; + + throw new HTTPClientException('Failed to establish secure proxy connection', -150); } /** diff --git a/sources/inc/Input.class.php b/sources/inc/Input.class.php index 7434d2b..e7eef1c 100644 --- a/sources/inc/Input.class.php +++ b/sources/inc/Input.class.php @@ -15,6 +15,8 @@ class Input { public $post; /** @var GetInput Access $_GET parameters */ public $get; + /** @var ServerInput Access $_SERVER parameters */ + public $server; protected $access; @@ -25,6 +27,7 @@ class Input { $this->access = &$_REQUEST; $this->post = new PostInput(); $this->get = new GetInput(); + $this->server = new ServerInput(); } /** @@ -140,6 +143,26 @@ class Input { return (string) $this->access[$name]; } + /** + * Access a request parameter and make sure it is has a valid value + * + * Please note that comparisons to the valid values are not done typesafe (request vars + * are always strings) however the function will return the correct type from the $valids + * array when an match was found. + * + * @param string $name Parameter name + * @param array $valids Array of valid values + * @param mixed $default Default to return if parameter isn't set or not valid + * @return null|mixed + */ + public function valid($name, $valids, $default = null) { + if(!isset($this->access[$name])) return $default; + if(is_array($this->access[$name])) return $default; // we don't allow arrays + $found = array_search($this->access[$name], $valids); + if($found !== false) return $valids[$found]; // return the valid value for type safety + return $default; + } + /** * Access a request parameter as bool * @@ -260,3 +283,18 @@ class GetInput extends Input { $_REQUEST[$name] = $value; } } + +/** + * Internal class used for $_SERVER access in Input class + */ +class ServerInput extends Input { + protected $access; + + /** + * Initialize the $access array, remove subclass members + */ + function __construct() { + $this->access = &$_SERVER; + } + +} diff --git a/sources/inc/JpegMeta.php b/sources/inc/JpegMeta.php index cb17727..a35ec3e 100644 --- a/sources/inc/JpegMeta.php +++ b/sources/inc/JpegMeta.php @@ -2929,7 +2929,8 @@ class JpegMeta { $length = strlen($data) - $pos; } - return substr($data, $pos, $length); + $rv = substr($data, $pos, $length); + return $rv; } /*************************************************************/ diff --git a/sources/inc/Mailer.class.php b/sources/inc/Mailer.class.php index 2ac2c1d..e90b45f 100644 --- a/sources/inc/Mailer.class.php +++ b/sources/inc/Mailer.class.php @@ -39,6 +39,8 @@ class Mailer { */ public function __construct() { global $conf; + /* @var Input $INPUT */ + global $INPUT; $server = parse_url(DOKU_URL, PHP_URL_HOST); if(strpos($server,'.') === false) $server = $server.'.localhost'; @@ -53,7 +55,7 @@ class Mailer { // add some default headers for mailfiltering FS#2247 $this->setHeader('X-Mailer', 'DokuWiki'); - $this->setHeader('X-DokuWiki-User', $_SERVER['REMOTE_USER']); + $this->setHeader('X-DokuWiki-User', $INPUT->server->str('REMOTE_USER')); $this->setHeader('X-DokuWiki-Title', $conf['title']); $this->setHeader('X-DokuWiki-Server', $server); $this->setHeader('X-Auto-Response-Suppress', 'OOF'); @@ -181,6 +183,9 @@ class Mailer { public function setBody($text, $textrep = null, $htmlrep = null, $html = null, $wrap = true) { global $INFO; global $conf; + /* @var Input $INPUT */ + global $INPUT; + $htmlrep = (array)$htmlrep; $textrep = (array)$textrep; @@ -218,24 +223,24 @@ class Mailer { $cip = gethostsbyaddrs($ip); $trep = array( 'DATE' => dformat(), - 'BROWSER' => $_SERVER['HTTP_USER_AGENT'], + 'BROWSER' => $INPUT->server->str('HTTP_USER_AGENT'), 'IPADDRESS' => $ip, 'HOSTNAME' => $cip, 'TITLE' => $conf['title'], 'DOKUWIKIURL' => DOKU_URL, - 'USER' => $_SERVER['REMOTE_USER'], + 'USER' => $INPUT->server->str('REMOTE_USER'), 'NAME' => $INFO['userinfo']['name'], 'MAIL' => $INFO['userinfo']['mail'], ); $trep = array_merge($trep, (array)$textrep); $hrep = array( 'DATE' => ''.hsc(dformat()).'', - 'BROWSER' => hsc($_SERVER['HTTP_USER_AGENT']), + 'BROWSER' => hsc($INPUT->server->str('HTTP_USER_AGENT')), 'IPADDRESS' => ''.hsc($ip).'', 'HOSTNAME' => ''.hsc($cip).'', 'TITLE' => hsc($conf['title']), 'DOKUWIKIURL' => ''.DOKU_URL.'', - 'USER' => hsc($_SERVER['REMOTE_USER']), + 'USER' => hsc($INPUT->server->str('REMOTE_USER')), 'NAME' => hsc($INFO['userinfo']['name']), 'MAIL' => ''. hsc($INFO['userinfo']['mail']).'', @@ -277,7 +282,7 @@ class Mailer { /** * Add the To: recipients * - * @see setAddress + * @see cleanAddress * @param string|array $address Multiple adresses separated by commas or as array */ public function to($address) { @@ -287,7 +292,7 @@ class Mailer { /** * Add the Cc: recipients * - * @see setAddress + * @see cleanAddress * @param string|array $address Multiple adresses separated by commas or as array */ public function cc($address) { @@ -297,7 +302,7 @@ class Mailer { /** * Add the Bcc: recipients * - * @see setAddress + * @see cleanAddress * @param string|array $address Multiple adresses separated by commas or as array */ public function bcc($address) { @@ -310,7 +315,7 @@ class Mailer { * This is set to $conf['mailfrom'] when not specified so you shouldn't need * to call this function * - * @see setAddress + * @see cleanAddress * @param string $address from address */ public function from($address) { @@ -333,9 +338,9 @@ class Mailer { * for headers. Addresses may not contain Non-ASCII data! * * Example: - * setAddress("föö , me@somewhere.com","TBcc"); + * cc("föö , me@somewhere.com","TBcc"); * - * @param string|array $address Multiple adresses separated by commas or as array + * @param string|array $addresses Multiple adresses separated by commas or as array * @return bool|string the prepared header (can contain multiple lines) */ public function cleanAddress($addresses) { @@ -522,7 +527,7 @@ class Mailer { // clean up addresses if(empty($this->headers['From'])) $this->from($conf['mailfrom']); - $addrs = array('To', 'From', 'Cc', 'Bcc'); + $addrs = array('To', 'From', 'Cc', 'Bcc', 'Reply-To', 'Sender'); foreach($addrs as $addr) { if(isset($this->headers[$addr])) { $this->headers[$addr] = $this->cleanAddress($this->headers[$addr]); diff --git a/sources/inc/RemoteAPICore.php b/sources/inc/RemoteAPICore.php index 2eb8ea4..ffa03ee 100644 --- a/sources/inc/RemoteAPICore.php +++ b/sources/inc/RemoteAPICore.php @@ -3,7 +3,7 @@ /** * Increased whenever the API is changed */ -define('DOKU_API_VERSION', 8); +define('DOKU_API_VERSION', 9); class RemoteAPICore { @@ -24,6 +24,10 @@ class RemoteAPICore { 'return' => 'int', 'doc' => 'Tries to login with the given credentials and sets auth cookies.', 'public' => '1' + ), 'dokuwiki.logoff' => array( + 'args' => array(), + 'return' => 'int', + 'doc' => 'Tries to logoff by expiring auth cookies and the associated PHP session.' ), 'dokuwiki.getPagelist' => array( 'args' => array('string', 'array'), 'return' => 'array', @@ -374,7 +378,8 @@ class RemoteAPICore { throw new RemoteException('The requested page does not exist', 121); } - $info = getRevisionInfo($id, $time, 1024); + $pagelog = new PageChangeLog($id, 1024); + $info = $pagelog->getRevisionInfo($time); $data = array( 'name' => $id, @@ -646,11 +651,12 @@ class RemoteAPICore { throw new RemoteException('Empty page ID', 131); } - $revisions = getRevisions($id, $first, $conf['recent']+1); + $pagelog = new PageChangeLog($id); + $revisions = $pagelog->getRevisions($first, $conf['recent']+1); if(count($revisions)==0 && $first!=0) { $first=0; - $revisions = getRevisions($id, $first, $conf['recent']+1); + $revisions = $pagelog->getRevisions($first, $conf['recent']+1); } if(count($revisions)>0 && $first==0) { @@ -672,7 +678,8 @@ class RemoteAPICore { // case this can lead to less pages being returned than // specified via $conf['recent'] if($time){ - $info = getRevisionInfo($id, $time, 1024); + $pagelog->setChunkSize(1024); + $info = $pagelog->getRevisionInfo($time); if(!empty($info)) { $data['user'] = $info['user']; $data['ip'] = $info['ip']; @@ -767,6 +774,17 @@ class RemoteAPICore { return $ok; } + function logoff(){ + global $conf; + global $auth; + if(!$conf['useacl']) return 0; + if(!$auth) return 0; + + auth_logoff(); + + return 1; + } + private function resolvePageId($id) { $id = cleanID($id); if(empty($id)) { diff --git a/sources/inc/Sitemapper.php b/sources/inc/Sitemapper.php index bf89a31..6332746 100644 --- a/sources/inc/Sitemapper.php +++ b/sources/inc/Sitemapper.php @@ -131,9 +131,9 @@ class Sitemapper { $encoded_sitemap_url = urlencode(wl('', array('do' => 'sitemap'), true, '&')); $ping_urls = array( - 'google' => 'http://www.google.com/webmasters/sitemaps/ping?sitemap='.$encoded_sitemap_url, - 'yahoo' => 'http://search.yahooapis.com/SiteExplorerService/V1/updateNotification?appid=dokuwiki&url='.$encoded_sitemap_url, + 'google' => 'http://www.google.com/webmasters/sitemaps/ping?sitemap='.$encoded_sitemap_url, 'microsoft' => 'http://www.bing.com/webmaster/ping.aspx?siteMap='.$encoded_sitemap_url, + 'yandex' => 'http://blogs.yandex.ru/pings/?status=success&url='.$encoded_sitemap_url ); $data = array('ping_urls' => $ping_urls, diff --git a/sources/inc/Tar.class.php b/sources/inc/Tar.class.php index bc87d7d..903f7f3 100644 --- a/sources/inc/Tar.class.php +++ b/sources/inc/Tar.class.php @@ -114,7 +114,7 @@ class Tar { $header = $this->parseHeader($read); if(!is_array($header)) continue; - $this->skipbytes(ceil($header['size'] / 512) * 512, 1); + $this->skipbytes(ceil($header['size'] / 512) * 512); $result[] = $header; } diff --git a/sources/inc/actions.php b/sources/inc/actions.php index 50cbe36..ef09a0d 100644 --- a/sources/inc/actions.php +++ b/sources/inc/actions.php @@ -20,6 +20,7 @@ function act_dispatch(){ global $ID; global $INFO; global $QUERY; + /* @var Input $INPUT */ global $INPUT; global $lang; global $conf; @@ -94,7 +95,7 @@ function act_dispatch(){ // user profile changes if (in_array($ACT, array('profile','profile_delete'))) { - if(!$_SERVER['REMOTE_USER']) { + if(!$INPUT->server->str('REMOTE_USER')) { $ACT = 'login'; } else { switch ($ACT) { @@ -190,7 +191,7 @@ function act_dispatch(){ unset($evt); // when action 'show', the intial not 'show' and POST, do a redirect - if($ACT == 'show' && $preact != 'show' && strtolower($_SERVER['REQUEST_METHOD']) == 'post'){ + if($ACT == 'show' && $preact != 'show' && strtolower($INPUT->server->str('REQUEST_METHOD')) == 'post'){ act_redirect($ID,$preact); } @@ -414,6 +415,8 @@ function act_revert($act){ global $ID; global $REV; global $lang; + /* @var Input $INPUT */ + global $INPUT; // FIXME $INFO['writable'] currently refers to the attic version // global $INFO; // if (!$INFO['writable']) { @@ -445,7 +448,7 @@ function act_revert($act){ session_write_close(); // when done, show current page - $_SERVER['REQUEST_METHOD'] = 'post'; //should force a redirect + $INPUT->server->set('REQUEST_METHOD','post'); //should force a redirect $REV = ''; return 'show'; } @@ -493,17 +496,20 @@ function act_redirect_execute($opts){ function act_auth($act){ global $ID; global $INFO; + /* @var Input $INPUT */ + global $INPUT; //already logged in? - if(isset($_SERVER['REMOTE_USER']) && $act=='login'){ + if($INPUT->server->has('REMOTE_USER') && $act=='login'){ return 'show'; } //handle logout if($act=='logout'){ $lockedby = checklock($ID); //page still locked? - if($lockedby == $_SERVER['REMOTE_USER']) + if($lockedby == $INPUT->server->str('REMOTE_USER')){ unlock($ID); //try to unlock + } // do the logout stuff auth_logoff(); @@ -697,7 +703,7 @@ function act_sitemap($act) { // Send file //use x-sendfile header to pass the delivery to compatible webservers - if (http_sendfile($sitemap)) exit; + http_sendfile($sitemap); readfile($sitemap); exit; @@ -719,10 +725,11 @@ function act_subscription($act){ global $lang; global $INFO; global $ID; + /* @var Input $INPUT */ global $INPUT; // subcriptions work for logged in users only - if(!$_SERVER['REMOTE_USER']) return 'show'; + if(!$INPUT->server->str('REMOTE_USER')) return 'show'; // get and preprocess data. $params = array(); @@ -733,7 +740,7 @@ function act_subscription($act){ } // any action given? if not just return and show the subscription page - if(!$params['action'] || !checkSecurityToken()) return $act; + if(empty($params['action']) || !checkSecurityToken()) return $act; // Handle POST data, may throw exception. trigger_event('ACTION_HANDLE_SUBSCRIBE', $params, 'subscription_handle_post'); @@ -745,9 +752,9 @@ function act_subscription($act){ // Perform action. $sub = new Subscription(); if($action == 'unsubscribe'){ - $ok = $sub->remove($target, $_SERVER['REMOTE_USER'], $style); + $ok = $sub->remove($target, $INPUT->server->str('REMOTE_USER'), $style); }else{ - $ok = $sub->add($target, $_SERVER['REMOTE_USER'], $style); + $ok = $sub->add($target, $INPUT->server->str('REMOTE_USER'), $style); } if($ok) { @@ -776,6 +783,8 @@ function act_subscription($act){ function subscription_handle_post(&$params) { global $INFO; global $lang; + /* @var Input $INPUT */ + global $INPUT; // Get and validate parameters. if (!isset($params['target'])) { @@ -806,7 +815,7 @@ function subscription_handle_post(&$params) { } if ($is === false) { throw new Exception(sprintf($lang['subscr_not_subscribed'], - $_SERVER['REMOTE_USER'], + $INPUT->server->str('REMOTE_USER'), prettyprint_id($target))); } // subscription_set deletes a subscription if style = null. diff --git a/sources/inc/auth.php b/sources/inc/auth.php index b793f5d..2bdc3eb 100644 --- a/sources/inc/auth.php +++ b/sources/inc/auth.php @@ -131,6 +131,8 @@ function auth_setup() { function auth_loadACL() { global $config_cascade; global $USERINFO; + /* @var Input $INPUT */ + global $INPUT; if(!is_readable($config_cascade['acl']['default'])) return array(); @@ -145,10 +147,10 @@ function auth_loadACL() { // substitute user wildcard first (its 1:1) if(strstr($line, '%USER%')){ // if user is not logged in, this ACL line is meaningless - skip it - if (!isset($_SERVER['REMOTE_USER'])) continue; + if (!$INPUT->server->has('REMOTE_USER')) continue; - $id = str_replace('%USER%',cleanID($_SERVER['REMOTE_USER']),$id); - $rest = str_replace('%USER%',auth_nameencode($_SERVER['REMOTE_USER']),$rest); + $id = str_replace('%USER%',cleanID($INPUT->server->str('REMOTE_USER')),$id); + $rest = str_replace('%USER%',auth_nameencode($INPUT->server->str('REMOTE_USER')),$rest); } // substitute group wildcard (its 1:m) @@ -217,6 +219,8 @@ function auth_login($user, $pass, $sticky = false, $silent = false) { global $lang; /* @var DokuWiki_Auth_Plugin $auth */ global $auth; + /* @var Input $INPUT */ + global $INPUT; $sticky ? $sticky = true : $sticky = false; //sanity check @@ -226,7 +230,7 @@ function auth_login($user, $pass, $sticky = false, $silent = false) { //usual login if($auth->checkPass($user, $pass)) { // make logininfo globally available - $_SERVER['REMOTE_USER'] = $user; + $INPUT->server->set('REMOTE_USER', $user); $secret = auth_cookiesalt(!$sticky, true); //bind non-sticky to session auth_setCookie($user, auth_encrypt($pass, $secret), $sticky); return true; @@ -253,7 +257,7 @@ function auth_login($user, $pass, $sticky = false, $silent = false) { ) { // he has session, cookie and browser right - let him in - $_SERVER['REMOTE_USER'] = $user; + $INPUT->server->set('REMOTE_USER', $user); $USERINFO = $session['info']; //FIXME move all references to session return true; } @@ -288,7 +292,10 @@ function auth_validateToken($token) { } // still here? trust the session data global $USERINFO; - $_SERVER['REMOTE_USER'] = $_SESSION[DOKU_COOKIE]['auth']['user']; + /* @var Input $INPUT */ + global $INPUT; + + $INPUT->server->set('REMOTE_USER',$_SESSION[DOKU_COOKIE]['auth']['user']); $USERINFO = $_SESSION[DOKU_COOKIE]['auth']['info']; return true; } @@ -321,11 +328,14 @@ function auth_createToken() { * @return string a MD5 sum of various browser headers */ function auth_browseruid() { + /* @var Input $INPUT */ + global $INPUT; + $ip = clientIP(true); $uid = ''; - $uid .= $_SERVER['HTTP_USER_AGENT']; - $uid .= $_SERVER['HTTP_ACCEPT_ENCODING']; - $uid .= $_SERVER['HTTP_ACCEPT_CHARSET']; + $uid .= $INPUT->server->str('HTTP_USER_AGENT'); + $uid .= $INPUT->server->str('HTTP_ACCEPT_ENCODING'); + $uid .= $INPUT->server->str('HTTP_ACCEPT_CHARSET'); $uid .= substr($ip, 0, strpos($ip, '.')); $uid = strtolower($uid); return md5($uid); @@ -511,6 +521,8 @@ function auth_logoff($keepbc = false) { global $USERINFO; /* @var DokuWiki_Auth_Plugin $auth */ global $auth; + /* @var Input $INPUT */ + global $INPUT; // make sure the session is writable (it usually is) @session_start(); @@ -523,16 +535,11 @@ function auth_logoff($keepbc = false) { unset($_SESSION[DOKU_COOKIE]['auth']['info']); if(!$keepbc && isset($_SESSION[DOKU_COOKIE]['bc'])) unset($_SESSION[DOKU_COOKIE]['bc']); - if(isset($_SERVER['REMOTE_USER'])) - unset($_SERVER['REMOTE_USER']); + $INPUT->server->remove('REMOTE_USER'); $USERINFO = null; //FIXME $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir']; - if(version_compare(PHP_VERSION, '5.2.0', '>')) { - setcookie(DOKU_COOKIE, '', time() - 600000, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true); - } else { - setcookie(DOKU_COOKIE, '', time() - 600000, $cookieDir, '', ($conf['securecookie'] && is_ssl())); - } + setcookie(DOKU_COOKIE, '', time() - 600000, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true); if($auth) $auth->logOff(); } @@ -557,13 +564,16 @@ function auth_ismanager($user = null, $groups = null, $adminonly = false) { global $USERINFO; /* @var DokuWiki_Auth_Plugin $auth */ global $auth; + /* @var Input $INPUT */ + global $INPUT; + if(!$auth) return false; if(is_null($user)) { - if(!isset($_SERVER['REMOTE_USER'])) { + if(!$INPUT->server->has('REMOTE_USER')) { return false; } else { - $user = $_SERVER['REMOTE_USER']; + $user = $INPUT->server->str('REMOTE_USER'); } } if(is_null($groups)) { @@ -655,23 +665,47 @@ function auth_isMember($memberlist, $user, array $groups) { function auth_quickaclcheck($id) { global $conf; global $USERINFO; + /* @var Input $INPUT */ + global $INPUT; # if no ACL is used always return upload rights if(!$conf['useacl']) return AUTH_UPLOAD; - return auth_aclcheck($id, $_SERVER['REMOTE_USER'], $USERINFO['grps']); + return auth_aclcheck($id, $INPUT->server->str('REMOTE_USER'), $USERINFO['grps']); } /** - * Returns the maximum rights a user has for - * the given ID or its namespace + * Returns the maximum rights a user has for the given ID or its namespace * * @author Andreas Gohr - * + * @triggers AUTH_ACL_CHECK * @param string $id page ID (needs to be resolved and cleaned) * @param string $user Username * @param array|null $groups Array of groups the user is in * @return int permission level */ function auth_aclcheck($id, $user, $groups) { + $data = array( + 'id' => $id, + 'user' => $user, + 'groups' => $groups + ); + + return trigger_event('AUTH_ACL_CHECK', $data, 'auth_aclcheck_cb'); +} + +/** + * default ACL check method + * + * DO NOT CALL DIRECTLY, use auth_aclcheck() instead + * + * @author Andreas Gohr + * @param array $data event data + * @return int permission level + */ +function auth_aclcheck_cb($data) { + $id =& $data['id']; + $user =& $data['user']; + $groups =& $data['groups']; + global $conf; global $AUTH_ACL; /* @var DokuWiki_Auth_Plugin $auth */ @@ -823,6 +857,12 @@ function auth_nameencode($name, $skip_group = false) { return $cache[$name][$skip_group]; } +/** + * callback encodes the matches + * + * @param array $matches first complete match, next matching subpatterms + * @return string + */ function auth_nameencode_callback($matches) { return '%'.dechex(ord(substr($matches[1],-1))); } @@ -1034,18 +1074,18 @@ function updateprofile() { } if($conf['profileconfirm']) { - if(!$auth->checkPass($_SERVER['REMOTE_USER'], $INPUT->post->str('oldpass'))) { + if(!$auth->checkPass($INPUT->server->str('REMOTE_USER'), $INPUT->post->str('oldpass'))) { msg($lang['badpassconfirm'], -1); return false; } } - if($result = $auth->triggerUserMod('modify', array($_SERVER['REMOTE_USER'], $changes))) { + if($result = $auth->triggerUserMod('modify', array($INPUT->server->str('REMOTE_USER'), $changes))) { // update cookie and session with the changed data if($changes['pass']) { list( /*user*/, $sticky, /*pass*/) = auth_getCookie(); $pass = auth_encrypt($changes['pass'], auth_cookiesalt(!$sticky, true)); - auth_setCookie($_SERVER['REMOTE_USER'], $pass, (bool) $sticky); + auth_setCookie($INPUT->server->str('REMOTE_USER'), $pass, (bool) $sticky); } return true; } @@ -1053,6 +1093,11 @@ function updateprofile() { return false; } +/** + * Delete the current logged-in user + * + * @return bool true on success, false on any error + */ function auth_deleteprofile(){ global $conf; global $lang; @@ -1076,13 +1121,13 @@ function auth_deleteprofile(){ } if($conf['profileconfirm']) { - if(!$auth->checkPass($_SERVER['REMOTE_USER'], $INPUT->post->str('oldpass'))) { + if(!$auth->checkPass($INPUT->server->str('REMOTE_USER'), $INPUT->post->str('oldpass'))) { msg($lang['badpassconfirm'], -1); return false; } } - $deleted[] = $_SERVER['REMOTE_USER']; + $deleted[] = $INPUT->server->str('REMOTE_USER'); if($auth->triggerUserMod('delete', array($deleted))) { // force and immediate logout including removing the sticky cookie auth_logoff(); @@ -1286,11 +1331,8 @@ function auth_setCookie($user, $pass, $sticky) { $cookie = base64_encode($user).'|'.((int) $sticky).'|'.base64_encode($pass); $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir']; $time = $sticky ? (time() + 60 * 60 * 24 * 365) : 0; //one year - if(version_compare(PHP_VERSION, '5.2.0', '>')) { - setcookie(DOKU_COOKIE, $cookie, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true); - } else { - setcookie(DOKU_COOKIE, $cookie, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl())); - } + setcookie(DOKU_COOKIE, $cookie, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true); + // set session $_SESSION[DOKU_COOKIE]['auth']['user'] = $user; $_SESSION[DOKU_COOKIE]['auth']['pass'] = sha1($pass); diff --git a/sources/inc/cache.php b/sources/inc/cache.php index 5eac949..7a66049 100644 --- a/sources/inc/cache.php +++ b/sources/inc/cache.php @@ -8,16 +8,25 @@ if(!defined('DOKU_INC')) die('meh.'); +/** + * Generic handling of caching + */ class cache { - var $key = ''; // primary identifier for this item - var $ext = ''; // file ext for cache data, secondary identifier for this item - var $cache = ''; // cache file name - var $depends = array(); // array containing cache dependency information, - // used by _useCache to determine cache validity + public $key = ''; // primary identifier for this item + public $ext = ''; // file ext for cache data, secondary identifier for this item + public $cache = ''; // cache file name + public $depends = array(); // array containing cache dependency information, + // used by _useCache to determine cache validity var $_event = ''; // event to be triggered during useCache + var $_time; + var $_nocache = false; // if set to true, cache will not be used or stored - function cache($key,$ext) { + /** + * @param string $key primary identifier + * @param string $ext file extension + */ + public function cache($key,$ext) { $this->key = $key; $this->ext = $ext; $this->cache = getCacheName($key,$ext); @@ -26,7 +35,7 @@ class cache { /** * public method to determine whether the cache can be used * - * to assist in cetralisation of event triggering and calculation of cache statistics, + * to assist in centralisation of event triggering and calculation of cache statistics, * don't override this function override _useCache() * * @param array $depends array of cache dependencies, support dependecies: @@ -36,7 +45,7 @@ class cache { * * @return bool true if cache can be used, false otherwise */ - function useCache($depends=array()) { + public function useCache($depends=array()) { $this->depends = $depends; $this->_addDependencies(); @@ -55,12 +64,15 @@ class cache { * age - expire cache if older than age (seconds) * files - expire cache if any file in this array was updated more recently than the cache * + * Note that this function needs to be public as it is used as callback for the event handler + * * can be overridden * * @return bool see useCache() */ - function _useCache() { + public function _useCache() { + if ($this->_nocache) return false; // caching turned off if (!empty($this->depends['purge'])) return false; // purge requested? if (!($this->_time = @filemtime($this->cache))) return false; // cache exists? @@ -83,7 +95,7 @@ class cache { * it should not remove any existing dependencies and * it should only overwrite a dependency when the new value is more stringent than the old */ - function _addDependencies() { + protected function _addDependencies() { global $INPUT; if ($INPUT->has('purge')) $this->depends['purge'] = true; // purge requested } @@ -94,7 +106,7 @@ class cache { * @param bool $clean true to clean line endings, false to leave line endings alone * @return string cache contents */ - function retrieveCache($clean=true) { + public function retrieveCache($clean=true) { return io_readFile($this->cache, $clean); } @@ -104,14 +116,16 @@ class cache { * @param string $data the data to be cached * @return bool true on success, false otherwise */ - function storeCache($data) { + public function storeCache($data) { + if ($this->_nocache) return false; + return io_savefile($this->cache, $data); } /** * remove any cached data associated with this cache instance */ - function removeCache() { + public function removeCache() { @unlink($this->cache); } @@ -122,7 +136,7 @@ class cache { * @param bool $success result of this cache use attempt * @return bool pass-thru $success value */ - function _stats($success) { + protected function _stats($success) { global $conf; static $stats = null; static $file; @@ -157,14 +171,23 @@ class cache { } } +/** + * Parser caching + */ class cache_parser extends cache { - var $file = ''; // source file for cache - var $mode = ''; // input mode (represents the processing the input file will undergo) + public $file = ''; // source file for cache + public $mode = ''; // input mode (represents the processing the input file will undergo) var $_event = 'PARSER_CACHE_USE'; - function cache_parser($id, $file, $mode) { + /** + * + * @param string $id page id + * @param string $file source file for cache + * @param string $mode input mode + */ + public function cache_parser($id, $file, $mode) { if ($id) $this->page = $id; $this->file = $file; $this->mode = $mode; @@ -172,24 +195,25 @@ class cache_parser extends cache { parent::cache($file.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],'.'.$mode); } - function _useCache() { + /** + * method contains cache use decision logic + * + * @return bool see useCache() + */ + public function _useCache() { if (!@file_exists($this->file)) return false; // source exists? return parent::_useCache(); } - function _addDependencies() { - global $conf, $config_cascade; - - $this->depends['age'] = isset($this->depends['age']) ? - min($this->depends['age'],$conf['cachetime']) : $conf['cachetime']; + protected function _addDependencies() { // parser cache file dependencies ... - $files = array($this->file, // ... source + $files = array($this->file, // ... source DOKU_INC.'inc/parser/parser.php', // ... parser DOKU_INC.'inc/parser/handler.php', // ... handler ); - $files = array_merge($files, getConfigFiles('main')); // ... wiki settings + $files = array_merge($files, getConfigFiles('main')); // ... wiki settings $this->depends['files'] = !empty($this->depends['files']) ? array_merge($files, $this->depends['files']) : $files; parent::_addDependencies(); @@ -197,8 +221,17 @@ class cache_parser extends cache { } +/** + * Caching of data of renderer + */ class cache_renderer extends cache_parser { - function _useCache() { + + /** + * method contains cache use decision logic + * + * @return bool see useCache() + */ + public function _useCache() { global $conf; if (!parent::_useCache()) return false; @@ -231,7 +264,19 @@ class cache_renderer extends cache_parser { return true; } - function _addDependencies() { + protected function _addDependencies() { + global $conf; + + // default renderer cache file 'age' is dependent on 'cachetime' setting, two special values: + // -1 : do not cache (should not be overridden) + // 0 : cache never expires (can be overridden) - no need to set depends['age'] + if ($conf['cachetime'] == -1) { + $this->_nocache = true; + return; + } elseif ($conf['cachetime'] > 0) { + $this->depends['age'] = isset($this->depends['age']) ? + min($this->depends['age'],$conf['cachetime']) : $conf['cachetime']; + } // renderer cache file dependencies ... $files = array( @@ -253,18 +298,39 @@ class cache_renderer extends cache_parser { } } +/** + * Caching of parser instructions + */ class cache_instructions extends cache_parser { - function cache_instructions($id, $file) { + /** + * @param string $id page id + * @param string $file source file for cache + */ + public function cache_instructions($id, $file) { parent::cache_parser($id, $file, 'i'); } - function retrieveCache($clean=true) { + /** + * retrieve the cached data + * + * @param bool $clean true to clean line endings, false to leave line endings alone + * @return string cache contents + */ + public function retrieveCache($clean=true) { $contents = io_readFile($this->cache, false); return !empty($contents) ? unserialize($contents) : array(); } - function storeCache($instructions) { + /** + * cache $instructions + * + * @param string $instructions the instruction to be cached + * @return bool true on success, false otherwise + */ + public function storeCache($instructions) { + if ($this->_nocache) return false; + return io_savefile($this->cache,serialize($instructions)); } } diff --git a/sources/inc/changelog.php b/sources/inc/changelog.php index 6ff1e0e..de06c96 100644 --- a/sources/inc/changelog.php +++ b/sources/inc/changelog.php @@ -52,6 +52,8 @@ function parseChangelogLine($line) { */ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null){ global $conf, $INFO; + /** @var Input $INPUT */ + global $INPUT; // check for special flags as keys if (!is_array($flags)) { $flags = array(); } @@ -65,7 +67,7 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr if(!$date) $date = time(); //use current time if none supplied $remote = (!$flagExternalEdit)?clientIP(true):'127.0.0.1'; - $user = (!$flagExternalEdit)?$_SERVER['REMOTE_USER']:''; + $user = (!$flagExternalEdit)?$INPUT->server->str('REMOTE_USER'):''; $strip = array("\t", "\n"); $logline = array( @@ -117,12 +119,14 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr */ function addMediaLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extra='', $flags=null){ global $conf; + /** @var Input $INPUT */ + global $INPUT; $id = cleanid($id); if(!$date) $date = time(); //use current time if none supplied $remote = clientIP(true); - $user = $_SERVER['REMOTE_USER']; + $user = $INPUT->server->str('REMOTE_USER'); $strip = array("\t", "\n"); $logline = array( @@ -333,6 +337,665 @@ function _handleRecent($line,$ns,$flags,&$seen){ return $recent; } +/** + * Class ChangeLog + * methods for handling of changelog of pages or media files + */ +abstract class ChangeLog { + + /** @var string */ + protected $id; + /** @var int */ + protected $chunk_size; + /** @var array */ + protected $cache; + + /** + * Constructor + * + * @param string $id page id + * @param int $chunk_size maximum block size read from file + */ + public function __construct($id, $chunk_size = 8192) { + global $cache_revinfo; + + $this->cache =& $cache_revinfo; + if(!isset($this->cache[$id])) { + $this->cache[$id] = array(); + } + + $this->id = $id; + $this->setChunkSize($chunk_size); + + } + + /** + * Set chunk size for file reading + * Chunk size zero let read whole file at once + * + * @param int $chunk_size maximum block size read from file + */ + public function setChunkSize($chunk_size) { + if(!is_numeric($chunk_size)) $chunk_size = 0; + + $this->chunk_size = (int) max($chunk_size, 0); + } + + /** + * Returns path to changelog + * + * @return string path to file + */ + abstract protected function getChangelogFilename(); + + /** + * Returns path to current page/media + * + * @return string path to file + */ + abstract protected function getFilename(); + + /** + * Get the changelog information for a specific page id and revision (timestamp) + * + * Adjacent changelog lines are optimistically parsed and cached to speed up + * consecutive calls to getRevisionInfo. For large changelog files, only the chunk + * containing the requested changelog line is read. + * + * @param int $rev revision timestamp + * @return bool|array false or array with entries: + * - date: unix timestamp + * - ip: IPv4 address (127.0.0.1) + * - type: log line type + * - id: page id + * - user: user name + * - sum: edit summary (or action reason) + * - extra: extra data (varies by line type) + * + * @author Ben Coburn + * @author Kate Arzamastseva + */ + public function getRevisionInfo($rev) { + $rev = max($rev, 0); + + // check if it's already in the memory cache + if(isset($this->cache[$this->id]) && isset($this->cache[$this->id][$rev])) { + return $this->cache[$this->id][$rev]; + } + + //read lines from changelog + list($fp, $lines) = $this->readloglines($rev); + if($fp) { + fclose($fp); + } + if(empty($lines)) return false; + + // parse and cache changelog lines + foreach($lines as $value) { + $tmp = parseChangelogLine($value); + if($tmp !== false) { + $this->cache[$this->id][$tmp['date']] = $tmp; + } + } + if(!isset($this->cache[$this->id][$rev])) { + return false; + } + return $this->cache[$this->id][$rev]; + } + + /** + * Return a list of page revisions numbers + * + * Does not guarantee that the revision exists in the attic, + * only that a line with the date exists in the changelog. + * By default the current revision is skipped. + * + * The current revision is automatically skipped when the page exists. + * See $INFO['meta']['last_change'] for the current revision. + * A negative $first let read the current revision too. + * + * For efficiency, the log lines are parsed and cached for later + * calls to getRevisionInfo. Large changelog files are read + * backwards in chunks until the requested number of changelog + * lines are recieved. + * + * @param int $first skip the first n changelog lines + * @param int $num number of revisions to return + * @return array with the revision timestamps + * + * @author Ben Coburn + * @author Kate Arzamastseva + */ + public function getRevisions($first, $num) { + $revs = array(); + $lines = array(); + $count = 0; + + $num = max($num, 0); + if($num == 0) { + return $revs; + } + + if($first < 0) { + $first = 0; + } else if(@file_exists($this->getFilename())) { + // skip current revision if the page exists + $first = max($first + 1, 0); + } + + $file = $this->getChangelogFilename(); + + if(!@file_exists($file)) { + return $revs; + } + if(filesize($file) < $this->chunk_size || $this->chunk_size == 0) { + // read whole file + $lines = file($file); + if($lines === false) { + return $revs; + } + } else { + // read chunks backwards + $fp = fopen($file, 'rb'); // "file pointer" + if($fp === false) { + return $revs; + } + fseek($fp, 0, SEEK_END); + $tail = ftell($fp); + + // chunk backwards + $finger = max($tail - $this->chunk_size, 0); + while($count < $num + $first) { + $nl = $this->getNewlinepointer($fp, $finger); + + // was the chunk big enough? if not, take another bite + if($nl > 0 && $tail <= $nl) { + $finger = max($finger - $this->chunk_size, 0); + continue; + } else { + $finger = $nl; + } + + // read chunk + $chunk = ''; + $read_size = max($tail - $finger, 0); // found chunk size + $got = 0; + while($got < $read_size && !feof($fp)) { + $tmp = @fread($fp, max(min($this->chunk_size, $read_size - $got), 0)); + if($tmp === false) { + break; + } //error state + $got += strlen($tmp); + $chunk .= $tmp; + } + $tmp = explode("\n", $chunk); + array_pop($tmp); // remove trailing newline + + // combine with previous chunk + $count += count($tmp); + $lines = array_merge($tmp, $lines); + + // next chunk + if($finger == 0) { + break; + } // already read all the lines + else { + $tail = $finger; + $finger = max($tail - $this->chunk_size, 0); + } + } + fclose($fp); + } + + // skip parsing extra lines + $num = max(min(count($lines) - $first, $num), 0); + if ($first > 0 && $num > 0) { $lines = array_slice($lines, max(count($lines) - $first - $num, 0), $num); } + else if($first > 0 && $num == 0) { $lines = array_slice($lines, 0, max(count($lines) - $first, 0)); } + else if($first == 0 && $num > 0) { $lines = array_slice($lines, max(count($lines) - $num, 0)); } + + // handle lines in reverse order + for($i = count($lines) - 1; $i >= 0; $i--) { + $tmp = parseChangelogLine($lines[$i]); + if($tmp !== false) { + $this->cache[$this->id][$tmp['date']] = $tmp; + $revs[] = $tmp['date']; + } + } + + return $revs; + } + + /** + * Get the nth revision left or right handside for a specific page id and revision (timestamp) + * + * For large changelog files, only the chunk containing the + * reference revision $rev is read and sometimes a next chunck. + * + * Adjacent changelog lines are optimistically parsed and cached to speed up + * consecutive calls to getRevisionInfo. + * + * @param int $rev revision timestamp used as startdate (doesn't need to be revisionnumber) + * @param int $direction give position of returned revision with respect to $rev; positive=next, negative=prev + * @return bool|int + * timestamp of the requested revision + * otherwise false + */ + public function getRelativeRevision($rev, $direction) { + $rev = max($rev, 0); + $direction = (int) $direction; + + //no direction given or last rev, so no follow-up + if(!$direction || ($direction > 0 && $this->isCurrentRevision($rev))) { + return false; + } + + //get lines from changelog + list($fp, $lines, $head, $tail, $eof) = $this->readloglines($rev); + if(empty($lines)) return false; + + // look for revisions later/earlier then $rev, when founded count till the wanted revision is reached + // also parse and cache changelog lines for getRevisionInfo(). + $revcounter = 0; + $relativerev = false; + $checkotherchunck = true; //always runs once + while(!$relativerev && $checkotherchunck) { + $tmp = array(); + //parse in normal or reverse order + $count = count($lines); + if($direction > 0) { + $start = 0; + $step = 1; + } else { + $start = $count - 1; + $step = -1; + } + for($i = $start; $i >= 0 && $i < $count; $i = $i + $step) { + $tmp = parseChangelogLine($lines[$i]); + if($tmp !== false) { + $this->cache[$this->id][$tmp['date']] = $tmp; + //look for revs older/earlier then reference $rev and select $direction-th one + if(($direction > 0 && $tmp['date'] > $rev) || ($direction < 0 && $tmp['date'] < $rev)) { + $revcounter++; + if($revcounter == abs($direction)) { + $relativerev = $tmp['date']; + } + } + } + } + + //true when $rev is found, but not the wanted follow-up. + $checkotherchunck = $fp + && ($tmp['date'] == $rev || ($revcounter > 0 && !$relativerev)) + && !(($tail == $eof && $direction > 0) || ($head == 0 && $direction < 0)); + + if($checkotherchunck) { + list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, $direction); + + if(empty($lines)) break; + } + } + if($fp) { + fclose($fp); + } + + return $relativerev; + } + + /** + * Returns revisions around rev1 and rev2 + * When available it returns $max entries for each revision + * + * @param int $rev1 oldest revision timestamp + * @param int $rev2 newest revision timestamp (0 looks up last revision) + * @param int $max maximum number of revisions returned + * @return array with two arrays with revisions surrounding rev1 respectively rev2 + */ + public function getRevisionsAround($rev1, $rev2, $max = 50) { + $max = floor(abs($max) / 2)*2 + 1; + $rev1 = max($rev1, 0); + $rev2 = max($rev2, 0); + + if($rev2) { + if($rev2 < $rev1) { + $rev = $rev2; + $rev2 = $rev1; + $rev1 = $rev; + } + } else { + //empty right side means a removed page. Look up last revision. + $revs = $this->getRevisions(-1, 1); + $rev2 = $revs[0]; + } + //collect revisions around rev2 + list($revs2, $allrevs, $fp, $lines, $head, $tail) = $this->retrieveRevisionsAround($rev2, $max); + + if(empty($revs2)) return array(array(), array()); + + //collect revisions around rev1 + $index = array_search($rev1, $allrevs); + if($index === false) { + //no overlapping revisions + list($revs1,,,,,) = $this->retrieveRevisionsAround($rev1, $max); + if(empty($revs1)) $revs1 = array(); + } else { + //revisions overlaps, reuse revisions around rev2 + $revs1 = $allrevs; + while($head > 0) { + for($i = count($lines) - 1; $i >= 0; $i--) { + $tmp = parseChangelogLine($lines[$i]); + if($tmp !== false) { + $this->cache[$this->id][$tmp['date']] = $tmp; + $revs1[] = $tmp['date']; + $index++; + + if($index > floor($max / 2)) break 2; + } + } + + list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, -1); + } + sort($revs1); + //return wanted selection + $revs1 = array_slice($revs1, max($index - floor($max/2), 0), $max); + } + + return array(array_reverse($revs1), array_reverse($revs2)); + } + + /** + * Returns lines from changelog. + * If file larger than $chuncksize, only chunck is read that could contain $rev. + * + * @param int $rev revision timestamp + * @return array(fp, array(changeloglines), $head, $tail, $eof)|bool + * returns false when not succeed. fp only defined for chuck reading, needs closing. + */ + protected function readloglines($rev) { + $file = $this->getChangelogFilename(); + + if(!@file_exists($file)) { + return false; + } + + $fp = null; + $head = 0; + $tail = 0; + $eof = 0; + + if(filesize($file) < $this->chunk_size || $this->chunk_size == 0) { + // read whole file + $lines = file($file); + if($lines === false) { + return false; + } + } else { + // read by chunk + $fp = fopen($file, 'rb'); // "file pointer" + if($fp === false) { + return false; + } + $head = 0; + fseek($fp, 0, SEEK_END); + $eof = ftell($fp); + $tail = $eof; + + // find chunk + while($tail - $head > $this->chunk_size) { + $finger = $head + floor(($tail - $head) / 2.0); + $finger = $this->getNewlinepointer($fp, $finger); + $tmp = fgets($fp); + if($finger == $head || $finger == $tail) { + break; + } + $tmp = parseChangelogLine($tmp); + $finger_rev = $tmp['date']; + + if($finger_rev > $rev) { + $tail = $finger; + } else { + $head = $finger; + } + } + + if($tail - $head < 1) { + // cound not find chunk, assume requested rev is missing + fclose($fp); + return false; + } + + $lines = $this->readChunk($fp, $head, $tail); + } + return array( + $fp, + $lines, + $head, + $tail, + $eof + ); + } + + /** + * Read chunk and return array with lines of given chunck. + * Has no check if $head and $tail are really at a new line + * + * @param $fp resource filepointer + * @param $head int start point chunck + * @param $tail int end point chunck + * @return array lines read from chunck + */ + protected function readChunk($fp, $head, $tail) { + $chunk = ''; + $chunk_size = max($tail - $head, 0); // found chunk size + $got = 0; + fseek($fp, $head); + while($got < $chunk_size && !feof($fp)) { + $tmp = @fread($fp, max(min($this->chunk_size, $chunk_size - $got), 0)); + if($tmp === false) { //error state + break; + } + $got += strlen($tmp); + $chunk .= $tmp; + } + $lines = explode("\n", $chunk); + array_pop($lines); // remove trailing newline + return $lines; + } + + /** + * Set pointer to first new line after $finger and return its position + * + * @param resource $fp filepointer + * @param $finger int a pointer + * @return int pointer + */ + protected function getNewlinepointer($fp, $finger) { + fseek($fp, $finger); + $nl = $finger; + if($finger > 0) { + fgets($fp); // slip the finger forward to a new line + $nl = ftell($fp); + } + return $nl; + } + + /** + * Check whether given revision is the current page + * + * @param int $rev timestamp of current page + * @return bool true if $rev is current revision, otherwise false + */ + public function isCurrentRevision($rev) { + return $rev == @filemtime($this->getFilename()); + } + + /** + * Returns the next lines of the changelog of the chunck before head or after tail + * + * @param resource $fp filepointer + * @param int $head position head of last chunk + * @param int $tail position tail of last chunk + * @param int $direction positive forward, negative backward + * @return array with entries: + * - $lines: changelog lines of readed chunk + * - $head: head of chunk + * - $tail: tail of chunk + */ + protected function readAdjacentChunk($fp, $head, $tail, $direction) { + if(!$fp) return array(array(), $head, $tail); + + if($direction > 0) { + //read forward + $head = $tail; + $tail = $head + floor($this->chunk_size * (2 / 3)); + $tail = $this->getNewlinepointer($fp, $tail); + } else { + //read backward + $tail = $head; + $head = max($tail - $this->chunk_size, 0); + while(true) { + $nl = $this->getNewlinepointer($fp, $head); + // was the chunk big enough? if not, take another bite + if($nl > 0 && $tail <= $nl) { + $head = max($head - $this->chunk_size, 0); + } else { + $head = $nl; + break; + } + } + } + + //load next chunck + $lines = $this->readChunk($fp, $head, $tail); + return array($lines, $head, $tail); + } + + /** + * Collect the $max revisions near to the timestamp $rev + * + * @param int $rev revision timestamp + * @param int $max maximum number of revisions to be returned + * @return bool|array + * return array with entries: + * - $requestedrevs: array of with $max revision timestamps + * - $revs: all parsed revision timestamps + * - $fp: filepointer only defined for chuck reading, needs closing. + * - $lines: non-parsed changelog lines before the parsed revisions + * - $head: position of first readed changelogline + * - $lasttail: position of end of last readed changelogline + * otherwise false + */ + protected function retrieveRevisionsAround($rev, $max) { + //get lines from changelog + list($fp, $lines, $starthead, $starttail, $eof) = $this->readloglines($rev); + if(empty($lines)) return false; + + //parse chunk containing $rev, and read forward more chunks until $max/2 is reached + $head = $starthead; + $tail = $starttail; + $revs = array(); + $aftercount = $beforecount = 0; + while(count($lines) > 0) { + foreach($lines as $line) { + $tmp = parseChangelogLine($line); + if($tmp !== false) { + $this->cache[$this->id][$tmp['date']] = $tmp; + $revs[] = $tmp['date']; + if($tmp['date'] >= $rev) { + //count revs after reference $rev + $aftercount++; + if($aftercount == 1) $beforecount = count($revs); + } + //enough revs after reference $rev? + if($aftercount > floor($max / 2)) break 2; + } + } + //retrieve next chunk + list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, 1); + } + if($aftercount == 0) return false; + + $lasttail = $tail; + + //read additional chuncks backward until $max/2 is reached and total number of revs is equal to $max + $lines = array(); + $i = 0; + if($aftercount > 0) { + $head = $starthead; + $tail = $starttail; + while($head > 0) { + list($lines, $head, $tail) = $this->readAdjacentChunk($fp, $head, $tail, -1); + + for($i = count($lines) - 1; $i >= 0; $i--) { + $tmp = parseChangelogLine($lines[$i]); + if($tmp !== false) { + $this->cache[$this->id][$tmp['date']] = $tmp; + $revs[] = $tmp['date']; + $beforecount++; + //enough revs before reference $rev? + if($beforecount > max(floor($max / 2), $max - $aftercount)) break 2; + } + } + } + } + sort($revs); + + //keep only non-parsed lines + $lines = array_slice($lines, 0, $i); + //trunk desired selection + $requestedrevs = array_slice($revs, -$max, $max); + + return array($requestedrevs, $revs, $fp, $lines, $head, $lasttail); + } +} + +/** + * Class PageChangelog handles changelog of a wiki page + */ +class PageChangelog extends ChangeLog { + + /** + * Returns path to changelog + * + * @return string path to file + */ + protected function getChangelogFilename() { + return metaFN($this->id, '.changes'); + } + + /** + * Returns path to current page/media + * + * @return string path to file + */ + protected function getFilename() { + return wikiFN($this->id); + } +} + +/** + * Class MediaChangelog handles changelog of a media file + */ +class MediaChangelog extends ChangeLog { + + /** + * Returns path to changelog + * + * @return string path to file + */ + protected function getChangelogFilename() { + return mediaMetaFN($this->id, '.changes'); + } + + /** + * Returns path to current page/media + * + * @return string path to file + */ + protected function getFilename() { + return mediaFN($this->id); + } +} + /** * Get the changelog information for a specific page id * and revision (timestamp). Adjacent changelog lines @@ -341,88 +1004,18 @@ function _handleRecent($line,$ns,$flags,&$seen){ * changelog files, only the chunk containing the * requested changelog line is read. * + * @deprecated 20-11-2013 + * * @author Ben Coburn * @author Kate Arzamastseva */ -function getRevisionInfo($id, $rev, $chunk_size=8192, $media=false) { - global $cache_revinfo; - $cache =& $cache_revinfo; - if (!isset($cache[$id])) { $cache[$id] = array(); } - $rev = max($rev, 0); - - // check if it's already in the memory cache - if (isset($cache[$id]) && isset($cache[$id][$rev])) { - return $cache[$id][$rev]; - } - - if ($media) { - $file = mediaMetaFN($id, '.changes'); +function getRevisionInfo($id, $rev, $chunk_size = 8192, $media = false) { + if($media) { + $changelog = new MediaChangeLog($id, $chunk_size); } else { - $file = metaFN($id, '.changes'); + $changelog = new PageChangeLog($id, $chunk_size); } - if (!@file_exists($file)) { return false; } - if (filesize($file)<$chunk_size || $chunk_size==0) { - // read whole file - $lines = file($file); - if ($lines===false) { return false; } - } else { - // read by chunk - $fp = fopen($file, 'rb'); // "file pointer" - if ($fp===false) { return false; } - $head = 0; - fseek($fp, 0, SEEK_END); - $tail = ftell($fp); - $finger = 0; - $finger_rev = 0; - - // find chunk - while ($tail-$head>$chunk_size) { - $finger = $head+floor(($tail-$head)/2.0); - fseek($fp, $finger); - fgets($fp); // slip the finger forward to a new line - $finger = ftell($fp); - $tmp = fgets($fp); // then read at that location - $tmp = parseChangelogLine($tmp); - $finger_rev = $tmp['date']; - if ($finger==$head || $finger==$tail) { break; } - if ($finger_rev>$rev) { - $tail = $finger; - } else { - $head = $finger; - } - } - - if ($tail-$head<1) { - // cound not find chunk, assume requested rev is missing - fclose($fp); - return false; - } - - // read chunk - $chunk = ''; - $chunk_size = max($tail-$head, 0); // found chunk size - $got = 0; - fseek($fp, $head); - while ($got<$chunk_size && !feof($fp)) { - $tmp = @fread($fp, max($chunk_size-$got, 0)); - if ($tmp===false) { break; } //error state - $got += strlen($tmp); - $chunk .= $tmp; - } - $lines = explode("\n", $chunk); - array_pop($lines); // remove trailing newline - fclose($fp); - } - - // parse and cache changelog lines - foreach ($lines as $value) { - $tmp = parseChangelogLine($value); - if ($tmp!==false) { - $cache[$id][$tmp['date']] = $tmp; - } - } - if (!isset($cache[$id][$rev])) { return false; } - return $cache[$id][$rev]; + return $changelog->getRevisionInfo($rev); } /** @@ -443,106 +1036,16 @@ function getRevisionInfo($id, $rev, $chunk_size=8192, $media=false) { * backwards in chunks until the requested number of changelog * lines are recieved. * + * @deprecated 20-11-2013 + * * @author Ben Coburn * @author Kate Arzamastseva */ -function getRevisions($id, $first, $num, $chunk_size=8192, $media=false) { - global $cache_revinfo; - $cache =& $cache_revinfo; - if (!isset($cache[$id])) { $cache[$id] = array(); } - - $revs = array(); - $lines = array(); - $count = 0; - if ($media) { - $file = mediaMetaFN($id, '.changes'); +function getRevisions($id, $first, $num, $chunk_size = 8192, $media = false) { + if($media) { + $changelog = new MediaChangeLog($id, $chunk_size); } else { - $file = metaFN($id, '.changes'); + $changelog = new PageChangeLog($id, $chunk_size); } - $num = max($num, 0); - if ($num == 0) { return $revs; } - - $chunk_size = max($chunk_size, 0); - if ($first<0) { - $first = 0; - } else if (!$media && @file_exists(wikiFN($id)) || $media && @file_exists(mediaFN($id))) { - // skip current revision if the page exists - $first = max($first+1, 0); - } - - if (!@file_exists($file)) { return $revs; } - if (filesize($file)<$chunk_size || $chunk_size==0) { - // read whole file - $lines = file($file); - if ($lines===false) { return $revs; } - } else { - // read chunks backwards - $fp = fopen($file, 'rb'); // "file pointer" - if ($fp===false) { return $revs; } - fseek($fp, 0, SEEK_END); - $tail = ftell($fp); - - // chunk backwards - $finger = max($tail-$chunk_size, 0); - while ($count<$num+$first) { - fseek($fp, $finger); - $nl = $finger; - if ($finger>0) { - fgets($fp); // slip the finger forward to a new line - $nl = ftell($fp); - } - - // was the chunk big enough? if not, take another bite - if($nl > 0 && $tail <= $nl){ - $finger = max($finger-$chunk_size, 0); - continue; - }else{ - $finger = $nl; - } - - // read chunk - $chunk = ''; - $read_size = max($tail-$finger, 0); // found chunk size - $got = 0; - while ($got<$read_size && !feof($fp)) { - $tmp = @fread($fp, max($read_size-$got, 0)); - if ($tmp===false) { break; } //error state - $got += strlen($tmp); - $chunk .= $tmp; - } - $tmp = explode("\n", $chunk); - array_pop($tmp); // remove trailing newline - - // combine with previous chunk - $count += count($tmp); - $lines = array_merge($tmp, $lines); - - // next chunk - if ($finger==0) { break; } // already read all the lines - else { - $tail = $finger; - $finger = max($tail-$chunk_size, 0); - } - } - fclose($fp); - } - - // skip parsing extra lines - $num = max(min(count($lines)-$first, $num), 0); - if ($first>0 && $num>0) { $lines = array_slice($lines, max(count($lines)-$first-$num, 0), $num); } - else if ($first>0 && $num==0) { $lines = array_slice($lines, 0, max(count($lines)-$first, 0)); } - else if ($first==0 && $num>0) { $lines = array_slice($lines, max(count($lines)-$num, 0)); } - - // handle lines in reverse order - for ($i = count($lines)-1; $i >= 0; $i--) { - $tmp = parseChangelogLine($lines[$i]); - if ($tmp!==false) { - $cache[$id][$tmp['date']] = $tmp; - $revs[] = $tmp['date']; - } - } - - return $revs; + return $changelog->getRevisions($first, $num); } - - diff --git a/sources/inc/cliopts.php b/sources/inc/cliopts.php index 9cea686..3eac72e 100644 --- a/sources/inc/cliopts.php +++ b/sources/inc/cliopts.php @@ -74,9 +74,9 @@ class Doku_Cli_Opts { /** * * @see http://www.sitepoint.com/article/php-command-line-1/3 - * @param string executing file name - this MUST be passed the __FILE__ constant - * @param string short options - * @param array (optional) long options + * @param string $bin_file executing file name - this MUST be passed the __FILE__ constant + * @param string $short_options short options + * @param array $long_options (optional) long options * @return Doku_Cli_Opts_Container or Doku_Cli_Opts_Error */ function & getOptions($bin_file, $short_options, $long_options = null) { @@ -233,12 +233,12 @@ class Doku_Cli_Opts { * Parse short option * * @param string $arg Argument - * @param string[] $short_options Available short options + * @param string $short_options Available short options * @param string[][] &$opts * @param string[] &$args * * @access private - * @return void + * @return void|Doku_Cli_Opts_Error */ function _parseShortOption($arg, $short_options, &$opts, &$args) { $len = strlen($arg); @@ -324,7 +324,7 @@ class Doku_Cli_Opts { * @param string[] &$args * * @access private - * @return void|PEAR_Error + * @return void|Doku_Cli_Opts_Error */ function _parseLongOption($arg, $long_options, &$opts, &$args) { @list($opt, $opt_arg) = explode('=', $arg, 2); @@ -402,7 +402,7 @@ class Doku_Cli_Opts { * Will take care on register_globals and register_argc_argv ini directives * * @access public - * @return mixed the $argv PHP array or PEAR error if not registered + * @return array|Doku_Cli_Opts_Error the $argv PHP array or PEAR error if not registered */ function readPHPArgv() { global $argv; @@ -421,10 +421,19 @@ class Doku_Cli_Opts { return $argv; } + /** + * @param $code + * @param $msg + * @return Doku_Cli_Opts_Error + */ function raiseError($code, $msg) { return new Doku_Cli_Opts_Error($code, $msg); } + /** + * @param $obj + * @return bool + */ function isError($obj) { return is_a($obj, 'Doku_Cli_Opts_Error'); } diff --git a/sources/inc/common.php b/sources/inc/common.php index 3277128..110b914 100644 --- a/sources/inc/common.php +++ b/sources/inc/common.php @@ -56,15 +56,18 @@ function stripctl($string) { * @return string */ function getSecurityToken() { - return PassHash::hmac('md5', session_id().$_SERVER['REMOTE_USER'], auth_cookiesalt()); + /** @var Input $INPUT */ + global $INPUT; + return PassHash::hmac('md5', session_id().$INPUT->server->str('REMOTE_USER'), auth_cookiesalt()); } /** * Check the secret CSRF token */ function checkSecurityToken($token = null) { + /** @var Input $INPUT */ global $INPUT; - if(empty($_SERVER['REMOTE_USER'])) return true; // no logged in user, no need for a check + if(!$INPUT->server->str('REMOTE_USER')) return true; // no logged in user, no need for a check if(is_null($token)) $token = $INPUT->str('sectok'); if(getSecurityToken() != $token) { @@ -93,14 +96,16 @@ function formSecurityToken($print = true) { */ function basicinfo($id, $htmlClient=true){ global $USERINFO; + /* @var Input $INPUT */ + global $INPUT; // set info about manager/admin status. $info['isadmin'] = false; $info['ismanager'] = false; - if(isset($_SERVER['REMOTE_USER'])) { + if($INPUT->server->has('REMOTE_USER')) { $info['userinfo'] = $USERINFO; $info['perm'] = auth_quickaclcheck($id); - $info['client'] = $_SERVER['REMOTE_USER']; + $info['client'] = $INPUT->server->str('REMOTE_USER'); if($info['perm'] == AUTH_ADMIN) { $info['isadmin'] = true; @@ -111,7 +116,7 @@ function basicinfo($id, $htmlClient=true){ // if some outside auth were used only REMOTE_USER is set if(!$info['userinfo']['name']) { - $info['userinfo']['name'] = $_SERVER['REMOTE_USER']; + $info['userinfo']['name'] = $INPUT->server->str('REMOTE_USER'); } } else { @@ -140,6 +145,8 @@ function pageinfo() { global $REV; global $RANGE; global $lang; + /* @var Input $INPUT */ + global $INPUT; $info = basicinfo($ID); @@ -148,19 +155,20 @@ function pageinfo() { $info['id'] = $ID; $info['rev'] = $REV; - if(isset($_SERVER['REMOTE_USER'])) { + if($INPUT->server->has('REMOTE_USER')) { $sub = new Subscription(); $info['subscribed'] = $sub->user_subscription(); } else { $info['subscribed'] = false; } - $info['locked'] = checklock($ID); - $info['filepath'] = fullpath(wikiFN($ID)); - $info['exists'] = @file_exists($info['filepath']); + $info['locked'] = checklock($ID); + $info['filepath'] = fullpath(wikiFN($ID)); + $info['exists'] = @file_exists($info['filepath']); + $info['currentrev'] = @filemtime($info['filepath']); if($REV) { //check if current revision was meant - if($info['exists'] && (@filemtime($info['filepath']) == $REV)) { + if($info['exists'] && ($info['currentrev'] == $REV)) { $REV = ''; } elseif($RANGE) { //section editing does not work with old revisions! @@ -187,13 +195,14 @@ function pageinfo() { $info['meta'] = p_get_metadata($ID); //who's the editor + $pagelog = new PageChangeLog($ID, 1024); if($REV) { - $revinfo = getRevisionInfo($ID, $REV, 1024); + $revinfo = $pagelog->getRevisionInfo($REV); } else { - if(is_array($info['meta']['last_change'])) { + if(!empty($info['meta']['last_change']) && is_array($info['meta']['last_change'])) { $revinfo = $info['meta']['last_change']; } else { - $revinfo = getRevisionInfo($ID, $info['lastmod'], 1024); + $revinfo = $pagelog->getRevisionInfo($info['lastmod']); // cache most recent changelog line in metadata if missing and still valid if($revinfo !== false) { $info['meta']['last_change'] = $revinfo; @@ -355,11 +364,14 @@ function breadcrumbs() { */ function idfilter($id, $ue = true) { global $conf; + /* @var Input $INPUT */ + global $INPUT; + if($conf['useslash'] && $conf['userewrite']) { $id = strtr($id, ':', '/'); } elseif(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' && $conf['userewrite'] && - strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') === false + strpos($INPUT->server->str('SERVER_SOFTWARE'), 'Microsoft-IIS') === false ) { $id = strtr($id, ':', ';'); } @@ -587,6 +599,8 @@ function checkwordblock($text = '') { global $SUM; global $conf; global $INFO; + /* @var Input $INPUT */ + global $INPUT; if(!$conf['usewordblock']) return false; @@ -619,9 +633,9 @@ function checkwordblock($text = '') { if(count($re) && preg_match('#('.join('|', $re).')#si', $text, $matches)) { // prepare event data $data['matches'] = $matches; - $data['userinfo']['ip'] = $_SERVER['REMOTE_ADDR']; - if($_SERVER['REMOTE_USER']) { - $data['userinfo']['user'] = $_SERVER['REMOTE_USER']; + $data['userinfo']['ip'] = $INPUT->server->str('REMOTE_ADDR'); + if($INPUT->server->str('REMOTE_USER')) { + $data['userinfo']['user'] = $INPUT->server->str('REMOTE_USER'); $data['userinfo']['name'] = $INFO['userinfo']['name']; $data['userinfo']['mail'] = $INFO['userinfo']['mail']; } @@ -647,12 +661,17 @@ function checkwordblock($text = '') { * @return string */ function clientIP($single = false) { + /* @var Input $INPUT */ + global $INPUT; + $ip = array(); - $ip[] = $_SERVER['REMOTE_ADDR']; - if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) - $ip = array_merge($ip, explode(',', str_replace(' ', '', $_SERVER['HTTP_X_FORWARDED_FOR']))); - if(!empty($_SERVER['HTTP_X_REAL_IP'])) - $ip = array_merge($ip, explode(',', str_replace(' ', '', $_SERVER['HTTP_X_REAL_IP']))); + $ip[] = $INPUT->server->str('REMOTE_ADDR'); + if($INPUT->server->str('HTTP_X_FORWARDED_FOR')) { + $ip = array_merge($ip, explode(',', str_replace(' ', '', $INPUT->server->str('HTTP_X_FORWARDED_FOR')))); + } + if($INPUT->server->str('HTTP_X_REAL_IP')) { + $ip = array_merge($ip, explode(',', str_replace(' ', '', $INPUT->server->str('HTTP_X_REAL_IP')))); + } // some IPv4/v6 regexps borrowed from Feyd // see: http://forums.devnetwork.net/viewtopic.php?f=38&t=53479 @@ -711,16 +730,18 @@ function clientIP($single = false) { * @link http://www.brainhandles.com/2007/10/15/detecting-mobile-browsers/#code */ function clientismobile() { + /* @var Input $INPUT */ + global $INPUT; - if(isset($_SERVER['HTTP_X_WAP_PROFILE'])) return true; + if($INPUT->server->has('HTTP_X_WAP_PROFILE')) return true; - if(preg_match('/wap\.|\.wap/i', $_SERVER['HTTP_ACCEPT'])) return true; + if(preg_match('/wap\.|\.wap/i', $INPUT->server->str('HTTP_ACCEPT'))) return true; - if(!isset($_SERVER['HTTP_USER_AGENT'])) return false; + if(!$INPUT->server->has('HTTP_USER_AGENT')) return false; $uamatches = 'midp|j2me|avantg|docomo|novarra|palmos|palmsource|240x320|opwv|chtml|pda|windows ce|mmp\/|blackberry|mib\/|symbian|wireless|nokia|hand|mobi|phone|cdm|up\.b|audio|SIE\-|SEC\-|samsung|HTC|mot\-|mitsu|sagem|sony|alcatel|lg|erics|vx|NEC|philips|mmm|xx|panasonic|sharp|wap|sch|rover|pocket|benq|java|pt|pg|vox|amoi|bird|compal|kg|voda|sany|kdd|dbt|sendo|sgh|gradi|jb|\d\d\di|moto'; - if(preg_match("/$uamatches/i", $_SERVER['HTTP_USER_AGENT'])) return true; + if(preg_match("/$uamatches/i", $INPUT->server->str('HTTP_USER_AGENT'))) return true; return false; } @@ -760,6 +781,9 @@ function gethostsbyaddrs($ips) { */ function checklock($id) { global $conf; + /* @var Input $INPUT */ + global $INPUT; + $lock = wikiLockFN($id); //no lockfile @@ -772,8 +796,8 @@ function checklock($id) { } //my own lock - list($ip, $session) = explode("\n", io_readFile($lock)); - if($ip == $_SERVER['REMOTE_USER'] || $ip == clientIP() || $session == session_id()) { + @list($ip, $session) = explode("\n", io_readFile($lock)); + if($ip == $INPUT->server->str('REMOTE_USER') || $ip == clientIP() || $session == session_id()) { return false; } @@ -787,14 +811,16 @@ function checklock($id) { */ function lock($id) { global $conf; + /* @var Input $INPUT */ + global $INPUT; if($conf['locktime'] == 0) { return; } $lock = wikiLockFN($id); - if($_SERVER['REMOTE_USER']) { - io_saveFile($lock, $_SERVER['REMOTE_USER']); + if($INPUT->server->str('REMOTE_USER')) { + io_saveFile($lock, $INPUT->server->str('REMOTE_USER')); } else { io_saveFile($lock, clientIP()."\n".session_id()); } @@ -808,10 +834,13 @@ function lock($id) { * @return bool true if a lock was removed */ function unlock($id) { + /* @var Input $INPUT */ + global $INPUT; + $lock = wikiLockFN($id); if(@file_exists($lock)) { - list($ip, $session) = explode("\n", io_readFile($lock)); - if($ip == $_SERVER['REMOTE_USER'] || $ip == clientIP() || $session == session_id()) { + @list($ip, $session) = explode("\n", io_readFile($lock)); + if($ip == $INPUT->server->str('REMOTE_USER') || $ip == clientIP() || $session == session_id()) { @unlink($lock); return true; } @@ -937,6 +966,8 @@ function parsePageTemplate(&$data) { global $USERINFO; global $conf; + /* @var Input $INPUT */ + global $INPUT; // replace placeholders $file = noNS($id); @@ -968,7 +999,7 @@ function parsePageTemplate(&$data) { utf8_ucfirst($page), utf8_ucwords($page), utf8_strtoupper($page), - $_SERVER['REMOTE_USER'], + $INPUT->server->str('REMOTE_USER'), $USERINFO['name'], $USERINFO['mail'], $conf['dformat'], @@ -1049,6 +1080,9 @@ function saveWikiText($id, $text, $summary, $minor = false) { global $conf; global $lang; global $REV; + /* @var Input $INPUT */ + global $INPUT; + // ignore if no changes were made if($text == rawWiki($id, '')) { return; @@ -1059,8 +1093,9 @@ function saveWikiText($id, $text, $summary, $minor = false) { $wasRemoved = (trim($text) == ''); // check for empty or whitespace only $wasCreated = !@file_exists($file); $wasReverted = ($REV == true); + $pagelog = new PageChangeLog($id, 1024); $newRev = false; - $oldRev = getRevisions($id, -1, 1, 1024); // from changelog + $oldRev = $pagelog->getRevisions(-1, 1); // from changelog $oldRev = (int) (empty($oldRev) ? 0 : $oldRev[0]); if(!@file_exists(wikiFN($id, $old)) && @file_exists($file) && $old >= $oldRev) { // add old revision to the attic if missing @@ -1111,7 +1146,7 @@ function saveWikiText($id, $text, $summary, $minor = false) { $type = DOKU_CHANGE_TYPE_CREATE; } else if($wasRemoved) { $type = DOKU_CHANGE_TYPE_DELETE; - } else if($minor && $conf['useacl'] && $_SERVER['REMOTE_USER']) { + } else if($minor && $conf['useacl'] && $INPUT->server->str('REMOTE_USER')) { $type = DOKU_CHANGE_TYPE_MINOR_EDIT; } //minor edits only for logged in users @@ -1140,7 +1175,6 @@ function saveWikiText($id, $text, $summary, $minor = false) { * @author Andreas Gohr */ function saveOldRevision($id) { - global $conf; $oldf = wikiFN($id); if(!@file_exists($oldf)) return ''; $date = filemtime($oldf); @@ -1164,6 +1198,8 @@ function saveOldRevision($id) { */ function notify($id, $who, $rev = '', $summary = '', $minor = false, $replace = array()) { global $conf; + /* @var Input $INPUT */ + global $INPUT; // decide if there is something to do, eg. whom to mail if($who == 'admin') { @@ -1172,7 +1208,7 @@ function notify($id, $who, $rev = '', $summary = '', $minor = false, $replace = $to = $conf['notify']; } elseif($who == 'subscribers') { if(!actionOK('subscribe')) return false; //subscribers enabled? - if($conf['useacl'] && $_SERVER['REMOTE_USER'] && $minor) return false; //skip minors + if($conf['useacl'] && $INPUT->server->str('REMOTE_USER') && $minor) return false; //skip minors $data = array('id' => $id, 'addresslist' => '', 'self' => false); trigger_event( 'COMMON_NOTIFY_ADDRESSLIST', $data, @@ -1197,10 +1233,13 @@ function notify($id, $who, $rev = '', $summary = '', $minor = false, $replace = * @author Todd Augsburger */ function getGoogleQuery() { - if(!isset($_SERVER['HTTP_REFERER'])) { + /* @var Input $INPUT */ + global $INPUT; + + if(!$INPUT->server->has('HTTP_REFERER')) { return ''; } - $url = parse_url($_SERVER['HTTP_REFERER']); + $url = parse_url($INPUT->server->str('HTTP_REFERER')); // only handle common SEs if(!preg_match('/(google|bing|yahoo|ask|duckduckgo|babylon|aol|yandex)/',$url['host'])) return ''; @@ -1230,8 +1269,9 @@ function getGoogleQuery() { /** * Return the human readable size of a file * - * @param int $size A file size - * @param int $dec A number of decimal places + * @param int $size A file size + * @param int $dec A number of decimal places + * @return string human readable size * @author Martin Benjamin * @author Aidan Lister * @version 1.0.0 @@ -1362,12 +1402,16 @@ function php_to_byte($v) { $l = substr($v, -1); $ret = substr($v, 0, -1); switch(strtoupper($l)) { + /** @noinspection PhpMissingBreakStatementInspection */ case 'P': $ret *= 1024; + /** @noinspection PhpMissingBreakStatementInspection */ case 'T': $ret *= 1024; + /** @noinspection PhpMissingBreakStatementInspection */ case 'G': $ret *= 1024; + /** @noinspection PhpMissingBreakStatementInspection */ case 'M': $ret *= 1024; case 'K': @@ -1415,37 +1459,135 @@ function shorten($keep, $short, $max, $min = 9, $char = '…') { * Return the users realname or e-mail address for use * in page footer and recent changes pages * + * @param string|bool $username or false when currently logged-in user should be used + * @param bool $textonly true returns only plain text, true allows returning html + * @return string html or plain text(not escaped) of formatted user name + * * @author Andy Webber */ -function editorinfo($username) { - global $conf; +function editorinfo($username, $textonly = false) { + return userlink($username, $textonly); +} + +/** + * Returns users realname w/o link + * + * @param string|bool $username or false when currently logged-in user should be used + * @param bool $textonly true returns only plain text, true allows returning html + * @return string html or plain text(not escaped) of formatted user name + * + * @triggers COMMON_USER_LINK + */ +function userlink($username = null, $textonly = false) { + global $conf, $INFO; + /** @var DokuWiki_Auth_Plugin $auth */ global $auth; + /** @var Input $INPUT */ + global $INPUT; - switch($conf['showuseras']) { - case 'username': - case 'email': - case 'email_link': - if($auth) $info = $auth->getUserData($username); - break; - default: - return hsc($username); - } - - if(isset($info) && $info) { - switch($conf['showuseras']) { - case 'username': - return hsc($info['name']); - case 'email': - return obfuscate($info['mail']); - case 'email_link': - $mail = obfuscate($info['mail']); - return ''.$mail.''; - default: - return hsc($username); + // prepare initial event data + $data = array( + 'username' => $username, // the unique user name + 'name' => '', + 'link' => array( //setting 'link' to false disables linking + 'target' => '', + 'pre' => '', + 'suf' => '', + 'style' => '', + 'more' => '', + 'url' => '', + 'title' => '', + 'class' => '' + ), + 'userlink' => '', // formatted user name as will be returned + 'textonly' => $textonly + ); + if($username === null) { + $data['username'] = $username = $INPUT->server->str('REMOTE_USER'); + if($textonly){ + $data['name'] = $INFO['userinfo']['name']. ' (' . $INPUT->server->str('REMOTE_USER') . ')'; + }else { + $data['name'] = '' . hsc($INFO['userinfo']['name']) . ' (' . hsc($INPUT->server->str('REMOTE_USER')) . ')'; } - } else { - return hsc($username); } + + $evt = new Doku_Event('COMMON_USER_LINK', $data); + if($evt->advise_before(true)) { + if(empty($data['name'])) { + if($conf['showuseras'] == 'loginname') { + $data['name'] = $textonly ? $data['username'] : hsc($data['username']); + } else { + if($auth) $info = $auth->getUserData($username); + if(isset($info) && $info) { + switch($conf['showuseras']) { + case 'username': + case 'username_link': + $data['name'] = $textonly ? $info['name'] : hsc($info['name']); + break; + case 'email': + case 'email_link': + $data['name'] = obfuscate($info['mail']); + break; + } + } + } + } + + /** @var Doku_Renderer_xhtml $xhtml_renderer */ + static $xhtml_renderer = null; + + if(!$data['textonly'] && empty($data['link']['url'])) { + + if(in_array($conf['showuseras'], array('email_link', 'username_link'))) { + if(!isset($info)) { + if($auth) $info = $auth->getUserData($username); + } + if(isset($info) && $info) { + if($conf['showuseras'] == 'email_link') { + $data['link']['url'] = 'mailto:' . obfuscate($info['mail']); + } else { + if(is_null($xhtml_renderer)) { + $xhtml_renderer = p_get_renderer('xhtml'); + } + if(empty($xhtml_renderer->interwiki)) { + $xhtml_renderer->interwiki = getInterwiki(); + } + $shortcut = 'user'; + $exists = null; + $data['link']['url'] = $xhtml_renderer->_resolveInterWiki($shortcut, $username, $exists); + $data['link']['class'] .= ' interwiki iw_user'; + if($exists !== null) { + if($exists) { + $data['link']['class'] .= ' wikilink1'; + } else { + $data['link']['class'] .= ' wikilink2'; + $data['link']['rel'] = 'nofollow'; + } + } + } + } else { + $data['textonly'] = true; + } + + } else { + $data['textonly'] = true; + } + } + + if($data['textonly']) { + $data['userlink'] = $data['name']; + } else { + $data['link']['name'] = $data['name']; + if(is_null($xhtml_renderer)) { + $xhtml_renderer = p_get_renderer('xhtml'); + } + $data['userlink'] = $xhtml_renderer->_formatLink($data['link']); + } + } + $evt->advise_after(); + unset($evt); + + return $data['userlink']; } /** @@ -1518,6 +1660,9 @@ function is_mem_available($mem, $bytes = 1048576) { * @author Andreas Gohr */ function send_redirect($url) { + /* @var Input $INPUT */ + global $INPUT; + //are there any undisplayed messages? keep them in session for display global $MSG; if(isset($MSG) && count($MSG) && !defined('NOSESSION')) { @@ -1531,7 +1676,7 @@ function send_redirect($url) { // work around IE bug // http://www.ianhoar.com/2008/11/16/internet-explorer-6-and-redirected-anchor-links/ - list($url, $hash) = explode('#', $url); + @list($url, $hash) = explode('#', $url); if($hash) { if(strpos($url, '?')) { $url = $url.'&#'.$hash; @@ -1541,9 +1686,9 @@ function send_redirect($url) { } // check if running on IIS < 6 with CGI-PHP - if(isset($_SERVER['SERVER_SOFTWARE']) && isset($_SERVER['GATEWAY_INTERFACE']) && - (strpos($_SERVER['GATEWAY_INTERFACE'], 'CGI') !== false) && - (preg_match('|^Microsoft-IIS/(\d)\.\d$|', trim($_SERVER['SERVER_SOFTWARE']), $matches)) && + if($INPUT->server->has('SERVER_SOFTWARE') && $INPUT->server->has('GATEWAY_INTERFACE') && + (strpos($INPUT->server->str('GATEWAY_INTERFACE'), 'CGI') !== false) && + (preg_match('|^Microsoft-IIS/(\d)\.\d$|', trim($INPUT->server->str('SERVER_SOFTWARE')), $matches)) && $matches[1] < 6 ) { header('Refresh: 0;url='.$url); @@ -1630,4 +1775,13 @@ function set_doku_pref($pref, $val) { } } +/** + * Strips source mapping declarations from given text #601 + * + * @param &string $text reference to the CSS or JavaScript code to clean + */ +function stripsourcemaps(&$text){ + $text = preg_replace('/^(\/\/|\/\*)[@#]\s+sourceMappingURL=.*?(\*\/)?$/im', '\\1\\2', $text); +} + //Setup VIM: ex: et ts=2 : diff --git a/sources/inc/confutils.php b/sources/inc/confutils.php index 0ac003b..31371d4 100644 --- a/sources/inc/confutils.php +++ b/sources/inc/confutils.php @@ -237,13 +237,14 @@ function getConfigFiles($type) { * check if the given action was disabled in config * * @author Andreas Gohr + * @param string $action * @returns boolean true if enabled, false if disabled */ function actionOK($action){ static $disabled = null; if(is_null($disabled) || defined('SIMPLE_TEST')){ global $conf; - /** @var auth_basic $auth */ + /** @var DokuWiki_Auth_Plugin $auth */ global $auth; // prepare disabled actions array and handle legacy options diff --git a/sources/inc/events.php b/sources/inc/events.php index f7b1a7a..318a761 100644 --- a/sources/inc/events.php +++ b/sources/inc/events.php @@ -8,15 +8,18 @@ if(!defined('DOKU_INC')) die('meh.'); +/** + * The event + */ class Doku_Event { // public properties - var $name = ''; // READONLY event name, objects must register against this name to see the event - var $data = null; // READWRITE data relevant to the event, no standardised format (YET!) - var $result = null; // READWRITE the results of the event action, only relevant in "_AFTER" advise + public $name = ''; // READONLY event name, objects must register against this name to see the event + public $data = null; // READWRITE data relevant to the event, no standardised format (YET!) + public $result = null; // READWRITE the results of the event action, only relevant in "_AFTER" advise // event handlers may modify this if they are preventing the default action // to provide the after event handlers with event results - var $canPreventDefault = true; // READONLY if true, event handlers can prevent the events default action + public $canPreventDefault = true; // READONLY if true, event handlers can prevent the events default action // private properties, event handlers can effect these through the provided methods var $_default = true; // whether or not to carry out the default action associated with the event @@ -32,6 +35,13 @@ class Doku_Event { } + /** + * @return string + */ + function __toString() { + return $this->name; + } + /** * advise functions * @@ -47,7 +57,8 @@ class Doku_Event { * $evt->advise_after(); * unset($evt); * - * @return results of processing the event, usually $this->_default + * @param bool $enablePreventDefault + * @return bool results of processing the event, usually $this->_default */ function advise_before($enablePreventDefault=true) { global $EVENT_HANDLER; @@ -73,14 +84,21 @@ class Doku_Event { * $this->_default, all of which may have been modified by the event handlers. * - advise all registered (_AFTER) handlers that the event has taken place * - * @return $event->results + * @param null|callable $action + * @param bool $enablePrevent + * @return mixed $event->results * the value set by any _before or handlers if the default action is prevented * or the results of the default action (as modified by _after handlers) * or NULL no action took place and no handler modified the value */ function trigger($action=null, $enablePrevent=true) { - if (!is_callable($action)) $enablePrevent = false; + if (!is_callable($action)) { + $enablePrevent = false; + if (!is_null($action)) { + trigger_error('The default action of '.$this.' is not null but also not callable. Maybe the method is not public?', E_USER_WARNING); + } + } if ($this->advise_before($enablePrevent) && is_callable($action)) { if (is_array($action)) { @@ -112,12 +130,15 @@ class Doku_Event { function preventDefault() { $this->_default = false; } } +/** + * Controls the registration and execution of all events, + */ class Doku_Event_Handler { // public properties: none // private properties - var $_hooks = array(); // array of events and their registered handlers + protected $_hooks = array(); // array of events and their registered handlers /** * event_handler @@ -128,6 +149,7 @@ class Doku_Event_Handler { function Doku_Event_Handler() { // load action plugins + /** @var DokuWiki_Action_Plugin $plugin */ $plugin = null; $pluginlist = plugin_list('action'); @@ -143,34 +165,47 @@ class Doku_Event_Handler { * * register a hook for an event * - * @param $event (string) name used by the event, (incl '_before' or '_after' for triggers) - * @param $obj (obj) object in whose scope method is to be executed, + * @param $event string name used by the event, (incl '_before' or '_after' for triggers) + * @param $advise string + * @param $obj object object in whose scope method is to be executed, * if NULL, method is assumed to be a globally available function - * @param $method (function) event handler function - * @param $param (mixed) data passed to the event handler + * @param $method string event handler function + * @param $param mixed data passed to the event handler + * @param $seq int sequence number for ordering hook execution (ascending) */ - function register_hook($event, $advise, $obj, $method, $param=null) { - $this->_hooks[$event.'_'.$advise][] = array($obj, $method, $param); + function register_hook($event, $advise, $obj, $method, $param=null, $seq=0) { + $seq = (int)$seq; + $doSort = !isset($this->_hooks[$event.'_'.$advise][$seq]); + $this->_hooks[$event.'_'.$advise][$seq][] = array($obj, $method, $param); + + if ($doSort) { + ksort($this->_hooks[$event.'_'.$advise]); + } } - function process_event(&$event,$advise='') { + /** + * process the before/after event + * + * @param Doku_Event $event + * @param string $advise BEFORE or AFTER + */ + function process_event($event,$advise='') { $evt_name = $event->name . ($advise ? '_'.$advise : '_BEFORE'); if (!empty($this->_hooks[$evt_name])) { - foreach ($this->_hooks[$evt_name] as $hook) { - // list($obj, $method, $param) = $hook; - $obj =& $hook[0]; - $method = $hook[1]; - $param = $hook[2]; + foreach ($this->_hooks[$evt_name] as $sequenced_hooks) { + foreach ($sequenced_hooks as $hook) { + list($obj, $method, $param) = $hook; - if (is_null($obj)) { - $method($event, $param); - } else { - $obj->$method($event, $param); + if (is_null($obj)) { + $method($event, $param); + } else { + $obj->$method($event, $param); + } + + if (!$event->_continue) return; } - - if (!$event->_continue) break; } } } @@ -181,12 +216,12 @@ class Doku_Event_Handler { * * function wrapper to process (create, trigger and destroy) an event * - * @param $name (string) name for the event - * @param $data (mixed) event data - * @param $action (callback) (optional, default=NULL) default action, a php callback function - * @param $canPreventDefault (bool) (optional, default=true) can hooks prevent the default action + * @param $name string name for the event + * @param $data mixed event data + * @param $action callback (optional, default=NULL) default action, a php callback function + * @param $canPreventDefault bool (optional, default=true) can hooks prevent the default action * - * @return (mixed) the event results value after all event processing is complete + * @return mixed the event results value after all event processing is complete * by default this is the return value of the default action however * it can be set or modified by event handler hooks */ diff --git a/sources/inc/feedcreator.class.php b/sources/inc/feedcreator.class.php index 670a1bc..b90da57 100644 --- a/sources/inc/feedcreator.class.php +++ b/sources/inc/feedcreator.class.php @@ -185,6 +185,8 @@ class HtmlDescribable { */ var $descriptionTruncSize; + var $description; + /** * Returns a formatted description field, depending on descriptionHtmlSyndicated and * $descriptionTruncSize properties @@ -222,7 +224,7 @@ class FeedHtmlField { /** * Creates a new instance of FeedHtmlField. - * @param $string: if given, sets the rawFieldContent property + * @param string $parFieldContent: if given, sets the rawFieldContent property */ function FeedHtmlField($parFieldContent) { if ($parFieldContent) { @@ -267,8 +269,14 @@ class FeedHtmlField { * @author Kai Blankenhorn */ class UniversalFeedCreator extends FeedCreator { + /** @var FeedCreator */ var $_feed; + /** + * Sets format + * + * @param string $format + */ function _setFormat($format) { switch (strtoupper($format)) { @@ -344,7 +352,7 @@ class UniversalFeedCreator extends FeedCreator { * Creates a syndication feed based on the items previously added. * * @see FeedCreator::addItem() - * @param string format format the feed should comply to. Valid values are: + * @param string $format format the feed should comply to. Valid values are: * "PIE0.1", "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3", "HTML", "JS" * @return string the contents of the feed. */ @@ -358,10 +366,10 @@ class UniversalFeedCreator extends FeedCreator { * header may be sent to redirect the use to the newly created file. * @since 1.4 * - * @param string format format the feed should comply to. Valid values are: + * @param string $format format the feed should comply to. Valid values are: * "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM", "ATOM0.3", "HTML", "JS" - * @param string filename optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). - * @param boolean displayContents optional send the content of the file or not. If true, the file will be sent in the body of the response. + * @param string $filename optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). + * @param boolean $displayContents optional send the content of the file or not. If true, the file will be sent in the body of the response. */ function saveFeed($format="RSS0.91", $filename="", $displayContents=true) { $this->_setFormat($format); @@ -376,10 +384,10 @@ class UniversalFeedCreator extends FeedCreator { * before anything else, especially before you do the time consuming task to build the feed * (web fetching, for example). * - * @param string format format the feed should comply to. Valid values are: + * @param string $format format the feed should comply to. Valid values are: * "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3". - * @param filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). - * @param timeout int optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour) + * @param string $filename optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). + * @param int $timeout optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour) */ function useCached($format="RSS0.91", $filename="", $timeout=3600) { $this->_setFormat($format); @@ -390,7 +398,7 @@ class UniversalFeedCreator extends FeedCreator { /** * Outputs feed to the browser - needed for on-the-fly feed generation (like it is done in WordPress, etc.) * - * @param format string format the feed should comply to. Valid values are: + * @param $format string format the feed should comply to. Valid values are: * "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3". */ function outputFeed($format='RSS0.91') { @@ -422,7 +430,13 @@ class FeedCreator extends HtmlDescribable { /** * Optional attributes of a feed. */ - var $syndicationURL, $image, $language, $copyright, $pubDate, $lastBuildDate, $editor, $editorEmail, $webmaster, $category, $docs, $ttl, $rating, $skipHours, $skipDays; + var $syndicationURL, $language, $copyright, $pubDate, $lastBuildDate, $editor, $editorEmail, $webmaster, $category, $docs, $ttl, $rating, $skipHours, $skipDays; + /** + * Optional attribute of a feed + * + * @var FeedImage + */ + var $image = null; /** * The url of the external xsl stylesheet used to format the naked rss feed. @@ -430,13 +444,18 @@ class FeedCreator extends HtmlDescribable { */ var $xslStyleSheet = ""; + /** + * Style sheet for rss feed + */ + var $cssStyleSheet = ""; + /** * @access private + * @var FeedItem[] */ var $items = Array(); - /** * This feed's MIME content type. * @since 1.4 @@ -466,7 +485,7 @@ class FeedCreator extends HtmlDescribable { /** * Adds an FeedItem to the feed. * - * @param object FeedItem $item The FeedItem to add to the feed. + * @param FeedItem $item The FeedItem to add to the feed. * @access public */ function addItem($item) { @@ -482,8 +501,8 @@ class FeedCreator extends HtmlDescribable { * If the string is already shorter than $length, it is returned unchanged. * * @static - * @param string string A string to be truncated. - * @param int length the maximum length the string should be truncated to + * @param string $string A string to be truncated. + * @param int $length the maximum length the string should be truncated to * @return string the truncated string */ function iTrunc($string, $length) { @@ -527,8 +546,8 @@ class FeedCreator extends HtmlDescribable { /** * Creates a string containing all additional elements specified in * $additionalElements. - * @param elements array an associative array containing key => value pairs - * @param indentString string a string that will be inserted before every generated line + * @param $elements array an associative array containing key => value pairs + * @param $indentString string a string that will be inserted before every generated line * @return string the XML tags corresponding to $additionalElements */ function _createAdditionalElements($elements, $indentString="") { @@ -541,6 +560,9 @@ class FeedCreator extends HtmlDescribable { return $ae; } + /** + * Create elements for stylesheets + */ function _createStylesheetReferences() { $xml = ""; if ($this->cssStyleSheet) $xml .= "cssStyleSheet."\" type=\"text/css\"?>\n"; @@ -610,8 +632,8 @@ class FeedCreator extends HtmlDescribable { * before anything else, especially before you do the time consuming task to build the feed * (web fetching, for example). * @since 1.4 - * @param filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). - * @param timeout int optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour) + * @param $filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). + * @param $timeout int optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour) */ function useCached($filename="", $timeout=3600) { $this->_timeout = $timeout; @@ -629,8 +651,8 @@ class FeedCreator extends HtmlDescribable { * header may be sent to redirect the user to the newly created file. * @since 1.4 * - * @param filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). - * @param redirect boolean optional send an HTTP redirect header or not. If true, the user will be automatically redirected to the created file. + * @param $filename string optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()). + * @param $displayContents boolean optional send an HTTP redirect header or not. If true, the user will be automatically redirected to the created file. */ function saveFeed($filename="", $displayContents=true) { if ($filename=="") { @@ -667,6 +689,7 @@ class FeedCreator extends HtmlDescribable { * Usually, you won't need to use this. */ class FeedDate { + /** @var int */ var $unix; /** @@ -726,7 +749,7 @@ class FeedDate { /** * Gets the date stored in this FeedDate as an RFC 822 date. * - * @return a date in RFC 822 format + * @return string a date in RFC 822 format */ function rfc822() { //return gmdate("r",$this->unix); @@ -738,7 +761,7 @@ class FeedDate { /** * Gets the date stored in this FeedDate as an ISO 8601 date. * - * @return a date in ISO 8601 (RFC 3339) format + * @return string a date in ISO 8601 (RFC 3339) format */ function iso8601() { $date = gmdate("Y-m-d\TH:i:sO",$this->unix); @@ -751,7 +774,7 @@ class FeedDate { /** * Gets the date stored in this FeedDate as unix time stamp. * - * @return a date as a unix time stamp + * @return int a date as a unix time stamp */ function unix() { return $this->unix; @@ -777,7 +800,7 @@ class RSSCreator10 extends FeedCreator { $feed = "encoding."\"?>\n"; $feed.= $this->_createGeneratorComment(); if ($this->cssStyleSheet=="") { - $cssStyleSheet = "http://www.w3.org/2000/08/w3c-synd/style.css"; + $this->cssStyleSheet = "http://www.w3.org/2000/08/w3c-synd/style.css"; } $feed.= $this->_createStylesheetReferences(); $feed.= "encoding = "utf-8"; } + /** + * Build content + * @return string + */ function createFeed() { $feed = "encoding."\"?>\n"; $feed.= $this->_createStylesheetReferences(); $feed.= "\n"; $feed.= " ".FeedCreator::iTrunc(htmlspecialchars($this->title),100)."\n"; - $this->truncSize = 500; + $this->descriptionTruncSize = 500; $feed.= " ".$this->getDescription()."\n"; $feed.= " ".$this->link."\n"; $icnt = count($this->items); @@ -1091,6 +1118,10 @@ class AtomCreator10 extends FeedCreator { $this->encoding = "utf-8"; } + /** + * Build content + * @return string + */ function createFeed() { $feed = "encoding."\"?>\n"; $feed.= $this->_createGeneratorComment(); @@ -1174,6 +1205,10 @@ class AtomCreator03 extends FeedCreator { $this->encoding = "utf-8"; } + /** + * Build content + * @return string + */ function createFeed() { $feed = "encoding."\"?>\n"; $feed.= $this->_createGeneratorComment(); @@ -1281,6 +1316,7 @@ class MBOXCreator extends FeedCreator { */ function createFeed() { $icnt = count($this->items); + $feed = ""; for ($i=0; $i<$icnt; $i++) { if ($this->items[$i]->author!="") { $from = $this->items[$i]->author; @@ -1331,6 +1367,10 @@ class OPMLCreator extends FeedCreator { $this->encoding = "utf-8"; } + /** + * Build content + * @return string + */ function createFeed() { $feed = "encoding."\"?>\n"; $feed.= $this->_createGeneratorComment(); @@ -1441,6 +1481,7 @@ class HTMLCreator extends FeedCreator { } //set an openInNewWindow_token_to be inserted or not + $targetInsert = ""; if ($this->openInNewWindow) { $targetInsert = " target='_blank'"; } @@ -1568,6 +1609,14 @@ class JSCreator extends HTMLCreator { * @author Andreas Gohr */ class DokuWikiFeedCreator extends UniversalFeedCreator{ + + /** + * Build content + * + * @param string $format + * @param string $encoding + * @return string + */ function createFeed($format = "RSS0.91",$encoding='iso-8859-15') { $this->_setFormat($format); $this->_feed->encoding = $encoding; diff --git a/sources/inc/fetch.functions.php b/sources/inc/fetch.functions.php index 207ad9e..c61c545 100644 --- a/sources/inc/fetch.functions.php +++ b/sources/inc/fetch.functions.php @@ -15,13 +15,15 @@ * * @author Andreas Gohr * @author Ben Coburn + * @author Gerry Weissbach * @param string $file local file to send * @param string $mime mime type of the file * @param bool $dl set to true to force a browser download * @param int $cache remaining cache time in seconds (-1 for $conf['cache'], 0 for no-cache) * @param bool $public is this a public ressource or a private one? + * @param string $orig original file to send - the file name will be used for the Content-Disposition */ -function sendFile($file, $mime, $dl, $cache, $public = false) { +function sendFile($file, $mime, $dl, $cache, $public = false, $orig = null) { global $conf; // send mime headers header("Content-Type: $mime"); @@ -62,15 +64,20 @@ function sendFile($file, $mime, $dl, $cache, $public = false) { $fmtime = @filemtime($file); http_conditionalRequest($fmtime); + // Use the current $file if is $orig is not set. + if ( $orig == null ) { + $orig = $file; + } + //download or display? if($dl) { - header('Content-Disposition: attachment; filename="'.utf8_basename($file).'";'); + header('Content-Disposition: attachment; filename="'.utf8_basename($orig).'";'); } else { - header('Content-Disposition: inline; filename="'.utf8_basename($file).'";'); + header('Content-Disposition: inline; filename="'.utf8_basename($orig).'";'); } //use x-sendfile header to pass the delivery to compatible webservers - if(http_sendfile($file)) exit; + http_sendfile($file); // send file contents $fp = @fopen($file, "rb"); diff --git a/sources/inc/form.php b/sources/inc/form.php index a4cd2e6..9cd0491 100644 --- a/sources/inc/form.php +++ b/sources/inc/form.php @@ -47,15 +47,11 @@ class Doku_Form { * with up to four parameters is deprecated, instead the first parameter * should be an array with parameters. * - * @param mixed $params Parameters for the HTML form element; Using the - * deprecated calling convention this is the ID - * attribute of the form - * @param string $action (optional, deprecated) submit URL, defaults to - * current page - * @param string $method (optional, deprecated) 'POST' or 'GET', default - * is POST - * @param string $enctype (optional, deprecated) Encoding type of the - * data + * @param mixed $params Parameters for the HTML form element; Using the deprecated + * calling convention this is the ID attribute of the form + * @param bool|string $action (optional, deprecated) submit URL, defaults to current page + * @param bool|string $method (optional, deprecated) 'POST' or 'GET', default is POST + * @param bool|string $enctype (optional, deprecated) Encoding type of the data * @author Tom N Harris */ function Doku_Form($params, $action=false, $method=false, $enctype=false) { @@ -176,7 +172,7 @@ class Doku_Form { * Gets the position of the first of a type of element. * * @param string $type Element type to look for. - * @return array pseudo-element if found, false otherwise + * @return int position of element if found, otherwise false * @author Tom N Harris */ function findElementByType($type) { @@ -193,7 +189,7 @@ class Doku_Form { * Gets the position of the element with an ID attribute. * * @param string $id ID of the element to find. - * @return array pseudo-element if found, false otherwise + * @return int position of element if found, otherwise false * @author Tom N Harris */ function findElementById($id) { @@ -211,7 +207,7 @@ class Doku_Form { * * @param string $name Attribute name. * @param string $value Attribute value. - * @return array pseudo-element if found, false otherwise + * @return int position of element if found, otherwise false * @author Tom N Harris */ function findElementByAttribute($name, $value) { @@ -230,7 +226,7 @@ class Doku_Form { * first (underflow) or last (overflow) element. * * @param int $pos 0-based index - * @return arrayreference pseudo-element + * @return array reference pseudo-element * @author Tom N Harris */ function &getElementAt($pos) { @@ -565,10 +561,11 @@ function form_makeListboxField($name, $values, $selected='', $label=null, $id='' if (is_null($label)) $label = $name; $options = array(); reset($values); - if (is_null($selected) || $selected == '') + if (is_null($selected) || $selected == '') { $selected = array(); - elseif (!is_array($selected)) + } elseif (!is_array($selected)) { $selected = array($selected); + } // FIXME: php doesn't know the difference between a string and an integer if (is_string(key($values))) { foreach ($values as $val=>$text) { @@ -576,11 +573,13 @@ function form_makeListboxField($name, $values, $selected='', $label=null, $id='' } } else { foreach ($values as $val) { - if (is_array($val)) - @list($val,$text) = $val; - else + $disabled = false; + if (is_array($val)) { + @list($val,$text,$disabled) = $val; + } else { $text = null; - $options[] = array($val,$text,in_array($val,$selected)); + } + $options[] = array($val,$text,in_array($val,$selected),$disabled); } } $elem = array('_elem'=>'listboxfield', '_options'=>$options, '_text'=>$label, '_class'=>$class, @@ -934,11 +933,12 @@ function form_listboxfield($attrs) { $s .= ''; if($REV) echo ''; - if (!empty($_SERVER['REMOTE_USER'])) { + if ($INPUT->server->str('REMOTE_USER')) { echo ''; } @@ -1775,11 +1881,14 @@ function tpl_media() { */ function tpl_classes() { global $ACT, $conf, $ID, $INFO; + /** @var Input $INPUT */ + global $INPUT; + $classes = array( 'dokuwiki', 'mode_'.$ACT, 'tpl_'.$conf['template'], - !empty($_SERVER['REMOTE_USER']) ? 'loggedIn' : '', + $INPUT->server->bool('REMOTE_USER') ? 'loggedIn' : '', $INFO['exists'] ? '' : 'notFound', ($ID == $conf['start']) ? 'home' : '', ); diff --git a/sources/inc/toolbar.php b/sources/inc/toolbar.php index b588d44..7cc29e8 100644 --- a/sources/inc/toolbar.php +++ b/sources/inc/toolbar.php @@ -56,7 +56,7 @@ function toolbar_JSdefines($varname){ 'type' => 'format', 'title' => $lang['qb_code'], 'icon' => 'mono.png', - 'key' => 'c', + 'key' => 'm', 'open' => "''", 'close' => "''", 'block' => false @@ -241,10 +241,12 @@ function toolbar_JSdefines($varname){ function toolbar_signature(){ global $conf; global $INFO; + /** @var Input $INPUT */ + global $INPUT; $sig = $conf['signature']; $sig = dformat(null,$sig); - $sig = str_replace('@USER@',$_SERVER['REMOTE_USER'],$sig); + $sig = str_replace('@USER@',$INPUT->server->str('REMOTE_USER'),$sig); $sig = str_replace('@NAME@',$INFO['userinfo']['name'],$sig); $sig = str_replace('@MAIL@',$INFO['userinfo']['mail'],$sig); $sig = str_replace('@DATE@',dformat(),$sig); diff --git a/sources/install.php b/sources/install.php index 779084c..acc96d3 100644 --- a/sources/install.php +++ b/sources/install.php @@ -57,6 +57,7 @@ $dokuwiki_hash = array( '2012-09-10' => 'eb0b3fc90056fbc12bac6f49f7764df3', '2013-05-10' => '7b62b75245f57f122d3e0f8ed7989623', '2013-12-08' => '263c76af309fbf083867c18a34ff5214', + '2014-05-05' => '263c76af309fbf083867c18a34ff5214', ); diff --git a/sources/lib/exe/ajax.php b/sources/lib/exe/ajax.php index 6e2011c..1000094 100644 --- a/sources/lib/exe/ajax.php +++ b/sources/lib/exe/ajax.php @@ -41,7 +41,6 @@ if(function_exists($callfn)){ * @author Andreas Gohr */ function ajax_qsearch(){ - global $conf; global $lang; global $INPUT; @@ -89,15 +88,12 @@ function ajax_qsearch(){ * @author Mike Frysinger */ function ajax_suggestions() { - global $conf; - global $lang; global $INPUT; $query = cleanID($INPUT->post->str('q')); if(empty($query)) $query = cleanID($INPUT->get->str('q')); if(empty($query)) return; - $data = array(); $data = ft_pageLookup($query); if(!count($data)) return; $data = array_keys($data); @@ -214,7 +210,6 @@ function ajax_medians(){ * @author Andreas Gohr */ function ajax_medialist(){ - global $conf; global $NS; global $INPUT; @@ -234,13 +229,15 @@ function ajax_medialist(){ * @author Kate Arzamastseva */ function ajax_mediadetails(){ - global $DEL, $NS, $IMG, $AUTH, $JUMPTO, $REV, $lang, $fullscreen, $conf, $INPUT; + global $IMG, $JUMPTO, $REV, $fullscreen, $INPUT; $fullscreen = true; require_once(DOKU_INC.'lib/exe/mediamanager.php'); + $image = ''; if ($INPUT->has('image')) $image = cleanID($INPUT->str('image')); if (isset($IMG)) $image = $IMG; if (isset($JUMPTO)) $image = $JUMPTO; + $rev = false; if (isset($REV) && !$JUMPTO) $rev = $REV; html_msgarea(); @@ -255,6 +252,7 @@ function ajax_mediadiff(){ global $NS; global $INPUT; + $image = ''; if ($INPUT->has('image')) $image = cleanID($INPUT->str('image')); $NS = $INPUT->post->str('ns'); $auth = auth_quickaclcheck("$NS:*"); @@ -264,6 +262,7 @@ function ajax_mediadiff(){ function ajax_mediaupload(){ global $NS, $MSG, $INPUT; + $id = ''; if ($_FILES['qqfile']['tmp_name']) { $id = $INPUT->post->str('mediaid', $_FILES['qqfile']['name']); } elseif ($INPUT->get->has('qqfile')) { @@ -280,44 +279,33 @@ function ajax_mediaupload(){ if ($_FILES['qqfile']['error']) unset($_FILES['qqfile']); + $res = false; if ($_FILES['qqfile']['tmp_name']) $res = media_upload($NS, $AUTH, $_FILES['qqfile']); if ($INPUT->get->has('qqfile')) $res = media_upload_xhr($NS, $AUTH); - if ($res) $result = array('success' => true, - 'link' => media_managerURL(array('ns' => $ns, 'image' => $NS.':'.$id), '&'), - 'id' => $NS.':'.$id, 'ns' => $NS); - - if (!$result) { + if($res) { + $result = array( + 'success' => true, + 'link' => media_managerURL(array('ns' => $ns, 'image' => $NS . ':' . $id), '&'), + 'id' => $NS . ':' . $id, + 'ns' => $NS + ); + } else { $error = ''; - if (isset($MSG)) { - foreach($MSG as $msg) $error .= $msg['msg']; + if(isset($MSG)) { + foreach($MSG as $msg) { + $error .= $msg['msg']; + } } - $result = array('error' => $msg['msg'], 'ns' => $NS); + $result = array( + 'error' => $error, + 'ns' => $NS + ); } $json = new JSON; echo htmlspecialchars($json->encode($result), ENT_NOQUOTES); } -function dir_delete($path) { - if (!is_string($path) || $path == "") return false; - - if (is_dir($path) && !is_link($path)) { - if (!$dh = @opendir($path)) return false; - - while ($f = readdir($dh)) { - if ($f == '..' || $f == '.') continue; - dir_delete("$path/$f"); - } - - closedir($dh); - return @rmdir($path); - } else { - return @unlink($path); - } - - return false; -} - /** * Return sub index for index view * @@ -359,13 +347,11 @@ function ajax_linkwiz(){ $id = cleanID($id); $nsd = utf8_encodeFN(str_replace(':','/',$ns)); - $idd = utf8_encodeFN(str_replace(':','/',$id)); $data = array(); if($q && !$ns){ // use index to lookup matching pages - $pages = array(); $pages = ft_pageLookup($id,true); // result contains matches in pages and namespaces diff --git a/sources/lib/exe/css.php b/sources/lib/exe/css.php index c96dedd..30d0d18 100644 --- a/sources/lib/exe/css.php +++ b/sources/lib/exe/css.php @@ -56,7 +56,7 @@ function css_out(){ } // cache influencers - $tplinc = tpl_basedir($tpl); + $tplinc = tpl_incdir($tpl); $cache_files = getConfigFiles('main'); $cache_files[] = $tplinc.'style.ini'; $cache_files[] = $tplinc.'style.local.ini'; // @deprecated @@ -70,6 +70,7 @@ function css_out(){ $files[$mediatype] = array(); // load core styles $files[$mediatype][DOKU_INC.'lib/styles/'.$mediatype.'.css'] = DOKU_BASE.'lib/styles/'; + // load jQuery-UI theme if ($mediatype == 'screen') { $files[$mediatype][DOKU_INC.'lib/scripts/jquery/jquery-ui-theme/smoothness.css'] = DOKU_BASE.'lib/scripts/jquery/jquery-ui-theme/'; @@ -132,6 +133,9 @@ function css_out(){ $css = ob_get_contents(); ob_end_clean(); + // strip any source maps + stripsourcemaps($css); + // apply style replacements $css = css_applystyle($css, $styleini['replacements']); @@ -456,8 +460,9 @@ class DokuCssFile { if (defined('DOKU_UNITTEST')) { $basedir[] = realpath(TMP_DIR); } - $regex = '#^('.join('|',$basedir).')#'; + $basedir = array_map('preg_quote_cb', $basedir); + $regex = '/^('.join('|',$basedir).')/'; $this->relative_path = preg_replace($regex, '', dirname($this->filepath)); } @@ -550,7 +555,7 @@ function css_compress($css){ $css = preg_replace_callback('#(/\*)(.*?)(\*/)#s','css_comment_cb',$css); //strip (incorrect but common) one line comments - $css = preg_replace('/(?advise_before()) { - sendFile($data['file'], $data['mime'], $data['download'], $data['cache'], $data['ispublic']); + sendFile($data['file'], $data['mime'], $data['download'], $data['cache'], $data['ispublic'], $data['orig']); } // Do something after the download finished. $evt->advise_after(); // will not be emitted on 304 or x-sendfile diff --git a/sources/lib/exe/js.php b/sources/lib/exe/js.php index 040b887..bec12ef 100644 --- a/sources/lib/exe/js.php +++ b/sources/lib/exe/js.php @@ -44,6 +44,7 @@ function js_out(){ DOKU_INC.'lib/scripts/jquery/jquery.cookie.js', DOKU_INC."lib/scripts/jquery/jquery-ui$min.js", DOKU_INC."lib/scripts/jquery/jquery-migrate$min.js", + DOKU_INC.'inc/lang/'.$conf['lang'].'/jquery.ui.datepicker.js', DOKU_INC."lib/scripts/fileuploader.js", DOKU_INC."lib/scripts/fileuploaderextended.js", DOKU_INC.'lib/scripts/helpers.js', @@ -112,6 +113,7 @@ function js_out(){ // load files foreach($files as $file){ + if(!file_exists($file)) continue; $ismin = (substr($file,-7) == '.min.js'); $debugjs = ($conf['allowdebug'] && strpos($file, DOKU_INC.'lib/scripts/') !== 0); @@ -135,6 +137,9 @@ function js_out(){ $js = ob_get_contents(); ob_end_clean(); + // strip any source maps + stripsourcemaps($js); + // compress whitespace and comments if($conf['compress']){ $js = js_compress($js); @@ -161,7 +166,10 @@ function js_load($file){ // is it a include_once? if($match[1]){ $base = utf8_basename($ifile); - if($loaded[$base]) continue; + if($loaded[$base]){ + $data = str_replace($match[0], '' ,$data); + continue; + } $loaded[$base] = true; } @@ -218,6 +226,12 @@ function js_pluginstrings() { return $pluginstrings; } +/** + * Return an two-dimensional array with strings from the language file of current active template. + * + * - $lang['js'] must be an array. + * - Nothing is returned for template without an entry for $lang['js'] + */ function js_templatestrings() { global $conf; $templatestrings = array(); diff --git a/sources/lib/exe/mediamanager.php b/sources/lib/exe/mediamanager.php index d94a24c..7044232 100644 --- a/sources/lib/exe/mediamanager.php +++ b/sources/lib/exe/mediamanager.php @@ -57,7 +57,7 @@ } // give info on PHP caught upload errors - if($_FILES['upload']['error']){ + if(!empty($_FILES['upload']['error'])){ switch($_FILES['upload']['error']){ case 1: case 2: @@ -71,7 +71,7 @@ } // handle upload - if($_FILES['upload']['tmp_name']){ + if(!empty($_FILES['upload']['tmp_name'])){ $JUMPTO = media_upload($NS,$AUTH); if($JUMPTO) $NS = getNS($JUMPTO); } diff --git a/sources/lib/images/fileicons/32x32/7z.png b/sources/lib/images/fileicons/32x32/7z.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba7da94a99e3cbf5535d25a991ad71640c235ff GIT binary patch literal 992 zcmV<610Vc}P)Y}j6o#L3$Dg$mQqw4QnxqabW*dom0dY$Ro0bigsHkL>4U4kjW0n8FSARfR)3kwF zhO+1mvS<>zK&*lU6-r8)3_-1BLrfcN&t+kI;@D$*?1Wdkn$gwVbKdjbbI&~^?7@@C zX1_t?b!}N_`hf-nB|@cAx&79~i*EvDx2waMY*rr@wzs$S^&2;`fa>Jb)9@b9x*GS| z`U6Cy_xQDDGJb+D=I6PbPBS|*b76jA;rsNZORu$4qLH1d%dV6{DTQGeu19?hfG9;i zUmzNdGIQq4*@auTHkyKUBw#~CP)Z>pu1EcQ00DwWf;@hlBNmHsc6vJcWhV2$i9}lh z{f;{PJ|E$Mu&u-^snlpDn>CwBc$^8SzH*?x=J`{nxPJ2{QacxxW$|`84R8zy1Nk-t zbZrmCkwAX=V|F)xunpU1Rj}utOr%J@@d?S(r(4!r)gA9Mn_NAa}66TgZVkGpC z;p3xtgJDdw$i3w?Fg(njn_~9d6c`@vEw5pkMZCc%P z{VtLC7+V{USXo@f8}O4lpJXC2j`I0YK0gzQaZ=}#cmsY`7FXHYctj*VMk&8;+i_C~ zTe7*D7Zu8b7dU$2M~=p;eE;6n`;&(1_s@(^GBplpi}K)$pucN5p1l(QDCK$j+gFJ4 zpy_-(1&y}K_#-FxikcX`5vZ3`JGycKPjCRl3*G92)}TvJE>v$ur4FuuSVatf2*j}E z?sz3@A7T}q)pVtRG$~*e@dkoulq&*)1y-@v8>oX5FxUlusO$bW=7GVkO+a^OZ`$O5 zv41;!WsHGAT(?OA_{z0g(!kP{{&PV2Lj3ggZLA)9G$qxwB7)Fk5;m5n#5;F5C`9*4 zpwE`H+coWqz_(Xl#r$=V!$vGI1C#H&RiG7DuC=Q2`Mc6~-Yr}cXf|4R+&F*bn(oOt z-Fo&;YB&+<)p=h84%2z-7IdlG?VLB~NLw-v_C4)yL0lzQFOfUh_cT?|ozlq@4H@xMTt)Cf2C?T3tisj6WAsQw27mv52SXC=A- O0000%zHaW_zn=$WuRpaz_eo>w>;C7( zON0>nU%xS&I{7g_FD>!S^fX^&vr|jU%fC%uzy4)6CBk&FDZ7*sDJ7O=#cs_x076Pi zr84Psn(X=W7nUDB{I_GVkpL|dLLj9?2obwA#{&pp*d3-=++b{Mj0cF18Y)PjzwOWnY z*;%yK7-P^{x7zl06|EtaI?kOtKccm6_aWFPfb0M;nji?!S~EXC&&tXQYin!NYBh?* zO^k7HoFR60D)n(j@A1(!ZsMe&R;mTCu&_WTlOdf>v$0X;%^QX5j^Mf;j+3m9Q)*9* zI1oUf6u$4HlwxLPhC-ph^XGqZ>(+N%yqF=G^hhS_0KV@NbOH!#e_PN=tQragLBQhT zB8fx-tu1cf{()rDV|e&IY&(H%CkTQ7rBs`bUMU?b2vtY{DJ8X48!2t16o6o8$f_&l2YY-R2wH(g@jZO{~pMJ&ta@uMfPOY-RGD4UxlQmIrUjn&{W;JPkXu1uk{ ziVa{%3)gi+ujhRRVK_Nm&&Bmz4r0RW7hu36X}{NWEP$KeKjDwRUUAs=`ROq(orO8$42${1?ZgE{N2l8)SQ9pKraVPh$v;kfZ^-F0Nqv- zrA(ad=noL1en;(pFYtc;!#yA73WfDw|CaA83oegqu1-yT1pF7NfPl*7PnCD+lMf;f zkOwFPNTCpjN-qVD0VjduygSL`sQeS)oUD4SC@lu9LL zW@gY@V~jy-T^l<)yJ!uu*fH+h`4O#kqYpu!1Y{EdqX~iltu=FVbF8kevcA4fsZ=7D z+rk(J#~EU8uUNJ-y2VGwya`i=TB#a=`T2R0$t3Z3oXyPwuU{)%cLdkX)FT=#6YzbXpqYTM`rCqL#;T$~5CkkN zED(uA(Awhm?H`CnJ%)$h!L}pVc7z}ZP)arU=vLC9l2FwtAf=>K^6|X)aGWT%?O@xH zn$%UhuzjSx0!?KT_~qzFMn)(U3fQ)Tlm+(pcaYLXN&yIlhODwue$e9MKm_)7cM(D` zJ3AYy9q;Y#Hux}IjyD~0;7!uxaycx^=F!8)pb2$iv>6gHON77!e=}-i2eE*m~{(8w_X+3d!zf6KR41sBIOS0*Pv1paHQfPmt~Pn37z z+8kU}94#cm3`3!DIs@%FF@Jg@&Q5KZ~uHJ{rL8T&x7{zLVD-}2dWlWIeE P00000NkvXXu0mjf2WaZ* literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/bz2.png b/sources/lib/images/fileicons/32x32/bz2.png new file mode 100644 index 0000000000000000000000000000000000000000..7be9b7c0627d15f23e2359f515b3aba10f6c7d0e GIT binary patch literal 1001 zcmV-xscn>j!=+B8!4-lnzV z_tNr1M5KBDwPrALoG+)QxHK`r_}JL_sp;t-CN5rlGl+?Lbjqb&DTPuB!!SY*R|i0p zqEIN3N~IV(efrGw?b|Cmob?6ZiHM+-LPSCjcRhdri9-pVJjs(zr#Uk+lKN_9=Aj>m zKme@{SK_f4W{2r9@%rd!?@TUd?F13=2cTMt0axdxlP9@x>lRYW3){ANZ(;)AC}0AG z006pnhT;pLF#jo=t3P^%y<8Q%xn~2T48Q#u!>3N|(zl%;j|DTJw;zG6HLCV3E?lLH zUwMAC3(MLdojOFi*95>?+rawsDe1IHTXm6Na+4%qo7~d3ZF*$FNMdj?^C?h|_2 zAJKiRmuSMovP#^aUjie-_}L-G&klhR;r{#*mQ^B}FzG(lOHcbF{<`~tV@FAo0F-#+ z*&p{vX8KrLdCbD>BGI-uqvwVh$o8XRaa1hMK(?RJbHha2;w;QAvbOS=WTuaDVcD}2 zrV{RoW+yJHR65Ud}ibN6}AW_(>K4=ZP43(mDGb*)z2E;C5#M?m( zkM4$7vW_8k$)C+o49E@!>=Mzo1R50zfMA1Ns`UnH{{Rd&A>O{{`PavR!KMd5H)wAH zV!+sb9I*;UM<=1%BmrWT+AV2d>uT#UpknR({LLNgCVMm`j;@FxG#P~T z0vqKMADhV+Kk{uL_fZHaiy*M!SG8T~0y037|4;J3a{YgS>|n#(*|#6C{ENea_oMnB X%dCQ(6;O0k00000NkvXXu0mjf*68KI literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/c.png b/sources/lib/images/fileicons/32x32/c.png new file mode 100644 index 0000000000000000000000000000000000000000..0a01f8f3a69d59b17d7e2c13328f3ed5cca45fd4 GIT binary patch literal 945 zcmV;i15W&jP)&bomAL+-7t@NF)~=h^JFmDSZ>ayM>#F-VDaI@y$6N{N&b%d$eZ<`@7WC8biC zWHL$i;>Am=k01ZtHQBxZEfYc@r9=o3x;6U)2w>8kq*&Z0l}d5x{Q2ageEwBGh=Bl6 zThk^S2k)5IQX+HV!l`_r@VXnq?hha%#Xxh+Cuh%c|KUSKBQLbpe3#1sOamTJ8USD# zYbYWCNGW-t8R2}G9%a(LnQ>)dOpPxr- zjWGtTb*t^|RnZy}iId#9^AlR@P9K6X0c00|(F8$&)|$n|Mb_8X+1%WuR;y7g?qH0A z<4mx>U#a&qy2r=BxCxVnTB#Pm($W%{Oon7K$@X@cw{I1$JB90dI8MCYPpO_7aVUU5 zDSY2YDaG8}9BXT9ym;{kH*fyH<;xl3agTVs4&eJfK{tS~##@4JV%1O}2m+Rumx;w< zXl-%(_K(El9+Q(NuN&yHaCak(re$eCNPyqYYDnbYr78XL4 zW#au^e4T!4s2(ox%VD1g~p&-ne%*BrHd_GyYMXF@A5+J5`_ z`;O=I?A=Iy?5H1)`oU0p!GCH0JAmC4uAv5{XYWRffj<82VY}cch$x5Fp#TCZUw*8- zD<6H(_W*f_LVy$sfvEJnYP)|AI1QZq7ngh+c-j76AiC7>y3g%LYzIK4{YUj5M6RBX Tux!tB00000NkvXXu0mjfR|SW0aLfhw)DOF$3W-ZAQBlc)D~UwZdoKA4LV5vJ^i0zR z)pFV%bD-QoMLBYz6_KhOoY<-3)Y+XG4*saW)>%72eWcOu&d$91%=3QCtl$moLb3P= zA-*(PV;Bbp5J(|VNP%N6`!q(Q7xp)755s8iq*U4_olbN4!iChYg~E$LBq9ln z+gg}#9Q+f0TZ!z&i>C|4;>%tV_Fw{XtQcs``S{#9?mc*bXy%31ns4)YfN8)7$`J%i z(}!X#0#Zs|?N<$#6cC>3gpmLGDB=V7gtPjX?^*#>NJ(c6ZSjB;wHPiIXRpnVD(N z*IIKrodRQqrePaabM>ujrCcVL%Mt{^p(-R237$Uv9nob+#;OB-zHCdUHT8O(`T2RY z))-^ZTDRNYUJb1wnLNdvJ3pbd?zSNqk$~(WU^HPEqP1pmagp`)bv8FQsn_e2N;??i z;5ZZP?^he+jPA1$88>m#P%G6Yu(Y&9Hk&1tO0m6N;q_~U=S|^xK91uy#wpcTBaTEM zREi)7P)ad3H^vGSnwp|gsbJd+O_K_tzr|f zq=n~s9ozGWLD-p`p6}uL9!G&NqY@bNNP5^d9gD#14^Q~>@0T1mKK&%k)w8h`7>qxD z{;umeGkbSv|JZ35_3=T5qxxeXVtC7V>jdncaE%<8nY}yE*HQfu=`ftYuzh=&;kYp{ z$bJ_A0o5-)QvTHs-ye8@JVGHr3WY#a`(Ab2zYClJPW_KA-v*v{{uhWIHT>Rl`!VAH dsCNFS{s&OEsrjkkCP)AP002ovPDHLkV1jGn%vb;b literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/conf.png b/sources/lib/images/fileicons/32x32/conf.png new file mode 100644 index 0000000000000000000000000000000000000000..91a8a10de17ddd89b4944e0468cfba9555ef474e GIT binary patch literal 832 zcmV-G1Hb%%rGP~U^yQQ3Dv-5f9%$a-d&NAGfqo8Soa31HhXt+98!65nb>5`_VBNW5M@Ngjanp@o8xZAM$w&t7>j( zb+weAn;Y>`LT1NJ**WLnoI_C*-;X&502t>uJNt!jI1Duwi?6P&{cvp7m4F4t7&zx( zjQM`d@c_U8bUp6E$;l}qkqF|0gW=DG!m%3(PXetzCLVTnBJ?C=DUlc&>Mdwm#Yv*W zod9pi2h2II`}?uDvI16*3n2tP=JNpX3_u9LnFj%?pCN0B0OuU%ziSwXMlleLHuQ^Y zC-3xDfb2&gh`Tc6o>P%a^%CMAOiNPydC#1jcm18#ll@UU;c@ufhyRDz-?&a?+XgoLW%pj-y8 z&oRATO(s3<1tyTZWk>R2uF=7iU<91!y-@U>V3lg1GdMp7y47mFYw zycr#Bp8~Qm6DgNAud#uBfIGrwclV1e*Ao$l2xDVu?CtGZ?Lr8o)8p9L*~aALRQm`_ zj8A$R7*9_$v}LBUj{HVJeZcNCn_C(fW5{N5(6=`&A0Z+LA&|}Fu%&O<@g=Cs9hOGsJo}f^#XZ^ zM1U*90AsAyOo68W`T%s}{%{K5Nd7Ni4u1$a@9k~IUjQ}vNA*7)S$VEc7cQXy0000< KMNUMnLSTZ&Zh7SZ literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/cpp.png b/sources/lib/images/fileicons/32x32/cpp.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce35422cdb9446e93ef8f5393d630eb3560e578 GIT binary patch literal 960 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 literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/csv.png b/sources/lib/images/fileicons/32x32/csv.png new file mode 100644 index 0000000000000000000000000000000000000000..3ee42f04709e443a2363117e798d3ff3443cb419 GIT binary patch literal 819 zcmV-31I+x1P)JOMcdid~m+i7!c1t2)eFszMq?$ z1@O=7>|jCDxKpUrYP`6-tN{?MUK+66KVrU$`}^S$h{%8Z%y`xR5}%fq@FADOh^l6n zR#(fp`T0?|Ojy|oBke*62qB;-isxp`0RR#Lr>DOV3WcCXqp{VswI8-%9SN8qA_yTs zM4p>59smeH_v3CHAD}3y<8F5v`ex(A@ zm}973O(b0X`6iIKB_iv~9CrsP{s`FDd#_Z2q6h$2iXKfS@wHR}S;jFlMw3bGl}cb{ zycrwoTn4Pp3?vCO?D zoS1TTFp-+PVM|YEZ1s)(YM@y(8=D%42$^&i#jOofBg_mbB{JzOHjC>`^&peZT1v2f zHw|QG-kJAS$5zZ_-nxIJ;8TRH4^jR>?3X~BN7CCq)1C+vi$zqcRdgERaM(`&m;nOnm%1M8>FsqqK;EGc;8NE?MD{zL(qP1?=b!Xs9S$j{{z_=aap*{mD>OS002ovPDHLkV1gwMep3Jd literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/deb.png b/sources/lib/images/fileicons/32x32/deb.png new file mode 100644 index 0000000000000000000000000000000000000000..8d625ccf2ec0d00a0e43bb29a6636782d64c68c5 GIT binary patch literal 991 zcmV<510ei~P)Y}j6o#L3$Dg$mQqw4QnxqabW*dom0dY$Ro0bigsHkL>4U4kjW0n8FSARfR)3kwF zhO+1mvS<>zK&*lU6-r8)3_-1BLrfcN&t+kI;@BQ%?3g26&3Jt8nfJW+J?EYg_RN#X zX1_t?b!}N_dNBo;y>0oCcHo`(B?*44Pz z)*m1u-N&yrlkpRLF+b1cbeh?jnG5p^3*V)r;(FBQ0|*d266EpY9I;r8v(wYjFEg13?LasJ z=ylZ1@ADBJ2-{4&l1hzcvRShkgr_|K)sqJ5Yo0%Kit9ITBDK7*EQ`0(X@Fxu7|1&S z(6v33wgB?WAG5ppgYDSPRl$DtWFkfKjZa9PKHak3s*2p_%z)m%1(w#R+O@E9l_7rN z>9HY9bB9>;2(i&H0Or;X<{$qMi-iePR{1$QN95(Xz4eyGXedYhn2_ zBHsH9MV>`~vG_3N=3m@h+5{l+LX_l7BWO#b0hPN?Zs}7Z({nXH&ZXc$5$2XYVkGpC z;p3xtgJDdw$i3w?Fg(njn_~9d6c`@vEw5pkMZCc%P z{VtLC7+V{USXo@f8}O4lpJXC2j`I0YK0gzQaZ=}#cmsY`7FXHYctj*VMk&8;`*BkV zThv_DMTPR<1&*Hhk)!b{-oJPCe$h~!|IGL#Q{#ZPC=b2}`n#6&>>dC>DbLg2zCx4- zP3QC!G}-3p?WeZb$ABEDq{FUAcjqM z$0J$$5UbdpO;-#^69ZNeZy<<9xdI?qU=?e;E~;?>Y^goLsr4?cYw$ zo#yupzzsXiFYPM>ZkXvG18vmmCQ>JTw7k5He~Ewsu$a5dG zZ6FU(2q=jlu+y$;*KG)h0}=i|%K__+-v!ddM!30e@3Z|&l?D4l^*>c?b)oh0J4OHi N002ovPDHLkV1g#n-;e+R literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/diff.png b/sources/lib/images/fileicons/32x32/diff.png new file mode 100644 index 0000000000000000000000000000000000000000..4dd98e7cc15ab34d85768e4ed4f9de5347585939 GIT binary patch literal 975 zcmV;=12FuFP)d0E2U zITRxSNGW->Q|4SU$+={*>$$Eaxzk?((>?{-7^D!audnlJX9tZzA`UzrJARz$>FMTp ztu?0-aWH0J88*$TN8dP>ibc}t6u$2ts6r$X;px-g5N&>BsCA%gE}PP6O|@EOetsUU zHO3gU*3GuNTS04x#ZGeP&JSp<+kFUz1dts7MiT@9T5A>;7g<|dV`F23YPCwCu#GVe zjx)yIUb)uK=q?|9^CnCgYNeV0OG`_nQYqr`I9ppKUcXkj?gXyu;W*J+Kc%|Xh(iGc zO5yuHN-5^%=E&#sJbU&hw{CsQ<;y9eQIBY}2H^WXK_`H)hMR&;VpUfl2m+Rumx)9o zXl-%(_V+}i9^>QhVA~OFJ3EI8GGXcChV8Q|d;) zu z(!zD!me2E$N!VJPuIJ)$!nEOyp811fo1hffK-K x;3RL)wt(lY{{^BWAH2?e`w`ndP;UKE{U0!iydx9YNRt2n002ovPDHLkV1n$W$|e8+ literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/doc.png b/sources/lib/images/fileicons/32x32/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..8369c1f7327709761e9f5d34611ef5504ee6c3b1 GIT binary patch literal 1034 zcmV+l1oiugP)Wz=N>ETi5QJ<5 zCD4^7ZKPqS-9^#jvJ0(?3S!a3KO`xpO(dCgChy+sA~TtJlQ%OjlSmI--s9eP&il?e z-#PC*p(Nf|CUXIiXPvb;8W9HwN(5ufSN%ti9s&HQ+KI7D#%-3&%*?pqvu87as`XN@ z?7qpl6~BLD+&t~=?ewKmy`$&P|5@Q|D1cQF5tLGhNaR&~9zcNRmS$#WZ;(tT>Fw!h z|8i_>G7Lmj0FADqY>CH7+>uy~#K8jxI>s`YsY(!DIDnEjx3Y`m4E%C^2~~#{zOmeM z_b&GB-OKQ~b4Z~sthKz7P6O-&62M#)0Irb3k~hmvaeU+&SEsWSNm`wRaPlwsB;C!U z-Q8=>?TUW9dIVfB1=cx!oy~D|I!pG`XFznFI?#A0GrWE1E>uBZiD0dzBiX)!utph{ z%oM!WB517<0NE0$6g?%x#m5jUv!f#QfdC0t!6-%C6Slo^0TEct`S@p!aAk6yo)5pp zIv78l;^~jSrzP&u6w}1K7}k^#rUrMyt3XL;mBUnagb78Yj`@ zk-C2;9j(ngcHa&hptK6wsKMU4WvGfH_9je-FuEaeTkWyARC6pJ~-LeA%-7awN#oh<>vi&g;} z8v=kUG!!NL_})_hX!TleKZ+=Bv)pz7 zUIkri@}L;rVz}$=ui-$5eXsH>7?nWP&T8p|%>@Af0t;^%lQ`AZ7CJy~pb?;qK|~hT z9F^U-0-eB)|1sq^fQj<|0;z~bqH=EEWXS^y07*qoM6N<$ Ef)MrXvj6}9 literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/docx.png b/sources/lib/images/fileicons/32x32/docx.png new file mode 100644 index 0000000000000000000000000000000000000000..ce5dfb3d38430e362ce0d055321f33d58713bf56 GIT binary patch literal 1078 zcmV-61j+k}P)dc;o;O-!sKg8)C=ndT`MT@)@lL?@dpev*Ce23KG6wa0G^`x^K1WnUk!#9|z6YwPIi?;nYsIPr9;OcbJ1xwI>#P)cE0 zmhX`}10YH2m>=E0GR9@=A&6Oij#e}xH*v`N7B+Hgwub)r?F<9 zXl`Dyu9wb-N@u{huRt5auhVI6PNYbE_8f?{iViFSr<1&WbT=w{UWuT!rXfMXa2bqJgaX30H?JZB^JyFVLMJ!IW@-8G zJG6n}b5WlC_S67ardOz{v~O*}gSI zxGF&Op`A3;R`cY8J1~HJr4(92#?fd4K}+bl_8XJ4cd?WZvV@mEzs}UZ zX?ou{NM_N&Qq~F|6<>i;3WGrqMBwi`DY}PmVJX3wr7Qa8=LtS|@lm#K4Pk4u#2Y(L zI8}zcp3rh-)m2`z(Tx6+;!Y~Vsn&hiTH_eQBav;qb?m^hkSxo6e%)7)Ba&pb9;vP3 z^_E65wkDN!_#%GLt)ikU@cVCAkTO+}jjRJBEMy$giw?u*qRgiq=F&DFz4RD+@2znW zUM%JEu`U3ZY(Y`NkMBJLK-$(Q1wXxi3`c8j{4t9$hN_^IMc@Wt%CtA$092kdEf3f6 z+EWkE^v<`e)*=`Kr=pD@;_{)5Q@IKjQa0UPO>}oP`EE=W795ukDN~68{;65HiCHUv z3R}{W0AvjSjtmWPZG4=Kwzf!wGkyS!w70v__w?lR5|6JspIbBWxNFZydpiSzgFZ=E za6q{(}0RArk3Nzrxc3mDET=Bx;{Q2eKXFj*)wdeBSpaFKd zvQ!8laplV7CrWLa3eIXxXGh0wV9Jw(0&`~_Cw!)^&a;7BMS-`!4_h0qRLa zK~z}7<(E%S6G0TffA4Lnq9xITNtcU~;5R5IKpNxClSw1VM!%gDYA9PjfS(04@z4WU zrNu<;JP+N40^N1DY;A%sne1d|XXp3+&AbsVq|^?>4k9njIgDw<06|3<4u>CJHyRD# zch=cU?J%^Wq}%P<&hG93;H52E8tdOR8|i&`^a&BkufG{9PagBG+2l&k}RQPeTmJks;DZS=Vfm38~{uGPn49 z009>7EpmK(g75o0TVMCzx7$aPAQAzlZL!=bm#HjO&MmREv9a6^!!K7MN|OO}su+mp zJY8L7XKxRQ^1?aC+aLgV1l$LD2>=%PP^JP$&@NefFuZ{BGrI_ET;`$qI1 z14Ik!tYTn-VmixHFv}@hx>7my4?3NSGn-gI-b8a96}tVjYV85A0z6Ew;%;yz!B^mL r{9Z7=&_Z-+D9_LfKY;=8D}M0@pY77sMxd@e00000NkvXXu0mjfj<^5? literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/gif.png b/sources/lib/images/fileicons/32x32/gif.png new file mode 100644 index 0000000000000000000000000000000000000000..e39af08cccf99f7380bf5a51e93deb10211d0f83 GIT binary patch literal 944 zcmV;h15f;kP)Ig0R>J_0fWVfE2OMCE%Og zcBLU`@kvns0AEEBiMvQyvdcE>n%_HfuMhcQW->`9Km5XFLgwCczUO<+J@=0AA7Z6) z`5Q#uFj`}n2L=$72%hJC`}UP9mjO5G>U61GHp@b_S~Yj>-Yo-an$y_G?}RbExc}VR zMnqH*wCDDK}@XJ2@ya(4$?+({%tvQv;_9jHB0ZRlKdD5suqeew8lZrzk28lQ% zY)Bp6=BcgIr2e^0(uNfWG7i4=mZ(U5U@Vsde12w|xPq9071L*}Kv~eP-lV0DLG>ny z><4%*;00_A1 zvw2A7wFizO)KFf9@8RbBnF_Pq6ys9$trD4T#^yw4M^F2rIw8 zNWxk{0@Wx3^+OLY4k{RlXi#1F^f~Ia zE@+L`&^q$QY%D}ze{UBj-ax`~DgH)gj7R6F;j>|;TyG}SfZx$)?^IX>+IWlAz@iXl zEJ75^C17SHFz1!@amREd0uLU%!p_c5EE~C89{4b-0^?X;_p4GY3hV1;_za?0l=-(| znDfUOjOuW11%fIB9Zq|j>wNI;Er@ZP>;bbbL86o#KO*Ppc$Qqw55o1_jcW*dom0dY$Ro0bigsHkL>4GX&AW0n8FSAPIq)3kwF zhO+1mvS<>zK&*lU6-r8)T!PxjhL|?kzQe-yjbmTi*G_n)(Y+eYoO#bXXU?1v_Tb6p za^E2Gy0$Dd{XheP5}{J5+pu3LRPfB?ZGK^{NeCKiivc4{j6Wj6c3i9}lh z{kA&%J|E$Mu&u-^>2y4s%bCq2JkA7EUolXh^Zcn(T)%k}shtbUvUod_0XPPPfqWYR zy0(YnNFcxTF}oW-*oN)1D%gEb#?z$U_=MEy(=GF@YLNTdE1>spfu%L7_AM-5Wr$yR zdTa>O+#wb{LM$Ezz}(!y{No>Du`q$k3P0y&iM%|!H{Y^|$D*Kh$75*2sCi%i7M4CE z;=RvM08QI560?3Fr>xO`8}n z_HT!;j4?2X>oQ3IU%7Tm8d$p0e+(#Jh@ZZ`jn!j~rldMoL=bum!p8KJeCG}ah3H-h z^jVU2yQWGU!g}L z%K?^Ilj&z%;}GLu)NGS*({%BGB=l3R({LgzWsSWCR)+S2JKQxq?A~e6?rvu0ECnjizO0? z1eq&WuC6?J@^6Q;JpnXD2!WImAw=ZW*bg9pNpF%uVT)uk$<<4j62InhuX};$3t-gM zkO{}ZKjJr;NMF8uDwof{=>%c-1|UbufriexvuAnu_%Whh7g}q+&1M0n0Us##0buGe z6e9tUQu21E%*9lSi>XxCdtFO%r#}OxJp|eqq!6sHuk&_i2aQ1@4!j;YdX$-&nWnzh znp4RH7&EX8n_|_yZ(K{oBAHB@AP5d*Ar_1A;>GWXHajv>ALxo@lRB-bR;$d-&7rl% z7=zZjxpsFeXbtiBN$%hO39WUz4Z)BAWCsAF3BwSrH46(1tgWrFv9Uq5TBT6f#ux|3 znP6|PT-#@KmyN!86QvBbQcVDhi;JYwX%dM9TU#aGy;FGJ6rShfIBsp9Qe8b_EC8WW z1VMmOirLv&R##Vf`SLIB-u<3y*V4GIkL%U|1VKR92|!rGg`g9$sxuIVAxle3#9}eD zwzzliM_kuua`G6q9mBR`gkgwMs?Elrl8%&ws)Ye5CDm$x@1MYNTx{FHwqs4I8~dX6 zk=_h+lua1ayq}tyqEsqj+YVBe*x%npN*gH!Aefl2YD@)TmyNLi>{TiVA()?^kJOI$ zDwQ@HX25vUCkNgqO`%Z0vTU9`eIB_bPft&?ydr48AOs`KfkT$VU;u;8?S9_(dLA^i4h(^S@)w^f|N18% z^&B9_@mvapK$N>)wcH;EP6H=DU=X%|SFQgAqJs^;b8bIm*$2w4KdS!$6lk67d){C+ P00000NkvXXu0mjfz%RG2 literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/hpp.png b/sources/lib/images/fileicons/32x32/hpp.png new file mode 100644 index 0000000000000000000000000000000000000000..04876a5d5e72feeff58662a1f3d61e28fcadd188 GIT binary patch literal 974 zcmV;<12O!GP)R3wOih!#?<`&=fz8e z5X1X#45vhgfBwSC!-xNNINK9IQ-lymDG@@19u0i}0gSuj6bhRp5(zGxJsbZen|;{}L|*`- zj)sgm4&D*3$wcbhxf9u3?o}rUyEgziQVulMd^R=3y$25v^}5hn^KB*rFbQ}-u@3-K zkD(X|fRvKg+hxuqlblH=yZ+a;BzO8VVA?~VjX?^*+S(egx3|$4Bx2v^k)ubMo}O;5 z*IIKT5eH)imSIz@y7!G|saPbPPT~9hzAQu{5uQH%9noe-hUx=dv20SOHPvdBxw$#C z))-^ZS~theP6e$Y7CX+JJ3peeZnq&A5`gRgU^GDxptWXUVS&}vRo2(nsaC5L3R@WC z;5cLK?v`tMMt9lhn>S&~P%G60u(-HLDwQH0kF&X1;>{a{>rUXh9*z^O=_%FKBMt;0 zPzvAoQA#m8J4-&F=lSzLxpnJ1E?!I#je10*H2}Wv6LbO))^H){M6Buz1VO;k(h`wK z1g$M@-~NGU)MI@7J#0IIZAS=#0Hsu$jX@%jc&PTsjq+ftozK zdxPZ7pSpfOyL+Qeuc6a#e&{j`BfWqPnjaZJr&qn^J2yR428J~rX4C$s;RyG@A)-O7Rl(&c&DEKikAVMrhCo31@~6tX^vMT3FOUcETndFilm{_z3^)lK we}_TX1YWd$7l@98^g8eDhb((Qx%ET!fBH+mx20}|8vpwrAdc-gn-6J1f{XJDbZr zMu=~W)))pc0|=xLD5ai!d+pj)Ac(r!%jR38abs$6|MT({ zLWut3H-^)vKH=x3CBB=Q;;T$%a%p+_x2fybzwV?&m`>JZmr^37#Imf&qrL_}NJ+6+ zB9TatIe-4b@}o!pHU--jpkYD?q?8CDB9Hof009iU!xRb|B$G)loIRWPC7XTK4x%H# zprdX>j)Qm1YbcREckX01mwVj|VYdg61LZ({&FACe+<*8Gu~!#bYrdbF0vH24px6Px z?Cqf#2tZ27o2@cuQYp@)QZ4`MT9P}R6)*?4KpTS;g4NYk-fV55F-Szu&tu1rGchsI zSg*C_WHJH9bS=Y%S$omfKTE|TnM@kr_j{@ki^X{M?03WgKQdAuXxYn#bXrrbR+*ih zMQe>Q2Ca2tY;RZ48b(J?aOciXXsr+W5cCNkn*fX^2m-X$%+JrWva-V3+8Whrl|o?? zV;mf3h@G8sZJyCBK04-2lrq#xH2@YC7D%VlBoYZWHcGsGt8m>BT-U>K;Te78e(Z z#bRh}ar^d<#N!^r!|!3+F>E_V5CkZt4*2L+(vgx-g%prdQmy)U-Um2N9NTuV?N~$V z`n;%pq`d-7WfS$;)GbDv2VE>72TaXpvAm@xeU40t5%^_Y$XF#W?*{`l)PM{Qqzk>t|ph@BAN z`Q00Bzdyfwqh++4-^ov8fKHa0zDH{MUdwei=z#&6ql^L?fKqM3kGi zDlot~uorkQ|KVRg%I5Ryzy2-XSruF!*Ib>P{22JJ?G^|qU;a#amp=Wl?E&%-jQ}YW z0#WX!!27@{-~{i^Hh`Dm_X5$BkY4k-{fKQBD2HEE{|734%4#Z1(rf?#002ovPDHLk FV1mQ((W(Fd literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/html.png b/sources/lib/images/fileicons/32x32/html.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4f15ac6c109ce5ccc48982449045f50de455c5 GIT binary patch literal 983 zcmV;|11S87P)wrAdc-gn-6J1f{XJDbZr zMu=~W)))pc0|=xLD5ai!d+pj)Ac(r!%jR38abs$6|MT({ zLWut3H-^)vKH=x3CBB=Q;;T$%a%p+_x2fybzwV?&m`>JZmr^37#Imf&qrL_}NJ+6+ zB9TatIe-4b@}o!pHU--jpkYD?q?8CDB9Hof009iU!xRb|B$G)loIRWPC7XTK4x%H# zprdX>j)Qm1YbcREckX01mwVj|VYdg61LZ({&FACe+<*8Gu~!#bYrdbF0vH24px6Px z?Cqf#2tZ27o2@cuQYp@)QZ4`MT9P}R6)*?4KpTS;g4NYk-fV55F-Szu&tu1rGchsI zSg*C_WHJH9bS=Y%S$omfKTE|TnM@kr_j{@ki^X{M?03WgKQdAuXxYn#bXrrbR+*ih zMQe>Q2Ca2tY;RZ48b(J?aOciXXsr+W5cCNkn*fX^2m-X$%+JrWva-V3+8Whrl|o?? zV;mf3h@G8sZJyCBK04-2lrq#xH2@YC7D%VlBoYZWHcGsGt8m>BT-U>K;Te78e(Z z#bRh}ar^d<#N!^r!|!3+F>E_V5CkZt4*2L+(vgx-g%prdQmy)U-Um2N9NTuV?N~$V z`n;%pq`d-7WfS$;)GbDv2VE>72TaXpvAm@xeU40t5%^_Y$XF#W?*{`l)PM{Qqzk>t|ph@BAN z`Q00Bzdyfwqh++4-^ov8fKHa0zDH{MUdwei=z#&6ql^L?fKqM3kGi zDlot~uorkQ|KVRg%I5Ryzy2-XSruF!*Ib>P{22JJ?G^|qU;a#amp=Wl?E&%-jQ}YW z0#WX!!27@{-~{i^Hh`Dm_X5$BkY4k-{fKQBD2HEE{|734%4#Z1(rf?#002ovPDHLk FV1mQ((W(Fd literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/ico.png b/sources/lib/images/fileicons/32x32/ico.png new file mode 100644 index 0000000000000000000000000000000000000000..0a219e6f26095b55903cf7f84bed8c04fb7d33a3 GIT binary patch literal 941 zcmV;e15*5nP)8Z;B!%J@>V;nFN-z3h)GGx+Xt5X+3PRBf^|A&304ZXxOTat3 z?Mg$?;+3HO0p5xt5_gfZWS4E$HQzgPju-hbGdqcsWYq@_Gn_f+JfAz-Y%a;Hz?(9stQZa{xTCHa8+`U@?)U-wIvG=4geZPNO z-#|oW_um*!FF(oWtE;?KEb>yJ@cQc7+IPh(S6-eJiE(yn7`ECM_MWPsfX z1k50ZL2r(1e@eRh4M>~o=4af9&>6tjaMpv@R#td^W#s@t-50qtIRYk_0&NURgmnFD zP-y_NSx64@97v)8W8lXf_+cB~JGC{MueIi6KGz=*M+24!GWMj|fM%VlTq2!-qz%ag zBppca-RAN2Q>6dAP0E2K7qTva`Ie|yb>KiQhxp|51_=eWfh99wtw34OsokWljzaAw z$=tj69^i*;Op#OcE>IF^S%Jp{G76FwI95Lj?dlCWUW%^g(D72Vt2b~H;MfOk%tj!z zwNe(Otp4Jz1@0gP^@k<8o~G-0bUjV|VTqL89~Z6>3lVVbzSqO%THq+ip14Y@wMVPd zpw-$Vd*bTodw_sgvuPmAIGF%fK_IOH&z!x5<=$fbo#QNjwvFGVuK@|#m{wC_iLm<1 zb0n=LB&23h7UDRxw;X=`=@m?`ht~Uaye5Tbzl~MAq9YJmsIlkcCqRWg5e=#bA3aT@ z-UF@C8ru8*0UHYu*xBB~O*E0HTuQKz8ROI4Zw73bDc73`8VD}*@tai^fj0hP8dwy< zj3PvFxCG3s1m?Vw{?joXi@<{iFS5D$J%^2az5u)*Hv&OiyJjerWb{6csQzK!+}kh? zk!k&t#{CC!n;ri<0Xrnuse?-;iPS*2e`5F}?Ay~$!6<{1jK|4&lzlr?)*Ji&hnZu? zKZv|QE>H;A_XQCe(~gp(z%p>`UrhNUV14|*Ktj>TgzxQ#j2_S!|55!5%o|?V^P~^* P00000NkvXXu0mjf|02j` literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/java.png b/sources/lib/images/fileicons/32x32/java.png new file mode 100644 index 0000000000000000000000000000000000000000..ee9cc4ccb720913b0dc57ce4c6d39e58d51306ad GIT binary patch literal 992 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 i-rJ8Ehd?#_qxv7Ml&t;7daCOH0000%F!_Z literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/json.png b/sources/lib/images/fileicons/32x32/json.png new file mode 100644 index 0000000000000000000000000000000000000000..583ece68309cab4b2bff7b5659245e2f421b0c71 GIT binary patch literal 996 zcmV{c5OAb>%4kbHiV(a}*ZoIRWRIh%bE zMWQW%ep?L#j)Ql^t1FQ?ckXyLmwOo|VMh~?eZ@e{=G532_Z~bzRP#b>%{Nn103(10 z6xt9l)jbq_5s*^yYP-albec2ibjy2P338{s0;YKjv@u8_SX*1;)%G?TgG6+_9yxlH z@$vDxz1EuJqbV?^V;a_BRaalT77GO?CNlWG-&KV~BEi$Azag6Z$XIotWiRW}X-&CY zW_ETKtu@9NwAS^uv$KoVFg$#W+qZv2Yu)Ta&?5mEB49K@5TLbYetw?S)m7Hl*D06F zSsABP zON}@Xfj}vI-$yCM%*+fcD=R#E_9r)Q-r(ZJ49TQNGFc(u`#wRKfUtVof-qxMRUilg z78e&uBob(CaqHF(B$FP4gYRJ532Zw-5CkZtntXIh=~zLi8WfOHQZD;=-g`Js65DpL z?L=Mb+PJuNBwB$`+5~=O^+Q8L6pKY{+d;}A`};dcX(Oco1Oo$BMJYdM@o^vmd%L>` zA()$+i&c*Ic6Xb6m=4FAHZkxfX!7|ymSyw!(UaIEd1PdSt*rvX!^71yR{h6->$+UI zGKtbEHUUdoxUSpqdG0X?8%9-t5)g+d@oofLQ%H~}2v?O_vm-uPc2Lh;~*&+UhdeW29%qxwI`4B3*m S@e_Uk0000@)2Ktqrc6U7U{C(ef@9nJME$mD- z`xqgCE zWTd`cYt7lABp7pG8P;J{qpw|yg#x3aX?)*5RE1b9#sFkV{n46m;olcWXCfVF9^5%`gbq8==566jD<|)9*z^owjFFc zR+qXqFKQoYuRv4T1b!v@fq?;v#Ui%tAZ3yL{avKAkx~GHzCNp>lpnPCI1+)qQVAgh zGcz-h+VNhg)ZoJ$aJ=b|183S}%=W-MX(=CA>kEDmarXvxU{QfDw|M`mJ#^;|6aqWD> zPFTb0!o;Ct;pf$biMmCFeOwW)E=-V`Tv(z!^>so4||kcY$ci2e0|ue$3bhcETU3{{amuy4uCVpkx35002ovPDHLkV1j*d B(jfo< literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/mp3.png b/sources/lib/images/fileicons/32x32/mp3.png new file mode 100644 index 0000000000000000000000000000000000000000..1acd8327683146530e37feedc431426e43f1ca90 GIT binary patch literal 947 zcmV;k15EshP)7%Q6vuxvyWYfJBN+sd-6Bz>a*EWdRYC-Aiw!qUL{wC=;MxjRg)=ILHicA0mCDDB zGfiz2W9r;VPpH?X7kZ)=hboF%1=xBcJG;XnS%0i|*K5Z-X*8?Z_ul;9|GoJVbVaY$ zYIhOhedW3+#t{Vwq!2icQ~&7f*$;u;xYp@vt)?a=o12^J_MJO5Kt@ff_k2$)wHNoF zj~fUfMvq@9UO)00Kdr3rajC?+g~A6bmCAbQ+`0F{nCL|(J=&#|NGZ`YEq3#40ECom zZ~sj;o2792^qI=)>R-NK0|9hI2!WImAw=xv=>rHLnM(5X=`(V<9B1;9BcTSx;RISyX_(ABw0OVLT;Mu%!^eDH>WyJova9x*AN+p1ofi$ok z0zmEOP=o?#x7(e3chlqnR{Z;q#r)hH^K)|pw(ee$8{rJ7{uH=MA$`3uW$@^aN9cNj zhYuehrDWs5e!sCntJUJydL7qsyLPV2pr(e|Sc>ZhlYe0li`4j+CM(=;(n zlbM+rOw(j`c9wFvOmZqov-!NoPR7~?267o_VCd+2f?~0VWm#C3#n#pqjYb38w)ZMK z;j1CRhyY{+08K|JMWs^V*zw~yj>CzQCs9hVu&}_V7cQU)Ez-w<7?4uXYPG1Ztpyk9 z?k<|v&p;%jBd0*uaU3U9r+0O9#)LK+0B=k6#7vna5(zw?z1!~n-|zGN58q+iHknL@ zL?VIK^M4`?tgrvZx3_L#@7QEAFJc%*N9U`rud%qeh-sSGwoScW$KKhAy^#eo;9E9J zOG^Wjcskw*s+7WYUE1w7$?0j@t@h*q1Wn@UT)ldYn>W9q*=&+ZrMPlsX~2hyxZZ@+ zK!4F(zrM_k8{J8kmzO&_`M2}rf4SSI-+aE)=fhRb!D`^m`M0R9))-d=BNk!wC29-+ zYE%GYUP*@?)3E>)*NWVGa*s(%Ay?ocm*O%2>byeyC_=~8`F@r>-LUZyQxFUy%DJcO zpD-+tSOC08{e2LiFrWuwzz-tmUzp8!42a2i!M&|!%o=&00OK_ z&gbciuY4AGfjq!QfOG^xU=8k)UC97PfS36H*002ovPDHLkV1j$K&?x`_ literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/mp4.png b/sources/lib/images/fileicons/32x32/mp4.png new file mode 100644 index 0000000000000000000000000000000000000000..03db6f45093564d224381de7010ca5873bb3e5c8 GIT binary patch literal 1197 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 literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/odi.png b/sources/lib/images/fileicons/32x32/odi.png new file mode 100644 index 0000000000000000000000000000000000000000..6baa6940728716979a718dbf82738694bc6a9558 GIT binary patch literal 1058 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 e1uW-(sQwGd0wamHicBJDwRLC zoM~#K7*pp?dP2Q6z0ec2I8;&8D!|qo+1VWq$=d7nuCsQ`lSaFG``)~7zW3(Mte`7; zwN|@_5FaSlMKOvfKp=&{ah&?c=gxfu?8Nm>S8FvjF4@@FPNnmE!edukq9JGM|)6yjLiExLm2MmCm1kKZ*%II_c3ar9?`JrfIQ<=K~<5 zWNYhhve_(!GiT0LR#yHBEH)HCM}!baDG@@%9-cjb0FtRB&z?Oem&r;k)?wWmQ4dN=?%QVn=MZyZ0)opKqmw=Z1R<jsY=Jw!^$`oq2F`Z}#vi(l(?T*vMDxh_X?Sx{==HtdMDxB9T>b9{c`0-DeU&T$|Hq!hGTE$XYQ z;YGT$gQoQ|Fp$xqQ=scOjuUC)-yI#D(1ruxwNy{cl!;*&cys#O?t|YS@WYSaW7{^F zOa{X+(0t#=!ob?vZ+v(AHuknnCUb~HBGIw==G$w`&(C9;Cbn%;uh+4+w_`W5a0UX~ zW?^BWFNkO3ouEo7T-T-DZj+pxq}^(d4?tKD&*tjYYuvhZlV-C?DwX2Om4&`J)PUPn4KMKEL$4!%T< z06+~3V8kowe#dky0L9fJ_n+Qp+)~IDxX7ir4EVVCtjmU25}|tkw+8kd8nIto|<9l?-qUc$xoCo&!(({{n+a07*qoM6N<$f;PF#0{{R3 literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/ogv.png b/sources/lib/images/fileicons/32x32/ogv.png new file mode 100644 index 0000000000000000000000000000000000000000..1083455fb401b621f12d818836b249c10ca772f9 GIT binary patch literal 1187 zcmV;U1YG-xP)VdeM)%+TS}|29b}%*q%DReUP8el>%5a@9 zMMwXd+x$^6i&_v`g$-m(CP`YY!q$qW-KHI@sIArH_1(KaVt%zrnzY>)9=!8j?#cI@ z^F8O@CrHBd`Tge+;%%)InuS0E0x1NxZC}{#@oWQT@?Gul`TcsSFg`x6Pn}+jitK0p~$)28{T6gStD_bT~*~xg?rIbi1 zF$^Q`E4~ImNXf&8kEp1qz`c2MW6#;MW3z(INFV_r1X4zMwWt)dj_I=9n z?P3YB~V(U z(QJHuBXw`oVVE(&4gdZJp+JzyH|y~Gd|c}5BOD&3p`n30qhV$&i~ald^X>P?kwT!9 zVvVZ;v?ebN81eKALD8~OOw&w=QV7BN^)+nR@EY$K22#NN@qY+~LJSWN^X0*VgztuF zZ~rjGkIZWhq=_(&Lth=DzrP>DFk)Fz3a!B~Vr>_j9fG1F6Vo)Glaw?zHl{eFKmszk z;^M`N1OnGMckTj{laFa`ZpPtwA%oq^d7>#URuSmV@bQL+{xj?M+gQ(SeBLMBR-%OL_h#nf4zzpf-PI!jE#=b)zyWN z5_gI%4TC0k6C)!dpmjO{VH8$^RK^+@x;ey;{__+sTZXf&oKR?hU@(M~GGPY-L6p+0 zudc>cD$Pf(ePvz|YORP`Hmg^!PIN-HjYuiQ)2M|~cHWy=<_x5?jcwalmW9*loY$$= z8Y>#bw(T?@iy{z-M3}J^D^{+A`J&RA8CwyFMACfd9LJk18c2$!#pA($_6&xUIr}*- z7+Wb?Jf1WkO4|$9KxgOYEEa+SMTlfcA#|Yx7I-AhN}!N7?A_AKy`S%~)Nr|7(4Kb& zlJIJ8;=WsSXM7%i=hfahze%+VC_!ciaXTN!`C?IW^J;J6O3gyP(Jz`nx9DDUCd^rK z%~;pj8kqfjJ}qSPKZii3eLGu(xgyW@E|Y&VePS_Xb=VH)N2@X(AQv$Ru!N03OwFB= zNvr@W0Vn?-9sqY!zYD~yY&d40+m{$oU@G;?=s%B>6omnF)1v?Y002ovPDHLkV1mBP BKUM$$ literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/pas.png b/sources/lib/images/fileicons/32x32/pas.png new file mode 100644 index 0000000000000000000000000000000000000000..c2c05d2d1fbae8e8779efa364f69a2cd247d6b88 GIT binary patch literal 976 zcmV;>126oEP)d0E2Yu zS4bw4WG`O4wEXblzg^Du1ke&81X4Cb;+D0isbCT5G<} zjDzEhu)ABW>lwYzMrhtdDMPJP3&6s{0+~#PWHQOdMupd}6|Osm>v}j&ysoFzz8-NX z0D)5YzK>FhnVA`i#Ujt1{mHFc-*WkKhIrf~9E_V5CkZtI&AbS=}1Ya+8B^hQmgrR-n%$X9NTuV?O2QI zre4%O(wl*ohd)qXX8)+c6W9VLNGTs z7pWcZ?(B5fFnz8!Avy3SX-cIMmSyw!(UZt6d3=1F&CN22M50l~YWN&*U6*Uurchc% z24G1G*LB-o&jTi5dvUs+i|e@@MuZs@z>rtcgI?2-08D@Pgg^dz$x+LvXH#4`6Pba! z{Ql!N9skqQcYE%It#|JY5Q6ZBrl;?==7ZLU?gL>g^z*d2AEtjK3=9*F!9p;^Juqs{ zgxPOjc|Tt)uK)74d}~#3bwYD}YU%^vzn%;Ts9yb8c~?Gqujd8w5RCvS6arE0$G{2T yG;or)CmX=?_U{7Gl@DI`z5R$~52&_(sQwT7B*?iGqY{Mx0000%Vx} zsL=zZ)KC@-iQbGJ^kTw6Oh_+4G}3}?z!vOocizv#bho=@XPu$=O|AhO@Q$G8(1AgBmo7=H7@fdkJ0)uh(>u~NzI7A7YrZFpp)1ZcaD1`YQs z%%XK)ymT26NxyzG3LASkcKkRm4Gyw*&z@(FkB)vnc<|u9I3*g{X-#%jMOAUmC2lnv z08!=o^&50`b+Kn)VE5?BlfN%nY)b-lhzP2Rh$L>c_W=axSlPkU)HL1Q-R$1AtLy8r zvCFMU#1e>W0CVLsv*j{3r>2>!l$&g7$YrzSSLf?WJl5a8Zmd+gvXn&7nt-;Afq8+| zAAb&J%p7@*pjsuH&DL$UY~IZ9i4({|UU=_0G&l%wFOUbW#}KduA4)8Na=DCi4#@<} z_iraq#d}|O!_42aZ0qY|TVLO8wmu5-Y`hDs*#)+6U%PrUycy~os*aVP9YeC&#hM|) z&3|t3=forvlUEn7S0-v{k}L?F2-4yzW;j&>1ix`TGII+TIGidz3}fw_XremM6oj;X zfI0=IP}qPdXeK}^ib*>=QWDVC7HWbs2SJA5=U;H=FOZqIhOJ!#p@()PVvs5g5kUio zcI3#M{*L)CKO*TxfMCW zH{Zv8yMTM;MRfl@C|96brRn4nhLK7;w?(8v529F`>dQyahaSNG znkMu5tGM|pP6QQQXl}9L&=Ay1)K}LwHQUC3s35A?x$}gV{$SO&BUo6)L@hf|F=K1=C>))N$q#d<%OhE0000G#{T2aY@D~;5s_gwN9g!BTc;7rp7 z)w0{3P!5zks3=E-L@OdyL2_cJj#FoMW;pmq{X1*NebQ)Wci+7EzVCZ)eh6NRoz3MQ zBE%O)YYd}^0R&PAlv0nrymsv>5QH7=Wpg<*F4@}JGI#IY%K>uGq;^X`YD~@Vf1W)@ z2r<0>#&G)72mG|U%2$~TpQY1tt7~h&X0BiVydM*-=wyR-DJ4=$EXxYr8e;&2loX34 z;_*1?^XD(DJ$UeMhqFBaG(`x3loBCC=+@8&5Wu86NujV!B9Y+2*|YJVv)SjpK=cJL zYHP@Z#OT{ATbPC`14`m?|iSXpfZ-_QKGSoWI70V`dT2rl7Sy)&= zYmG4mt#z~Q?N!hkVzCq4x$`|*>vkK0Apyt^07er80a|O8mX=swUuSc3lWMg}p|FE7 z4vsUy{(iZpXLOg1zIhX-47E~C0L#nEq*5v3@i^PtC0@N!xb76L>)|-jnx0Z!Ys8TN z1WMuiK1wO(=jX}i^E`d}C%10hS_9zwK0zk{VGS38PQ*d*mi^<2vAD3*%(yPp^{LwFd(I*TJ`a~cW|62w(VfsktWp* zy|C*@Zw5NbCh%+CPfblxDwVKp2PsP&9PA;bjg$fqOiWlcru?AG#*qN*S1Jf0SX^8T zwH)tPDs48*fa6V{9C)2Hg+c+#vU&9Iap)y^dU~3jog%SVtX{@y^c-+qmn&E1P+Els zU`Y$tbz8RQA(ODRI9<=h^<0i3!VC*w#3Sip+jJ-ZH@5-Ut5c83F<2%O5H4(ueQ%JU|}Bb14)8Q69v=+rTN{ w#2XC4Ht?+VULZOW((638k68|Ya_dF)e+fdrx7oRJvj6}907*qoM6N<$g68wf;Q#;t literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/pl.png b/sources/lib/images/fileicons/32x32/pl.png new file mode 100644 index 0000000000000000000000000000000000000000..88aa2723fe5b11f29dbb997c7412516e8be9695c GIT binary patch literal 951 zcmV;o14#UdP)iVg~Ahr z_}XZVVH6lZAca6F_4L~tH@*RasI$F%pVE(8>NP@$ z;r%y;Gp9f1-s&pf<#K$H&0b$!TYH|ndGpJDN`%?TrtDHmq?A~e6}dI%00=25mC7WO zNwSwNU0!?q_}>m^dlG0t2!WImAw=ZX91kFXX?L1pafehY#pMeZl8^HF*S$#eB`|7h zV#;ywj(II5G8ZqN$`=Z6I!V~Q3CNLRpgHH<*|Xe#_z=;^3#~QZ=W+nEfCrTN5HO8B z6eAIkQu21M!ufQX^XYWgdtDE5r@sQGeG9ZPNFmtV+~n=v9vXv09QizU{5W%SbFKMW zYfhz-V9dZYY{6=H-+Y!!C9>HJzV9EYLM#^J#f#q&ZFXd&I?%P3E$OtTR;#hFuz=PY zV+>mBR@>jNqBSHEC%Jp~7qr&xHUvWwkR1e!CI|ww)+{Y8v9Yni*47raT8(0H7h@b8 zXNrS^N`0KsT{im0O_Vg$O0@_qFE5kHWJo5H?Cg|z_fFxuGq|pYq1bp8o=p-Pl;kKZYv1%v~1OY26E5u?k zw6?f&=V#(^kLl?Tuwpd)PpzwZ6a%napn8QXS{vdrP(K2q99DFDILlvP*C54voOMc|-XMF_#-;$oz7 zd{C{n*)RjHH+^E@eb5w(MJ&ta>62%XOY-dOEW5iU5{X13jn(Ke;JPl?u3blI6`6n~ zEnL?P9nV7sVK_Nm&&Bmz#(^-y5*YDHdeku;iNLL&p7H13Z$leb&HgB`hZ!7RXxxQIA`n(#5{r+ez@%VzgzHE~A}iCwzCGv^jN<(;s`Rqo zMnFL2t5218^^=c!ULeOP1W2I}h)UP1Q2#^VG;ost4?DoC@OOdeP{ZrIw@(;{KqdU4 Z`X8b@rv0Q-A~65}002ovPDHLkV1gPy(MtdT literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/png.png b/sources/lib/images/fileicons/32x32/png.png new file mode 100644 index 0000000000000000000000000000000000000000..0ecd2969101d7adec9a0f85c80f22372743c77e9 GIT binary patch literal 957 zcmV;u148_XP)XU*Xv{(!Z1)=DJ`e?yFK#JJs67bD# zyV4M}_#~)*fUly6#9gE;*=3t`&F{?I>qCB+nVpIGu^zZ&a_63NzUO<+J@=0Auh`{E z~tVvb5`wVJte_ihDH)12B9&q-qjasRQo zg^0`_zcHLyeTpyF*Lk~GpGmp`F00C0z6nlG*$mjE1I)6U*Rk^$s1tJ!} zqGKek zGt6Nyn#XrPC*A!Hq|L|XSKJ8d4B%@x=fUf1YrL?wb_k#z6uA@6fC;8R8-o%dUH=wT z8h~sTlEXX)l4!sf_<0Y0+J*N|?~L`e)||@c1`B4X0ZRm#_@&u^W}T{BCY^w!4ao!~ z9Y`PC=84VIr2oE6%7GOZvMvFAOVmt#;7~3{^4Xa!5(;bsD`tpVfwG`eyGdIegW64! zx%corzz^A&QclskKuKU^1s)T~C`el1SOXT?)f;rY6kX4u#iIhE97w!>D0dVa>)T7~A;3&wRyhf{aK&#WB z)jA-1^4j=)0DxHY)j$|=G6AlFKw1T!J$DPsy~XCcCs_Sr7r)D(1|(=>T2Gm&2&=z6 zPtsaJLe(tFLL7(oj>GT2yo%}d(7I2@Yf^ab`CAPPJ_$^c?;lr!!{? zq78%{g^fqeEz}3%SeP_kDoL!vIGv>#hMJe;ce7+7HcPlAX8G|j#}?G%iQK0F^z zP3+kpaWAk#ZN1U=Kgt|G@nPfza*0Mj-xow^Ogl=B0jt1q{y%vHY)*a`NQjM0_}+fR f(gPZkAFBTVEf#Y|#ti5F00000NkvXXu0mjfNTsY6RQyw_R4cYBrZb<1WTwf?B$=e~fnokW^F8nLzVA2R2x~|cOQjh^ zj#{(Jh=sguBJQg*gjD%oyfVPV1EymhMtXtP06HOD>HR^op8>^UOR ze*D(5b9e`TPfc;IP~gz``0=Uf>Dj`WGlv^FQL9dU+f@}+#Tb)#^Em*b%F@yYa=9Gi z`}ZH1zH{eADA-s50Yn5c-B^W`prW|uP1Bg2UisP%Wr56 z-}5}S=5t_e(>4rXs?qyQ}%bCIf0JkCeYKa`ir9OoVSl6U_sWT!xIn z8OUOKH!^g7hD>ghC%-fYC1~21KzAAQr5R@SAm1LIKs@-tc4H`Sz}mTN2Gf+DA+K+SxOSkgg%_UepY7B;=O;o*4ytN zu`*l0>FsODPn-g6&^9Tj4DylB{~ZCZj0_B8S6*UF2ApzBe&+(JQS_gFm1t2C=G!LA zn|J|QUo<`2c2{P&R_i1SgFj!4@IC9UuM37I@39^TZMGpwS0T1t0Ua($TYaVz2{?H7 zF8|NZ(`}6B^IS^qK-GtdiTX%x+-U21?Y%Zr5dQ)@F%g`{U9T0=YT(2IYNHAdnl#F; zIna)^NuhBw-giUH`!)O(>_+sB?uXwWNrAxfW!KGK+Ppb-0lA*Y)pZe(<>)NAhCyH$ x*!Ufj@D6xZ`(Gd-H?rY%dzbMQSg!q1{RYinJf@CC%j*CD002ovPDHLkV1ls;s`>x` literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/pptx.png b/sources/lib/images/fileicons/32x32/pptx.png new file mode 100644 index 0000000000000000000000000000000000000000..1446cf4debc97babdf9c52605a29f2ad4934ed9e GIT binary patch literal 924 zcmV;N17rM&P)g352z)o6pzFMoCcF>u>=AW5mXfsNqzbA0R$Kx8D?YS0mWjGW3#h`@2b_iaU>E6 z40`#N%Vx=s<%3APd*sN$YOS^wC6S3Ipaa!_k9l)?nrk<1AT3>Zp2wMT8DKw<2R0K3 z*j5hPz1jTcL%e@hvDWKVg_zm19RBzUhYuaAf5Fi^hrSD5gD_?CIJ=~4ej`{A!ZL&ie6l@gVEhVW=Lf@Q`QMT)! z;6429nYJI^X1iX-86N40Pn`lykWI#Efc(qjA3gxDfs9RIxBtSJ95{`h_`wOZycj+8 zcdDi&inm?bn|K1+UNl3mywyD6di6;b#^3(D1MgXPcPf}X`xCn{p-&m2?5TP)F+aJe~y0vVMc4|s{kR>!@aRP~f0@EvrAtNkXLbe+r7i{9j-J=Xu`m^L?K8 zIqxgjf-{~-e1Q-H$}mvW0|f}A5EKf9sdHz~4g>4eT6^M&gxW78lSy^$`t<}Lcbe2` zx_?HgV%&euFCc`dJ$|JKH3#{0VuA}JBfQq%e`aEG^3KTl^RL?}VP+>cWtUPSrNrTI zRDEsQ00=2br~k$8_tPJZ_D*JTJAhaP7to#KyWX414!FLp(86jHcLkkV4{cNY>X2jD7SW3i#mi zWqNv|8-8R}eZW$LW~9?kSXfw~$=`(Lc2`V~Qjp8%xHtV9!C(-~g)FF%fV5h;T~2g8 z#9^NgP19@$C~~fkjer0<49-8JxRFG6DgIq4pH{Z3;^~x!P z$&HC#>? zU7cMlEiG}->qQv`N~z*RQt~97CJ+da&*xcPT?11$-ID^!Fvw=JXqua;sVV;Y=WkB; zou;9oq4Z8JpX1i8+Z=uF2!n%zWV2b6VN~@&tE_-2$B{^cZ|~ejIvfQ2N9m1rGcYhf zYB`NUArLhBym$|Kn4O*F$GhKS6beKl5sRO?2}GlPM5BGB@mF7e2|%OIYq7~@*LeG_ zcWkyPs@58?FPi3Xn9t+!Z8aDUhi&Z)RoGi2GNbKy8*RtiYTBp>YAiw|`wF3IB~a&< z)RsUk%W!mbl$n_s_8YCOtpr1%Y8BXyv9U4BI2Mal^XM0eLrSa@ImZCvG^1r zzA;*37)1;qkV2r8diLGTo8JOK)YV?0STsi^o12^F;iE@IKn~l~4$YIsH2nVO^&5l` z@%=Z3Gp9f0*X3ot&*%9vm%FjNvhsWW)~&AwF%d>5TeM3lky2t=R^-uI10bZNT&|E# zr^#Kud}ZaylYhIM?F*nSLI|Xk2q7YmmOg+0#@%sBr7fnWrnqwPV*0m2;Y~jf0|AUW zS~BK1c*ndp6WL3bP8Ev9x7{G@{s81iInY{j?(A6}K7Nd7)`ixZAM$yCNx%cj0|1z2 z48=$Qq?Ekdsd6Ec;X)?U^IbQR+!@S(=?sB31}OyV>+8JR*+FBFhy$O;jvr@wdb+({ zYt5;tG#E3q4BKKgy>C4$h4QXlAvWt%#!sn_ew&CQ{; z#u$Uvx;=JxYiJFr)Jg8$`vt9arwu_&0I~~!(F8$&)|!Qd1=iNq*x1;hUawOsZDWjs z!7*^7el2C;hkWx~w`*_~RI8GAVcChV4o9dQc z)IQRmfv&O%{D$`v6BAS_6>Qr<$_o4YyGUsxr2qtDV^)JHKj^V>C;)r48bS!>=jS7} z$3JC)wUElS-wUWvoWe0oQf8e*FeYtH=N> zY2mtV=y;BqgyG_JJr~z=IgAJs7r=;D(u0oaNC0Mjdd{DJzvZaq{1;PPI}@=J_LGda5K#U4bLCz8?32D1$isLpg+d^zJ)c7J6ToTUKOvp8A%oIDfB*mh07*qoM6N<$f^AaPpa1{> literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/rar.png b/sources/lib/images/fileicons/32x32/rar.png new file mode 100644 index 0000000000000000000000000000000000000000..4af2a4d4603291b588b4b2ed05e160fa8da8326a GIT binary patch literal 1000 zcmV>P)mtb`gqQF_;LO~4nVWm=`=0Ol-gD0rw#}1D zr@uqw4Q*Ly_G20llnA9#>E>G(E}RF7ZoNaPbXp&jZES4ltJkij0oClKo|@kQt;=yQ zuiQgKT903A2ID9AdU~3-Cnp&n8=IJ(nfY<@;>Fh+F;R<7RcTjBp_IZf4A-OT10YI~ z&E|+iB8;6reP-syjn%qf9Rb)TA}FO05!a)-9zcNLksyyBXNX3loEaI3e3MGua{|#2 zzE6~#C-5C(P)T3X^CIcQ-oic+V;0BV$ld_-SimRW>liDK649S z5cb}sJNzsH^u>EH*Z$`A{2Bm>7b7HJ?nPS~4XDgrGV`Ak9+|4_)3_AuDZ z7(3J9D`IqZ;kr!{z*nr?k_MJ8?Oy}R*TFBdH?dmm(Ug>ZMFgQm5!RNc#Jjg>*F?7p zV4p4NUe~lM0N-DJ4fFRo4%(uLF&O;7EdynH@2j0mT)8BU|5fLkt#2^}jbD1@lGxAs z`9|y80^k&>Q?z@nKTrnTq{A%(s!pyPsyXamJM&y>c6P)2$Crn83JOCXbADo?7kKEH z0)frK$&W(e=Rb68Alr$&AcDYVGX}bWI1oO>BxHb<+V29X6J)5qZ$DuBk1`APhwA^$ W1A&Imf6Jr*0000&}B9?D;_qjP^E4_Dk_rIZXr@5_SxhwNW-QTqU#b! zh2;RtEK2uOR9SXYP$Qu%oY=u}aAxkkUHHNHnX!{@`bk&wy7$a?zI)D@GlF-p3&rAN zg!sy6jbR)ZKp=%cDfQ%=>({>q!nmvbLa}I$3Y(jo=Kg~RML-UFsU10YjcNG(_sdrZ zAx8J#7*3!1h+meM`8J>D^IY!Q^2*9@`5QOB7^Fm$oovZ2r9?`JWm&ODYYl*ql5)91 zDwQI4@#3YGN00vLa<(slHiQsJDG@@%9fj&@&E#+ zxrbsb0#Zue>{L0I$#5={>3OajLGBDzz;tebHU=pK>+9>h+1Wv3kcb11$BrLoW@e_n zUTe+CbP9|anucvyP48RBO1Vrfmn8^-164>Q5YWL;|vlfYF3uh}N2gg$35u*4WtCpkA+2Ds5wo zgX2uFw^wbC4=gyC~uFvG;d)RgY+fERMAxfzZ8^cmMRuHO)0#Zuq^#I@h0LO8$Z3o*g~w2Do@ zk`|ulMLy3X24OTgJ>SFgJq`n5MkO$2OM1{}Iu?OjKRo4+zg~0H`0Ud(S5C)Ppcl{Y z-R!u|-1>Rw{kX74nH)9#{NBy>^`QGlP9W-S_e=jL3XIVQj-)^z`}VM};IQE8=Y5=} zbtnM=)h|C${*{kE?At&dq7Wd3LLjO=k0R&q1E+u!{CC&_UPk{5M3)+Vci(=**axc7 bAJu;W;S#o-w)KR&00000NkvXXu0mjf=9JIu literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/rpm.png b/sources/lib/images/fileicons/32x32/rpm.png new file mode 100644 index 0000000000000000000000000000000000000000..2ec5f4e1bf49ebb15f6a113c9647dc009eafb0b1 GIT binary patch literal 1001 zcmV4beU0W8KenbO;5}{J5+7i77G)otnzbqj>yY%d-j&aXe`~vG_3N=3m@h+5{l+LX_l7BWO#b0hPN?Zs}7Z({nXHolAjZ66TgZVkGpC z;p3xtgJDdw$i3w?Fg(njn_~9d6c`@vEw5pkMZCc)Q z{VtLC7+V{USXo@f8}O4lpJXC2j`I0YK0gzQaZ=}#cmsY`7FXHYctj*VMk&8;`*BkV z_hoZ6FDjG=FL3n4j~tCx@&3K5o0Ep>`_GI|GBplpi}K)$pugL9J$nZLP|EZ4x33W8 zLDT(u3L0&d@kdVX6*Vz>15huic68+ep5Oq87o6&Y)}TvJE>t_CQU_;1tRjX#1Y+29 zcWueqhgik-Y`S7VS{Sg3cmqK+$`t^?0;^b?4b;H_80>;S1JGT@n+`c( zG#`hrj4?2X>oG|HU%A#L4J=*hKL?aA#7|$}#_DlKQ&P1R5riI-u(3QP-nqj;MRczK z`W#7}+O#VG-(Gzc^VdZVTVjbBn0((Y1Mu$W%`9BIB98j{bE}_rdPe|_&RZRI(zkxB z6>QG{8Xa_U+^D~HMQjj_d*1-uFwoA%iT2L(Kp%ss6L2U0s#6zib>bAg8+~(^ZF2+y zJEfB!h9l2?&~|`4Kp~(cg1}C@s$G{MAPz+M|0D;jH~tq$3mf6qx&4skU#cwFKdS!$ XLA-;Z)`vd=00000NkvXXu0mjf7~RwJ literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/rtf.png b/sources/lib/images/fileicons/32x32/rtf.png new file mode 100644 index 0000000000000000000000000000000000000000..82add4fd7d9520b342649f6c764bbef3f4f637d1 GIT binary patch literal 867 zcmV-p1DyPcP)&d?b}h(cjyfyk9J?*8>p>pxNO`M|(So z;|V_!nRL3lSSoDxaMgHyKS zTKMtJA|mvr`)l@RvI7Bw!~|ffckCSPK-vwClu4z^Zkr-Tc(t|$<@!g}CtW6+jl`Qs z5m>)*I@Ca4go7FpIud}@m8Uq439Eqa^iAbLzgD6gdSqmJsbxPD?&^XHoinP0YKvdX!1(hl14NzH^=J62CbHC zD#gv{5h%xDYO30k>FK(9Z!Sz9y9~n&=+qQ4JzWJPc)&pi#s*O7RTSfK*Ebb`sOuwL z;{tT$r%E0BrqNgMp!~+of6#tS3Iw+QcHP9yuCBTl$isMUTo)19uI-ZhasoIDocxJN t_z1kO{4bC|G!nskdyC~euwD71`akK!VGnYT+adq}002ovPDHLkV1kAzoSpyx literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/sh.png b/sources/lib/images/fileicons/32x32/sh.png new file mode 100644 index 0000000000000000000000000000000000000000..93c093ea40a5612e77fba79565fcc34c3ce47487 GIT binary patch literal 962 zcmV;z13mnSP)URJ0`VB&e z;q5nuGp9f0{>lnJ^XAw6Jkd@kn{JmGJC1$Nz?m?FrBlAp}xNgbCydzIiQ|N@TMceBVFR3$a*?=gOj|8wp^z*wOWn&`FXU~ z7-P^{x7yxb6|EtWILY0+zoND7)FBuWK!yN}CI|ww)+{bAvcA5~=H@1~T8(0H2V)!@ zXM+9xO1+=aT{`;4O_Vg$O0@u%mX^q5G9;5pwztc?f3I-eDO}gXapLuUN_EwUu>b<4 z@O>Yp6mxTPtgWr_>eXM|y7eu~?fbaVRVE|zbw*+Bg)$l+N1S~Hv6N|;r z+T!-@JH+E2lan7|+c9iAMi2xjr8;yBO6f>JsMqu`8gwiJP>()<|wkN0SxwxLoI3moj03#kr58I|A0nGmLjF*4E<*4P{mnp8EiC78y$&259 z>S)b(;XcENJI^8gBcPem@ATm;Md_0hMn)SKignKIwUY9HS5*g+d@IU7y k@WSWzBbEc8(*C3RA7e7Kz2UzOuK)l507*qoM6N<$g8OjIv;Y7A literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/sql.png b/sources/lib/images/fileicons/32x32/sql.png new file mode 100644 index 0000000000000000000000000000000000000000..f6436e7259a028543f2e37a0b2aa58c86feebc29 GIT binary patch literal 827 zcmV-B1H}A^P)dSN^Cy%K*bDFo=+0HslWx;=?i% z2+F`j>^(lPmbPn0JL;D->(1>x_dDl)=k%807F|VE-2!9NBm@YZfB-OX#-M51_Pd3J zc>sUC&JGn-m4ZUOUZ>@i6%_z)w`iB?{t?kl+~1B*z!>u%KM`IIzQD&q0q=7;j44XC zu(npoEiR6`Wx~vk>uKklgL4i^l00Af8~|XPCXcI1JLuh2dAfJkYyRMk&*DHV)4X@ge!qgFC7oNyAgU4GBOb#9UUmDYRyif z%b5W0NCWzuS3^TsUR?!i)`buPA96VW=mQV}aPC5YntRAPBEUJv#jgg2BM}ToA}!orcSK}f%&|I{Edqv-Ku5?{(?Fw=8Hgz;n&2jwz| z2(Kq5g3Ex}nU17`&Fxv=8sN6F+1vYU>GebeBEsZk3j6zehFu7ORB8&lyE~YfnGKG> z^wf;2gQ?VXi!D8yvGq6ds{yNMwzgF;#*j&8QQFxuG(toWLLigQV!O0y=?9r~*3^Qv z`)MFM_tv;KJ2qo3^Tz!p1)m~pe~9uAMt%u&cqF~+HSLK&sZ>I(RzuK`W!X;#Zn3nq zWci=Z=UeP%n|^<bC#wGSfC=4%J|` zJS%Q))*o>0y9&HyMwVq<3xWA;_Bntbju~J;<66@~z5V@;2S_)pZ)~8qudiJrz_q4< zG1h38fu{fl0rcYk;S9jB`MZGG^boS2+XKcQ01fkp>OWMKZaF5Gg#7>j002ovPDHLk FV1j4Ih|d53 literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/swf.png b/sources/lib/images/fileicons/32x32/swf.png new file mode 100644 index 0000000000000000000000000000000000000000..b436429058ff31a71581f5a088e22fe4aafe476e GIT binary patch literal 1268 zcmV9(E6vuz}zB}_~rqfy}ByAUpNezY-ByEg=LJ>)Tg?t7~Q4$jaAp{!T6J7X$h6EB( z0uokGs8U8HE))?Kg29it5nPZcgb-{aWLjq0`M4i0-pq6uX2wp%lf1l}_ul#6|M{PD z&%0MJWokH)_yQqTJ8N;w#2g@yLST&fa?{3*8vs3B@Az;c;U1NZjEuMwCr>5-S#MHR zHjX$K#Qo=un+PEqkKZ|-n)@Wj2M2k%zn|y(`qmB(4PEHpym@&oCCb^!qU=&iq?CA` zH|?wF10bX%nH;0Ny`8?^-X%k)Pv5Etwkm;=2_cYDlAf3duE|MK*(~?9W?Trym0~O$ zW-J_LTq(wdAY}~qGnv32h{mGay?c+2jt-VATGamO@bJxQBvdT|LI^x5K?t1Z;UWpIHQQG6Ix#<<5Cjm++SMVy|B( z`_UncCo#TH)8G&)7MsEmwOfI#SA^0JBfma}79yD37>w5Fi3vhGwgZqqe}QDrA|?-f zh*1hHCEhpZ@O*ztNhum6AOk0*LRf3C)?&5B=JVK01~Wd6zjX@$q24%LFnl&V%uK>Yq_`eRYW|F2!#;gaA{?@Toxa&MI7NZmV#niRe)H% z3Nty0NvCN&c!1d#&jB#vSR7J_5{|30y{Sw{gprmH|;+bVvaM}%OTa~vr|RBgPi$}jhb zXgCEAf;Vc7_^Emz<4kpH0(kPr5UsfS*bjaz}az%2ehy9eATKNpA!HR6@~_D5_v e0u@RpqkjN^K0S|yX>|Mm0000m literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/sxc.png b/sources/lib/images/fileicons/32x32/sxc.png new file mode 100644 index 0000000000000000000000000000000000000000..50676be6afcb59893271b117a9475239ce4ad52e GIT binary patch literal 1078 zcmV-61j+k}P)Ecp`BLk>`!p7;1q51SNuP+uxoV9DEH(S2{WrPbAEKVSawzjGjA}08}}no}7EX zF^=DVPR}4B)%$M@(UxYu9vkD0p&|PF`d%3uAOCUa^yz_8O60OruIx%Flu}rhRdI92 z0Ekj7EiDrchv_?cvUmK#g}(}%ElMB@5kV=1h*aF%{s005f&ms57Kub6^mccLzlq0Z zijgQupw{NX=k*dg7|JT~R8P;5cp@=dNWxQ`fT}45+%XTgwK01BJd()^tu@0#Lja9H z2v{mXz+~1?Y9gSNVs&MW&W;W`J34lK*G`aoODkaVmp~hXs^V&Z_00`dH`epNYt4~J z7>p^KhFMq{@AvPjDyjp!)^aPky+cX~skG+WFN=f^`8nL+!&1WNmD^mtF^jLxqP_Vb z$D8YU=7}%?pJO!W4>)O26#r-pI+1o_dqxYeKTYoI^ z$gz431naOfWD3)>Dgv$or@9U!0@^r{9KJum+x-FF>30GznbLf5=~pga{~KEyQfW=k zi6%}&8+g6H6(v@61l*Fk!w5VXHQaPE21MZB)g&K&b&Hv~b&j_-GW=`{UG0se(vAY! zP`d(7c?G}M;*%7|iATK`|W@RhQ^!z4wm$$h&vr52c@xcpGlqHUFtH5Iorp)oCL<~4V^W_h> zc`Vw%yU#`OdlhNhP#^Si?13PnV6fW>Lfh78LpDb8i>siGU0V#C8EDSFOQzh77Bqmp z=cbyO3xq0z5XHViOtl1RJd*CUO;<$V>4^z`nw@38(HDtuwsHk>v=|x5_a+v@jEo?$ zSY99Zxmf?I)3DgYrAQPS-^*ZC1Y85fyeXzcE!Z>OB^JxJTr#-|+zULrl6H^vFO)i0 ziDHEE6e^Mpo^rcjDR~Ru7cNb?Lu*+A0&DNtcIa$VQ_%zDJrn|zZ6hLUyFTUIHvlcb wA^txs0@Jzw1yZ0!sPNpr&qxAmxj(A^0R@fC+^f)T|MkfQh(xE0*^1Ki9; z1d}$>=}?1<3RM?fly)QSLTiF1m6}AFnBPBU=H2V!%}ge5W->pF2QKgN-hKCe&i9^k z?tQ|JdE$x0B}AS#T4Sii3?L{GY}@|!)ZpN2K)TYeL-9ny?3c~Y&zsS6=MsS0Yf?|% zz26we??0wz5RvNrH->0SGhdI5@y5^){e69}jE#@~ICT2-Kq)2i=~PyBr4&jjEX%66 zWxoLsrC3^8CL9jack*QK_=O99x|}TvkTVfMDTRns+_L=v1PBBJEG#S%iA3n_?hbzw zkIxi?C<#z&%bL&YC3G;9Q{t(fo+I%@V%81eDGs1&ih=Am54W{3dj33;$qTJD!$U&= zjX(%kDgj_JYbZ4VD5Y3kS);R~gU*hQg7?}9a&Kt`%fOq z;SP^Q8+iA*D1NUZZ5!%?UXDEwL=+5mJ3(mM8g0nM$nN4QXk*tF17`-BbI+2g>_!V3 zz%IL~X2t@c${<9suO_BifEtga<+kaH0G^(h;HTMH_S^a*5zbbwK%N#OBfGtc#V{iy zNG!IiPxiUHZ%t|F9=Jf#JP3E6Vqi4`xV>^uRLKNoPf=w9C>G1Le3(+QS8JYvq%E`l zZfV_0lv1qN_yqv&U9gnA?&tY19UAHM(q002ovPDHLkV1kij3PS(@ literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/sxi.png b/sources/lib/images/fileicons/32x32/sxi.png new file mode 100644 index 0000000000000000000000000000000000000000..3d9f31d3bc097cc3e02e84738e9dd0690129cb69 GIT binary patch literal 1067 zcmV+`1l0S9P)NkltVWGnF=(7*U#{3lkSf8e^g$;uB*F!H8lhNKyO?+zM`dfScKf zVA4i99cpkp;5P)uDJIVQM9Fb8}|o+_?mxN*(ISdG{OR z=>6B!G$K;D{>Bh(Y37^JQQjOHqQ9^2)zPuBpN3AI8Ysp@E;{AXu9QM4g=JY~H+Kzy zD8=I965()|z7r>U$1YsBlc#J!09g?clv0RD+0C5~AV44(V19mqNF+jUcX#;Pczn7L zh@t?hZLavdUPAjrStg$D={X!vBxdqKcnSkhRr!Fs=8?8GM$Vr{GI61`W_V}_pb-cG zi$wsKj18qK07@xVmRITQ=%BNsW7oKLoZMTS0khKt+89&?PXnxNth2JdwsTx-4oAXZ zOvy0Jij~p6c28AS9@u5e&E(cLC?%xQnrpu<5I*SVP=gOk2_si-bNR*$zB-Hc=KUON zuIJe&!vuWJp+SGZ35$vVs0?ytAp#yt_~Y(6UyM&Pzmh}&q8tr1@KR5d4_)98q!_I)o56_AKxD1@^I)n&l<9KrTfdKFH2Y9#NalB+o^W~-AxP1L@Y;8!TH9g0h zI38`_js8}YSd{^AQ|dM%@MPFRmQdnzkbid~*5;EDJWaw#)fm`J^xd znXpkx@YN|k8=vIr?@I)Oel##KyUE1trej~rLu*rjkKb-bDbU)WRQbuPBmmnOKL37- z8xH-K-z-RH{i&2y%&f!*`#u`kC>rD|KaGd6=A8+$` zw1M}YkK*?#(zc;K=;i2xK}5k|x8sDit^xrG)qfW2o? z&Flq2g-(c~rXr?N099T|_bSt60eEJ7oS$cAsI~M(BAmS+vdx(@JDS^|zi-0wmls*$oyAhB4s<$}p&pc?V)3fdwj$On^enzEQEu)n8d z6)Zq`ss3CrWmVaH00OJ;+ji(|Q&YhUEC5rv{{@oA lMkxQ@USmlDtGPd_{{h_#$1=F|Wtac}002ovPDHLkV1m(>0n`8h literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/sxw.png b/sources/lib/images/fileicons/32x32/sxw.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8ab14363ebf58d5248e420d51752003c467678 GIT binary patch literal 1086 zcmV-E1i|}>P)h0{NCZhyNm4bzc_+5-42$dQI5)OqyY45A?%cWa_|7-y zoS7@wf-9a#TttXhv{GoQfd&Lp2u#!b;n?8dQ6N+9=s-M?(6z$c+?*acb0z`EQj5Cs z>RzoayZ@e=MhH>4{aO=kZsNPqQQjUJqOZ4iV03Kkm!adw`->@&&raI1ODU03Vi-o* z#U2A7q$HVKBpeRYd*n#Z*tv86IE*bwAO|4?Qc8pnWf!|YfB<}cAM^7IL?RJ-y1K&O z$K%t5NE9VdZL#5Ty9w+KE$a9BtgxtvfXp(N210<#5d3*(jW5TinO{yJ0U<3574TYjln-BT zCT(g=rOB8YJE_@oRi%J5B!(26zdFytYMSBx19Y?oxwn+!ryEJGO|I}xPXnD#J%j>o z{*~m(gF*KA>oBuqoZ(p!0b7A%os9?qN?V>Be%Qx*eLmjrvm7s#R(yT&cP?G~7gK4{ z8AbQu1`bCtP?3B922wYh;>~PW=gn<8+Q+)jGO{Qm8In+|m@Jr2fw$+o) zSPCdj^$J+&6})bP&*BqY{_QRSpNq#MduWLS2>M-|zjB9-w4(Juh)+*EgJHn>=GJk( zTRthQKsIco6nN?+pN~&+<&Q=DelH4`nB8DvcEj3V!$nJjk5ArhLrPFeBW3x?t0Vza zYrgn#itCfByxH{_Z#)-fX(Pkb+&cFbH@PvrjL&26(W_CUA*{s>hs6qXiR(=fAF!O} zo1bse?}W`h2X*BB{aCI3hDe-k*^8lO*7)c^nh07*qoM6N<$ Ef{CU1K_1Wnl@0& zP!`=m7EMAIh*glFLP<%JOHgY$5Yqy68oUkA$F?ha>jIel2RwY8(l#`KhVsSJ~`+ClIax z`Wl9>yWV0gH@w2EmK@dm>TpNumSdca?|->dpj(jx#R_IUiq z9U_TQHrF4rys&~d;3s`C#dvZI<@2L_e#Vnyq%WrM2K+29tgyNMkVs;bQen;Z(@iC8 zQFB!n70QE`IDYCUjwh;k|Jl|1MMHJ{Q)3fMjse=DJor55?_1KdcK`sT0#APb8c`lJ z?bB1xXse7ra(b_*iP0N?dP%jTD{tco4uE)}Q+?1HbP3Aa)tgbNgEJsj5yKw>F>Jcq zUdh^rSVd_0-PM;de_PxG{4i0GcCpo9_fdHOZADH3$F7{T6f=liPErbx!_0O%-&fbo#?^JL$?2@vS7cc{tsDabepb1z@Y#D002ov JPDHLkV1f{m&(#0` literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/tgz.png b/sources/lib/images/fileicons/32x32/tgz.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf6af41ac83d7db8fc2c7171f6194422f5cb60f GIT binary patch literal 999 zcmV4GXg2vC99ztA7Al)3kwF zhO+1mvS<>zK&*lU6-r8)T!LE5hL|?kzQe-yjpOIF6FzBludip$`R1E5XU+)waHTVu zZxDH1TNavrpaDUNP%f8mzjgWYn?T9w=wLdN(MN@yogIDs#*GZ1IyrUKz5BGT%zJ&~ z0V2}-{IzBxc8V_+7Py*9F*7}VX<>2k`_z>yueDR6o}H@6u9QM4g<%+uTWt)0C`B%p zCmaqleeT@(#ap*F8z$S5fDI8rDTRnQZngdZ0{D;ldHgs_Bog8L)KvJ(boxOn5^V|e z+iLK7JOl@Vwi2%-lhJf0V>Xg-wI-nYih z)isos1ad1Mv$yqwZP?zcg8l8uc#^~$pO83vwrRXo335++1@yrsu(U>1pZV2m4Dkz3 zPYhw2yF|jrh(v<`nA^LUfBZuv62w)!Emc`IXNI zx$iR+dKLjjW5bwRe{pwt3xN0wVG=Kmpe>CCRQ5jEyWV7R!qvW{sMaQlM{pNujRc*vi3-mBPA(jx&Sc6;*s zT|%)@wl^QKy0nJd=OuYD!FYTO<0KO{ zMRO%C%9I8#as1Se9FJA_{=KIU1`U<|&x}nlIRAXD!jkZd7L#OwXni#zisHIeUcBMQn{{V;^y5$G0K^LKvubhlZ9bN&k3K-r1h+)g! z@krJl#45B_(~$zwpnz4t?en8ijtB@AScPhBpbk&KU=O^3uIpbP2L^jK0o|dzX%hp+ z!R7FjFa`#3TqX(NDOFEN1520tj{)Tg@YC0~v3ji0lvKuw2ttoRSf8Ha@7&?A5Zx<* zK1x5p8)96Z{9|3EFO+W{9bW1tOW+!v`=FFKh-_A1phfh(}Eig7qLV(Z-2mk|T44S5Gzgb+& z0QlSPXuqPW)Gbu2Ra#zMRRQo;lln~Mdqjqx)=V+@>g zFvi+`^!@pf&05#XHT;%5z`p%6wxp{91x zFnO=L0%Y9+K?LsMO#m)`UE$*D(%LQrhJpcrsO2#@f(TJr#$mY( zemzEay&Q|V#`8=dcEgIylR2IaCV3-Z-|vHB5t76KG#ot{kK=Q(2xjU>M3{`naZoIR zi11=+s(T8UgXxGn)VcNb>;Y~&HhX)YEV-VDKt!0HPGEn3&!`tdAd#5C?(Poe=H|Oc zV0LECHNZ?_wy7>TpR(mQ^6CMrX|}diFvgHdrcv10GCV>=5JDi8Ok=ySX~_qvWZIO1 zwcB|hz3|E?n**D%kb3FsD9}JI zmusra=kv(ra>(cNmVSD@Q~#Fgn97eoDoVAlr>98)`-JvM-P-I5{I1vWI+J+<;QOuZ z<~F(KTU4h5Tgl!zfi~}f=9POQ;Sk^A0cCTu+Qa#sor1a$$fVO25BO|sYIRNX4-5`E zULbFg2vFBFFve=F6nF?=7{CDT4rc(4&Hn|=mJ|H;dwZAh2SCmIqxugoRdj^5OFbU| O00007%Q6vuxv`;pjdBp1=hZjmTbIYnwkl@Nj3V#AFS5fzmzxVA!7;atI?O(9iLrSfs> znWi?1F?H^wC)8`x3q4VbLls4>0&KmJo!#M(ti4{Z&HAH%X|%icdvE^l|K7~b3Odj$ z)#_b@_&|9cicz2dffNGQb!#7=Ir9;)8`nEksaDmbu(`RZZr{061>~Sf^}zkKQhRy- z`M8b{V)*=(;`Jl1@zcr*pA?I{m(PE=QZBC-&z^n1pAtcK(wALIiIfse(_#QN;6 z5*T&(m@-XLFQwW_ynFKGp-Q#-Buqk&CLl-Z0pI71qer=2Dk1jQh39#ES}X#*0;GWL zJ_OW$4Mkr9tyZgD?@pO~!isMJCId=RwuIuvVi4!QLSXfx#v-9WCgf=k7SPDofXf~VF*4Cn% zbaxj`>sDZ(qC=NJ*Ku99uT5}uw0{%Ya0L7<)rXa|Fbo4fW^miR|NDJ@`0;xj$040g zV;BZn;Qxszu)h8q-`%{4v*VCXAHX!tw$0byTxD@_5zDf09EV!1hO@I1dn1chAhc|j zmX>-Z@ooG!s8R~g^JukNB&MfnHCvM-5H*Q!bLGlaZru2mMx#M8ndI{2rJfjS!11O} z4|F%pwQI{3Tp-KJ-NrEk@a|&@w^nH#C zeH>Y%vJOWeh&cw_C@!L z)P;keM;;)@*a(oWKnU#KU9y8Ta0Gan7l&uS1TXuEP)lDYFFv>p4aLzGB zM?cMN{;4!gwIH+#3Nj{>Bvq@hwW6`xG_s1?T1{^6Ir|XP-ozv}wLWm+o&)E-&-=X3 zd(OFnNtpgX;3PtPpp`;19cVxxg}}D$QyYE0dSHC2t6ly;K+hDS(WpLh>{tMhxjt$- z-ix$OsqC(W7i`Y-Fw1yZ&f<`?n~}f-gb+w65ke5REdIE3iH3R~U+nyn!-sz+ z7z{D?7Efa_9*>OyP-qww%`Rqm_&y$whuW1Z%TM_IkxV4aYy^@eC@d)8 zT7N$~KHtH{jSXDA+Rv6PTUoepAr%!B6craySy{>AB}zEu?Og7=%-PwL~c`4Q^U>M5ymZxT|0O2(=UgSLZFml zfu|g_W=b9~lJW~d!K`9T)0{A+5Q3#kD_OSeZ9Xy#q=388dxXPb1_lQBcF!Inw<5H( zeCmiJr?d~Gm@tWb-|eHfw->`O5~?VL)?gTkwoB|Cf`S4Q(=?xvl+@PNIs%d>0Xezi z^y$+CgO}*)I>pGyBkJnvaJgQ~Fz#k#n_019WlD@(kh$7WB=&RwN=i#Oc<@KI zY~9M}<1yyVpU0s?ljD+7H~aS=AQTE?SyoDnS}6bd7yoEQg#A(YZA zUA!1usgxMG&XpIMP-{ipvMDPoo9KjW2a!^WCvgj<>?t2+nH6xfjcwalmWA8xeqm6p zHC8;1ZQCg^UW!007GvC2%$YkEUX+#AjN6J>ES3^O=eXWv@xY{M8hkzi9ValP%-PRL z!`MpE;Pa)#P}-ip2U=Ud=4Bzs(}YN76hh}qV47FbtOW9D!|pZR+&O=TnTE&fftDNu zwARs%&Q1WDbu(?EE#>vd9!LeLfTUBzzk-Ow|LK;mkJu zqnYND3blzg)}32NM`!1ABwnckP7>W~x^sI#2vMfBjWUV8FJD;~Slbo#>(`e7_cE41z^Jv&cDX;Bm+=Dm5*q=Qun~ySTnfwqDgZaH u4)=ju&i?|D<_A~$y?ure2S%NLM*jo&H8~hmn7EJt0000mMGH^YK3C z|NNhi^BzGK`amdj8X;a(j)S5cC_o^Ez_#u0T3cG0fn=$x{R5$pS}9CTO{wnQ-Vh)Q zJydu7H)kcRsDmwWp9&IY$`eQq%&-0Wmpb}1!N zN;FL?+0ttOgp`EC_o%L}roOheuCKrUc22N)31lFIKuU=aqGU_o4prx2;W za2$u%fyltMXh{LODk*hx?dDJAvCs<^l>$&ANqv`DY zs);+3)5H=p7={-q1dijdCQuDZ6>P%{v{dw(5RASZrRGx~4UavA<0u^E@cFCV)O_OM z*p6PhFLff2NGTZl^&&s-jWQGe7mx07`B{7v6fMG8JHq*nI3w3CV_H5;(?{s)XMD8n z1pB++z*kX;RZ+q4Z)2SAh%;+PKq{o>>LMwYNI;6L2|+9oVeEj-$kj0n%f#?n{CNE& z2b+&_ZsIb-6Bige;1Ekh5JI3y4NYqE{FJSLrpc7e70Kw8OL)8{x?wT;=V|sfy-U(g z;?cox`dMXFvC68#Z&uEm5v7dc1?>c&YaaaGN}lKxbi8tq8{r9thDT_qts|M#xN_$# z?M(;Rc+^0X8ji9-2qO36{Iq|1E=r*-O@Z`Sl~Ph=Rq|w~V0X(tu7}5Q5InzmGee{2 zFibDHVeor+oSjX3kmwxQ(M2K|=h_D<<6~JVSbs#YYug_Fj{k+%@?lse($Hz#(#V;S z5e(BpdJJwyZqWKtkoUga#rR=G%#JUZjwPo+y4pqoC;PilIX#@t?e{+n(zvAwl;9sH zOl$LY)*li~98$#N_lr)?q6B_9tmfV>1@QR$0z>m;h$#Rq>qiyX-sC4Bvqck)#)?L9 z;hot9=c3VA#*d@y^1EOqAPPvRmtLC7AfT2?pv*04vDb7-1fCrnWO#Ctl}3FaK>Jd~ zR&8y0k8{tvue+@j=mn+g>O!@(&HF7xw$Sym2;`C|&kW;Ph z$a9s*jW+jzc@@ah4SMcdu#gisnS9X~l{?SAK%YOch`eRn{`S?Y^KKxQF$j>hjSwQT za7t$J0I(K#kpB;Nft&8{0+FMJKX>20!iWPA_lN3#``yX*2WqtZ00000NkvXXu0mjf DDdsG- literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/32x32/xlsx.png b/sources/lib/images/fileicons/32x32/xlsx.png new file mode 100644 index 0000000000000000000000000000000000000000..920217267c3909214dbf367ed4e5fc418c284dfe GIT binary patch literal 1182 zcmV;P1Y!G$P)5YgL=clPl98g_C|%#X{;{=t-P*3*#y2^+y|4G2 z`#tBLbKZTz7|ixa z@@;B*eh0K3@%yivw-Axy{nwhO=RL*uZEdV>XrMYAUe12H6`e}c8P#pLLg8=_l;No&B}EcYGA1I#hhy|?bLhI-gJlP>{5C&d zKfw0-J)G^mL}%}LdbYX5hhvBchB7dekzr@b5ikrjDkDkKefc6je*n|6>HhmTo9jLz z=_K))5DWyFWtTI{E+-f$%jgk>wBiZn1YjCIg8nj|-z_w~wVfN$UQTs(QC+o!WYXaB zoil8x+s2|j7KSo#wF4r=9wzu@>%fSYViXsFR9jU_QEr#=M?k+Q{9+KltquEIWX*OloRt zINjBS6|hl0i`%gqta!75kH1~Vm7SWnlbFyQ3qAtnDH{zOINE|9SHr2Z{qd)h)YR62 z7XEdktf*hjf*nHd4oxEQaMJEMDS_X1>XElg9z6GnU>UwNF%4jh+0l8fH`xiOv7{Lq zicjjr`41mVcs4W?Pup>|GxaK%2}qt0nuVw4GzjQo2~6=yI@xQwAOf$PJV|F?A2W?` zD8z;w*FekG| zcnGu~JJ!EfsYg}?n_QRrWy_uf?qv+AU!~e z6imeKcxb1#%g)+eR!MltWOws+Wp$&`dF4 z`#hVQV`py<8SINN40%_p0XznLpyL2AgEf>)0IJIQ_b&653iFl9HGkL-@}gS-Grk0& zF=&db0WN-Aa(;O+?hiv|$|W!+aT^ZJ8_Yhxt4@>$uB~NmCZq(=oB`l=6-XNIzW}Is z=>Tj>y)z1=jsX?DTL31Zym7>Umn%SMdbhj{Ng0IX90Fp}0%R;nbJ>QUS5`PaILJNP z%hf7uZcZ-tM&#(U&l|=hzVGrov!u&W7a1G0J|d$FE>oILa$1ObWDS$xas{x1$IZ|M zcQb&9%y#f32p70*uJL1c!RRR%CwtOI|K@j{vV}4U4kjvC99ztA9XQ)3kwF zhO+1mvS<>zK&*lU6-r8)3_-1BLrfcN&t+lH#Bux>JK>YAt~H)>?svX>?zv}#U3jv& z+&754t}P2qKhS`nM5tD)x8J&W@lBxO);gTc<@8};Yimnizi}f6s7{M|8h!_~uEo8& z_5cy-J$|j3NSxq{xj8OpGR#a*UznSp|2}i+(rfLMXk@2s*_Bc#r7#S`^{{OKL@5e| zBGG7+=`&}}&fmJV-V|(00uDq3r4%CKdf4v+2oO9H|=Q&Z6|v)Ko&NVFx; z@37(b`3Mh$9VK2#r{mdN&TJ;(X-z=&l>@fT^QTU6{pL-iel9G_;_XZZ;201F3T+7J z`W{M40)?fI+1dEPaqOH`!Fl#%JWcA2Pe`3Uz0cmNCAqJ?0($QjSX!g%b8-19L;S+i zV?&tcHnHdtV(~Bl=H@o$AO8@Gg$Yzw_&GOA-T%fsFxYVj=nm~on;bCq zZilaeF))bhHc0?qrG85qSi0JO4k%xUpT540)nkvQq-HB32t6iYV|hxxbBBXMbgu;Z zY)QLa)2;}7d-YY!Ul%xR#FEo6@xEIH_TtL5{fd14u5jg=cIM{)+`<)sMu+yI{k+pR z0XL2tRXB77+(gyOqU{Mt=ji&4vXg&L`&+PkboO(%WLo+6G*!^;^2rawk>@^W*+3qk z5KtCDV7pb-wlM@GfC&E|^1xc-cY!pi5pM3=4;lYbQ^EOA{SU`BZ=1#^@09=m002ov JPDHLkV1m|h;4%OJ literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/7z.png b/sources/lib/images/fileicons/7z.png index 52f7d5d72082cf8deee1fdc08a8bc68cd10ab000..037cd73a04ea542fa79512e7a8808b393ee070d0 100644 GIT binary patch delta 400 zcmV;B0dM|`1)l?u8Gi-<001BJ|6u?C0cJ@=K~y-)os%(6!!Q(vf5%aaVCqtJVCVoB zs1R%vF4NwEJ5*|iR2+t~fdm&|V=2wjR88YpdCt#J5;ZA;!Y^6!v;98%{ZCdTp_BrE zQvhuMK7LjR;GJX+03cax^wKn4Wm)D#gx`%cO*tNqM*zA2Jb#iEz-5+YE{uh@uF2o$|wP1id0Ji{c@CS9y`*?Yp-TU?AK~Q!D)1lgn3w^xJ&^kfStKU2w zs>;E7ysP8p7O;U~c|>rja-!mI!Q00{s|MNUMnLSTZ}!m$bf delta 637 zcmV-@0)qXY1B(Ta8Gi!+001a04^sdD0aH*+R7C&)0Du60gLW{Zl|z1)y3oqEWn3Gu zrFgfeSHruX+{=AtW;5i?t=ZPh>fNi{==UO6u6R^!Wby`Sx~` zy{Ws@jfj7)zSrpR{ps=j=iB73z}U0H+RV(EY>vQgj=#*z%yN*wa*@C6(41L;#+{Q| z>DR@2mAhDi#pvSN*5&$Lgv4Hi#F?39+UNV*=lg=1yxi#g-0Az=>HOX4``zjMVTi+G ziNoLO``_yPX@6&4h@imW?EK;E`=y?ci=x71io%hn#^dh%?B?)>HM{N?Wb=I{LG z@BL?s!I!MbvZ|Kr^8M`d{q6Jp?ezZc^!@Mj{qObu@b>-k_xMrVX^g>_m#BXL0004WQchC&Nn=0FFyT`U| z+xGlFCo6jPgs zm#-mRX9se>EO*m5xUENFAZk@(yzBC!>{AfGy&zy-wt}zDPyKzq_z4XoD-nXvPF&ZS z1TpBD&~~H>$*W~|&$b#MR+(0m2;ws&aXrbGzL(wqCEfTCKQTE-4~hEEb&2W{pTYwQ~`nF^1M!8e?dT z;bya8mSs%Slp?~SD46FtlO&k{IEey*JLg;zsOuUeAtJEWqSx!~6eEt~i&q6xO8KHf zDFx>owASc!I>@pNbzMV5(C_#Ei-ZE6?0v2E&fE(&v9odV8^BKhKkxwzzYTD6H@{Y% z{E&=yHasL__*m!zz~j>kz8v?4I2$J<$$g`@_tsVWM32$0D}))n1=S|Cai~ZP;7?dU zPYgvvh%FvJ{R-bt2e`eTUq`KO99e7sYORmLKfVXGbFS!iyO&YW&VvKU%?$vg{{ZOH V8Vua5V6OlG002ovPDHLkV1n1nx6=Rs literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/audio.png b/sources/lib/images/fileicons/audio.png deleted file mode 100644 index 98883256d6cd75ef9b73bea040bb8dac1588b97b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 727 zcmV;|0x127P)igX2`{3*RdwY9%d3ogR{N?Wa=I{L8>ip#H{O9of?)3eipP!4O z!r12f+2;G&=la^```+pM;_Uo(lf8SDyj6h6hk=R zm6eE~z>blZS%JoqsK%tHtEi}`m8-~?tjVmbtfjBKow3ccv$LbN(YCq0sk_v@z{9h{ z+QP)h#mLLW%F)Nm(8HFO2{N3sM-Rb;kjKOSimj~kKpV3iHwus z>-^yC{Ne2Ta*)5`?E8$4kaCf~adB~XcXyDImE-RG>El9GCryIo#i{6OKNG?xwbAD@QaG$=^6{`dR*sWONl z0B_n5+P)746u*b$;VRJ=6L0hn@+CRYpeh+nl`MSiD!L1d`D;cL#Mhyk_tIgV2k%qX z$q0hb7|<)SL@>|Vmk;5i?(x``@zv(3x_#HI2ho~nzS)jTl` zP)#u1T;=AimdUXQfREp@YjcZvd~~E1;Kk)~o@}hmPW@H5-Txf`D91UtYL);1002ov JPDHLkV1n4(zl8t* diff --git a/sources/lib/images/fileicons/bash.png b/sources/lib/images/fileicons/bash.png new file mode 100644 index 0000000000000000000000000000000000000000..25758464919d6025affe53bdd12edfef3b56b10e GIT binary patch literal 433 zcmV;i0Z#sjP)8RL!QTn#Qp* z&if0Ls0kJVMjF{OZ|2Q-YzHI}1OWgX0_Xz>@wvnR-bj`J0Fo6j%=3I*6onHJ`ZUjT zP9~FE07n26$p*oBQ4}ssQ*O80TG#6}SF075%OypGi^YP|>9i)2#1J3CgmBh@ju^zmv2Hs^n^~wQkrIVeLB`M>ha20bJl4GCUdJ;pyd0 z&7<+Zc{FY$&!aKgcIB(q+4W!iI_M1*0F16?jR2oLx|)6HBJA$J6I4OI4tB|Wxbg+H zt9^!tz7BlVe7M-`^~bkxdOX16^UGbZ^BYIj+Iy|_Ui*!Eq;$?@-EQ|!(E84UFC^C| b01*ENuc-o#Js6wPKPajN_Oh!aUEJWf`L=x(9IV zbqr?K+9ps{6-YuvV2r_FFxY5D5Cj+B8s_`HYbt!-hqV?;DfD_hBuRp*svsf=!>~5# z8aT0=E2TELGk&x%!s~4M7&!4Ls&C`rwywZ&7wfKnzE3eYz?t99 z+}-Flw|U!mzh4_P7)9I={l?LK2<;5Jh@HXHwv6qPyF52|`~NMRT;lcR`O$0r#&cuL yR4KLBJ=zbbthIT+-@o!Y-}!I{v4a4JzW^~^16k8eFAdB90000p(R7GNML}gqXW@a;KXI_JLFjauaS%Jn_ zg2i2g#9oBNVTi+(h&W=2!)1!XXN$pUjKPhFe{7DxZjQflkiT+~zjl+oos(Lll|y=! zyL*+qewVtLnP!5TyrP(LuANGSoxX^mz@?s$i=x7}r&qA0cz=fNj7+vL{e`sm`?*yj7$=KI>``r7CF-01t<>HFO2{N3sM-s$_^>igd6{NL*P-|GC| z>-^yB`{3*R;D7A=;q3e2?ELoaz~b%vBK{p9ZagKA6DMY}}aC5io;nkD? zcvU?{Q-fhafXyB!#a(R%42x{H7fH=V6pn5HqMqj6yjsu0tDk%F+o0L!oc`c<(zvNB zG0(PMSZt14NG6y?Z9ZIjwY; N002ovPDHLkV1lX2f6IQ1OvQ)oegpgM>uY8bF=qb=n+7?X!K7e*_p|Fnf;UTNW$|x z0N4Xi2jHVzA%ItsIRJoU(P*Y=I?b}oi3m4Enx^b@I@bX90e>ixD}a+M%Um4CoX_Wr zm`owAQFpDu|*8d7eW=P_NfN zAnSl)xOi)=SAX&XxTqbsgDU_R0M79XH4htj>FE-qaU<40){Vd*xIc%{j%ZK zXsx$@ r@U`4ImsG3OGjHvj8^7>H0EF+{GT}?;i1q6L0000aj=*k?zjBbja*@Awlf8PCyL*+qewVs}n!JUb zzKEc}i=x7eqQZ}*#F3}QlBmX&tH_tE$(gLitE;S_vBU6Q$I8dY$H>UY#>vdd$;ryf%F4>i z%gf8b&f&t&;mOU_&CSil(BaU~(8<%|&(qt|)6~<`)6~?|$=L1J*Voe6;mq0X&f4tG z+wRZX?$6xs(tq9V+}zyK-tN-g@7>+q-rnBe;NaEd`Pb$9*yZ}*Ga;}``+sO-|G6`>igg7{NL;R;OqS1>-_5K z>fr4B;q3e2?EK>F`{L~U;_dw7?fc{H{N(NY?Ck90?tlE_?)~KM{N?Wa=&HM`e<7p4#Ldmk*&;XzN;fZ~Agv+_A>Zx1$LGla92DV4RY@#? z0+Zp|?6ou6K0Cax9~I!*j57l{f_vT0dbtRqs=dYV@lZ?bA0BJsC zeU*bsyGWi_@)SpSSh)az3KSW5;=k=;S00HA7MP-K7BV-CQa_g=L-IlcYW48R6K cBS{+Z4=13NwmOt;?*IS*07*qoM6N<$f~E-I5C8xG diff --git a/sources/lib/images/fileicons/cc.png b/sources/lib/images/fileicons/cc.png new file mode 100644 index 0000000000000000000000000000000000000000..e6f4c64574b1319b4b198d6a0ce5839c16d08d7b GIT binary patch literal 411 zcmV;M0c8G(P)3;qEqDUA3RL;+F|$q&%cgt&>LI6j}e=b=Eh zh%t!ANGsj!X-B)WT8|_=&jWxx0Brz1zDEe)g=7u@AX$9$(llLWS>{B9b&;kihr{6& zfGz+|k8)o>vfAYyNrBq=mlu~fc zL2Hdhqk$-jkmor>1nqYFU8E{d6c=x;^#(5l%UpjDTmm=;aE4!?chJH8cygoail2f3 zo`S)b8~~=zuh`mc_58Zxql@b=`G$$jou0x!@oxdIKL~E?#sE;ZUgZVECeuG};c&l$ zhsVi{_u(3kthIMq>+K(mmOJN?X0v(fRnEEd3tt34_y#T8>P`jiVu}C&002ovPDHLk FV1nmXwuArx literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/conf.png b/sources/lib/images/fileicons/conf.png index 20c20fa3d35e13a1ec2f17b5d8777d25c37997be..94ace02cf3c4b7e29c7947068754b0716295c1c7 100644 GIT binary patch delta 386 zcmV-|0e$|M1(E}h8Gi-<001BJ|6u?C0a-~zK~y-)rBgdj!$1@q?^+3MnkWSYXFv!_ z$Yu5z+#ym@ti@rVqzFeyK@-JI9L4c^<+mORv{oDt-;qZ9KHAZHv)Y6tk|Y6ua{yxi zDZWMy;FV+x03aC~mvvq5nx+XN!p~UOHRtpB48R2dMY1Pw-G4MqD9e(E!=dADx8ruZ z(`#p=IV4mj`5mr^jvMgz>odLK=P6VDq z2wkCVTabi^z{LqCnfW5D|>W<9Cr$fp|H_ zTI*gO1-qKH_In<{6u=#Rfyrco<#PFu0+~B37%_B}md*+cDn+a07*qoM6N<$f-r}!-~a#s delta 651 zcmV;60(AY71DFMn8Gi!+001a04^sdD0d!DIR7G!iDpi2US%Jn_g2i2g#9oBNSclYM zh{Ixu!)1!XXN$pUjKPJ7jAD(|iHV79j=*k?zjBbja*@A{j*pIykam;3hLNCpmAiYD zylt1-ewVtCm78>%+=80Cc%IyaoxYixnu?vZl%1=Hpul{g-G6+c-kP1Fot>S1qTh?6 z!l0m_m8HCqr^ckErH85CrlzKktlg)nte33GsHv=wuGWvR<(9D6qp!rBvCWmU=C84{ zmbK=gw9ccm&#szUjNWyQRPBuD;i= zzt^w8*r~zlz<#)b`u*dAO$n3_(# z)Y;P2+tt<8*4Eb4*WA+L`r+Z>)Z_ZripsC z{NwHX=fZ{qObt@b>=k_Wtqr{qpzz^Y{Mr_<#QY|Nl&W(1Tuu#Q*>R0d!JM zQvg8b*k%9#0MbcBK~xyiV_;xl2y}I@Fw)VKmy%+D0N+Xokg9@;cvqCi>Z%8nOI1Nd z+)E48l4F$0fC3N^my$&1Oa&`DF)1mCF^c3=DEXp?<2C zh4~=)jC6hm21zF`8Ec3Flk_w$1_oQUYEzheS}F&~7UjZxsEX7SR*--^Ts|d<2_zsZ lAt5Rxz|G0d!pz7B08ffJEQcpk!vFvP07*qoLZ%z_0R zfDkdunYm1Ii@5_*vT(#fNN-C*eb-kym>aKt! zf*=5Zp8&c5LVRp7fG3hA0Dxq5(a-aIRTPC25$^Il&p95C&wl|N0#GEk1kQ@0aA}%y zv)RW@fkl3 zI(^k74@OfAM$pp-`|6`IE7A8b{Ey(9pX}pG;Idg>v&7F#Z1(W&S2#K9 z;pX=KB4}*mz*>8ywch)zH2|e^E^D{jzXNZbdtV^e9T)(JUjWr=_uSq}r>Xz|002ov JPDHLkV1m6vzheLZ delta 810 zcmV+_1J(Sl1GWZ`8Gi!+001a04^sdD0qIaoR7C&)K`kyZE-*7WJ3c%-JUTr=Jv}}= zK0iJ_K0H4{KR-V}K|wu2OF%?QLqtYJM@L3UOjUr$S%Jn_g2i2g#9oBNVTi+Jio$1$ z!D)=aXpY5fj=*k?zjBbjbCSPylf8PCyL*+qewVs}n!JUbzJG|Iz>A{7jH1GirNoh^ z#*(PUm8-~?tjU?I#;dEWps~oXu&}YRva+(Wv9!9kxVpEwyt%r%y1Kf$yS=`?zQ4b} zz`(%4!NJ19!o$PE#>U6Q$I8dY$H>UY#>vdd$;ryf%F4>i%gf8c&D_b&)y>V##?au< z(9p`%;?L9D(tp#`)6>(`)YQ$^W?$qG&*5L2e;PTes@z&w=;NalZ;`i9%@7Ut-)a3fz-sSSy=KI>``{w56+vxh?=kwp__uT3G-0A$?>3{p)>HFd7^xo?G-|PI~>-*sA z{Nd~T>gwv??EK;E`{C^T;_dw7?fm5J{Os)P<9?)~KM{N?Wahk>S^8M`d{q6Jp?ezZc^!@Mk{`>p;|Ns9L z78lrr@PD5G0004WQchCVgLbGTi2;B z_Wrr^=P4}&i5R8y*;(6l#8}LoqqGnt;usqcx**im+F}pT78yI4cverE(B0Y6Qm+6K z(Df^wHl?S#t);29Mjj-fJ#9)sW_xQ(eN9z`EJ#3Wa=HL_S$17bWn_^wNI;{XCnzV4 zEvh`6KUo4Kpx(|N*TBKD$b*lIQ3@oW+RE#j5W*Q>lEjoM3KCGMk6>o?PAtsN3eFG$ o2_q;gD$2{rNQ#Sz2nz}V0I%RjJ8}rPaR2}S07*qoM6N<$f(xGam;e9( diff --git a/sources/lib/images/fileicons/cs.png b/sources/lib/images/fileicons/cs.png index d3afa112cbf6e2e40cdb8f067b9d4d6498d9f2c6..31b7f76610d5c7a9daddf3b062aa3b34a24e8229 100644 GIT binary patch delta 404 zcmV;F0c-w)2BQOz8Gi-<001BJ|6u?C0cuG^K~y-)ol`MR!$1%m-M6Mn%Tkdnd?e?b%=fk-|;M-$>Ej^g-y@}7qRIf{dUz)CCK?rG+B=CmG3c%BCU z2LPG?eEb|CfH#sk0Dxq1(Mi*Eo@JR65msfIrtJ6oHvrlI6o1JQ!D*IdE{J)~MBLh@uF2oVJZ8)jR10*8na7T;LDUIcnkIX>_Zqz%M}$FG26y8UV(x@7URIbo?rC z_iFfUT{5x0*HOQX+PxZndA(%%HhO;|@lJZdU6qVYV3iE9$@t&DaD3Rp-BSQW1U;u`T{@zgdeo*@J@-C0u3hs0000a#$ti7U4+D5hR0%u#$t)XV~N9Ni^6S= zz;ckkbCSPylf8PCyLFbvdzHL-mcxFRx`LX#g`K{Lpumfw!hejS!jGlIk*CIzsK%A6 z$d|0inXJaEtE`~0$gr@mv9hwVva+$Xy0Esyx462uxxBf$y1Kf$y1Tu;zP`7>%)h_C zz`(%4!NJ19!o$PE#>U6Q$I8dY$H>UY#>vdd$;ryf%F4>i%gf8j&DG7#&Ct-$&(qt| z)6~<`)6~?|%YWDD*Vot5*x}LH=-k}g-QC^Z-rnHg;MwE$*yZ@(=H}+z z==kC1^WEwD-Rb<^>HFd7^xo?G-|G9}>HFX6{NU>Q-|PI~>-^#C`{C>S>gwv??EK;E z`{C^T;_Un4?EK>G{NwHW?B?tlE{?)&BL{N?Wb?d|R5@BHQO z{pRod=I{OI@BHWR{O9of@9*#E@crrW{qXSc>hk>S^8M`d{q6Jp?ezZc^!@Mk{`>p; z|Ns9lFE3w3`Yiwe00DGTPE!Ct=GbNc008(&L_t&-(_>&@U~qPG(A82`QBqJ~00CE9 z*H#yMpMS{yK81-O5reQ=J8QeL5cA$1g^3^$$57vZ2?4Iwdfi<>0icL`N0gtJm4&T- zXS)IjFxce81iRbVSnIU6HPn<80ri;qg?ZYVngq5qR#z0|fh{t0GWJMnYN#yF&(D+r z321xAwY5}NmgMJVBuj$?G}~Gls!NOVOJdU_ByT|i8qIYzrG@!b>_IG95+DJ!`s$*> z>~bD1ZeAuqkbr7waY1HAQ6Z-hTeuiVK)EPCBPF4Lm5+m+Q3NEQl$n+oZ#gNI*`GOD o03@I&Cnqf>FDou8B+Snb0C$E$1C$IhBLDyZ07*qoM6N<$g2_0^B>(^b diff --git a/sources/lib/images/fileicons/csh.png b/sources/lib/images/fileicons/csh.png new file mode 100644 index 0000000000000000000000000000000000000000..cc21e79952e61b085e897c158f3bb33b54555714 GIT binary patch literal 427 zcmV;c0aX5pP)y>ByD3C4N zgzreBo!Oc9W_DKNk%Z@Y0I&m~3&6+s5(0Q7nF9bw7J)&Uri(1goQQCprfJIYczgk% z4?vNu5gcY&=HfW!YPBkLu~=|EpK~^wQA9YMPC1!ON|I`8hay5_46U^^#?TnU<#Nd= ziWr6=MTAL`FpgseL2v<}?==YSopa?yp64J55rMT9old7V4Bz*UJ`GGMRSXqMDLCh# zwMMJeLKH>F^Bf|AZnyhE(j+Lrg{`%&`2}HlcQ6Xh0h|Ij!5?I>*Te1o)0L`%AA=Dd zgHf4O^_%DO%NsVfI|IK89-dv+z*T>p`0cHM`YJd)yR3CntzH}YcNLl>>pJoQTmv|% zCO7S`L~Qc>?_b#8?cwg>>B_5Y1hCR=Umcmw~xKXI`@77E?)p3d^&fq)Cp(S*2(qc~o#JnKh+Y}p3FXQYw#&CYu}Gpq4P!t*=; z*a6T5;A6do0A5Mv005H3#UM@7MV4hwMEI4bY0B|jK!1^}2^?lw=HfW!YPBkT zu~=|EpK~^wQA9YMPC1!ON|9=5hay5_46U^^#?TnU<#Nd=iWr6=MTAL`FpgseL2v<} z?==MOopWU%&vTH3h`?HlPN!2FhVT1Fp9ZFsDuxQB6r6L=TBFr!A&Mg8c@7alx7+;? zX$lnN;;gl<;eSG~j2(=Ea{#9RPVfgC?DcSa|8%9Q)iVVx$FQy_!SPm9{=P#lbfgj0000a##n;IU4+D5gv4Qp z!(xfUWs1UQi@|A(!FPvQgj=yq{zjBekc9Xq&mAiYDynlX|x`ddsf||UAoxY2r z!jY%Ol&Z&UY#>vdd$;ryf%F4>iz|7#w z%gf2l)y>V#!++1=!_ec$(c#e0(8to_$)8xw3;?L9D%GBi2)6~<`)6~?|&DP`2 z*5udM*V5SG&DrhC+V0NU?9STl&)e?L-0#xe?b6-u+}zyK-tN-g@7>+q)Zgya-|ybu z-q+vm*5L2h;P2qz;Mw8t+2Qchigg7``_#Q;OqO~>-^#C`s(WH;OzY2?EB&D{NnBW<9?)~KM{N?WZ+=2V z^Zo7f{eSKB{_gbs@Adxs`}_a@|12{-bQ5vi00001bW%=J06^y0W&i*H`$DHPdm>!9!`;!%a*FH0ErkCO}DqUpO9^_WU=ZBkcewuRNV47 zPiuok3xNVa5uf>0(Lq+0c7_Y)se%B5O-F5pkAIDgwcfnBGp6z<5?~C=ZAf$E zPdG`k1hTXEC$KVmmx_P{)KyfJ6y;^4B*a98g#jlPNGV#0*3kd}002ov JPDHLkV1mcw1T_Ev diff --git a/sources/lib/images/fileicons/csv.png b/sources/lib/images/fileicons/csv.png index b604453c47ba8f38849dfb4df8f58be459b55ad1..af37ba577130991be50f61cff50bb49d48a301d3 100644 GIT binary patch delta 394 zcmV;50d@Y61DOMm8Gi-<001BJ|6u?C0bof)K~y-)rBgd@!ax)p?^+Pixj_^uat0KU zGUPHoM(%(Fg{>SWDN~R`qygMugzvAvW!s_EdbnjJ%Lx} zT$8A(3M3&Su+}07g3dC0-@p5^Fr`$zR4Aq3oP*XHgTVl4nxd*IhzQ2x@ux^%peEP8 z*18kdf=w=pqJKvK4*=%)116IR*6a0?YLmk-L>PumQ#jJJVc(`mWd(sr~*`K7eNc^K;F$e+hY>zy13ayw-2Lwbs69t*?H%8i2|< omk)=-d$0GMC%+)q5CF*s26p!GDPn?s00000NkvXXt^-0~f`clyxBvhE delta 384 zcmV-`0e}9P1CRrd8Gi!+001a04^sdD0J>02R7C&~u7aApdzHL)lf810ziy7dX^g>T zio#)t!(D{LSc1h>fXIcNzT@ru;q3h2>ipj6``qaJ+voe)=KI&>`_|<8)Z_Zn;`&*E z#)zQ6+=0_kiVI& z%I)+00KfoxmAn7{|9+RcufW*(`~Ua){`L9(^!Wbr_x|wq{_phtv%}h{yVRq$(Vel) zm#oQ=r^bt-!gr|`1poj50d!JMQvg8b*k%9#0E9_IK~xx5O^QJZ!axiFXJU`iM+hE7 z(4+rUGBe0_O&tJ`Q-~Z^9uU+6DoiQ%4j;wL%C0 zYPq*N9TikiR1``F1=TXN1P*3q&ZFw11JZnfJv`knVAH(j0@5B}TEXgL#1{I>c>#FBEb)^v6Nz^9 z0NMZ|e2)ac8_5a)K+*+zMNurvva}+?eXA%64u``5fG&WL+M=D zms~6soX_VJ5zb~ajz*)cNWHXk5uw(a#u#d?skP>6wPKp4Op=5m!aUEJWf|i*9suYD zp1{;vyLD7m1(FaE7-P_CwRV~jMbX8lhJ|71nu;(CVXcKy3XMhsX_}&{Du@W$?e<2* z7jR^^S4!>JPJeLgi~G0(a0B2Pe?aH-3eVHYICA8Eym^iL+f4<|c0ND;{yIVH2)(d= zay`-6j<7F&*xU$wiF&fL>w@qkx=np)T@&Et;07*qoM6N<$g26$- Af&c&j delta 632 zcmV-;0*C#j1BL~V8Gi!+001a04^sdD0aj2HFO2{N3sM-Rb<^ z>HFU5``+sO-+$`--|PJ9>FMC>`{3*R;p_b1?EK;E`{C^T;_Uq5?fm2I{N(NY<9 z?)~NN{N?Wb^X=m1@BHWR{OIug>+=2f@$BvM{qFSr@Aduf_5Sen{_ytw^7sAo_x|+w z{`~y>|NsA*008c73$g$J00DGTPE!Ct=GbNc007=eM1Mh47#Rh@F-pU57{=jW%{P=f zI>in}bg{-D3Qi841P{<_RC<*_S3N+$sZMS#4x*ya0|>@|2T|PE2U|Kf@^Qvcj-z4NQV?+%YTY9*-?;jNJ&81R2 z8a?TzKXJ~#kViO1pls)O@En;EE~7^jZ!bUX(SB0$Fk-$eH!H@4cbjk-s`ldiq;sX@ zon#Q7$~Mt;N|I!t>&4-A?plYtWWZgy%72F`q>vjBqoFIw!zDK$o=`}Vhw~4*Ad;GD S#S&`(00006h2K;E*6X0X0sWm(>L? zIiJs&BnjgXti1^%Lv2p{J(`MrK+Vu zDFyF6wAN@e8c31^Wm!T*&~CT?imVG%k1Jnmy}~QOI@XKKEr2Tkm-qs@CmsBL89kyG znJ4~3FEZ>!ruLVyiJxBIjl!yO|K(;V9t-5qlnU`P(ny~1%xBNDtVlvB1psFN zh5&l_-ZB8MBpUz#$*?i1s%lf$wHFZ{^Qx*inN02hoCDA#JAZ(2UDv)S3hs8h);F6C z*XuP`s})6r%jJ^O>9mFHUu`TRwARu&M{6yuwcKvE%=4UCmQh4lmL-d#V49})0M69` z;MsfMCYq)JNr(uXbBLm-BSx>+yZj=U);fp^tu?&&Fvg(Y?<3E1G))5$!EiYIfE)rs zb66W=I&lEDIe(<-9e`T^H~58J$1&!M#e)vbOcF3jIz`9gkek1~0Z}y4`zNc}tSw-Y z9F5g%_DMWF9cld2{tZw_)5oAe7-N6t!?;sZmM?#Pg{wHm(_-oIr+h8 pjrYDB3=HC1IGlA8Gi!+001a04^sdD0W45VR7D^leF!g$1vY{RJctHDn6fg@ zkgnE~tLB}t&7-!_sk_vzy3nt@-><;fs=o2F!`ipV^vTlV*4*mS;`-F%`rP95*5vxv z<@?#@``hRH+<)l%-s$_`>ipsC{NwHX+=2Z^7`%b{qOYs@b>=l z_x|+w{`L9(_xk?%`~Uy{{{b?1G1h1_00001bW%=J06^y0W&i*H$w@>(R2Ufr!7)k$ zQ4~PY3qBB1iN@C|!Z6g*VSbvC3DwPxcZrQ}s30 zhx7G%v)r7_RV5l$RBcs`@Qr~PE9&NQwz)$mAXiPO5M`v1J!8-3@w2Q*LMa6R z7XXF;didQk0G}iq007CbFsiC*Q`fZ@5gzlZsyLZUo&j6}(0?Rbfa|)heNhzL?RI;;pYZ0Nfmd-g^YiX_JcDrSs=ghKU`(;1YHC`_64Mh{(fS2JHP+{00{s|MNUMnLSTY3lCZu2 delta 569 zcmV-90>=HH1IGlA8Gi!+001a04^sdD0W45VR7D^leF!g$1vY{RJctHDn6fg@ zkgnE~tLB}t&7-!_sk_vzy3nt@-><;fs=o2F!`ipV^vTlV*4*mS;`-F%`rP95*5vxv z<@?#@``hRH+<)l%-s$_`>ipsC{NwHX+=2Z^7`%b{qOYs@b>=l z_x|+w{`L9(_xk?%`~Uy{{{b?1G1h1_00001bW%=J06^y0W&i*H$w@>(R2Ufr!7)k$ zQ4~PY3qBB1iN@C|!Z6g*VSbvC3DwPxcZrQ}s30 zhx7G%v)r7_RV5l$RBcs`@Qr~PE9&NQwz)$=K~BRk5JlfO5qmat15)mQ z6miW+Wzi#X4K|2u2%>3P)#Kj56(|DSKd;E^2#%YW7Kt^^3+`P^MS>TjR5 zZ>R{$Kz;S2diCn{tuK8l>O-#$6#)#WqXu0xXwZ*3wTe3Fs6#_#7^04E4nRUgF5Krq z%9nDSDPTarDY&B}5qSV6z;Z3}>G@W!!e!*wc@qH3cB3_02o$-sQc$i&8gu;ruZ48E z7T3&w4ovThb|^wY0+J7t>8$N1+=RgsyUjdKdjsIiYLm!_V<7+l002ovPDHLkV1hf# Bd-MPR delta 567 zcmWO2T}V@57zglUc4ZerAFwWVQ$`UOMMMK{%qAk4SsJO7O-rS)D3d4yw}zRi=yqZZ zgoU$(Wwi`#P&4=)(|1aYJ= zznUO&nyM;lN}CHi>YiF_#g=Q`=7w%_W3Q>{g{isE*xGNnHDG8P)ZZP{wM%sEQr*Ls z-#ca6C$i}-`8Vzq7H)yayLpLrV=nesQ2yTYJCeAS23WKdM^xzV~kS7AY zLOc=VWuTWqJ_h<2&0ZGG_8kJ-`0Y6zmnwzTM6u7=f;VY7|4a>M z;nc4a_bpX>b1&{2I`>F5SHa_yL^*~s@@Uo7l`HkgSgC!`B3I=Fbz+rDa)+H}!6W^GKh`2q~jpgI6hLj-vs;MZpRCe?B z$vvh7?|6|-&+RlyCT$1FT^E$u16Gx?j?5g+D;CbIC3usfY|q?jd>v6G(y}a_h_FwKqTph&m;<;1phzAO+<%m1>9Q>2;c#d)O;hf6 zJ8rjIiU>EG4VTMhL(*>TMnq_gp|zIA7#d@^-|v|u3FA1Xh%nD{W?9B4isk^Wybi&e zbFKlZssc%f2&}aTg5YQvzVF}u7?@J39x9YlaLz$%jlp1mBuP+J6+{GK7=Dv<3F_q9 z)>^4^W0Py*_LJ(l$caxuI-gHI)|bA5zfh}&J=)`cF?IxeUj&R|HmubVZDBR_FCI`ZLM8ttuKCYwaPh{ m4~N64*IDQBALb$e;xD|T>ve0dr$_(*002ovPDHLkU;%;w1GaMj delta 895 zcmV-_1AzRO1B(Zc8Gi!+001a04^sdD0yj`hR7D8^0C`|nbz@z0W@x!sM1*Z*qGm^s zZ&a^oOI3i#s%%VGfx(4&a9M%ISc1ipb$4Ba#7m?~UWCMgdzO5Gh_!E1q<3Cnh{Ixu z!)1!XXN$pyhJ~haJ!z5v45hQo2$FxmuZ)*$;_aTo2%Z;r-Gfa&CjQS8NwD!-BxIs;Rrwu)D>oyw&WkdF-!xtH9K*zSrimg0H~X)wiv$#MraL z+QP|`?zn`v%H8X~lJCBa?ZJ@V#;57Up76w#`NN3d%73lB(&y0AuHwtA^2nI;%ACg5 z;_uF&)6>(})6w+LqRiUy$lmhy+OgE+`t9Ss(dPTs`q<|C z+2;G%=lj~{`r7CF+vofC<-y$O``qaK-0Az=>HOX4``+pM-s=0`>-_5J>EP@9;OzY2 z?EB&D{D1oD#p3P!;_mn3?fm2J{pIfc@a^pK@$~KU{p|Go>-GNa^#1Pj{qOYs@Adxh z_5Seo{qgqw{rK1N_xYSlb#+c~ zT+`ZhKmmw|gMo=|MZDiKeGp(^SY;ON%p((MZs^~#a`{rAfToAAms5fZ3x{X@ilvM6 z8DbQ;`J>Vbic4yX>=!Rypv9o1XC0BARo;*oSthq|-dr^XQA;i{TUOJ2K@FpTxpQVI zGkB=l?6C+>s_dvPWp154eTqDT8=JIuUE7jvHH^74r%#zA#V}vJ(XqLES}0S-jOmjn z^htmmrfuiTE>bmp>g0+2JwhOXkQCR#&goMoPU!7w=LHEE>*%PdD9TET3-EDr0sxqz VRE!mP^BVvF002ovPDHLkV1nznA^rdW diff --git a/sources/lib/images/fileicons/gz.png b/sources/lib/images/fileicons/gz.png index 48f19596cce36e65472b4c2123b0631eb2b146f2..0a0a4b94f949ddb8a12426610a222ac27edeaee4 100644 GIT binary patch delta 402 zcmV;D0d4++1)&3w8Gi-<001BJ|6u?C0cc4?K~y-)os&UM!ax{>UpoyLU9ll9T(Hm! z5Q96>%it}%g9$8ZJdC)*1TWyu4blxIlujr8r_Y5>Qz|0*l1cvg+xKPuHyMv4JkJAw z698=h0d^|_@J6x#0FZPax>=Sj^E|gA!fh+dG7g8sI{+O3K7Yv#Krhd8n>vg%7 z%Ow|!1?TfQMTE22jHA)0gjA2#6A@~yX^f%Pnp$hFRx8GF%qWT|B23eiNs=%O!#e;S zuLhV{Ys*Ga6d(x^fiVWHR%;`SAP6qL1?Ky{3l+Za!&(ca6dH{N;y6Z86c7=#+wD(C z9pKEaR!VK`9e=Rwg#+9IxCU^AKj`?ZkLhIm5NtCK!q1zzzwyf2?Va9V$7mg)8*DRI ze{^*fTW3^GA+d;OCkQ%)F{}xU!F@1h|@G7tI+!!-f wN*(MmT4AkCo6Tn5t3BuAeRBDd0Ej*SQU32ps0kaR01E&B07*qoM6N<$f@D9j8vp9-mArnJ zx|x|~f||Udm~yV2N`;-ih@ilwo{)>8!ndbau%&pBr^c78$$zq{mYuQ9qqfnvw5`dy zcB#A6!@HlZzSpn7*t5gh%*>hG%YD$wx6I7U;L(rd&8_UvoY~gQ>e#pG*Tw4HtLNL~ z*5&%>;@a5e``PCE+UNS(=lk5~``qdK-0A$?>HFR3{NCyN-s=0_>ipm8``_yP-|PI~ z>-*sA{NU{T;eYJ=;q3hO?ZD#g{NwHX<9?)~KM{N?WarAN$B0}j$>Vp?Xfak5&UxI1 ze&nlcHwdR|FB|?~9gCo{vzzkM7UrEh6@aIDJ>>zm$AJQ{EV7?*A#>v&|4WOXzAu;L P00000NkvXXu0mjfo_&Kd diff --git a/sources/lib/images/fileicons/h.png b/sources/lib/images/fileicons/h.png new file mode 100644 index 0000000000000000000000000000000000000000..4afe8f84fc67cd1fa46a1c1bf8b7045c38bd99c7 GIT binary patch literal 411 zcmV;M0c8G(P)pV#k_WS*N z04)HDWC_qs)6_*##KmG!_-r=gbUNi^GNFiYJRWl}7!;7@*194>V+^geG{(>v!})y9 zFbo+40Y!vy95ad{`o4b;pyjOqhR(SnkYyQ2LPTJ#MZI1xiBYLkE`JH8l*&bgQVPyF zXsuDLRuP6FvMhs$pwVdjKvn^Ha=zDEm(Dq`h+XvjI{-HTuCa%;&zg80zCWr>$!~tI zw65Cd;|mAJ^|so#a!JJ6QCn?$u&H`U^lg`&+lQS1&;K1kY&=o`p4LI~>YKVaKW!pi zOh?|*Z|qoWU$oYTe~ktpbI!%JTJ6eP`OeK9l8Xrd1mEG^-m|FBH}L=f002ovPDHLk FV1kgdwDbS~ literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/hpp.png b/sources/lib/images/fileicons/hpp.png new file mode 100644 index 0000000000000000000000000000000000000000..3ee7583d2b5d6e967e23fe3a43d34adcbc5ff8c9 GIT binary patch literal 417 zcmV;S0bc%zP)pe00{(KfQ}}_O&rDXdgWO^3ba;i z!gr+6&YRJ^-I>`5NFoRV0N4W11rXwUi2=NlECB!{eW0J``K%}kCn8*>d7g7P99{s} z2B1jR2o8#(aA}%yu~<|(o6R_#PC1!OC?Xt>#~h7D70L3`4n%~;7+Py-jG-}x^ZA@f zk}!^AiU_kTW16OnqUZv^cF-WWcg|IgvMfOoA_8kII-O3f8DSV6erlLf$~P5CDLCh# zwMMJeLXspX%Mv1jZnyhE(j@T7-qu>zuqUj1`=`-4fD-`6_=EI!d$_%Sx>7#*F**eR zET7(9g`Z#Eu(sLhtM6_eoL$zEnmBB4^lNim4thK|yZjQP`4O7IpRgym#y>@D_WbWD z?Ctb$_waNTEN$b!T6?3lUT>DRLQ3ac)^4|tg2p=cevw>N03dz`8(Hz(3bL}h00000 LNkvXXu0mjftoF28 literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/htm.png b/sources/lib/images/fileicons/htm.png index d45e4c19adbdc1d0b6d8055f05b9e5e96509ec48..02e81932b399c68e56041a42e5017c4b63e3db85 100644 GIT binary patch delta 402 zcmV;D0d4-b1)&3w8Gi-<001BJ|6u?C0cc4?K~y-)om0I|!!Qv3Vn;1v>r!=KV1OCX zA{c=uVGD1;E1*j45X8Fx14tmsL$FlM(o{|3SUKloK#9^&A?PQa?#I6G?6c1!3D5HY zU=KhSfREo10r(_Y002mq3;it17I~gK5#c7uvW%nAXb4~*fPW&nMsS+vxl59StJSKK z#bUwve9qZyMiJq3I^}pgu1M-fI~5TcV`#0VF^0w%E|*Kjam*-+C?ZVLlu42>48tLS zeXl|A>YS?rMNxnxL4+sj{h1O2Ih?tuC)v+6bkkJu7o(~qrR;rO73m$%8iSDVHYYweTP wdZ+ovH=uCNrR{e6+-r<;?+?k<4FE)6bVLrLpINJuv&P=Y2>n?O=lB~hj-Sd1=Qie6YTE?liwSX5kE zP%mJxLu7F|Vw*E#vo~(3I&Qf=bfh_Q%tCg&O?aG5c&R~p&VNpOrh|4sMSajpguZNn zc~yYOS%Jn+hR0Zf#ZZRFScJY^gv4Hi#7U0SVTi+GiNjHj-(`xzSdY|ai@|A(!EcbO zY>vQgj=yq{zjBekZ>HFa7{Ne2Uh$>j|Ns9NDMWSK z4p;yH00DGTPE!Ct=GbNc008JoL_t&-(_>&@V2FlS*fPmN<2ym^1ibP9u zN>x=>RJhhcL}b;Hf^?)gLu-KoAQ9Pwyxh28O##MoR}f%e;7_kkP4rR{<0=geEh%r!=KV1OCX zA{c=uVGD1;E1*j45X8Fx14tmsL$FlM(o{|3SUKloK#9^&A?PQa?#I6G?6c1!3D5HY zU=KhSfREo10r(_Y002mq3;it17I~gK5#c7uvW%nAXb4~*fPW&nMsS+vxl59StJSKK z#bUwve9qZyMiJq3I^}pgu1M-fI~5TcV`#0VF^0w%E|*Kjam*-+C?ZVLlu42>48tLS zeXl|A>YS?rMNxnxL4+sj{h1O2Ih?tuC)v+6bkkJu7o(~qrR;rO73m$%8iSDVHYYweTP wdZ+ovH=uCNrR{e6+-r<;?+?k<4FE)6bVLrLpINJuv&P=Y2>n?O=lB~hj-Sd1=Qie6YTE?liwSX5kE zP%mJxLu7F|Vw*E#vo~(3I&Qf=bfh_Q%tCg&O?aG5c&R~p&VNpOrh|4sMSajpguZNn zc~yYOS%Jn+hR0Zf#ZZRFScJY^gv4Hi#7U0SVTi+GiNjHj-(`xzSdY|ai@|A(!EcbO zY>vQgj=yq{zjBekZ>HFa7{Ne2Uh$>j|Ns9NDMWSK z4p;yH00DGTPE!Ct=GbNc008JoL_t&-(_>&@V2FlS*fPmN<2ym^1ibP9u zN>x=>RJhhcL}b;Hf^?)gLu-KoAQ9Pwyxh28O##MoR}f%e;7_kkP4rR{<0=geEh%e|!Y~kppKSycyKE4PE;vI~ zwY&aYCdcRiX@a$0B{Ll z0HA~Kl>+!ASpxt_hKsAREH_nEc@g0`E6bAO@%S0Q2!JMe1b?`xs>=B}XsxBSmfP)?S(Y(PQ;GkTxJB zhqE!}$Pd6KmVP970`Lgn0l(02c#rvf_M#7y=wx@Y)WBazn|%4=n{11wQ_;g*(jWZ!hZLH(opEX2zI{AGB6`?~7iq jcduICdH9RD2!QkpdROh;p-`LT00000NkvXXu0mjfZV$N7 delta 895 zcmV-_1AzRM1B(Zc8Gi!+001a04^sdD0yj`hR7D8^0C`|nbz@z0W@x!sM1*Z*qGm^s zZ&a^oOI3i#s%%VGfx(4&a9M%ISc1ipb$4Ba#7m?~UWCMgdzO5Gh_!E1q<3Cnh{Ixu z!)1!XXN$pyhJ~haJ!z5v45hQo2$FxmuZ)*$;_aTo2%Z;r-Gfa&CjQS8NwD!-BxIs;Rrwu)D>oyw&WkdF-!xtH9K*zSrimg0H~X)wiv$#MraL z+QP|`?zn`v%H8X~lJCBa?ZJ@V#;57Up76w#`NN3d%73lB(&y0AuHwtA^2nI;%ACg5 z;_uF&)6>(})6w+LqRiUy$lmhy+OgE+`t9Ss(dPTs`q<|C z+2;G%=lj~{`r7CF+vofC<-y$O``qaK-0Az=>HOX4``+pM-s=0`>-_5J>EP@9;OzY2 z?EB&D{D1oD#p3P!;_mn3?fm2J{pIfc@a^pK@$~KU{p|Go>-GNa^#1Pj{qOYs@Adxh z_5Seo{qgqw{rK1N_xYSlb#+c~ zT+`ZhKmmw|gMo=|MZDiKeGp(^SY;ON%p((MZs^~#a`{rAfToAAms5fZ3x{X@ilvM6 z8DbQ;`J>Vbic4yX>=!Rypv9o1XC0BARo;*oSthq|-dr^XQA;i{TUOJ2K@FpTxpQVI zGkB=l?6C+>s_dvPWp154eTqDT8=JIuUE7jvHH^74r%#zA#V}vJ(XqLES}0S-jOmjn z^htmmrfuiTE>bmp>g0+2JwhOXkQCR#&goMoPU!7w=LHEE>*%PdD9TET3-EDr0sxqz VRE!mP^BVvF002ovPDHLkV1neiA^ZRU diff --git a/sources/lib/images/fileicons/index.php b/sources/lib/images/fileicons/index.php index f90e7e6..09b6c9d 100644 --- a/sources/lib/images/fileicons/index.php +++ b/sources/lib/images/fileicons/index.php @@ -44,5 +44,24 @@ foreach (glob('*.png') as $img) { ?> +
+ +
+ '; + } + ?> +
+ +
+ '; + } + ?> +
+ + diff --git a/sources/lib/images/fileicons/java.png b/sources/lib/images/fileicons/java.png index c5f2fd09f8e79ac1222a4dc9ca4233aa8aaff7ed..cf6f5b4f5a1eade0b814d9c3f6c83c875a9e5212 100644 GIT binary patch delta 405 zcmV;G0c!r^1*8Lz8Gi-<001BJ|6u?C0c%M_K~y-)ol`MR!$1%m-M6Mn%TkdnfP$3Ov6P~Zb}G$C%{D2~r3?|CSYt=J?87-^-wo!!~nJ)K7qp63C; z0f06DA3q}m@J=!Z0FW$*UYe$hEX$mTaFeBJ%HeQ$1E32)k$hk@c&ciU^G{wARuXLt_k=%O#^IVi<-L5hh8(IF1|_vJ1Gofmfj^*k)WPHUmd;cb)_T z^sjC!1>1PPxz|(Ml77NEzfqunbzAX^uA6uT;J%*lTZm0w|NRQbhaEgUzub9izp-zv zeb8F(ZX0b4xpOXQHk;>O?K^jVQCv;{Ap8Wnd-ZZcQ4Vn}00000NkvXXu0mjf0SU08 delta 726 zcmV;{0xA8Z1LFmd8Gi!+001a04^sdD0kBX^R7C&)09kpHS$dRPdzD>%mtK9AUw)TW zfXG>a##n;IXM~$wgv4luonC~*Y>1y>h{Ixu!)1!XXN$pZjizag!EBDeZjQfpkfrE# z404daa*@AwlfCJB6MB`qdzHNDej0w4y5xc+f||VQgeHfbu7B%=CWxM|g`K{Mp00_W zuZW54OpqQdNsIFF^ok*CIzsK%A6$eXOXm#oQ}uFIXU&7HB$p|sAUw$Y@v(Wkl7 zs=CIhyVT&YfU3OJu)W5vzSpn7*yyx^w!+D^!p*nB%Cp1T>bQyRyNu|)l*rE4>e9T~ z+S}RM+}YgW+<)HR-rwNf;pE@pEq?-+2{M(=la^```qaJHFU5 z``_yP;OqS1?EB&D{NnBW+=2V^Zo7f z{qFSr?)3ie^!@Jj{_pku@Adxh_5Seo{qgqw@%R4n_x*6GuGEpS5RPp0LR|mp04)R28BMT zh(m98M}J#WOua%MRK%{kv%S$nw-zV>5wU7(Yj#(y@m2rgQT%DcmU4s4CG}A;u0(yyD{fzy5K~JnIfhj^D0WW_a5b*U&jgJ-p30P|h zLqI}o1TRQHy&yj~Cp|48J}NAP10CL+ks&B@LV0J=gr&rx0Ppa1{>07*qo IM6N<$f}0GtKmY&$ diff --git a/sources/lib/images/fileicons/jpeg.png b/sources/lib/images/fileicons/jpeg.png index 1d9dd562a4b27328ef9ca0ca516361d2d8da2e29..29dea5761c8f247eae054b4d0992134645e01af0 100644 GIT binary patch delta 397 zcmV;80doF}2b=?t8Gi-<001BJ|6u?C0b@x-K~y-)rISrg!!QtqpY5te?6Rr4V8Iy> zf*n7X;TYTjsa+)EFq9pOatJnUvuUcPajcB0?;H|fPagss(ha3+-|qcSg+Sy ztyWwvmlP4s=W|XblLoSTwF?oUwU*8~T5D;o(OsOuUeAtG?jA&R0_GkU$=<(GzOtwU3xwTAZ|#u)VbePmgNx~?H27!HRYkS-vY zLu`y`tpl*h#eXsG0o($(!5=glU1K(zKI*Rd?vBkI;@!QFTP&uCBAn?%Cnt$&0h2@_ zNj^(FKK=lFt6=KpT1`I$=$iLQ19&=g;=Xc%iUP0yc!ev>X3vjm=Qo}^=cdM(qn}Cx rP delta 895 zcmV-_1AzRT1B(Zc8Gi!+001a04^sdD0yj`hR7D8^0C`|nbz@z0W@x!sM1*Z*qGm^s zZ&a^oOI3i#s%%VGfx(4&a9M%ISc1ipb$4Ba#7m?~UWCMgdzO5Gh_!E1q<3Cnh{Ixu z!)1!XXN$pyhJ~haJ!z5v45hQo2$FxmuZ)*$;_aTo2%Z;r-Gfa&CjQS8NwD!-BxIs;Rrwu)D>oyw&WkdF-!xtH9K*zSrimg0H~X)wiv$#MraL z+QP|`?zn`v%H8X~lJCBa?ZJ@V#;57Up76w#`NN3d%73lB(&y0AuHwtA^2nI;%ACg5 z;_uF&)6>(})6w+LqRiUy$lmhy+OgE+`t9Ss(dPTs`q<|C z+2;G%=lj~{`r7CF+vofC<-y$O``qaK-0Az=>HOX4``+pM-s=0`>-_5J>EP@9;OzY2 z?EB&D{D1oD#p3P!;_mn3?fm2J{pIfc@a^pK@$~KU{p|Go>-GNa^#1Pj{qOYs@Adxh z_5Seo{qgqw{rK1N_xYSlb#+c~ zT+`ZhKmmw|gMo=|MZDiKeGp(^SY;ON%p((MZs^~#a`{rAfToAAms5fZ3x{X@ilvM6 z8DbQ;`J>Vbic4yX>=!Rypv9o1XC0BARo;*oSthq|-dr^XQA;i{TUOJ2K@FpTxpQVI zGkB=l?6C+>s_dvPWp154eTqDT8=JIuUE7jvHH^74r%#zA#V}vJ(XqLES}0S-jOmjn z^htmmrfuiTE>bmp>g0+2JwhOXkQCR#&goMoPU!7w=LHEE>*%PdD9TET3-EDr0sxqz VRE!mP^BVvF002ovPDHLkV1oTJA_D*b diff --git a/sources/lib/images/fileicons/jpg.png b/sources/lib/images/fileicons/jpg.png index 1d9dd562a4b27328ef9ca0ca516361d2d8da2e29..29dea5761c8f247eae054b4d0992134645e01af0 100644 GIT binary patch delta 397 zcmV;80doF}2b=?t8Gi-<001BJ|6u?C0b@x-K~y-)rISrg!!QtqpY5te?6Rr4V8Iy> zf*n7X;TYTjsa+)EFq9pOatJnUvuUcPajcB0?;H|fPagss(ha3+-|qcSg+Sy ztyWwvmlP4s=W|XblLoSTwF?oUwU*8~T5D;o(OsOuUeAtG?jA&R0_GkU$=<(GzOtwU3xwTAZ|#u)VbePmgNx~?H27!HRYkS-vY zLu`y`tpl*h#eXsG0o($(!5=glU1K(zKI*Rd?vBkI;@!QFTP&uCBAn?%Cnt$&0h2@_ zNj^(FKK=lFt6=KpT1`I$=$iLQ19&=g;=Xc%iUP0yc!ev>X3vjm=Qo}^=cdM(qn}Cx rP delta 895 zcmV-_1AzRT1B(Zc8Gi!+001a04^sdD0yj`hR7D8^0C`|nbz@z0W@x!sM1*Z*qGm^s zZ&a^oOI3i#s%%VGfx(4&a9M%ISc1ipb$4Ba#7m?~UWCMgdzO5Gh_!E1q<3Cnh{Ixu z!)1!XXN$pyhJ~haJ!z5v45hQo2$FxmuZ)*$;_aTo2%Z;r-Gfa&CjQS8NwD!-BxIs;Rrwu)D>oyw&WkdF-!xtH9K*zSrimg0H~X)wiv$#MraL z+QP|`?zn`v%H8X~lJCBa?ZJ@V#;57Up76w#`NN3d%73lB(&y0AuHwtA^2nI;%ACg5 z;_uF&)6>(})6w+LqRiUy$lmhy+OgE+`t9Ss(dPTs`q<|C z+2;G%=lj~{`r7CF+vofC<-y$O``qaK-0Az=>HOX4``+pM-s=0`>-_5J>EP@9;OzY2 z?EB&D{D1oD#p3P!;_mn3?fm2J{pIfc@a^pK@$~KU{p|Go>-GNa^#1Pj{qOYs@Adxh z_5Seo{qgqw{rK1N_xYSlb#+c~ zT+`ZhKmmw|gMo=|MZDiKeGp(^SY;ON%p((MZs^~#a`{rAfToAAms5fZ3x{X@ilvM6 z8DbQ;`J>Vbic4yX>=!Rypv9o1XC0BARo;*oSthq|-dr^XQA;i{TUOJ2K@FpTxpQVI zGkB=l?6C+>s_dvPWp154eTqDT8=JIuUE7jvHH^74r%#zA#V}vJ(XqLES}0S-jOmjn z^htmmrfuiTE>bmp>g0+2JwhOXkQCR#&goMoPU!7w=LHEE>*%PdD9TET3-EDr0sxqz VRE!mP^BVvF002ovPDHLkV1oTJA_D*b diff --git a/sources/lib/images/fileicons/js.png b/sources/lib/images/fileicons/js.png index 0c314eb5648a483546f1e03e69b2ff46f02faa5d..16e3f95386298373625a8b5d07d5e1556a5e24e5 100644 GIT binary patch delta 405 zcmV;G0c!rK2BZU!8Gi-<001BJ|6u?C0c%M_K~y-)ol{Fr0znXc(>;RG6&u3Bg$q4^ zNOY-Q25#XUOkgp_!{|a240r)|Zjjk9gkgF*Q$5dx8NvV}+DRq#NxiD~I^~gs=Xn5d z1fUMU$MzQj_#l}B07w>vW}2qcEX$mTaFeBJ%5JxN2jCchB7a!|xX7~1#c|B}e7>;h zbjrzO!tr=a5#eYwVz1X*fGn?eAtE%!&{|7l42?0I&1Q_Eh+!B~M3^KA<2Ysz1a|K~w#(uDSpa0O1$$!0J^%i4I0{00000NkvXXu0mjf1xma} delta 797 zcmV+&1LFLo1E~g(8Gi!+001a04^sdD0o_ncR7C&)07OSkLr6|VNKQpbPDV;kMoLge zN>ET#TT@nBSY2gUUS(NdW>tX5S%Jn_g2i2g#9oBNVTi+GiNj@z!e@)YX^g>aj=*k? zzjBbja*@Awlf8PCyL*+qewVs}n!JUbzKEc}i=x7eqQZ}*#D9^e#*(PUm8-~?tjU?I z#;dEWps~oXu&}YRva+(Wv9!9kxVpEwyt%r%y1Kf$yS=`?zQ4b}z`(%4!NIu0)xyHU z!^6Y7#nr~f$Hd3V$H&LW$jHXY%*n~g%F4>h%FDpa;LFR)$<5Wx&CSEl;lt45#?j)? z(9p-y;>XhC$$!$}$ipm9{NU^R;OqSA>VN9s?EK;E`{C^T;_Un4?fm2I z`{V8Whk>S^8M`d{q6Jp?ezZc^!@Mk{`>p;|Ns9&Mos&|G1UM700DGT zPE!Ct=6~2`0002`Nkla+x@xdR`VI!}MSp!gt<5zx6*3?J&A`G*6WUuFYO2bL zr9lGflP0ufq^6aZ#K#s$f&|q1yRtZ0*%JadIAX*>0xI3@)hYhWzC1Qjd7>Zz<;MEj zig>nYKW?vVVUU1gT}^SKH%C;YC0B$XNI;>YG?sT1rApL`Z<2 bmlhWQ3t2>eG`2)H00000NkvXXu0mjf(}VJK diff --git a/sources/lib/images/fileicons/json.png b/sources/lib/images/fileicons/json.png new file mode 100644 index 0000000000000000000000000000000000000000..96611cb539d09dcbd6d29664467f3a18306c735d GIT binary patch literal 435 zcmV;k0ZjghP)B{P#YPlFak=0u zp9^CNigx0k2Q0uh!})f078{U65Cj151wbD_i2o}A@Rwu-03hiT!=fm*Wm!5A;Y+J1 z3XaF)D*z_|6v+d?d0Cb&%QEiw`+9A+TW&TRuGedd2v@5WCzDAHX|{GQA~eR(T1#UL zjWOKqc1+WhNs>@RnCCgOEMpwUR{&0e7U0%7R|l%90!fGnthMO%dI!S@!|?mFfhnc@ zP@$B9a}HW-bUGcRX^N_(t@VNTz&dso#lHaj1aN_OX!v!2KevmS z^2PHws+03LLff}<%lij>`rI3;_RjM-!sv2}(dG2OHzD4K-Q%HZx7PmoHK~_^?}3B> ze$V6RqS>;CG-2L1B{pAv_!hpM4sdg~m<5g3II`AWYpsv|b+m>m=Um?Hc7Ft|=R9~r daeV>+$s%!axv)|L#^Wdg4Mjc;KK9 zAQC;QF9UDkJD9+s#D~#?CK~Vsym>)-p@h=yrnCJ$m^Ofo0VkPccXsES*?%)0NqC+I z04D&N0DSyyA%IVkIRJoUanMQAbdhD56A@N6F9au!O9)b}1q>#?V?zV+@TkTrQW4qKIJ_Qbd>}3FA0s5Cr!C z+TIr6)j3xN@;nDghzP8;XfzrdV)(v)^-D0NR3R#qQgF^eYmHj1hA4`V=Q%_K&1Ull zvJEJbi?!BzV}D-&%h*LPxC3wt;0AkG=d6Y2*U5ugPaX%o@a##n;IU4+D5 zgv4Qp!(xfUWs1UQi@|A(!EBDeZjQflkiT+~zjl+odX>9-mArnJx`LX#g`K{OqQa4< z#+R(gow3cMw$Z7()T+GIuD;i=z}U0H+SKIw*5vxu<@(m;`+wKv``G3B*yj7$=KI;_ z``YLF+UNV+==-^yB{Ne2T;q3h4?fm2I{NwKZCTntB0>+qA^*8oaa8{-JT^P?HS zs>Rk0y09S409|THGfqd)Rre+XrK_4P8BRyAe5c9a<0AD1x2;>c4SKz%Ns`7t;TL7) Tc}$aO00000NkvXXu0mjf-x~VL diff --git a/sources/lib/images/fileicons/mp3.png b/sources/lib/images/fileicons/mp3.png index 411dad08081b362441ea0e599bd8ed2cfa7b6fbd..7c6d37184e5f3747364673ab462e4576ac04e25b 100644 GIT binary patch delta 400 zcmV;B0dM}l2A>0v8Gi-<001BJ|6u?C0cJ@=K~y-)os&Io0x=MUpKSzDIvPZgf-^)> z(gnB-$H*O!paA7CS-KSD5NQb8u!v>7){gh3AYLuxk7T5gJ^uMT^F~%Ap_BrED*zn; z4g72|fLD?w0DxrJxX$x@TNH&C5q{-)o^vvpi~;ljXp%>O+kc`ce43`*@As8&w_9#D z8?M)DiU?P$6{pi_1*xZYDcO?RHF(gmD~GM3`k6(=_F5HX8%zsT07n z_r6*v%Mv6ZB5=;3-EJR=(P%X8J_)9^4x&P94evdSF=#fMNRk9)Swck6>2wZ|Q$V;J z=Ej(#H~_0P%zy9zUBFaPesefJ)V<>FD*e&daEE;7bk uoKafoz0X>$R$rZb=k7VWe3$@;-vR&a{IenziBkXo00{s|MNUMnLSTZRC$dTa delta 819 zcmV-31I+xN1HT548Gi!+001a04^sdD0sBx)R7D_SXFEPaIzvxFMomOVO+!ddMMzCX zNlr#ePew{mM@mpgOHW8kP*7A`P*qz~R$EwIWmsNiSYBpbUSD8fU|wNnX=!O@ZFp>M zac*vIadB~XcXxStc~yYOS%Jn_g2jG+fL(;dUWCMff`eg*!+(N!`isR)wsmgyT#SQ z#K^_S%f-sk!pqmk%h15g;K|F+$js8j&fdk)-^I}3$kE=%(&Nd~;mXtD&)DS4+V0KT z?#|lm&)eigg7`rqsP;OqS0?EK;E`{C^T z;_dw7?fm2J{NwKZGA#Q^8D-a{p|Do?eqQZ z^#1Pj{eSND{_pkv@b&)x|Nj600BL;T000000d!JMQvg8b*k%9#0P;yhK~xwS6~VnP z192R{;m@64B}IcuCrubEMx(b#Y;<7MsgYRkKd~9Q*evZ}Yz!9h{c&?sHv;QZPt(^EgQ|%sCSm^jMOON6%Uh!MF9K?-6-^~7 zed%n}8iUrwWyOwf?iNq)7fKH?t%F|e>@(ZXibs3xR06P370u5Jan#u@TL22~RyZup xd@SsA$`Sxk_qaIs-n2$VB49H^Ef-TY;}2rdhPULJr^o;R002ovPDHLkV1kor;~@Y5 diff --git a/sources/lib/images/fileicons/mp4.png b/sources/lib/images/fileicons/mp4.png new file mode 100644 index 0000000000000000000000000000000000000000..ee5b911502836e4a6acc73cace3eaec93b433cfa GIT binary patch literal 419 zcmV;U0bKrxP)A06142z>D|3Db#fhk`NI%=MY8Fff&7B@9K+STI(PxwAS$6!x)2p zzmF`-P}em?1jFI*1JVVA<`5fW4)OqOY6+5i0Cxax@dq2-jIfw59yNfwnDK4Q7yuB~ z5V!MoeKlVpLNwOlW5v N002ovPDHLkV1jsFyo>+< literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/odc.png b/sources/lib/images/fileicons/odc.png index 4d6676c3a02237d9db48e79581085395ca47a0c3..331140552aaa77de64d29b25ab264f7e08ecafcc 100644 GIT binary patch delta 392 zcmV;30eAkY1(ySm8Gi-<001BJ|6u?C0bWT&K~y-)rBl03!$1(6yNeP;=O%JNk#C4l z=y?20K7)TiN(x8(3kn@Y_z0R1H*pll=act56v)PQ5CXE&O1HB&qun{3A_=7w09*hV z0_frAhylEjECB!{tHwCb^IcICUPSm^=6TN9Z1w&@^CoRx!diy z-EO(rY$zgJuh*Q<=e0<4w26q&T1)2~t+lk)a=+g*NfO3!Oc7z0WlYnQQ4~D@7^#lH zi}$_;%CZDWhzOi>2!fzxMz7bqIxTHZ@)s9oGU>9kdMvE}aNlBqdD>smSwO1eue8W#Pe$Ps2acV(mA&@#+?0PwbFZ^ m4F-c7)%nihAAAu2@ds<0^cZ!*EBgQd002ovPDHLkU;%=kow+;! delta 669 zcmV;O0%HA_1F8j(8Gi!+001a04^sdD0ew(RR7GVV2@DJj92^`eDJeoiLQPFgRaI4A zUtexdy=G=+f>OJPP`QLsx`$J`id4FHcXyXr(^Y`TS%Jn_g2k*?(_MtbUWCN0T-2^y z)URCBVTi+GiNj@z!e@)YX^g>aj=*k?zsGWCa*)4rk-v76y?=U@yL*+qewVt|du@W6 zyy|;a>U>q}d{%{>zKEc}i=x7eqQan{q>rV<_k&;hgkF)S#*(PUm8-~?tjWu(OPQ_8 zoUqKDvCXowvZJ=q-M|{EweG3A)a$x8?7BDYx;L!8*6q7B?YlO$zR<70*y_Ak^1v;? zz`(P^+Rnny|9{f}!OGqL)Bw!P%+AX5)XekS-GO^4QVR z;`-F%`qt$7>HFa7{QmTK|MYqP^>+XDc;W2)|Mqv|?fm8L z{O0fc|MIHn@cruX{qgbf>+=2W^ZoDi{pR`q@b>=n_<#QO`TqC%{`vd=|Ns90004Yd z^KbwF00DGTPE!Ct=GbNc007%bL_t&-(=E=uE(B2khT->|ol&>~1(jk#r{)r9H*o<< ziGpZME8DsRr9u?4h0rN93WGT=EH2_Vr1%DV9Md8yl<>7FseYe|j zyWMiL*-%8dTCF&n&1y)qwXulMT1)2~t+lk)a=+g*NfO3!Oc7z0WlYnQQ4~D`xKj9#yIdnB0Fx)K#yYk2Qrj6uKON0KBc%Mv1j;c)m3=>n?a zYHf^Z#TBs5A%BXV06YSCz!`QQhFC0@FS=RG$)rBO$>d~QR7ENx2@DJj2M3b~2$LKf91;?k78jZq z7@8?5DH|M|Eia`pGp9mALQPFgK}4@rRaHw)vtM6dW@ctuUba z##n;IU4+D5gv54w$98+icYDWSh{Ixu!)1!XXN$pUjKOSg&Gm%4(QyoH^!`i&W>AuA2!pZB* z%*@8l?#|Zn*MHa7&e-$R-1XGp_toI|)a3fvH6O3``+sN-|G9{>ipm9{NU^S;OzY2?EB&D z{Nn8U;_Uq6?E2#E{NwHWHM{N?WbGA#Q@%`)Z{qgbf>+=2V^ZoAh{qgqw^7sAn_x|(u{`C0%|Ns90001btFdYB@ z00DGTPE!Ct=GbNc008SrL_t&-83n<=E5vae$MNUzPLePvQn#E<*D0OdqGR$0nEVF@ z8(m!nrGLJE!)@$}xYAJ$#n)mGZeT79=l*P7jl>)i;? zJ~*?bS?p$|H;l;c@iw)IyM6Ttzb&J_@G&oW7*?Ph`o5d{sibfjAYZIMpTCaGxQ7go zD_2MF$5Vu4Ku+Pg`m`K!$pBZ*s=iE1;mLsbm20v#=2>zBqK882D~0$6b=jC7Mj|*r P00000NkvXXu0mjfog%*G diff --git a/sources/lib/images/fileicons/odg.png b/sources/lib/images/fileicons/odg.png index a07216f4af3cabf92105a7deaf8170af8ee4d848..5224425e6f3f7f2d43358c413d931048d316bc80 100644 GIT binary patch delta 396 zcmV;70dxM}1)Bqq8Gi-<001BJ|6u?C0b)r+K~y-)ol`q*!axvxyNe)7=LWe*!5L6Q zx_mCfF>;4UP#AHTkS+x|L>ht{j4)oWJnNStvSXVl3K?mnotd4dH*YkGB$QGBa0Orp zpoiZr2JlX@1OSk%3gbM__eD{75#djs=Q(Gy*%N>f08O$5Fn=kE!l!A<FCe*C0)56A_`cmd-g^YiX_J;c#G*B#h&jBEl@on5HSCD0%`gQXPO- z?|q#p%Mv6ZB5=+j2!fUvy(e~TYY>0K`_?MX0=$fnwoJ{ zSBu3r;^pO7<4o(aIve0*YXF{`bej~Lad$ibK$gAzdkeQ=h?n(xsT$XK?VMW~V=n$M qTIs#d27|$!>YQ_UhAsji{sfVr^{8FjapnL3002ovP6b4+LSTZ^=d$bo delta 722 zcmV;@0xkWU1K$OZ8Gi!+001a04^sdD0ijS#R7DDRX$%Yu92^`eDJcM7003(M0Bit4 zLP7v>0046U0CfNWb^ri-004ae0D=HbO-&1d1pto#RaI36mjGX1UuI@zC7cXkgc=~L z2q~}(cXxL%u@`WCi&cQgGqn*}fyP*Z#a)ENUWCLuxfNlE!+%?%OJa$`Ws1UQi@|A( z!A89zv5FaNj=*k?zjBbja*@AIz$bQ-z5j9o|8oU;mAiYDyi>*~ewVt7mY#x|y#0L` zyPPkDoxX^mz>A{7jH1Gzprntb#F3}QlBmZ2k0t+*D*urym8-~?tjU?J%ABywow3cH zv&o~f!LqWl{C}fBqqfnix5c%(t)slv{H9{5yVU8cgU+?6tiIO&u1d1M&ac4Oz`($> z!`jEi$G6Mhx6I(Q&E&St|<%)!v!&&|)v(bnG5 z*4Nk9(&GBmVN#+=2W^ZoDi{qXkw^!Wbu`TqC%{`vd=|Ns90002I}TxI|O00DGTPE!Ct=GbNc z008VsL_t&-(_>&@V2BM3@b+-BvoSYkfPmCgoxw|F?MxzNj27+g8&1A17jDv5I=K6eO+x$b(J|o45LtfOLJ2rgkNdS z!0*T4)f_D2la`pAln`HG0y5OI$v4mF(JaIRMk z$_sIEb<^f5)d2}O)|rWMiu*@e^Kg`CfCTJo4NJ771$hN{xLJ$TKmxWk%5stt!hD=; zEQLxS0UMzG73F26B}Ih=@*n|AQ&U5IT}^crMFm+|0Jl>=Zj=j;&;S4c07*qoM6N<$ Ef+>}GE&u=k diff --git a/sources/lib/images/fileicons/odi.png b/sources/lib/images/fileicons/odi.png index a07216f4af3cabf92105a7deaf8170af8ee4d848..b57fd974d92f2b8af4a4bed282501b06e33eed88 100644 GIT binary patch delta 382 zcmV-^0fGMC1ØGi-<001BJ|6u?C0aZyvK~y-)ty4Qr!$1&yyBj5l&Q0WkB4>zD z==fZQV{iwgq;SMx2pvT@1Wgh*aTLevm1q4ZkfV5s5CNVv(#-76)65%2!BRZRrx&6x!djbw%KgB zUaz@YttcW~EEb$hCVP^@)j)fd6E){UspTElw}V+^|8F0w2`UDps1^!xo!l8~S& zZhT`*D{ct)Id>$<1AsdKw>SYeag5n~{-ncV-rwWU590>2kUXe<64d+f~yk!m*B`DBga(h3h!R%Y6Q%4zBUiIX5%Loc&<5+IwI0dc7MJoO67F cE&?F^08o4C-I~-(t^fc407*qoM6N<$g6C(kb^rhX delta 722 zcmV;@0xkWH1K$OZ8Gi!+001a04^sdD0ijS#R7DDRX$%Yu92^`eDJcM7003(M0Bit4 zLP7v>0046U0CfNWb^ri-004ae0D=HbO-&1d1pto#RaI36mjGX1UuI@zC7cXkgc=~L z2q~}(cXxL%u@`WCi&cQgGqn*}fyP*Z#a)ENUWCLuxfNlE!+%?%OJa$`Ws1UQi@|A( z!A89zv5FaNj=*k?zjBbja*@AIz$bQ-z5j9o|8oU;mAiYDyi>*~ewVt7mY#x|y#0L` zyPPkDoxX^mz>A{7jH1Gzprntb#F3}QlBmZ2k0t+*D*urym8-~?tjU?J%ABywow3cH zv&o~f!LqWl{C}fBqqfnix5c%(t)slv{H9{5yVU8cgU+?6tiIO&u1d1M&ac4Oz`($> z!`jEi$G6Mhx6I(Q&E&St|<%)!v!&&|)v(bnG5 z*4Nk9(&GBmVN#+=2W^ZoDi{qXkw^!Wbu`TqC%{`vd=|Ns90002I}TxI|O00DGTPE!Ct=GbNc z008VsL_t&-(_>&@V2BM3@b+-BvoSYkfPmCgoxw|F?MxzNj27+g8&1A17jDv5I=K6eO+x$b(J|o45LtfOLJ2rgkNdS z!0*T4)f_D2la`pAln`HG0y5OI$v4mF(JaIRMk z$_sIEb<^f5)d2}O)|rWMiu*@e^Kg`CfCTJo4NJ771$hN{xLJ$TKmxWk%5stt!hD=; zEQLxS0UMzG73F26B}Ih=@*n|AQ&U5IT}^crMFm+|0Jl>=Zj=j;&;S4c07*qoM6N<$ Ef&}Y%ApigX diff --git a/sources/lib/images/fileicons/odp.png b/sources/lib/images/fileicons/odp.png index 2f2574af614b3615f3eb7caa367897faac6f5dfd..81d1023c08c320aa93ce4cc2461d48276446df74 100644 GIT binary patch delta 388 zcmV-~0ek+h1(XAj8Gi-<001BJ|6u?C0b5B#K~y-)ol`Mx!axul-yw+T+#nYzcms+^ z7n0BLjQjx!3ZpzGq)R~_kp^&s5yt0}_dF>gTegEp$Vw~S?(NL(&1pT7@H`IyZUGDc zba2@s0G}ia007DIVw7dsA2&UY2&R-OMTJrd&N*nU(d~8-$1#ecfQVo)7<`ko2}*Ez z)>=2>lCa7l41J#gJOOyb6*dV1tk&xnRR?oAtqM4uUW`}UE#UhjRR?>^Wuxe~82$c8 zT{Cvsq#^n>1Z{9h@LC_QUUaTw!_xHQ-@ot>1bADoU%c8j-dSr`TI-uXJgsofrM+Hn i;;8Gi!+001a04^sdD0dY`FR7GrMLJSNH92^`eDJeoiLQPFgRaI40 zRDfS!UuI@zcXxMHfXIA&d|83USc1iUeSKYo#9oBNfq{Wxh{Ixu!)1!XgoKc1i@}G7 zhiQz#h=_-5j=*k?zl@BGa*)4rk-v?Njdqj0k&%&lmAiYDynm9CkbalCk&>i>n!JUb zzKEc}ke$MdqQZ=#!k?g~prE9WrNp75tdXb2lBmX|rm>@^x0S2Nq^Pu)tjVaTw3)5S ztgNf8t*xA}%$>2#sjt1SudlMQvZJ=queZmzxVWji)TqAPtiIN~yurP_y|2L7x4+E5 zz`(P^+RV(%(SOm=&e`JE*VoeG`qbn4*5vx*+=2P_5b4d|Lybr<@f*O`2Xql z|L^qu>G%KZ_W$ko|M2$y^!Wbr`TzC#{`dO+`TPI>|9}4g007Ms_pJZ`00DGTPE!Ct z=GbNc008VsL_t&-83n<=E5vae$ML7TH(mJ=b&RIV<`j#vD1(LJvddsMSbYBlUGk4y zDXx&5MRJQ#eGS+o!*zx8z0d3Y_IMbuJy0r&LLvtPv=ZU(7k@|1g&YGE;rV%X@^VNk zH^Afdw|||r_ik(KvUn~eJDu4nAvWWRjfQ0*wuRH zYd#g5N`v$`8?s>sC7~F)6X6CViBu|^h>!u2)9VjE`)`XO1LQt_xtx06jfiA`+-s%5 z(@f>MUX=lIkCBO~)sG)S282gU-fhHOH6j@h4;#p*yUFF^AFd>kBem(#e*gdg07*qo IM6N<$g52AWwg3PC diff --git a/sources/lib/images/fileicons/ods.png b/sources/lib/images/fileicons/ods.png index 4d6676c3a02237d9db48e79581085395ca47a0c3..77e6d5366b5175f6ba5d16041d10a9d313aa71dc 100644 GIT binary patch delta 401 zcmV;C0dD@P1)u|v8Gi-<001BJ|6u?C0cS}>K~y-)os&&Y!!QtqpY5nc-DOi{!GbeX z2zLBjrpMq8NbMpOhoS6PltZv7&8DfE#<4QaV}TNqP$7yXOP(3OPczT5A_=7w0GtCD z0|@Z@N&vi*tN;Kc>%yccid|WjUPO3o7e&F@Z1xD?0)Qsj0e@VTW$CjluwU zeKy8);u_fG5P!!H0PX?Y;e>S?MOdy@Pr5DUblP0tblQpgx#h+~JMR-}Qo>c2MUOMNN v#+b7|j8=K?^WkuKt9su#I>8qKkbDBT>iQpdo{RAS015yANkvXXu0mjf%AdW8 delta 669 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 delta 736 zcmV<60w4XT1MLNn8Gi!+001a04^sdD0kcp{R7F7mH#0FUIyyL0Q&?0~Syf}BR%E1B zWu##sZ-#1chhlK8V{))$bF^`Gif47QXmzq`cCvGNmQ{erS%Jn_g2i`y zkzItuUWCMRf3kFdwqc0Fc7d~EiNkh+wswNIWs1UlgsEqX!GC&$vxSC_dWE%VjKO?{ zw1tR~Y>vQgj=z40wQ`WZa*@A+jJJ%An1PJLc9Xq^kGXo4yL*+qjFG5*m%53Rzk-^) zij>EVm%odb%7vZ2lbN@Wn#G8qz>A{7l%2+tp3s@0%$cFhk*CI;rN@`7$)>Hxow3cP zt=gfq&Z@E3qkp#1q_)wgxznz++o`+MvAET;xYVk=)w8+QuD;i=z}UCE-m}Bn#L3{& z)$i2g`qt$7*5&%v<@?v=``G3B*yj7$=KI;_``YLF+UNV+==ippA z{Ne2T;q3h4?fm2I{NwKZGA#Q@qhj5^8D-a{p<7n?DPHY^Zo7g z{q6Mr?)3fc^#1Sk{qFVt@Aduf_5Sen{_ytw@%H`k_x|$t{qpzz^Y{Mr`2PR@|1vQy zKdSew00001bW%=J06^y0W&i*H=t)FDR2Ufr!NDp-VHn5Z-#Na;$Xo$sr70AlNK;B& zg6X8eMStK5T)}q(%1(B6%4!x<&dS0O7e^Zj`G^K<9sEx~1 zKNOS%z>z7Lpr8zZB(F^Z3Ib5qSaK70Kmc4Rxw-GT`BMOFVBb~N{Md090S-rfySg1z z&B^?dTh39h9x8Gi-<001BJ|6u?C0clA@K~y-)ol~(+0znXcw~Ju3q9GI(6#4-o z!BYJh{0slV1d1bkj24<`&>yg~L9XEl$L(!y_MU~gi-&;dB$MpS?0dU!cE=+L&+`D_ z2tWfs1=}qE@J=!V0FcZJ?IcO&X_`6_;W|%}g#CX17C;MtB7a#T=%#7vqA22Wxh#A> zpK~^waXOt+L^zpDI2a5HlJ8gRiU^G{wARuXLt_jViv`0lWDo=t5yo-MD2nL&{w;u( zw?gpboGTJpmVqQh1lC&A>-ADIDwWFlkA^9w@}@#51?L>J)~Hsi2*VIrmO(_&Xf(b^ zRta)&zSdfo;(wg5$es248vs`TF7XFzpEU9C^fFTGz+=CMvEM7jtM>Z#fxW|eTWvbI zb3I%OEH$xq&{ms@W50*a_3&3I8wqv+=LC1VY+NTtZ2bD~S2#Ux;_>-q=DWOQCXa$ZG#T03iC zPihpAtQ!heK^a)qg) zd|RJ?Txg5Gcz=tdkB5Prg=%Y#!l8y?bCAEFiEgHcX{d-~ql;^=hhTb>yq=JGdzZR{ zmacx9y|t2PxsYgqoxqZtqQ8}Gi=x21nsvdQbC9RSwxfWRtjfcsd6%!vnX%8Jwa%xy z)2Y1GtH0Q(sF__ z*6#KofkY9GqOxKkDRDI=cT12!oQHQ*NRX|TmKmY8ss#W?{y$8JsHQ$)C0tvH|083AAP73c7z_s2-v*|&u7?V(HN5vQ#$Y%cB280NRRs~jcs%|T=?m24 z`fiNr*tKBei+>{A1Gocli$7p8nPRzIJnEVphC~=PKZ3s9_r1R_5Cpi;?aXnkI;6H8 zhD01I#PL^)r>CC+oeb@OL+Dr45%`UK2pYiCF@gQ|03grt`j20@!E*Whs9M{2>6}{_ wV@~?59YE#1&qt%tRQ1+*as;`C07yOnCl2zcq0*bC01E&B07*qoM6N<$g6#^kOaK4? delta 895 zcmV-_1AzRY1B(Zc8Gi!+001a04^sdD0yj`hR7D8^0C`|nbz@z0W@x!sM1*Z*qGm^s zZ&a^oOI3i#s%%VGfx(4&a9M%ISc1ipb$4Ba#7m?~UWCMgdzO5Gh_!E1q<3Cnh{Ixu z!)1!XXN$pyhJ~haJ!z5v45hQo2$FxmuZ)*$;_aTo2%Z;r-Gfa&CjQS8NwD!-BxIs;Rrwu)D>oyw&WkdF-!xtH9K*zSrimg0H~X)wiv$#MraL z+QP|`?zn`v%H8X~lJCBa?ZJ@V#;57Up76w#`NN3d%73lB(&y0AuHwtA^2nI;%ACg5 z;_uF&)6>(})6w+LqRiUy$lmhy+OgE+`t9Ss(dPTs`q<|C z+2;G%=lj~{`r7CF+vofC<-y$O``qaK-0Az=>HOX4``+pM-s=0`>-_5J>EP@9;OzY2 z?EB&D{D1oD#p3P!;_mn3?fm2J{pIfc@a^pK@$~KU{p|Go>-GNa^#1Pj{qOYs@Adxh z_5Seo{qgqw{rK1N_xYSlb#+c~ zT+`ZhKmmw|gMo=|MZDiKeGp(^SY;ON%p((MZs^~#a`{rAfToAAms5fZ3x{X@ilvM6 z8DbQ;`J>Vbic4yX>=!Rypv9o1XC0BARo;*oSthq|-dr^XQA;i{TUOJ2K@FpTxpQVI zGkB=l?6C+>s_dvPWp154eTqDT8=JIuUE7jvHH^74r%#zA#V}vJ(XqLES}0S-jOmjn z^htmmrfuiTE>bmp>g0+2JwhOXkQCR#&goMoPU!7w=LHEE>*%PdD9TET3-EDr0sxqz VRE!mP^BVvF002ovPDHLkV1f?3A_xEg diff --git a/sources/lib/images/fileicons/ppt.png b/sources/lib/images/fileicons/ppt.png index b7afb2266cc0b79fc47d091b68441a49e2feb9dd..3355c2712a3603000fb5590858dd9b4c69e925d0 100644 GIT binary patch delta 397 zcmV;80doGi1)Kwr8Gi-<001BJ|6u?C0b@x-K~y-)os&&&!Y~kpU*ZTVcG;jTy5J0` zqPx;whGX;&NU#X%VM=#h&_i?sWJ3@kj+Jp<7s!YN`p1(jd&V=L?HSo43D5HY;1)m^ zK!Bf>0Qe+X0RTw4jeb!S+p;XJi15-Vih`5LWDKAOz$aM)41db9v{{yMzuzCncDv{9wDb!8;A(C)-=XYYfY^+ce@?aG-Z+`6cOfm&MeCq$MG0I&uakQ zt+hu-RaGDf5rHuVVHnnm5d^{gS;2hYcSVKo`>@tRDTP+6g)~i3RTV@8-EQ{)X#!lb zTPvk%wgVo0h=1c}08aoO@ed872=m3_C2+|cjSj@w?9kqCZ0DP=RzMi`{nL}Z+3YN^ z334+4pwsEs`pD6!7SOaWsRn2U|Ca0kueeru{&95|9-;_ui^Yp~@*D4rF>|HVP4j6N rR9S2DcDp_F8s9nkL$Z?qNWK7*&F+W5!1YuB0000|NrBpib%9*8Ua##n;I!(~guW=ma!#D89d#9@fT$7@ewiNnZi zPi2b2XN$pUjKRTlTg-7&%yCp~j=*k?zjBbja*@B#cUaMPSay@WdX>9-mAut_Tz;3j z)qPxon!MS7U)h0R^?O2voxa>HFa7{Ne2U5V{`~as^7sDq_<#QO`TqC%{`vd=|NHm<{QCd> z`~Uy{RtyisV-7a}0004WQchC!X=6{ zaBG*KB^q*QZ3%>y=xVxxXm<1hYO3W8B5I8S`=U_7G@oLNZD8 z05Xe#3V+$2;`P~o-SbEqs4(qL$8#+mbT5!JkX6&sX~WJ&!$4P(EXOB{H7##nR`f|8 zt(@JNJ?zwHO-PXa*=8;J-cT@6hcIu=TQsZhm1%YX7Rtk$A9ue!4BkJWGH(yBC-jcn z$p(-X=MnXMc}n=y8g5_G{uT+a4unYx@=cPYRVBhCWzqovaFbNsD z)oR7%a!C>4VzJX`y959uPdH(X}U$}`PJjL;&I+(^Q@BQ2u tbM}MEst`in>2!wbXq=;8JWBv1Zy^008R}AWumAu600>D%PDHLkV1l>xyJi3Y delta 684 zcmV;d0#p5-1Gxo|8Gi!+001a04^sdD0ftaaR7D~Q0(Ke{d>|NrBpib%9*8Ua##n;I!(~guW=ma!#D89d#9@fT$7@ewiNnZi zPi2b2XN$pUjKRTlTg-7&%yCp~j=*k?zjBbja*@B#cUaMPSay@WdX>9-mAut_Tz;3j z)qPxon!MS7U)h0R^?O2voxa>HFa7{Ne2U5V{`~as^7sDq_<#QO`TqC%{`vd=|NHm<{QCd> z`~Uy{RtyisV-7a}0004WQchC!X=6{ zaBG*KB^q*QZ3%>y=xVxxXm<1hYO3W8B5I8S`=U_7G@oLNZD8 z05Xe#3V+$2;`P~o-SbEqs4(qL$8#+mbT5!JkX6&sX~WJ&!$4P(EXOB{H7##nR`f|8 zt(@JNJ?zwHO-PXa*=8;J-cT@6hcIu=TQsZhm1%YX7Rtk$A9ue!4BkJWGH(yBC-jcn z$p(-X=MnXMc}n=y8g5_G{uT+a4unYx@=cPYRVBhCWzqovaFbNsDR#8Gi-<001BJ|6u?C0dGk}K~y-)os%(cA~6((|FK6*Bq|z|Vhakm z0E)8ZCYQmt*gGIWVJU~nmQdsZbZHRNFo*$Jv6>M~W>Jz~dXoL@|MT;+9Fas6 zMF8*vzz{%;+e!hvldJ#$B1W5>-`!Bt!(>dkhAHt7gP;{PRP@lu~t5p_D=h0a|PHdOc)WhN`L{A{Y*b z{~&EZZLY^!>wl|x4Qz6=+3YufX8=$5f+mv*R;$&EYMZUKu-0B}?#gX88}$4Asp>k} z7}FT6wJ^rO81tcuBuS>KtGwFOhIOeE&_3-JBnI$$tAVw#>k8icw{O3~cs#~>y?%)< ze&d7p{*TuB?tfRiP!&QrCrR=vYJKPXPnc^7fb=hG>JssYmr#T>00000NkvXXu0mjf D@W{V; delta 455 zcmV;&0XY7s1J(nO8Gi!+001a04^sdD0NzkcR7C(0011BERe;D@fyP*Z#WIuMU4+D5 zgv2#Wo3y3psf*zCF4?7Z9U%j53N>HFa7{Ne2U zKO{OI!W=|Nj+AnV;QBmjD0& z0d!JMQvg8b*negK005>*L_t&-83n;RN<(232Eh5@fURJsg zkJ2KA3Pue|?)jW4T+B(&bGHqJoFz$eznV7c8UR+)ri4KlSWU%{kpUBm7)A`|NnVNp zLq?J)APm{AFS`sF@Of8B-Eevgw$F=oy5Jz4eE%(er9cavPQJF@oMc}}Cm*lNAG^n+ xE_Cw#U|QXhxsc@WD%mZQ>3QzC+drXhZy6oqEHwZC002ovPDHLkV1k!}1AhPj diff --git a/sources/lib/images/fileicons/py.png b/sources/lib/images/fileicons/py.png index 15a727c5469429434715fb6fdcc0961e6a0d997d..f0ed0258c5571d6d4672b7269f4f0d4e061dbe51 100644 GIT binary patch delta 411 zcmV;M0c8HG1*!v(8Gi-<001BJ|6u?C0dYx0K~y-)ol`MR!$1%m-M6Mn%TkdnfPzW@aV666DPG$C%{D2~r3?|CSYEju^}7-@C4b2qcME1gFYp63C; z0e~(5A3q}m@J=!Z0FW#W25Fiuvn+EW!lp>ml;iRE20$NxB7a#kIL)%m#c|B_dR@kH zx#VK8;Cw!(h;TNWaWa{dCe^2%iU^G{wARuXLt_kAs}-XtVi<-L5hh8(IF1z&#ZzXT(^1S3@Q>RMp>_JN)K&OkL) z9$wvk6EwkZ?+v_@QNSu$2!~g@J!I>} z)T{i)p|$o=YrVUzwF+|QT+(j0&%KTB-1~*N>;ORc2^1KM>#jHvH=zIk002ovPDHLk FV1kYKwhsUR delta 670 zcmV;P0%85C1FHp)8Gi!+001a04^sdD0f10UR7HuPz5o~k0U!VXFaRGQ9w8ta9w!I@ zH~{=5MMW(^P!Jws8UT3!NJvpkPAeE~6H!kx0DuusP(4#nG=B$x0v>S~QC$uKhyVbP z03Uz^Utt|CfB<1%DPm$6X=eaJfBcNEkf+6w zsK%A7%9pRrnX%8Iw9TWo&!)N3sJzvyzu2w8+OWjk)#drt=K9y?``GCG+3Ee->i*v9 z_}lCM-|P9{?E2yD{NnEYht^S^nd*9_5JPk|L*ty@c94o`1=0; z{4MkEn*aa+0d!JMQvg8b*k%9#0NF`IK~xyi1;N2e0#N{k;s1`e5d|Rvsi~cA8X}@- z+hb(g!bNXZ;HG8t8ZIMB%m|ViGa(vh&guICa9vrFBt{Sc@1dlEr+hFX0gR}?kPm18 zFI%^#V1E}~y4wNb@w8c9VNC!6#KUw|RF~K`v%p5aS;tjVXEyd*LZ?%=<~xh_osnHd z+PmxfWSTA4Hdctt9_rr5SH4JW8AY diff --git a/sources/lib/images/fileicons/rar.png b/sources/lib/images/fileicons/rar.png index c761a4f7fdc3bfea15a52b1a224c0867c3345be7..f15d4ce5b34de6518ac93bcdb29597ee61e62a9d 100644 GIT binary patch delta 403 zcmV;E0c`%Q1fm0w8Gi-<001BJ|6u?C0clA@K~y-)ol{Fr!!QtiwyPGws++0{7A)Wb z6)HPEmnpa44oK}Hh{I5JAi)LLu_?`_shY;IGR|XBB}zh60Z$sq<2Uoh9(xo?D5U`4 z7{CBP2m28M_#~MF07w?ZC{5FKmStW<*k);(ayp&f12_SoNq^P^##xs6IF7m9ZcAIQ z*IcbuTrQUs5iS-B&StYxqf8;G9Fh->)^J)9GCNXqeWzXezYU@ZQ51gKoErD2kBhIYb15!C)uS z6eyC5wK1mV7k`4~UNFHOfExhU_ydM#S9p7wKk6cR5)hMswVKAfCT*bD#w002ovPDHLkV1gT`q<|C z+2;G%=lj~{`r7CF+voe-==HFU5``_yP-|PI~>-^yC{Ne2T;q3h4 z?fm2I{NwKYF##-_ZCi~A3g8DUNvna0 z0tiWxVPFc_0}jqk)}9UU9RIxh28cqB?_=iXb-C_*{2KMg7Ui=S7rQ!MB~r;p0G`Si zDM@kDjic?Nex>zN-g|M`>UgS@ivK1aqghfcx^cLY^y(YPBkI zu~=|EpK~^wQA9YMPB|P73zBtdry@dQ46U^^#?TnU<#Nd|3>gFgMTBu2Gm0YmzJCLt z<5dVo&bgwIWf@39L}0B&v)L?}QLEL?z8I#I%1wn*3eGubtx>Pn5r!eMEQ5%k)oOi` zR0(o$e%4x->VKTD=$-WaYXFx3F7Suw9<}i}n%t=>cbFZ?_?O%Y42>=8iKy>lk^$(_c-T(jq07*qoM6N<$g81FI A{{R30 delta 790 zcmV+x1L^#w1EL0y8Gi!+001a04^sdD0r*f%R7D^F0EZ0+iVg;e4+o470gVpH7nhgV*4g`r64V?`Fo(u(@4F;kO z2ci!IoDmA64+EGK2cZxIn-l?@6al3U451MUrVs>~6%CXb5Pz)@3Z)hSsTBdO6alOg z3$YUcs1^#T773Ie7pxftxfKGV9uKq@5TP9(q#hHo84tS`2&y0vzZVe283e>65vegD z!Y3EPF(Ir!Gq6HKs7OS>KryUJMAtec%s(x#N=Cj$IlD_p&`Ub8SX9?mL91qFRe;D@ zfyP*Z#nD|-U4MkcUWCNmTS?tpOks$_Vu{0Lio$1$!D)=aY>vQgj=$S%UviMYa*@Aw zlf8PCyL*+qewVs}n!LD)jfI`Q&xCu6qQc&Wd%2aIk*CJwkbRe|$(^yy<(!hCw9eY1 zpQEHFU5``_#Q;OqS0?EK;E`{C^T;_dw7?fm2J{pIfc z>GA#Q^8D-a{p|Do?eqQZ^!@Gh{_gbs?)3ie^!@Jj{_pku@Adxh_5Seo{qgqw@%R4n z_x|&8H7#f2JX^{}Q>bU2;|JUIE!268FF?WC*HXSdV!Wm1InZYpti{1W6U5yDp~)nvRe-7E4^0jEN4l8VGXys?uS UTo2u4M*si-07*qoM6N<$f})ya~e=^yf*~~YanO#K^N+|%i z0?+_Z!C{2}zDVW(0FuQ)D^1fymStWl@9eR4R9W8m6@_nhLEoy!SB1pjxdWiX!BB4iQ14(fEaI z1B&EgZ;aXS3x8l43wn40@BpBTf9Ue2gUNU_)BqlO0lU4RoCbOUvCl8o@6QqH7ij6C z^2?*zNZRMG$IolOfRg<3sIbr9Cw-{mG135DaiS83kJG1ceUHie+fc3j##`sy$QX0B u{l<4F_ueP9TCJnDzVqb~$%O5QH%){{R5* z5D=v?DR_8zRe;D@fyP*Z#a)ENUWCM9h{Ixu!)1!XXN$pUjKOS``PCE+2{M(=la^```hRH-01t<==|L2``qdL-Rb+?>HOa5``+sN z-s=3{>igg7{NL;R;OqO~>-^yC{Ne2T;q3h4?fm2I{NwKY?B?)>HM{N?Wb=I{LG z@BQfT{ps=j>VNY5>+=2V^Zo7f{q6Mq?ezZc^!@Ji{_pht@Adxh_5Seo{qgqw^7sAn z_x|(u{`C0%|Ns900055CR+9h#00DGTPE!Ct=GbNc006T|L_t&-83n;HN&`_Ch0*Ul z2f^Ah*48e-*v%#!gk)!F1{Yy(XKfe6kTQa$GylEUbAK9euOvy#83rJa#J1kYw=*3G zmQ;dqLkG5fxK_!)xM}Q}p*{1H4}f70X#|potoiKBuK{LmW5slEpMaTC#qLbS41nZy zNxNBIXfsTFYl*(v4gea5r&ZBoPDw09*hV z0SNK4QULEHYXAUA|6*L0<*uqKCn7wx%Ch8qKA!=&1fWQE0Dsq2Rk=LRc{m)JwcG8u z-EO(rY$zgJuh(2G77e7`+O>$#7(;6J)))*1$g&J|T|-1L8jX&SKEN0I zz1F%Ddtj48l7Bn^xCd~DKWGxiSgux2p)clidL%wR9>@C?`&>U>etZB?G*;~|w-0)d zfBJnp#`*cUGe=IR-2*+fyJ$@B7}#s|o53gG3cxe|tD<=O_Y`j97%!{UQ_#ANSJv94 x*7~gfYbR7Y=ZfKQI0<^!IsQelmjFmV0pR)WhimWcNelo0002ovPDHLkV1msfvs?fG delta 386 zcmV-|0e$|W1Cj%f8Gi!+001a04^sdD0J>02R7C&~u2q1@S%Jn_g2i2g#9oBNVTi+G ziNj@z!e@)YX^g>aj=*k?zjBbja*@Awlf8PCyL*+qewVs}n!JUbzKEc}i=x7eqQZ}* z#F3}QlBmX&tH_tE$&jwrnXSs5vCX5l(W$%CufW)|!`jl~`hV2p`qt$7*X8@!=KI^{ z``qaJ-s$_`>ipsC{NwHX+=2W^ZoDi{qXkw^7sDq`2O|z{`dO+ z`TPI>|Np9B2;Z_Q5&!@I0d!JMQvg8b*k%9#0ES6KK~xwSO~Ek=!cY)E!M9->5fK$E zENtv@2k(D_bbFSm#CU?gPZNST6Tq#swN}Lh33zew=!c2C^QRxC4n;);`eQ;E1_TU1 zg2BwVs$&Nsv%oJpf*>Hkw^jhxvp-`3O`j}wRs!nDRV7gRVzIRnP!FyufzmgNjg^49 gchv$o6=lsVKEG~zALPaCp#T5?07*qoM6N<$f}e}k#sB~S diff --git a/sources/lib/images/fileicons/sh.png b/sources/lib/images/fileicons/sh.png new file mode 100644 index 0000000000000000000000000000000000000000..2560671066688162472bd6f9fc30b0cdbdbbdc9d GIT binary patch literal 422 zcmV;X0a^ZuP)L1Gofmfj^*k)WPHU^-gUfzXSuk z1cTDAo(10CKe4ml>iL_<{j1xps_>h8JylQkuWr{~tH&!t-;}J2{8o_<;J(^MLENSd zvB}%Nf8qGBgQw@$JFl{heQWK5)_V7+)+)%Ib4jz=Jojqr+}VO$b^sv!0z&cZASx;H Q-~a#s07*qoM6N<$g7`PL#sB~S literal 0 HcmV?d00001 diff --git a/sources/lib/images/fileicons/sql.png b/sources/lib/images/fileicons/sql.png index a7b0684c7f11d4741a3f7ca5b35763d65f488630..6697943e2778938f47714ecdf639f6b2a2829920 100644 GIT binary patch delta 395 zcmV;60d)SY2ATtq8Gi-<001BJ|6u?C0bxl*K~y-)m6JhE!!QsrGhV6@{IkTJTr1c5>XTZz%_sg zfB`Nm2k=R<1ptur2eZ1a_f69{5#hO2*EJW5#T>v507bF~xPNP!#+7Bsd4hDGb|)e<#?V?zV+@TkJRA-zih_BbQ$$!*70a?@nx=CAH&Fn1 zcg~#>ZQFt*Lh@vRawk<>ilgZ>85(2#0 z@3q#w*aJ_wG=EK>0XzYC#6L8hPO)08UQ}pKk_1VTpc|jtZ#EmmaXeF@Im3KRc@C;+cv{k{Yb^KsaRs;WNzG=&h-okG<4jkng?H?8&6xzYl) p&bewd8a+h8cb@*i>?Hv5FXDLj--iyY=>Px#07*qoL_*Q!+)t;|Dg&YW5^H$^d*Hbh5|-(+w;78ub#t8&dte+M#Lik0EkB3 zP0tJM*nfx$4{>60Og;dF)#qjxWJE+nG&4lOV9@M>96PXm8~*hN;&QpBEvU1z)9QgY zY|y3y5{t!MY`MYeUtV4|SfP!L4bTa%+n~|WQISZbH~Zys`Lls96bgk*CL4{$2D%t@ zKzhCYe#>HcdAZ3BEiEk>w;+v1W7_iTbUGf7$7C|CZn&tZ2-hn`lNDO6*5(Om!G&!L zY&M%lqp?^l&U1zD%LQxxeAK>ahFV`QmtA2jQ1+1H-N!l)M_=6NOZg1 zYgTA-agwvl!$YM~DHIAldx22l zzsm}{L(gc&=jG&w&i^;S@=Y@?f-!3?L>bQ)Ep3eo2%r&J@p9)-041#Kdz-Jm( zw}2RnTEE@*IV-BalB$%#U9+PGbJE#}qfN;=f32q^j`=Ds4}lh^eVf8J1Rp7+M}N)kRJon^;8Vqw z?w0%xc?oJ|iNj7vr1S$SnIO}m6{>Hras_ecYJkexs_*7o{L`7!t+?>^*^FnI71BA_y#>;veBV&n4ktbA&?DL-I2bX(TZyN(KtJ>69zNeHH$_pSfa?&T$ HO56Sd0mBvu diff --git a/sources/lib/images/fileicons/swf.png b/sources/lib/images/fileicons/swf.png index ecc7309ad52bca2ff1387fad5f066e36de59e9c6..b45a72cc934c7aff5e71d61fae3e1813de39166d 100644 GIT binary patch delta 401 zcmV;C0dD@>1)u|v8Gi-<001BJ|6u?C0cS}>K~y-)os&Cm8!-@uzkNUo+^G>>3;-p-!zTO^IV6+;b^AHcs%|E z=>z;>KaZm5WPj~}M_&S;fk$AC@+!0Sw!b~in&JDyVk-~ay=9v)b|y*&q=ZoI4OdKpF0 vhyEWwqt-cB42Q!>&}--G3l4i3kp2X&qY?Z`Y|!ff015yANkvXXu0mjfc=@iMJ5JYAo zRdp?1d`x0@S#5z_afDxUg<5`=WPz1cfXG>a##n;Ic7Tdzg`04KlxT&TU4+D5gv4Qp z!*Gb3Vu{0Lio$1$!F-98X^g>aj=*k?zkQ9Ia*)4rk-v76y?=+1n|hVIdzHL@m#K!8 zrGA&XikYW^n!JUbzKWu>lc27PqQaG-t&yk3ny0mwtjV3R&7-!_t+u|XxyP-z#IL%? zsk_vwyw$Y5#jd{Bv%t!)z}U0H+P=ok!pYFd(c8||-PGIR)!XCV-saxo=G5f+*5vxu z<@(m;``6|B*nj2v*yj7$=KI;_``YLF+UNV?=Ih(%``qaJ-01w=>HFO2{N3sM-Rb<^ z>HFU5``+sO-|GC|>-^yB`{3*R;OzY2?EB&D{NnBW>Fn_1?fm2J{NwKZHM z{pRod=I{OJ@crrV`|0uh>hk>S^8N4f^z8Hf?eqQZ^nd;B^#1Pj{qFSs@AUoe_5Sen z{_ytw@%H`k_x|$t{qpzz^Y{Mu_xJSp{{R2~1TIeN6acpX0004WQchCgXbSFj$zZ+b@~FGU(d$k=_x0l6^|D00rPW4;$rGBL50gO_hIy7fdbXbr zX^K%Hq-&VkXx0d1ZKlxvTYO;A+nly7vaXpH??~sr;WWSfY%z*rxUsYJ_~&{sT$#zt z)WF#1pUbq^tDSOH34rYbQbs!E_X&Wl2s%Y73jdo&m;C1Rc9Q@A002ovPDHLkV1jcn BzuN!+ diff --git a/sources/lib/images/fileicons/sxc.png b/sources/lib/images/fileicons/sxc.png index 4d6676c3a02237d9db48e79581085395ca47a0c3..c96cf303f14d9f5cd3348ff90a289eb6b6dd8afd 100644 GIT binary patch delta 405 zcmV;G0c!rL1*8Lz8Gi-<001BJ|6u?C0c%M_K~y-)os%(6!!Q(vf5%aa*s@d^71Wy#rWHU%&Q5Rg0p+<#P6FCeH<0$$ZbXE}7+Py-jG-}xhr@wcmN89JiU^CMV4mkpl4J^Cs5*cb z=Ug*U*EL8&L}0B&6h$Y+2*dF9OTmI5@I^%s1aQtlYmHv7hb+rb*EK{0gTdev(gk?4 z?`y43#va(rA%9680XzU0;}5!zW31NeWzaTrG65$O_OJPP`QLsx`$J`id4FHcXyXr(^Y`TS%Jn_g2k*?(_MtbUWCN0T-2^y z)URCBVTi+GiNj@z!e@)YX^g>aj=*k?zsGWCa*)4rk-v76y?=U@yL*+qewVt|du@W6 zyy|;a>U>q}d{%{>zKEc}i=x7eqQan{q>rV<_k&;hgkF)S#*(PUm8-~?tjWu(OPQ_8 zoUqKDvCXowvZJ=q-M|{EweG3A)a$x8?7BDYx;L!8*6q7B?YlO$zR<70*y_Ak^1v;? zz`(P^+Rnny|9{f}!OGqL)Bw!P%+AX5)XekS-GO^4QVR z;`-F%`qt$7>HFa7{QmTK|MYqP^>+XDc;W2)|Mqv|?fm8L z{O0fc|MIHn@cruX{qgbf>+=2W^ZoDi{pR`q@b>=n_<#QO`TqC%{`vd=|Ns90004Yd z^KbwF00DGTPE!Ct=GbNc007%bL_t&-(=E=uE(B2khT->|ol&>~1(jk#r{)r9H*o<< ziGpZME8DsRr9u?4h0rN93WF=6pVX25<{NlYi_1?wY3YWm)oYI2_w< zx8ruZFOri3qK=bk5OQOKUCn`#p=IV4mj`5mr^jvMiaV=`(;^ zH30na-X90rwgpLu2%K|>nf!wc z0l^$%V@$6ffPcp^r0FjJKLI@9KlGR+Sguwtx@+ca2F_*(@$egB09bx}0C7CkU9-wE zs4V+5tIDz-1lQM7{n=#bUjkxy5xS6I?qxiq2*7UuPhsJuj3+y)s<&_dg@+`;>uU9) zI0046U0CfNWb^ri-004ae0D=HbO-&1d1pto#RaI36mjGX1UuI@zC7cXkgc=~L z2q~}(cXxL%u@`WCi&cQgGqn*}fyP*Z#a)ENUWCLuxfNlE!+%?%OJa$`Ws1UQi@|A( z!A89zv5FaNj=*k?zjBbja*@AIz$bQ-z5j9o|8oU;mAiYDyi>*~ewVt7mY#x|y#0L` zyPPkDoxX^mz>A{7jH1Gzprntb#F3}QlBmZ2k0t+*D*urym8-~?tjU?J%ABywow3cH zv&o~f!LqWl{C}fBqqfnix5c%(t)slv{H9{5yVU8cgU+?6tiIO&u1d1M&ac4Oz`($> z!`jEi$G6Mhx6I(Q&E&St|<%)!v!&&|)v(bnG5 z*4Nk9(&GBmVN#+=2W^ZoDi{qXkw^!Wbu`TqC%{`vd=|Ns90002I}TxI|O00DGTPE!Ct=GbNc z008VsL_t&-(_>&@V2BM3@b+-BvoSYkfPmCgoxw|F?MxzNj27+g8&1A17jDv5I=K6eO+x$b(J|o45LtfOLJ2rgkNdS z!0*T4)f_D2la`pAln`HG0y5OI$v4mF(JaIRMk z$_sIEb<^f5)d2}O)|rWMiu*@e^Kg`CfCTJo4NJ771$hN{xLJ$TKmxWk%5stt!hD=; zEQLxS0UMzG73F26B}Ih=@*n|AQ&U5IT}^crMFm+|0Jl>=Zj=j;&;S4c07*qoM6N<$ Ef=)kqI{*Lx diff --git a/sources/lib/images/fileicons/sxi.png b/sources/lib/images/fileicons/sxi.png index 2f2574af614b3615f3eb7caa367897faac6f5dfd..8a5e23033ee209a94d0e6f00100ed26b57a8fecc 100644 GIT binary patch delta 399 zcmV;A0dW4W1)c+t8Gi-<001BJ|6u?C0cA-MY+0%d3_L@H zVB_ay`WU55#g~`RTZbx=@WoU0Geb6aDQFbwJ(Z-`~ALc+wGQ{ z&4%msnj*s0YQ@=X)#ck z=Dlwxnx+9shzOi>h~v0Zj3|n3eiTe=9f}IAHN5vQ#$YfQAkT9&O#>0ZXf*nU^Z~&f zVq;8a9DwZ{(tq?3zypAL{6Tj~g2i(Atovq8Cg5b!#>aX9SbTm0aXgOtW;LImevR|< zapxV?eBL=FjDLgbA4NQX1oI)ZuL!_PNF!`KIgPS>|Mx50CJA1b%V%})8?T&m3uDaL tvDA8My!YjBIJ{H6@0^@q4iW&_7nlk1?Dr1PdH?_b00>D%PDHLkV1g{_xb*-4 delta 674 zcmV;T0$u%{1Fr>;8Gi!+001a04^sdD0dY`FR7GrMLJSNH92^`eDJeoiLQPFgRaI40 zRDfS!UuI@zcXxMHfXIA&d|83USc1iUeSKYo#9oBNfq{Wxh{Ixu!)1!XgoKc1i@}G7 zhiQz#h=_-5j=*k?zl@BGa*)4rk-v?Njdqj0k&%&lmAiYDynm9CkbalCk&>i>n!JUb zzKEc}ke$MdqQZ=#!k?g~prE9WrNp75tdXb2lBmX|rm>@^x0S2Nq^Pu)tjVaTw3)5S ztgNf8t*xA}%$>2#sjt1SudlMQvZJ=queZmzxVWji)TqAPtiIN~yurP_y|2L7x4+E5 zz`(P^+RV(%(SOm=&e`JE*VoeG`qbn4*5vx*+=2P_5b4d|Lybr<@f*O`2Xql z|L^qu>G%KZ_W$ko|M2$y^!Wbr`TzC#{`dO+`TPI>|9}4g007Ms_pJZ`00DGTPE!Ct z=GbNc008VsL_t&-83n<=E5vae$ML7TH(mJ=b&RIV<`j#vD1(LJvddsMSbYBlUGk4y zDXx&5MRJQ#eGS+o!*zx8z0d3Y_IMbuJy0r&LLvtPv=ZU(7k@|1g&YGE;rV%X@^VNk zH^Afdw|||r_ik(KvUn~eJDu4nAvWWRjfQ0*wuRH zYd#g5N`v$`8?s>sC7~F)6X6CViBu|^h>!u2)9VjE`)`XO1LQt_xtx06jfiA`+-s%5 z(@f>MUX=lIkCBO~)sG)S282gU-fhHOH6j@h4;#p*yUFF^AFd>kBem(#e*gdg07*qo IM6N<$g7+_vzyJUM diff --git a/sources/lib/images/fileicons/sxw.png b/sources/lib/images/fileicons/sxw.png index f9c126efdc317c57c59132cff62110e6d7f1e7ca..9a903791cab3cadebb0ed88879a494dae7107656 100644 GIT binary patch delta 402 zcmV;D0d4+@1fc_v8Gi-<001BJ|6u?C0cc4?K~y-)os&Io<1i3~A4$Ou(y1|2q{tbJ zz}w~LGCD@?5Wp^EGajeENEQ=yE)JqXiuodsZ$pZ%Dka!;kGo&I3r4#^M z0T=;@@PFk1{*r6~03^f3xUTDM(==X0cq;0;=5#uJ0&opLlYcw{Oq!Uy zZn@cPxL&U*B3!LjoXut({LqCnfW5D|<2#va+(Hw$Z7()U3YNufW*Az`(P^+RV(%*Vot5;`-F%`qt$7>HFa7{Ne2UKO{OIug>hb;R^8NAg@$2&a>+=5X^8M}e{qFPr?)3fd z^!@Pm{`C0%^?&*P_xk?%`~Uy{{{R30ONglL00001bW%=J06^y0W&i*Hyh%hsR2Ufr z!NDp-0Th7Yf9lvNB~6oANMmJ17FJSr%Eo{Y zsA2^H)RFqtZEok&6#=L&ADjE-4ecrbUH^8?;Jv}$f9xjp=2o4v`-Q2qR zV4I1ranfzQUz?e;(YH$U$Ni7P8vu;0`0Fw2fRVLP4Ind@0I+8TV7jlWS^<=P0>G{n xK~0eB->002n(jb4^zt31!0i0~`RvW(;L_!htk0DncY0_f*??vf>%aR`XWMO46U^^#?TnU^?J=Xju}M}MTBXZGD#AKVR#GR zB&Y!%opZZ|q9{NTA_8kI+U<6w8I4Bc;#0$vQogBBO2Ih?tu>m>CgM0oQ4|mnbUK|a zqz>@Oey+8y_0r&W)Qj3@WzryJyo}V7>g3@n1x7Nh($ delta 650 zcmV;50(JeN1D6Gm8Gi!+001a04^sdD0ccQ6R7GTGWoBkGX=h%8b}&_d$XS8LSc1h} zgv4Hi#9@fTm54ZEiNj@z!e@)YX^g>*h<|L3z;2Gea*)4rk-v76y`7UOw z=iB7eHOX4``zjM-hb))-s=0_>ipm8``_yP-|PI~>-*sA{NU{T;q3e2?ELoaz~b%vBK{p9ZaTViB?l)lnQeIf@SACeF^ii{eFi8{J*pHG_z_iXb>z?9@Qp zKpX$_o#XQqz^N%bq|6)=5Z8o9_``TQrv##DUX#mVJfwtrz~%AthdVGH7NbETxBJPs zcmzngs(=30&0bZ0$4%sTDpkzZ)F-Q-He4Z6RUEvted{2*;hxlfg>5sPOD+hsKo2QMXOt;vbU|Hs#e#@Pj#f1A?Wp`J_YFXLx<#41vB+U|db$*u3a=3?-fXFg8 kS4g1(I1&~vmxuEYiDH~k(YpZ^00000NkvXXt^-0~f{5yx$^ZZW diff --git a/sources/lib/images/fileicons/tgz.png b/sources/lib/images/fileicons/tgz.png index 48f19596cce36e65472b4c2123b0631eb2b146f2..25ef9e15a0384cf920ae9d2c0a106792ca2711aa 100644 GIT binary patch delta 402 zcmV;D0d4++1)&3w8Gi-<001BJ|6u?C0cc4?K~y-)ol`qb!$1&yyK5y#RB0j#3JSOY zLZRbxnQ#m4fRq$Q9EQ+=6fQtV6XGV0;&{FCtRDqh%Q4|Q(nzy!^xn=#qewz21pxa1 z`T!z)ZwY``k`(}eWJnwrMX@Z)(u)YUc~KM`jYc;B4ghG98-D_WvMha;Wn8bSj0he%r> zkV9;Y*?0%R8h?w2xCU?u-~xZJy`ytXA18NFAP?hu8@Rpts3KsuR|@U?+sg#KT^y@; zh&nTjxj_zb)7rTHsnq7r+eGzmd;Y2-4d8woq1|^7X=1s<^Z&PSc!ufI!<}ke9-mArnJ zx|x|~f||Udm~yV2N`;-ih@ilwo{)>8!ndbau%&pBr^c78$$zq{mYuQ9qqfnvw5`dy zcB#A6!@HlZzSpn7*t5gh%*>hG%YD$wx6I7U;L(rd&8_UvoY~gQ>e#pG*Tw4HtLNL~ z*5&%>;@a5e``PCE+UNS(=lk5~``qdK-0A$?>HFR3{NCyN-s=0_>ipm8``_yP-|PI~ z>-*sA{NU{T;eYJ=;q3hO?ZD#g{NwHX<9?)~KM{N?WarAN$B0}j$>Vp?Xfak5&UxI1 ze&nlcHwdR|FB|?~9gCo{vzzkM7UrEh6@aIDJ>>zm$AJQ{EV7?*A#>v&|4WOXzAu;L P00000NkvXXu0mjfo_&Kd diff --git a/sources/lib/images/fileicons/txt.png b/sources/lib/images/fileicons/txt.png index bb94949f6205b348e4b98e9b527fa03d934c01e5..4fd9216559e2920a3fe1ecc7821129248d879005 100644 GIT binary patch delta 392 zcmV;30eAk=1D6Ak8Gi-<001BJ|6u?C0bWT&K~y-)rBh2z!!Qtiv8xt!*G<(03(kNL zEP>197+j%3Y8Q^U3$SES4#B2sHcizuj+Jp93*;ybE#D`N?3t%|9*;c{NkmZu0H*-P z0DAZuDS$VUH2{EQAkNFO+*DQNMTCc}EKAO2vwHw%02IkRfq%=Ys(ha3-0gOaZ8jUO z*K4j;D~br0%O&UYc_Y#;?NUT&t)+90)>>L?x!rD=Wf{{nrHHU73g&rEW6V8(v#2BR z;=OMIbzOrbLY%I{>!;Ztx3CCKD_ciw78E9*r?GK002ovPDHLkU;%<7yQ*ve delta 451 zcmV;!0X+Vf1JVPK8Gi!+001a04^sdD0P0XoR7D8z09k>?Sc1h}gv4Hi#9@fTVu{0L zio$1$!D)=aY>vQgj=yq{zjBekc9Xq&mAiYDyndIuf||UAoxX^mz>A{7jH1GirNoh^ z#*(PUm8-~?tjUnB)|#%%ov_WFvCW~h&ZD-`q_)wgxznk;)PJhH)vmtRufW)|!`jl~ z`qbn4*5vxv<@?#@``hRH-01t>>HFa7{Ne2UKO{OIug>hb;R^8M@b{p<4n z?DGBX^8M}e{qFPr?)3fc^#1Sk{qObt@b&%h_5Seo{_*zy@%R1m_x|(u{qy(!^!Wb& z|Nm8h$nPIhTz>!n00DGTPE!Ct=GbNc005RrL_t&-(_PIW4#GefMB%q&9fA}>8UzYK z6OPa$aPD#dECLK6s45KfpFwPkVDy)H3227U5Fyb+2D}G=Q`_~-06T0&KwA|tq%&{; z+AaffG=`vK{0LtF=G4AsK+-NnN-x`FK%aCgowbz#i##pKe%p2i0^N&PO~MK tL^TS#{uj?87C*6`L?mD-WJ!{bd;!%*c}PQPmm~lH002ovPDHLkV1nu(1X%z8 diff --git a/sources/lib/images/fileicons/wav.png b/sources/lib/images/fileicons/wav.png index c167f4fdb5084d4c35725fc71fb8c730f5d1680a..c8880c62e20a5d6501f0de200e722455d8b77b38 100644 GIT binary patch delta 400 zcmV;B0dM}a2A>0v8Gi-<001BJ|6u?C0cJ@=K~y-)os+$88bK6=znMi4xuZc8Df|qU z<#fh=86G3=UHZ>`6fuu_VS$j&wD5{=T_$M&l&moCEj_ zjDQ~Jl>k2^H2_FzC$7q}+|+d)%uIiavMe>5%^rYDz)R`?Zhz{!4q29Ix7!_Jv)O39 zUTd{l$;`A|E;XOe50K;1Zp=(YQK+ga6-A+Fwis&k}xx>s$w`CcFgGYdSCu9%zNLOiuaxn0#Ovv@Apa5l%{DgGe)D)9&!q3 zH@A5dMV)>NJb#R_;45$s-0=^Zj3>me@skJcHPsz}ru!FZ+qZH}Mf@{{Ay@v~$(joH z=sJ*&F7|-4dUJDY`g;KP=sI~@)iL1P@x+~xzUBG#`N4~jP)t!-PE%V?Q&~?`TToP4P*ht`Ra;Y6TU}mXTwrEkU|?x! zX=ZJBY;JLGZfa##n;Iet&>ngv4Hi#D8ytpMipdVTi+mgN0&= z!)1!XXN$pUjKPSAh>3}bY>vQgj=zeGkBN+va*)4rk-vy$E%hlx0*5u3B?abKh%h~PC+U?HU?$F!p)86gV-hc1d-RRZd@Ymq(*x>Kk;qKYt z@YCb@+vD%t-^yB`{3*R;OzY2?EB&D{NnBWRhX?{WTzo|6DQ zanrIWg)u~6yOa#JYD)rZ6hd$#7=zn}yUfdk$6M>@Dwl^_n07PI_S6#V# z*9(7$Kv5k%FYTYY5ox#HH%Bc^RZK96Y5pPmKiS@ah?%;@EaNmi*^<1_d1KMkz!3kw zm}Hlq`QYnnCIOh2>*?*$&1@x0mk2!Vs7~))O265?0000b;z6o!At2)eQ$h7O#es_0hQ%W#a|0SN|29Hw;ZKo8Lck%dHrI98tXcc>C20jjpY zWZA#%_xbr*RwSX60)SfpBLF@8tO&p-$r1oSvRb&y^E@ev!ixwmwLH(cTrL*?CIAAG zEx@!W3ZJGaPp4Dek|g2baNvHwr-*R3+i|s8)sSXtQxT!Hmd-g^YiX_J@pxn$$Bd$g zBEl@on5HR>F$(|_)d9SF@9T-OEI|??0_Plt!(po!y@nGaQni-6|l$~S?nqF>9P>$}hz5UTLCd%~RaR=~9kGGrhBe}%^} zwr|_DYW&7~=iEkXeRJ(<4VB*eY%mziROdU7e-T_s07PHDjUzh$F#5Bw$)gMWl@BNdMN@4l2_T^0|q3AGjDzvMG{IW0Qd%A z3LwDSNCEsISpxt_HXpOHEKgNcc@g1|lx4}~a=8F-3qX_X5r539s`7cB^K!Ygayp%O zJRW&C94I2(?RH$PRxL?4wYiAUT1)2~t+lk)@_ars%QB{EN)cgE6wLFSNs=r8+^Q>r z7w>(msOuUeAtG?jAq>M_GlC%a@v323>!zvDTElw}V+=;45wa{pUDps1OsCU-B-aFu zb8|Pw^xh3&tA9h1JOOwF@PJR?K8mo}Zl876nQ@GvvjO9{)ou2BAPi^0MT@>NhcKfV4+xXo%w=u@t uT$eV0+IwG&$K!i-wa(E8oEr#$^e>*__CVN|)a?KO00{s|MNUMnLSTZ%tGb~8 delta 657 zcmV;C0&e}E1D*wt8Gi!+001a04^sdD0d!DIR7G!iDl|D*dGi?quZ4NtV9y4$aI&U61a2`8xB06^&Ja->HdmcJ{ zCqI25LVzVkge*seEkcPkM~FL3j5c6?Tu+WUNRmHOlR#3JNPks;$XJ+1S%Jn_g2h^z zNnV&$U4+D5gv3~$QelY0Vu{0BqF7&{Q)P<6VW3!HqEu&#!D)=aaGPyxj=*k?zh$Re zWT;?rkiT+~zh|mnc9Xqntzv4dWpt%*dX>9-mArnJx^1v$f||UAoxX>ug@~ZQi=x7e zqQa4<#+EGMu``qaJ-s$_`>ip&G<>Bo7KO z{OIug>hb;S^8M}e{qOYs@b>=l_x|+w{`L9(_xk?%`+xuc|Nk{f8XM}Ol>h($0d!JM zQvg8b*k%9#0N6=HK~xwS1;IT^0|5|*;dfyW(y1shY$FnjEmLgc0a6KeHo1u>@CF{h zW2Cl{7)W6>icKOaB4Yd@Y-Z;3c?w{V>7E(E5Dd`1BuSH+A=Yo2>A3O87(mU?I067J z1k@O_mw&g@`G{_aYrt0BV&n3#^}dy=B+cw^^QZlJ`+HJ`Bqg@w`>|s2&`QneC~ZBx z@~8gtzD$)VxiwV<Y28}5}?l^snA;P^mNN=j*DKuQY$ r*j5;jQb$rs(%Jysu}%;7h~OWxc$Em?C9a(S015yANkvXXu0mjf5`R*P diff --git a/sources/lib/images/fileicons/xlsx.png b/sources/lib/images/fileicons/xlsx.png index 24911b802d8f52f966552d450f177d62bec5f940..89c84c52287893179a26518f2697563ca9b6fa6a 100644 GIT binary patch delta 410 zcmV;L0cHN41*rp&8Gi-<001BJ|6u?C0dPq~K~y-)ol`q*<1i3?Bn5ksPK}`=Mb2OZ z*)E?8`g%I~GO3JkKd2tg4D-Su)GAdjMyu zNATjkKOD4e3z85KIOh<@@zF4%DEj+uU|Q=iRA{Z?y@xRdqtOUOQJ`&GhzKT=$s0+Z zAOwfKG3H1Qgnx%KWZ4~n8vxh%0j`n+Ps`aQfj=|Q~gRkyp>6bo4()ZN>9zQC*+y7u2RrT-Jw{V#xcwR0a zROdIIJLjH^F@O4Rd;qQYz8a6mSE~1&lWznE2!Q+*ViUjr);%MBr~m)}07*qoM6N<$ Eg7JX4k^lez delta 657 zcmV;C0&e}O1D*wt8Gi!+001a04^sdD0d!DIR7G!iDl|D*dGi?quZ4NtV9y4$aI&U61a2`8xB06^&Ja->HdmcJ{ zCqI25LVzVkge*seEkcPkM~FL3j5c6?Tu+WUNRmHOlR#3JNPks;$XJ+1S%Jn_g2h^z zNnV&$U4+D5gv3~$QelY0Vu{0BqF7&{Q)P<6VW3!HqEu&#!D)=aaGPyxj=*k?zh$Re zWT;?rkiT+~zh|mnc9Xqntzv4dWpt%*dX>9-mArnJx^1v$f||UAoxX>ug@~ZQi=x7e zqQa4<#+EGMu``qaJ-s$_`>ip&G<>Bo7KO z{OIug>hb;S^8M}e{qOYs@b>=l_x|+w{`L9(_xk?%`+xuc|Nk{f8XM}Ol>h($0d!JM zQvg8b*k%9#0N6=HK~xwS1;IT^0|5|*;dfyW(y1shY$FnjEmLgc0a6KeHo1u>@CF{h zW2Cl{7)W6>icKOaB4Yd@Y-Z;3c?w{V>7E(E5Dd`1BuSH+A=Yo2>A3O87(mU?I067J z1k@O_mw&g@`G{_aYrt0BV&n3#^}dy=B+cw^^QZlJ`+HJ`Bqg@w`>|s2&`QneC~ZBx z@~8gtzD$)VxiwV<Y28}5}?l^snA;P^mNN=j*DKuQY$ r*j5;jQb$rs(%Jysu}%;7h~OWxc$Em?C9a(S015yANkvXXu0mjfEGbfy diff --git a/sources/lib/images/fileicons/xml.png b/sources/lib/images/fileicons/xml.png index ae9831b34f7d9d18325cf787e68e240f53ae1ce0..4480a63854677d93de8205f305b1d96a26519e92 100644 GIT binary patch delta 384 zcmV-`0e}9P1CRrd8Gi-<001BJ|6u?C0ar;xK~y-)om0V1!axvxyGy`$>xFRez&8+s zH_)HqGyDe=IAHh~%guv+gcqb2N+{iKI@{+#+LWp&zGO19vpa7lGdqeTlu`h21)vL{ zh0}-typb#b03^$cL6&9PJkPy|@H@$}jMM4#0YD#sCV50K%zyLTCrQHneqYIUyX9uH z;d;HMh;X%9aWGNfOTI^9KNZ)gXBG z-dB#IC_oY-0_PlpAUJA9tJS*s(lD)c*;Ht);k}132JLnmaU7#43Wx~0-R>tzlb{SP zZDY*Qxg@N7b9vw%z#V{FoPpkWjF&K6=rVY6m_}VUeRcai3=seWeJb;#QkamHZsPJl z@a6G2(Dl-O%Jdt-6V61LBn4joKZVf000002R7C&~u33S`Sc1h}gv4Hi#9@fTVu{0L zio$1$!D)=a|7HMej=*k?zjBbja*@Awlf8PCyL*+qewVs}n!JUbzKEc}i=x7eqQZ}* z#F3}QlBmX&tH_tE$&jwrnXSs5vCX5l(W$%CufW)|!`jl~`hV2p`qt$7*X8@!=KI^{ z``qaJ-s$_`>ipsC{NwHX+=2W^ZoDi{qXkw^7sDq`2O|z{`dO+ z`TPI>|Nm8h$me|A{{R300d!JMQvg8b*k%9#0F6mRK~xyiUCbd5!Y~+w;df095JF%H z0u}_g$H=OqRB?3iyRI!#vKvFvakAO?hDpo3^*v`eP oipBS1Gl|jwt>g0I?z-{;EfH;;i9W{k00000NkvXXt^-0~f;~IlHvj+t diff --git a/sources/lib/images/fileicons/zip.png b/sources/lib/images/fileicons/zip.png index fb8850c9ab88cd0e88f9d759f3463dd86b65a25a..4a36a35ff7af6167a697ada2c5a4e77cdab5da6d 100644 GIT binary patch delta 403 zcmV;E0c`%D2BHIy8Gi-<001BJ|6u?C0clA@K~y-)os+Rn!!Qtrf7?}yVCqtJU|@h3 zs1R%vUZ#Bu-T|o{Qt>d94J3F0HkQ&XP1Q7xm2-Xulqd};0)FWv-`V%w`7A4vP)Y&7 zF@PR`7JgO;;GJX+03cax4AL}RXIbV&giV&FDJPT39e@)6nt$XD;3CU1AICAb+ihv< z^_r{Iip%AaBErRD!Rd5bLaMD@hzPBBVVi<-L5hh8(IF1v1E2O@00Kn@ z5e5JlKm;Be1S~WFHWv>rI}9#G4lg|nFGT<}O#m}h05)haEgc{=GABAl06>#rD*z5h zV*pKrEJH~lK#kb|09r=?jxGQUUUC3!UHQvh9r#9oBNVTi+GiNj@z!e@)Y zX^g>aj=*k?zyDr0a*)4rk-z_9PIi;MdX>9-mArnJx`LX#|7vlCoxX^mz>A{7jH1Gi zrNoh^#`v57n189xm#oR1vCXHj%m1qYqqfoet~aT>)c>qTuD;j*y#TMk*tx&jv%}i| zsIj`!;M>i^?8VOU$*}+0Jpay!|HZ}s^%d0Q`qt$7|KF+B<@(m;``6|B*yZ}z=KI;^ z``PFF+UNS(=lk2|``qaJ-01w=>HFO2{N3sM-Rb<^>3{p)>igd6{NL*P-|GC|>-^yB z`{3*R;p_b1?EK;E`{C^T;_dw7?fm2J{NwKZHM{r~iu=I{LG@BQfT{r~ut z>GA#R^8M`d{q6Jp?ezZc^!@Mj{qObu@b&)i_Wkkp{qpzy^7sDp_x|+w{{R2o|Ns90 z008;cqJLZf0004WQchC|fG+0blaWD*m$)KRYC~JN&WH|Re&;7sMuFHV3l83vTE*PK= zp^58~E(Qoq1(b9R=?&bQ*XtbY_ zXSo5Nr5^jol_yOY5Z=COom@PJyJUdY-VcAD;U3ul-6OfCoPWTznhAF| S6b%Xh00002)u*< diff --git a/sources/lib/images/interwiki/user.png b/sources/lib/images/interwiki/user.png new file mode 100644 index 0000000000000000000000000000000000000000..79f35ccbdad44489dbf07d1bf688c411aa3b612c GIT binary patch literal 741 zcmVz1iyEv%?$mbQ(# zwJpuiQJP8?X_`#S8b+U_G6=ziYB!xPAcq{)ZJ0bECH@ zYx#`n8^Wzn^J!4>=q^bltNO15ry?0ecSLkjpT@vlid!jk)Fjf7&)q_V5zGs#3N%6* zbW~7Hg=&P0&~Y(|g>$hC9FL?;ttzPDZbpZu9OLb33^e2;FNTGJxScp1&q4M+y2ntQ z?C(=hpU$3~`Thx0eHwi0x`q+!d5k@|0_WHe%sG3e-s^MM`xM-ig!VcIA7H}X1ot~L zg=MLB4w-Q;Bi!!u2|I+Qb;0{{4Q53YX6+4_aXena{nmt*!YG7ua~`qc>o=?@U?rOU znS7%>klzi*muXnbM6i@4FR@s^8vTjDgy&%J?w?`u>NYMDFa_2%0SQ(qJE<3=<8Bzo zfdU60e*y(^$RF%r$kl)p7=7tlCDa$+J7w>}DU(O#~fk>pYuRvHi1E9^msg{tLeV XM&GIRvfA7%00000NkvXXu0mjf&%8>| literal 0 HcmV?d00001 diff --git a/sources/lib/plugins/acl/admin.php b/sources/lib/plugins/acl/admin.php index 6c7c28f..de38aed 100644 --- a/sources/lib/plugins/acl/admin.php +++ b/sources/lib/plugins/acl/admin.php @@ -268,7 +268,10 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin { usort($data,array($this,'_tree_sort')); $count = count($data); if($count>0) for($i=1; $i<$count; $i++){ - if($data[$i-1]['id'] == $data[$i]['id'] && $data[$i-1]['type'] == $data[$i]['type']) unset($data[$i]); + if($data[$i-1]['id'] == $data[$i]['id'] && $data[$i-1]['type'] == $data[$i]['type']) { + unset($data[$i]); + $i++; // duplicate found, next $i can't be a duplicate, so skip forward one + } } return $data; } @@ -488,7 +491,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin { function _html_list_acl($item){ $ret = ''; // what to display - if($item['label']){ + if(!empty($item['label'])){ $base = $item['label']; }else{ $base = ':'.$item['id']; @@ -496,8 +499,11 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin { } // highlight? - if( ($item['type']== $this->current_item['type'] && $item['id'] == $this->current_item['id'])) + if( ($item['type']== $this->current_item['type'] && $item['id'] == $this->current_item['id'])) { $cl = ' cur'; + } else { + $cl = ''; + } // namespace or page? if($item['type']=='d'){ diff --git a/sources/lib/plugins/acl/lang/bg/lang.php b/sources/lib/plugins/acl/lang/bg/lang.php index 9520175..14e7d31 100644 --- a/sources/lib/plugins/acl/lang/bg/lang.php +++ b/sources/lib/plugins/acl/lang/bg/lang.php @@ -1,8 +1,8 @@ * @author Viktor Usunov * @author Kiril diff --git a/sources/lib/plugins/acl/lang/et/help.txt b/sources/lib/plugins/acl/lang/et/help.txt new file mode 100644 index 0000000..a2c8e9e --- /dev/null +++ b/sources/lib/plugins/acl/lang/et/help.txt @@ -0,0 +1,9 @@ +=== Kiir-spikker: === + +Käesoleval leheküljel saad oma wiki nimeruumidele ja lehekülgedele lisada ning eemaldada õigusi. + * Vasemas paanis on näidatud kõik saada olevad nimeruumid ja leheküljed. + * Ülal olev vorm laseb sul vaadelda ja muuta valitud rühma või kasutaja õigusi. + * Allolevas tabelis näidatakse kõiki hetkel sättestatud reegleid ligipääsudele. +Saad seda kasutada reeglite hulgi muutmiseks või kustutamiseks + +Mõistmaks paremini DokuWiki ligipääsu halduse toimimist, võiks abiks olla [[doku>acl|ACL-i ametliku dokumentatsiooniga]] tutvumine. \ No newline at end of file diff --git a/sources/lib/plugins/acl/lang/et/lang.php b/sources/lib/plugins/acl/lang/et/lang.php index bc4c73a..b591456 100644 --- a/sources/lib/plugins/acl/lang/et/lang.php +++ b/sources/lib/plugins/acl/lang/et/lang.php @@ -1,21 +1,30 @@ * @author Aari Juhanson * @author Kaiko Kaur * @author kristian.kankainen@kuu.la * @author Rivo Zängov + * @author Janar Leas */ $lang['admin_acl'] = 'Ligipääsukontrolli nimekirja haldamine'; -$lang['acl_group'] = 'Grupp'; +$lang['acl_group'] = 'Rühm'; $lang['acl_user'] = 'Kasutaja'; $lang['acl_perms'] = 'Lubatud'; $lang['page'] = 'leht'; -$lang['namespace'] = 'alajaotus'; +$lang['namespace'] = 'Nimeruum'; $lang['btn_select'] = 'Vali'; +$lang['p_user_ns'] = 'Kasutaja %s omab nimeruumis %s: %s järgmisi õigusi.'; +$lang['p_group_ns'] = 'Rühma %s liikmed omavad nimeruumis %s: %s järgmisi õigusi.'; +$lang['p_choose_id'] = 'Sisesta ülal-olevasse vormi kasutaja või rühm nägemaks leheküljele %s sätestatud volitusi.'; +$lang['p_choose_ns'] = 'Sisesta ülal-olevasse vormi kasutaja või rühm nägemaks nimeruumile %s sätestatud volitusi.'; +$lang['p_inherited'] = 'Teadmiseks: Neid õigusi pole eralti määratletud, vaid on päritud teistest rühmadest või ülemast nimeruumist.'; +$lang['p_isadmin'] = 'Teadmiseks: Valitud rühm või kasutaja omab alati kõiki õigusi, kuna nii on sätestanud ülemkasutaja.'; +$lang['p_include'] = 'Kõrgemad õigused hõlmavad alamaid. Õigus loomine, üleslaadida ja kustutada rakenduvad nimeruumidele, mitte lehekülgedele.'; +$lang['where'] = 'Lehekülg/nimeruum'; $lang['who'] = 'Kasutaja/Grupp'; $lang['perm'] = 'Õigused'; $lang['acl_perm0'] = 'Pole'; diff --git a/sources/lib/plugins/acl/lang/hi/lang.php b/sources/lib/plugins/acl/lang/hi/lang.php deleted file mode 100644 index d6f78ff..0000000 --- a/sources/lib/plugins/acl/lang/hi/lang.php +++ /dev/null @@ -1,7 +0,0 @@ - - * @author yndesai@gmail.com - */ diff --git a/sources/lib/plugins/acl/lang/id-ni/lang.php b/sources/lib/plugins/acl/lang/id-ni/lang.php deleted file mode 100644 index d367340..0000000 --- a/sources/lib/plugins/acl/lang/id-ni/lang.php +++ /dev/null @@ -1,7 +0,0 @@ - - * @author Yustinus Waruwu - */ diff --git a/sources/lib/plugins/acl/lang/ko/help.txt b/sources/lib/plugins/acl/lang/ko/help.txt index 9baeedb..80069b3 100644 --- a/sources/lib/plugins/acl/lang/ko/help.txt +++ b/sources/lib/plugins/acl/lang/ko/help.txt @@ -1,8 +1,8 @@ === 빠른 도움말: === 현재 문서에서 위키 이름공간과 문서에 대한 접근 권한을 추가하거나 삭제할 수 있습니다. -* 왼쪽 영역에는 선택 가능한 이름공간과 문서 목록을 보여줍니다. -* 위쪽 입력 양식에서 선택된 사용자와 그룹의 접근 권한을 보거나 바꿀 수 있습니다. -* 아래 테이블에서 현재 설정된 모든 접근 제어 규칙을 볼 수 있으며, 즉시 여러 규칙을 삭제하거나 바꿀 수 있습니다. + * 왼쪽 영역에는 선택 가능한 이름공간과 문서 목록을 보여줍니다. + * 위쪽 입력 양식에서 선택된 사용자와 그룹의 접근 권한을 보거나 바꿀 수 있습니다. + * 아래 테이블에서 현재 설정된 모든 접근 제어 규칙을 볼 수 있으며, 즉시 여러 규칙을 삭제하거나 바꿀 수 있습니다. 도쿠위키에서 접근 제어가 어떻게 동작되는지 알아보려면 [[doku>ko:acl|ACL 공식 문서]]를 읽어보시기 바랍니다. \ No newline at end of file diff --git a/sources/lib/plugins/acl/lang/ko/lang.php b/sources/lib/plugins/acl/lang/ko/lang.php index 34b93a9..e06eb66 100644 --- a/sources/lib/plugins/acl/lang/ko/lang.php +++ b/sources/lib/plugins/acl/lang/ko/lang.php @@ -33,7 +33,7 @@ $lang['p_include'] = '더 높은 접근 권한은 하위를 포함 $lang['current'] = '현재 ACL 규칙'; $lang['where'] = '문서/이름공간'; $lang['who'] = '사용자/그룹'; -$lang['perm'] = '접근 권한'; +$lang['perm'] = '권한'; $lang['acl_perm0'] = '없음'; $lang['acl_perm1'] = '읽기'; $lang['acl_perm2'] = '편집'; diff --git a/sources/lib/plugins/acl/lang/lb/lang.php b/sources/lib/plugins/acl/lang/lb/lang.php deleted file mode 100644 index 59acdf7..0000000 --- a/sources/lib/plugins/acl/lang/lb/lang.php +++ /dev/null @@ -1,6 +0,0 @@ -acl|официальной документации по ACL]] может помочь вам в полном понимании работы управления правами доступа в «ДокуВики». +Прочтение [[doku>acl|официальной документации по правам доступа]] может помочь вам в полном понимании работы управления правами доступа в «Докувики». diff --git a/sources/lib/plugins/acl/lang/vi/lang.php b/sources/lib/plugins/acl/lang/vi/lang.php index ddf764d..4fc3388 100644 --- a/sources/lib/plugins/acl/lang/vi/lang.php +++ b/sources/lib/plugins/acl/lang/vi/lang.php @@ -1,44 +1,35 @@ + * + * @author NukeViet */ - -$lang['admin_acl'] = 'Quản lý danh sách quyền truy cập'; -$lang['acl_group'] = 'Nhóm'; -$lang['acl_user'] = 'Thành viên'; -$lang['acl_perms'] = 'Cấp phép cho'; -$lang['page'] = 'Trang'; -$lang['namespace'] = 'Thư mục'; - -$lang['btn_select'] = 'Chọn'; - -$lang['p_user_id'] = 'Thành viên %s hiện tại được cấp phép cho trang %s: %s.'; -$lang['p_user_ns'] = 'Thành viên %s hiện tại được cấp phép cho thư mục %s: %s.'; -$lang['p_group_id'] = 'Thành viên trong nhóm %s hiện tại được cấp phép cho trang %s: %s.'; -$lang['p_group_ns'] = 'Thành viên trong nhóm %s hiện tại được cấp phép cho thư mục %s: %s.'; - -$lang['p_choose_id'] = 'Hãy nhập tên thành viên hoặc nhóm vào ô trên đây để xem hoặc sửa quyền đã thiết đặt cho trang %s.'; -$lang['p_choose_ns'] = 'Hãy nhập tên thành viên hoặc nhóm vào ô trên đây để xem hoặc sửa quyền đã thiết đặt cho thư mục %s.'; - - -$lang['p_inherited'] = 'Ghi chú: Có những quyền không được thể hiện ở đây nhưng nó được cấp phép từ những nhóm hoặc thư mục cấp cao.'; -$lang['p_isadmin'] = 'Ghi chú: Nhóm hoặc thành viên này luôn được cấp đủ quyền vì họ là Quản trị tối cao'; -$lang['p_include'] = 'Một số quyền thấp được thể hiện ở mức cao hơn. Quyền tạo, tải lên và xóa chỉ dành cho thư mục, không dành cho trang.'; - -$lang['current'] = 'Danh sách quyền truy cập hiện tại'; -$lang['where'] = 'Trang/Thư mục'; -$lang['who'] = 'Thành viên/Nhóm'; -$lang['perm'] = 'Quyền'; - -$lang['acl_perm0'] = 'Không'; -$lang['acl_perm1'] = 'Đọc'; -$lang['acl_perm2'] = 'Sửa'; -$lang['acl_perm4'] = 'Tạo'; -$lang['acl_perm8'] = 'Tải lên'; -$lang['acl_perm16'] = 'Xóa'; -$lang['acl_new'] = 'Thêm mục mới'; -$lang['acl_mod'] = 'Sửa'; -//Setup VIM: ex: et ts=2 : +$lang['admin_acl'] = 'Quản lý danh sách quyền truy cập'; +$lang['acl_group'] = 'Nhóm'; +$lang['acl_user'] = 'Thành viên'; +$lang['acl_perms'] = 'Cấp phép cho'; +$lang['page'] = 'Trang'; +$lang['namespace'] = 'Thư mục'; +$lang['btn_select'] = 'Chọn'; +$lang['p_user_id'] = 'Thành viên %s hiện tại được cấp phép cho trang %s: %s.'; +$lang['p_user_ns'] = 'Thành viên %s hiện tại được cấp phép cho thư mục %s: %s.'; +$lang['p_group_id'] = 'Thành viên trong nhóm %s hiện tại được cấp phép cho trang %s: %s.'; +$lang['p_group_ns'] = 'Thành viên trong nhóm %s hiện tại được cấp phép cho thư mục %s: %s.'; +$lang['p_choose_id'] = 'Hãy nhập tên thành viên hoặc nhóm vào ô trên đây để xem hoặc sửa quyền đã thiết đặt cho trang %s.'; +$lang['p_choose_ns'] = 'Hãy nhập tên thành viên hoặc nhóm vào ô trên đây để xem hoặc sửa quyền đã thiết đặt cho thư mục %s.'; +$lang['p_inherited'] = 'Ghi chú: Có những quyền không được thể hiện ở đây nhưng nó được cấp phép từ những nhóm hoặc thư mục cấp cao.'; +$lang['p_isadmin'] = 'Ghi chú: Nhóm hoặc thành viên này luôn được cấp đủ quyền vì họ là Quản trị tối cao'; +$lang['p_include'] = 'Một số quyền thấp được thể hiện ở mức cao hơn. Quyền tạo, tải lên và xóa chỉ dành cho thư mục, không dành cho trang.'; +$lang['current'] = 'Danh sách quyền truy cập hiện tại'; +$lang['where'] = 'Trang/Thư mục'; +$lang['who'] = 'Thành viên/Nhóm'; +$lang['perm'] = 'Quyền'; +$lang['acl_perm0'] = 'Không'; +$lang['acl_perm1'] = 'Đọc'; +$lang['acl_perm2'] = 'Sửa'; +$lang['acl_perm4'] = 'Tạo'; +$lang['acl_perm8'] = 'Tải lên'; +$lang['acl_perm16'] = 'Xóa'; +$lang['acl_new'] = 'Thêm mục mới'; +$lang['acl_mod'] = 'Sửa'; diff --git a/sources/lib/plugins/auth.php b/sources/lib/plugins/auth.php index dc66d63..b047356 100644 --- a/sources/lib/plugins/auth.php +++ b/sources/lib/plugins/auth.php @@ -316,11 +316,11 @@ class DokuWiki_Auth_Plugin extends DokuWiki_Plugin { * * @author Chris Smith * @param int $start index of first user to be returned - * @param int $limit max number of users to be returned + * @param int $limit max number of users to be returned, 0 for unlimited * @param array $filter array of field/pattern pairs, null for no filter * @return array list of userinfo (refer getUserData for internal userinfo details) */ - public function retrieveUsers($start = 0, $limit = -1, $filter = null) { + public function retrieveUsers($start = 0, $limit = 0, $filter = null) { msg("authorisation method does not support mass retrieval of user data", -1); return array(); } diff --git a/sources/lib/plugins/authad/action.php b/sources/lib/plugins/authad/action.php new file mode 100644 index 0000000..97be989 --- /dev/null +++ b/sources/lib/plugins/authad/action.php @@ -0,0 +1,91 @@ + + */ + +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); + +/** + * Class action_plugin_addomain + */ +class action_plugin_authad extends DokuWiki_Action_Plugin { + + /** + * Registers a callback function for a given event + */ + public function register(Doku_Event_Handler &$controller) { + + $controller->register_hook('AUTH_LOGIN_CHECK', 'BEFORE', $this, 'handle_auth_login_check'); + $controller->register_hook('HTML_LOGINFORM_OUTPUT', 'BEFORE', $this, 'handle_html_loginform_output'); + + } + + /** + * Adds the selected domain as user postfix when attempting a login + * + * @param Doku_Event $event + * @param array $param + */ + public function handle_auth_login_check(Doku_Event &$event, $param) { + global $INPUT; + + /** @var auth_plugin_authad $auth */ + global $auth; + if(!is_a($auth, 'auth_plugin_authad')) return; // AD not even used + + if($INPUT->str('dom')) { + $usr = $auth->cleanUser($event->data['user']); + $dom = $auth->_userDomain($usr); + if(!$dom) { + $usr = "$usr@".$INPUT->str('dom'); + } + $INPUT->post->set('u', $usr); + $event->data['user'] = $usr; + } + } + + /** + * Shows a domain selection in the login form when more than one domain is configured + * + * @param Doku_Event $event + * @param array $param + */ + public function handle_html_loginform_output(Doku_Event &$event, $param) { + global $INPUT; + /** @var auth_plugin_authad $auth */ + global $auth; + if(!is_a($auth, 'auth_plugin_authad')) return; // AD not even used + $domains = $auth->_getConfiguredDomains(); + if(count($domains) <= 1) return; // no choice at all + + /** @var Doku_Form $form */ + $form =& $event->data; + + // any default? + $dom = ''; + if($INPUT->has('u')) { + $usr = $auth->cleanUser($INPUT->str('u')); + $dom = $auth->_userDomain($usr); + + // update user field value + if($dom) { + $usr = $auth->_userName($usr); + $pos = $form->findElementByAttribute('name', 'u'); + $ele =& $form->getElementAt($pos); + $ele['value'] = $usr; + } + } + + // add select box + $element = form_makeListboxField('dom', $domains, $dom, $this->getLang('domain'), '', 'block'); + $pos = $form->findElementByAttribute('name', 'p'); + $form->insertElement($pos + 1, $element); + } + +} + +// vim:ts=4:sw=4:et: \ No newline at end of file diff --git a/sources/lib/plugins/authad/auth.php b/sources/lib/plugins/authad/auth.php index e1d758f..0860e57 100644 --- a/sources/lib/plugins/authad/auth.php +++ b/sources/lib/plugins/authad/auth.php @@ -332,11 +332,11 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin { * @param array $filter array of field/pattern pairs, null for no filter * @return array userinfo (refer getUserData for internal userinfo details) */ - public function retrieveUsers($start = 0, $limit = -1, $filter = array()) { + public function retrieveUsers($start = 0, $limit = 0, $filter = array()) { $adldap = $this->_adldap(null); if(!$adldap) return false; - if($this->users === null) { + if(!$this->users) { //get info for given user $result = $adldap->user()->all(); if (!$result) return array(); @@ -357,7 +357,7 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin { } if($this->_filter($user, $info)) { $result[$user] = $info; - if(($limit >= 0) && (++$count >= $limit)) break; + if(($limit > 0) && (++$count >= $limit)) break; } } return $result; @@ -511,6 +511,31 @@ class auth_plugin_authad extends DokuWiki_Auth_Plugin { return $opts; } + /** + * Returns a list of configured domains + * + * The default domain has an empty string as key + * + * @return array associative array(key => domain) + */ + public function _getConfiguredDomains() { + $domains = array(); + if(empty($this->conf['account_suffix'])) return $domains; // not configured yet + + // add default domain, using the name from account suffix + $domains[''] = ltrim($this->conf['account_suffix'], '@'); + + // find additional domains + foreach($this->conf as $key => $val) { + if(is_array($val) && isset($val['account_suffix'])) { + $domains[$key] = ltrim($val['account_suffix'], '@'); + } + } + ksort($domains); + + return $domains; + } + /** * Check provided user and userinfo for matching patterns * diff --git a/sources/lib/plugins/authad/lang/ar/settings.php b/sources/lib/plugins/authad/lang/ar/settings.php new file mode 100644 index 0000000..d2a2e2a --- /dev/null +++ b/sources/lib/plugins/authad/lang/ar/settings.php @@ -0,0 +1,12 @@ + + */ +$lang['account_suffix'] = 'لاحقة الحساب الخاص بك. على سبيل المثال. @my.domain.org'; +$lang['domain_controllers'] = 'قائمة مفصولة بفواصل من وحدات التحكم بالمجال. على سبيل المثال. srv1.domain.org,srv2.domain.org'; +$lang['admin_password'] = 'كلمة المرور للمستخدم أعلاه.'; +$lang['real_primarygroup'] = 'ينبغي أن تحل المجموعة الأساسية الحقيقية بدلاً من افتراض "Domain Users" (أبطأ).'; +$lang['expirywarn'] = 'عدد الأيام المقدمة لتحذير المستخدم حول كلمة مرور منتهية الصلاحية. (0) للتعطيل.'; diff --git a/sources/lib/plugins/authad/lang/bg/settings.php b/sources/lib/plugins/authad/lang/bg/settings.php index 877810c..bf7a2d8 100644 --- a/sources/lib/plugins/authad/lang/bg/settings.php +++ b/sources/lib/plugins/authad/lang/bg/settings.php @@ -1,18 +1,19 @@ */ -$lang['account_suffix'] = 'Наставка на акаунта Ви. Например @някакъв.домейн.org'; -$lang['base_dn'] = 'Вашият основен DN. Например DC=моят,DC=домейн,DC=org'; -$lang['domain_controllers'] = 'Domain controller списък, разделете сървърите със запетая. Например сървър1.домейн.org,сървър2.домейн.org'; -$lang['admin_username'] = 'Привилегирован Active Directory потребител с достъп до данните на останалите потребители. Не е задължително, но е необходимо за някои функционалности като изпращането на имейл за абонаменти.'; -$lang['admin_password'] = 'Паролата на горния потребител.'; -$lang['sso'] = 'Да се ползва ли еднократно вписване чрез Kerberos или NTLM?'; -$lang['real_primarygroup'] = 'Да се извлича ли истинската група вместо да се предполага "Domain Users" (по-бавно)'; -$lang['use_ssl'] = 'Ползване на SSL свързаност? Не отбелязвайте TLS (по-долу) ако включите опцията.'; -$lang['use_tls'] = 'Ползване на TLS свързаност? Не отбелязвайте SSL (по-горе) ако включите опцията.'; -$lang['debug'] = 'Показване на допълнителна debug информация при грешка?'; -$lang['expirywarn'] = 'Предупреждаване на потребителите Х дни преди изтичане валидността на паролата им. Въведете 0 за изключване.'; -$lang['additional'] = 'Списък с допълнителни AD атрибути за извличане от потребителските данни (разделяйте ги със запетая). Ползва се от няколко приставки.'; \ No newline at end of file +$lang['account_suffix'] = 'Наставка на акаунта Ви. Например @някакъв.домейн.org'; +$lang['base_dn'] = 'Вашият основен DN. Например DC=моят,DC=домейн,DC=org'; +$lang['domain_controllers'] = 'Domain controller списък, разделете сървърите със запетая. Например сървър1.домейн.org,сървър2.домейн.org'; +$lang['admin_username'] = 'Привилегирован Active Directory потребител с достъп до данните на останалите потребители. Не е задължително, но е необходимо за някои функционалности като изпращането на имейл за абонаменти.'; +$lang['admin_password'] = 'Паролата на горния потребител.'; +$lang['sso'] = 'Да се ползва ли еднократно вписване чрез Kerberos или NTLM?'; +$lang['real_primarygroup'] = 'Да се извлича ли истинската група вместо да се предполага "Domain Users" (по-бавно)'; +$lang['use_ssl'] = 'Ползване на SSL свързаност? Не отбелязвайте TLS (по-долу) ако включите опцията.'; +$lang['use_tls'] = 'Ползване на TLS свързаност? Не отбелязвайте SSL (по-горе) ако включите опцията.'; +$lang['debug'] = 'Показване на допълнителна debug информация при грешка?'; +$lang['expirywarn'] = 'Предупреждаване на потребителите Х дни преди изтичане валидността на паролата им. Въведете 0 за изключване.'; +$lang['additional'] = 'Списък с допълнителни AD атрибути за извличане от потребителските данни (разделяйте ги със запетая). Ползва се от няколко приставки.'; diff --git a/sources/lib/plugins/authad/lang/de/lang.php b/sources/lib/plugins/authad/lang/de/lang.php new file mode 100644 index 0000000..eea511d --- /dev/null +++ b/sources/lib/plugins/authad/lang/de/lang.php @@ -0,0 +1,8 @@ + + */ +$lang['domain'] = 'Anmelde-Domäne'; diff --git a/sources/lib/plugins/authad/lang/en/lang.php b/sources/lib/plugins/authad/lang/en/lang.php new file mode 100644 index 0000000..e2967d6 --- /dev/null +++ b/sources/lib/plugins/authad/lang/en/lang.php @@ -0,0 +1,10 @@ + + */ + +$lang['domain'] = 'Logon Domain'; + +//Setup VIM: ex: et ts=4 : diff --git a/sources/lib/plugins/authad/lang/eo/lang.php b/sources/lib/plugins/authad/lang/eo/lang.php new file mode 100644 index 0000000..be4abc1 --- /dev/null +++ b/sources/lib/plugins/authad/lang/eo/lang.php @@ -0,0 +1,8 @@ + + */ +$lang['domain'] = 'Ensaluta domajno'; diff --git a/sources/lib/plugins/authad/lang/es/lang.php b/sources/lib/plugins/authad/lang/es/lang.php new file mode 100644 index 0000000..c5b242c --- /dev/null +++ b/sources/lib/plugins/authad/lang/es/lang.php @@ -0,0 +1,8 @@ + + */ +$lang['domain'] = 'Dominio de inicio'; diff --git a/sources/lib/plugins/authad/lang/es/settings.php b/sources/lib/plugins/authad/lang/es/settings.php index 98b7805..970259c 100644 --- a/sources/lib/plugins/authad/lang/es/settings.php +++ b/sources/lib/plugins/authad/lang/es/settings.php @@ -5,11 +5,19 @@ * * @author monica * @author Antonio Bueno + * @author Juan De La Cruz + * @author Eloy */ -$lang['account_suffix'] = 'Su cuenta, sufijo. Ejem. @ my.domain.org '; +$lang['account_suffix'] = 'Su cuenta, sufijo. Ejem. @ my.domain.org '; $lang['base_dn'] = 'Su base DN. Ejem. DC=my,DC=dominio,DC=org'; $lang['domain_controllers'] = 'Una lista separada por coma de los controladores de dominios. Ejem. srv1.dominio.org,srv2.dominio.org'; $lang['admin_username'] = 'Un usuario con privilegios de Active Directory con acceso a los datos de cualquier otro usuario. Opcional, pero es necesario para determinadas acciones como el envío de suscripciones de correos electrónicos.'; $lang['admin_password'] = 'La contraseña del usuario anterior.'; $lang['sso'] = 'En caso de inicio de sesión usará ¿Kerberos o NTLM?'; $lang['sso_charset'] = 'La codificación con que tu servidor web pasará el nombre de usuario Kerberos o NTLM. Si es UTF-8 o latin-1 dejar en blanco. Requiere la extensión iconv.'; +$lang['real_primarygroup'] = 'Resolver el grupo primario real en vez de asumir "Domain Users" (más lento)'; +$lang['use_ssl'] = '¿Usar conexión SSL? Si se usa, no habilitar TLS abajo.'; +$lang['use_tls'] = '¿Usar conexión TLS? Si se usa, no habilitar SSL arriba.'; +$lang['debug'] = 'Mostrar información adicional de depuración sobre los errores?'; +$lang['expirywarn'] = 'Días por adelantado para avisar al usuario de que contraseña expirará. 0 para deshabilitar.'; +$lang['additional'] = 'Una lista separada por comas de atributos AD adicionales a obtener de los datos de usuario. Usado por algunos plugins.'; diff --git a/sources/lib/plugins/authad/lang/fr/lang.php b/sources/lib/plugins/authad/lang/fr/lang.php new file mode 100644 index 0000000..2de362e --- /dev/null +++ b/sources/lib/plugins/authad/lang/fr/lang.php @@ -0,0 +1,8 @@ + + */ +$lang['domain'] = 'Domaine de connexion'; diff --git a/sources/lib/plugins/authad/lang/fr/settings.php b/sources/lib/plugins/authad/lang/fr/settings.php index d05390e..84e0d00 100644 --- a/sources/lib/plugins/authad/lang/fr/settings.php +++ b/sources/lib/plugins/authad/lang/fr/settings.php @@ -4,6 +4,7 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * * @author Bruno Veilleux + * @author Momo50 */ $lang['account_suffix'] = 'Le suffixe de votre compte. Ex.: @mon.domaine.org'; $lang['base_dn'] = 'Votre nom de domaine de base. DC=mon,DC=domaine,DC=org'; @@ -11,6 +12,7 @@ $lang['domain_controllers'] = 'Une liste de contrôleurs de domaine séparés $lang['admin_username'] = 'Un utilisateur Active Directory avec accès aux données de tous les autres utilisateurs. Facultatif, mais nécessaire pour certaines actions telles que l\'envoi de courriels d\'abonnement.'; $lang['admin_password'] = 'Le mot de passe de l\'utilisateur ci-dessus.'; $lang['sso'] = 'Est-ce que la connexion unique (Single-Sign-On) par Kerberos ou NTLM doit être utilisée?'; +$lang['sso_charset'] = 'Le jeu de caractères de votre serveur web va passer le nom d\'utilisateur Kerberos ou NTLM. Vide pour UTF-8 ou latin-1. Nécessite l\'extension iconv.'; $lang['real_primarygroup'] = 'Est-ce que le véritable groupe principal doit être résolu au lieu de présumer "Domain Users" (plus lent)?'; $lang['use_ssl'] = 'Utiliser une connexion SSL? Si utilisée, n\'activez pas TLS ci-dessous.'; $lang['use_tls'] = 'Utiliser une connexion TLS? Si utilisée, n\'activez pas SSL ci-dessus.'; diff --git a/sources/lib/plugins/authad/lang/hu/settings.php b/sources/lib/plugins/authad/lang/hu/settings.php index 1510e17..be0592d 100644 --- a/sources/lib/plugins/authad/lang/hu/settings.php +++ b/sources/lib/plugins/authad/lang/hu/settings.php @@ -4,16 +4,18 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * * @author Marton Sebok + * @author Marina Vladi */ $lang['account_suffix'] = 'Felhasználói azonosító végződése, pl. @my.domain.org.'; $lang['base_dn'] = 'Bázis DN, pl. DC=my,DC=domain,DC=org.'; $lang['domain_controllers'] = 'Tartománykezelők listája vesszővel elválasztva, pl. srv1.domain.org,srv2.domain.org.'; $lang['admin_username'] = 'Privilegizált AD felhasználó, aki az összes feéhasználó adatait elérheti. Elhagyható, de bizonyos funkciókhoz, például a feliratkozási e-mailek kiküldéséhez szükséges.'; $lang['admin_password'] = 'Ehhez tartozó jelszó.'; -$lang['sso'] = 'Single-Sign-On Kerberos-szal vagy NTML használata?'; +$lang['sso'] = 'Kerberos egyszeri bejelentkezés vagy NTLM használata?'; +$lang['sso_charset'] = 'A webkiszolgáló karakterkészlete megfelel a Kerberos- és NTLM-felhasználóneveknek. Üres UTF-8 és Latin-1-hez. Szükséges az iconv bővítmény.'; $lang['real_primarygroup'] = 'A valódi elsődleges csoport feloldása a "Tartományfelhasználók" csoport használata helyett? (lassabb)'; $lang['use_ssl'] = 'SSL használata? Ha használjuk, tiltsuk le a TLS-t!'; $lang['use_tls'] = 'TLS használata? Ha használjuk, tiltsuk le az SSL-t!'; -$lang['debug'] = 'Debug-üzenetek megjelenítése?'; +$lang['debug'] = 'További hibakeresési üzenetek megjelenítése hiba esetén'; $lang['expirywarn'] = 'Felhasználók értesítése ennyi nappal a jelszavuk lejárata előtt. 0 a funkció kikapcsolásához.'; -$lang['additional'] = 'Vesszővel elválasztott lista a további AD attribútumok lekéréshez. Néhány plugin használhatja.'; +$lang['additional'] = 'Vesszővel elválasztott lista a további AD attribútumok lekéréséhez. Néhány bővítmény használhatja.'; diff --git a/sources/lib/plugins/authad/lang/ko/lang.php b/sources/lib/plugins/authad/lang/ko/lang.php new file mode 100644 index 0000000..5a2416b --- /dev/null +++ b/sources/lib/plugins/authad/lang/ko/lang.php @@ -0,0 +1,8 @@ + + */ +$lang['domain'] = '로그온 도메인'; diff --git a/sources/lib/plugins/authad/lang/lv/settings.php b/sources/lib/plugins/authad/lang/lv/settings.php deleted file mode 100644 index ced5dab..0000000 --- a/sources/lib/plugins/authad/lang/lv/settings.php +++ /dev/null @@ -1,6 +0,0 @@ - - */ diff --git a/sources/lib/plugins/authad/lang/nl/lang.php b/sources/lib/plugins/authad/lang/nl/lang.php new file mode 100644 index 0000000..ea84190 --- /dev/null +++ b/sources/lib/plugins/authad/lang/nl/lang.php @@ -0,0 +1,8 @@ + + */ +$lang['domain'] = 'Inlog Domein'; diff --git a/sources/lib/plugins/authad/lang/no/settings.php b/sources/lib/plugins/authad/lang/no/settings.php new file mode 100644 index 0000000..bab5ce6 --- /dev/null +++ b/sources/lib/plugins/authad/lang/no/settings.php @@ -0,0 +1,9 @@ + + */ +$lang['admin_password'] = 'Passordet til brukeren over.'; +$lang['expirywarn'] = 'Antall dager på forhånd brukeren varsles om at passordet utgår. 0 for å deaktivere.'; diff --git a/sources/lib/plugins/authad/lang/pl/settings.php b/sources/lib/plugins/authad/lang/pl/settings.php index ad051b0..4e397fc 100644 --- a/sources/lib/plugins/authad/lang/pl/settings.php +++ b/sources/lib/plugins/authad/lang/pl/settings.php @@ -4,10 +4,17 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * * @author Tomasz Bosak + * @author Paweł Jan Czochański */ $lang['account_suffix'] = 'Przyrostek twojej nazwy konta np. @my.domain.org'; $lang['base_dn'] = 'Twoje bazowe DN. Na przykład: DC=my,DC=domain,DC=org'; +$lang['domain_controllers'] = 'Podzielona przecinkami lista kontrolerów domen np. srv1.domena.pl,srv2.domena.pl'; +$lang['admin_username'] = 'Uprawniony użytkownik katalogu Active Directory z dostępem do danych wszystkich użytkowników. +Opcjonalne, ale wymagane dla niektórych akcji np. wysyłania emailowych subskrypcji.'; $lang['admin_password'] = 'Hasło dla powyższego użytkownika.'; +$lang['sso'] = 'Czy pojedyncze logowanie powinno korzystać z Kerberos czy NTML?'; +$lang['sso_charset'] = 'Kodowanie znaków wykorzystywane do przesyłania nazwy użytkownika dla Kerberos lub NTLM. Pozostaw puste dla UTF-8 lub latin-1. Wymaga rozszerzenia iconv.'; $lang['use_ssl'] = 'Użyć połączenie SSL? Jeśli tak to nie aktywuj TLS poniżej.'; $lang['use_tls'] = 'Użyć połączenie TLS? Jeśli tak to nie aktywuj SSL powyżej.'; +$lang['debug'] = 'Wyświetlać dodatkowe informacje do debugowania w przypadku błędów?'; $lang['expirywarn'] = 'Dni poprzedzających powiadomienie użytkownika o wygasającym haśle. 0 aby wyłączyć.'; diff --git a/sources/lib/plugins/authad/lang/ru/lang.php b/sources/lib/plugins/authad/lang/ru/lang.php new file mode 100644 index 0000000..6f3c03e --- /dev/null +++ b/sources/lib/plugins/authad/lang/ru/lang.php @@ -0,0 +1,8 @@ + + */ +$lang['domain'] = 'Домен'; diff --git a/sources/lib/plugins/authad/lang/ru/settings.php b/sources/lib/plugins/authad/lang/ru/settings.php index 6854e09..c9c6d9f 100644 --- a/sources/lib/plugins/authad/lang/ru/settings.php +++ b/sources/lib/plugins/authad/lang/ru/settings.php @@ -6,8 +6,13 @@ * @author Ivan I. Udovichenko (sendtome@mymailbox.pp.ua) * @author Aleksandr Selivanov * @author Artur + * @author Erli Moen + * @author Владимир */ +$lang['account_suffix'] = 'Суффикс вашего аккаунта типа @my.domain.org'; +$lang['domain_controllers'] = 'Список DNS-серверов, разделенных запятой. Например:srv1.domain.org,srv2.domain.org'; $lang['admin_password'] = 'Пароль для указанного пользователя.'; $lang['sso'] = 'Использовать SSO (Single-Sign-On) через Kerberos или NTLM?'; $lang['use_ssl'] = 'Использовать SSL? Если да, то не включайте TLS.'; $lang['use_tls'] = 'Использовать TLS? Если да, то не включайте SSL.'; +$lang['debug'] = 'Выводить дополнительную информацию при ошибках?'; diff --git a/sources/lib/plugins/authad/lang/sk/settings.php b/sources/lib/plugins/authad/lang/sk/settings.php index b7d822f..266b372 100644 --- a/sources/lib/plugins/authad/lang/sk/settings.php +++ b/sources/lib/plugins/authad/lang/sk/settings.php @@ -15,6 +15,6 @@ $lang['sso_charset'] = 'Znaková sada, v ktorej bude webserver prená $lang['real_primarygroup'] = 'Použiť skutočnú primárnu skupinu používateľa namiesto "Doménoví používatelia" (pomalšie).'; $lang['use_ssl'] = 'Použiť SSL pripojenie? Ak áno, nepovoľte TLS nižšie.'; $lang['use_tls'] = 'Použiť TLS pripojenie? Ak áno, nepovoľte SSL vyššie.'; -$lang['debug'] = 'Zobraziť doplňujúce ladiace informácie pri chybe?'; +$lang['debug'] = 'Zobraziť dodatočné ladiace informácie pri chybe?'; $lang['expirywarn'] = 'Počet dní pred uplynutím platnosti hesla, počas ktorých používateľ dostáva upozornenie. 0 deaktivuje túto voľbu.'; $lang['additional'] = 'Zoznam dodatočných AD atribútov oddelených čiarkou získaných z údajov používateľa. Používané niektorými pluginmi.'; diff --git a/sources/lib/plugins/authad/lang/sl/settings.php b/sources/lib/plugins/authad/lang/sl/settings.php new file mode 100644 index 0000000..5849ea4 --- /dev/null +++ b/sources/lib/plugins/authad/lang/sl/settings.php @@ -0,0 +1,11 @@ + + * @author Jernej Vidmar + */ +$lang['admin_password'] = 'Geslo zgoraj omenjenega uporabnika'; +$lang['use_tls'] = 'Uporabi TLS povezavo? Če da, ne vključi SSL povezave zgoraj.'; +$lang['debug'] = 'Ali naj bodo prikazane dodatne podrobnosti napak?'; diff --git a/sources/lib/plugins/authad/lang/zh/settings.php b/sources/lib/plugins/authad/lang/zh/settings.php index 84bdc1e..52ba213 100644 --- a/sources/lib/plugins/authad/lang/zh/settings.php +++ b/sources/lib/plugins/authad/lang/zh/settings.php @@ -4,6 +4,7 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * * @author lainme + * @author oott123 */ $lang['account_suffix'] = '您的账户后缀。例如 @my.domain.org'; $lang['base_dn'] = '您的基本分辨名。例如 DC=my,DC=domain,DC=org'; @@ -11,6 +12,7 @@ $lang['domain_controllers'] = '逗号分隔的域名控制器列表。例如 $lang['admin_username'] = '一个活动目录的特权用户,可以查看其他所有用户的数据。可选,但对某些活动例如发送订阅邮件是必须的。'; $lang['admin_password'] = '上述用户的密码。'; $lang['sso'] = '是否使用经由 Kerberos 和 NTLM 的 Single-Sign-On?'; +$lang['sso_charset'] = '服务器传入 Kerberos 或者 NTLM 用户名的编码。留空为 UTF-8 或 latin-1 。此功能需要服务器支持iconv扩展。'; $lang['real_primarygroup'] = ' 是否解析真实的主要组,而不是假设为“域用户” (较慢)'; $lang['use_ssl'] = '使用 SSL 连接?如果是,不要激活下面的 TLS。'; $lang['use_tls'] = '使用 TLS 连接?如果是 ,不要激活上面的 SSL。'; diff --git a/sources/lib/plugins/authad/plugin.info.txt b/sources/lib/plugins/authad/plugin.info.txt index 3af1ddf..8774fcf 100644 --- a/sources/lib/plugins/authad/plugin.info.txt +++ b/sources/lib/plugins/authad/plugin.info.txt @@ -1,7 +1,7 @@ base authad author Andreas Gohr email andi@splitbrain.org -date 2013-04-25 +date 2014-02-14 name Active Directory Auth Plugin desc Provides user authentication against a Microsoft Active Directory url http://www.dokuwiki.org/plugin:authad diff --git a/sources/lib/plugins/authldap/auth.php b/sources/lib/plugins/authldap/auth.php index 31e2c51..6c3637e 100644 --- a/sources/lib/plugins/authldap/auth.php +++ b/sources/lib/plugins/authldap/auth.php @@ -143,6 +143,7 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin { * @author Dan Allen * @author * @author Stephane Chazelas + * @author Steffen Schoch * * @param string $user * @param bool $inbind authldap specific, true if in bind phase @@ -240,9 +241,17 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin { ldap_free_result($sr); if(is_array($result)) foreach($result as $grp) { - if(!empty($grp[$this->getConf('groupkey')][0])) { - $this->_debug('LDAP usergroup: '.htmlspecialchars($grp[$this->getConf('groupkey')][0]), 0, __LINE__, __FILE__); - $info['grps'][] = $grp[$this->getConf('groupkey')][0]; + if(!empty($grp[$this->getConf('groupkey')])) { + $group = $grp[$this->getConf('groupkey')]; + if(is_array($group)){ + $group = $group[0]; + } else { + $this->_debug('groupkey did not return a detailled result', 0, __LINE__, __FILE__); + } + if($group === '') continue; + + $this->_debug('LDAP usergroup: '.htmlspecialchars($group), 0, __LINE__, __FILE__); + $info['grps'][] = $group; } } } @@ -272,7 +281,7 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin { * @param array $filter array of field/pattern pairs, null for no filter * @return array of userinfo (refer getUserData for internal userinfo details) */ - function retrieveUsers($start = 0, $limit = -1, $filter = array()) { + function retrieveUsers($start = 0, $limit = 0, $filter = array()) { if(!$this->_openLDAP()) return false; if(is_null($this->users)) { @@ -307,7 +316,7 @@ class auth_plugin_authldap extends DokuWiki_Auth_Plugin { } if($this->_filter($user, $info)) { $result[$user] = $info; - if(($limit >= 0) && (++$count >= $limit)) break; + if(($limit > 0) && (++$count >= $limit)) break; } } return $result; diff --git a/sources/lib/plugins/authldap/lang/ar/settings.php b/sources/lib/plugins/authldap/lang/ar/settings.php new file mode 100644 index 0000000..aaef776 --- /dev/null +++ b/sources/lib/plugins/authldap/lang/ar/settings.php @@ -0,0 +1,13 @@ + + */ +$lang['port'] = 'LDAP المنفذ الملقم إذا لم يعط أي عنوان URL كامل أعلاه'; +$lang['version'] = 'إصدار نسخة البروتوكول الستخدامه. قد تحتاج لتعيين هذه القيمة إلى 3'; +$lang['starttls'] = 'استخدام اتصالات TLS؟'; +$lang['referrals'] = 'يتبع الإحالات؟'; +$lang['deref'] = 'كيفية إلغاء مرجعية الأسماء المستعارة؟'; +$lang['bindpw'] = 'كلمة مرور المستخدم أعلاه'; diff --git a/sources/lib/plugins/authldap/lang/bg/settings.php b/sources/lib/plugins/authldap/lang/bg/settings.php index 644672c..165216d 100644 --- a/sources/lib/plugins/authldap/lang/bg/settings.php +++ b/sources/lib/plugins/authldap/lang/bg/settings.php @@ -1,7 +1,8 @@ */ $lang['server'] = 'Вашият LDAP сървър. Име на хоста (localhost) или целият URL адрес (ldap://сървър.tld:389)'; @@ -16,4 +17,4 @@ $lang['referrals'] = 'Да бъдат ли следвани преп $lang['bindpw'] = 'Парола за горния потребител'; $lang['userscope'] = 'Ограничаване на обхвата за търсене на потребители'; $lang['groupscope'] = 'Ограничаване на обхвата за търсене на потребителски групи'; -$lang['debug'] = 'Показване на допълнителна debug информация при грешка'; \ No newline at end of file +$lang['debug'] = 'Показване на допълнителна debug информация при грешка'; diff --git a/sources/lib/plugins/authldap/lang/es/settings.php b/sources/lib/plugins/authldap/lang/es/settings.php index f8c3ad0..6991546 100644 --- a/sources/lib/plugins/authldap/lang/es/settings.php +++ b/sources/lib/plugins/authldap/lang/es/settings.php @@ -4,8 +4,22 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * * @author Antonio Bueno + * @author Eloy */ +$lang['server'] = 'Tu servidor LDAP. Puede ser el nombre del host (localhost) o una URL completa (ldap://server.tld:389)'; +$lang['port'] = 'Servidor LDAP en caso de que no se diera la URL completa anteriormente.'; +$lang['usertree'] = 'Donde encontrar cuentas de usuario. Ej. ou=People, dc=server, dc=tld'; +$lang['grouptree'] = 'Donde encontrar grupos de usuarios. Ej. ou=Group, dc=server, dc=tld'; +$lang['userfilter'] = 'Filtro LDAP para la busqueda de cuentas de usuario. P. E. (&(uid=%{user})(objectClass=posixAccount))'; +$lang['groupfilter'] = 'Filtro LDAP para la busqueda de grupos. P. E. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; +$lang['version'] = 'La versión del protocolo a usar. Puede que necesites poner esto a 3'; $lang['starttls'] = 'Usar conexiones TLS?'; +$lang['referrals'] = '¿Deben ser seguidas las referencias?'; +$lang['deref'] = '¿Cómo desreferenciar los alias?'; +$lang['bindpw'] = 'Contraseña del usuario de arriba.'; +$lang['userscope'] = 'Limitar ámbito de búsqueda para búsqueda de usuarios'; +$lang['groupscope'] = 'Limitar ámbito de búsqueda para búsqueda de grupos'; +$lang['groupkey'] = 'Pertenencia al grupo desde cualquier atributo de usuario (en lugar de grupos AD estándar) p.e., grupo a partir departamento o número de teléfono'; $lang['debug'] = 'Mostrar información adicional para depuración de errores'; $lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; $lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; diff --git a/sources/lib/plugins/authldap/lang/et/settings.php b/sources/lib/plugins/authldap/lang/et/settings.php new file mode 100644 index 0000000..f4933b6 --- /dev/null +++ b/sources/lib/plugins/authldap/lang/et/settings.php @@ -0,0 +1,9 @@ + + */ +$lang['grouptree'] = 'Kus kohast kasutaja rühmi otsida. Nt. ou=Rühm, dc=server, dc=tld'; +$lang['groupscope'] = 'Piiritle otsingu ulatus rühma otsinguga'; diff --git a/sources/lib/plugins/authldap/lang/he/settings.php b/sources/lib/plugins/authldap/lang/he/settings.php new file mode 100644 index 0000000..357a58c --- /dev/null +++ b/sources/lib/plugins/authldap/lang/he/settings.php @@ -0,0 +1,8 @@ + + */ +$lang['starttls'] = 'השתמש בחיבורי TLS'; diff --git a/sources/lib/plugins/authldap/lang/hu/settings.php b/sources/lib/plugins/authldap/lang/hu/settings.php index 041f827..1e6608d 100644 --- a/sources/lib/plugins/authldap/lang/hu/settings.php +++ b/sources/lib/plugins/authldap/lang/hu/settings.php @@ -4,9 +4,10 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * * @author Marton Sebok + * @author Marina Vladi */ -$lang['server'] = 'LDAP-szerver. Hosztnév (localhost) vagy abszolút URL portszámmal (ldap://server.tld:389)'; -$lang['port'] = 'LDAP-szerver port, ha nem URL lett megadva'; +$lang['server'] = 'LDAP-szerver. Kiszolgálónév (localhost) vagy teljes URL-cím (ldap://server.tld:389)'; +$lang['port'] = 'LDAP-kiszolgáló portja, ha URL-cím nem lett megadva'; $lang['usertree'] = 'Hol találom a felhasználókat? Pl. ou=People, dc=server, dc=tld'; $lang['grouptree'] = 'Hol találom a csoportokat? Pl. ou=Group, dc=server, dc=tld'; $lang['userfilter'] = 'LDAP szűrő a felhasználók kereséséhez, pl. (&(uid=%{user})(objectClass=posixAccount))'; @@ -20,7 +21,7 @@ $lang['bindpw'] = 'Ehhez tartozó jelszó.'; $lang['userscope'] = 'A keresési tartomány korlátozása erre a felhasználókra való keresésnél'; $lang['groupscope'] = 'A keresési tartomány korlátozása erre a csoportokra való keresésnél'; $lang['groupkey'] = 'Csoport meghatározása a következő attribútumból (az alapértelmezett AD csoporttagság helyett), pl. a szervezeti egység vagy a telefonszám'; -$lang['debug'] = 'Debug-üzenetek megjelenítése?'; +$lang['debug'] = 'Továbi hibakeresési információk megjelenítése hiba esetén'; $lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; $lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; $lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; diff --git a/sources/lib/plugins/authldap/lang/ja/settings.php b/sources/lib/plugins/authldap/lang/ja/settings.php index 6dec9a5..3c0e08f 100644 --- a/sources/lib/plugins/authldap/lang/ja/settings.php +++ b/sources/lib/plugins/authldap/lang/ja/settings.php @@ -7,7 +7,7 @@ * @author Hideaki SAWADA * @author Hideaki SAWADA */ -$lang['server'] = 'LDAPサーバー。ホスト名(localhostldap://server.tld:389)'; +$lang['server'] = 'LDAPサーバー。ホスト名(localhost)又は完全修飾URL(ldap://server.tld:389)'; $lang['port'] = '上記が完全修飾URLでない場合、LDAPサーバーポート'; $lang['usertree'] = 'ユーザーアカウントを探す場所。例:ou=People, dc=server, dc=tld'; $lang['grouptree'] = 'ユーザーグループを探す場所。例:ou=Group, dc=server, dc=tld'; diff --git a/sources/lib/plugins/authldap/lang/ko/settings.php b/sources/lib/plugins/authldap/lang/ko/settings.php index ae8dc7a..e663ba0 100644 --- a/sources/lib/plugins/authldap/lang/ko/settings.php +++ b/sources/lib/plugins/authldap/lang/ko/settings.php @@ -13,8 +13,8 @@ $lang['userfilter'] = '사용자 계정을 찾을 LDAP 필터. 예를 $lang['groupfilter'] = '그룹을 찾을 LDAP 필터. 예를 들어 (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; $lang['version'] = '사용할 프로토콜 버전. 3으로 설정해야 할 수도 있습니다'; $lang['starttls'] = 'TLS 연결을 사용하겠습니까?'; -$lang['referrals'] = '참고(referrals)를 허용하겠습니까? '; -$lang['deref'] = '어떻게 별명을 간접 참고하겠습니까?'; +$lang['referrals'] = '참조(referrals)를 허용하겠습니까? '; +$lang['deref'] = '어떻게 별명을 간접 참조하겠습니까?'; $lang['binddn'] = '익명 바인드가 충분하지 않으면 선택적인 바인드 사용자의 DN. 예를 들어 cn=admin, dc=my, dc=home'; $lang['bindpw'] = '위 사용자의 비밀번호'; $lang['userscope'] = '사용자 검색에 대한 검색 범위 제한'; diff --git a/sources/lib/plugins/authldap/lang/lv/settings.php b/sources/lib/plugins/authldap/lang/lv/settings.php deleted file mode 100644 index ced5dab..0000000 --- a/sources/lib/plugins/authldap/lang/lv/settings.php +++ /dev/null @@ -1,6 +0,0 @@ - - */ diff --git a/sources/lib/plugins/authldap/lang/no/settings.php b/sources/lib/plugins/authldap/lang/no/settings.php new file mode 100644 index 0000000..6bedb29 --- /dev/null +++ b/sources/lib/plugins/authldap/lang/no/settings.php @@ -0,0 +1,9 @@ + + */ +$lang['port'] = 'LDAP serverport dersom ingen full URL var gitt over.'; +$lang['starttls'] = 'Bruke TLS-forbindelser?'; diff --git a/sources/lib/plugins/authldap/lang/pl/settings.php b/sources/lib/plugins/authldap/lang/pl/settings.php index 084521e..7010988 100644 --- a/sources/lib/plugins/authldap/lang/pl/settings.php +++ b/sources/lib/plugins/authldap/lang/pl/settings.php @@ -3,6 +3,14 @@ /** * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * + * @author Paweł Jan Czochański */ +$lang['server'] = 'Twój serwer LDAP. Podaj nazwę hosta (localhost) albo pełen adres URL (ldap://server.tld:389).'; +$lang['port'] = 'Port serwera LDAP jeżeli nie podano pełnego adresu URL wyżej.'; +$lang['usertree'] = 'Gdzie szukać kont użytkownika? np. ou=People, dc=server, dc=tld'; +$lang['grouptree'] = 'Gdzie szukać grup użytkowników? np. ou=Group, dc=server, dc=tld'; +$lang['userfilter'] = 'Filtr LDAP wykorzystany przy szukaniu kont użytkowników np. (&(uid=%{user})(objectClass=posixAccount))'; +$lang['groupfilter'] = 'Filtr LDAP wykorzystany przy szukaniu grup użytkowników np. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; +$lang['version'] = 'Wykorzystywana wersja protokołu. Być może konieczne jest ustawienie tego na 3.'; $lang['starttls'] = 'Użyć połączeń TLS?'; $lang['bindpw'] = 'Hasło powyższego użytkownika'; diff --git a/sources/lib/plugins/authldap/lang/ru/settings.php b/sources/lib/plugins/authldap/lang/ru/settings.php index 70ad7b6..5677e06 100644 --- a/sources/lib/plugins/authldap/lang/ru/settings.php +++ b/sources/lib/plugins/authldap/lang/ru/settings.php @@ -5,5 +5,15 @@ * * @author Ivan I. Udovichenko (sendtome@mymailbox.pp.ua) * @author Aleksandr Selivanov + * @author Erli Moen + * @author Aleksandr Selivanov + * @author Владимир */ +$lang['starttls'] = 'Использовать TLS подключения?'; +$lang['deref'] = 'Как расшифровывать псевдонимы?'; $lang['bindpw'] = 'Пароль для указанного пользователя.'; +$lang['debug'] = 'Показывать дополнительную отладочную информацию при ошибках'; +$lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; +$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; +$lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; +$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS'; diff --git a/sources/lib/plugins/authldap/lang/sk/settings.php b/sources/lib/plugins/authldap/lang/sk/settings.php index c44f07e..26c8d9e 100644 --- a/sources/lib/plugins/authldap/lang/sk/settings.php +++ b/sources/lib/plugins/authldap/lang/sk/settings.php @@ -20,7 +20,7 @@ $lang['bindpw'] = 'Heslo vyššie uvedeného používateľa'; $lang['userscope'] = 'Obmedzenie oblasti pri vyhľadávaní používateľa'; $lang['groupscope'] = 'Obmedzenie oblasti pri vyhľadávaní skupiny'; $lang['groupkey'] = 'Príslušnost k skupine určená z daného atribútu používateľa (namiesto štandardnej AD skupiny) napr. skupiny podľa oddelenia alebo telefónneho čísla'; -$lang['debug'] = 'Zobraziť doplňujúce ladiace informácie pri chybe'; +$lang['debug'] = 'Zobraziť dodatočné ladiace informácie pri chybe'; $lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; $lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; $lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; diff --git a/sources/lib/plugins/authldap/lang/sl/settings.php b/sources/lib/plugins/authldap/lang/sl/settings.php new file mode 100644 index 0000000..f630703 --- /dev/null +++ b/sources/lib/plugins/authldap/lang/sl/settings.php @@ -0,0 +1,10 @@ + + * @author Jernej Vidmar + */ +$lang['starttls'] = 'Ali naj se uporabijo povezave TLS?'; +$lang['bindpw'] = 'Geslo uporabnika zgoraj'; diff --git a/sources/lib/plugins/authldap/lang/zh/settings.php b/sources/lib/plugins/authldap/lang/zh/settings.php index 77c2c69..cdaf3dc 100644 --- a/sources/lib/plugins/authldap/lang/zh/settings.php +++ b/sources/lib/plugins/authldap/lang/zh/settings.php @@ -4,6 +4,7 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * * @author lainme + * @author oott123 */ $lang['server'] = '您的 LDAP 服务器。填写主机名 (localhost) 或者完整的 URL (ldap://server.tld:389)'; $lang['port'] = 'LDAP 服务器端口 (如果上面没有给出完整的 URL)'; @@ -14,6 +15,7 @@ $lang['groupfilter'] = '用于搜索组的 LDAP 筛选器。例如 _openDB()) { $this->_lockTables("READ"); $sql = $this->_createSQLFilter($this->getConf('getUsers'), $filter); - $sql .= " ".$this->getConf('SortOrder')." LIMIT $first, $limit"; + $sql .= " ".$this->getConf('SortOrder'); + if($limit) { + $sql .= " LIMIT $first, $limit"; + } elseif($first) { + $sql .= " LIMIT $first"; + } $result = $this->_queryDB($sql); if(!empty($result)) { diff --git a/sources/lib/plugins/authmysql/lang/bg/settings.php b/sources/lib/plugins/authmysql/lang/bg/settings.php index fcc7f62..cd63702 100644 --- a/sources/lib/plugins/authmysql/lang/bg/settings.php +++ b/sources/lib/plugins/authmysql/lang/bg/settings.php @@ -1,8 +1,10 @@ + * @author Ivan Peltekov */ $lang['server'] = 'Вашият MySQL сървър'; $lang['user'] = 'MySQL потребителско име'; @@ -10,8 +12,8 @@ $lang['password'] = 'Парола за горния потреби $lang['database'] = 'Име на базата от данни'; $lang['charset'] = 'Набор от знаци, който се ползва в базата от данни'; $lang['debug'] = 'Показване на допълнителна debug информация'; - - -$lang['debug_o_0'] = 'не'; -$lang['debug_o_1'] = 'само при грешка'; -$lang['debug_o_2'] = 'за всяко SQL запитване'; \ No newline at end of file +$lang['checkPass'] = 'SQL заявка за проверка на паролите'; +$lang['getUserInfo'] = 'SQL заявка за извличане на информация за потребителя н'; +$lang['debug_o_0'] = 'не'; +$lang['debug_o_1'] = 'само при грешка'; +$lang['debug_o_2'] = 'за всяко SQL запитване'; diff --git a/sources/lib/plugins/authmysql/lang/es/settings.php b/sources/lib/plugins/authmysql/lang/es/settings.php index 64d4221..a247a44 100644 --- a/sources/lib/plugins/authmysql/lang/es/settings.php +++ b/sources/lib/plugins/authmysql/lang/es/settings.php @@ -4,9 +4,32 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * * @author Antonio Bueno + * @author Eloy */ $lang['server'] = 'Tu servidor MySQL'; $lang['user'] = 'Nombre de usuario MySQL'; +$lang['password'] = 'Contraseña para el usuario de arriba.'; $lang['database'] = 'Base de datos a usar'; $lang['charset'] = 'Codificación usada en la base de datos'; $lang['debug'] = 'Mostrar información adicional para depuración de errores'; +$lang['forwardClearPass'] = 'Enviar las contraseñas de usuario comotexto plano a las siguientes sentencias de SQL, en lugar de utilizar la opción passcrypt'; +$lang['TablesToLock'] = 'Lista separada por comasde las tablas a bloquear durante operaciones de escritura'; +$lang['checkPass'] = 'Sentencia SQL para verificar las contraseñas'; +$lang['getUserInfo'] = 'Sentencia SQL para obtener información del usuario'; +$lang['getGroups'] = 'Sentencia SQL para obtener la pertenencia a grupos de un usuario'; +$lang['getUsers'] = 'Sentencia SQL para listar todos los usuarios'; +$lang['FilterLogin'] = 'Cláusula SQL para filtrar usuarios por su nombre de usuario'; +$lang['FilterName'] = 'Cláusula SQL para filtrar usuarios por su nombre completo'; +$lang['FilterEmail'] = 'Cláusula SQL para filtrar usuarios por su dirección de correo electrónico'; +$lang['FilterGroup'] = 'Cláusula SQL para filtrar usuarios por su pertenencia a grupos'; +$lang['SortOrder'] = 'Cláusula SQL para ordenar usuarios'; +$lang['addUser'] = 'Sentencia SQL para agregar un nuevo usuario'; +$lang['addGroup'] = 'Sentencia SQL para agregar un nuevo grupo'; +$lang['addUserGroup'] = 'Sentencia SQL para agregar un usuario a un grupo existente'; +$lang['delGroup'] = 'Sentencia SQL para eliminar un grupo'; +$lang['getUserID'] = 'Sentencia SQL para obtener la clave primaria de un usuario'; +$lang['delUser'] = 'Sentencia SQL para eliminar un usuario'; +$lang['delUserRefs'] = 'Sentencia SQL para eliminar un usuario de todos los grupos'; +$lang['updateUser'] = 'Sentencia SQL para actualizar un perfil de usuario'; +$lang['debug_o_0'] = 'ninguno'; +$lang['debug_o_1'] = 'sólo errores'; diff --git a/sources/lib/plugins/authmysql/lang/fi/settings.php b/sources/lib/plugins/authmysql/lang/fi/settings.php deleted file mode 100644 index d3aa13e..0000000 --- a/sources/lib/plugins/authmysql/lang/fi/settings.php +++ /dev/null @@ -1,6 +0,0 @@ - - */ diff --git a/sources/lib/plugins/authmysql/lang/hu/settings.php b/sources/lib/plugins/authmysql/lang/hu/settings.php index 4edceae..cf7b26b 100644 --- a/sources/lib/plugins/authmysql/lang/hu/settings.php +++ b/sources/lib/plugins/authmysql/lang/hu/settings.php @@ -4,39 +4,40 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * * @author Marton Sebok + * @author Marina Vladi */ -$lang['server'] = 'MySQL-szerver'; -$lang['user'] = 'MySQL felhasználónév'; -$lang['password'] = 'Ehhez a jelszó'; +$lang['server'] = 'MySQL-kiszolgáló'; +$lang['user'] = 'MySQL-felhasználónév'; +$lang['password'] = 'Fenti felhasználó jelszava'; $lang['database'] = 'Adatbázis'; $lang['charset'] = 'Az adatbázisban használt karakterkészlet'; -$lang['debug'] = 'Debug-üzenetek megjelenítése?'; -$lang['forwardClearPass'] = 'A jelszó nyílt szövegben való átadása a következő SQL utasításokban a passcrypt opció használata helyett'; -$lang['TablesToLock'] = 'Az íráskor zárolandó táblák vesszővel elválasztott listája'; -$lang['checkPass'] = 'SQL utasítás a jelszavak ellenőrzéséhez'; -$lang['getUserInfo'] = 'SQL utasítás a felhasználói információk lekérdezéséhez'; -$lang['getGroups'] = 'SQL utasítás egy felhasználó csoporttagságainak lekérdezéséhez'; -$lang['getUsers'] = 'SQL utasítás a felhasználók listázásához'; -$lang['FilterLogin'] = 'SQL kifejezés a felhasználók azonosító alapú szűréséhez'; -$lang['FilterName'] = 'SQL kifejezés a felhasználók név alapú szűréséhez'; -$lang['FilterEmail'] = 'SQL kifejezés a felhasználók e-mail cím alapú szűréséhez'; -$lang['FilterGroup'] = 'SQL kifejezés a felhasználók csoporttagság alapú szűréséhez'; -$lang['SortOrder'] = 'SQL kifejezés a felhasználók rendezéséhez'; -$lang['addUser'] = 'SQL utasítás új felhasználó hozzáadásához'; -$lang['addGroup'] = 'SQL utasítás új csoport hozzáadásához'; -$lang['addUserGroup'] = 'SQL utasítás egy felhasználó egy meglévő csoporthoz való hozzáadásához'; -$lang['delGroup'] = 'SQL utasítás egy csoport törléséhez'; -$lang['getUserID'] = 'SQL utasítás egy felhasználó elsődleges kulcsának lekérdezéséhez'; -$lang['delUser'] = 'SQL utasítás egy felhasználó törléséhez'; -$lang['delUserRefs'] = 'SQL utasítás egy felhasználó eltávolításához az összes csoportból'; -$lang['updateUser'] = 'SQL utasítás egy felhasználó profiljának frissítéséhez'; -$lang['UpdateLogin'] = 'SQL kifejezés a felhasználó azonosítójának frissítéséhez'; -$lang['UpdatePass'] = 'SQL kifejezés a felhasználó jelszavának frissítéséhez'; -$lang['UpdateEmail'] = 'SQL kifejezés a felhasználó e-mail címének frissítéséhez'; -$lang['UpdateName'] = 'SQL kifejezés a felhasználó nevének frissítéséhez'; -$lang['UpdateTarget'] = 'SQL kifejezés a felhasználó kiválasztásához az adatok frissítésekor'; -$lang['delUserGroup'] = 'SQL utasítás egy felhasználó eltávolításához egy adott csoportból'; -$lang['getGroupID'] = 'SQL utasítás egy csoport elsődleges kulcsának lekérdezéséhez'; +$lang['debug'] = 'Hibakeresési üzenetek megjelenítése'; +$lang['forwardClearPass'] = 'A jelszó nyílt szövegként történő átadása az alábbi SQL-utasításoknak a passcrypt opció használata helyett'; +$lang['TablesToLock'] = 'Az íráskor zárolni kívánt táblák vesszővel elválasztott listája'; +$lang['checkPass'] = 'SQL-utasítás a jelszavak ellenőrzéséhez'; +$lang['getUserInfo'] = 'SQL-utasítás a felhasználói információk lekérdezéséhez'; +$lang['getGroups'] = 'SQL-utasítás egy felhasználó csoporttagságainak lekérdezéséhez'; +$lang['getUsers'] = 'SQL-utasítás a felhasználók listázásához'; +$lang['FilterLogin'] = 'SQL-kifejezés a felhasználók azonosító alapú szűréséhez'; +$lang['FilterName'] = 'SQL-kifejezés a felhasználók név alapú szűréséhez'; +$lang['FilterEmail'] = 'SQL-kifejezés a felhasználók e-mail cím alapú szűréséhez'; +$lang['FilterGroup'] = 'SQL-kifejezés a felhasználók csoporttagság alapú szűréséhez'; +$lang['SortOrder'] = 'SQL-kifejezés a felhasználók rendezéséhez'; +$lang['addUser'] = 'SQL-utasítás új felhasználó hozzáadásához'; +$lang['addGroup'] = 'SQL-utasítás új csoport hozzáadásához'; +$lang['addUserGroup'] = 'SQL-utasítás egy felhasználó egy meglévő csoporthoz való hozzáadásához'; +$lang['delGroup'] = 'SQL-utasítás egy csoport törléséhez'; +$lang['getUserID'] = 'SQL-utasítás egy felhasználó elsődleges kulcsának lekérdezéséhez'; +$lang['delUser'] = 'SQL-utasítás egy felhasználó törléséhez'; +$lang['delUserRefs'] = 'SQL-utasítás egy felhasználó eltávolításához az összes csoportból'; +$lang['updateUser'] = 'SQL-utasítás egy felhasználó profiljának frissítéséhez'; +$lang['UpdateLogin'] = 'UPDATE-klauzula a felhasználó azonosítójának frissítéséhez'; +$lang['UpdatePass'] = 'UPDATE-klauzula a felhasználó jelszavának frissítéséhez'; +$lang['UpdateEmail'] = 'UPDATE-klauzula a felhasználó e-mail címének frissítéséhez'; +$lang['UpdateName'] = 'UPDATE-klauzula a felhasználó teljes nevének frissítéséhez'; +$lang['UpdateTarget'] = 'LIMIT-klauzula a felhasználó kiválasztásához az adatok frissítésekor'; +$lang['delUserGroup'] = 'SQL-utasítás felhasználó adott csoportból történő törléséhez '; +$lang['getGroupID'] = 'SQL-utasítás adott csoport elsődleges kulcsának lekérdezéséhez'; $lang['debug_o_0'] = 'nem'; $lang['debug_o_1'] = 'csak hiba esetén'; $lang['debug_o_2'] = 'minden SQL-lekérdezésnél'; diff --git a/sources/lib/plugins/authmysql/lang/lv/settings.php b/sources/lib/plugins/authmysql/lang/lv/settings.php deleted file mode 100644 index ced5dab..0000000 --- a/sources/lib/plugins/authmysql/lang/lv/settings.php +++ /dev/null @@ -1,6 +0,0 @@ - - */ diff --git a/sources/lib/plugins/authmysql/lang/pl/settings.php b/sources/lib/plugins/authmysql/lang/pl/settings.php index 5ae6bf1..88cbd5d 100644 --- a/sources/lib/plugins/authmysql/lang/pl/settings.php +++ b/sources/lib/plugins/authmysql/lang/pl/settings.php @@ -3,9 +3,12 @@ /** * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * + * @author Paweł Jan Czochański */ $lang['server'] = 'Twój server MySQL'; $lang['user'] = 'Nazwa użytkownika MySQL'; $lang['password'] = 'Hasło dla powyższego użytkownika'; $lang['database'] = 'Używana baza danych'; $lang['charset'] = 'Zestaw znaków uzyty w bazie danych'; +$lang['debug'] = 'Wyświetlaj dodatkowe informacje do debugowania.'; +$lang['checkPass'] = 'Zapytanie SQL wykorzystywane do sprawdzania haseł.'; diff --git a/sources/lib/plugins/authmysql/lang/sk/settings.php b/sources/lib/plugins/authmysql/lang/sk/settings.php index d7e8cb2..8042c69 100644 --- a/sources/lib/plugins/authmysql/lang/sk/settings.php +++ b/sources/lib/plugins/authmysql/lang/sk/settings.php @@ -10,7 +10,7 @@ $lang['user'] = 'Meno používateľa MySQL'; $lang['password'] = 'Heslo pre vyššie uvedeného používateľa'; $lang['database'] = 'Použiť databázu'; $lang['charset'] = 'Znaková sada databázy'; -$lang['debug'] = 'Zobraziť doplňujúce ladiace informácie'; +$lang['debug'] = 'Zobraziť dodatočné ladiace informácie'; $lang['forwardClearPass'] = 'Posielať heslo ako nezakódovaný text nižšie uvedenému SQL príkazu namiesto použitia kódovania'; $lang['TablesToLock'] = 'Zoznam tabuliek oddelených čiarkou, ktoré by mali byť uzamknuté pri operáciách zápisu'; $lang['checkPass'] = 'SQL príkaz pre kontrolu hesla'; diff --git a/sources/lib/plugins/authpgsql/auth.php b/sources/lib/plugins/authpgsql/auth.php index 3f8ff32..e51b398 100644 --- a/sources/lib/plugins/authpgsql/auth.php +++ b/sources/lib/plugins/authpgsql/auth.php @@ -148,13 +148,15 @@ class auth_plugin_authpgsql extends auth_plugin_authmysql { * @param array $filter array of field/pattern pairs * @return array userinfo (refer getUserData for internal userinfo details) */ - public function retrieveUsers($first = 0, $limit = 10, $filter = array()) { + public function retrieveUsers($first = 0, $limit = 0, $filter = array()) { $out = array(); if($this->_openDB()) { $this->_lockTables("READ"); $sql = $this->_createSQLFilter($this->conf['getUsers'], $filter); - $sql .= " ".$this->conf['SortOrder']." LIMIT $limit OFFSET $first"; + $sql .= " ".$this->conf['SortOrder']; + if($limit) $sql .= " LIMIT $limit"; + if($first) $sql .= " OFFSET $first"; $result = $this->_queryDB($sql); foreach($result as $user) diff --git a/sources/lib/plugins/authpgsql/lang/bg/settings.php b/sources/lib/plugins/authpgsql/lang/bg/settings.php index 0defdc4..bd6ae1c 100644 --- a/sources/lib/plugins/authpgsql/lang/bg/settings.php +++ b/sources/lib/plugins/authpgsql/lang/bg/settings.php @@ -1,7 +1,8 @@ */ $lang['server'] = 'Вашият PostgreSQL сървър'; @@ -9,4 +10,4 @@ $lang['port'] = 'Порт за PostgreSQL сървъра'; $lang['user'] = 'PostgreSQL потребител'; $lang['password'] = 'Парола за горния потребител'; $lang['database'] = 'Име на базата от данни'; -$lang['debug'] = 'Показване на допълнителна debug информация'; \ No newline at end of file +$lang['debug'] = 'Показване на допълнителна debug информация'; diff --git a/sources/lib/plugins/authpgsql/lang/es/settings.php b/sources/lib/plugins/authpgsql/lang/es/settings.php new file mode 100644 index 0000000..bee2211 --- /dev/null +++ b/sources/lib/plugins/authpgsql/lang/es/settings.php @@ -0,0 +1,9 @@ + + */ +$lang['password'] = 'Contraseña del usuario indicado'; +$lang['database'] = 'Base de datos a usar'; diff --git a/sources/lib/plugins/authpgsql/lang/fi/settings.php b/sources/lib/plugins/authpgsql/lang/fi/settings.php deleted file mode 100644 index d3aa13e..0000000 --- a/sources/lib/plugins/authpgsql/lang/fi/settings.php +++ /dev/null @@ -1,6 +0,0 @@ - - */ diff --git a/sources/lib/plugins/authpgsql/lang/hu/settings.php b/sources/lib/plugins/authpgsql/lang/hu/settings.php index ff62a70..213fc87 100644 --- a/sources/lib/plugins/authpgsql/lang/hu/settings.php +++ b/sources/lib/plugins/authpgsql/lang/hu/settings.php @@ -4,35 +4,36 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * * @author Marton Sebok + * @author Marina Vladi */ -$lang['server'] = 'PostgreSQL-szerver'; -$lang['port'] = 'PostgreSQL-port'; -$lang['user'] = 'PostgreSQL felhasználónév'; -$lang['password'] = 'Ehhez a jelszó'; +$lang['server'] = 'PostgreSQL-kiszolgáló'; +$lang['port'] = 'PostgreSQL-kiszolgáló portja'; +$lang['user'] = 'PostgreSQL-felhasználónév'; +$lang['password'] = 'Fenti felhasználó jelszava'; $lang['database'] = 'Adatbázis'; -$lang['debug'] = 'Debug-üzenetek megjelenítése?'; +$lang['debug'] = 'Hibakeresési üzenetek megjelenítése'; $lang['forwardClearPass'] = 'A jelszó nyílt szövegben való átadása a következő SQL utasításokban a passcrypt opció használata helyett'; -$lang['checkPass'] = 'SQL utasítás a jelszavak ellenőrzéséhez'; -$lang['getUserInfo'] = 'SQL utasítás a felhasználói információk lekérdezéséhez'; -$lang['getGroups'] = 'SQL utasítás egy felhasználó csoporttagságainak lekérdezéséhez'; -$lang['getUsers'] = 'SQL utasítás a felhasználók listázásához'; -$lang['FilterLogin'] = 'SQL kifejezés a felhasználók azonosító alapú szűréséhez'; -$lang['FilterName'] = 'SQL kifejezés a felhasználók név alapú szűréséhez'; -$lang['FilterEmail'] = 'SQL kifejezés a felhasználók e-mail cím alapú szűréséhez'; -$lang['FilterGroup'] = 'SQL kifejezés a felhasználók csoporttagság alapú szűréséhez'; -$lang['SortOrder'] = 'SQL kifejezés a felhasználók rendezéséhez'; -$lang['addUser'] = 'SQL utasítás új felhasználó hozzáadásához'; -$lang['addGroup'] = 'SQL utasítás új csoport hozzáadásához'; -$lang['addUserGroup'] = 'SQL utasítás egy felhasználó egy meglévő csoporthoz való hozzáadásához'; -$lang['delGroup'] = 'SQL utasítás egy csoport törléséhez'; -$lang['getUserID'] = 'SQL utasítás egy felhasználó elsődleges kulcsának lekérdezéséhez'; -$lang['delUser'] = 'SQL utasítás egy felhasználó törléséhez'; -$lang['delUserRefs'] = 'SQL utasítás egy felhasználó eltávolításához az összes csoportból'; -$lang['updateUser'] = 'SQL utasítás egy felhasználó profiljának frissítéséhez'; -$lang['UpdateLogin'] = 'SQL kifejezés a felhasználó azonosítójának frissítéséhez'; -$lang['UpdatePass'] = 'SQL kifejezés a felhasználó jelszavának frissítéséhez'; -$lang['UpdateEmail'] = 'SQL kifejezés a felhasználó e-mail címének frissítéséhez'; -$lang['UpdateName'] = 'SQL kifejezés a felhasználó nevének frissítéséhez'; -$lang['UpdateTarget'] = 'SQL kifejezés a felhasználó kiválasztásához az adatok frissítésekor'; -$lang['delUserGroup'] = 'SQL utasítás egy felhasználó eltávolításához egy adott csoportból'; -$lang['getGroupID'] = 'SQL utasítás egy csoport elsődleges kulcsának lekérdezéséhez'; +$lang['checkPass'] = 'SQL-utasítás a jelszavak ellenőrzéséhez'; +$lang['getUserInfo'] = 'SQL-utasítás a felhasználói információk lekérdezéséhez'; +$lang['getGroups'] = 'SQL-utasítás egy felhasználó csoporttagságainak lekérdezéséhez'; +$lang['getUsers'] = 'SQL-utasítás a felhasználók listázásához'; +$lang['FilterLogin'] = 'SQL-kifejezés a felhasználók azonosító alapú szűréséhez'; +$lang['FilterName'] = 'SQL-klauzula a felhasználók név alapú szűréséhez'; +$lang['FilterEmail'] = 'SQL-klauzula a felhasználók e-mail cím alapú szűréséhez'; +$lang['FilterGroup'] = 'SQL-klauzula a felhasználók csoporttagság alapú szűréséhez'; +$lang['SortOrder'] = 'SQL-klauzula a felhasználók rendezéséhez'; +$lang['addUser'] = 'SQL-klauzula új felhasználó hozzáadásához'; +$lang['addGroup'] = 'SQL-klauzula új csoport hozzáadásához'; +$lang['addUserGroup'] = 'SQL-utasítás felhasználó meglévő csoporthoz való hozzáadásához'; +$lang['delGroup'] = 'SQL-utasítás csoport törléséhez'; +$lang['getUserID'] = 'SQL-utasítás felhasználó elsődleges kulcsának lekérdezéséhez'; +$lang['delUser'] = 'SQL-utasítás felhasználó törléséhez'; +$lang['delUserRefs'] = 'SQL-utasítás felhasználó összes csoportból való törléséhez'; +$lang['updateUser'] = 'SQL-utasítás felhasználó profiljának frissítéséhez'; +$lang['UpdateLogin'] = 'UPDATE-klauzula felhasználók azonosítójának frissítéséhez'; +$lang['UpdatePass'] = 'UPDATE-klauzula felhasználók jelszavának frissítéséhez'; +$lang['UpdateEmail'] = 'UPDATE-klauzula felhasználók e-mailcímének frissítéséhez'; +$lang['UpdateName'] = 'SQL-kifejezés a felhasználó nevének frissítéséhez'; +$lang['UpdateTarget'] = 'SQL-kifejezés a felhasználó kiválasztásához az adatok frissítésekor'; +$lang['delUserGroup'] = 'SQL-utasítás egy felhasználó eltávolításához egy adott csoportból'; +$lang['getGroupID'] = 'SQL-utasítás egy csoport elsődleges kulcsának lekérdezéséhez'; diff --git a/sources/lib/plugins/authpgsql/lang/it/settings.php b/sources/lib/plugins/authpgsql/lang/it/settings.php deleted file mode 100644 index 10ae72f..0000000 --- a/sources/lib/plugins/authpgsql/lang/it/settings.php +++ /dev/null @@ -1,5 +0,0 @@ - - */ diff --git a/sources/lib/plugins/authpgsql/lang/pl/settings.php b/sources/lib/plugins/authpgsql/lang/pl/settings.php deleted file mode 100644 index 37afb25..0000000 --- a/sources/lib/plugins/authpgsql/lang/pl/settings.php +++ /dev/null @@ -1,5 +0,0 @@ - + * @author Aleksandr Selivanov */ $lang['server'] = 'Ваш PostgreSQL-сервер'; $lang['port'] = 'Порт вашего PostgreSQL-сервера'; $lang['user'] = 'Имя пользователя PostgreSQL'; $lang['password'] = 'Пароль для указанного пользователя.'; $lang['database'] = 'Имя базы данных'; +$lang['debug'] = 'Отображать дополнительную отладочную информацию'; $lang['checkPass'] = 'Выражение SQL, осуществляющее проверку пароля'; $lang['getUserInfo'] = 'Выражение SQL, осуществляющее извлечение информации о пользователе'; $lang['getGroups'] = 'Выражение SQL, осуществляющее извлечение информации о членстве пользователе в группах'; diff --git a/sources/lib/plugins/authpgsql/lang/sk/settings.php b/sources/lib/plugins/authpgsql/lang/sk/settings.php index 861d123..9013a75 100644 --- a/sources/lib/plugins/authpgsql/lang/sk/settings.php +++ b/sources/lib/plugins/authpgsql/lang/sk/settings.php @@ -10,7 +10,7 @@ $lang['port'] = 'Port PostgreSQL servera'; $lang['user'] = 'Meno používateľa PostgreSQL'; $lang['password'] = 'Heslo pre vyššie uvedeného používateľa'; $lang['database'] = 'Použiť databázu'; -$lang['debug'] = 'Zobraziť doplňujúce ladiace informácie'; +$lang['debug'] = 'Zobraziť dodatočné ladiace informácie'; $lang['forwardClearPass'] = 'Posielať heslo ako nezakódovaný text nižšie uvedenému SQL príkazu namiesto použitia kódovania'; $lang['checkPass'] = 'SQL príkaz pre kontrolu hesla'; $lang['getUserInfo'] = 'SQL príkaz pre získanie informácií o používateľovi'; diff --git a/sources/lib/plugins/authpgsql/lang/sl/settings.php b/sources/lib/plugins/authpgsql/lang/sl/settings.php index 4c369ab..08d3cbc 100644 --- a/sources/lib/plugins/authpgsql/lang/sl/settings.php +++ b/sources/lib/plugins/authpgsql/lang/sl/settings.php @@ -4,5 +4,14 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * * @author Matej Urbančič + * @author matej */ $lang['database'] = 'Podatkovna zbirka za uporabo'; +$lang['addUserGroup'] = 'Ukaz SQL za dodajanje uporabnika v obstoječo skupino'; +$lang['delGroup'] = 'Ukaz SQL za odstranitev skupine'; +$lang['getUserID'] = 'Ukaz SQL za pridobitev osnovnega ključa uporabnika'; +$lang['delUser'] = 'Ukaz SQL za izbris uporabnika'; +$lang['delUserRefs'] = 'Ukaz SQL za odstranitev uporabnika iz vseh skupin'; +$lang['updateUser'] = 'Ukaz SQL za posodobitev profila uporabnika'; +$lang['delUserGroup'] = 'Ukaz SQL za odstranitev uporabnika iz podane skupine'; +$lang['getGroupID'] = 'Ukaz SQL za pridobitev osnovnega ključa podane skupine'; diff --git a/sources/lib/plugins/config/lang/bg/lang.php b/sources/lib/plugins/config/lang/bg/lang.php index d0df38c..64ddb1e 100644 --- a/sources/lib/plugins/config/lang/bg/lang.php +++ b/sources/lib/plugins/config/lang/bg/lang.php @@ -67,7 +67,7 @@ $lang['fmode'] = 'Режим (права) за създаване на фа $lang['allowdebug'] = 'Включване на режи debug - изключете, ако не е нужен!'; /* Display Settings */ -$lang['recent'] = 'Скорошни промени - брой еленти на страница'; +$lang['recent'] = 'Скорошни промени - брой елементи на страница'; $lang['recent_days'] = 'Колко от скорошните промени да се пазят (дни)'; $lang['breadcrumbs'] = 'Брой на следите. За изключване на функцията задайте 0.'; $lang['youarehere'] = 'Йерархични следи (в този случай можете да изключите горната опция)'; @@ -167,7 +167,7 @@ $lang['compress'] = 'Компактен CSS и javascript изглед'; $lang['cssdatauri'] = 'Максимален размер, в байтове, до който изображенията посочени в .CSS файл ще бъдат вграждани в стила (stylesheet), за да се намали броя на HTTP заявките. Техниката не работи за версиите на IE преди 8! Препоръчителни стойности: 400 до 600 байта. Въведете 0 за изключване.'; $lang['send404'] = 'Пращане на "HTTP 404/Page Not Found" за несъществуващи страници'; $lang['broken_iua'] = 'Отметнете, ако ignore_user_abort функцията не работи. Може да попречи на търсенето в страниците. Знае се, че комбинацията IIS+PHP/CGI е лоша. Вижте Грешка 852 за повече информация.'; -$lang['xsendfile'] = 'Ползване на Х-Sendfile header, за да може уебсървъра да дава статични файлове? Вашият уебсървър трябва да го поддържа.'; +$lang['xsendfile'] = 'Ползване на Х-Sendfile header, за да може уебсървъра да дава статични файлове? Вашият уеб сървър трябва да го поддържа.'; $lang['renderer_xhtml'] = 'Представяне на основните изходни данни (xhtml) от Wiki-то с'; $lang['renderer__core'] = '%s (ядрото на DokuWiki)'; $lang['renderer__plugin'] = '%s (приставка)'; diff --git a/sources/lib/plugins/config/lang/de/lang.php b/sources/lib/plugins/config/lang/de/lang.php index e55081a..d398ebf 100644 --- a/sources/lib/plugins/config/lang/de/lang.php +++ b/sources/lib/plugins/config/lang/de/lang.php @@ -41,7 +41,7 @@ $lang['_links'] = 'Links'; $lang['_media'] = 'Medien'; $lang['_notifications'] = 'Benachrichtigung'; $lang['_syndication'] = 'Syndication (RSS)'; -$lang['_advanced'] = 'Erweitertet'; +$lang['_advanced'] = 'Erweitert'; $lang['_network'] = 'Netzwerk'; $lang['_msg_setting_undefined'] = 'Keine Konfigurationsmetadaten.'; $lang['_msg_setting_no_class'] = 'Keine Konfigurationsklasse.'; diff --git a/sources/lib/plugins/config/lang/en/lang.php b/sources/lib/plugins/config/lang/en/lang.php index cdef85a..5e5218a 100644 --- a/sources/lib/plugins/config/lang/en/lang.php +++ b/sources/lib/plugins/config/lang/en/lang.php @@ -101,6 +101,7 @@ $lang['disableactions_subscription'] = 'Subscribe/Unsubscribe'; $lang['disableactions_wikicode'] = 'View source/Export Raw'; $lang['disableactions_profile_delete'] = 'Delete Own Account'; $lang['disableactions_other'] = 'Other actions (comma separated)'; +$lang['disableactions_rss'] = 'XML Syndication (RSS)'; $lang['auth_security_timeout'] = 'Authentication Security Timeout (seconds)'; $lang['securecookie'] = 'Should cookies set via HTTPS only be sent via HTTPS by the browser? Disable this option when only the login of your wiki is secured with SSL but browsing the wiki is done unsecured.'; $lang['remote'] = 'Enable the remote API system. This allows other applications to access the wiki via XML-RPC or other mechanisms.'; @@ -245,10 +246,11 @@ $lang['xsendfile_o_2'] = 'Standard X-Sendfile header'; $lang['xsendfile_o_3'] = 'Proprietary Nginx X-Accel-Redirect header'; /* Display user info */ -$lang['showuseras_o_loginname'] = 'Login name'; -$lang['showuseras_o_username'] = "User's full name"; -$lang['showuseras_o_email'] = "User's e-mail addresss (obfuscated according to mailguard setting)"; -$lang['showuseras_o_email_link'] = "User's e-mail addresss as a mailto: link"; +$lang['showuseras_o_loginname'] = 'Login name'; +$lang['showuseras_o_username'] = "User's full name"; +$lang['showuseras_o_username_link'] = "User's full name as interwiki user link"; +$lang['showuseras_o_email'] = "User's e-mail addresss (obfuscated according to mailguard setting)"; +$lang['showuseras_o_email_link'] = "User's e-mail addresss as a mailto: link"; /* useheading options */ $lang['useheading_o_0'] = 'Never'; diff --git a/sources/lib/plugins/config/lang/hr/lang.php b/sources/lib/plugins/config/lang/hr/lang.php deleted file mode 100644 index 96f1d6a..0000000 --- a/sources/lib/plugins/config/lang/hr/lang.php +++ /dev/null @@ -1,8 +0,0 @@ - - * @author Dražen Odobašić - * @author Dejan Igrec dejan.igrec@gmail.com - */ diff --git a/sources/lib/plugins/config/lang/id/lang.php b/sources/lib/plugins/config/lang/id/lang.php deleted file mode 100644 index c3d4859..0000000 --- a/sources/lib/plugins/config/lang/id/lang.php +++ /dev/null @@ -1,7 +0,0 @@ - - * @author Yustinus Waruwu - */ diff --git a/sources/lib/plugins/config/lang/kk/lang.php b/sources/lib/plugins/config/lang/kk/lang.php deleted file mode 100644 index dde5b95..0000000 --- a/sources/lib/plugins/config/lang/kk/lang.php +++ /dev/null @@ -1,6 +0,0 @@ - - */ diff --git a/sources/lib/plugins/config/lang/ms/lang.php b/sources/lib/plugins/config/lang/ms/lang.php deleted file mode 100644 index 77ad2a1..0000000 --- a/sources/lib/plugins/config/lang/ms/lang.php +++ /dev/null @@ -1,6 +0,0 @@ -retrieve_settings(); } - function retrieve_settings() { + /** + * Retrieve and stores settings in setting[] attribute + */ + public function retrieve_settings() { global $conf; $no_default_check = array('setting_fieldset', 'setting_undefined', 'setting_no_class'); @@ -100,7 +106,15 @@ if (!class_exists('configuration')) { } } - function save_settings($id, $header='', $backup=true) { + /** + * Stores setting[] array to file + * + * @param string $id Name of plugin, which saves the settings + * @param string $header Text at the top of the rewritten settings file + * @param bool $backup backup current file? (remove any existing backup) + * @return bool succesful? + */ + public function save_settings($id, $header='', $backup=true) { global $conf; if ($this->locked) return false; @@ -138,13 +152,19 @@ if (!class_exists('configuration')) { /** * Update last modified time stamp of the config file */ - function touch_settings(){ + public function touch_settings(){ if ($this->locked) return false; $file = end($this->_local_files); return @touch($file); } - function _read_config_group($files) { + /** + * Read and merge given config files + * + * @param array $files file paths + * @return array config settings + */ + protected function _read_config_group($files) { $config = array(); foreach ($files as $file) { $config = array_merge($config, $this->_read_config($file)); @@ -154,7 +174,10 @@ if (!class_exists('configuration')) { } /** - * return an array of config settings + * Return an array of config settings + * + * @param string $file file path + * @return array config settings */ function _read_config($file) { @@ -206,7 +229,14 @@ if (!class_exists('configuration')) { return $config; } - function _out_header($id, $header) { + /** + * Returns header of rewritten settings file + * + * @param string $id plugin name of which generated this output + * @param string $header additional text for at top of the file + * @return string text of header + */ + protected function _out_header($id, $header) { $out = ''; if ($this->_format == 'php') { $out .= '<'.'?php'."\n". @@ -221,7 +251,12 @@ if (!class_exists('configuration')) { return $out; } - function _out_footer() { + /** + * Returns footer of rewritten settings file + * + * @return string text of footer + */ + protected function _out_footer() { $out = ''; if ($this->_format == 'php') { $out .= "\n// end auto-generated content\n"; @@ -230,9 +265,13 @@ if (!class_exists('configuration')) { return $out; } - // configuration is considered locked if there is no local settings filename - // or the directory its in is not writable or the file exists and is not writable - function _is_locked() { + /** + * Configuration is considered locked if there is no local settings filename + * or the directory its in is not writable or the file exists and is not writable + * + * @return bool true: locked, false: writable + */ + protected function _is_locked() { if (!$this->_local_files) return true; $local = $this->_local_files[0]; @@ -247,7 +286,7 @@ if (!class_exists('configuration')) { * not used ... conf's contents are an array! * reduce any multidimensional settings to one dimension using CM_KEYMARKER */ - function _flatten($conf,$prefix='') { + protected function _flatten($conf,$prefix='') { $out = array(); @@ -264,6 +303,12 @@ if (!class_exists('configuration')) { return $out; } + /** + * Returns array of plugin names + * + * @return array plugin names + * @triggers PLUGIN_CONFIG_PLUGINLIST event + */ function get_plugin_list() { if (is_null($this->_plugin_list)) { $list = plugin_list('',$this->show_disabled_plugins); @@ -281,6 +326,9 @@ if (!class_exists('configuration')) { /** * load metadata for plugin and template settings + * + * @param string $tpl name of active template + * @return array metadata of settings */ function get_plugintpl_metadata($tpl){ $file = '/conf/metadata.php'; @@ -321,7 +369,10 @@ if (!class_exists('configuration')) { } /** - * load default settings for plugins and templates + * Load default settings for plugins and templates + * + * @param string $tpl name of active template + * @return array default settings */ function get_plugintpl_default($tpl){ $file = '/conf/default.php'; @@ -368,7 +419,11 @@ if (!class_exists('setting')) { static protected $_validCautions = array('warning','danger','security'); - function setting($key, $params=null) { + /** + * @param string $key + * @param array|null $params array with metadata of setting + */ + public function setting($key, $params=null) { $this->_key = $key; if (is_array($params)) { @@ -379,9 +434,13 @@ if (!class_exists('setting')) { } /** - * receives current values for the setting $key + * Receives current values for the setting $key + * + * @param mixed $default default setting value + * @param mixed $local local setting value + * @param mixed $protected protected setting value */ - function initialize($default, $local, $protected) { + public function initialize($default, $local, $protected) { if (isset($default)) $this->_default = $default; if (isset($local)) $this->_local = $local; if (isset($protected)) $this->_protected = $protected; @@ -395,7 +454,7 @@ if (!class_exists('setting')) { * @param mixed $input the new value * @return boolean true if changed, false otherwise (incl. on error) */ - function update($input) { + public function update($input) { if (is_null($input)) return false; if ($this->is_protected()) return false; @@ -413,9 +472,13 @@ if (!class_exists('setting')) { } /** - * @return array(string $label_html, string $input_html) + * Build html for label and input of setting + * + * @param DokuWiki_Plugin $plugin object of config plugin + * @param bool $echo true: show inputted value, when error occurred, otherwise the stored setting + * @return array(string $label_html, string $input_html) */ - function html(&$plugin, $echo=false) { + public function html(&$plugin, $echo=false) { $value = ''; $disable = ''; @@ -439,9 +502,9 @@ if (!class_exists('setting')) { } /** - * generate string to save setting value to file according to $fmt + * Generate string to save setting value to file according to $fmt */ - function out($var, $fmt='php') { + public function out($var, $fmt='php') { if ($this->is_protected()) return ''; if (is_null($this->_local) || ($this->_default == $this->_local)) return ''; @@ -457,17 +520,45 @@ if (!class_exists('setting')) { return $out; } - function prompt(&$plugin) { + /** + * Returns the localized prompt + * + * @param DokuWiki_Plugin $plugin object of config plugin + * @return string text + */ + public function prompt(&$plugin) { $prompt = $plugin->getLang($this->_key); if (!$prompt) $prompt = htmlspecialchars(str_replace(array('____','_'),' ',$this->_key)); return $prompt; } - function is_protected() { return !is_null($this->_protected); } - function is_default() { return !$this->is_protected() && is_null($this->_local); } - function error() { return $this->_error; } + /** + * Is setting protected + * + * @return bool + */ + public function is_protected() { return !is_null($this->_protected); } - function caution() { + /** + * Is setting the default? + * + * @return bool + */ + public function is_default() { return !$this->is_protected() && is_null($this->_local); } + + /** + * Has an error? + * + * @return bool + */ + public function error() { return $this->_error; } + + /** + * Returns caution + * + * @return bool|string caution string, otherwise false for invalid caution + */ + public function caution() { if (!empty($this->_caution)) { if (!in_array($this->_caution, setting::$_validCautions)) { trigger_error('Invalid caution string ('.$this->_caution.') in metadata for setting "'.$this->_key.'"', E_USER_WARNING); @@ -486,7 +577,14 @@ if (!class_exists('setting')) { return false; } - function _out_key($pretty=false,$url=false) { + /** + * Returns setting key, eventually with referer to config: namespace at dokuwiki.org + * + * @param bool $pretty create nice key + * @param bool $url provide url to config: namespace + * @return string key + */ + public function _out_key($pretty=false,$url=false) { if($pretty){ $out = str_replace(CM_KEYMARKER,"»",$this->_key); if ($url && !strstr($out,'»')) {//provide no urls for plugins, etc. diff --git a/sources/lib/plugins/config/settings/config.metadata.php b/sources/lib/plugins/config/settings/config.metadata.php index f9dabfe..aaa32cd 100644 --- a/sources/lib/plugins/config/settings/config.metadata.php +++ b/sources/lib/plugins/config/settings/config.metadata.php @@ -116,7 +116,7 @@ $meta['fullpath'] = array('onoff','_caution' => 'security'); $meta['typography'] = array('multichoice','_choices' => array(0,1,2)); $meta['dformat'] = array('string'); $meta['signature'] = array('string'); -$meta['showuseras'] = array('multichoice','_choices' => array('loginname','username','email','email_link')); +$meta['showuseras'] = array('multichoice','_choices' => array('loginname','username','username_link','email','email_link')); $meta['toptoclevel'] = array('multichoice','_choices' => array(1,2,3,4,5)); // 5 toc levels $meta['tocminheads'] = array('multichoice','_choices' => array(0,1,2,3,4,5,10,15,20)); $meta['maxtoclevel'] = array('multichoice','_choices' => array(0,1,2,3,4,5)); @@ -138,7 +138,7 @@ $meta['manager'] = array('string'); $meta['profileconfirm'] = array('onoff'); $meta['rememberme'] = array('onoff'); $meta['disableactions'] = array('disableactions', - '_choices' => array('backlink','index','recent','revisions','search','subscription','register','resendpwd','profile','profile_delete','edit','wikicode','check'), + '_choices' => array('backlink','index','recent','revisions','search','subscription','register','resendpwd','profile','profile_delete','edit','wikicode','check', 'rss'), '_combine' => array('subscription' => array('subscribe','unsubscribe'), 'wikicode' => array('source','export_raw'))); $meta['auth_security_timeout'] = array('numeric'); $meta['securecookie'] = array('onoff'); diff --git a/sources/lib/plugins/extension/action.php b/sources/lib/plugins/extension/action.php new file mode 100644 index 0000000..9e48f13 --- /dev/null +++ b/sources/lib/plugins/extension/action.php @@ -0,0 +1,85 @@ + + */ + +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); + +class action_plugin_extension extends DokuWiki_Action_Plugin { + + /** + * Registers a callback function for a given event + * + * @param Doku_Event_Handler $controller DokuWiki's event controller object + * @return void + */ + public function register(Doku_Event_Handler $controller) { + + $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'info'); + + } + + /** + * Create the detail info for a single plugin + * + * @param Doku_Event $event + * @param $param + */ + public function info(Doku_Event &$event, $param) { + global $USERINFO; + global $INPUT; + + if($event->data != 'plugin_extension') return; + $event->preventDefault(); + $event->stopPropagation(); + + if(empty($_SERVER['REMOTE_USER']) || !auth_isadmin($_SERVER['REMOTE_USER'], $USERINFO['grps'])) { + http_status(403); + echo 'Forbidden'; + exit; + } + + $ext = $INPUT->str('ext'); + if(!$ext) { + http_status(400); + echo 'no extension given'; + return; + } + + /** @var helper_plugin_extension_extension $extension */ + $extension = plugin_load('helper', 'extension_extension'); + $extension->setExtension($ext); + + $act = $INPUT->str('act'); + switch($act) { + case 'enable': + case 'disable': + $json = new JSON(); + $extension->$act(); //enables/disables + + $reverse = ($act == 'disable') ? 'enable' : 'disable'; + + $return = array( + 'state' => $act.'d', // isn't English wonderful? :-) + 'reverse' => $reverse, + 'label' => $extension->getLang('btn_'.$reverse) + ); + + header('Content-Type: application/json'); + echo $json->encode($return); + break; + + case 'info': + default: + /** @var helper_plugin_extension_list $list */ + $list = plugin_load('helper', 'extension_list'); + header('Content-Type: text/html; charset=utf-8'); + echo $list->make_info($extension); + } + } + +} + diff --git a/sources/lib/plugins/extension/admin.php b/sources/lib/plugins/extension/admin.php new file mode 100644 index 0000000..99c7484 --- /dev/null +++ b/sources/lib/plugins/extension/admin.php @@ -0,0 +1,155 @@ + + */ + +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); + +/** + * Admin part of the extension manager + */ +class admin_plugin_extension extends DokuWiki_Admin_Plugin { + protected $infoFor = null; + /** @var helper_plugin_extension_gui */ + protected $gui; + + /** + * Constructor + * + * loads additional helpers + */ + public function __construct() { + $this->gui = plugin_load('helper', 'extension_gui'); + } + + /** + * @return int sort number in admin menu + */ + public function getMenuSort() { + return 0; + } + + /** + * @return bool true if only access for superuser, false is for superusers and moderators + */ + public function forAdminOnly() { + return true; + } + + /** + * Execute the requested action(s) and initialize the plugin repository + */ + public function handle() { + global $INPUT; + // initialize the remote repository + /* @var helper_plugin_extension_repository $repository */ + $repository = $this->loadHelper('extension_repository'); + + if(!$repository->hasAccess()) { + $url = $this->gui->tabURL('', array('purge' => 1)); + msg($this->getLang('repo_error').' ['.$this->getLang('repo_retry').']', -1); + } + + /* @var helper_plugin_extension_extension $extension */ + $extension = $this->loadHelper('extension_extension'); + + try { + if($INPUT->post->has('fn') && checkSecurityToken()) { + $actions = $INPUT->post->arr('fn'); + foreach($actions as $action => $extensions) { + foreach($extensions as $extname => $label) { + switch($action) { + case 'install': + case 'reinstall': + case 'update': + $extension->setExtension($extname); + $installed = $extension->installOrUpdate(); + foreach($installed as $ext => $info) { + msg(sprintf($this->getLang('msg_'.$info['type'].'_'.$info['action'].'_success'), $info['base']), 1); + } + break; + case 'uninstall': + $extension->setExtension($extname); + $status = $extension->uninstall(); + if($status !== true) { + msg($status, -1); + } else { + msg(sprintf($this->getLang('msg_delete_success'), hsc($extension->getDisplayName())), 1); + } + break; + case 'enable'; + $extension->setExtension($extname); + $status = $extension->enable(); + if($status !== true) { + msg($status, -1); + } else { + msg(sprintf($this->getLang('msg_enabled'), hsc($extension->getDisplayName())), 1); + } + break; + case 'disable'; + $extension->setExtension($extname); + $status = $extension->disable(); + if($status !== true) { + msg($status, -1); + } else { + msg(sprintf($this->getLang('msg_disabled'), hsc($extension->getDisplayName())), 1); + } + break; + } + } + } + send_redirect($this->gui->tabURL('', array(), '&', true)); + } elseif($INPUT->post->str('installurl') && checkSecurityToken()) { + $installed = $extension->installFromURL($INPUT->post->str('installurl')); + foreach($installed as $ext => $info) { + msg(sprintf($this->getLang('msg_'.$info['type'].'_'.$info['action'].'_success'), $info['base']), 1); + } + send_redirect($this->gui->tabURL('', array(), '&', true)); + } elseif(isset($_FILES['installfile']) && checkSecurityToken()) { + $installed = $extension->installFromUpload('installfile'); + foreach($installed as $ext => $info) { + msg(sprintf($this->getLang('msg_'.$info['type'].'_'.$info['action'].'_success'), $info['base']), 1); + } + send_redirect($this->gui->tabURL('', array(), '&', true)); + } + + } catch(Exception $e) { + msg($e->getMessage(), -1); + send_redirect($this->gui->tabURL('', array(), '&', true)); + } + + } + + /** + * Render HTML output + */ + public function html() { + ptln('

'.$this->getLang('menu').'

'); + ptln('
'); + + $this->gui->tabNavigation(); + + switch($this->gui->currentTab()) { + case 'search': + $this->gui->tabSearch(); + break; + case 'templates': + $this->gui->tabTemplates(); + break; + case 'install': + $this->gui->tabInstall(); + break; + case 'plugins': + default: + $this->gui->tabPlugins(); + } + + ptln('
'); + } +} + +// vim:ts=4:sw=4:et: \ No newline at end of file diff --git a/sources/lib/plugins/extension/all.less b/sources/lib/plugins/extension/all.less new file mode 100644 index 0000000..3d9688e --- /dev/null +++ b/sources/lib/plugins/extension/all.less @@ -0,0 +1,37 @@ + +@media only screen and (max-width: 600px) { + +#extension__list .legend { + > div { + padding-left: 0; + } + + div.screenshot { + margin: 0 .5em .5em 0; + } + + h2 { + width: auto; + float: none; + } + + div.linkbar { + clear: left; + } +} + +[dir=rtl] #extension__list .legend { + > div { + padding-right: 0; + } + + div.screenshot { + margin: 0 0 .5em .5em; + } + + div.linkbar { + clear: right; + } +} + +} /* /@media */ diff --git a/sources/lib/plugins/extension/helper/extension.php b/sources/lib/plugins/extension/helper/extension.php new file mode 100644 index 0000000..7958cd2 --- /dev/null +++ b/sources/lib/plugins/extension/helper/extension.php @@ -0,0 +1,1093 @@ + + */ + +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); +if(!defined('DOKU_TPLLIB')) define('DOKU_TPLLIB', DOKU_INC.'lib/tpl/'); + +/** + * Class helper_plugin_extension_extension represents a single extension (plugin or template) + */ +class helper_plugin_extension_extension extends DokuWiki_Plugin { + private $id; + private $base; + private $is_template = false; + private $localInfo; + private $remoteInfo; + private $managerData; + /** @var helper_plugin_extension_repository $repository */ + private $repository = null; + + /** @var array list of temporary directories */ + private $temporary = array(); + + /** + * Destructor + * + * deletes any dangling temporary directories + */ + public function __destruct() { + foreach($this->temporary as $dir){ + io_rmdir($dir, true); + } + } + + /** + * @return bool false, this component is not a singleton + */ + public function isSingleton() { + return false; + } + + /** + * Set the name of the extension this instance shall represents, triggers loading the local and remote data + * + * @param string $id The id of the extension (prefixed with template: for templates) + * @return bool If some (local or remote) data was found + */ + public function setExtension($id) { + $this->id = $id; + $this->base = $id; + + if(substr($id, 0 , 9) == 'template:'){ + $this->base = substr($id, 9); + $this->is_template = true; + } + + $this->localInfo = array(); + $this->managerData = array(); + $this->remoteInfo = array(); + + if ($this->isInstalled()) { + $this->readLocalData(); + $this->readManagerData(); + } + + if ($this->repository == null) { + $this->repository = $this->loadHelper('extension_repository'); + } + + $this->remoteInfo = $this->repository->getData($this->getID()); + + return ($this->localInfo || $this->remoteInfo); + } + + /** + * If the extension is installed locally + * + * @return bool If the extension is installed locally + */ + public function isInstalled() { + return is_dir($this->getInstallDir()); + } + + /** + * If the extension is under git control + * + * @return bool + */ + public function isGitControlled() { + if(!$this->isInstalled()) return false; + return is_dir($this->getInstallDir().'/.git'); + } + + /** + * If the extension is bundled + * + * @return bool If the extension is bundled + */ + public function isBundled() { + if (!empty($this->remoteInfo['bundled'])) return $this->remoteInfo['bundled']; + return in_array($this->base, + array( + 'authad', 'authldap', 'authmysql', 'authpgsql', 'authplain', 'acl', 'info', 'extension', + 'revert', 'popularity', 'config', 'safefnrecode', 'testing', 'template:dokuwiki' + ) + ); + } + + /** + * If the extension is protected against any modification (disable/uninstall) + * + * @return bool if the extension is protected + */ + public function isProtected() { + // never allow deinstalling the current auth plugin: + global $conf; + if ($this->id == $conf['authtype']) return true; + + /** @var Doku_Plugin_Controller $plugin_controller */ + global $plugin_controller; + $cascade = $plugin_controller->getCascade(); + return (isset($cascade['protected'][$this->id]) && $cascade['protected'][$this->id]); + } + + /** + * If the extension is installed in the correct directory + * + * @return bool If the extension is installed in the correct directory + */ + public function isInWrongFolder() { + return $this->base != $this->getBase(); + } + + /** + * If the extension is enabled + * + * @return bool If the extension is enabled + */ + public function isEnabled() { + global $conf; + if($this->isTemplate()){ + return ($conf['template'] == $this->getBase()); + } + + /* @var Doku_Plugin_Controller $plugin_controller */ + global $plugin_controller; + return !$plugin_controller->isdisabled($this->base); + } + + /** + * If the extension should be updated, i.e. if an updated version is available + * + * @return bool If an update is available + */ + public function updateAvailable() { + if(!$this->isInstalled()) return false; + if($this->isBundled()) return false; + $lastupdate = $this->getLastUpdate(); + if ($lastupdate === false) return false; + $installed = $this->getInstalledVersion(); + if ($installed === false || $installed === $this->getLang('unknownversion')) return true; + return $this->getInstalledVersion() < $this->getLastUpdate(); + } + + /** + * If the extension is a template + * + * @return bool If this extension is a template + */ + public function isTemplate() { + return $this->is_template; + } + + /** + * Get the ID of the extension + * + * This is the same as getName() for plugins, for templates it's getName() prefixed with 'template:' + * + * @return string + */ + public function getID() { + return $this->id; + } + + /** + * Get the name of the installation directory + * + * @return string The name of the installation directory + */ + public function getInstallName() { + return $this->base; + } + + // Data from plugin.info.txt/template.info.txt or the repo when not available locally + /** + * Get the basename of the extension + * + * @return string The basename + */ + public function getBase() { + if (!empty($this->localInfo['base'])) return $this->localInfo['base']; + return $this->base; + } + + /** + * Get the display name of the extension + * + * @return string The display name + */ + public function getDisplayName() { + if (!empty($this->localInfo['name'])) return $this->localInfo['name']; + if (!empty($this->remoteInfo['name'])) return $this->remoteInfo['name']; + return $this->base; + } + + /** + * Get the author name of the extension + * + * @return string|bool The name of the author or false if there is none + */ + public function getAuthor() { + if (!empty($this->localInfo['author'])) return $this->localInfo['author']; + if (!empty($this->remoteInfo['author'])) return $this->remoteInfo['author']; + return false; + } + + /** + * Get the email of the author of the extension if there is any + * + * @return string|bool The email address or false if there is none + */ + public function getEmail() { + // email is only in the local data + if (!empty($this->localInfo['email'])) return $this->localInfo['email']; + return false; + } + + /** + * Get the email id, i.e. the md5sum of the email + * + * @return string|bool The md5sum of the email if there is any, false otherwise + */ + public function getEmailID() { + if (!empty($this->remoteInfo['emailid'])) return $this->remoteInfo['emailid']; + if (!empty($this->localInfo['email'])) return md5($this->localInfo['email']); + return false; + } + + /** + * Get the description of the extension + * + * @return string The description + */ + public function getDescription() { + if (!empty($this->localInfo['desc'])) return $this->localInfo['desc']; + if (!empty($this->remoteInfo['description'])) return $this->remoteInfo['description']; + return ''; + } + + /** + * Get the URL of the extension, usually a page on dokuwiki.org + * + * @return string The URL + */ + public function getURL() { + if (!empty($this->localInfo['url'])) return $this->localInfo['url']; + return 'https://www.dokuwiki.org/'.($this->isTemplate() ? 'template' : 'plugin').':'.$this->getBase(); + } + + /** + * Get the installed version of the extension + * + * @return string|bool The version, usually in the form yyyy-mm-dd if there is any + */ + public function getInstalledVersion() { + if (!empty($this->localInfo['date'])) return $this->localInfo['date']; + if ($this->isInstalled()) return $this->getLang('unknownversion'); + return false; + } + + /** + * Get the install date of the current version + * + * @return string|bool The date of the last update or false if not available + */ + public function getUpdateDate() { + if (!empty($this->managerData['updated'])) return $this->managerData['updated']; + return false; + } + + /** + * Get the date of the installation of the plugin + * + * @return string|bool The date of the installation or false if not available + */ + public function getInstallDate() { + if (!empty($this->managerData['installed'])) return $this->managerData['installed']; + return false; + } + + /** + * Get the names of the dependencies of this extension + * + * @return array The base names of the dependencies + */ + public function getDependencies() { + if (!empty($this->remoteInfo['dependencies'])) return $this->remoteInfo['dependencies']; + return array(); + } + + /** + * Get the names of the missing dependencies + * + * @return array The base names of the missing dependencies + */ + public function getMissingDependencies() { + /* @var Doku_Plugin_Controller $plugin_controller */ + global $plugin_controller; + $dependencies = $this->getDependencies(); + $missing_dependencies = array(); + foreach ($dependencies as $dependency) { + if ($plugin_controller->isdisabled($dependency)) { + $missing_dependencies[] = $dependency; + } + } + return $missing_dependencies; + } + + /** + * Get the names of all conflicting extensions + * + * @return array The names of the conflicting extensions + */ + public function getConflicts() { + if (!empty($this->remoteInfo['conflicts'])) return $this->remoteInfo['dependencies']; + return array(); + } + + /** + * Get the names of similar extensions + * + * @return array The names of similar extensions + */ + public function getSimilarExtensions() { + if (!empty($this->remoteInfo['similar'])) return $this->remoteInfo['similar']; + return array(); + } + + /** + * Get the names of the tags of the extension + * + * @return array The names of the tags of the extension + */ + public function getTags() { + if (!empty($this->remoteInfo['tags'])) return $this->remoteInfo['tags']; + return array(); + } + + /** + * Get the popularity information as floating point number [0,1] + * + * @return float|bool The popularity information or false if it isn't available + */ + public function getPopularity() { + if (!empty($this->remoteInfo['popularity'])) return $this->remoteInfo['popularity']; + return false; + } + + + /** + * Get the text of the security warning if there is any + * + * @return string|bool The security warning if there is any, false otherwise + */ + public function getSecurityWarning() { + if (!empty($this->remoteInfo['securitywarning'])) return $this->remoteInfo['securitywarning']; + return false; + } + + /** + * Get the text of the security issue if there is any + * + * @return string|bool The security issue if there is any, false otherwise + */ + public function getSecurityIssue() { + if (!empty($this->remoteInfo['securityissue'])) return $this->remoteInfo['securityissue']; + return false; + } + + /** + * Get the URL of the screenshot of the extension if there is any + * + * @return string|bool The screenshot URL if there is any, false otherwise + */ + public function getScreenshotURL() { + if (!empty($this->remoteInfo['screenshoturl'])) return $this->remoteInfo['screenshoturl']; + return false; + } + + /** + * Get the URL of the thumbnail of the extension if there is any + * + * @return string|bool The thumbnail URL if there is any, false otherwise + */ + public function getThumbnailURL() { + if (!empty($this->remoteInfo['thumbnailurl'])) return $this->remoteInfo['thumbnailurl']; + return false; + } + /** + * Get the last used download URL of the extension if there is any + * + * @return string|bool The previously used download URL, false if the extension has been installed manually + */ + public function getLastDownloadURL() { + if (!empty($this->managerData['downloadurl'])) return $this->managerData['downloadurl']; + return false; + } + + /** + * Get the download URL of the extension if there is any + * + * @return string|bool The download URL if there is any, false otherwise + */ + public function getDownloadURL() { + if (!empty($this->remoteInfo['downloadurl'])) return $this->remoteInfo['downloadurl']; + return false; + } + + /** + * If the download URL has changed since the last download + * + * @return bool If the download URL has changed + */ + public function hasDownloadURLChanged() { + $lasturl = $this->getLastDownloadURL(); + $currenturl = $this->getDownloadURL(); + return ($lasturl && $currenturl && $lasturl != $currenturl); + } + + /** + * Get the bug tracker URL of the extension if there is any + * + * @return string|bool The bug tracker URL if there is any, false otherwise + */ + public function getBugtrackerURL() { + if (!empty($this->remoteInfo['bugtracker'])) return $this->remoteInfo['bugtracker']; + return false; + } + + /** + * Get the URL of the source repository if there is any + * + * @return string|bool The URL of the source repository if there is any, false otherwise + */ + public function getSourcerepoURL() { + if (!empty($this->remoteInfo['sourcerepo'])) return $this->remoteInfo['sourcerepo']; + return false; + } + + /** + * Get the donation URL of the extension if there is any + * + * @return string|bool The donation URL if there is any, false otherwise + */ + public function getDonationURL() { + if (!empty($this->remoteInfo['donationurl'])) return $this->remoteInfo['donationurl']; + return false; + } + + /** + * Get the extension type(s) + * + * @return array The type(s) as array of strings + */ + public function getTypes() { + if (!empty($this->remoteInfo['types'])) return $this->remoteInfo['types']; + if ($this->isTemplate()) return array(32 => 'template'); + return array(); + } + + /** + * Get a list of all DokuWiki versions this extension is compatible with + * + * @return array The versions in the form yyyy-mm-dd => ('label' => label, 'implicit' => implicit) + */ + public function getCompatibleVersions() { + if (!empty($this->remoteInfo['compatible'])) return $this->remoteInfo['compatible']; + return array(); + } + + /** + * Get the date of the last available update + * + * @return string|bool The last available update in the form yyyy-mm-dd if there is any, false otherwise + */ + public function getLastUpdate() { + if (!empty($this->remoteInfo['lastupdate'])) return $this->remoteInfo['lastupdate']; + return false; + } + + /** + * Get the base path of the extension + * + * @return string The base path of the extension + */ + public function getInstallDir() { + if ($this->isTemplate()) { + return DOKU_TPLLIB.$this->base; + } else { + return DOKU_PLUGIN.$this->base; + } + } + + /** + * The type of extension installation + * + * @return string One of "none", "manual", "git" or "automatic" + */ + public function getInstallType() { + if (!$this->isInstalled()) return 'none'; + if (!empty($this->managerData)) return 'automatic'; + if (is_dir($this->getInstallDir().'/.git')) return 'git'; + return 'manual'; + } + + /** + * If the extension can probably be installed/updated or uninstalled + * + * @return bool|string True or error string + */ + public function canModify() { + if($this->isInstalled()) { + if(!is_writable($this->getInstallDir())) { + return 'noperms'; + } + } + + if($this->isTemplate() && !is_writable(DOKU_TPLLIB)) { + return 'notplperms'; + + } elseif(!is_writable(DOKU_PLUGIN)) { + return 'nopluginperms'; + } + return true; + } + + /** + * Install an extension from a user upload + * + * @param string $field name of the upload file + * @throws Exception when something goes wrong + * @return array The list of installed extensions + */ + public function installFromUpload($field){ + if($_FILES[$field]['error']){ + throw new Exception($this->getLang('msg_upload_failed').' ('.$_FILES[$field]['error'].')'); + } + + $tmp = $this->mkTmpDir(); + if(!$tmp) throw new Exception($this->getLang('error_dircreate')); + + // filename may contain the plugin name for old style plugins... + $basename = basename($_FILES[$field]['name']); + $basename = preg_replace('/\.(tar\.gz|tar\.bz|tar\.bz2|tar|tgz|tbz|zip)$/', '', $basename); + $basename = preg_replace('/[\W]+/', '', $basename); + + if(!move_uploaded_file($_FILES[$field]['tmp_name'], "$tmp/upload.archive")){ + throw new Exception($this->getLang('msg_upload_failed')); + } + + try { + $installed = $this->installArchive("$tmp/upload.archive", true, $basename); + // purge cache + $this->purgeCache(); + }catch (Exception $e){ + throw $e; + } + return $installed; + } + + /** + * Install an extension from a remote URL + * + * @param string $url + * @throws Exception when something goes wrong + * @return array The list of installed extensions + */ + public function installFromURL($url){ + try { + $path = $this->download($url); + $installed = $this->installArchive($path, true); + + // purge caches + foreach($installed as $ext => $info){ + $this->setExtension($ext); + $this->purgeCache(); + } + }catch (Exception $e){ + throw $e; + } + return $installed; + } + + /** + * Install or update the extension + * + * @throws \Exception when something goes wrong + * @return array The list of installed extensions + */ + public function installOrUpdate() { + $path = $this->download($this->getDownloadURL()); + $installed = $this->installArchive($path, $this->isInstalled(), $this->getBase()); + + // refresh extension information + if (!isset($installed[$this->getID()])) { + throw new Exception('Error, the requested extension hasn\'t been installed or updated'); + } + $this->setExtension($this->getID()); + $this->purgeCache(); + return $installed; + } + + /** + * Uninstall the extension + * + * @return bool If the plugin was sucessfully uninstalled + */ + public function uninstall() { + $this->purgeCache(); + return io_rmdir($this->getInstallDir(), true); + } + + /** + * Enable the extension + * + * @return bool|string True or an error message + */ + public function enable() { + if ($this->isTemplate()) return $this->getLang('notimplemented'); + if (!$this->isInstalled()) return $this->getLang('notinstalled'); + if ($this->isEnabled()) return $this->getLang('alreadyenabled'); + + /* @var Doku_Plugin_Controller $plugin_controller */ + global $plugin_controller; + if ($plugin_controller->enable($this->base)) { + $this->purgeCache(); + return true; + } else { + return $this->getLang('pluginlistsaveerror'); + } + } + + /** + * Disable the extension + * + * @return bool|string True or an error message + */ + public function disable() { + if ($this->isTemplate()) return $this->getLang('notimplemented'); + + /* @var Doku_Plugin_Controller $plugin_controller */ + global $plugin_controller; + if (!$this->isInstalled()) return $this->getLang('notinstalled'); + if (!$this->isEnabled()) return $this->getLang('alreadydisabled'); + if ($plugin_controller->disable($this->base)) { + $this->purgeCache(); + return true; + } else { + return $this->getLang('pluginlistsaveerror'); + } + } + + /** + * Purge the cache by touching the main configuration file + */ + protected function purgeCache() { + global $config_cascade; + + // expire dokuwiki caches + // touching local.php expires wiki page, JS and CSS caches + @touch(reset($config_cascade['main']['local'])); + } + + /** + * Read local extension data either from info.txt or getInfo() + */ + protected function readLocalData() { + if ($this->isTemplate()) { + $infopath = $this->getInstallDir().'/template.info.txt'; + } else { + $infopath = $this->getInstallDir().'/plugin.info.txt'; + } + + if (is_readable($infopath)) { + $this->localInfo = confToHash($infopath); + } elseif (!$this->isTemplate() && $this->isEnabled()) { + global $plugin_types; + $path = $this->getInstallDir().'/'; + $plugin = null; + + foreach($plugin_types as $type) { + if(@file_exists($path.$type.'.php')) { + $plugin = plugin_load($type, $this->base); + if ($plugin) break; + } + + if($dh = @opendir($path.$type.'/')) { + while(false !== ($cp = readdir($dh))) { + if($cp == '.' || $cp == '..' || strtolower(substr($cp, -4)) != '.php') continue; + + $plugin = plugin_load($type, $this->base.'_'.substr($cp, 0, -4)); + if ($plugin) break; + } + if ($plugin) break; + closedir($dh); + } + } + + if ($plugin) { + /* @var DokuWiki_Plugin $plugin */ + $this->localInfo = $plugin->getInfo(); + } + } + } + + /** + * Read the manager.dat file + */ + protected function readManagerData() { + $managerpath = $this->getInstallDir().'/manager.dat'; + if (is_readable($managerpath)) { + $file = @file($managerpath); + if(!empty($file)) { + foreach($file as $line) { + list($key, $value) = explode('=', trim($line, DOKU_LF), 2); + $key = trim($key); + $value = trim($value); + // backwards compatible with old plugin manager + if($key == 'url') $key = 'downloadurl'; + $this->managerData[$key] = $value; + } + } + } + } + + /** + * Write the manager.data file + */ + protected function writeManagerData() { + $managerpath = $this->getInstallDir().'/manager.dat'; + $data = ''; + foreach ($this->managerData as $k => $v) { + $data .= $k.'='.$v.DOKU_LF; + } + io_saveFile($managerpath, $data); + } + + /** + * Returns a temporary directory + * + * The directory is registered for cleanup when the class is destroyed + * + * @return bool|string + */ + protected function mkTmpDir(){ + $dir = io_mktmpdir(); + if(!$dir) return false; + $this->temporary[] = $dir; + return $dir; + } + + /** + * Download an archive to a protected path + * + * @param string $url The url to get the archive from + * @throws Exception when something goes wrong + * @return string The path where the archive was saved + */ + public function download($url) { + // check the url + if(!preg_match('/https?:\/\//i', $url)){ + throw new Exception($this->getLang('error_badurl')); + } + + // try to get the file from the path (used as plugin name fallback) + $file = parse_url($url, PHP_URL_PATH); + if(is_null($file)){ + $file = md5($url); + }else{ + $file = utf8_basename($file); + } + + // create tmp directory for download + if(!($tmp = $this->mkTmpDir())) { + throw new Exception($this->getLang('error_dircreate')); + } + + // download + if(!$file = io_download($url, $tmp.'/', true, $file, 0)) { + io_rmdir($tmp, true); + throw new Exception(sprintf($this->getLang('error_download'), ''.hsc($url).'')); + } + + return $tmp.'/'.$file; + } + + /** + * @param string $file The path to the archive that shall be installed + * @param bool $overwrite If an already installed plugin should be overwritten + * @param string $base The basename of the plugin if it's known + * @throws Exception when something went wrong + * @return array list of installed extensions + */ + public function installArchive($file, $overwrite=false, $base = '') { + $installed_extensions = array(); + + // create tmp directory for decompression + if(!($tmp = $this->mkTmpDir())) { + throw new Exception($this->getLang('error_dircreate')); + } + + // add default base folder if specified to handle case where zip doesn't contain this + if($base && !@mkdir($tmp.'/'.$base)) { + throw new Exception($this->getLang('error_dircreate')); + } + + // decompress + $this->decompress($file, "$tmp/".$base); + + // search $tmp/$base for the folder(s) that has been created + // move the folder(s) to lib/.. + $result = array('old'=>array(), 'new'=>array()); + $default = ($this->isTemplate() ? 'template' : 'plugin'); + if(!$this->find_folders($result, $tmp.'/'.$base, $default)) { + throw new Exception($this->getLang('error_findfolder')); + } + + // choose correct result array + if(count($result['new'])) { + $install = $result['new']; + }else{ + $install = $result['old']; + } + + if(!count($install)){ + throw new Exception($this->getLang('error_findfolder')); + } + + // now install all found items + foreach($install as $item) { + // where to install? + if($item['type'] == 'template') { + $target_base_dir = DOKU_TPLLIB; + }else{ + $target_base_dir = DOKU_PLUGIN; + } + + if(!empty($item['base'])) { + // use base set in info.txt + } elseif($base && count($install) == 1) { + $item['base'] = $base; + } else { + // default - use directory as found in zip + // plugins from github/master without *.info.txt will install in wrong folder + // but using $info->id will make 'code3' fail (which should install in lib/code/..) + $item['base'] = basename($item['tmp']); + } + + // check to make sure we aren't overwriting anything + $target = $target_base_dir.$item['base']; + if(!$overwrite && @file_exists($target)) { + // TODO remember our settings, ask the user to confirm overwrite + continue; + } + + $action = @file_exists($target) ? 'update' : 'install'; + + // copy action + if($this->dircopy($item['tmp'], $target)) { + // return info + $id = $item['base']; + if($item['type'] == 'template') $id = 'template:'.$id; + $installed_extensions[$id] = array( + 'base' => $item['base'], + 'type' => $item['type'], + 'action' => $action + ); + } else { + throw new Exception(sprintf($this->getLang('error_copy').DOKU_LF, ''.$item['base'].'')); + } + } + + // cleanup + if($tmp) io_rmdir($tmp, true); + + return $installed_extensions; + } + + /** + * Find out what was in the extracted directory + * + * Correct folders are searched recursively using the "*.info.txt" configs + * as indicator for a root folder. When such a file is found, it's base + * setting is used (when set). All folders found by this method are stored + * in the 'new' key of the $result array. + * + * For backwards compatibility all found top level folders are stored as + * in the 'old' key of the $result array. + * + * When no items are found in 'new' the copy mechanism should fall back + * the 'old' list. + * + * @author Andreas Gohr + * @param array $result - results are stored here + * @param string $directory - the temp directory where the package was unpacked to + * @param string $default_type - type used if no info.txt available + * @param string $subdir - a subdirectory. do not set. used by recursion + * @return bool - false on error + */ + protected function find_folders(&$result, $directory, $default_type='plugin', $subdir='') { + $this_dir = "$directory$subdir"; + $dh = @opendir($this_dir); + if(!$dh) return false; + + $found_dirs = array(); + $found_files = 0; + $found_template_parts = 0; + while (false !== ($f = readdir($dh))) { + if($f == '.' || $f == '..') continue; + + if(is_dir("$this_dir/$f")) { + $found_dirs[] = "$subdir/$f"; + + } else { + // it's a file -> check for config + $found_files++; + switch ($f) { + case 'plugin.info.txt': + case 'template.info.txt': + // we have found a clear marker, save and return + $info = array(); + $type = explode('.', $f, 2); + $info['type'] = $type[0]; + $info['tmp'] = $this_dir; + $conf = confToHash("$this_dir/$f"); + $info['base'] = basename($conf['base']); + $result['new'][] = $info; + return true; + + case 'main.php': + case 'details.php': + case 'mediamanager.php': + case 'style.ini': + $found_template_parts++; + break; + } + } + } + closedir($dh); + + // files where found but no info.txt - use old method + if($found_files){ + $info = array(); + $info['tmp'] = $this_dir; + // does this look like a template or should we use the default type? + if($found_template_parts >= 2) { + $info['type'] = 'template'; + } else { + $info['type'] = $default_type; + } + + $result['old'][] = $info; + return true; + } + + // we have no files yet -> recurse + foreach ($found_dirs as $found_dir) { + $this->find_folders($result, $directory, $default_type, "$found_dir"); + } + return true; + } + + /** + * Decompress a given file to the given target directory + * + * Determines the compression type from the file extension + * + * @param string $file archive to extract + * @param string $target directory to extract to + * @throws Exception + * @return bool + */ + private function decompress($file, $target) { + // decompression library doesn't like target folders ending in "/" + if(substr($target, -1) == "/") $target = substr($target, 0, -1); + + $ext = $this->guess_archive($file); + if(in_array($ext, array('tar', 'bz', 'gz'))) { + switch($ext) { + case 'bz': + $compress_type = Tar::COMPRESS_BZIP; + break; + case 'gz': + $compress_type = Tar::COMPRESS_GZIP; + break; + default: + $compress_type = Tar::COMPRESS_NONE; + } + + $tar = new Tar(); + try { + $tar->open($file, $compress_type); + $tar->extract($target); + } catch (Exception $e) { + throw new Exception($this->getLang('error_decompress').' '.$e->getMessage()); + } + + return true; + } elseif($ext == 'zip') { + + $zip = new ZipLib(); + $ok = $zip->Extract($file, $target); + + if($ok == -1){ + throw new Exception($this->getLang('error_decompress').' Error extracting the zip archive'); + } + + return true; + } + + // the only case when we don't get one of the recognized archive types is when the archive file can't be read + throw new Exception($this->getLang('error_decompress').' Couldn\'t read archive file'); + } + + /** + * Determine the archive type of the given file + * + * Reads the first magic bytes of the given file for content type guessing, + * if neither bz, gz or zip are recognized, tar is assumed. + * + * @author Andreas Gohr + * @param string $file The file to analyze + * @return string|bool false if the file can't be read, otherwise an "extension" + */ + private function guess_archive($file) { + $fh = fopen($file, 'rb'); + if(!$fh) return false; + $magic = fread($fh, 5); + fclose($fh); + + if(strpos($magic, "\x42\x5a") === 0) return 'bz'; + if(strpos($magic, "\x1f\x8b") === 0) return 'gz'; + if(strpos($magic, "\x50\x4b\x03\x04") === 0) return 'zip'; + return 'tar'; + } + + /** + * Copy with recursive sub-directory support + */ + private function dircopy($src, $dst) { + global $conf; + + if(is_dir($src)) { + if(!$dh = @opendir($src)) return false; + + if($ok = io_mkdir_p($dst)) { + while ($ok && (false !== ($f = readdir($dh)))) { + if($f == '..' || $f == '.') continue; + $ok = $this->dircopy("$src/$f", "$dst/$f"); + } + } + + closedir($dh); + return $ok; + + } else { + $exists = @file_exists($dst); + + if(!@copy($src, $dst)) return false; + if(!$exists && !empty($conf['fperm'])) chmod($dst, $conf['fperm']); + @touch($dst, filemtime($src)); + } + + return true; + } +} + +// vim:ts=4:sw=4:et: diff --git a/sources/lib/plugins/extension/helper/gui.php b/sources/lib/plugins/extension/helper/gui.php new file mode 100644 index 0000000..3a0f0c5 --- /dev/null +++ b/sources/lib/plugins/extension/helper/gui.php @@ -0,0 +1,193 @@ + + */ + +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); + +/** + * Class helper_plugin_extension_list takes care of the overall GUI + */ +class helper_plugin_extension_gui extends DokuWiki_Plugin { + + protected $tabs = array('plugins', 'templates', 'search', 'install'); + + /** @var string the extension that should have an open info window FIXME currently broken */ + protected $infoFor = ''; + + /** + * Constructor + * + * initializes requested info window + */ + public function __construct() { + global $INPUT; + $this->infoFor = $INPUT->str('info'); + } + + /** + * display the plugin tab + */ + public function tabPlugins() { + /* @var Doku_Plugin_Controller $plugin_controller */ + global $plugin_controller; + + echo '
'; + echo $this->locale_xhtml('intro_plugins'); + echo '
'; + + $pluginlist = $plugin_controller->getList('', true); + sort($pluginlist); + /* @var helper_plugin_extension_extension $extension */ + $extension = $this->loadHelper('extension_extension'); + /* @var helper_plugin_extension_list $list */ + $list = $this->loadHelper('extension_list'); + $list->start_form(); + foreach($pluginlist as $name) { + $extension->setExtension($name); + $list->add_row($extension, $extension->getID() == $this->infoFor); + } + $list->end_form(); + $list->render(); + } + + /** + * Display the template tab + */ + public function tabTemplates() { + echo '
'; + echo $this->locale_xhtml('intro_templates'); + echo '
'; + + // FIXME do we have a real way? + $tpllist = glob(DOKU_INC.'lib/tpl/*', GLOB_ONLYDIR); + $tpllist = array_map('basename', $tpllist); + sort($tpllist); + + /* @var helper_plugin_extension_extension $extension */ + $extension = $this->loadHelper('extension_extension'); + /* @var helper_plugin_extension_list $list */ + $list = $this->loadHelper('extension_list'); + $list->start_form(); + foreach($tpllist as $name) { + $extension->setExtension("template:$name"); + $list->add_row($extension, $extension->getID() == $this->infoFor); + } + $list->end_form(); + $list->render(); + } + + /** + * Display the search tab + */ + public function tabSearch() { + global $INPUT; + echo '
'; + echo $this->locale_xhtml('intro_search'); + echo '
'; + + $form = new Doku_Form(array('action' => $this->tabURL('', array(), '&'), 'class' => 'search')); + $form->addElement(form_makeTextField('q', $INPUT->str('q'), $this->getLang('search_for'))); + $form->addElement(form_makeButton('submit', '', $this->getLang('search'))); + $form->printForm(); + + if(!$INPUT->bool('q')) return; + + /* @var helper_plugin_extension_repository $repository FIXME should we use some gloabl instance? */ + $repository = $this->loadHelper('extension_repository'); + $result = $repository->search($INPUT->str('q')); + + /* @var helper_plugin_extension_extension $extension */ + $extension = $this->loadHelper('extension_extension'); + /* @var helper_plugin_extension_list $list */ + $list = $this->loadHelper('extension_list'); + $list->start_form(); + if($result){ + foreach($result as $name) { + $extension->setExtension($name); + $list->add_row($extension, $extension->getID() == $this->infoFor); + } + } else { + $list->nothing_found(); + } + $list->end_form(); + $list->render(); + + } + + /** + * Display the template tab + */ + public function tabInstall() { + echo '
'; + echo $this->locale_xhtml('intro_install'); + echo '
'; + + $form = new Doku_Form(array('action' => $this->tabURL('', array(), '&'), 'enctype' => 'multipart/form-data', 'class' => 'install')); + $form->addElement(form_makeTextField('installurl', '', $this->getLang('install_url'), '', 'block')); + $form->addElement(form_makeFileField('installfile', $this->getLang('install_upload'), '', 'block')); + $form->addElement(form_makeButton('submit', '', $this->getLang('btn_install'))); + $form->printForm(); + } + + /** + * Print the tab navigation + * + * @fixme style active one + */ + public function tabNavigation() { + echo '
    '; + foreach($this->tabs as $tab) { + $url = $this->tabURL($tab); + if($this->currentTab() == $tab) { + $class = 'class="active"'; + } else { + $class = ''; + } + echo '
  • '.$this->getLang('tab_'.$tab).'
  • '; + } + echo '
'; + } + + /** + * Return the currently selected tab + * + * @return string + */ + public function currentTab() { + global $INPUT; + + $tab = $INPUT->str('tab', 'plugins', true); + if(!in_array($tab, $this->tabs)) $tab = 'plugins'; + return $tab; + } + + /** + * Create an URL inside the extension manager + * + * @param string $tab tab to load, empty for current tab + * @param array $params associative array of parameter to set + * @param string $sep seperator to build the URL + * @param bool $absolute create absolute URLs? + * @return string + */ + public function tabURL($tab = '', $params = array(), $sep = '&', $absolute = false) { + global $ID; + global $INPUT; + + if(!$tab) $tab = $this->currentTab(); + $defaults = array( + 'do' => 'admin', + 'page' => 'extension', + 'tab' => $tab, + ); + if($tab == 'search') $defaults['q'] = $INPUT->str('q'); + + return wl($ID, array_merge($defaults, $params), $absolute, $sep); + } + +} diff --git a/sources/lib/plugins/extension/helper/list.php b/sources/lib/plugins/extension/helper/list.php new file mode 100644 index 0000000..47edca8 --- /dev/null +++ b/sources/lib/plugins/extension/helper/list.php @@ -0,0 +1,568 @@ + + */ + +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); + +/** + * Class helper_plugin_extension_list takes care of creating a HTML list of extensions + */ +class helper_plugin_extension_list extends DokuWiki_Plugin { + protected $form = ''; + /** @var helper_plugin_extension_gui */ + protected $gui; + + /** + * Constructor + * + * loads additional helpers + */ + public function __construct(){ + $this->gui = plugin_load('helper', 'extension_gui'); + } + + function start_form() { + $this->form .= '
'; + $hidden = array( + 'do'=>'admin', + 'page'=>'extension', + 'sectok'=>getSecurityToken() + ); + $this->add_hidden($hidden); + $this->form .= '
    '; + } + /** + * Build single row of extension table + * @param helper_plugin_extension_extension $extension The extension that shall be added + * @param bool $showinfo Show the info area + */ + function add_row(helper_plugin_extension_extension $extension, $showinfo = false) { + $this->start_row($extension); + $this->populate_column('legend', $this->make_legend($extension, $showinfo)); + $this->populate_column('actions', $this->make_actions($extension)); + $this->end_row(); + } + + /** + * Adds a header to the form + * + * @param string $id The id of the header + * @param string $header The content of the header + * @param int $level The level of the header + */ + function add_header($id, $header, $level = 2) { + $this->form .=''.hsc($header).''.DOKU_LF; + } + + /** + * Adds a paragraph to the form + * + * @param string $data The content + */ + function add_p($data) { + $this->form .= '

    '.hsc($data).'

    '.DOKU_LF; + } + + /** + * Add hidden fields to the form with the given data + * @param array $array + */ + function add_hidden(array $array) { + $this->form .= '
    '; + foreach ($array as $key => $value) { + $this->form .= ''; + } + $this->form .= '
    '.DOKU_LF; + } + + /** + * Add closing tags + */ + function end_form() { + $this->form .= '
'; + $this->form .= '
'.DOKU_LF; + } + + /** + * Show message when no results are found + */ + function nothing_found() { + global $lang; + $this->form .= '
  • '.$lang['nothingfound'].'
  • '; + } + + /** + * Print the form + */ + function render() { + echo $this->form; + } + + /** + * Start the HTML for the row for the extension + * + * @param helper_plugin_extension_extension $extension The extension + */ + private function start_row(helper_plugin_extension_extension $extension) { + $this->form .= '
  • '; + } + + /** + * Add a column with the given class and content + * @param string $class The class name + * @param string $html The content + */ + private function populate_column($class, $html) { + $this->form .= '
    '.$html.'
    '.DOKU_LF; + } + + /** + * End the row + */ + private function end_row() { + $this->form .= '
  • '.DOKU_LF; + } + + /** + * Generate the link to the plugin homepage + * + * @param helper_plugin_extension_extension $extension The extension + * @return string The HTML code + */ + function make_homepagelink(helper_plugin_extension_extension $extension) { + $text = $this->getLang('homepage_link'); + $url = hsc($extension->getURL()); + return ''.$text.' '; + } + + /** + * Generate the class name for the row of the extensio + * + * @param helper_plugin_extension_extension $extension The extension object + * @return string The class name + */ + function make_class(helper_plugin_extension_extension $extension) { + $class = ($extension->isTemplate()) ? 'template' : 'plugin'; + if($extension->isInstalled()) { + $class.=' installed'; + $class.= ($extension->isEnabled()) ? ' enabled':' disabled'; + } + if(!$extension->canModify()) $class.= ' notselect'; + if($extension->isProtected()) $class.= ' protected'; + //if($this->showinfo) $class.= ' showinfo'; + return $class; + } + + /** + * Generate a link to the author of the extension + * + * @param helper_plugin_extension_extension $extension The extension object + * @return string The HTML code of the link + */ + function make_author(helper_plugin_extension_extension $extension) { + global $ID; + + if($extension->getAuthor()) { + + $mailid = $extension->getEmailID(); + if($mailid){ + $url = $this->gui->tabURL('search', array('q' => 'authorid:'.$mailid)); + return ' '.hsc($extension->getAuthor()).''; + + }else{ + return ''.hsc($extension->getAuthor()).''; + } + } + return "".$this->getLang('unknown_author')."".DOKU_LF; + } + + /** + * Get the link and image tag for the screenshot/thumbnail + * + * @param helper_plugin_extension_extension $extension The extension object + * @return string The HTML code + */ + function make_screenshot(helper_plugin_extension_extension $extension) { + $screen = $extension->getScreenshotURL(); + $thumb = $extension->getThumbnailURL(); + + if($screen) { + // use protocol independent URLs for images coming from us #595 + $screen = str_replace('http://www.dokuwiki.org', '//www.dokuwiki.org', $screen); + $thumb = str_replace('http://www.dokuwiki.org', '//www.dokuwiki.org', $thumb); + + $title = sprintf($this->getLang('screenshot'), hsc($extension->getDisplayName())); + $img = ''. + ''.$title.''. + ''; + } elseif($extension->isTemplate()) { + $img = ''; + + } else { + $img = ''; + } + return '
    '.$img.'
    '.DOKU_LF; + } + + /** + * Extension main description + * + * @param helper_plugin_extension_extension $extension The extension object + * @param bool $showinfo Show the info section + * @return string The HTML code + */ + function make_legend(helper_plugin_extension_extension $extension, $showinfo = false) { + $return = '
    '; + $return .= '

    '; + $return .= sprintf($this->getLang('extensionby'), ''.hsc($extension->getDisplayName()).'', $this->make_author($extension)); + $return .= '

    '.DOKU_LF; + + $return .= $this->make_screenshot($extension); + + $popularity = $extension->getPopularity(); + if ($popularity !== false && !$extension->isBundled()) { + $popularityText = sprintf($this->getLang('popularity'), round($popularity*100, 2)); + $return .= '
    '.$popularityText.'
    '.DOKU_LF; + } + + if($extension->getDescription()) { + $return .= '

    '; + $return .= hsc($extension->getDescription()).' '; + $return .= '

    '.DOKU_LF; + } + + $return .= $this->make_linkbar($extension); + + if($showinfo){ + $url = $this->gui->tabURL(''); + $class = 'close'; + }else{ + $url = $this->gui->tabURL('', array('info' => $extension->getID())); + $class = ''; + } + $return .= ' '.$this->getLang('btn_info').''; + + if ($showinfo) { + $return .= $this->make_info($extension); + } + $return .= $this->make_noticearea($extension); + $return .= '
    '.DOKU_LF; + return $return; + } + + /** + * Generate the link bar HTML code + * + * @param helper_plugin_extension_extension $extension The extension instance + * @return string The HTML code + */ + function make_linkbar(helper_plugin_extension_extension $extension) { + $return = ''.DOKU_LF; + return $return; + } + + /** + * Notice area + * + * @param helper_plugin_extension_extension $extension The extension + * @return string The HTML code + */ + function make_noticearea(helper_plugin_extension_extension $extension) { + $return = ''; + $missing_dependencies = $extension->getMissingDependencies(); + if(!empty($missing_dependencies)) { + $return .= '
    '. + sprintf($this->getLang('missing_dependency'), ''.implode(', ', /*array_map(array($this->helper, 'make_extensionsearchlink'),*/ $missing_dependencies).''). + '
    '; + } + if($extension->isInWrongFolder()) { + $return .= '
    '. + sprintf($this->getLang('wrong_folder'), ''.hsc($extension->getInstallName()).'', ''.hsc($extension->getBase()).''). + '
    '; + } + if(($securityissue = $extension->getSecurityIssue()) !== false) { + $return .= '
    '. + sprintf($this->getLang('security_issue'), ''.hsc($securityissue).''). + '
    '; + } + if(($securitywarning = $extension->getSecurityWarning()) !== false) { + $return .= '
    '. + sprintf($this->getLang('security_warning'), ''.hsc($securitywarning).''). + '
    '; + } + if($extension->updateAvailable()) { + $return .= '
    '. + sprintf($this->getLang('update_available'), hsc($extension->getLastUpdate())). + '
    '; + } + if($extension->hasDownloadURLChanged()) { + $return .= '
    '. + sprintf($this->getLang('url_change'), ''.hsc($extension->getDownloadURL()).'', ''.hsc($extension->getLastDownloadURL()).''). + '
    '; + } + return $return.DOKU_LF; + } + + /** + * Create a link from the given URL + * + * Shortens the URL for display + * + * @param string $url + * + * @return string HTML link + */ + function shortlink($url){ + $link = parse_url($url); + + $base = $link['host']; + if($link['port']) $base .= $base.':'.$link['port']; + $long = $link['path']; + if($link['query']) $long .= $link['query']; + + $name = shorten($base, $long, 55); + + return ''.hsc($name).''; + } + + /** + * Plugin/template details + * + * @param helper_plugin_extension_extension $extension The extension + * @return string The HTML code + */ + function make_info(helper_plugin_extension_extension $extension) { + $default = $this->getLang('unknown'); + $return = '
    '; + + $return .= '
    '.$this->getLang('status').'
    '; + $return .= '
    '.$this->make_status($extension).'
    '; + + if ($extension->getDonationURL()) { + $return .= '
    '.$this->getLang('donate').'
    '; + $return .= '
    '; + $return .= ''; + $return .= '
    '; + } + + if (!$extension->isBundled()) { + $return .= '
    '.$this->getLang('downloadurl').'
    '; + $return .= '
    '; + $return .= ($extension->getDownloadURL() ? $this->shortlink($extension->getDownloadURL()) : $default); + $return .= '
    '; + + $return .= '
    '.$this->getLang('repository').'
    '; + $return .= '
    '; + $return .= ($extension->getSourcerepoURL() ? $this->shortlink($extension->getSourcerepoURL()) : $default); + $return .= '
    '; + } + + if ($extension->isInstalled()) { + if ($extension->getInstalledVersion()) { + $return .= '
    '.$this->getLang('installed_version').'
    '; + $return .= '
    '; + $return .= hsc($extension->getInstalledVersion()); + $return .= '
    '; + } else { + $return .= '
    '.$this->getLang('install_date').'
    '; + $return .= '
    '; + $return .= ($extension->getUpdateDate() ? hsc($extension->getUpdateDate()) : $this->getLang('unknown')); + $return .= '
    '; + } + } + if (!$extension->isInstalled() || $extension->updateAvailable()) { + $return .= '
    '.$this->getLang('available_version').'
    '; + $return .= '
    '; + $return .= ($extension->getLastUpdate() ? hsc($extension->getLastUpdate()) : $this->getLang('unknown')); + $return .= '
    '; + } + + if($extension->getInstallDate()) { + $return .= '
    '.$this->getLang('installed').'
    '; + $return .= '
    '; + $return .= hsc($extension->getInstallDate()); + $return .= '
    '; + } + + $return .= '
    '.$this->getLang('provides').'
    '; + $return .= '
    '; + $return .= ($extension->getTypes() ? hsc(implode(', ', $extension->getTypes())) : $default); + $return .= '
    '; + + if(!$extension->isBundled() && $extension->getCompatibleVersions()) { + $return .= '
    '.$this->getLang('compatible').'
    '; + $return .= '
    '; + foreach ($extension->getCompatibleVersions() as $date => $version) { + $return .= ''.$version['label'].' ('.$date.'), '; + } + $return = rtrim($return, ', '); + $return .= '
    '; + } + if($extension->getDependencies()) { + $return .= '
    '.$this->getLang('depends').'
    '; + $return .= '
    '; + $return .= $this->make_linklist($extension->getDependencies()); + $return .= '
    '; + } + + if($extension->getSimilarExtensions()) { + $return .= '
    '.$this->getLang('similar').'
    '; + $return .= '
    '; + $return .= $this->make_linklist($extension->getSimilarExtensions()); + $return .= '
    '; + } + + if($extension->getConflicts()) { + $return .= '
    '.$this->getLang('conflicts').'
    '; + $return .= '
    '; + $return .= $this->make_linklist($extension->getConflicts()); + $return .= '
    '; + } + $return .= '
    '.DOKU_LF; + return $return; + } + + /** + * Generate a list of links for extensions + * + * @param array $ext The extensions + * @return string The HTML code + */ + function make_linklist($ext) { + $return = ''; + foreach ($ext as $link) { + $return .= ''.hsc($link).', '; + } + return rtrim($return, ', '); + } + + /** + * Display the action buttons if they are possible + * + * @param helper_plugin_extension_extension $extension The extension + * @return string The HTML code + */ + function make_actions(helper_plugin_extension_extension $extension) { + $return = ''; + $errors = ''; + + if ($extension->isInstalled()) { + if (($canmod = $extension->canModify()) === true) { + if (!$extension->isProtected()) { + $return .= $this->make_action('uninstall', $extension); + } + if ($extension->getDownloadURL()) { + if ($extension->updateAvailable()) { + $return .= $this->make_action('update', $extension); + } else { + $return .= $this->make_action('reinstall', $extension); + } + } + }else{ + $errors .= '

    '.$this->getLang($canmod).'

    '; + } + + if (!$extension->isProtected() && !$extension->isTemplate()) { // no enable/disable for templates + if ($extension->isEnabled()) { + $return .= $this->make_action('disable', $extension); + } else { + $return .= $this->make_action('enable', $extension); + } + } + + if ($extension->isGitControlled()){ + $errors .= '

    '.$this->getLang('git').'

    '; + } + + }else{ + if (($canmod = $extension->canModify()) === true) { + if ($extension->getDownloadURL()) { + $return .= $this->make_action('install', $extension); + } + }else{ + $errors .= '
    '.$this->getLang($canmod).'
    '; + } + } + + if (!$extension->isInstalled() && $extension->getDownloadURL()) { + $return .= ' '.$this->getLang('available_version').' '; + $return .= ($extension->getLastUpdate() ? hsc($extension->getLastUpdate()) : $this->getLang('unknown')).''; + } + + return $return.' '.$errors.DOKU_LF; + } + + /** + * Display an action button for an extension + * + * @param string $action The action + * @param helper_plugin_extension_extension $extension The extension + * @return string The HTML code + */ + function make_action($action, $extension) { + $title = ''; + + switch ($action) { + case 'install': + case 'reinstall': + $title = 'title="'.hsc($extension->getDownloadURL()).'"'; + break; + } + + $classes = 'button '.$action; + $name = 'fn['.$action.']['.hsc($extension->getID()).']'; + + return ''; + } + + /** + * Plugin/template status + * + * @param helper_plugin_extension_extension $extension The extension + * @return string The description of all relevant statusses + */ + function make_status(helper_plugin_extension_extension $extension) { + $status = array(); + + + if ($extension->isInstalled()) { + $status[] = $this->getLang('status_installed'); + if ($extension->isProtected()) { + $status[] = $this->getLang('status_protected'); + } else { + $status[] = $extension->isEnabled() ? $this->getLang('status_enabled') : $this->getLang('status_disabled'); + } + } else { + $status[] = $this->getLang('status_not_installed'); + } + if(!$extension->canModify()) $status[] = $this->getLang('status_unmodifiable'); + if($extension->isBundled()) $status[] = $this->getLang('status_bundled'); + $status[] = $extension->isTemplate() ? $this->getLang('status_template') : $this->getLang('status_plugin'); + return join(', ', $status); + } + +} diff --git a/sources/lib/plugins/extension/helper/repository.php b/sources/lib/plugins/extension/helper/repository.php new file mode 100644 index 0000000..6ffe89e --- /dev/null +++ b/sources/lib/plugins/extension/helper/repository.php @@ -0,0 +1,191 @@ + + */ + +#define('EXTENSION_REPOSITORY_API', 'http://localhost/dokuwiki/lib/plugins/pluginrepo/api.php'); + +if (!defined('EXTENSION_REPOSITORY_API_ENDPOINT')) + define('EXTENSION_REPOSITORY_API', 'http://www.dokuwiki.org/lib/plugins/pluginrepo/api.php'); + +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); + +/** + * Class helper_plugin_extension_repository provides access to the extension repository on dokuwiki.org + */ +class helper_plugin_extension_repository extends DokuWiki_Plugin { + private $loaded_extensions = array(); + private $has_access = null; + /** + * Initialize the repository (cache), fetches data for all installed plugins + */ + public function init() { + /* @var Doku_Plugin_Controller $plugin_controller */ + global $plugin_controller; + if ($this->hasAccess()) { + $list = $plugin_controller->getList('', true); + $request_data = array('fmt' => 'php'); + $request_needed = false; + foreach ($list as $name) { + $cache = new cache('##extension_manager##'.$name, '.repo'); + $result = null; + if (!isset($this->loaded_extensions[$name]) && $this->hasAccess() && !$cache->useCache(array('age' => 3600 * 24))) { + $this->loaded_extensions[$name] = true; + $request_data['ext'][] = $name; + $request_needed = true; + } + } + + if ($request_needed) { + $httpclient = new DokuHTTPClient(); + $data = $httpclient->post(EXTENSION_REPOSITORY_API, $request_data); + if ($data !== false) { + $extensions = unserialize($data); + foreach ($extensions as $extension) { + $cache = new cache('##extension_manager##'.$extension['plugin'], '.repo'); + $cache->storeCache(serialize($extension)); + } + } else { + $this->has_access = false; + } + } + } + } + + /** + * If repository access is available + * + * @return bool If repository access is available + */ + public function hasAccess() { + if ($this->has_access === null) { + $cache = new cache('##extension_manager###hasAccess', '.repo'); + $result = null; + if (!$cache->useCache(array('age' => 3600 * 24, 'purge'=>1))) { + $httpclient = new DokuHTTPClient(); + $httpclient->timeout = 5; + $data = $httpclient->get(EXTENSION_REPOSITORY_API.'?cmd=ping'); + if ($data !== false) { + $this->has_access = true; + $cache->storeCache(1); + } else { + $this->has_access = false; + $cache->storeCache(0); + } + } else { + $this->has_access = ($cache->retrieveCache(false) == 1); + } + } + return $this->has_access; + } + + /** + * Get the remote data of an individual plugin or template + * + * @param string $name The plugin name to get the data for, template names need to be prefix by 'template:' + * @return array The data or null if nothing was found (possibly no repository access) + */ + public function getData($name) { + $cache = new cache('##extension_manager##'.$name, '.repo'); + $result = null; + if (!isset($this->loaded_extensions[$name]) && $this->hasAccess() && !$cache->useCache(array('age' => 3600 * 24))) { + $this->loaded_extensions[$name] = true; + $httpclient = new DokuHTTPClient(); + $data = $httpclient->get(EXTENSION_REPOSITORY_API.'?fmt=php&ext[]='.urlencode($name)); + if ($data !== false) { + $result = unserialize($data); + $cache->storeCache(serialize($result[0])); + return $result[0]; + } else { + $this->has_access = false; + } + } + if (file_exists($cache->cache)) { + return unserialize($cache->retrieveCache(false)); + } + return array(); + } + + /** + * Search for plugins or templates using the given query string + * + * @param string $q the query string + * @return array a list of matching extensions + */ + public function search($q){ + $query = $this->parse_query($q); + $query['fmt'] = 'php'; + + $httpclient = new DokuHTTPClient(); + $data = $httpclient->post(EXTENSION_REPOSITORY_API, $query); + if ($data === false) return array(); + $result = unserialize($data); + + $ids = array(); + + // store cache info for each extension + foreach($result as $ext){ + $name = $ext['plugin']; + $cache = new cache('##extension_manager##'.$name, '.repo'); + $cache->storeCache(serialize($ext)); + $ids[] = $name; + } + + return $ids; + } + + /** + * Parses special queries from the query string + * + * @param string $q + * @return array + */ + protected function parse_query($q){ + $parameters = array( + 'tag' => array(), + 'mail' => array(), + 'type' => array(), + 'ext' => array() + ); + + // extract tags + if(preg_match_all('/(^|\s)(tag:([\S]+))/', $q, $matches, PREG_SET_ORDER)){ + foreach($matches as $m){ + $q = str_replace($m[2], '', $q); + $parameters['tag'][] = $m[3]; + } + } + // extract author ids + if(preg_match_all('/(^|\s)(authorid:([\S]+))/', $q, $matches, PREG_SET_ORDER)){ + foreach($matches as $m){ + $q = str_replace($m[2], '', $q); + $parameters['mail'][] = $m[3]; + } + } + // extract extensions + if(preg_match_all('/(^|\s)(ext:([\S]+))/', $q, $matches, PREG_SET_ORDER)){ + foreach($matches as $m){ + $q = str_replace($m[2], '', $q); + $parameters['ext'][] = $m[3]; + } + } + // extract types + if(preg_match_all('/(^|\s)(type:([\S]+))/', $q, $matches, PREG_SET_ORDER)){ + foreach($matches as $m){ + $q = str_replace($m[2], '', $q); + $parameters['type'][] = $m[3]; + } + } + + // FIXME make integer from type value + + $parameters['q'] = trim($q); + return $parameters; + } +} + +// vim:ts=4:sw=4:et: diff --git a/sources/lib/plugins/extension/images/disabled.png b/sources/lib/plugins/extension/images/disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..7a0dbb3b52cde9602ab7f3e51fa5aabe6dadade3 GIT binary patch literal 1486 zcmbtUdr;C@6u#u9rfaL)YfW?4CVQ9_q)x3{jhR|)+B%d|jyt6*ZazXwF~d~`rH2TN zf}~=YilmY&K2z3|@PU92R7y$17a$@aVoi_rvF@+wubtU{cJ|Jk^PO|<{btVn?wLyr zI)B>6YP%Hxz~<~3UnGRzd@@Tj$jdqXJrI0x?PTCd0P3=>SHjmrIV=%*+6Qo@j&o4* zUBnq=AOI;Y0N@D#{J91pR8N8fpbG=Qs{nv)@wBT#e*o5f2nx992XRtUasK}2u3d{^ zFc>5fxwyEPM$0WKDr#t`ui;kH>2w;6wzjrbRK(2A&VKxuO(Ky>OG`2{GpRW_Wvmhc zfj}Z<;qmyCloSeuoRyV{!C=tnIBW_QlbFcil%Y_OXf&EiCCA0Z-MW<&A0MBboP6`< zO)M6xP$)2%WFj$(Os1r#6R1>bWo0Fg*CZ5nipAXm0l&7k2I?m?^lDyS9*@^7m%p5v z8ka~!6&2-Iu7p#_l%}S}iHX;}y<#@Itc=AP9+tJWwP3NoRaaL@B;7O`6}nerW8J_& zZ($)LEG(k7mJ1!u%X`3Lm9z`m?%uuofSxOrO6u!tVq?)b9FE6pc=(X9XD^(|WHdL` zWn`q|aA`F)9AQ^metzzuLr3o4yVKIrP+H2oejObVfvS4KCKB(3hF&QtVet74cswp9 zCN?DnOC}Qw8T3a*1@zo(0wFyiAt5FvCM_+kzP`S(@o8066;z3ij!sQYg#siJ2}uOW zf7=dJ(gH5!${FgHK1*XcASlW}p;w79sS z*K17+2GfGkXq;bIFlx1Gm1@#xG#K9dRnj3&dzFPH8ZobGg|Ge zQaPbgDOJj8wOXZ{(4|D5s|sW25p{@{!S3BjbwE$%!$A zVr2NGY-ng;a8NolD19Lt92*^$4fRT;qL(kEy**-yxVuLplJ@t=M+OI^Vo`TzNBi@3 z0l%wL(BCH#bqm^Bd95wY?SfXZ2�pKmUW@+T1PVcMDtl``RU9zF5@O*DHXAheDy` z=jWG~mvcBAXlS`yZb3o8!4U6NNXK#v^8AJWpr_ean>JYalA1f%G0rgiJmc~}&^l}8 zUrOI|i(Kn0^FtH9d}IPw#im+*vnSl zzWKP6xLvWlyo$9SOWs(i3tVUAH@Lj|CdbhnW@ZbIDtN zAo?<|Hp2T(2%a^%Z+s8_=wbNJ=2BBdR;HzXy*9XY7bqmuc+Nk1obywrd#X1uaG7Q< z0VR>W3yB}K!K|$y@DQKQ?;3YXItY$AEn#oJh93jZE=dTLN|?=y5Ig3OxsRi@txPMx zHd-oGh2+5TSi68Bj`dD`1&RG_hf5GEuo^_lmiF!DUs_9F3XbM=be*{W?)IX^jLFkH znV!#uG;_iDUB;loF_B&o36T(h!*GQA0XX6S!u=uw;RQeJpjff_;jiX5$ z+9v6=N#~K0$9QI}P`mBI10OSU=bZC>=W&^3S=fnj?9jv)FUOr1TM1*luer6YpL4ON zRIy-~CN#}({>!olo+>v4fqYBF&)MwqLk5J!a=A=_3{*%q7!1}gew{${%>$&Sr@+XW zGi(w7l?u?bKZM;~mqLyEy6>cyQ@5D%^B3NK_-M0RC%R7|e6be3WMO+{{1} z7G)?HIjp5u&^hoHrlx|IN+lfa>O_I$TIC`R^jXb70J;DE#H^`I@#g6e87p_;zEn3G>PFu#CEWYfEq7d2A)Xjk#SBCD5rrG$b*XTWSx{4@T2=-Gxd+vPuk&ce*k|ZDAy0)}*X+`-l zcy}=TWO(HMEVgXPc9RGJLd~{w8X^`5>fZzQ-*4k@0R{k9H5wIymHvPL0000PZ}u5UgGKN%6^BDg-3@&_12}=Kq039pAgsGM=$O< zc4_bN%Lh&Z(UpUzt{y*s&t;ucLK6UJ6?fGD literal 0 HcmV?d00001 diff --git a/sources/lib/plugins/extension/images/enabled.png b/sources/lib/plugins/extension/images/enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..7c051cda19a13e28f5eb970656e44344c8412030 GIT binary patch literal 1231 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pWm85kOx85n;42hu?CQUeBtR|yOZRx=nF#PcV`A9Vw&3?vnS3!^IkrqpgiqQ}89R-tHxf~T0IFt$>o^!px@^NF( zW`V^|G9?Trdm7C>m$K~r-n+HG??rEawPOaKkh<|pAIHFg6`z0Cg)X;PDv@+zdc(ow zklsfxnO64BTz0-H;Qg9;tHVV9J@YgOZ2h(Fxu*Xft*5-_7jT98q=y|X-Y;Z+z9_S* z?QPT*#qSjimb-;F6*Tq!zCZcn-h8jhV&?T+s~EQRpE^9}#e46pf7`$BEcj3rDAw|2+Al!q4W_Q{fT*f&q1 z=B2yFwRo}mSl;Cd-P4x6pbsKaZ$vokxe0OA7!fx+%PZif6`8@sA#Pp`Ee6#r( zH}rjpJ^9D@yxB=57fBCmg|dK{ulJ)Q7<=AfTqpkEk$~r} z3F#AboUZ)Qv{qyEYh%8!yWL9uZot7enNwLNJonh&{>5pDxRZ=xB$t_ct9g1z#qW}j zt3AIw%&=&vvv&NJyIE^Tp;xPMc%kJCkw<(-6ek@?ko_XQHY?tKsh(bp+Mcfg>#L5s zU76=9n;9SUIov+*WRen}ithv!w;slgFCNS<-c|b3_@-&r*NcBXGE{L{ST@DY`5pHB zul1^!=ql5B{aU??x>QT@|5fk)dO-K;+jTECZ-_F_U2eB*c8ck8tD_sO_#9*U^!l5Q zl^VXf_EOuIME`dWM5vta%6^KAS6W&dMc|0p_6 z@_%!8w&g+D&3uznUqx+OtfYKmdUh`Bp^*k#5#YCJXQ8op%o` zdHUny}+mQy~i58mVQdy8&|(8MC+vjN7dcD@1Hfg?7S|2(fhF9&dBBf^RWim z1H}jG7I4L|*Rkm_`zl0gJ20yz*lyrl!TV|&L-zq$1(r`+ncmGmB;WAIu`l-56i>EC zc}t(vGp_&goB1kJnC}Q!>*kv1l-XXjs!*8Uxh8;OXk;vd$@?2>`&G79Rir literal 0 HcmV?d00001 diff --git a/sources/lib/plugins/extension/images/icons.xcf b/sources/lib/plugins/extension/images/icons.xcf new file mode 100644 index 0000000000000000000000000000000000000000..ab69b3099012309b3eb15f3f57684ebde2db36ad GIT binary patch literal 67195 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 Cf`;$_ literal 0 HcmV?d00001 diff --git a/sources/lib/plugins/extension/images/up.png b/sources/lib/plugins/extension/images/up.png new file mode 100644 index 0000000000000000000000000000000000000000..ec9337715cdcd9f4faf722214df78e71e5f021df GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uGBwbBK{D2f=age(c!@6@aFM%AEbVpxD28NCO z+PZ}u5UgGKN%6^BDg-3@&_12}=Kq039pAgsGM=$O< zc4_bN%Lh&Z(UpUzt{y*s S=1d2g#o+1c=d#Wzp$PyIYIC3f literal 0 HcmV?d00001 diff --git a/sources/lib/plugins/extension/images/warning.png b/sources/lib/plugins/extension/images/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..c5e482f84b3a140a062da69cd86d0a98019a8fcb GIT binary patch literal 613 zcmV-r0-F7aP)3hb|o?2tteOkVJ)0hl&s^ z5iE&_P6b&gMn-0?yRw*y{*RfjgBpQr1rE&2VP-zQZRa2^L zF5drI()F2Z0Z`Z;C^=XiC_d0g(KBmOAi2sD{f*&xU&BvvXXvJeIPrA%^!Vdl;dH%e z8K~&p?6O#{VVbaW!U&ef!W6yyUku{U8)_$e>xJUbiC?Fi=%TtwetodRAM4&;`%eZ` zy&tM-HPxTP=e~y+eRc=xO`@RYf~BGze_dj{HyX<*j8^AtIf{jEtsnssSR8LdZlnd7 zB~6W^w<}|50ph*UkgB!^D~?0`X+W2!NvL|z#S!FJoq&p78NRtSvK0T1Gb0Q0 z$ysFPC@hPx@|t1g9>GvYohy!Cz4KCX)Lc3m?G9}_XH(}Ovu^+@0OHHwFs43E03bkx zpX!HU&ZDTlHQ+nmH2^TaKdEc6@@slFHMPT^eF-mdZ%L98qyZ2xEyAD+QeavekyYM? z51ld0j0_&ORiv{Za%$-@LJhD((PeSQiu~ok-}`_OK$Aj;95XXZ!KE(AQoqkjluTpUr@2!v00000NkvXXu0mjf(Y+Pe literal 0 HcmV?d00001 diff --git a/sources/lib/plugins/extension/lang/de/intro_install.txt b/sources/lib/plugins/extension/lang/de/intro_install.txt new file mode 100644 index 0000000..4ecebe9 --- /dev/null +++ b/sources/lib/plugins/extension/lang/de/intro_install.txt @@ -0,0 +1 @@ +Hier können Sie Plugins und Templates von Hand installieren indem Sie sie hochladen oder eine Download-URL angeben. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/de/intro_plugins.txt b/sources/lib/plugins/extension/lang/de/intro_plugins.txt new file mode 100644 index 0000000..1a15210 --- /dev/null +++ b/sources/lib/plugins/extension/lang/de/intro_plugins.txt @@ -0,0 +1 @@ +Dies sind die Plugins, die bereits installiert sind. Sie können sie hier an- oder abschalten oder sie komplett deinstallieren. Außerdem werden hier Updates zu den installiereten Plugins angezeigt. Bitte lesen Sie vor einem Update die zugehörige Dokumentation. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/de/intro_search.txt b/sources/lib/plugins/extension/lang/de/intro_search.txt new file mode 100644 index 0000000..7df8de1 --- /dev/null +++ b/sources/lib/plugins/extension/lang/de/intro_search.txt @@ -0,0 +1 @@ +Dieser Tab gibt Ihnen Zugriff auf alle vorhandenen Plugins und Templates für DokuWiki. Bitte bedenken sie das jede installierte Erweiterung ein Sicherheitsrisiko darstellen kann. Sie sollten vor einer Installation die [[doku>security#plugin_security|Plugin Security]] Informationen lesen. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/de/intro_templates.txt b/sources/lib/plugins/extension/lang/de/intro_templates.txt new file mode 100644 index 0000000..d71ce62 --- /dev/null +++ b/sources/lib/plugins/extension/lang/de/intro_templates.txt @@ -0,0 +1 @@ +Dies sind die in Ihrem Dokuwiki installierten Templates. Sie können das gewünschte Template im [[?do=admin&page=config|Konfigurations Manager]] aktivieren. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/de/lang.php b/sources/lib/plugins/extension/lang/de/lang.php new file mode 100644 index 0000000..8068ce8 --- /dev/null +++ b/sources/lib/plugins/extension/lang/de/lang.php @@ -0,0 +1,88 @@ + + * @author Joerg + * @author Simon + */ +$lang['menu'] = 'Erweiterungen verwalten'; +$lang['tab_plugins'] = 'Installierte Plugins'; +$lang['tab_templates'] = 'Installierte Templates'; +$lang['tab_search'] = 'Suchen und Installieren'; +$lang['tab_install'] = 'Händisch installieren'; +$lang['notimplemented'] = 'Dieses Fähigkeit/Eigenschaft wurde noch nicht implementiert'; +$lang['notinstalled'] = 'Diese Erweiterung ist nicht installiert'; +$lang['alreadyenabled'] = 'Diese Erweiterung ist bereits aktiviert'; +$lang['alreadydisabled'] = 'Diese Erweiterung ist bereits deaktiviert'; +$lang['pluginlistsaveerror'] = 'Es gab einen Fehler beim Speichern der Plugin-Liste'; +$lang['unknownauthor'] = 'Unbekannter Autor'; +$lang['unknownversion'] = 'Unbekannte Version'; +$lang['btn_info'] = 'Zeige weitere Info'; +$lang['btn_update'] = 'Update'; +$lang['btn_uninstall'] = 'Deinstallation'; +$lang['btn_enable'] = 'Aktivieren'; +$lang['btn_disable'] = 'Deaktivieren'; +$lang['btn_install'] = 'Installieren'; +$lang['btn_reinstall'] = 'Neu installieren'; +$lang['js']['reallydel'] = 'Wollen Sie diese Erweiterung wirklich löschen?'; +$lang['search_for'] = 'Erweiterung suchen:'; +$lang['search'] = 'Suchen'; +$lang['extensionby'] = '%s von %s'; +$lang['screenshot'] = 'Bildschirmfoto von %s'; +$lang['popularity'] = 'Popularität: %s%%'; +$lang['homepage_link'] = 'Doku'; +$lang['bugs_features'] = 'Bugs'; +$lang['tags'] = 'Schlagworte'; +$lang['author_hint'] = 'Suche weitere Erweiterungen dieses Autors'; +$lang['installed'] = 'Installiert:'; +$lang['downloadurl'] = 'URL zum Herunterladen'; +$lang['repository'] = 'Quelle:'; +$lang['unknown'] = 'unbekannt'; +$lang['installed_version'] = 'Installierte Version'; +$lang['install_date'] = 'Ihr letztes Update:'; +$lang['available_version'] = 'Verfügbare Version: '; +$lang['compatible'] = 'Kompatibel mit:'; +$lang['depends'] = 'Benötigt:'; +$lang['similar'] = 'Ist ähnlich zu:'; +$lang['conflicts'] = 'Nicht kompatibel mit:'; +$lang['donate'] = 'Nützlich?'; +$lang['donate_action'] = 'Spendieren Sie dem Autor einen Kaffee!'; +$lang['repo_retry'] = 'Neu versuchen'; +$lang['provides'] = 'Enthält'; +$lang['status'] = 'Status'; +$lang['status_installed'] = 'installiert'; +$lang['status_not_installed'] = 'nicht installiert'; +$lang['status_protected'] = 'geschützt'; +$lang['status_enabled'] = 'aktiviert'; +$lang['status_disabled'] = 'deaktiviert'; +$lang['status_unmodifiable'] = 'unveränderlich'; +$lang['status_plugin'] = 'Plugin'; +$lang['status_template'] = 'Template'; +$lang['status_bundled'] = 'gebündelt'; +$lang['msg_enabled'] = 'Plugin %s ist aktiviert'; +$lang['msg_disabled'] = 'Erweiterung %s ist deaktiviert'; +$lang['msg_delete_success'] = 'Erweiterung wurde entfernt'; +$lang['msg_template_install_success'] = 'Das Template %s wurde erfolgreich installiert'; +$lang['msg_template_update_success'] = 'Das Update des Templates %s war erfolgreich '; +$lang['msg_plugin_install_success'] = 'Das Plugin %s wurde erfolgreich installiert'; +$lang['msg_plugin_update_success'] = 'Das Update des Plugins %s war erfolgreich'; +$lang['msg_upload_failed'] = 'Fehler beim Hochladen der Datei'; +$lang['missing_dependency'] = 'fehlende oder deaktivierte Abhängigkeit:%s'; +$lang['security_issue'] = 'Sicherheitsproblem: %s'; +$lang['security_warning'] = 'Sicherheitswarnung: %s'; +$lang['update_available'] = 'Update: Version %s steht zum Download bereit.'; +$lang['wrong_folder'] = 'Plugin wurde nicht korrekt installiert: Benennen Sie das Plugin-Verzeichnis "%s" in "%s" um.'; +$lang['error_badurl'] = 'URLs sollten mit http oder https beginnen'; +$lang['error_dircreate'] = 'Temporären Ordner konnte nicht erstellt werden, um Download zu empfangen'; +$lang['error_download'] = 'Download der Datei: %s nicht möglich.'; +$lang['error_decompress'] = 'Die heruntergeladene Datei konnte nicht entpackt werden. Dies kann die Folge eines fehlerhaften Downloads sein. In diesem Fall sollten Sie versuchen den Vorgang zu wiederholen. Es kann auch die Folge eines unbekannten Kompressionsformates sein, in diesem ​​Fall müssen Sie die Datei selber herunterladen und manuell installieren.'; +$lang['error_findfolder'] = 'Das Erweiterungs-Verzeichnis konnte nicht identifiziert werden, laden und installieren sie die Datei manuell.'; +$lang['error_copy'] = 'Beim Versuch Dateien in den Ordner %s: zu installieren trat ein Kopierfehler auf. Die Dateizugriffsberechtigungen könnten falsch sein. Dies kann an einem unvollständig installierten Plugin liegen und beeinträchtigt somit die Stabilität Ihre Wiki-Installation.'; +$lang['noperms'] = 'Das Erweiterungs-Verzeichnis ist schreibgeschützt'; +$lang['notplperms'] = 'Das Template-Verzeichnis ist schreibgeschützt'; +$lang['nopluginperms'] = 'Das Plugin-Verzeichnis ist schreibgeschützt'; +$lang['git'] = 'Diese Erweiterung wurde über git installiert, daher kann diese nicht hier aktualisiert werden.'; +$lang['install_url'] = 'Von Webadresse (URL) installieren'; +$lang['install_upload'] = 'Erweiterung hochladen:'; diff --git a/sources/lib/plugins/extension/lang/en/intro_install.txt b/sources/lib/plugins/extension/lang/en/intro_install.txt new file mode 100644 index 0000000..a5d5ab0 --- /dev/null +++ b/sources/lib/plugins/extension/lang/en/intro_install.txt @@ -0,0 +1 @@ +Here you can manually install plugins and templates by either uploading them or providing a direct download URL. diff --git a/sources/lib/plugins/extension/lang/en/intro_plugins.txt b/sources/lib/plugins/extension/lang/en/intro_plugins.txt new file mode 100644 index 0000000..4e42efe --- /dev/null +++ b/sources/lib/plugins/extension/lang/en/intro_plugins.txt @@ -0,0 +1 @@ +These are the plugins currently installed in your DokuWiki. You can enable or disable or even completely uninstall them here. Plugin updates are shown here as well, be sure to read the plugin's documentation before updating. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/en/intro_search.txt b/sources/lib/plugins/extension/lang/en/intro_search.txt new file mode 100644 index 0000000..244cd68 --- /dev/null +++ b/sources/lib/plugins/extension/lang/en/intro_search.txt @@ -0,0 +1 @@ +This tab gives you access to all available 3rd party plugins and templates for DokuWiki. Please be aware that installing 3rd party code may pose a **security risk**, you may want to read about [[doku>security#plugin_security|plugin security]] first. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/en/intro_templates.txt b/sources/lib/plugins/extension/lang/en/intro_templates.txt new file mode 100644 index 0000000..012a749 --- /dev/null +++ b/sources/lib/plugins/extension/lang/en/intro_templates.txt @@ -0,0 +1 @@ +These are the templates currently installed in your DokuWiki. You can select the template to be used in the [[?do=admin&page=config|Configuration Manager]]. diff --git a/sources/lib/plugins/extension/lang/en/lang.php b/sources/lib/plugins/extension/lang/en/lang.php new file mode 100644 index 0000000..5224f69 --- /dev/null +++ b/sources/lib/plugins/extension/lang/en/lang.php @@ -0,0 +1,99 @@ + + * @author Christopher Smith + */ + +$lang['menu'] = 'Extension Manager'; + +$lang['tab_plugins'] = 'Installed Plugins'; +$lang['tab_templates'] = 'Installed Templates'; +$lang['tab_search'] = 'Search and Install'; +$lang['tab_install'] = 'Manual Install'; + +$lang['notimplemented'] = 'This feature hasn\'t been implemented yet'; +$lang['notinstalled'] = 'This extension is not installed'; +$lang['alreadyenabled'] = 'This extension has already been enabled'; +$lang['alreadydisabled'] = 'This extension has already been disabled'; +$lang['pluginlistsaveerror'] = 'There was an error saving the plugin list'; +$lang['unknownauthor'] = 'Unknown author'; +$lang['unknownversion'] = 'Unknown version'; + +$lang['btn_info'] = 'Show more info'; +$lang['btn_update'] = 'Update'; +$lang['btn_uninstall'] = 'Uninstall'; +$lang['btn_enable'] = 'Enable'; +$lang['btn_disable'] = 'Disable'; +$lang['btn_install'] = 'Install'; +$lang['btn_reinstall'] = 'Re-install'; + +$lang['js']['reallydel'] = 'Really uninstall this extension?'; + +$lang['search_for'] = 'Search Extension:'; +$lang['search'] = 'Search'; + +$lang['extensionby'] = '%s by %s'; +$lang['screenshot'] = 'Screenshot of %s'; +$lang['popularity'] = 'Popularity: %s%%'; +$lang['homepage_link'] = 'Docs'; +$lang['bugs_features'] = 'Bugs'; +$lang['tags'] = 'Tags:'; +$lang['author_hint'] = 'Search extensions by this author'; +$lang['installed'] = 'Installed:'; +$lang['downloadurl'] = 'Download URL:'; +$lang['repository'] = 'Repository:'; +$lang['unknown'] = 'unknown'; +$lang['installed_version'] = 'Installed version:'; +$lang['install_date'] = 'Your last update:'; +$lang['available_version'] = 'Available version:'; +$lang['compatible'] = 'Compatible with:'; +$lang['depends'] = 'Depends on:'; +$lang['similar'] = 'Similar to:'; +$lang['conflicts'] = 'Conflicts with:'; +$lang['donate'] = 'Like this?'; +$lang['donate_action'] = 'Buy the author a coffee!'; +$lang['repo_retry'] = 'Retry'; +$lang['provides'] = 'Provides:'; +$lang['status'] = 'Status:'; +$lang['status_installed'] = 'installed'; +$lang['status_not_installed'] = 'not installed'; +$lang['status_protected'] = 'protected'; +$lang['status_enabled'] = 'enabled'; +$lang['status_disabled'] = 'disabled'; +$lang['status_unmodifiable'] = 'unmodifiable'; +$lang['status_plugin'] = 'plugin'; +$lang['status_template'] = 'template'; +$lang['status_bundled'] = 'bundled'; + +$lang['msg_enabled'] = 'Plugin %s enabled'; +$lang['msg_disabled'] = 'Plugin %s disabled'; +$lang['msg_delete_success'] = 'Extension uninstalled'; +$lang['msg_template_install_success'] = 'Template %s installed successfully'; +$lang['msg_template_update_success'] = 'Template %s updated successfully'; +$lang['msg_plugin_install_success'] = 'Plugin %s installed successfully'; +$lang['msg_plugin_update_success'] = 'Plugin %s updated successfully'; +$lang['msg_upload_failed'] = 'Uploading the file failed'; + +$lang['missing_dependency'] = 'Missing or disabled dependency: %s'; +$lang['security_issue'] = 'Security Issue: %s'; +$lang['security_warning'] = 'Security Warning: %s'; +$lang['update_available'] = 'Update: New version %s is available.'; +$lang['wrong_folder'] = 'Plugin installed incorrectly: Rename plugin directory "%s" to "%s".'; +$lang['url_change'] = 'URL changed: Download URL has changed since last download. Check if the new URL is valid before updating the extension.
    New: %s
    Old: %s'; + +$lang['error_badurl'] = 'URLs should start with http or https'; +$lang['error_dircreate'] = 'Unable to create temporary folder to receive download'; +$lang['error_download'] = 'Unable to download the file: %s'; +$lang['error_decompress'] = 'Unable to decompress the downloaded file. This maybe as a result of a bad download, in which case you should try again; or the compression format may be unknown, in which case you will need to download and install manually.'; +$lang['error_findfolder'] = 'Unable to identify extension directory, you need to download and install manually'; +$lang['error_copy'] = 'There was a file copy error while attempting to install files for directory %s: the disk could be full or file access permissions may be incorrect. This may have resulted in a partially installed plugin and leave your wiki installation unstable'; + +$lang['noperms'] = 'Extension directory is not writable'; +$lang['notplperms'] = 'Template directory is not writable'; +$lang['nopluginperms'] = 'Plugin directory is not writable'; +$lang['git'] = 'This extension was installed via git, you may not want to update it here.'; + +$lang['install_url'] = 'Install from URL:'; +$lang['install_upload'] = 'Upload Extension:'; \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/eo/intro_install.txt b/sources/lib/plugins/extension/lang/eo/intro_install.txt new file mode 100644 index 0000000..d9c63da --- /dev/null +++ b/sources/lib/plugins/extension/lang/eo/intro_install.txt @@ -0,0 +1 @@ +Tie vi povas permane instali kromaĵojn kaj ŝablonojn tra alŝuto aŭ indiko de URL por rekta elŝuto. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/eo/intro_plugins.txt b/sources/lib/plugins/extension/lang/eo/intro_plugins.txt new file mode 100644 index 0000000..cc7ae66 --- /dev/null +++ b/sources/lib/plugins/extension/lang/eo/intro_plugins.txt @@ -0,0 +1 @@ +Jenaj kromaĵoj momente estas instalitaj en via DokuWiki. Vi povas ebligi, malebligi aŭ eĉ tute malinstali ilin tie. Ankaŭ montriĝos aktualigoj de kromaĵoj -- certiĝu, ke vi legis la dokumentadon de la kromaĵo antaŭ aktualigo. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/eo/intro_search.txt b/sources/lib/plugins/extension/lang/eo/intro_search.txt new file mode 100644 index 0000000..5d19494 --- /dev/null +++ b/sources/lib/plugins/extension/lang/eo/intro_search.txt @@ -0,0 +1 @@ +Tiu tabelo donas aliron al ĉiuj haveblaj eksteraj kromaĵoj kaj ŝablonoj por DokuWiki. Bonvolu konscii, ke instali eksteran kodaĵon povas enkonduki **sekurecriskon**, prefere legu antaŭe pri [[doku>security#plugin_security|sekureco de kromaĵo]]. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/eo/intro_templates.txt b/sources/lib/plugins/extension/lang/eo/intro_templates.txt new file mode 100644 index 0000000..6dc0ef6 --- /dev/null +++ b/sources/lib/plugins/extension/lang/eo/intro_templates.txt @@ -0,0 +1 @@ +Jenaj ŝablonoj momente instaliĝis en via DokuWiki. Elektu la ŝablonon por uzi en la [[?do=admin&page=config|Opcia administrilo]]. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/eo/lang.php b/sources/lib/plugins/extension/lang/eo/lang.php new file mode 100644 index 0000000..6ce840b --- /dev/null +++ b/sources/lib/plugins/extension/lang/eo/lang.php @@ -0,0 +1,87 @@ + + */ +$lang['menu'] = 'Aldonaĵa administrado'; +$lang['tab_plugins'] = 'Instalitaj kromaĵoj'; +$lang['tab_templates'] = 'Instalitaj ŝablonoj'; +$lang['tab_search'] = 'Serĉi kaj instali'; +$lang['tab_install'] = 'Permana instalado'; +$lang['notimplemented'] = 'Tiu funkcio ankoraŭ ne realiĝis'; +$lang['notinstalled'] = 'Tiu aldonaĵo ne estas instalita'; +$lang['alreadyenabled'] = 'Tiu aldonaĵo jam ebliĝis'; +$lang['alreadydisabled'] = 'Tiu aldonaĵo jam malebliĝis'; +$lang['pluginlistsaveerror'] = 'Okazis eraro dum la kromaĵlisto konserviĝis'; +$lang['unknownauthor'] = 'Nekonata aŭtoro'; +$lang['unknownversion'] = 'Nekonata versio'; +$lang['btn_info'] = 'Montri pliajn informojn'; +$lang['btn_update'] = 'Aktualigi'; +$lang['btn_uninstall'] = 'Malinstali'; +$lang['btn_enable'] = 'Ebligi'; +$lang['btn_disable'] = 'Malebligi'; +$lang['btn_install'] = 'Instali'; +$lang['btn_reinstall'] = 'Re-instali'; +$lang['js']['reallydel'] = 'Ĉu vere malinstali la aldonaĵon?'; +$lang['search_for'] = 'Serĉi la aldonaĵon:'; +$lang['search'] = 'Serĉi'; +$lang['extensionby'] = '%s fare de %s'; +$lang['screenshot'] = 'Ekrankopio de %s'; +$lang['popularity'] = 'Populareco: %s%%'; +$lang['homepage_link'] = 'Dokumentoj'; +$lang['bugs_features'] = 'Cimoj'; +$lang['tags'] = 'Etikedoj:'; +$lang['author_hint'] = 'Serĉi aldonaĵojn laŭ tiu aŭtoro:'; +$lang['installed'] = 'Instalitaj:'; +$lang['downloadurl'] = 'URL por elŝuti:'; +$lang['repository'] = 'Kodbranĉo:'; +$lang['unknown'] = 'nekonata'; +$lang['installed_version'] = 'Instalita versio:'; +$lang['install_date'] = 'Via lasta aktualigo:'; +$lang['available_version'] = 'Havebla versio:'; +$lang['compatible'] = 'Kompatibla kun:'; +$lang['depends'] = 'Dependas de:'; +$lang['similar'] = 'Simila al:'; +$lang['conflicts'] = 'Konfliktas kun:'; +$lang['donate'] = 'Ĉu vi ŝatas tion?'; +$lang['donate_action'] = 'Aĉetu kafon al la aŭtoro!'; +$lang['repo_retry'] = 'Reprovi'; +$lang['provides'] = 'Provizas per:'; +$lang['status'] = 'Statuso:'; +$lang['status_installed'] = 'instalita'; +$lang['status_not_installed'] = 'ne instalita'; +$lang['status_protected'] = 'protektita'; +$lang['status_enabled'] = 'ebligita'; +$lang['status_disabled'] = 'malebligita'; +$lang['status_unmodifiable'] = 'neŝanĝebla'; +$lang['status_plugin'] = 'kromaĵo'; +$lang['status_template'] = 'ŝablono'; +$lang['status_bundled'] = 'kunliverita'; +$lang['msg_enabled'] = 'Kromaĵo %s ebligita'; +$lang['msg_disabled'] = 'Kromaĵo %s malebligita'; +$lang['msg_delete_success'] = 'Aldonaĵo malinstaliĝis'; +$lang['msg_template_install_success'] = 'Ŝablono %s sukcese instaliĝis'; +$lang['msg_template_update_success'] = 'Ŝablono %s sukcese aktualiĝis'; +$lang['msg_plugin_install_success'] = 'Kromaĵo %s sukcese instaliĝis'; +$lang['msg_plugin_update_success'] = 'Kromaĵo %s sukcese aktualiĝis'; +$lang['msg_upload_failed'] = 'Ne eblis alŝuti la dosieron'; +$lang['missing_dependency'] = 'Mankanta aŭ malebligita dependeco: %s'; +$lang['security_issue'] = 'Sekureca problemo: %s'; +$lang['security_warning'] = 'Sekureca averto: %s'; +$lang['update_available'] = 'Aktualigo: Nova versio %s haveblas.'; +$lang['wrong_folder'] = 'Kromaĵo instalita malĝuste: Renomu la kromaĵdosierujon "%s" al "%s".'; +$lang['url_change'] = 'URL ŝanĝita: La elŝuta URL ŝanĝiĝis ekde la lasta elŝuto. Kontrolu, ĉu la nova URL validas antaŭ aktualigi aldonaĵon.
    Nova: %s
    Malnova: %s'; +$lang['error_badurl'] = 'URLoj komenciĝu per http aŭ https'; +$lang['error_dircreate'] = 'Ne eblis krei portempan dosierujon por akcepti la elŝuton'; +$lang['error_download'] = 'Ne eblis elŝuti la dosieron: %s'; +$lang['error_decompress'] = 'Ne eblis malpaki la elŝutitan dosieron. Kialo povus esti fuŝa elŝuto, kaj vi reprovu; aŭ la pakiga formato estas nekonata, kaj vi devas elŝuti kaj instali permane.'; +$lang['error_findfolder'] = 'Ne eblis rekoni la aldonaĵ-dosierujon, vi devas elŝuti kaj instali permane'; +$lang['error_copy'] = 'Okazis kopiad-eraro dum la provo instali dosierojn por la dosierujo %s: la disko povus esti plena aŭ la alirpermesoj por dosieroj malĝustaj. Rezulto eble estas nur parte instalita kromaĵo, kiu malstabiligas vian vikion'; +$lang['noperms'] = 'La aldonaĵ-dosierujo ne estas skribebla'; +$lang['notplperms'] = 'La ŝablon-dosierujo ne estas skribebla'; +$lang['nopluginperms'] = 'La kromaĵ-dosierujo ne estas skribebla'; +$lang['git'] = 'Tiu aldonaĵo estis instalita pere de git, eble vi ne aktualigu ĝin ĉi tie.'; +$lang['install_url'] = 'Instali de URL:'; +$lang['install_upload'] = 'Alŝuti aldonaĵon:'; diff --git a/sources/lib/plugins/extension/lang/es/lang.php b/sources/lib/plugins/extension/lang/es/lang.php new file mode 100644 index 0000000..7de2f52 --- /dev/null +++ b/sources/lib/plugins/extension/lang/es/lang.php @@ -0,0 +1,52 @@ + + */ +$lang['tab_plugins'] = 'Plugins instalados'; +$lang['tab_templates'] = 'Plantillas instaladas'; +$lang['tab_search'] = 'Buscar e instalar'; +$lang['tab_install'] = 'Instalación manual'; +$lang['notinstalled'] = 'Esta expensión no está instalada'; +$lang['alreadyenabled'] = 'Esta extensión ya había sido activada'; +$lang['alreadydisabled'] = 'Esta extensión ya había sido desactivada'; +$lang['unknownauthor'] = 'autor desconocido'; +$lang['unknownversion'] = 'versión desconocida'; +$lang['btn_info'] = 'Mostrar más información'; +$lang['btn_update'] = 'Actualizar'; +$lang['btn_uninstall'] = 'Desinstalar'; +$lang['btn_enable'] = 'Activar'; +$lang['btn_disable'] = 'Desactivar'; +$lang['btn_install'] = 'Instalar'; +$lang['btn_reinstall'] = 'Reinstalar'; +$lang['search'] = 'Buscar'; +$lang['homepage_link'] = 'Documentos'; +$lang['bugs_features'] = 'Bugs'; +$lang['tags'] = 'Etiquetas:'; +$lang['installed'] = 'Instalado:'; +$lang['downloadurl'] = 'URL de descarga:'; +$lang['repository'] = 'Repositorio:'; +$lang['installed_version'] = 'Versión instalada:'; +$lang['available_version'] = 'Versión disponible:'; +$lang['compatible'] = 'Compatible con:'; +$lang['depends'] = 'Dependencias:'; +$lang['donate_action'] = '¡Págale un café al autor!'; +$lang['status'] = 'Estado:'; +$lang['status_installed'] = 'instalado'; +$lang['status_not_installed'] = 'no instalado'; +$lang['status_protected'] = 'protegido'; +$lang['status_enabled'] = 'activado'; +$lang['status_disabled'] = 'desactivado'; +$lang['status_unmodifiable'] = 'no modificable'; +$lang['status_plugin'] = 'plugin'; +$lang['status_template'] = 'plantilla'; +$lang['msg_enabled'] = 'Plugin %s activado'; +$lang['msg_disabled'] = 'Plugin %s desactivado'; +$lang['msg_delete_success'] = 'Extensión desinstalada'; +$lang['msg_template_install_success'] = 'Plantilla %s instalada con éxito'; +$lang['msg_template_update_success'] = 'Plantilla %s actualizada con éxito'; +$lang['msg_plugin_install_success'] = 'Plugin %s instalado con éxito'; +$lang['msg_plugin_update_success'] = 'Plugin %s actualizado con éxito'; +$lang['msg_upload_failed'] = 'Falló la carga del archivo'; diff --git a/sources/lib/plugins/extension/lang/fr/intro_install.txt b/sources/lib/plugins/extension/lang/fr/intro_install.txt new file mode 100644 index 0000000..6f68a26 --- /dev/null +++ b/sources/lib/plugins/extension/lang/fr/intro_install.txt @@ -0,0 +1 @@ +Ici, vous pouvez installer des extensions, greffons et modèles. Soit en les téléversant, soit en indiquant un URL de téléchargement. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/fr/intro_plugins.txt b/sources/lib/plugins/extension/lang/fr/intro_plugins.txt new file mode 100644 index 0000000..a40b863 --- /dev/null +++ b/sources/lib/plugins/extension/lang/fr/intro_plugins.txt @@ -0,0 +1 @@ +Voilà la liste des extensions actuellement installées. À partir d'ici, vous pouvez les activer, les désactiver ou même les désinstaller complètement. Cette page affiche également les mises à jour. Assurez vous de lire la documentation avant de faire la mise à jour. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/fr/intro_search.txt b/sources/lib/plugins/extension/lang/fr/intro_search.txt new file mode 100644 index 0000000..418e359 --- /dev/null +++ b/sources/lib/plugins/extension/lang/fr/intro_search.txt @@ -0,0 +1 @@ +Cet onglet vous donne accès à toutes les extensions de tierces parties. Restez conscients qu'installer du code de tierce partie peut poser un problème de **sécurité**. Vous voudrez peut-être au préalable lire l'article sur la [[doku>fr:security##securite_des_plugins|sécurité des plugins]]. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/fr/intro_templates.txt b/sources/lib/plugins/extension/lang/fr/intro_templates.txt new file mode 100644 index 0000000..fefdb55 --- /dev/null +++ b/sources/lib/plugins/extension/lang/fr/intro_templates.txt @@ -0,0 +1 @@ +Voici la liste des modèles actuellement installés. Le [[?do=admin&page=config|gestionnaire de configuration]] vous permet de choisir le modèle à utiliser. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/fr/lang.php b/sources/lib/plugins/extension/lang/fr/lang.php new file mode 100644 index 0000000..c2dae0f --- /dev/null +++ b/sources/lib/plugins/extension/lang/fr/lang.php @@ -0,0 +1,87 @@ + + */ +$lang['menu'] = 'Gestionnaire d\'extension'; +$lang['tab_plugins'] = 'Greffons installés'; +$lang['tab_templates'] = 'Modèles installés'; +$lang['tab_search'] = 'Rechercher et installer'; +$lang['tab_install'] = 'Installation manuelle'; +$lang['notimplemented'] = 'Cette fonctionnalité n\'est pas encore installée'; +$lang['notinstalled'] = 'Cette extension n\'est pas installée'; +$lang['alreadyenabled'] = 'Cette extension a déjà été installée'; +$lang['alreadydisabled'] = 'Cette extension a déjà été désactivée'; +$lang['pluginlistsaveerror'] = 'Une erreur s\'est produite lors de l\'enregistrement de la liste des greffons.'; +$lang['unknownauthor'] = 'Auteur inconnu'; +$lang['unknownversion'] = 'Version inconnue'; +$lang['btn_info'] = 'Montrer plus d\'informations'; +$lang['btn_update'] = 'Mettre à jour'; +$lang['btn_uninstall'] = 'Désinstaller'; +$lang['btn_enable'] = 'Activer'; +$lang['btn_disable'] = 'Désactiver'; +$lang['btn_install'] = 'Installer'; +$lang['btn_reinstall'] = 'Réinstaller'; +$lang['js']['reallydel'] = 'Vraiment désinstaller cette extension'; +$lang['search_for'] = 'Rechercher l\'extension :'; +$lang['search'] = 'Chercher'; +$lang['extensionby'] = '%s de %s'; +$lang['screenshot'] = 'Aperçu de %s'; +$lang['popularity'] = 'Popularité : %s%%'; +$lang['homepage_link'] = 'Documents'; +$lang['bugs_features'] = 'Bugs'; +$lang['tags'] = 'Étiquettes :'; +$lang['author_hint'] = 'Chercher les extensions de cet auteur'; +$lang['installed'] = 'Installés :'; +$lang['downloadurl'] = 'URL de téléchargement :'; +$lang['repository'] = 'Entrepôt : '; +$lang['unknown'] = 'inconnu'; +$lang['installed_version'] = 'Version installée :'; +$lang['install_date'] = 'Votre dernière mise à jour :'; +$lang['available_version'] = 'Version disponible :'; +$lang['compatible'] = 'Compatible avec :'; +$lang['depends'] = 'Dépend de :'; +$lang['similar'] = 'Similaire à :'; +$lang['conflicts'] = 'En conflit avec :'; +$lang['donate'] = 'Vous aimez ?'; +$lang['donate_action'] = 'Payer un café à l\'auteur !'; +$lang['repo_retry'] = 'Réessayer'; +$lang['provides'] = 'Fournit :'; +$lang['status'] = 'État :'; +$lang['status_installed'] = 'installé'; +$lang['status_not_installed'] = 'non installé'; +$lang['status_protected'] = 'protégé'; +$lang['status_enabled'] = 'activé'; +$lang['status_disabled'] = 'désactivé'; +$lang['status_unmodifiable'] = 'non modifiable'; +$lang['status_plugin'] = 'greffon'; +$lang['status_template'] = 'modèle'; +$lang['status_bundled'] = 'fourni'; +$lang['msg_enabled'] = 'Greffon %s activé'; +$lang['msg_disabled'] = 'Greffon %s désactivé'; +$lang['msg_delete_success'] = 'Extension désinstallée'; +$lang['msg_template_install_success'] = 'Modèle %s installée avec succès'; +$lang['msg_template_update_success'] = 'Modèle %s mis à jour avec succès'; +$lang['msg_plugin_install_success'] = 'Greffon %s installé avec succès'; +$lang['msg_plugin_update_success'] = 'Greffon %s mis à jour avec succès'; +$lang['msg_upload_failed'] = 'Téléversement échoué'; +$lang['missing_dependency'] = 'Dépendance absente ou désactivée : %s'; +$lang['security_issue'] = 'Problème de sécurité : %s'; +$lang['security_warning'] = 'Avertissement deSécurité : %s'; +$lang['update_available'] = 'Mise à jour : La version %s est disponible.'; +$lang['wrong_folder'] = 'Greffon installé incorrectement : Renomer le dossier du greffon "%s" en "%s".'; +$lang['url_change'] = 'URL modifié : L\'URL de téléchargement a changé depuis le dernier téléchargement. Vérifiez si l\'URL est valide avant de mettre à jour l\'extension.
    Nouvel URL : %s
    Ancien : %s'; +$lang['error_badurl'] = 'Les URL doivent commencer par http ou https'; +$lang['error_dircreate'] = 'Impossible de créer le dossier temporaire pour le téléchargement.'; +$lang['error_download'] = 'Impossible de télécharger le fichier : %s'; +$lang['error_decompress'] = 'Impossible de décompresser le fichier téléchargé. C\'est peut être le résultat d\'une erreur de téléchargement, auquel cas vous devriez réessayer. Le format de compression est peut-être inconnu. Dans ce cas il vous faudra procéder à une installation manuelle.'; +$lang['error_findfolder'] = 'Impossible d\'idnetifier le dossier de l\'extension. vous devez procéder à une installation manuelle.'; +$lang['error_copy'] = 'Une erreur de copie de fichier s\'est produite lors de l\'installation des fichiers dans le dossier %s. Il se peut que le disque soit plein, ou que les permissions d\'accès aux fichiers soient incorrectes. Il est possible que le greffon soit partiellement installé et que cela laisse votre installation de DoluWiki instable.'; +$lang['noperms'] = 'Impossible d\'écrire dans le dossier des extensions.'; +$lang['notplperms'] = 'Impossible d\'écrire dans le dossier des modèles.'; +$lang['nopluginperms'] = 'Impossible d\'écrire dans le dossier des greffons.'; +$lang['git'] = 'Cette extension a été installé via git, vous voudrez peut-être ne pas la mettre à jour ici.'; +$lang['install_url'] = 'Installez depuis l\'URL :'; +$lang['install_upload'] = 'Téléversez l\'extension :'; diff --git a/sources/lib/plugins/extension/lang/ja/intro_install.txt b/sources/lib/plugins/extension/lang/ja/intro_install.txt new file mode 100644 index 0000000..889ed68 --- /dev/null +++ b/sources/lib/plugins/extension/lang/ja/intro_install.txt @@ -0,0 +1 @@ +ここでは、アップロードするかダウンロードURLを指定して、手動でプラグインやテンプレートをインストールできます。 diff --git a/sources/lib/plugins/extension/lang/ja/intro_plugins.txt b/sources/lib/plugins/extension/lang/ja/intro_plugins.txt new file mode 100644 index 0000000..9bfc684 --- /dev/null +++ b/sources/lib/plugins/extension/lang/ja/intro_plugins.txt @@ -0,0 +1 @@ +このDokuWikiに現在インストールされているプラグインです。ここでは、これらプラグインを有効化、無効化、アンインストールすることができます。同様にプラグインのアップデートも表示されます。アップデート前に、プラグインのマニュアルをお読みください。 \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/ja/intro_search.txt b/sources/lib/plugins/extension/lang/ja/intro_search.txt new file mode 100644 index 0000000..66d977b --- /dev/null +++ b/sources/lib/plugins/extension/lang/ja/intro_search.txt @@ -0,0 +1 @@ +このタブでは、DokuWiki用の利用可能なすべてのサードパーティのプラグインとテンプレートにアクセスできます。サードパーティ製のコードには、**セキュリティ上のリスク**の可能性があることに注意してください、最初に[[doku>ja:security#プラグインのセキュリティ|プラグインのセキュリティ]]を読むことをお勧めします。 \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/ja/intro_templates.txt b/sources/lib/plugins/extension/lang/ja/intro_templates.txt new file mode 100644 index 0000000..f97694a --- /dev/null +++ b/sources/lib/plugins/extension/lang/ja/intro_templates.txt @@ -0,0 +1 @@ +このDokuWikiに現在インストールされているテンプレートです。[[?do=admin&page=config|設定管理]]で使用するテンプレートを選択できます。 \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/ja/lang.php b/sources/lib/plugins/extension/lang/ja/lang.php new file mode 100644 index 0000000..0401d76 --- /dev/null +++ b/sources/lib/plugins/extension/lang/ja/lang.php @@ -0,0 +1,54 @@ + + */ +$lang['menu'] = '拡張機能管理'; +$lang['tab_plugins'] = 'インストール済プラグイン'; +$lang['tab_templates'] = 'インストール済テンプレート'; +$lang['tab_install'] = '手動インストール'; +$lang['notimplemented'] = 'この機能は未実装です。'; +$lang['notinstalled'] = 'この拡張機能はインストールされていません。'; +$lang['alreadyenabled'] = 'この拡張機能は有効です。'; +$lang['alreadydisabled'] = 'この拡張機能は無効です。'; +$lang['pluginlistsaveerror'] = 'プラグイン一覧の保存中にエラーが発生しました。'; +$lang['unknownauthor'] = '作者不明'; +$lang['unknownversion'] = 'バージョン不明'; +$lang['btn_info'] = '詳細情報を表示する。'; +$lang['btn_update'] = 'アップデート'; +$lang['btn_uninstall'] = 'アンインストール'; +$lang['btn_enable'] = '有効化'; +$lang['btn_disable'] = '無効化'; +$lang['btn_install'] = 'インストール'; +$lang['btn_reinstall'] = '再インストール'; +$lang['js']['reallydel'] = 'この拡張機能を本当にアンインストールしますか?'; +$lang['downloadurl'] = 'ダウンロード URL:'; +$lang['repository'] = 'リポジトリ:'; +$lang['depends'] = '依存:'; +$lang['similar'] = '類似:'; +$lang['status_installed'] = 'インストール済'; +$lang['status_not_installed'] = '未インストール'; +$lang['status_enabled'] = '有効'; +$lang['status_disabled'] = '無効'; +$lang['status_plugin'] = 'プラグイン'; +$lang['status_template'] = 'テンプレート'; +$lang['status_bundled'] = '同梱'; +$lang['msg_enabled'] = '%s プラグインを有効化しました。'; +$lang['msg_disabled'] = '%s プラグインを無効化しました。'; +$lang['msg_delete_success'] = '拡張機能をアンインストールしました。'; +$lang['msg_template_install_success'] = '%s テンプレートをインストールできました。'; +$lang['msg_template_update_success'] = '%s テンプレートをアップデートできました。'; +$lang['msg_plugin_install_success'] = '%s プラグインをインストールできました。'; +$lang['msg_plugin_update_success'] = '%s プラグインをアップデートできました。'; +$lang['msg_upload_failed'] = 'ファイルのアップロードに失敗しました。'; +$lang['security_issue'] = 'セキュリティ問題: %s'; +$lang['security_warning'] = 'セキュリティ警告: %s'; +$lang['update_available'] = 'アップデート:%sの新バージョンが利用可能です。 '; +$lang['error_badurl'] = 'URLはhttpかhttpsで始まる必要があります。'; +$lang['error_dircreate'] = 'ダウンロード用の一時フォルダが作成できません。'; +$lang['error_download'] = 'ファイルをダウンロードできません:%s'; +$lang['noperms'] = '拡張機能ディレクトリが書き込み不可です。'; +$lang['notplperms'] = 'テンプレートディレクトリが書き込み不可です。'; +$lang['nopluginperms'] = 'プラグインディレクトリが書き込み不可です。'; diff --git a/sources/lib/plugins/extension/lang/ko/intro_install.txt b/sources/lib/plugins/extension/lang/ko/intro_install.txt new file mode 100644 index 0000000..269df29 --- /dev/null +++ b/sources/lib/plugins/extension/lang/ko/intro_install.txt @@ -0,0 +1 @@ +여기에 플러그인과 템플릿을 수동으로 올리거나 직접 다운로드 URL을 제공하여 수동으로 설치할 수 있습니다. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/ko/intro_plugins.txt b/sources/lib/plugins/extension/lang/ko/intro_plugins.txt new file mode 100644 index 0000000..9ac7a3d --- /dev/null +++ b/sources/lib/plugins/extension/lang/ko/intro_plugins.txt @@ -0,0 +1 @@ +도쿠위키에 현재 설치된 플러그인입니다. 여기에서 플러그인을 활성화 또는 비활성화하거나 심지어 완전히 제거할 수 있습니다. 또한 플러그인 업데이트는 여기에 보여집니다. 업데이트하기 전에 플러그인의 설명문서를 읽으십시오. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/ko/intro_search.txt b/sources/lib/plugins/extension/lang/ko/intro_search.txt new file mode 100644 index 0000000..b676026 --- /dev/null +++ b/sources/lib/plugins/extension/lang/ko/intro_search.txt @@ -0,0 +1 @@ +이 탭은 도쿠위키를 위한 사용할 수 있는 모든 타사 플러그인과 템플릿에 접근하도록 제공합니다. 타사 코드를 설치하면 **보안 위험에 노출**될 수 있음을 유의하십시오, 먼저 [[doku>security#plugin_security|플러그인 보안]]에 대해 읽을 수 있습니다. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/ko/intro_templates.txt b/sources/lib/plugins/extension/lang/ko/intro_templates.txt new file mode 100644 index 0000000..d4320b8 --- /dev/null +++ b/sources/lib/plugins/extension/lang/ko/intro_templates.txt @@ -0,0 +1 @@ +도쿠위키에 현재 설치된 템플릿입니다. [[?do=admin&page=config|환경 설정 관리자]]에서 사용하는 템플릿을 선택할 수 있습니다. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/ko/lang.php b/sources/lib/plugins/extension/lang/ko/lang.php new file mode 100644 index 0000000..db0a49a --- /dev/null +++ b/sources/lib/plugins/extension/lang/ko/lang.php @@ -0,0 +1,88 @@ + + * @author Myeongjin + */ +$lang['menu'] = '확장 기능 관리자'; +$lang['tab_plugins'] = '설치된 플러그인'; +$lang['tab_templates'] = '설치된 템플릿'; +$lang['tab_search'] = '검색하고 설치'; +$lang['tab_install'] = '수동 설치'; +$lang['notimplemented'] = '이 기능은 아직 구현되지 않았습니다'; +$lang['notinstalled'] = '이 확장 기능은 설치되어 있지 않습니다'; +$lang['alreadyenabled'] = '이 확장 기능이 이미 활성화되어 있습니다'; +$lang['alreadydisabled'] = '이 확장 기능이 이미 비활성화되어 있습니다'; +$lang['pluginlistsaveerror'] = '플러그인 목록을 저장하는 중 오류가 있었습니다'; +$lang['unknownauthor'] = '알 수 없는 저자'; +$lang['unknownversion'] = '알 수 없는 버전'; +$lang['btn_info'] = '정보 더 보기'; +$lang['btn_update'] = '업데이트'; +$lang['btn_uninstall'] = '제거'; +$lang['btn_enable'] = '활성화'; +$lang['btn_disable'] = '비활성화'; +$lang['btn_install'] = '설치'; +$lang['btn_reinstall'] = '다시 설치'; +$lang['js']['reallydel'] = '정말 이 확장 기능을 제거하겠습니까?'; +$lang['search_for'] = '확장 기능 검색:'; +$lang['search'] = '검색'; +$lang['extensionby'] = '%s (저자 %s)'; +$lang['screenshot'] = '%s의 스크린샷'; +$lang['popularity'] = '인기: %s%%'; +$lang['homepage_link'] = '문서'; +$lang['bugs_features'] = '버그'; +$lang['tags'] = '태그:'; +$lang['author_hint'] = '이 저자로 확장 기능 검색'; +$lang['installed'] = '설치됨:'; +$lang['downloadurl'] = '다운로드 URL:'; +$lang['repository'] = '저장소:'; +$lang['unknown'] = '알 수 없음'; +$lang['installed_version'] = '설치된 버전:'; +$lang['install_date'] = '마지막 업데이트:'; +$lang['available_version'] = '가능한 버전:'; +$lang['compatible'] = '다음과의 호환성:'; +$lang['depends'] = '다음에 의존:'; +$lang['similar'] = '다음과 비슷:'; +$lang['conflicts'] = '다음과 충돌:'; +$lang['donate'] = '이것이 좋나요?'; +$lang['donate_action'] = '저자에게 커피를 사주세요!'; +$lang['repo_retry'] = '다시 시도'; +$lang['provides'] = '제공:'; +$lang['status'] = '상태:'; +$lang['status_installed'] = '설치됨'; +$lang['status_not_installed'] = '설치되지 않음'; +$lang['status_protected'] = '보호됨'; +$lang['status_enabled'] = '활성화됨'; +$lang['status_disabled'] = '비활성화됨'; +$lang['status_unmodifiable'] = '수정할 수 없음'; +$lang['status_plugin'] = '플러그인'; +$lang['status_template'] = '템플릿'; +$lang['status_bundled'] = '포함'; +$lang['msg_enabled'] = '%s 플러그인이 활성화되었습니다'; +$lang['msg_disabled'] = '%s 플러그인이 비활성화되었습니다'; +$lang['msg_delete_success'] = '확장 기능이 제거되었습니다'; +$lang['msg_template_install_success'] = '%s 템플릿을 성공적으로 설치했습니다'; +$lang['msg_template_update_success'] = '%s 템플릿을 성공적으로 업데이트했습니다'; +$lang['msg_plugin_install_success'] = '%s 플러그인을 성공적으로 설치했습니다'; +$lang['msg_plugin_update_success'] = '%s 플러그인을 성공적으로 업데이트했습니다'; +$lang['msg_upload_failed'] = '파일 올리기에 실패했습니다'; +$lang['missing_dependency'] = '의존성을 잃었거나 비활성화되어 있습니다: %s'; +$lang['security_issue'] = '보안 문제: %s'; +$lang['security_warning'] = '보안 경고: %s'; +$lang['update_available'] = '업데이트: 새 버전 %s(을)를 사용할 수 있습니다.'; +$lang['wrong_folder'] = '플러그인이 올바르지 않게 설치됨: 플러그인 디렉터리를 "%s"에서 "%s"로 이름을 바꾸세요.'; +$lang['url_change'] = 'URL이 바뀜: 다운로드 URL이 최신 다운로드 이래로 바뀌었습니다. 확장 기능을 업데이트하기 전에 새 URL이 올바른지 확인하세요.
    새 URL: %s
    오래된 URL: %s'; +$lang['error_badurl'] = 'URL은 http나 https로 시작해야 합니다'; +$lang['error_dircreate'] = '다운로드를 받을 임시 폴더를 만들 수 없습니다'; +$lang['error_download'] = '파일을 다운로드할 수 없습니다: %s'; +$lang['error_decompress'] = '다운로드한 파일의 압축을 풀 수 없습니다. 이는 아마도 잘못된 다운로드의 결과로, 이럴 경우 다시 시도해야 합니다; 또는 압축 형식을 알 수 없으며, 이럴 경우 수동으로 다운로드하고 설치해야 합니다.'; +$lang['error_findfolder'] = '확장 기능 디렉터리를 식별할 수 없습니다, 수동으로 다운로드하고 설치해야 합니다'; +$lang['error_copy'] = '%s 디렉터리에 파일을 설치하는 동안 파일 복사 오류가 발생했습니다: 디스크가 꽉 찼거나 파일 접근 권한이 잘못되었을 수도 있습니다. 플러그인 설치가 부분적으로 되었거나 불안정하게 위키 설치가 되었을 수 있습니다.'; +$lang['noperms'] = '확장 기능 디렉터리에 쓸 수 없습니다'; +$lang['notplperms'] = '임시 디렉터리에 쓸 수 없습니다'; +$lang['nopluginperms'] = '플러그인 디렉터리에 쓸 수 없습니다'; +$lang['git'] = '이 확장 기능은 git을 통해 설치되었으며, 여기에서 업데이트할 수 없을 수 있습니다.'; +$lang['install_url'] = 'URL에서 설치:'; +$lang['install_upload'] = '확장 기능 올리기:'; diff --git a/sources/lib/plugins/extension/lang/nl/intro_install.txt b/sources/lib/plugins/extension/lang/nl/intro_install.txt new file mode 100644 index 0000000..6a0b410 --- /dev/null +++ b/sources/lib/plugins/extension/lang/nl/intro_install.txt @@ -0,0 +1 @@ +Hier kunt u handmatig plugins en templates installeren door deze te uploaden of door een directe download URL op te geven. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/nl/intro_plugins.txt b/sources/lib/plugins/extension/lang/nl/intro_plugins.txt new file mode 100644 index 0000000..0077aca --- /dev/null +++ b/sources/lib/plugins/extension/lang/nl/intro_plugins.txt @@ -0,0 +1 @@ +Dit zijn de momenteel in uw Dokuwiki geïnstalleerde plugins. U kunt deze hier aan of uitschakelen danwel geheel deïnstalleren. Plugin updates zijn hier ook opgenomen, lees de pluin documentatie voordat u update. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/nl/intro_search.txt b/sources/lib/plugins/extension/lang/nl/intro_search.txt new file mode 100644 index 0000000..8fc3900 --- /dev/null +++ b/sources/lib/plugins/extension/lang/nl/intro_search.txt @@ -0,0 +1 @@ +Deze tab verschaft u toegang tot alle plugins en templates vervaardigd door derden en bestemd voor Dokuwiki. Houdt er rekening meel dat indien u Plugins van derden installeerd deze een **veiligheids risico ** kunnen bevatten, geadviseerd wordt om eerst te lezen [[doku>security#plugin_security|plugin security]]. \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/nl/intro_templates.txt b/sources/lib/plugins/extension/lang/nl/intro_templates.txt new file mode 100644 index 0000000..5ef23da --- /dev/null +++ b/sources/lib/plugins/extension/lang/nl/intro_templates.txt @@ -0,0 +1 @@ +Deze templates zijn thans in DokuWiki geïnstalleerd. U kent een template selecteren middels [[?do=admin&page=config|Configuration Manager]] . \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/nl/lang.php b/sources/lib/plugins/extension/lang/nl/lang.php new file mode 100644 index 0000000..2983f9f --- /dev/null +++ b/sources/lib/plugins/extension/lang/nl/lang.php @@ -0,0 +1,87 @@ + + */ +$lang['menu'] = 'Extension Manager (Uitbreidings Beheerder)'; +$lang['tab_plugins'] = 'Geïnstalleerde Plugins'; +$lang['tab_templates'] = 'Geïnstalleerde Templates'; +$lang['tab_search'] = 'Zoek en installeer'; +$lang['tab_install'] = 'Handmatige installatie'; +$lang['notimplemented'] = 'Deze toepassing is nog niet geïnstalleerd'; +$lang['notinstalled'] = 'Deze uitbreiding is nog niet geïnstalleerd'; +$lang['alreadyenabled'] = 'Deze uitbreiding is reeds ingeschakeld'; +$lang['alreadydisabled'] = 'Deze uitbreiding is reeds uitgeschakeld'; +$lang['pluginlistsaveerror'] = 'Fout bij het opslaan van de plugin lijst'; +$lang['unknownauthor'] = 'Onbekende auteur'; +$lang['unknownversion'] = 'Onbekende versie'; +$lang['btn_info'] = 'Toon meer informatie'; +$lang['btn_update'] = 'Update'; +$lang['btn_uninstall'] = 'Deinstalleer'; +$lang['btn_enable'] = 'Schakel aan'; +$lang['btn_disable'] = 'Schakel uit'; +$lang['btn_install'] = 'Installeer'; +$lang['btn_reinstall'] = 'Her-installeer'; +$lang['js']['reallydel'] = 'Wilt u deze uitbreiding deinstalleren ?'; +$lang['search_for'] = 'Zoek Uitbreiding:'; +$lang['search'] = 'Zoek'; +$lang['extensionby'] = '%s by %s'; +$lang['screenshot'] = 'Schermafdruk bij %s'; +$lang['popularity'] = 'Populariteit:%s%%'; +$lang['homepage_link'] = 'Dokumenten'; +$lang['bugs_features'] = 'Bugs'; +$lang['tags'] = 'Tags:'; +$lang['author_hint'] = 'Zoek uitbreidingen van deze auteur:'; +$lang['installed'] = 'Geinstalleerd:'; +$lang['downloadurl'] = 'Download URL:'; +$lang['repository'] = 'Repository ( centrale opslag)'; +$lang['unknown'] = 'onbekend'; +$lang['installed_version'] = 'Geïnstalleerde versie'; +$lang['install_date'] = 'Uw laatste update :'; +$lang['available_version'] = 'Beschikbare versie:'; +$lang['compatible'] = 'Compatible met :'; +$lang['depends'] = 'Afhankelijk van :'; +$lang['similar'] = 'Soortgelijk :'; +$lang['conflicts'] = 'Conflicteerd met :'; +$lang['donate'] = 'Vindt u dit leuk ?'; +$lang['donate_action'] = 'Koop een kop koffie voor de auteur!'; +$lang['repo_retry'] = 'Herhaal'; +$lang['provides'] = 'Zorgt voor:'; +$lang['status'] = 'Status:'; +$lang['status_installed'] = 'Geïnstalleerd'; +$lang['status_not_installed'] = 'niet geïnstalleerd '; +$lang['status_protected'] = 'beschermd'; +$lang['status_enabled'] = 'ingeschakeld'; +$lang['status_disabled'] = 'uitgeschakeld'; +$lang['status_unmodifiable'] = 'Niet wijzigbaar'; +$lang['status_plugin'] = 'plugin'; +$lang['status_template'] = 'template'; +$lang['status_bundled'] = 'Gebundeld'; +$lang['msg_enabled'] = 'Plugin %s ingeschakeld'; +$lang['msg_disabled'] = 'Plugin %s uitgeschakeld'; +$lang['msg_delete_success'] = 'Uitbreiding gedeinstalleerd'; +$lang['msg_template_install_success'] = 'Template %s werd succesvol geïnstalleerd'; +$lang['msg_template_update_success'] = 'Template %s werd succesvol ge-update'; +$lang['msg_plugin_install_success'] = 'Plugin %s werd succesvol geïnstalleerd'; +$lang['msg_plugin_update_success'] = 'Plugin %s werd succesvol ge-update'; +$lang['msg_upload_failed'] = 'Uploaden van het bestand is mislukt'; +$lang['missing_dependency'] = 'niet aanwezige of uitgeschakelde afhankelijkheid %s'; +$lang['security_issue'] = 'Veiligheids kwestie: %s'; +$lang['security_warning'] = 'Veiligheids Waarschuwing %s'; +$lang['update_available'] = 'Update: Nieuwe versie %s is beschikbaar.'; +$lang['wrong_folder'] = 'Plugin onjuist geïnstalleerd: Hernoem de plugin directory van "%s" naar"%s"'; +$lang['url_change'] = 'URL gewijzigd: Download URL is gewijzigd sinds de laatste download. Controleer of de nieuwe URL juist is voordat u de uitbreiding update.
    Nieuw:%s
    Vorig: %s'; +$lang['error_badurl'] = 'URLs moeten beginnen met http of https'; +$lang['error_dircreate'] = 'De tijdelijke map kon niet worden gemaakt om de download te ontvangen'; +$lang['error_download'] = 'Het is niet mogelijk het bestand te downloaden: %s'; +$lang['error_decompress'] = 'Onmogelijk om het gedownloade bestand uit te pakken. Dit is wellicht het gevolg van een onvolledige/onjuiste download, in welk geval u het nog eens moet proberen; of het compressie formaat is onbekend in welk geval u het bestand handmatig moet downloaden en installeren.'; +$lang['error_findfolder'] = 'Onmogelijk om de uitbreidings directory te vinden, u moet het zelf downloaden en installeren'; +$lang['error_copy'] = 'Er was een bestand kopieer fout tijdens het installeren van bestanden in directory %s: de schijf kan vol zijn of de bestand toegangs rechten kunnen onjuist zijn. Dit kan tot gevolg hebben dat de plugin slechts gedeeltelijk werd geïnstalleerd waardoor uw wiki installatie onstabiel is '; +$lang['noperms'] = 'Uitbreidings directory is niet schrijfbaar'; +$lang['notplperms'] = 'Template directory is niet schrijfbaar'; +$lang['nopluginperms'] = 'Plugin directory is niet schrijfbaar'; +$lang['git'] = 'De uitbreiding werd geïnstalleerd via git, u wilt deze hier wellicht niet aanpassen.'; +$lang['install_url'] = 'Installeer vanaf URL:'; +$lang['install_upload'] = 'Upload Uitbreiding:'; diff --git a/sources/lib/plugins/extension/lang/ru/lang.php b/sources/lib/plugins/extension/lang/ru/lang.php new file mode 100644 index 0000000..d524f07 --- /dev/null +++ b/sources/lib/plugins/extension/lang/ru/lang.php @@ -0,0 +1,60 @@ + + */ +$lang['menu'] = 'Управление дополнениями'; +$lang['tab_plugins'] = 'Установленные плагины'; +$lang['tab_templates'] = 'Установленные шаблоны'; +$lang['tab_search'] = 'Поиск и установка'; +$lang['tab_install'] = 'Ручная установка'; +$lang['notinstalled'] = 'Это дополнение не установлено'; +$lang['unknownauthor'] = 'Автор неизвестен'; +$lang['unknownversion'] = 'Версия неизвестна'; +$lang['btn_info'] = 'Отобразить доп. информацию'; +$lang['btn_update'] = 'Обновить'; +$lang['btn_uninstall'] = 'Удалить'; +$lang['btn_enable'] = 'Включить'; +$lang['btn_disable'] = 'Отключить'; +$lang['btn_install'] = 'Установить'; +$lang['btn_reinstall'] = 'Переустановить'; +$lang['js']['reallydel'] = 'Действительно удалить это дополнение?'; +$lang['search_for'] = 'Поиск дополнения:'; +$lang['search'] = 'Найти'; +$lang['extensionby'] = '%s — %s'; +$lang['popularity'] = 'Попоулярность: %s%%'; +$lang['bugs_features'] = 'Ошибки'; +$lang['tags'] = 'Метки:'; +$lang['author_hint'] = 'Найти дополнения этого автора'; +$lang['installed'] = 'Установлено:'; +$lang['downloadurl'] = 'Ссылка для скачивания:'; +$lang['repository'] = 'Репозиторий:'; +$lang['unknown'] = 'неизвестно'; +$lang['installed_version'] = 'Установленная версия:'; +$lang['install_date'] = 'Последнее обновление:'; +$lang['available_version'] = 'Доступная версия:'; +$lang['compatible'] = 'Совместим с:'; +$lang['depends'] = 'Зависит от:'; +$lang['similar'] = 'Похож на:'; +$lang['conflicts'] = 'Конфликтует с:'; +$lang['donate'] = 'Нравится?'; +$lang['donate_action'] = 'Купить автору кофе!'; +$lang['repo_retry'] = 'Повторить'; +$lang['status_installed'] = 'установлено'; +$lang['status_not_installed'] = 'не установлено'; +$lang['status_protected'] = 'защищено'; +$lang['status_enabled'] = 'включен'; +$lang['status_disabled'] = 'отключено'; +$lang['status_unmodifiable'] = 'неизменяемо'; +$lang['status_plugin'] = 'плагин'; +$lang['status_template'] = 'шаблон'; +$lang['status_bundled'] = 'в комплекте'; +$lang['msg_enabled'] = 'Плагин %s включен'; +$lang['msg_disabled'] = 'Плагин %s отключен'; +$lang['msg_delete_success'] = 'Дополнение удалено'; +$lang['msg_template_install_success'] = 'Шаблон %s успешно установлен'; +$lang['msg_template_update_success'] = 'Шаблон %s успешно обновлён'; +$lang['msg_plugin_install_success'] = 'Плагин %s успешно установлен'; +$lang['msg_plugin_update_success'] = 'Плагин %s успешно обновлён'; diff --git a/sources/lib/plugins/extension/lang/sk/lang.php b/sources/lib/plugins/extension/lang/sk/lang.php new file mode 100644 index 0000000..d00c2e3 --- /dev/null +++ b/sources/lib/plugins/extension/lang/sk/lang.php @@ -0,0 +1,58 @@ + + */ +$lang['tab_plugins'] = 'Inštalované pluginy'; +$lang['tab_templates'] = 'Inštalované šablóny'; +$lang['tab_search'] = 'Hľadanie e inštalácia'; +$lang['tab_install'] = 'Manuálna inštalácia'; +$lang['notimplemented'] = 'Táto vlastnosť ešte nebola implementovaná'; +$lang['unknownauthor'] = 'Neznámy autor'; +$lang['unknownversion'] = 'Neznáma verzia'; +$lang['btn_info'] = 'Viac informácií'; +$lang['btn_update'] = 'Aktualizácia'; +$lang['btn_uninstall'] = 'Odinštalovanie'; +$lang['btn_enable'] = 'Povolenie'; +$lang['btn_disable'] = 'Zablokovanie'; +$lang['btn_install'] = 'Inštalácia'; +$lang['btn_reinstall'] = 'Re-Inštalácia'; +$lang['search'] = 'Vyhľadávanie'; +$lang['extensionby'] = '%s od %s'; +$lang['screenshot'] = 'Obrázok od %s'; +$lang['popularity'] = 'Popularita: %s%%'; +$lang['homepage_link'] = 'Dokumentácia'; +$lang['bugs_features'] = 'Chyby:'; +$lang['tags'] = 'Kľúčové slová:'; +$lang['unknown'] = 'neznámy'; +$lang['installed_version'] = 'Inštalovaná verzia:'; +$lang['install_date'] = 'Posledná aktualizácia:'; +$lang['available_version'] = 'Dostupné verzie:'; +$lang['compatible'] = 'Kompaktibilita:'; +$lang['similar'] = 'Podobné:'; +$lang['conflicts'] = 'V konflikte:'; +$lang['status_installed'] = 'inštalovaný'; +$lang['status_not_installed'] = 'neinštalovaný'; +$lang['status_protected'] = 'chránený'; +$lang['status_enabled'] = 'povolený'; +$lang['status_disabled'] = 'nepovolený'; +$lang['status_plugin'] = 'plugin'; +$lang['status_template'] = 'šablóna'; +$lang['msg_enabled'] = 'Plugin %s povolený'; +$lang['msg_disabled'] = 'Plugin %s nepovolený'; +$lang['msg_template_install_success'] = 'Šablóna %s úspešne nainštalovaná'; +$lang['msg_template_update_success'] = 'Šablóna %s úspešne aktualizovaná'; +$lang['msg_plugin_install_success'] = 'Plugin %s úspešne nainštalovaný'; +$lang['msg_plugin_update_success'] = 'Plugin %s úspešne aktualizovaný'; +$lang['msg_upload_failed'] = 'Nahrávanie súboru zlyhalo'; +$lang['update_available'] = 'Aktualizácia: Nová verzia %s.'; +$lang['wrong_folder'] = 'Plugin nesprávne nainštalovaný: Premenujte adresár s pluginom "%s" na "%s".'; +$lang['error_badurl'] = 'URL by mali mať na začiatku http alebo https'; +$lang['error_dircreate'] = 'Nie je možné vytvoriť dočasný adresár pre uloženie sťahovaného súboru'; +$lang['error_download'] = 'Nie je možné stiahnuť súbor: %s'; +$lang['error_decompress'] = 'Nie je možné dekomprimovať stiahnutý súbor. Môže to byť dôvodom chyby sťahovania (v tom prípade to skúste znova) alebo neznámym kompresným formátom (v tom prípade musíte stiahnuť a inštalovať manuálne).'; +$lang['error_copy'] = 'Chyba kopírovania pri inštalácii do adresára %s: disk môže byť plný alebo nemáte potrebné prístupové oprávnenie. Dôsledkom može byť čiastočne inštalovaný plugin a nestabilná wiki inštalácia.'; +$lang['nopluginperms'] = 'Adresár s pluginom nie je zapisovateľný.'; +$lang['install_url'] = 'Inštalácia z URL:'; diff --git a/sources/lib/plugins/extension/lang/zh/intro_install.txt b/sources/lib/plugins/extension/lang/zh/intro_install.txt new file mode 100644 index 0000000..6408393 --- /dev/null +++ b/sources/lib/plugins/extension/lang/zh/intro_install.txt @@ -0,0 +1 @@ +你可以通过上传或直接提供下载链接来安装插件和模板。 \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/zh/intro_plugins.txt b/sources/lib/plugins/extension/lang/zh/intro_plugins.txt new file mode 100644 index 0000000..69cb343 --- /dev/null +++ b/sources/lib/plugins/extension/lang/zh/intro_plugins.txt @@ -0,0 +1 @@ +这些是你当前已经安装的插件。你可以在这里启用和禁用甚至卸载它们。插件的更新信息也显示在这,请一定在更新之前阅读插件的文档。 \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/zh/intro_search.txt b/sources/lib/plugins/extension/lang/zh/intro_search.txt new file mode 100644 index 0000000..0059075 --- /dev/null +++ b/sources/lib/plugins/extension/lang/zh/intro_search.txt @@ -0,0 +1 @@ +这个标签会为你展示所有DokuWiki的第三方插件和模板。但你需要知道这些由第三方提供的代码可能会给你带来**安全方面的风险**,你最好先读一下[[doku>security#plugin_security|插件安全性]]。 \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/zh/intro_templates.txt b/sources/lib/plugins/extension/lang/zh/intro_templates.txt new file mode 100644 index 0000000..20575d3 --- /dev/null +++ b/sources/lib/plugins/extension/lang/zh/intro_templates.txt @@ -0,0 +1 @@ +DokuWiki当前所使用的模板已经安装了,你可以在[[?do=admin&page=config|配置管理器]]里选择你要的模板。 \ No newline at end of file diff --git a/sources/lib/plugins/extension/lang/zh/lang.php b/sources/lib/plugins/extension/lang/zh/lang.php new file mode 100644 index 0000000..4d40acc --- /dev/null +++ b/sources/lib/plugins/extension/lang/zh/lang.php @@ -0,0 +1,72 @@ + + * @author xiqingongzi + * @author qinghao + */ +$lang['menu'] = '扩展管理器'; +$lang['tab_plugins'] = '安装插件'; +$lang['tab_templates'] = '安装模板'; +$lang['tab_search'] = '搜索和安装'; +$lang['tab_install'] = '手动安装'; +$lang['notimplemented'] = '未实现的特性'; +$lang['notinstalled'] = '该扩展未安装'; +$lang['alreadyenabled'] = '该扩展已激活'; +$lang['alreadydisabled'] = '该扩展已关闭'; +$lang['pluginlistsaveerror'] = '保存插件列表时碰到个错误'; +$lang['unknownauthor'] = '未知作者'; +$lang['unknownversion'] = '未知版本'; +$lang['btn_info'] = '查看更多信息'; +$lang['btn_update'] = '更新'; +$lang['btn_uninstall'] = '卸载'; +$lang['btn_enable'] = '激活'; +$lang['btn_disable'] = '关闭'; +$lang['btn_install'] = '安装'; +$lang['btn_reinstall'] = '重新安装'; +$lang['js']['reallydel'] = '确定卸载这个扩展么?'; +$lang['search_for'] = '搜索扩展'; +$lang['search'] = '搜索'; +$lang['extensionby'] = '%s by %s'; +$lang['screenshot'] = '%s 的截图'; +$lang['popularity'] = '人气: %s%%'; +$lang['homepage_link'] = '文档'; +$lang['bugs_features'] = '错误'; +$lang['tags'] = '标签:'; +$lang['author_hint'] = '搜索这个作者的插件'; +$lang['installed'] = '已安装的:'; +$lang['downloadurl'] = '下载地址:'; +$lang['repository'] = '版本库:'; +$lang['unknown'] = '未知的'; +$lang['installed_version'] = '已安装版本:'; +$lang['install_date'] = '您的最后一次升级:'; +$lang['compatible'] = '兼容于:'; +$lang['depends'] = '依赖于:'; +$lang['similar'] = '相似于:'; +$lang['conflicts'] = '冲突于:'; +$lang['donate'] = '喜欢?'; +$lang['donate_action'] = '捐给作者一杯咖啡钱!'; +$lang['repo_retry'] = '重试'; +$lang['provides'] = '提供:'; +$lang['status'] = '现状:'; +$lang['status_installed'] = '已安装的'; +$lang['status_not_installed'] = '未安装'; +$lang['status_protected'] = '受保护'; +$lang['status_enabled'] = '启用'; +$lang['status_disabled'] = '禁用'; +$lang['status_unmodifiable'] = '不可修改'; +$lang['status_plugin'] = '插件'; +$lang['status_template'] = '模板'; +$lang['msg_enabled'] = '插件 %s 已启用'; +$lang['msg_disabled'] = '插件 %s 已禁用'; +$lang['msg_delete_success'] = '插件已经卸载'; +$lang['msg_template_install_success'] = '模板 %s 安装成功'; +$lang['msg_template_update_success'] = '模板 %s 更新成功'; +$lang['msg_plugin_install_success'] = '插件 %s 安装成功'; +$lang['msg_plugin_update_success'] = '插件 %s 更新成功'; +$lang['msg_upload_failed'] = '上传文件失败'; +$lang['missing_dependency'] = '缺少或者被禁用依赖: %s'; +$lang['security_issue'] = '安全问题: %s'; +$lang['security_warning'] = '安全警告: %s'; diff --git a/sources/lib/plugins/extension/plugin.info.txt b/sources/lib/plugins/extension/plugin.info.txt new file mode 100644 index 0000000..ef16d78 --- /dev/null +++ b/sources/lib/plugins/extension/plugin.info.txt @@ -0,0 +1,7 @@ +base extension +author Michael Hamann +email michael@content-space.de +date 2013-08-01 +name Extension Manager +desc Allows managing and installing plugins and templates +url https://www.dokuwiki.org/plugin:extension diff --git a/sources/lib/plugins/extension/script.js b/sources/lib/plugins/extension/script.js new file mode 100644 index 0000000..fab8816 --- /dev/null +++ b/sources/lib/plugins/extension/script.js @@ -0,0 +1,113 @@ +jQuery(function(){ + + var $extmgr = jQuery('#extension__manager'); + + /** + * Confirm uninstalling + */ + $extmgr.find('input.uninstall').click(function(e){ + if(!window.confirm(LANG.plugins.extension.reallydel)){ + e.preventDefault(); + return false; + } + return true; + }); + + /** + * very simple lightbox + * @link http://webdesign.tutsplus.com/tutorials/htmlcss-tutorials/super-simple-lightbox-with-css-and-jquery/ + */ + $extmgr.find('a.extension_screenshot').click(function(e) { + e.preventDefault(); + + //Get clicked link href + var image_href = jQuery(this).attr("href"); + + // create lightbox if needed + var $lightbox = jQuery('#plugin__extensionlightbox'); + if(!$lightbox.length){ + $lightbox = jQuery('

    Click to close

    ') + .appendTo(jQuery('body')) + .hide() + .click(function(){ + $lightbox.hide(); + }); + } + + // fill and show it + $lightbox + .show() + .find('div').html(''); + + + return false; + }); + + /** + * Enable/Disable extension via AJAX + */ + $extmgr.find('input.disable, input.enable').click(function (e) { + e.preventDefault(); + var $btn = jQuery(this); + + // get current state + var extension = $btn.attr('name').split('[')[2]; + extension = extension.substr(0, extension.length - 1); + var act = ($btn.hasClass('disable')) ? 'disable' : 'enable'; + + // disable while we wait + $btn.attr('disabled', 'disabled'); + $btn.css('cursor', 'wait'); + + // execute + jQuery.get( + DOKU_BASE + 'lib/exe/ajax.php', + { + call: 'plugin_extension', + ext: extension, + act: act + }, + function (data) { + $btn.css('cursor', '') + .removeAttr('disabled') + .removeClass('disable') + .removeClass('enable') + .val(data.label) + .addClass(data.reverse) + .parents('li') + .removeClass('disabled') + .removeClass('enabled') + .addClass(data.state); + } + ); + }); + + /** + * AJAX detail infos + */ + $extmgr.find('a.info').click(function(e){ + e.preventDefault(); + + var $link = jQuery(this); + var $details = $link.parent().find('dl.details'); + if($details.length){ + $link.toggleClass('close'); + $details.toggle(); + return; + } + + $link.addClass('close'); + jQuery.get( + DOKU_BASE + 'lib/exe/ajax.php', + { + call: 'plugin_extension', + ext: $link.data('extid'), + act: 'info' + }, + function(data){ + $link.parent().append(data); + } + ); + }); + +}); \ No newline at end of file diff --git a/sources/lib/plugins/extension/style.less b/sources/lib/plugins/extension/style.less new file mode 100644 index 0000000..d206890 --- /dev/null +++ b/sources/lib/plugins/extension/style.less @@ -0,0 +1,363 @@ +/* + * Extension plugin styles + * + * @author Christopher Smith + * @author Piyush Mishra + * @author Håkan Sandell + * @author Anika Henke + */ + +/** + * very simple lightbox + * @link http://webdesign.tutsplus.com/tutorials/htmlcss-tutorials/super-simple-lightbox-with-css-and-jquery/ + */ +#plugin__extensionlightbox { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: url(images/overlay.png) repeat; + text-align: center; + cursor: pointer; + z-index: 9999; + + p { + text-align: right; + color: #fff; + margin-right: 20px; + font-size: 12px; + } + + img { + box-shadow: 0 0 25px #111; + -webkit-box-shadow: 0 0 25px #111; + -moz-box-shadow: 0 0 25px #111; + max-width: 90%; + max-height: 90%; + } +} + +/** + * general styles + */ +#extension__manager { + // tab layout - most of it is in the main template + ul.tabs li.active a { + background-color: @ini_background_alt; + border-bottom: solid 1px @ini_background_alt; + z-index: 2; + } + .panelHeader { + background-color: @ini_background_alt; + margin: 0 0 10px 0; + padding: 10px 10px 8px; + overflow: hidden; + } + + // message spacing + div.msg { + margin: 0.4em 0 0 0; + } +} + +/* + * extensions table + */ +#extension__list { + ul.extensionList { + margin-left: 0; + margin-right: 0; + padding: 0; + list-style: none; + } + + ul.extensionList li { + margin: 0 0 .5em; + padding: 0 0 .5em; + color: @ini_text; + border-bottom: 1px solid @ini_border; + overflow: hidden; + } + + input.button { + margin: 0 .3em .3em 0; + } +} + +/** + * extension table left column + */ +#extension__list .legend { + position: relative; + width: 75%; + float: left; + + // padding + > div { + padding: 0 .5em 0 132px; + border-right: 1px solid @ini_background_alt; + overflow: hidden; + } + + // screenshot + div.screenshot { + margin-top: 4px; + margin-left: -132px; + max-width: 120px; + float: left; + position: relative; + + img { + width: 120px; + height: 70px; + border-radius: 5px; + box-shadow: 2px 2px 2px #666; + } + + span { + min-height: 24px; + min-width: 24px; + position: absolute; + left: 0; + top: 0; + } + } + + // plugin headline + h2 { + width: 100%; + float: right; + margin: 0.2em 0 0.5em; + font-size: 100%; + font-weight: normal; + border: none; + + strong { + font-size: 120%; + font-weight: bold; + vertical-align: baseline; + } + } + + // description + p { + margin: 0 0 0.6em 0; + } + + // popularity bar + div.popularity { + background-color: @ini_background; + border: 1px solid silver; + height: .4em; + margin: 0 auto; + padding: 1px; + width: 5.5em; + position: absolute; + right: .5em; + top: 0.2em; + + div { + background-color: @ini_border; + height: 100%; + } + } + + // Docs, Bugs, Tags + div.linkbar { + font-size: 85%; + + span.tags { + padding-left: 18px; + background: transparent url(images/tag.png) no-repeat 0 0; + } + } + + // more info button + a.info { + background: transparent url(images/down.png) no-repeat 0 0; + border-width: 0; + height: 13px; + width: 13px; + text-indent: -9999px; + float: right; + margin: .5em 0 0; + overflow: hidden; + + &.close { + background: transparent url(images/up.png) no-repeat 0 0; + } + } + + // detailed info box + dl.details { + margin: 0.4em 0 0 0; + font-size: 85%; + border-top: 1px solid @ini_background_alt; + clear: both; + + dt { + clear: left; + float: left; + width: 25%; + margin: 0; + text-align: right; + font-weight: normal; + padding: 0.2em 5px 0 0; + font-weight: bold; + } + + dd { + margin-left: 25%; + padding: 0.2em 0 0 5px; + + a.donate { + padding-left: 18px; + background: transparent url(images/donate.png) left center no-repeat; + } + } + } +} + +[dir=rtl] #extension__list .legend { + float: right; + + > div { + padding: 0 132px 0 .5em; + border-left: 1px solid @ini_background_alt; + border-right-width: 0; + } + + div.screenshot { + margin-left: 0; + margin-right: -132px; + float: right; + + span { + left: auto; + right: 0; + } + } + + h2 { + float: left; + } + + div.popularity { + right: auto; + left: .5em; + } + + div.linkbar span.tags, + dl.details dd a.donate { + padding-left: 0; + padding-right: 18px; + background-position: top right; + } + + a.info { + float: left; + } + + dl.details { + dt { + clear: right; + float: right; + text-align: left; + padding-left: 5px; + padding-right: 0; + } + + dd { + margin-left: 0; + margin-right: 25%; + padding-left: 0; + padding-right: 5px; + } + } +} + +/* + * Enabled/Disabled overrides + */ +#extension__list { + .enabled div.screenshot span { + background: transparent url(images/enabled.png) no-repeat 2px 2px; + } + + .disabled div.screenshot span { + background: transparent url(images/disabled.png) no-repeat 2px 2px; + } + + .disabled .legend { + opacity: 0.7; + } +} + +/** + * extension table right column + */ +#extension__manager .actions { + padding: 0; + font-size: 95%; + width: 25%; + float: right; + text-align: right; + + .version { + display: block; + } + + p { + margin: 0.2em 0; + text-align: center; + } + + p.permerror { + margin-left: 0.4em; + text-align: left; + padding-left: 19px; + background: transparent url(images/warning.png) center left no-repeat; + line-height: 18px; + font-size: 12px; + } +} + +[dir=rtl] #extension__manager .actions { + float: left; + text-align: left; + + p.permerror { + margin-left: 0; + margin-right: 0.4em; + text-align: right; + padding-left: 0; + padding-right: 19px; + background-position: center right; + } +} + +/** + * Search form + */ +#extension__manager form.search { + display: block; + margin-bottom: 2em; + + span { + font-weight: bold; + } + + input.edit { + width: 25em; + } +} + +/** + * Install form + */ +#extension__manager form.install { + text-align: center; + display: block; + width: 60%; +} diff --git a/sources/lib/plugins/info/syntax.php b/sources/lib/plugins/info/syntax.php index f8c6eb4..9265f44 100644 --- a/sources/lib/plugins/info/syntax.php +++ b/sources/lib/plugins/info/syntax.php @@ -48,7 +48,7 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin { /** * Handle the match */ - function handle($match, $state, $pos, Doku_Handler &$handler){ + function handle($match, $state, $pos, Doku_Handler $handler){ $match = substr($match,7,-2); //strip ~~INFO: from start and ~~ from end return array(strtolower($match)); } @@ -56,7 +56,7 @@ class syntax_plugin_info extends DokuWiki_Syntax_Plugin { /** * Create output */ - function render($format, Doku_Renderer &$renderer, $data) { + function render($format, Doku_Renderer $renderer, $data) { if($format == 'xhtml'){ /** @var Doku_Renderer_xhtml $renderer */ //handle various info stuff diff --git a/sources/lib/plugins/plugin/admin.php b/sources/lib/plugins/plugin/admin.php deleted file mode 100644 index 3f019d5..0000000 --- a/sources/lib/plugins/plugin/admin.php +++ /dev/null @@ -1,137 +0,0 @@ - - */ -// must be run within Dokuwiki -if(!defined('DOKU_INC')) die(); - -// todo -// - maintain a history of file modified -// - allow a plugin to contain extras to be copied to the current template (extra/tpl/) -// - to images (lib/images/) [ not needed, should go in lib/plugin/images/ ] - -require_once(DOKU_PLUGIN."/plugin/classes/ap_manage.class.php"); - -//--------------------------[ GLOBALS ]------------------------------------------------ -// note: probably should be dokuwiki wide globals, where they can be accessed by pluginutils.php -// global $plugin_types; -// $plugin_types = array('syntax', 'admin'); - -// plugins that are an integral part of dokuwiki, they shouldn't be disabled or deleted -global $plugin_protected; -$plugin_protected = array('acl','plugin','config','info','usermanager','revert'); - -/** - * All DokuWiki plugins to extend the admin function - * need to inherit from this class - */ -class admin_plugin_plugin extends DokuWiki_Admin_Plugin { - - var $disabled = 0; - var $plugin = ''; - var $cmd = ''; - - /** - * @var ap_manage - */ - var $handler = null; - - var $functions = array('delete','update',/*'settings',*/'info'); // require a plugin name - var $commands = array('manage','download','enable'); // don't require a plugin name - var $plugin_list = array(); - - var $msg = ''; - var $error = ''; - - function admin_plugin_plugin() { - $this->disabled = plugin_isdisabled('plugin'); - } - - /** - * return sort order for position in admin menu - */ - function getMenuSort() { - return 20; - } - - /** - * handle user request - */ - function handle() { - global $INPUT; - // enable direct access to language strings - $this->setupLocale(); - - $fn = $INPUT->param('fn'); - if (is_array($fn)) { - $this->cmd = key($fn); - $this->plugin = is_array($fn[$this->cmd]) ? key($fn[$this->cmd]) : null; - } else { - $this->cmd = $fn; - $this->plugin = null; - } - $this->_get_plugin_list(); - - // verify $_REQUEST vars - if (in_array($this->cmd, $this->commands)) { - $this->plugin = ''; - } else if (!in_array($this->cmd, $this->functions) || !in_array($this->plugin, $this->plugin_list)) { - $this->cmd = 'manage'; - $this->plugin = ''; - } - - if(($this->cmd != 'manage' || $this->plugin != '') && !checkSecurityToken()){ - $this->cmd = 'manage'; - $this->plugin = ''; - } - - // create object to handle the command - $class = "ap_".$this->cmd; - @require_once(DOKU_PLUGIN."/plugin/classes/$class.class.php"); - if (!class_exists($class)){ - $class = 'ap_manage'; - } - - $this->handler = new $class($this, $this->plugin); - $this->msg = $this->handler->process(); - - } - - /** - * output appropriate html - */ - function html() { - // enable direct access to language strings - $this->setupLocale(); - $this->_get_plugin_list(); - - if ($this->handler === null) $this->handler = new ap_manage($this, $this->plugin); - - ptln('
    '); - $this->handler->html(); - ptln('
    '); - } - - /** - * Returns a list of all plugins, including the disabled ones - */ - function _get_plugin_list() { - if (empty($this->plugin_list)) { - $list = plugin_list('',true); // all plugins, including disabled ones - sort($list); - trigger_event('PLUGIN_PLUGINMANAGER_PLUGINLIST',$list); - $this->plugin_list = $list; - } - return $this->plugin_list; - } - -} - - - - - - diff --git a/sources/lib/plugins/plugin/classes/ap_delete.class.php b/sources/lib/plugins/plugin/classes/ap_delete.class.php deleted file mode 100644 index 581a629..0000000 --- a/sources/lib/plugins/plugin/classes/ap_delete.class.php +++ /dev/null @@ -1,28 +0,0 @@ -dir_delete(DOKU_PLUGIN.plugin_directory($this->manager->plugin))) { - $this->manager->error = sprintf($this->lang['error_delete'],$this->manager->plugin); - } else { - msg(sprintf($this->lang['deleted'],$this->plugin)); - $this->refresh(); - } - } - - function html() { - parent::html(); - - ptln('
    '); - ptln('

    '.$this->lang['deleting'].'

    '); - - if ($this->manager->error) { - ptln('
    '.str_replace("\n","
    ",$this->manager->error).'
    '); - } else { - ptln('

    '.sprintf($this->lang['deleted'],$this->plugin).'

    '); - } - ptln('
    '); - } -} - diff --git a/sources/lib/plugins/plugin/classes/ap_download.class.php b/sources/lib/plugins/plugin/classes/ap_download.class.php deleted file mode 100644 index 3cc4558..0000000 --- a/sources/lib/plugins/plugin/classes/ap_download.class.php +++ /dev/null @@ -1,288 +0,0 @@ -str('url'); - $this->download($plugin_url, $this->overwrite); - return ''; - } - - /** - * Print results of the download - */ - function html() { - parent::html(); - - ptln('
    '); - ptln('

    '.$this->lang['downloading'].'

    '); - - if ($this->manager->error) { - ptln('
    '.str_replace("\n","
    ",$this->manager->error).'
    '); - } else if (count($this->downloaded) == 1) { - ptln('

    '.sprintf($this->lang['downloaded'],$this->downloaded[0]).'

    '); - } else if (count($this->downloaded)) { // more than one plugin in the download - ptln('

    '.$this->lang['downloads'].'

    '); - ptln('
      '); - foreach ($this->downloaded as $plugin) { - ptln('
    • '.$plugin.'
    • ',2); - } - ptln('
    '); - } else { // none found in download - ptln('

    '.$this->lang['download_none'].'

    '); - } - ptln('
    '); - } - - /** - * Process the downloaded file - */ - function download($url, $overwrite=false) { - // check the url - $matches = array(); - if (!preg_match("/[^\/]*$/", $url, $matches) || !$matches[0]) { - $this->manager->error = $this->lang['error_badurl']."\n"; - return false; - } - - $file = $matches[0]; - - if (!($tmp = io_mktmpdir())) { - $this->manager->error = $this->lang['error_dircreate']."\n"; - return false; - } - - if (!$file = io_download($url, "$tmp/", true, $file, 0)) { - $this->manager->error = sprintf($this->lang['error_download'],$url)."\n"; - } - - if (!$this->manager->error && !$this->decompress("$tmp/$file", $tmp)) { - $this->manager->error = sprintf($this->lang['error_decompress'],$file)."\n"; - } - - // search $tmp for the folder(s) that has been created - // move the folder(s) to lib/plugins/ - if (!$this->manager->error) { - $result = array('old'=>array(), 'new'=>array()); - if($this->find_folders($result,$tmp)){ - // choose correct result array - if(count($result['new'])){ - $install = $result['new']; - }else{ - $install = $result['old']; - } - - // now install all found items - foreach($install as $item){ - // where to install? - if($item['type'] == 'template'){ - $target = DOKU_INC.'lib/tpl/'.$item['base']; - }else{ - $target = DOKU_INC.'lib/plugins/'.$item['base']; - } - - // check to make sure we aren't overwriting anything - if (!$overwrite && @file_exists($target)) { - // remember our settings, ask the user to confirm overwrite, FIXME - continue; - } - - $instruction = @file_exists($target) ? 'update' : 'install'; - - // copy action - if ($this->dircopy($item['tmp'], $target)) { - $this->downloaded[] = $item['base']; - $this->plugin_writelog($target, $instruction, array($url)); - } else { - $this->manager->error .= sprintf($this->lang['error_copy']."\n", $item['base']); - } - } - - } else { - $this->manager->error = $this->lang['error']."\n"; - } - } - - // cleanup - if ($tmp) $this->dir_delete($tmp); - - if (!$this->manager->error) { - msg(sprintf($this->lang['packageinstalled'], count($this->downloaded), join(',',$this->downloaded)),1); - $this->refresh(); - return true; - } - - return false; - } - - /** - * Find out what was in the extracted directory - * - * Correct folders are searched recursively using the "*.info.txt" configs - * as indicator for a root folder. When such a file is found, it's base - * setting is used (when set). All folders found by this method are stored - * in the 'new' key of the $result array. - * - * For backwards compatibility all found top level folders are stored as - * in the 'old' key of the $result array. - * - * When no items are found in 'new' the copy mechanism should fall back - * the 'old' list. - * - * @author Andreas Gohr - * @param arrayref $result - results are stored here - * @param string $base - the temp directory where the package was unpacked to - * @param string $dir - a subdirectory. do not set. used by recursion - * @return bool - false on error - */ - function find_folders(&$result,$base,$dir=''){ - $dh = @opendir("$base/$dir"); - if(!$dh) return false; - while (false !== ($f = readdir($dh))) { - if ($f == '.' || $f == '..' || $f == 'tmp') continue; - - if(!is_dir("$base/$dir/$f")){ - // it's a file -> check for config - if($f == 'plugin.info.txt'){ - $info = array(); - $info['type'] = 'plugin'; - $info['tmp'] = "$base/$dir"; - $conf = confToHash("$base/$dir/$f"); - $info['base'] = utf8_basename($conf['base']); - if(!$info['base']) $info['base'] = utf8_basename("$base/$dir"); - $result['new'][] = $info; - }elseif($f == 'template.info.txt'){ - $info = array(); - $info['type'] = 'template'; - $info['tmp'] = "$base/$dir"; - $conf = confToHash("$base/$dir/$f"); - $info['base'] = utf8_basename($conf['base']); - if(!$info['base']) $info['base'] = utf8_basename("$base/$dir"); - $result['new'][] = $info; - } - }else{ - // it's a directory -> add to dir list for old method, then recurse - if(!$dir){ - $info = array(); - $info['type'] = 'plugin'; - $info['tmp'] = "$base/$dir/$f"; - $info['base'] = $f; - $result['old'][] = $info; - } - $this->find_folders($result,$base,"$dir/$f"); - } - } - closedir($dh); - return true; - } - - - /** - * Decompress a given file to the given target directory - * - * Determines the compression type from the file extension - */ - function decompress($file, $target) { - global $conf; - - // decompression library doesn't like target folders ending in "/" - if (substr($target, -1) == "/") $target = substr($target, 0, -1); - - $ext = $this->guess_archive($file); - if (in_array($ext, array('tar','bz','gz'))) { - switch($ext){ - case 'bz': - $compress_type = Tar::COMPRESS_BZIP; - break; - case 'gz': - $compress_type = Tar::COMPRESS_GZIP; - break; - default: - $compress_type = Tar::COMPRESS_NONE; - } - - $tar = new Tar(); - try { - $tar->open($file, $compress_type); - $tar->extract($target); - return true; - }catch(Exception $e){ - if($conf['allowdebug']){ - msg('Tar Error: '.$e->getMessage().' ['.$e->getFile().':'.$e->getLine().']',-1); - } - return false; - } - } else if ($ext == 'zip') { - - $zip = new ZipLib(); - $ok = $zip->Extract($file, $target); - - // FIXME sort something out for handling zip error messages meaningfully - return ($ok==-1?false:true); - - } - - // unsupported file type - return false; - } - - /** - * Determine the archive type of the given file - * - * Reads the first magic bytes of the given file for content type guessing, - * if neither bz, gz or zip are recognized, tar is assumed. - * - * @author Andreas Gohr - * @returns boolean|string false if the file can't be read, otherwise an "extension" - */ - function guess_archive($file){ - $fh = fopen($file,'rb'); - if(!$fh) return false; - $magic = fread($fh,5); - fclose($fh); - - if(strpos($magic,"\x42\x5a") === 0) return 'bz'; - if(strpos($magic,"\x1f\x8b") === 0) return 'gz'; - if(strpos($magic,"\x50\x4b\x03\x04") === 0) return 'zip'; - return 'tar'; - } - - /** - * Copy with recursive sub-directory support - */ - function dircopy($src, $dst) { - global $conf; - - if (is_dir($src)) { - if (!$dh = @opendir($src)) return false; - - if ($ok = io_mkdir_p($dst)) { - while ($ok && (false !== ($f = readdir($dh)))) { - if ($f == '..' || $f == '.') continue; - $ok = $this->dircopy("$src/$f", "$dst/$f"); - } - } - - closedir($dh); - return $ok; - - } else { - $exists = @file_exists($dst); - - if (!@copy($src,$dst)) return false; - if (!$exists && !empty($conf['fperm'])) chmod($dst, $conf['fperm']); - @touch($dst,filemtime($src)); - } - - return true; - } - - -} - diff --git a/sources/lib/plugins/plugin/classes/ap_enable.class.php b/sources/lib/plugins/plugin/classes/ap_enable.class.php deleted file mode 100644 index a25c7ed..0000000 --- a/sources/lib/plugins/plugin/classes/ap_enable.class.php +++ /dev/null @@ -1,51 +0,0 @@ -enabled = $INPUT->arr('enabled'); - - foreach ($this->manager->plugin_list as $plugin) { - if (in_array($plugin, $plugin_protected)) continue; - - $new = in_array($plugin, $this->enabled); - $old = !plugin_isdisabled($plugin); - - if ($new != $old) { - switch ($new) { - // enable plugin - case true : - if(plugin_enable($plugin)){ - msg(sprintf($this->lang['enabled'],$plugin),1); - $count_enabled++; - }else{ - msg(sprintf($this->lang['notenabled'],$plugin),-1); - } - break; - case false: - if(plugin_disable($plugin)){ - msg(sprintf($this->lang['disabled'],$plugin),1); - $count_disabled++; - }else{ - msg(sprintf($this->lang['notdisabled'],$plugin),-1); - } - break; - } - } - } - - // refresh plugins, including expiring any dokuwiki cache(s) - if ($count_enabled || $count_disabled) { - $this->refresh(); - } - } - -} - diff --git a/sources/lib/plugins/plugin/classes/ap_info.class.php b/sources/lib/plugins/plugin/classes/ap_info.class.php deleted file mode 100644 index 89b78fa..0000000 --- a/sources/lib/plugins/plugin/classes/ap_info.class.php +++ /dev/null @@ -1,143 +0,0 @@ -manager->plugin) { return; } - - $component_list = $this->get_plugin_components($this->manager->plugin); - usort($component_list, array($this,'component_sort')); - - foreach ($component_list as $component) { - if (($obj = plugin_load($component['type'],$component['name'],false,true)) === null) continue; - - $compname = explode('_',$component['name']); - if($compname[1]){ - $compname = '['.$compname[1].']'; - }else{ - $compname = ''; - } - - $this->details[] = array_merge( - $obj->getInfo(), - array( - 'type' => $component['type'], - 'compname' => $compname - )); - unset($obj); - } - - // review details to simplify things - foreach($this->details as $info) { - foreach($info as $item => $value) { - if (!isset($this->plugin_info[$item])) { $this->plugin_info[$item] = $value; continue; } - if ($this->plugin_info[$item] != $value) $this->plugin_info[$item] = ''; - } - } - } - - function html() { - - // output the standard menu stuff - parent::html(); - - // sanity check - if (!$this->manager->plugin) { return; } - - ptln('
    '); - ptln("

    ".$this->manager->getLang('plugin')." {$this->manager->plugin}

    "); - - // collect pertinent information from the log - $installed = $this->plugin_readlog($this->manager->plugin, 'installed'); - $source = $this->plugin_readlog($this->manager->plugin, 'url'); - $updated = $this->plugin_readlog($this->manager->plugin, 'updated'); - if (strrpos($updated, "\n") !== false) $updated = substr($updated, strrpos($updated, "\n")+1); - - ptln("
    ",2); - ptln("
    ".$this->manager->getLang('source').'
    '.($source ? $source : $this->manager->getLang('unknown'))."
    ",4); - ptln("
    ".$this->manager->getLang('installed').'
    '.($installed ? $installed : $this->manager->getLang('unknown'))."
    ",4); - if ($updated) ptln("
    ".$this->manager->getLang('lastupdate').'
    '.$updated."
    ",4); - ptln("
    ",2); - - if (count($this->details) == 0) { - ptln("

    ".$this->manager->getLang('noinfo')."

    ",2); - } else { - - ptln("
    ",2); - if ($this->plugin_info['name']) ptln("
    ".$this->manager->getLang('name')."
    ".$this->out($this->plugin_info['name'])."
    ",4); - if ($this->plugin_info['date']) ptln("
    ".$this->manager->getLang('date')."
    ".$this->out($this->plugin_info['date'])."
    ",4); - if ($this->plugin_info['type']) ptln("
    ".$this->manager->getLang('type')."
    ".$this->out($this->plugin_info['type'])."
    ",4); - if ($this->plugin_info['desc']) ptln("
    ".$this->manager->getLang('desc')."
    ".$this->out($this->plugin_info['desc'])."
    ",4); - if ($this->plugin_info['author']) ptln("
    ".$this->manager->getLang('author')."
    ".$this->manager->email($this->plugin_info['email'], $this->plugin_info['author'])."
    ",4); - if ($this->plugin_info['url']) ptln("
    ".$this->manager->getLang('www')."
    ".$this->manager->external_link($this->plugin_info['url'], '', 'urlextern')."
    ",4); - ptln("
    ",2); - - if (count($this->details) > 1) { - ptln("

    ".$this->manager->getLang('components')."

    ",2); - ptln("
    ",2); - - foreach ($this->details as $info) { - - ptln("
    ",4); - ptln("
    ".$this->manager->getLang('name')."
    ".$this->out($info['name'].' '.$info['compname'])."
    ",6); - if (!$this->plugin_info['date']) ptln("
    ".$this->manager->getLang('date')."
    ".$this->out($info['date'])."
    ",6); - if (!$this->plugin_info['type']) ptln("
    ".$this->manager->getLang('type')."
    ".$this->out($info['type'])."
    ",6); - if (!$this->plugin_info['desc']) ptln("
    ".$this->manager->getLang('desc')."
    ".$this->out($info['desc'])."
    ",6); - if (!$this->plugin_info['author']) ptln("
    ".$this->manager->getLang('author')."
    ".$this->manager->email($info['email'], $info['author'])."
    ",6); - if (!$this->plugin_info['url']) ptln("
    ".$this->manager->getLang('www')."
    ".$this->manager->external_link($info['url'], '', 'urlextern')."
    ",6); - ptln("
    ",4); - - } - ptln("
    ",2); - } - } - ptln("
    "); - } - - // simple output filter, make html entities safe and convert new lines to
    - function out($text) { - return str_replace("\n",'
    ',htmlspecialchars($text)); - } - - - /** - * return a list (name & type) of all the component plugins that make up this plugin - * - * @todo can this move to pluginutils? - */ - function get_plugin_components($plugin) { - - global $plugin_types; - - $components = array(); - $path = DOKU_PLUGIN.plugin_directory($plugin).'/'; - - foreach ($plugin_types as $type) { - if (@file_exists($path.$type.'.php')) { $components[] = array('name'=>$plugin, 'type'=>$type); continue; } - - if ($dh = @opendir($path.$type.'/')) { - while (false !== ($cp = readdir($dh))) { - if ($cp == '.' || $cp == '..' || strtolower(substr($cp,-4)) != '.php') continue; - - $components[] = array('name'=>$plugin.'_'.substr($cp, 0, -4), 'type'=>$type); - } - closedir($dh); - } - } - - return $components; - } - - /** - * usort callback to sort plugin components - */ - function component_sort($a, $b) { - if ($a['name'] == $b['name']) return 0; - return ($a['name'] < $b['name']) ? -1 : 1; - } -} diff --git a/sources/lib/plugins/plugin/classes/ap_manage.class.php b/sources/lib/plugins/plugin/classes/ap_manage.class.php deleted file mode 100644 index 48be630..0000000 --- a/sources/lib/plugins/plugin/classes/ap_manage.class.php +++ /dev/null @@ -1,202 +0,0 @@ -manager = & $manager; - $this->plugin = $plugin; - $this->lang = & $manager->lang; - } - - function process() { - return ''; - } - - function html() { - print $this->manager->locale_xhtml('admin_plugin'); - $this->html_menu(); - } - - // build our standard menu - function html_menu($listPlugins = true) { - global $ID; - - ptln('
    '); - - ptln('
    '); - ptln('

    '.$this->lang['download'].'

    '); - ptln('
    '); - ptln(' '); - ptln('
    '); - ptln(' '.$this->lang['download'].''); - ptln(' '); - ptln(' '); - ptln('
    '); - ptln('
    '); - ptln('
    '); - - if ($listPlugins) { - ptln('

    '.$this->lang['manage'].'

    '); - - ptln('
    '); - - ptln(' '); - - $this->html_pluginlist(); - - ptln('
    '); - ptln(' '); - ptln('
    '); - - // ptln('
    '); - ptln(''); - } - - ptln(''); - } - - function html_pluginlist() { - global $plugin_protected; - - foreach ($this->manager->plugin_list as $plugin) { - - $disabled = plugin_isdisabled($plugin); - $protected = in_array($plugin,$plugin_protected); - - $checked = ($disabled) ? '' : ' checked="checked"'; - $check_disabled = ($protected) ? ' disabled="disabled"' : ''; - - // determine display class(es) - $class = array(); - if (in_array($plugin, $this->downloaded)) $class[] = 'new'; - if ($disabled) $class[] = 'disabled'; - if ($protected) $class[] = 'protected'; - - $class = count($class) ? ' class="'.join(' ', $class).'"' : ''; - - ptln(' '); - ptln(' '.$plugin.''); - ptln(' '); - ptln('

    '); - - $this->html_button($plugin, 'info', false, 6); - if (in_array('settings', $this->manager->functions)) { - $this->html_button($plugin, 'settings', !@file_exists(DOKU_PLUGIN.$plugin.'/settings.php'), 6); - } - $this->html_button($plugin, 'update', !$this->plugin_readlog($plugin, 'url'), 6); - $this->html_button($plugin, 'delete', $protected, 6); - - ptln(' '); - } - } - - function html_button($plugin, $btn, $disabled=false, $indent=0) { - $disabled = ($disabled) ? 'disabled="disabled"' : ''; - ptln('',$indent); - } - - /** - * Refresh plugin list - */ - function refresh() { - global $config_cascade; - - // expire dokuwiki caches - // touching local.php expires wiki page, JS and CSS caches - @touch(reset($config_cascade['main']['local'])); - - // update latest plugin date - FIXME - global $ID; - send_redirect(wl($ID,array('do'=>'admin','page'=>'plugin'),true, '&')); - } - - /** - * Write a log entry to the given target directory - */ - function plugin_writelog($target, $cmd, $data) { - - $file = $target.'/manager.dat'; - - switch ($cmd) { - case 'install' : - $url = $data[0]; - $date = date('r'); - if (!$fp = @fopen($file, 'w')) return; - fwrite($fp, "installed=$date\nurl=$url\n"); - fclose($fp); - break; - - case 'update' : - $url = $data[0]; - $date = date('r'); - if (!$fp = @fopen($file, 'r+')) return; - $buffer = ""; - while (($line = fgets($fp)) !== false) { - $urlFound = strpos($line,"url"); - if($urlFound !== false) $line="url=$url\n"; - $buffer .= $line; - } - $buffer .= "updated=$date\n"; - fseek($fp, 0); - fwrite($fp, $buffer); - fclose($fp); - break; - } - } - - function plugin_readlog($plugin, $field) { - static $log = array(); - $file = DOKU_PLUGIN.plugin_directory($plugin).'/manager.dat'; - - if (!isset($log[$plugin])) { - $tmp = @file_get_contents($file); - if (!$tmp) return ''; - $log[$plugin] = & $tmp; - } - - if ($field == 'ALL') { - return $log[$plugin]; - } - - $match = array(); - if (preg_match_all('/'.$field.'=(.*)$/m',$log[$plugin], $match)) - return implode("\n", $match[1]); - - return ''; - } - - /** - * delete, with recursive sub-directory support - */ - function dir_delete($path) { - if (!is_string($path) || $path == "") return false; - - if (is_dir($path) && !is_link($path)) { - if (!$dh = @opendir($path)) return false; - - while ($f = readdir($dh)) { - if ($f == '..' || $f == '.') continue; - $this->dir_delete("$path/$f"); - } - - closedir($dh); - return @rmdir($path); - } - return @unlink($path); - } - - -} diff --git a/sources/lib/plugins/plugin/classes/ap_update.class.php b/sources/lib/plugins/plugin/classes/ap_update.class.php deleted file mode 100644 index 5d7f6cb..0000000 --- a/sources/lib/plugins/plugin/classes/ap_update.class.php +++ /dev/null @@ -1,36 +0,0 @@ -plugin_readlog($this->plugin, 'url'); - $this->download($plugin_url, $this->overwrite); - return ''; - } - - function html() { - parent::html(); - - ptln('
    '); - ptln('

    '.$this->lang['updating'].'

    '); - - if ($this->manager->error) { - ptln('
    '.str_replace("\n","
    ", $this->manager->error).'
    '); - } else if (count($this->downloaded) == 1) { - ptln('

    '.sprintf($this->lang['updated'],$this->downloaded[0]).'

    '); - } else if (count($this->downloaded)) { // more than one plugin in the download - ptln('

    '.$this->lang['updates'].'

    '); - ptln('
      '); - foreach ($this->downloaded as $plugin) { - ptln('
    • '.$plugin.'
    • ',2); - } - ptln('
    '); - } else { // none found in download - ptln('

    '.$this->lang['update_none'].'

    '); - } - ptln('
    '); - } -} - diff --git a/sources/lib/plugins/plugin/lang/af/lang.php b/sources/lib/plugins/plugin/lang/af/lang.php deleted file mode 100644 index 669fdd5..0000000 --- a/sources/lib/plugins/plugin/lang/af/lang.php +++ /dev/null @@ -1,13 +0,0 @@ -plugins|إضافات]] دوكو ويكي. لتتمكن من تنزيل و تثبيت الإضافات يجب أن يكون دليل الاضافات قابلا للكتابة من خادوم الوب. - diff --git a/sources/lib/plugins/plugin/lang/ar/lang.php b/sources/lib/plugins/plugin/lang/ar/lang.php deleted file mode 100644 index aae58fd..0000000 --- a/sources/lib/plugins/plugin/lang/ar/lang.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @author Usama Akkad - * @author uahello@gmail.com - */ -$lang['menu'] = 'إدارة الملحقات'; -$lang['download'] = 'نزّل و ثبت اضافة جديدة'; -$lang['manage'] = 'الإضافات المثبتة'; -$lang['btn_info'] = 'معلومات'; -$lang['btn_update'] = 'حدّث'; -$lang['btn_delete'] = 'احذف'; -$lang['btn_settings'] = 'إعدادات'; -$lang['btn_download'] = 'نزل'; -$lang['btn_enable'] = 'احفظ'; -$lang['url'] = 'رابط'; -$lang['installed'] = 'ثُبتت:'; -$lang['lastupdate'] = 'آخر تحديث:'; -$lang['source'] = 'المصدر:'; -$lang['unknown'] = 'مجهول'; -$lang['updating'] = 'تُحدث ...'; -$lang['updated'] = 'الاضافة %s حُدثت بنجاح'; -$lang['updates'] = 'الاضافة التالية حُدثت بنجاح'; -$lang['update_none'] = 'لا يوجد تحديثات.'; -$lang['deleting'] = 'تُحذف ... '; -$lang['deleted'] = 'حُذفت الإضافة %s.'; -$lang['downloading'] = 'يُنزل ...'; -$lang['downloaded'] = 'الاضافة %s ثبتت بنجاح'; -$lang['downloads'] = 'الاضافة التالية ثبتت بنجاح:'; -$lang['download_none'] = 'لم يجد إضافة، أو ان هناك مشكلة غير معروفة أثناء التنزيل و التثبيت.'; -$lang['plugin'] = 'الإضافة:'; -$lang['components'] = 'المكون:'; -$lang['noinfo'] = 'لم تعطي الإضافة أية معلومة، قد تكون معطوبة.'; -$lang['name'] = 'الاسم :'; -$lang['date'] = 'التاريخ :'; -$lang['type'] = 'النوع :'; -$lang['desc'] = 'الوصف :'; -$lang['author'] = 'الكاتب :'; -$lang['www'] = 'الشابكة :'; -$lang['error'] = 'حث خطأ مجهول.'; -$lang['error_download'] = 'تعذر تنزيل ملف الاضافة: %s'; -$lang['error_badurl'] = 'اشتبه بعنوان خاطئ - تعذر الحصول على الاسم من العنوان'; -$lang['error_dircreate'] = 'تعذر إنشاء مجلد مؤقت للتنزيل'; -$lang['error_decompress'] = 'تعذر على مدير الاضافات فك ضغط الملف المُنزّل. قد يكون ذلك نتيجة لتنزيل خاطئ، في هذه الحالة أعد المحاولة; أو ان هيئة الضغط غير معروفة، في هذه الحالة عليك تنزيل و تثبيت الاضافة يدويا.'; -$lang['error_copy'] = 'كان هناك خطأ في نسخ ملف عند محاولة تثبيت ملفات للإضافة %s: قد يكون القرص ممتلئا أو أن صلاحيات الوصول للملف خاطئة. لربما نتج عن ذلك اضافة مثبته جزئيا تجعل نظام الويكي غير ثابت.'; -$lang['error_delete'] = 'كان هناك خطأ عند محاولة حذف الاضافة %s. السبب الاكثر احتمالا هو صلاحيات غير كافية على الملف أو المجلد'; -$lang['enabled'] = 'الاضافة %s فُعلت. '; -$lang['notenabled'] = 'تعذر تفعيل الاضافة %s، تحقق من اذونات الملف.'; -$lang['disabled'] = 'عُطلت الإضافة %s.'; -$lang['notdisabled'] = 'تعذر تعطيل الإضافة %s، تحقق من اذونات الملف.'; -$lang['packageinstalled'] = 'حزمة الإضافة (%d plugin(s): %s) ثبتت بنجاج.'; diff --git a/sources/lib/plugins/plugin/lang/bg/admin_plugin.txt b/sources/lib/plugins/plugin/lang/bg/admin_plugin.txt deleted file mode 100644 index bad73e1..0000000 --- a/sources/lib/plugins/plugin/lang/bg/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Управление на приставките ====== - -От тази страница можете на управлявате [[doku>plugins|приставките]] на Dokuwiki. За да свалите и инсталирате приставка, е необходимо писането в директорията .../lib/plugins/ да е позволено на сървъра. diff --git a/sources/lib/plugins/plugin/lang/bg/lang.php b/sources/lib/plugins/plugin/lang/bg/lang.php deleted file mode 100644 index 09ac352..0000000 --- a/sources/lib/plugins/plugin/lang/bg/lang.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @author Viktor Usunov - * @author Kiril - */ -$lang['menu'] = 'Управление на приставките'; -$lang['download'] = 'Сваляне и инсталиране на нова приставка'; -$lang['manage'] = 'Инсталирани приставки'; -$lang['btn_info'] = 'информация'; -$lang['btn_update'] = 'обновяване'; -$lang['btn_delete'] = 'изтриване'; -$lang['btn_settings'] = 'настройки'; -$lang['btn_download'] = 'Сваляне'; -$lang['btn_enable'] = 'Запис'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Инсталирана:'; -$lang['lastupdate'] = 'Актуализирана:'; -$lang['source'] = 'Източник:'; -$lang['unknown'] = 'непознат'; -$lang['updating'] = 'Актуализиране ...'; -$lang['updated'] = 'Приставката %s е качена успешно'; -$lang['updates'] = 'Следните приставки са актуализирани успешно'; -$lang['update_none'] = 'Не са намерени нови версии.'; -$lang['deleting'] = 'Изтриване ...'; -$lang['deleted'] = 'Приставката %s е изтрита успешно.'; -$lang['downloading'] = 'Сваляне ...'; -$lang['downloaded'] = 'Приставката %s е инсталирана успешно '; -$lang['downloads'] = 'Следните приставки са инсталирани успешно:'; -$lang['download_none'] = 'Не са намерени приставки или е възникнала непозната грешка при свалянето и инсталирането.'; -$lang['plugin'] = 'Приставка:'; -$lang['components'] = 'Компоненти'; -$lang['noinfo'] = 'Приставка не върна информация, може да е повредена.'; -$lang['name'] = 'Име:'; -$lang['date'] = 'Дата:'; -$lang['type'] = 'Тип:'; -$lang['desc'] = 'Описание:'; -$lang['author'] = 'Автор:'; -$lang['www'] = 'Уебстраница:'; -$lang['error'] = 'Възникна непозната грешка.'; -$lang['error_download'] = 'Свалянето на приставката %s е невъзможно.'; -$lang['error_badurl'] = 'Предполагаем грешен адрес - не може да се определи име на файла от URL адреса'; -$lang['error_dircreate'] = 'Създаването на временна директория за сваляне не е възможно.'; -$lang['error_decompress'] = 'Разархивирането на сваленият файл е невъзможно. Вероятно е резултат от грешка при свалянето, в този случай трябва да опитате отново; или формата на компресия е непознат - тогава трябва да свалите и инсталирате приставката ръчно.'; -$lang['error_copy'] = 'Възникна грешка при копиране на файл по време на инсталиране на приставката %s: вероятно дискът е пълен или правата за достъп до файловете са грешни. Може да доведе до частично инсталирана приставка и да причини нестабилно функциониране на wiki-то ви.'; -$lang['error_delete'] = 'Възникна грешка при изтриването на приставката %s. Най-вероятната причина е в правата за достъп до файл или директория'; -$lang['enabled'] = 'Приставката %s е включена.'; -$lang['notenabled'] = 'Приставката %s не може да бъде включена, моля проверете правата за файловете.'; -$lang['disabled'] = 'Приставката %s е изключена.'; -$lang['notdisabled'] = 'Приставката %s не е изключена, моля проверете правата за файловете.'; -$lang['packageinstalled'] = 'Пакетът е инсталиран успешно (%d приставка: %s).'; diff --git a/sources/lib/plugins/plugin/lang/ca-valencia/admin_plugin.txt b/sources/lib/plugins/plugin/lang/ca-valencia/admin_plugin.txt deleted file mode 100644 index 6b5a958..0000000 --- a/sources/lib/plugins/plugin/lang/ca-valencia/admin_plugin.txt +++ /dev/null @@ -1,4 +0,0 @@ -====== Gestor de plúgins ====== - -Des d'esta pàgina pot gestionar tot lo relacionat en els [[doku>plugins|plúgins]] de DokuWiki. Per a poder descarregar i instalar un plúgin, el servidor web deu poder escriure en la carpeta de plúgins. - diff --git a/sources/lib/plugins/plugin/lang/ca-valencia/lang.php b/sources/lib/plugins/plugin/lang/ca-valencia/lang.php deleted file mode 100644 index 3fbdb13..0000000 --- a/sources/lib/plugins/plugin/lang/ca-valencia/lang.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @author Bernat Arlandis - * @author Bernat Arlandis - */ -$lang['menu'] = 'Gestor de plúgins'; -$lang['download'] = 'Descarregar i instalar un nou plúgin'; -$lang['manage'] = 'Plúgins instalats'; -$lang['btn_info'] = 'info'; -$lang['btn_update'] = 'actualisar'; -$lang['btn_delete'] = 'borrar'; -$lang['btn_settings'] = 'ajusts'; -$lang['btn_download'] = 'Descarregar'; -$lang['btn_enable'] = 'Guardar'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Instalat:'; -$lang['lastupdate'] = 'Última actualisació:'; -$lang['source'] = 'Font:'; -$lang['unknown'] = 'desconegut'; -$lang['updating'] = 'Actualisant ...'; -$lang['updated'] = 'Plúgin %s actualisat correctament'; -$lang['updates'] = 'Els següents plúgins s\'han actualisat correctament:'; -$lang['update_none'] = 'No s\'han trobat actualisacions.'; -$lang['deleting'] = 'Borrant ...'; -$lang['deleted'] = 'Plúgin %s borrat.'; -$lang['downloading'] = 'Descarregant ...'; -$lang['downloaded'] = 'Plúgin %s instalat correctament'; -$lang['downloads'] = 'Els següents plúgins s\'han instalat correctament:'; -$lang['download_none'] = 'No s\'han trobat plúgins o ha hagut algun problema descarregant i instalant.'; -$lang['plugin'] = 'Plúgin:'; -$lang['components'] = 'Components'; -$lang['noinfo'] = 'Este plúgin no ha tornat informació, pot ser invàlit.'; -$lang['name'] = 'Nom:'; -$lang['date'] = 'Data:'; -$lang['type'] = 'Classe:'; -$lang['desc'] = 'Descripció:'; -$lang['author'] = 'Autor:'; -$lang['www'] = 'Web:'; -$lang['error'] = 'Ha ocorregut un erro desconegut.'; -$lang['error_download'] = 'No es pot descarregar l\'archiu del plúgin: %s'; -$lang['error_badurl'] = 'Possible URL roïn - no es pot determinar el nom de l\'archiu a partir de la URL'; -$lang['error_dircreate'] = 'No es pot crear la carpeta temporal per a rebre descàrregues'; -$lang['error_decompress'] = 'El gestor de plúgins no ha pogut descomprimir l\'archiu descarregat. Açò pot ser degut a una descàrrega fallida, en eixe cas deuria intentar-ho de nou; o el format de compressió pot ser desconegut, en eixe cas necessitarà descarregar i instalar el plúgin manualment.'; -$lang['error_copy'] = 'Ha ocorregut un erro copiant archius a l\'instalar archius del plúgin %s: el disc podria estar ple o els permissos d\'accés a l\'archiu estar mal. El plúgin podria haver quedat parcialment instalat i deixar el wiki inestable.'; -$lang['error_delete'] = 'Ha ocorregut un erro intentant borrar el plúgin %s. La causa més provable és que els permissos d\'accés a l\'archiu o el directori no siguen suficients'; -$lang['enabled'] = 'Plúgin %s activat.'; -$lang['notenabled'] = 'No s\'ha pogut activar el plúgin %s, comprove els permissos dels archius.'; -$lang['disabled'] = 'Plúgin %s desactivat.'; -$lang['notdisabled'] = 'No s\'ha pogut desactivar el plúgin %s, comprove els permissos dels archius.'; diff --git a/sources/lib/plugins/plugin/lang/ca/admin_plugin.txt b/sources/lib/plugins/plugin/lang/ca/admin_plugin.txt deleted file mode 100644 index c21e3f5..0000000 --- a/sources/lib/plugins/plugin/lang/ca/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Gestió de connectors ====== - -En aquesta pàgina podeu gestionar tot allò referent als [[doku>plugins|connectors]] de Dokuwiki. Per a baixar i instal·lar connectors, cal que el servidor web tingui permís d'escriptura en la carpeta de connectors. \ No newline at end of file diff --git a/sources/lib/plugins/plugin/lang/ca/lang.php b/sources/lib/plugins/plugin/lang/ca/lang.php deleted file mode 100644 index 5c79336..0000000 --- a/sources/lib/plugins/plugin/lang/ca/lang.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @author carles.bellver@gmail.com - * @author carles.bellver@cent.uji.es - * @author Carles Bellver - * @author daniel@6temes.cat - */ -$lang['menu'] = 'Gestió de connectors'; -$lang['download'] = 'Baixa i instal·la un nou connector'; -$lang['manage'] = 'Connectors instal·lats'; -$lang['btn_info'] = 'informació'; -$lang['btn_update'] = 'actualitza'; -$lang['btn_delete'] = 'suprimeix'; -$lang['btn_settings'] = 'paràmetres'; -$lang['btn_download'] = 'Baixa'; -$lang['btn_enable'] = 'Desa'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Instal·lació:'; -$lang['lastupdate'] = 'Darrera actualitació:'; -$lang['source'] = 'Font:'; -$lang['unknown'] = 'desconegut'; -$lang['updating'] = 'S\'està actualitzant...'; -$lang['updated'] = 'El connector %s s\'ha actualitzat amb èxit.'; -$lang['updates'] = 'Els connectors següents s\'han actualitzat amb èxit'; -$lang['update_none'] = 'No s\'han trobat actualitzacions.'; -$lang['deleting'] = 'S\'està suprimint...'; -$lang['deleted'] = 'S\'ha suprimit el connector %s.'; -$lang['downloading'] = 'S\'està baixant...'; -$lang['downloaded'] = 'El connector %s s\'ha instal·lat amb èxit'; -$lang['downloads'] = 'Els connectors següents s\'han instal·lat amb èxit:'; -$lang['download_none'] = 'No s\'han trobat connectors, o hi ha hagut un problema desconegut durant el procés de baixada i instal·lació.'; -$lang['plugin'] = 'Connector:'; -$lang['components'] = 'Components'; -$lang['noinfo'] = 'Aquest connector no ha retornat informació. Potser no és vàlid.'; -$lang['name'] = 'Nom:'; -$lang['date'] = 'Data:'; -$lang['type'] = 'Tipus:'; -$lang['desc'] = 'Descripció:'; -$lang['author'] = 'Autor:'; -$lang['www'] = 'Web:'; -$lang['error'] = 'S\'ha produït un error desconegut.'; -$lang['error_download'] = 'No s\'ha pogut baixar el fitxer del connector: %s'; -$lang['error_badurl'] = 'L\'URL no sembla vàlid: no permet determinar el nom del fitxer'; -$lang['error_dircreate'] = 'No s\'ha pogut crear una carpeta temporal per rebre la baixada'; -$lang['error_decompress'] = 'El gestor de connectors no ha pogut descomprimir el fitxer baixat. Potser no s\'ha baixat correctament, en el qual cas podríeu tornar a intentar-ho. O el format de compressió podria ser desconegut, en el qual cas hauríeu de baixar i instal·lar el connector manualment.'; -$lang['error_copy'] = 'S\'ha produït un error de còpia de fitxers quan s\'estaven instal·lant els fitxers del connector %s: potser el disc està ple o els permisos d\'accés són incorrectes. Això pot haver causat una instal·lació incompleta del connector i per tant el vostre wiki pot haver quedat en un estat inestable.'; -$lang['error_delete'] = 'S\'ha produït un error quan s\'intentava suprimir el connector %s. La causa més probable d\'això són uns permisos d\'accés insuficients al fitxer o al directori. '; -$lang['enabled'] = 'S\'ha habilitat el connector %s.'; -$lang['notenabled'] = 'No s\'ha pogut habilitar el connector %s. Comproveu els permisos dels fitxers.'; -$lang['disabled'] = 'S\'ha inhabilitat el connector %s.'; -$lang['notdisabled'] = 'No s\'ha pogut inhabilitar el connector %s. Comproveu els permisos dels fitxers.'; -$lang['packageinstalled'] = 'El paquet del connector (%d plugins(s): %s) s\'ha instal·lat correctament.'; diff --git a/sources/lib/plugins/plugin/lang/cs/admin_plugin.txt b/sources/lib/plugins/plugin/lang/cs/admin_plugin.txt deleted file mode 100644 index 6ebf1e7..0000000 --- a/sources/lib/plugins/plugin/lang/cs/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Správa pluginů ====== - -Na této stránce lze spravovat pluginy DokuWiki [[doku>plugins|plugins]]. Aby bylo možné stahovat a instalovat pluginy, musí mít webový server přístup pro zápis do adresáře //plugin//. diff --git a/sources/lib/plugins/plugin/lang/cs/lang.php b/sources/lib/plugins/plugin/lang/cs/lang.php deleted file mode 100644 index fb8b6cc..0000000 --- a/sources/lib/plugins/plugin/lang/cs/lang.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @author Zbynek Krivka - * @author Bohumir Zamecnik - * @author tomas@valenta.cz - * @author Marek Sacha - * @author Lefty - * @author Vojta Beran - * @author zbynek.krivka@seznam.cz - * @author Bohumir Zamecnik - * @author Jakub A. Těšínský (j@kub.cz) - * @author mkucera66@seznam.cz - * @author Zbyněk Křivka - * @author Gerrit Uitslag - */ -$lang['menu'] = 'Správa pluginů'; -$lang['download'] = 'Stáhnout a instalovat plugin'; -$lang['manage'] = 'Seznam instalovaných pluginů'; -$lang['btn_info'] = 'info'; -$lang['btn_update'] = 'aktualizovat'; -$lang['btn_delete'] = 'smazat'; -$lang['btn_settings'] = 'nastavení'; -$lang['btn_download'] = 'Stáhnout'; -$lang['btn_enable'] = 'Uložit'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Instalován:'; -$lang['lastupdate'] = 'Poslední aktualizace:'; -$lang['source'] = 'Zdroj:'; -$lang['unknown'] = 'neznámý'; -$lang['updating'] = 'Aktualizuji ...'; -$lang['updated'] = 'Modul %s úspěšně aktualizován'; -$lang['updates'] = 'Následující pluginy byly úspěšně aktualizovány'; -$lang['update_none'] = 'Žádné aktualizace nenalezeny.'; -$lang['deleting'] = 'Probíhá mazání ...'; -$lang['deleted'] = 'Plugin %s smazán.'; -$lang['downloading'] = 'Stahuji ...'; -$lang['downloaded'] = 'Plugin %s nainstalován'; -$lang['downloads'] = 'Následující pluginy byly úspěšně instalovány:'; -$lang['download_none'] = 'Žádné pluginy nebyly nenalezeny, nebo se vyskytla nějaká chyba při -stahování a instalaci.'; -$lang['plugin'] = 'Plugin:'; -$lang['components'] = 'Součásti'; -$lang['noinfo'] = 'Plugin nevrátil žádné informace. Může být poškozen nebo špatný.'; -$lang['name'] = 'Jméno:'; -$lang['date'] = 'Datum:'; -$lang['type'] = 'Typ:'; -$lang['desc'] = 'Popis:'; -$lang['author'] = 'Autor:'; -$lang['www'] = 'Web:'; -$lang['error'] = 'Nastala neznámá chyba.'; -$lang['error_download'] = 'Nelze stáhnout soubor s pluginem: %s'; -$lang['error_badurl'] = 'URL je zřejmě chybná - nelze z ní určit název souboru'; -$lang['error_dircreate'] = 'Nelze vytvořit dočasný adresář ke stažení dat'; -$lang['error_decompress'] = 'Správce pluginů nemůže rozbalit stažený soubor. Toto může být způsobeno chybou při stahování. Můžete se pokusit stahování opakovat. Chyba může být také v kompresním formátu souboru. V tom případě bude nutné stáhnout a nainstalovat plugin ručně.'; -$lang['error_copy'] = 'Došlo k chybě při instalaci pluginu %s. Je možné, že na disku není volné místo, nebo mohou být špatně nastavena přístupová práva. Pozor, mohlo dojít k částečné a tudíž chybné instalaci pluginu a tím může být ohrožena stabilita wiki.'; -$lang['error_delete'] = 'Došlo k chybě při pokusu o smazání pluginu %s. Nejspíše je chyba v nastavení přístupových práv k některým souborům či adresářům.'; -$lang['enabled'] = 'Plugin %s aktivován.'; -$lang['notenabled'] = 'Plugin %s nelze aktivovat, zkontrolujte práva k souborům.'; -$lang['disabled'] = 'Plugin %s deaktivován.'; -$lang['notdisabled'] = 'Plugin %s nelze deaktivovat, zkontrolujte práva k souborům.'; -$lang['packageinstalled'] = 'Balíček pluginů (%d plugin(ů): %s) úspěšně nainstalován.'; diff --git a/sources/lib/plugins/plugin/lang/da/admin_plugin.txt b/sources/lib/plugins/plugin/lang/da/admin_plugin.txt deleted file mode 100644 index 300b661..0000000 --- a/sources/lib/plugins/plugin/lang/da/admin_plugin.txt +++ /dev/null @@ -1,5 +0,0 @@ -====== Udvidelsesstyring ====== - -På denne side kan du kontrollere alle Dokuwikis [[doku>plugins|udvidelser]]. For at hente og opsætte en udvidelse, må din udvidelsesmappe kunne skrives til af serveren. - - diff --git a/sources/lib/plugins/plugin/lang/da/lang.php b/sources/lib/plugins/plugin/lang/da/lang.php deleted file mode 100644 index 07077ea..0000000 --- a/sources/lib/plugins/plugin/lang/da/lang.php +++ /dev/null @@ -1,61 +0,0 @@ - - * @author Kalle Sommer Nielsen - * @author Esben Laursen - * @author Harith - * @author Daniel Ejsing-Duun - * @author Erik Bjørn Pedersen - * @author rasmus@kinnerup.com - * @author Michael Pedersen subben@gmail.com - * @author Mikael Lyngvig - * @author Jens Hyllegaard - */ -$lang['menu'] = 'Håndter udvidelser'; -$lang['download'] = 'Hent og tilføj ny udvidelse'; -$lang['manage'] = 'Tilføjede udvidelser'; -$lang['btn_info'] = 'oplysninger'; -$lang['btn_update'] = 'opdater'; -$lang['btn_delete'] = 'slet'; -$lang['btn_settings'] = 'indstillinger'; -$lang['btn_download'] = 'Hent'; -$lang['btn_enable'] = 'Gem'; -$lang['url'] = 'URL-adresse'; -$lang['installed'] = 'Tilføjet:'; -$lang['lastupdate'] = 'Sidst opdateret:'; -$lang['source'] = 'Kilde:'; -$lang['unknown'] = 'ukendt'; -$lang['updating'] = 'Opdaterer ...'; -$lang['updated'] = 'Udvidelse %s blev korrekt opdateret'; -$lang['updates'] = 'De følgende udvidelser blev opdateret korrekt:'; -$lang['update_none'] = 'Ingen opdateringer fundet.'; -$lang['deleting'] = 'Sletter ...'; -$lang['deleted'] = 'Udvidelsen %s slettet.'; -$lang['downloading'] = 'Henter ...'; -$lang['downloaded'] = 'Udvidelse %s blev korrekt installeret'; -$lang['downloads'] = 'De følgende udvidelser blev installeret korrekt:'; -$lang['download_none'] = 'Ingen udvidelser blev fundet, eller en ukendt fejl opstod under hentning og opsætning'; -$lang['plugin'] = 'Udvidelse:'; -$lang['components'] = 'Komponenter'; -$lang['noinfo'] = 'Denne udvidelse videregav ingen oplysninger. Den kan være fejlagtig.'; -$lang['name'] = 'Navn:'; -$lang['date'] = 'Dato:'; -$lang['type'] = 'Type:'; -$lang['desc'] = 'Beskrivelse:'; -$lang['author'] = 'Programmør:'; -$lang['www'] = 'Web:'; -$lang['error'] = 'En ukendt fejl opstod.'; -$lang['error_download'] = 'Kunne ikke hente udvidelsesfilen: %s'; -$lang['error_badurl'] = 'Muligvis dårlig netadresse; kunne ikke hente filnavn fra adressen.'; -$lang['error_dircreate'] = 'Kunne ikke oprette midlertidig mappe til hentning'; -$lang['error_decompress'] = 'Udvidelseshåndtering kunne ikke udpakke den hentede fil. Det kan skyldes et fejlagtigt download, i hvilket fald du må prøve igen. Komprimeringsformatet kan også være ukendt, hvorved du du vil være nødt til at hente og opsætte udvidelsen manuelt.'; -$lang['error_copy'] = 'Der opstod en filkopieringsfejl under forsøget på at installere filerne til udvidelsen %s: Disken kan være fuld eller filadgangsrettighederne kan være forkert sat. Dette kan have ført til en delvist installeret udvidelse og efterladt din wiki-opsætning ustabil.'; -$lang['error_delete'] = 'Der opstod en fejl ved forsøget på at slette udvidelsen %s. Dette skyldes sandsynligvis utilstrækkelig adgang til filer eller mapper.'; -$lang['enabled'] = 'Udvidelsen %s blev aktiveret.'; -$lang['notenabled'] = 'Udvidelsen %s kunne ikke aktiveres. Kontroller filtilladelser.'; -$lang['disabled'] = 'Udvidelsen %s blev ikke aktiveret.'; -$lang['notdisabled'] = 'Udvidelsen %s kunne ikke aktiveres. Kontroller filtilladelser.'; -$lang['packageinstalled'] = 'Plugin pakke (%d plugin(s): %s) installeret korrekt.'; diff --git a/sources/lib/plugins/plugin/lang/de-informal/admin_plugin.txt b/sources/lib/plugins/plugin/lang/de-informal/admin_plugin.txt deleted file mode 100644 index 576797d..0000000 --- a/sources/lib/plugins/plugin/lang/de-informal/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -===== Erweiterungsmanagement ===== - -Auf dieser Seite kannst du alles anpassen was mit den DokuWiki [[doku>plugins|Erweiterungen]] zu tun hat. Der Ordner der Erweiterungen muss für den Webserver beschreibbar sein, um Erweiterungen herunterladen und installieren zu können. \ No newline at end of file diff --git a/sources/lib/plugins/plugin/lang/de-informal/lang.php b/sources/lib/plugins/plugin/lang/de-informal/lang.php deleted file mode 100644 index 8f1cea5..0000000 --- a/sources/lib/plugins/plugin/lang/de-informal/lang.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @author Juergen Schwarzer - * @author Marcel Metz - * @author Matthias Schulte - * @author Christian Wichmann - * @author Pierre Corell - * @author Frank Loizzi - * @author Volker Bödker - */ -$lang['menu'] = 'Plugins verwalten'; -$lang['download'] = 'Herunterladen und installieren einer neuen Erweiterung'; -$lang['manage'] = 'Installierte Erweiterungen'; -$lang['btn_info'] = 'Information'; -$lang['btn_update'] = 'aktualisieren'; -$lang['btn_delete'] = 'löschen'; -$lang['btn_settings'] = 'Einstellungen'; -$lang['btn_download'] = 'Herunterladen'; -$lang['btn_enable'] = 'Speichern'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Installiert:'; -$lang['lastupdate'] = 'Letzte Aktualisierung:'; -$lang['source'] = 'Quellen:'; -$lang['unknown'] = 'unbekannt'; -$lang['updating'] = 'Aktualisiere...'; -$lang['updated'] = 'Erweiterung %s wurde erfolgreich aktualisiert.'; -$lang['updates'] = 'Die folgenden Erweiterungen wurden erfolgreich aktualisiert.'; -$lang['update_none'] = 'Keine Aktualisierungen gefunden.'; -$lang['deleting'] = 'Lösche...'; -$lang['deleted'] = 'Erweiterung %s wurde gelöscht.'; -$lang['downloading'] = 'Herunterladen...'; -$lang['downloaded'] = 'Erweiterung %s wurde erfolgreich installiert'; -$lang['downloads'] = 'Die folgenden Erweiterungen wurden erfolgreich installiert:'; -$lang['download_none'] = 'Keine Erweiterungen gefunden oder es trat ein unbekanntest Problem beim Herunterladen und Installieren auf.'; -$lang['plugin'] = 'Erweiterung:'; -$lang['components'] = 'Komponenten'; -$lang['noinfo'] = 'Diese Erweiterung gab keine Information zurück - sie könnte ungültig sein.'; -$lang['name'] = 'Name:'; -$lang['date'] = 'Datum:'; -$lang['type'] = 'Typ:'; -$lang['desc'] = 'Beschreibung:'; -$lang['author'] = 'Autor:'; -$lang['www'] = 'Internet:'; -$lang['error'] = 'Es ist ein unbekannter Fehler aufgetreten.'; -$lang['error_download'] = 'Nicht möglich die Erweiterung herunterzuladen: %s'; -$lang['error_badurl'] = 'Vermute schlechte URL - nicht möglich den Dateinamen aus der URL zu ermitteln'; -$lang['error_dircreate'] = 'Nicht möglich einen temporären Ordner zu erstellen um den Download zu empfangen.'; -$lang['error_decompress'] = 'Dem Erweiterungsmanager war es nicht möglich die heruntergeladene Datei zu dekomprimieren. Dies kann an einem defekten Download liegen, in diesem Fall sollten Sie es erneut versuchen; oder das Format mit dem die Datei komprimiert ist, ist unbekannt, da müssen Sie die Erweiterung manuell herunterladen und installieren. '; -$lang['error_copy'] = 'Es trat ein Dateifehler beim Kopieren der Installationsdateien für die Erweiterung %s auf: Die Festplatte könnte voll oder die Zugriffsrechte verweigert worden sein. Dies führt zu einer teilweise installierten Erweiterung und belässt dein Wiki in einem instabilen Zustand.'; -$lang['error_delete'] = 'Es trat ein Fehler beim Löschen der Erweiterung %s auf. Die wahrscheinlichste Ursache ist eine unzureichende Datei- oder Ordnerzugriffserlaubnis.'; -$lang['enabled'] = 'Erweiterung %s aktiviert.'; -$lang['notenabled'] = 'Erweiterung %s konnte nicht aktiviert werden. Überprüfen sie die Zugriffsberechtigung der Datei.'; -$lang['disabled'] = 'Erweiterung %s deaktiviert.'; -$lang['notdisabled'] = 'Erweiterung %s konnte nicht deaktiviert werden - überprüfe Dateiberechtigungen'; -$lang['packageinstalled'] = 'Plugin-Paket (%d Plugin(s): %s) erfolgreich installiert.'; diff --git a/sources/lib/plugins/plugin/lang/de/admin_plugin.txt b/sources/lib/plugins/plugin/lang/de/admin_plugin.txt deleted file mode 100644 index f3b2caa..0000000 --- a/sources/lib/plugins/plugin/lang/de/admin_plugin.txt +++ /dev/null @@ -1,5 +0,0 @@ -====== Verwaltung der Plugins ====== - -Auf dieser Seite kannst du alles machen, was mit DokuWiki [[doku>plugins|Plugins]] zu tun hat. Um Plugins automatisch herunterladen und installieren zu können, muss der Webserver im Plugin-Ordner schreiben dürfen. - - diff --git a/sources/lib/plugins/plugin/lang/de/lang.php b/sources/lib/plugins/plugin/lang/de/lang.php deleted file mode 100644 index f414860..0000000 --- a/sources/lib/plugins/plugin/lang/de/lang.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @author Andreas Gohr - * @author Michael Klier - * @author Leo Moll - * @author Florian Anderiasch - * @author Robin Kluth - * @author Arne Pelka - * @author Dirk Einecke - * @author Blitzi94@gmx.de - * @author Robert Bogenschneider - * @author Robert Bogenschneider - * @author Niels Lange - * @author Christian Wichmann - * @author Paul Lachewsky - * @author Pierre Corell - */ -$lang['menu'] = 'Plugins verwalten'; -$lang['download'] = 'Neues Plugin herunterladen und installieren'; -$lang['manage'] = 'Installierte Plugins'; -$lang['btn_info'] = 'Info'; -$lang['btn_update'] = 'Update'; -$lang['btn_delete'] = 'Löschen'; -$lang['btn_settings'] = 'Einstellungen'; -$lang['btn_download'] = 'Herunterladen'; -$lang['btn_enable'] = 'Speichern'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Installiert:'; -$lang['lastupdate'] = 'Letzte Version:'; -$lang['source'] = 'Quelle:'; -$lang['unknown'] = 'unbekannt'; -$lang['updating'] = 'Lade Update ...'; -$lang['updated'] = 'Update von Plugin %s erfolgreich installiert'; -$lang['updates'] = 'Die folgenden Plugins wurden erfolgreich aktualisiert'; -$lang['update_none'] = 'Keine Updates gefunden.'; -$lang['deleting'] = 'Löschen ...'; -$lang['deleted'] = 'Plugin %s gelöscht.'; -$lang['downloading'] = 'Lade herunter ...'; -$lang['downloaded'] = 'Plugin %s erfolgreich installiert'; -$lang['downloads'] = 'Die folgenden Plugins wurden erfolgreich installiert:'; -$lang['download_none'] = 'Keine Plugins gefunden oder es trat ein Fehler beim Herunterladen auf.'; -$lang['plugin'] = 'Plugin:'; -$lang['components'] = 'Komponenten'; -$lang['noinfo'] = 'Dieses Plugin liefert keine Informationen, möglicherweise ist es fehlerhaft.'; -$lang['name'] = 'Name:'; -$lang['date'] = 'Datum:'; -$lang['type'] = 'Typ:'; -$lang['desc'] = 'Beschreibung:'; -$lang['author'] = 'Entwickler:'; -$lang['www'] = 'Web:'; -$lang['error'] = 'Ein unbekannter Fehler ist aufgetreten.'; -$lang['error_download'] = 'Konnte das Plugin %s nicht herunterladen'; -$lang['error_badurl'] = 'Wahrscheinlich ungültige URL, konnte keinen Dateinamen ausfindig machen'; -$lang['error_dircreate'] = 'Konnte keinen temporären Ordner für die Downloads erstellen'; -$lang['error_decompress'] = 'Der Plugin Manager konnte das Plugin-Archiv nicht entpacken. Entweder ist der Download fehlerhaft oder das Komprimierungsverfahren wird nicht unterstützt. Bitte versuchen Sie es erneut oder downloaden und installieren Sie das Plugin manuell.'; -$lang['error_copy'] = 'Beim Kopieren der Dateien des Plugins trat ein Fehler auf %s: möglicherweise ist die Festplatte voll oder die Dateiberechtigungen falsch. Möglicherweise wurde das Plugin nur teilweise installiert. Sie sollten das Plugin manuell entfernen um Instabilitäten zu vermeiden.'; -$lang['error_delete'] = 'Es gab einem Fehler beim Versuch das Plugin zu löschen %s. Dies liegt wahrscheinlich an fehlenden Dateiberechtigungen.'; -$lang['enabled'] = 'Plugin %s wurde aktiviert.'; -$lang['notenabled'] = 'Plugin %s konnte nicht aktiviert werden, überprüfen Sie die Dateirechte.'; -$lang['disabled'] = 'Plugin %s wurde deaktiviert.'; -$lang['notdisabled'] = 'Plugin %s konnte nicht deaktiviert werden, überprüfen Sie die Dateirechte.'; -$lang['packageinstalled'] = 'Plugin-Paket (%d Plugin(s): %s) erfolgreich installiert.'; diff --git a/sources/lib/plugins/plugin/lang/el/admin_plugin.txt b/sources/lib/plugins/plugin/lang/el/admin_plugin.txt deleted file mode 100644 index 8b29293..0000000 --- a/sources/lib/plugins/plugin/lang/el/admin_plugin.txt +++ /dev/null @@ -1,5 +0,0 @@ -====== Διαχείριση Επεκτάσεων ====== - -Σε αυτή την σελίδα μπορείτε να διαχειριστείτε τις [[doku>plugins|επεκτάσεις]] του Dokuwiki σας. Για να μπορέσετε να εγκαταστήσετε νέες επεκτάσεις, ο αντίστοιχος φάκελος συστήματος θα πρέπει να είναι εγγράψιμος από τον χρήστη κάτω από τον οποίο εκτελείται η εφαρμογή του εξυπηρετητή σας. - - diff --git a/sources/lib/plugins/plugin/lang/el/lang.php b/sources/lib/plugins/plugin/lang/el/lang.php deleted file mode 100644 index f50e26c..0000000 --- a/sources/lib/plugins/plugin/lang/el/lang.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @author Thanos Massias - * @author Αθανάσιος Νταής - * @author Konstantinos Koryllos - * @author George Petsagourakis - * @author Petros Vidalis - * @author Vasileios Karavasilis vasileioskaravasilis@gmail.com - */ -$lang['menu'] = 'Διαχείριση Επεκτάσεων'; -$lang['download'] = 'Κατεβάστε και εγκαταστήστε μια νέα επέκταση (plugin)'; -$lang['manage'] = 'Εγκατεστημένες επεκτάσεις'; -$lang['btn_info'] = 'πληροφορίες'; -$lang['btn_update'] = 'ενημέρωση'; -$lang['btn_delete'] = 'διαγραφή'; -$lang['btn_settings'] = 'ρυθμίσεις'; -$lang['btn_download'] = 'Μεταφόρτωση'; -$lang['btn_enable'] = 'Αποθήκευση'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Εγκατεστημένη:'; -$lang['lastupdate'] = 'Τελευταία ενημέρωση:'; -$lang['source'] = 'Προέλευση:'; -$lang['unknown'] = 'άγνωστο'; -$lang['updating'] = 'Σε διαδικασία ενημέρωσης ...'; -$lang['updated'] = 'Η επέκταση %s ενημερώθηκε με επιτυχία'; -$lang['updates'] = 'Οι παρακάτω επεκτάσεις ενημερώθηκαν με επιτυχία:'; -$lang['update_none'] = 'Δεν βρέθηκαν ενημερώσεις.'; -$lang['deleting'] = 'Σε διαδικασία διαγραφής ...'; -$lang['deleted'] = 'Η επέκταση %s διαγράφηκε.'; -$lang['downloading'] = 'Σε διαδικασία μεταφόρτωσης ...'; -$lang['downloaded'] = 'Η επέκταση %s εγκαταστάθηκε με επιτυχία'; -$lang['downloads'] = 'Οι παρακάτω επεκτάσεις εγκαταστάθηκαν με επιτυχία:'; -$lang['download_none'] = 'Δεν βρέθηκαν επεκτάσεις ή εμφανίστηκε κάποιο πρόβλημα κατά την σχετική διαδικασία.'; -$lang['plugin'] = 'Επέκταση:'; -$lang['components'] = 'Συστατικά'; -$lang['noinfo'] = 'Αυτή η επέκταση δεν επέστρεψε κάποια πληροφορία - η επέκταση μπορεί να μην λειτουργεί κανονικά.'; -$lang['name'] = 'Όνομα:'; -$lang['date'] = 'Ημερομηνία:'; -$lang['type'] = 'Τύπος:'; -$lang['desc'] = 'Περιγραφή:'; -$lang['author'] = 'Συγγραφέας:'; -$lang['www'] = 'Διεύθυνση στο διαδίκτυο:'; -$lang['error'] = 'Εμφανίστηκε άγνωστο σφάλμα.'; -$lang['error_download'] = 'Δεν είναι δυνατή η μεταφόρτωση του αρχείου: %s'; -$lang['error_badurl'] = 'Το URL είναι μάλλον λανθασμένο - είναι αδύνατον να εξαχθεί το όνομα αρχείου από αυτό το URL'; -$lang['error_dircreate'] = 'Δεν είναι δυνατή η δημιουργία ενός προσωρινού φακέλου αποθήκευσης των μεταφορτώσεων'; -$lang['error_decompress'] = 'Δεν είναι δυνατή η αποσυμπίεση των μεταφορτώσεων. Αυτό μπορεί να οφείλεται σε μερική λήψη των μεταφορτώσεων, οπότε θα πρέπει να επαναλάβετε την διαδικασία ή το σύστημά σας δεν μπορεί να διαχειριστεί το συγκεκριμένο είδος συμπίεσης, οπότε θα πρέπει να εγκαταστήσετε την επέκταση χειροκίνητα.'; -$lang['error_copy'] = 'Εμφανίστηκε ένα σφάλμα αντιγραφής αρχείων κατά την διάρκεια εγκατάστασης της επέκτασης %s: ο δίσκος μπορεί να είναι γεμάτος ή να μην είναι σωστά ρυθμισμένα τα δικαιώματα πρόσβασης. Αυτό το γεγονός μπορεί να οδήγησε σε μερική εγκατάσταση της επέκτασης και άρα η DokuWiki εγκατάστασή σας να εμφανίσει προβλήματα σταθερότητας.'; -$lang['error_delete'] = 'Εμφανίστηκε ένα σφάλμα κατά την διαδικασία διαγραφής της επέκτασης %s. Η πιθανότερη αιτία είναι να μην είναι σωστά ρυθμισμένα τα δικαιώματα πρόσβασης.'; -$lang['enabled'] = 'Η επέκταση %s ενεργοποιήθηκε.'; -$lang['notenabled'] = 'Η επέκταση %s δεν μπορεί να ενεργοποιηθεί. Ελέγξτε τα δικαιώματα πρόσβασης.'; -$lang['disabled'] = 'Η επέκταση %s απενεργοποιήθηκε.'; -$lang['notdisabled'] = 'Η επέκταση %s δεν μπορεί να απενεργοποιηθεί. Ελέγξτε τα δικαιώματα πρόσβασης.'; -$lang['packageinstalled'] = 'Το πακέτο της επέκτασης (%d επέκταση(εις): %s) εγκαστήθηκε επιτυχημένα.'; diff --git a/sources/lib/plugins/plugin/lang/en/admin_plugin.txt b/sources/lib/plugins/plugin/lang/en/admin_plugin.txt deleted file mode 100644 index cb23b1e..0000000 --- a/sources/lib/plugins/plugin/lang/en/admin_plugin.txt +++ /dev/null @@ -1,5 +0,0 @@ -====== Plugin Management ====== - -On this page you can manage everything to do with Dokuwiki [[doku>plugins|plugins]]. To be able to download and install a plugin your plugin folder must be writeable by the webserver. - - diff --git a/sources/lib/plugins/plugin/lang/en/lang.php b/sources/lib/plugins/plugin/lang/en/lang.php deleted file mode 100644 index 87570a7..0000000 --- a/sources/lib/plugins/plugin/lang/en/lang.php +++ /dev/null @@ -1,78 +0,0 @@ - - */ - -$lang['menu'] = 'Manage Plugins'; - -// custom language strings for the plugin -$lang['download'] = "Download and install a new plugin"; -$lang['manage'] = "Installed Plugins"; - -$lang['btn_info'] = 'info'; -$lang['btn_update'] = 'update'; -$lang['btn_delete'] = 'delete'; -$lang['btn_settings'] = 'settings'; -$lang['btn_download'] = 'Download'; -$lang['btn_enable'] = 'Save'; - -$lang['url'] = 'URL'; - -$lang['installed'] = 'Installed:'; -$lang['lastupdate'] = 'Last updated:'; -$lang['source'] = 'Source:'; -$lang['unknown'] = 'unknown'; - -// ..ing = header message -// ..ed = success message - -$lang['updating'] = 'Updating ...'; -$lang['updated'] = 'Plugin %s updated successfully'; -$lang['updates'] = 'The following plugins have been updated successfully'; -$lang['update_none'] = 'No updates found.'; - -$lang['deleting'] = 'Deleting ...'; -$lang['deleted'] = 'Plugin %s deleted.'; - -$lang['downloading'] = 'Downloading ...'; -$lang['downloaded'] = 'Plugin %s installed successfully'; -$lang['downloads'] = 'The following plugins have been installed successfully:'; -$lang['download_none'] = 'No plugins found, or there has been an unknown problem during downloading and installing.'; - -// info titles -$lang['plugin'] = 'Plugin:'; -$lang['components'] = 'Components'; -$lang['noinfo'] = 'This plugin returned no information, it may be invalid.'; -$lang['name'] = 'Name:'; -$lang['date'] = 'Date:'; -$lang['type'] = 'Type:'; -$lang['desc'] = 'Description:'; -$lang['author'] = 'Author:'; -$lang['www'] = 'Web:'; - -// error messages -$lang['error'] = 'An unknown error occurred.'; -$lang['error_download'] = 'Unable to download the plugin file: %s'; -$lang['error_badurl'] = 'Suspect bad url - unable to determine file name from the url'; -$lang['error_dircreate'] = 'Unable to create temporary folder to receive download'; -$lang['error_decompress'] = 'The plugin manager was unable to decompress the downloaded file. '. - 'This maybe as a result of a bad download, in which case you should try again; '. - 'or the compression format may be unknown, in which case you will need to '. - 'download and install the plugin manually.'; -$lang['error_copy'] = 'There was a file copy error while attempting to install files for plugin '. - '%s: the disk could be full or file access permissions may be incorrect. '. - 'This may have resulted in a partially installed plugin and leave your wiki '. - 'installation unstable.'; -$lang['error_delete'] = 'There was an error while attempting to delete plugin %s. '. - 'The most probably cause is insufficient file or directory access permissions'; - -$lang['enabled'] = 'Plugin %s enabled.'; -$lang['notenabled'] = 'Plugin %s could not be enabled, check file permissions.'; -$lang['disabled'] = 'Plugin %s disabled.'; -$lang['notdisabled'] = 'Plugin %s could not be disabled, check file permissions.'; -$lang['packageinstalled'] = 'Plugin package (%d plugin(s): %s) successfully installed.'; - -//Setup VIM: ex: et ts=4 : diff --git a/sources/lib/plugins/plugin/lang/eo/admin_plugin.txt b/sources/lib/plugins/plugin/lang/eo/admin_plugin.txt deleted file mode 100644 index c97dddf..0000000 --- a/sources/lib/plugins/plugin/lang/eo/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Administrado de Kromaĵoj ====== - -En tiu ĉi paĝo vi povas administri ĉion pri DokuWiki-aj [[doku>plugins|kromaĵoj]]. Por sukcesi elŝuti kaj instali kromaĵon, via dosierujo de kromaĵoj devas esti konservebla por la retservilo. diff --git a/sources/lib/plugins/plugin/lang/eo/lang.php b/sources/lib/plugins/plugin/lang/eo/lang.php deleted file mode 100644 index 624246a..0000000 --- a/sources/lib/plugins/plugin/lang/eo/lang.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @author Felipe Castro - * @author Felipe Castro - * @author Felipo Kastro - * @author Erik Pedersen - * @author Erik Pedersen - * @author Robert BOGENSCHNEIDER - * @author Robert Bogenschneider - * @author Robert Bogenschneider - */ -$lang['menu'] = 'Administri Kromaĵojn'; -$lang['download'] = 'Elŝuti kaj instali novan kromaĵon'; -$lang['manage'] = 'Instalitaj kromaĵoj'; -$lang['btn_info'] = 'Info'; -$lang['btn_update'] = 'Ĝisdatigo'; -$lang['btn_delete'] = 'Forigi'; -$lang['btn_settings'] = 'agordoj'; -$lang['btn_download'] = 'Elŝuti'; -$lang['btn_enable'] = 'Konservi'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Instalite:'; -$lang['lastupdate'] = 'Laste ĝisdatigite:'; -$lang['source'] = 'Fonto:'; -$lang['unknown'] = 'nekonate'; -$lang['updating'] = 'Ĝisdatiganta ...'; -$lang['updated'] = 'Kromaĵo %s estas sukcese ĝisdatigita'; -$lang['updates'] = 'Jenaj kromaĵoj estas sukcese ĝisdatigitaj'; -$lang['update_none'] = 'Neniu ĝisdatigo troviĝas.'; -$lang['deleting'] = 'Foriganta ...'; -$lang['deleted'] = 'Kromaĵo %s estas forigita.'; -$lang['downloading'] = 'Elŝutanta ...'; -$lang['downloaded'] = 'La kromaĵo %s estas sukcese instalita'; -$lang['downloads'] = 'Jenaj kromaĵoj estas sukcese instalitaj:'; -$lang['download_none'] = 'Neniu kromaĵo troveblas, aŭ eble okazis nekonata problemo dum elŝuto kaj instalo.'; -$lang['plugin'] = 'Kromaĵo:'; -$lang['components'] = 'Komponantoj'; -$lang['noinfo'] = 'Tiu ĉi kromaĵo liveris neniun informon: eble ĝi ne validas.'; -$lang['name'] = 'Nomo:'; -$lang['date'] = 'Dato:'; -$lang['type'] = 'Tipo:'; -$lang['desc'] = 'Priskribo:'; -$lang['author'] = 'Aŭtoro:'; -$lang['www'] = 'Retpaĝo:'; -$lang['error'] = 'Nekonata eraro okazis.'; -$lang['error_download'] = 'Maleblas elŝuti la kromaĵan dosieron: %s'; -$lang['error_badurl'] = 'Suspektinda malbona URL - maleblas difini la dosieran nomon el la URL'; -$lang['error_dircreate'] = 'Maleblas krei provizoran dosierujon por ricevi elŝutaĵon'; -$lang['error_decompress'] = 'La administrilo de kromaĵoj ne kapablis malkompakti la elŝutitan dosieron. Tio povas esti pro malkompleta elŝuto, tiaokaze provu refoje; aŭ eble la kompakta formato ne estas konata, tiaokaze elŝutu kaj instalu la kromaĵon permane.'; -$lang['error_copy'] = 'Okazis eraro de dosierkopio dum provo instali dosierojn por la kromaĵo %s&: la disko povus esti plenplena aŭ aliro-rajtoj povus esti misdifinitaj. Tio povus rezulti en malkomplete instalita kromaĵo kaj igi vian vikion malstabila.'; -$lang['error_delete'] = 'Okazis eraro dum provo forigi la kromaĵon %s. Verŝajne tio sekvas de nesufiĉa rajto por aliri la dosieron aŭ ties ujon.'; -$lang['enabled'] = 'La kromaĵo %s estas ebligita.'; -$lang['notenabled'] = 'La kromaĵo %s ne povis esti ebligita, kontrolu dosier-permesojn.'; -$lang['disabled'] = 'La kromaĵo %s estas malebligita.'; -$lang['notdisabled'] = 'La kromaĵo %s ne povis esti malebligita, kontrolu dosier-permesojn.'; -$lang['packageinstalled'] = 'Kromaĵa pakaĵo (%d kromaĵo(j): %s) sukcese instalita.'; diff --git a/sources/lib/plugins/plugin/lang/es/admin_plugin.txt b/sources/lib/plugins/plugin/lang/es/admin_plugin.txt deleted file mode 100644 index 973789f..0000000 --- a/sources/lib/plugins/plugin/lang/es/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Administración de Plugin (agregados) ====== - -En esta página tu puedes administrar todo lo que tenga que ver con los [[doku>plugins|plugins]] de Dokuwiki. Para poder descargar e instalar un plugin el usuario correspondiente al servidor de web debe poder escribir en el directorio de plugins. diff --git a/sources/lib/plugins/plugin/lang/es/lang.php b/sources/lib/plugins/plugin/lang/es/lang.php deleted file mode 100644 index 0ec3928..0000000 --- a/sources/lib/plugins/plugin/lang/es/lang.php +++ /dev/null @@ -1,72 +0,0 @@ - - * @author Oscar M. Lage - * @author Gabriel Castillo - * @author oliver@samera.com.py - * @author Enrico Nicoletto - * @author Manuel Meco - * @author VictorCastelan - * @author Jordan Mero hack.jord@gmail.com - * @author Felipe Martinez - * @author Javier Aranda - * @author Zerial - * @author Marvin Ortega - * @author Daniel Castro Alvarado - * @author Fernando J. Gómez - * @author Victor Castelan - * @author Mauro Javier Giamberardino - * @author emezeta - * @author Oscar Ciudad - * @author Ruben Figols - * @author Gerardo Zamudio - * @author Mercè López mercelz@gmail.com - */ -$lang['menu'] = 'Administración de Plugins'; -$lang['download'] = 'Descargar e instalar un nuevo plugin'; -$lang['manage'] = 'Plugins instalados'; -$lang['btn_info'] = 'info'; -$lang['btn_update'] = 'actualizar'; -$lang['btn_delete'] = 'borrar'; -$lang['btn_settings'] = 'configuraciones'; -$lang['btn_download'] = 'Descargar'; -$lang['btn_enable'] = 'Guardar'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Instalado:'; -$lang['lastupdate'] = 'Última actualización:'; -$lang['source'] = 'Origen:'; -$lang['unknown'] = 'desconocido'; -$lang['updating'] = 'Actualizando ...'; -$lang['updated'] = 'El plugin %s ha sido actualizado con éxito'; -$lang['updates'] = 'Los siguientes plugins han sido actualizados con éxito'; -$lang['update_none'] = 'No se encontraron actualizaciones.'; -$lang['deleting'] = 'Eliminando ...'; -$lang['deleted'] = 'El plugin %s ha sido eliminado.'; -$lang['downloading'] = 'Descargando ...'; -$lang['downloaded'] = 'El plugin %s ha sido instalado con éxito'; -$lang['downloads'] = 'Los siguientes plugins han sido instalados con éxito:'; -$lang['download_none'] = 'No se han encontrado plugins, o hubo algún problema durante la descarga o la instalación.'; -$lang['plugin'] = 'Plugin:'; -$lang['components'] = 'Componentes'; -$lang['noinfo'] = 'Este plugin no devolvió información, puede ser inválido.'; -$lang['name'] = 'Nombre:'; -$lang['date'] = 'Fecha:'; -$lang['type'] = 'Tipo:'; -$lang['desc'] = 'Descripción:'; -$lang['author'] = 'Autor:'; -$lang['www'] = 'Web:'; -$lang['error'] = 'Ha ocurrido un error desconocido.'; -$lang['error_download'] = 'Incapaz de descargar el archivo del plugin: %s'; -$lang['error_badurl'] = 'Se sospecha que la URL es incorrecta - incapaz de determinar el nombre del archivo a partir de la URL.'; -$lang['error_dircreate'] = 'Incapaz de crear el directorio temporal para la descarga'; -$lang['error_decompress'] = 'El administrador de plugins fue incapaz de descomprimir el fichero descargado. Esto puede ser por una descarga errónea, en cuyo caso debieras intentar nuevamente; o el formato de compresión es desconocido, en este caso deberás descargar e instalar el plugin manualmente.'; -$lang['error_copy'] = 'Hubo un error al copiar el fichero mientras se intentaban instalar ficheros para el plugin %s: el disco puede estar lleno o los permisos del fichero pueden ser incorrectos. Esto puede haber terminado con una instalación parcial del plugin y haber dejado la instalación del wiki en una situación inestable'; -$lang['error_delete'] = 'Hubo un error al intentar eliminar el plugin %s. La causa más probable es que no se cuente con los permisos necesarios en el fichero o en el directorio'; -$lang['enabled'] = 'Plugin %s habilitado.'; -$lang['notenabled'] = 'Plugin %s no puede ser habilitado, verifica los permisos del archivo.'; -$lang['disabled'] = 'Plugin %s deshabilitado.'; -$lang['notdisabled'] = 'Plugin %s no puede ser deshabilitado, verifica los permisos de archivo.'; -$lang['packageinstalled'] = 'Plugin (%d plugin(s): %s) instalado exitosamente.'; diff --git a/sources/lib/plugins/plugin/lang/et/lang.php b/sources/lib/plugins/plugin/lang/et/lang.php deleted file mode 100644 index 088acf3..0000000 --- a/sources/lib/plugins/plugin/lang/et/lang.php +++ /dev/null @@ -1,32 +0,0 @@ - - */ -$lang['manage'] = 'Paigaldatud pluginad'; -$lang['btn_info'] = 'info'; -$lang['btn_update'] = 'uuenda'; -$lang['btn_delete'] = 'kustuta'; -$lang['btn_settings'] = 'seaded'; -$lang['btn_download'] = 'Lae alla'; -$lang['btn_enable'] = 'Salvesta'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Paigaldatud:'; -$lang['lastupdate'] = 'Viimati uuendatud:'; -$lang['source'] = 'Allikas:'; -$lang['unknown'] = 'tundmatu'; -$lang['updating'] = 'Uuendamine ...'; -$lang['update_none'] = 'Uuendusi ei leitud.'; -$lang['deleting'] = 'Kustutamine ...'; -$lang['deleted'] = 'Plugin %s on kustutatud.'; -$lang['downloading'] = 'Allalaadimine ...'; -$lang['plugin'] = 'Plugin:'; -$lang['components'] = 'Komponendid'; -$lang['name'] = 'Nimi:'; -$lang['date'] = 'Kuupäev'; -$lang['type'] = 'Tüüp:'; -$lang['desc'] = 'Kirjeldus:'; -$lang['author'] = 'Autor:'; -$lang['www'] = 'Veeb:'; diff --git a/sources/lib/plugins/plugin/lang/eu/admin_plugin.txt b/sources/lib/plugins/plugin/lang/eu/admin_plugin.txt deleted file mode 100644 index 367cf37..0000000 --- a/sources/lib/plugins/plugin/lang/eu/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Plugin Kudeaketa ====== - -Orri honetan Dokuwiki [[doku>plugins|plugin-ekin]] erlazionatutako edozer kudeatu dezakezu. Plugin-en bat deskargatu eta instalatu ahal izateko, plugin-en direktorioak web zerbitzariarengatik idazgarria izan behar du. diff --git a/sources/lib/plugins/plugin/lang/eu/lang.php b/sources/lib/plugins/plugin/lang/eu/lang.php deleted file mode 100644 index 2fc07fe..0000000 --- a/sources/lib/plugins/plugin/lang/eu/lang.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @author Zigor Astarbe - */ -$lang['menu'] = 'Plugin-ak Kudeatu'; -$lang['download'] = 'Plugin berri bat deskargatu eta instalatu'; -$lang['manage'] = 'Instalatutako Plugin-ak'; -$lang['btn_info'] = 'info'; -$lang['btn_update'] = 'eguneratu'; -$lang['btn_delete'] = 'ezabatu'; -$lang['btn_settings'] = 'ezarpenak'; -$lang['btn_download'] = 'Deskargatu'; -$lang['btn_enable'] = 'Gorde'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Instalatua:'; -$lang['lastupdate'] = 'Azken aldiz eguneratua:'; -$lang['source'] = 'Iturria:'; -$lang['unknown'] = 'ezezaguna'; -$lang['updating'] = 'Eguneratzen ...'; -$lang['updated'] = 'Arrakastaz eguneratu da %s plugin-a'; -$lang['updates'] = 'Ondorengo plugin-ak ondo eguneratu dira'; -$lang['update_none'] = 'Ez da eguneraketarik aurkitu.'; -$lang['deleting'] = 'Ezabatzen ...'; -$lang['deleted'] = '%s plugin-a ezabatua.'; -$lang['downloading'] = 'Deskargatzen ...'; -$lang['downloaded'] = '%s Plugin-a arrakastaz instalatua'; -$lang['downloads'] = 'Ondorengo plugin-ak arrakastaz instalatu dira:'; -$lang['download_none'] = 'Ez da plugin-ik aurkitu, edo arazo ezezagunen bat egon da deskargatu eta instalatzerako garaian.'; -$lang['plugin'] = 'Plugin-a:'; -$lang['components'] = 'Osagaiak'; -$lang['noinfo'] = 'Plugin honek ez du informaziorik itzuli, agian ez da erabilgarria.'; -$lang['name'] = 'izena:'; -$lang['date'] = 'Data:'; -$lang['type'] = 'Mota:'; -$lang['desc'] = 'Deskribapena:'; -$lang['author'] = 'Egilea:'; -$lang['www'] = 'Web-gunea:'; -$lang['error'] = 'Akats ezezagun bat gertatu da.'; -$lang['error_download'] = 'Ezin izan da plugin-aren honako fitxategia deskargatu: %s'; -$lang['error_badurl'] = 'Ustezko url okerra - ezin izan da fitxategi izena url-tik zehaztu'; -$lang['error_dircreate'] = 'Ezin izan da aldiroko karpeta sortu deskarga jasotzeko'; -$lang['error_decompress'] = 'Plugin kudeatzaileak ezin izan du deskargatutako fitxategia erauzi. Deskarga oker baten ondorioa izan daiteke, eta hala bada berriz saiatu beharko zenuke; edo agian trinkotze formatua ezezaguna da, hala izanik plugin-a eskuz deskargatu eta instalatu beharko zenuelarik.'; -$lang['error_copy'] = 'Fitxategi kopia akats bat egon da %s plugin-arentzat fitxategiak instalatzen saiatzean: diska betea egon liteke edo fitxategi atzipen baimena okerra izan daiteke. Honek partzialki instalatutako plugin bat eta wiki instalazioa ezegonkor utzi dezake.'; -$lang['error_delete'] = 'Akats bat gertatu da %s plugin-a ezabatzeko saiakera egitean. Arrazoia ziurrenik fitxategi edo direktorio atzipen baimen nahikoak ez izatea da.'; -$lang['enabled'] = '%s Plugin-a gaitua.'; -$lang['notenabled'] = '%s Plugin-a ezin izan da gaitu, egiaztatu fitxategi baimenak.'; -$lang['disabled'] = '%s Plugin-a ezgaitua.'; -$lang['notdisabled'] = '%s Plugin-a ezin izan da ezgaitu, egiaztatu fitxategi baimenak. '; -$lang['packageinstalled'] = 'Plugin paketea (%d plugin(s): %s) arrakastaz instalatua izan da.'; diff --git a/sources/lib/plugins/plugin/lang/fa/admin_plugin.txt b/sources/lib/plugins/plugin/lang/fa/admin_plugin.txt deleted file mode 100644 index cd11fb4..0000000 --- a/sources/lib/plugins/plugin/lang/fa/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== مدیریت افزونه‌ها ====== - -در این صفحه شما می‌توانید [[doku>plugins|افزونه‌های]] Dokuwiki را مدیریت کنید. برای امکان دریافت و نصب افزونه‌ها، باید به شاخه‌ی افزونه‌ها (lib/plugin) دسترسی نوشتن برای وب‌سرور را محیا کنید. \ No newline at end of file diff --git a/sources/lib/plugins/plugin/lang/fa/lang.php b/sources/lib/plugins/plugin/lang/fa/lang.php deleted file mode 100644 index 0a8fadb..0000000 --- a/sources/lib/plugins/plugin/lang/fa/lang.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @author omidmr@gmail.com - * @author Omid Mottaghi - * @author Mohammad Reza Shoaei - * @author Milad DZand - * @author AmirH Hassaneini - */ -$lang['menu'] = 'مدیریت افزونه‌ها'; -$lang['download'] = 'دریافت و نصب افزونه'; -$lang['manage'] = 'افزونه‌های نصب شده'; -$lang['btn_info'] = 'مشخصات'; -$lang['btn_update'] = 'بروزرسانی'; -$lang['btn_delete'] = 'حذف'; -$lang['btn_settings'] = 'تنظیمات'; -$lang['btn_download'] = 'دانلود'; -$lang['btn_enable'] = 'ذخیره'; -$lang['url'] = 'آدرس'; -$lang['installed'] = 'نصب شده:'; -$lang['lastupdate'] = 'آخرین بروزرسانی:'; -$lang['source'] = 'منبع:'; -$lang['unknown'] = 'ناشناس'; -$lang['updating'] = 'در حال به روز رسانی...'; -$lang['updated'] = 'افزونه‌ی %s با موفقیت به روز رسانی شد'; -$lang['updates'] = 'افزونه‌های زیر با موفقیت به روز رسانی شده است.'; -$lang['update_none'] = 'به روز رسانی‌ای یافت نشد .'; -$lang['deleting'] = 'در حال حذف...'; -$lang['deleted'] = 'افزونه‌ی %s پاک شد.'; -$lang['downloading'] = 'در حال دریافت...'; -$lang['downloaded'] = 'افزونه‌ی %s با موفقیت نصب شد'; -$lang['downloads'] = 'افزونه‌های زیر با موفقیت نصب شدند:'; -$lang['download_none'] = 'هیچ افزونه‌ای یافت نشد، یا یک مشکل ناشناخته در زمان دریافت و نصب پیش آمده است.'; -$lang['plugin'] = 'افزونه:'; -$lang['components'] = 'کامپوننت'; -$lang['noinfo'] = 'این افزونه هیچ اطلاعاتی را برنگردانده است، ممکن است بی‌اعتبار باشد.'; -$lang['name'] = 'اسم:'; -$lang['date'] = 'تاریخ:'; -$lang['type'] = 'نوع:'; -$lang['desc'] = 'توضیحات:'; -$lang['author'] = 'نویسنده:'; -$lang['www'] = 'وب‌سایت:'; -$lang['error'] = 'یک مشکل ناشناخته پیش آمده.'; -$lang['error_download'] = 'توانایی دریافت افزونه‌ی %s نمی‌باشد.'; -$lang['error_badurl'] = 'آدرس مشکل دارد - توانایی تشخیص نام فایل از آدرس وجود ندارد'; -$lang['error_dircreate'] = 'امکان ایجاد شاخه‌ی موقتی برای دریافت فایل نیست.'; -$lang['error_decompress'] = 'باز کردن فایل با مشکل مواجه شد. این اشکال ممکن است به خاطر دریافت ناقصِ فایل باشد که باید دوباره تلاش کنید، یا فرمت فشرده‌سازی شناخته شده نیست، که باید این افزونه رو دستی نصب کنید.'; -$lang['error_copy'] = 'توانایی کپی کردن فایل‌های افزونه‌ی %s در زمان نصب وجود ندارد. ممکن است دسترسی شاخه‌ی افزونه‌ها مشکل داشته باشد. این مشکل ممکن است باعث نصب ناقص افزونه شود و ویکی را با مشکل مواجه کند.'; -$lang['error_delete'] = 'توانایی حذف افزونه‌ی %s وجود ندارد. این مشکل به خاطر دسترسی فایل یا شاخه‌ی افزونه پیش می‌آید.'; -$lang['enabled'] = 'افزونه‌ی %s فعال شد.'; -$lang['notenabled'] = 'افزونه‌ی %s قابلیت فعال کردن ندارد، دسترسی‌ها را چک کنید.'; -$lang['disabled'] = 'افزونه‌ی %s غیرفعال شد.'; -$lang['notdisabled'] = 'افزونه‌ی %s قابلیت غیرفعال کردن ندارد، دسترسی‌ها را چک کنید.'; -$lang['packageinstalled'] = 'بسته افزونه (%d افزونه: %s) به درستی نصب شد.'; diff --git a/sources/lib/plugins/plugin/lang/fi/admin_plugin.txt b/sources/lib/plugins/plugin/lang/fi/admin_plugin.txt deleted file mode 100644 index 9cdfa1c..0000000 --- a/sources/lib/plugins/plugin/lang/fi/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Liitännäisten hallinta ====== - -Tällä sivulla voit hallita DokuWikin [[doku>plugins|liitännäisiä]]. Voidaksesi ladata ja asentaa liitännäisiä pitää web-palvelimella olla kirjoitusoikeudet plugin hakemistoon. diff --git a/sources/lib/plugins/plugin/lang/fi/lang.php b/sources/lib/plugins/plugin/lang/fi/lang.php deleted file mode 100644 index f51746f..0000000 --- a/sources/lib/plugins/plugin/lang/fi/lang.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @author Teemu Mattila - * @author Sami Olmari - */ -$lang['menu'] = 'Ylläpidä liitännäisiä'; -$lang['download'] = 'Lataa ja asenna uusi liitännäinen'; -$lang['manage'] = 'Asennetut liitännäiset'; -$lang['btn_info'] = 'tietoa'; -$lang['btn_update'] = 'päivitä'; -$lang['btn_delete'] = 'poista'; -$lang['btn_settings'] = 'asetukset'; -$lang['btn_download'] = 'Lataa'; -$lang['btn_enable'] = 'Tallenna'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Asennettu:'; -$lang['lastupdate'] = 'Päivitetty viimeksi:'; -$lang['source'] = 'Lähde:'; -$lang['unknown'] = 'tuntematon'; -$lang['updating'] = 'Päivitetään ...'; -$lang['updated'] = 'Liitännäinen %s päivitetty onnistuneesti'; -$lang['updates'] = 'Seuraavat liitännäiset on päivitetty onnistuneesti'; -$lang['update_none'] = 'Päivityksiä ei löytynyt'; -$lang['deleting'] = 'Poistetaan ...'; -$lang['deleted'] = 'Liitännäinen %s poistettu.'; -$lang['downloading'] = 'Ladataan ...'; -$lang['downloaded'] = 'Liitännäinen %s asennettu onnistuneesti'; -$lang['downloads'] = 'Seuraavat liitännäiset on asennettu onnistuneesti'; -$lang['download_none'] = 'Liitännäisiä ei löytynyt tai on tapahtunut joku tuntematon virhe latauksen ja asennuksen aikana.'; -$lang['plugin'] = 'Liitännäinen:'; -$lang['components'] = 'Osa'; -$lang['noinfo'] = 'Liitännäinen ei palauttanut mitään tietoa ja se voi olla epäkelpo.'; -$lang['name'] = 'Nimi:'; -$lang['date'] = 'Päiväys:'; -$lang['type'] = 'Tyyppi:'; -$lang['desc'] = 'Kuvaus:'; -$lang['author'] = 'Tekijä:'; -$lang['www'] = 'Web:'; -$lang['error'] = 'Tapahtui tuntematon virhe.'; -$lang['error_download'] = 'Liitännäistiedoston %s latauksessa tapahtui tuntematon virhe.'; -$lang['error_badurl'] = 'URL vaikuttaa olleen virheellinen. Siitä ei pystytty päättelemään tiedoston nimeä'; -$lang['error_dircreate'] = 'Ei pystytty luomaan väliaikaista hakemistoa latausta varten'; -$lang['error_decompress'] = 'Liitännäishallinta ei pystynyt purkamaan ladattua tiedostoa. Lataus voi olla epäonnistunut. Siinä tapauksessa voit yrittää uudestaan. Pakkaustapa voi myös olla tuntematon. Siinä tapauksessa sinun pitää ladata ja asentaa liitännäinen käsin.'; -$lang['error_copy'] = 'Tiedoston kopioinnissa tapahtui liitännäisen %s asennuksen aikana virhe. Levy voi olla täynnä tai kansioiden oikeudet voivat olla väärin. Liitännäinen voi olla osittain asennettu ja tämä voi jättää wikiasennukseesi epävakaaseen tilaan.'; -$lang['error_delete'] = 'Liitännäisen %s poistossa tapahtui virhe. Todennäköisin syy on puutteelliset tiedoston tai hakemiston oikeudet'; -$lang['enabled'] = 'Liitännäinen %s käytössä'; -$lang['notenabled'] = 'Liitännäistä %s ei voitu ottaa käyttöön. Tarkista tiedostojen oikeudet.'; -$lang['disabled'] = 'Liitännäinen %s pois käytössä'; -$lang['notdisabled'] = 'Liitännäistä %s ei voitu ottaa pois käytöstä. Tarkista tiedostojen oikeudet.'; -$lang['packageinstalled'] = 'Pluginpaketti (%d plugin: %s:) asennettu onnistuneesti.'; diff --git a/sources/lib/plugins/plugin/lang/fr/admin_plugin.txt b/sources/lib/plugins/plugin/lang/fr/admin_plugin.txt deleted file mode 100644 index b7beba2..0000000 --- a/sources/lib/plugins/plugin/lang/fr/admin_plugin.txt +++ /dev/null @@ -1,4 +0,0 @@ -====== Gestion des extensions ====== - -Cette page vous permet de gérer tout ce qui a trait aux [[doku>fr:plugins|extensions]] de DokuWiki. Pour pouvoir télécharger et installer un module, le répertoire « ''plugin'' » doit être accessible en écriture pour le serveur web. - diff --git a/sources/lib/plugins/plugin/lang/fr/lang.php b/sources/lib/plugins/plugin/lang/fr/lang.php deleted file mode 100644 index 0592f3c..0000000 --- a/sources/lib/plugins/plugin/lang/fr/lang.php +++ /dev/null @@ -1,69 +0,0 @@ - - * @author Delassaux Julien - * @author Maurice A. LeBlanc - * @author stephane.gully@gmail.com - * @author Guillaume Turri - * @author Erik Pedersen - * @author olivier duperray - * @author Vincent Feltz - * @author Philippe Bajoit - * @author Florian Gaub - * @author Samuel Dorsaz samuel.dorsaz@novelion.net - * @author Johan Guilbaud - * @author schplurtz@laposte.net - * @author skimpax@gmail.com - * @author Yannick Aure - * @author Olivier DUVAL - * @author Anael Mobilia - * @author Bruno Veilleux - */ -$lang['menu'] = 'Gestion des extensions'; -$lang['download'] = 'Télécharger et installer une nouvelle extension'; -$lang['manage'] = 'Extensions installées'; -$lang['btn_info'] = 'Info'; -$lang['btn_update'] = 'Mettre à jour'; -$lang['btn_delete'] = 'Supprimer'; -$lang['btn_settings'] = 'Paramètres'; -$lang['btn_download'] = 'Télécharger'; -$lang['btn_enable'] = 'Enregistrer'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Installé :'; -$lang['lastupdate'] = 'Dernière mise à jour :'; -$lang['source'] = 'Source :'; -$lang['unknown'] = 'inconnu'; -$lang['updating'] = 'Mise à jour…'; -$lang['updated'] = 'Extension %s mise à jour avec succès'; -$lang['updates'] = 'Les extensions suivantes ont été mises à jour avec succès'; -$lang['update_none'] = 'Aucune mise à jour n\'a été trouvée.'; -$lang['deleting'] = 'Suppression…'; -$lang['deleted'] = 'Extension %s supprimée.'; -$lang['downloading'] = 'Téléchargement…'; -$lang['downloaded'] = 'Extension %s installée avec succès'; -$lang['downloads'] = 'Les extensions suivantes ont été installées avec succès :'; -$lang['download_none'] = 'Aucune extension n\'a été trouvée, ou un problème inconnu est survenu durant le téléchargement et l\'installation.'; -$lang['plugin'] = 'Extension :'; -$lang['components'] = 'Composants'; -$lang['noinfo'] = 'Cette extension n\'a transmis aucune information, elle pourrait être invalide.'; -$lang['name'] = 'Nom :'; -$lang['date'] = 'Date :'; -$lang['type'] = 'Type :'; -$lang['desc'] = 'Description :'; -$lang['author'] = 'Auteur :'; -$lang['www'] = 'Site web :'; -$lang['error'] = 'Une erreur inconnue est survenue.'; -$lang['error_download'] = 'Impossible de télécharger le fichier de l\'extension : %s'; -$lang['error_badurl'] = 'URL suspecte : impossible de déterminer le nom du fichier à partir de l\'URL'; -$lang['error_dircreate'] = 'Impossible de créer le répertoire temporaire pour effectuer le téléchargement'; -$lang['error_decompress'] = 'Le gestionnaire d\'extensions a été incapable de décompresser le fichier téléchargé. Ceci peut être le résultat d\'un mauvais téléchargement, auquel cas vous devriez réessayer ; ou bien le format de compression est inconnu, auquel cas vous devez télécharger et installer l\'extension manuellement.'; -$lang['error_copy'] = 'Une erreur de copie est survenue lors de l\'installation des fichiers de l\'extension %s : le disque est peut-être plein ou les autorisations d\'accès sont incorrects. Il a pu en résulter une installation partielle de l\'extension et laisser votre installation du wiki instable.'; -$lang['error_delete'] = 'Une erreur est survenue lors de la suppression de l\'extension %s. La raison la plus probable est l\'insuffisance des autorisations sur les fichiers ou les répertoires.'; -$lang['enabled'] = 'Extension %s activée.'; -$lang['notenabled'] = 'L\'extension %s n\'a pas pu être activée, vérifiez les autorisations des fichiers.'; -$lang['disabled'] = 'Extension %s désactivée.'; -$lang['notdisabled'] = 'L\'extension %s n\'a pas pu être désactivée, vérifiez les autorisations des fichiers.'; -$lang['packageinstalled'] = 'Ensemble d\'extensions (%d extension(s): %s) installé avec succès.'; diff --git a/sources/lib/plugins/plugin/lang/gl/admin_plugin.txt b/sources/lib/plugins/plugin/lang/gl/admin_plugin.txt deleted file mode 100644 index 216285a..0000000 --- a/sources/lib/plugins/plugin/lang/gl/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Xestión de Extensións ====== - -Nesta páxina podes xestionar todas as accións posíbeis cos [[doku>plugins|extensións]] do DokuWiki. Para poder descargar e instalar unha extensión, o teu cartafol de extensións debe ser escribíbel polo servidor web. diff --git a/sources/lib/plugins/plugin/lang/gl/lang.php b/sources/lib/plugins/plugin/lang/gl/lang.php deleted file mode 100644 index b3da440..0000000 --- a/sources/lib/plugins/plugin/lang/gl/lang.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @author Oscar M. Lage - * @author Rodrigo Rega - */ -$lang['menu'] = 'Xestionar Extensións'; -$lang['download'] = 'Descargar e instalar unha nova extensión'; -$lang['manage'] = 'Extensións Instalados'; -$lang['btn_info'] = 'info'; -$lang['btn_update'] = 'actualización'; -$lang['btn_delete'] = 'eliminar'; -$lang['btn_settings'] = 'configuración'; -$lang['btn_download'] = 'Descargar'; -$lang['btn_enable'] = 'Gardar'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Instalado:'; -$lang['lastupdate'] = 'Última actualización:'; -$lang['source'] = 'Fonte:'; -$lang['unknown'] = 'descoñecido'; -$lang['updating'] = 'Actualizando...'; -$lang['updated'] = 'Actualizouse correctamente a extensión %s'; -$lang['updates'] = 'Actualizáronse correctamente as seguintes extensións'; -$lang['update_none'] = 'Non se atoparon actualizacións.'; -$lang['deleting'] = 'Eliminando...'; -$lang['deleted'] = 'Eliminado a extensión %s.'; -$lang['downloading'] = 'Descargando...'; -$lang['downloaded'] = 'Instalouse correctamente a extensión %s'; -$lang['downloads'] = 'Instaláronse correctamente as seguintes extensións:'; -$lang['download_none'] = 'Non se atoparon extensións, ou aconteceu un problema descoñecido durante a descarga e instalación.'; -$lang['plugin'] = 'Extensión:'; -$lang['components'] = 'Compoñentes'; -$lang['noinfo'] = 'Esta extensión non devolveu información ningunha. Pode que non sexa válida.'; -$lang['name'] = 'Nome:'; -$lang['date'] = 'Data:'; -$lang['type'] = 'Tipo:'; -$lang['desc'] = 'Descrición:'; -$lang['author'] = 'Autor:'; -$lang['www'] = 'Web:'; -$lang['error'] = 'Houbo un erro descoñecido.'; -$lang['error_download'] = 'Non se puido descargar o arquivo de extensión: %s'; -$lang['error_badurl'] = 'URL posiblemente incorrecto - non se puido determinar o nome do arquivo mediante o URL'; -$lang['error_dircreate'] = 'Non se puido crear un cartafol temporal para recibir a descarga'; -$lang['error_decompress'] = 'O xestor de extensións non foi quen de descomprimir o arquivo descargado. Isto podería ser causado por unha descarga corrupta, polo que, en tal caso, podes tentalo de novo; ou pode que o formato de compresión sexa descoñecido, co que precisarás descargar e instalar a extensión de xeito manual.'; -$lang['error_copy'] = 'Houbo un erro de copia de arquivo ao tentar instalar a extensión %s: pode que o disco estea cheo ou que os permisos de acceso sexan incorrectos. Isto podería dar lugar a unha instalación parcial da extensión e facer que a túa instalación do wiki se volva inestable.'; -$lang['error_delete'] = 'Houbo un erro ao tentar eliminar a extensión %s. O máis probable é que sexa causado por permisos de acceso ao arquivo ou directorio insuficientes.'; -$lang['enabled'] = 'Extensión %s activado.'; -$lang['notenabled'] = 'A extensión %s non puido ser activada, comproba os permisos de arquivo.'; -$lang['disabled'] = 'Extensión %s desactivada.'; -$lang['notdisabled'] = 'A extensión %s non puido ser desactivada, comproba os permisos de arquivo.'; -$lang['packageinstalled'] = 'Paquete de extensión (%d plugin(s): %s) instalado axeitadamente.'; diff --git a/sources/lib/plugins/plugin/lang/he/admin_plugin.txt b/sources/lib/plugins/plugin/lang/he/admin_plugin.txt deleted file mode 100644 index 206d368..0000000 --- a/sources/lib/plugins/plugin/lang/he/admin_plugin.txt +++ /dev/null @@ -1,5 +0,0 @@ -====== ניהול הרחבות ====== - -בדף זה ניתן לנהל כל דבר הקשור ל[[doku>plugins|הרחבות]] של DokuWiki. כדי שניתן יהיה להוריד ולהתקין הרחבה על תיקית ה-plugins שלך להיות ברת כתיבה על ידי שרת הרשת. - - diff --git a/sources/lib/plugins/plugin/lang/he/lang.php b/sources/lib/plugins/plugin/lang/he/lang.php deleted file mode 100644 index 7753c23..0000000 --- a/sources/lib/plugins/plugin/lang/he/lang.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @author Dotan Kamber - * @author Moshe Kaplan - * @author Yaron Yogev - * @author Yaron Shahrabani - */ -$lang['menu'] = 'ניהול הרחבות'; -$lang['download'] = 'הורדת והתקנת הרחבה חדשה'; -$lang['manage'] = 'הרחבות מותקנות'; -$lang['btn_info'] = 'מידע'; -$lang['btn_update'] = 'עידכון'; -$lang['btn_delete'] = 'מחיקה'; -$lang['btn_settings'] = 'הגדרות'; -$lang['btn_download'] = 'הורדה'; -$lang['btn_enable'] = 'שמירה'; -$lang['url'] = 'URL'; -$lang['installed'] = 'מותקנות:'; -$lang['lastupdate'] = 'עודכנו לאחרונה:'; -$lang['source'] = 'מקור:'; -$lang['unknown'] = 'לא ידוע'; -$lang['updating'] = 'מעדכן ...'; -$lang['updated'] = 'ההרחבה %s עודכנה בהצלחה'; -$lang['updates'] = 'ההרחבות הבאות עודכנו בהצלחה'; -$lang['update_none'] = 'לא נמצאו עידכונים.'; -$lang['deleting'] = 'מוחק ...'; -$lang['deleted'] = 'ההרחבה %s נמחקה.'; -$lang['downloading'] = 'מוריד ...'; -$lang['downloaded'] = 'ההרחבה %s הותקנה בהצלחה'; -$lang['downloads'] = 'ההרחבות הבאות הותקנו בהצלחה:'; -$lang['download_none'] = 'לא נמצאו הרחבות או שחלה בעיה בלתי ידועה במהלך ההורדה וההתקנה.'; -$lang['plugin'] = 'הרחבה:'; -$lang['components'] = 'רכיבים'; -$lang['noinfo'] = 'הרחבה זו לא השיבה מידע, יתכן כי היא אינה בתוקף.'; -$lang['name'] = 'שם:'; -$lang['date'] = 'תאריך:'; -$lang['type'] = 'סוג:'; -$lang['desc'] = 'תיאור:'; -$lang['author'] = 'מחבר:'; -$lang['www'] = 'רשת:'; -$lang['error'] = 'שגיאה לא ידועה ארעה.'; -$lang['error_download'] = 'כשל בהורדת קובץ ההרחבה: %s'; -$lang['error_badurl'] = 'כנראה כתובת שגויה - כשל בקביעת שם הקובץ מהכתובת'; -$lang['error_dircreate'] = 'כשל ביצירת תיקיה זמנית לקבלת ההורדה'; -$lang['error_decompress'] = 'מנהל ההרחבות כשל בפרישת הקובץ שהורד. יתכן כי זו תוצאה של הורדה תקולה ובמקרה זה עליך לנסות שנית; או שיתכן כי תסדיר הכיווץ אינו ידוע, במקרה זה יהיה עליך להוריד ולהתקין את ההרחבה ידנית.'; -$lang['error_copy'] = 'חלה שגיאה בהעתקת הקובץ בניסיון להתקין קבצים להרחבה %s: ייתכן כי הדיסק מלא או שהרשאות הגישה לקבצים שגויות. יתכן כי בשל כך נוצרה התקנה חלקית של ההרחבה שתשאיר את התקנת הויקי שלך לא יציבה.'; -$lang['error_delete'] = 'חלה שגיאה בעת ניסיון למחיקת ההרחבה %s. הסיבה הסבירה ביותר היא הרשאות גישה לקבצים ולספריות שאינן מספקות'; -$lang['enabled'] = 'תוסף %s מופעל.'; -$lang['notenabled'] = 'לא ניתן להפעיל את התוסף %s, בדוק הרשאות קבצים.'; -$lang['disabled'] = 'תוסף %s מושבת.'; -$lang['notdisabled'] = 'לא ניתן להשבית את התוסף %s, בדוק הרשאות קבצים.'; diff --git a/sources/lib/plugins/plugin/lang/hi/lang.php b/sources/lib/plugins/plugin/lang/hi/lang.php deleted file mode 100644 index 89d27ce..0000000 --- a/sources/lib/plugins/plugin/lang/hi/lang.php +++ /dev/null @@ -1,12 +0,0 @@ - - * @author yndesai@gmail.com - */ -$lang['unknown'] = 'अज्ञात'; -$lang['date'] = 'दिनांक:'; -$lang['author'] = 'लेखक:'; -$lang['error'] = 'अज्ञात त्रुटि हुइ'; diff --git a/sources/lib/plugins/plugin/lang/hr/lang.php b/sources/lib/plugins/plugin/lang/hr/lang.php deleted file mode 100644 index 96f1d6a..0000000 --- a/sources/lib/plugins/plugin/lang/hr/lang.php +++ /dev/null @@ -1,8 +0,0 @@ - - * @author Dražen Odobašić - * @author Dejan Igrec dejan.igrec@gmail.com - */ diff --git a/sources/lib/plugins/plugin/lang/hu/admin_plugin.txt b/sources/lib/plugins/plugin/lang/hu/admin_plugin.txt deleted file mode 100644 index afa08d3..0000000 --- a/sources/lib/plugins/plugin/lang/hu/admin_plugin.txt +++ /dev/null @@ -1,4 +0,0 @@ -====== Bővítménykezelő ====== - -Ezen az oldalon a Dokuwiki [[doku>plugins|bővítményeivel]] kapcsolatos teendőket láthatod el. A webszervernek tudni kell írnia a //plugin// könyvtárat, hogy új bővítményeket tudj ezen a felületen keresztül letölteni és telepíteni. - diff --git a/sources/lib/plugins/plugin/lang/hu/lang.php b/sources/lib/plugins/plugin/lang/hu/lang.php deleted file mode 100644 index b8fa2cd..0000000 --- a/sources/lib/plugins/plugin/lang/hu/lang.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @author Siaynoq Mage - * @author schilling.janos@gmail.com - * @author Szabó Dávid - * @author Sándor TIHANYI - * @author David Szabo - * @author Marton Sebok - */ -$lang['menu'] = 'Bővítménykezelő'; -$lang['download'] = 'Új bővítmény letöltése és telepítése'; -$lang['manage'] = 'Telepített bővítmények'; -$lang['btn_info'] = 'infó'; -$lang['btn_update'] = 'frissítés'; -$lang['btn_delete'] = 'törlés'; -$lang['btn_settings'] = 'beállítások'; -$lang['btn_download'] = 'Letöltés'; -$lang['btn_enable'] = 'Mentés'; -$lang['url'] = 'Cím'; -$lang['installed'] = 'Telepítve:'; -$lang['lastupdate'] = 'Utolsó frissítés:'; -$lang['source'] = 'Forrás:'; -$lang['unknown'] = 'ismeretlen'; -$lang['updating'] = 'Frissítés...'; -$lang['updated'] = 'A %s bővítmény frissítése sikeres'; -$lang['updates'] = 'A következő bővítmények frissítése sikeres:'; -$lang['update_none'] = 'Nem találtam újabb verziót.'; -$lang['deleting'] = 'Törlés...'; -$lang['deleted'] = 'A %s bővítményt eltávolítva.'; -$lang['downloading'] = 'Letöltés...'; -$lang['downloaded'] = 'A %s bővítmény telepítése sikeres.'; -$lang['downloads'] = 'A következő bővítmények telepítése sikeres.'; -$lang['download_none'] = 'Nem találtam bővítményt vagy ismeretlen hiba történt a letöltés/telepítés közben.'; -$lang['plugin'] = 'Bővítmény:'; -$lang['components'] = 'Részek'; -$lang['noinfo'] = 'Ez a bővítmény nem tartalmaz információt, lehet, hogy hibás.'; -$lang['name'] = 'Név:'; -$lang['date'] = 'Dátum:'; -$lang['type'] = 'Típus:'; -$lang['desc'] = 'Leírás:'; -$lang['author'] = 'Szerző:'; -$lang['www'] = 'Web:'; -$lang['error'] = 'Ismeretlen hiba lépett fel.'; -$lang['error_download'] = 'Nem tudom letölteni a fájlt a bővítményhez: %s'; -$lang['error_badurl'] = 'Feltehetően rossz URL - nem tudom meghatározni a fájlnevet az URL-ből.'; -$lang['error_dircreate'] = 'Nem tudom létrehozni az átmeneti könyvtárat a letöltéshez.'; -$lang['error_decompress'] = 'A Bővítménykezelő nem tudta a letöltött állományt kicsomagolni. Ennek oka lehet hibás letöltés, ebben az esetben újra letöltéssel próbálkozhatsz, esetleg a tömörítés módja ismeretlen, ebben az esetben kézzel kell letölteni és telepíteni a bővítményt.'; -$lang['error_copy'] = 'Fájl másolási hiba történt a(z) %s bővítmény telepítése közben: vagy a lemezterület fogyott el, vagy az állomány hozzáférési jogosultságai nem megfelelőek. Emiatt előfordulhat, hogy a bővítményt csak részben sikerült telepíteni és a wiki összeomolhat.'; -$lang['error_delete'] = 'Hiba történt a(z) %s bővítmény eltávolítása közben. A legvalószínűbb ok, hogy a könyvtár vagy állomány hozzáférési jogosultságai nem megfelelőek.'; -$lang['enabled'] = 'A(z) %s bővítmény bekapcsolva.'; -$lang['notenabled'] = 'A(z) %s bővítmény engedélyezése nem sikerült. Ellenőrizze a fájlhozzáférési jogosultságokat.'; -$lang['disabled'] = 'A(z) %s bővítmény kikapcsolva.'; -$lang['notdisabled'] = 'A(z) %s bővítmény kikapcsolása nem sikerült. Ellenőrizze a fájlhozzáférési jogosultságokat.'; -$lang['packageinstalled'] = 'A bővítménycsomag(ok) feltelepült(ek): %d plugin(s): %s'; diff --git a/sources/lib/plugins/plugin/lang/ia/admin_plugin.txt b/sources/lib/plugins/plugin/lang/ia/admin_plugin.txt deleted file mode 100644 index c7f758c..0000000 --- a/sources/lib/plugins/plugin/lang/ia/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Gestion de plug-ins ====== - -In iste pagina tu pote gerer omne cosas con relation al [[doku>plugins|plug-ins]] de DokuWiki. Pro poter discargar e installar un plug-in, le directorio de plug-ins debe permitter le accesso de scriptura al servitor web. \ No newline at end of file diff --git a/sources/lib/plugins/plugin/lang/ia/lang.php b/sources/lib/plugins/plugin/lang/ia/lang.php deleted file mode 100644 index 523f858..0000000 --- a/sources/lib/plugins/plugin/lang/ia/lang.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @author Martijn Dekker - */ -$lang['menu'] = 'Gestion de plug-ins'; -$lang['download'] = 'Discargar e installar un nove plug-in'; -$lang['manage'] = 'Plug-ins installate'; -$lang['btn_info'] = 'info'; -$lang['btn_update'] = 'actualisar'; -$lang['btn_delete'] = 'deler'; -$lang['btn_settings'] = 'configurationes'; -$lang['btn_download'] = 'Discargar'; -$lang['btn_enable'] = 'Salveguardar'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Installate:'; -$lang['lastupdate'] = 'Ultime actualisation:'; -$lang['source'] = 'Origine:'; -$lang['unknown'] = 'incognite'; -$lang['updating'] = 'Actualisation…'; -$lang['updated'] = 'Actualisation del plug-in %s succedite'; -$lang['updates'] = 'Le sequente plug-ins ha essite actualisate con successo'; -$lang['update_none'] = 'Nulle actualisation trovate.'; -$lang['deleting'] = 'Deletion…'; -$lang['deleted'] = 'Le plug-in %s ha essite delite.'; -$lang['downloading'] = 'Discargamento…'; -$lang['downloaded'] = 'Installation del plug-in %s succedite.'; -$lang['downloads'] = 'Le sequente plug-ins ha essite installate con successo:'; -$lang['download_none'] = 'Nulle plug-in trovate, o il ha occurrite un problema incognite durante le discargamento e installation.'; -$lang['plugin'] = 'Plug-in:'; -$lang['components'] = 'Componentes'; -$lang['noinfo'] = 'Iste plug-in retornava nulle information; illo pote esser invalide.'; -$lang['name'] = 'Nomine:'; -$lang['date'] = 'Data:'; -$lang['type'] = 'Typo:'; -$lang['desc'] = 'Description:'; -$lang['author'] = 'Autor:'; -$lang['www'] = 'Web:'; -$lang['error'] = 'Un error incognite ha occurrite.'; -$lang['error_download'] = 'Impossibile discargar le file del plug-in: %s'; -$lang['error_badurl'] = 'URL probabilemente invalide; impossibile determinar le nomine del file ex le URL'; -$lang['error_dircreate'] = 'Impossibile crear le dossier temporari pro reciper le discargamento'; -$lang['error_decompress'] = 'Le gestor de plug-ins non poteva decomprimer le file discargate. Isto pote esser le resultato de un discargamento defectuose, in le qual caso tu deberea probar lo de novo; o le formato de compression pote esser incognite, in le qual caso tu debe discargar e installar le plug-in manualmente.'; -$lang['error_copy'] = 'Il occurreva un error durante le tentativa de installar files pro le plugin %s: le disco pote esser plen o le permissiones de accesso a files pote esser incorrecte. Isto pote haber resultate in un plug-in partialmente installate e lassar tu installation del wiki instabile.'; -$lang['error_delete'] = 'Il occurreva un error durante le tentativa de deler le plug-in %s. Le causa le plus probabile es insufficiente permissiones de files o directorios.'; -$lang['enabled'] = 'Plug-in %s activate.'; -$lang['notenabled'] = 'Le plug-in %s non poteva esser activate; verifica le permissiones de accesso a files.'; -$lang['disabled'] = 'Plug-in %s disactivate.'; -$lang['notdisabled'] = 'Le plug-in %s non poteva esser disactivate; verifica le permissiones de accesso a files.'; diff --git a/sources/lib/plugins/plugin/lang/id-ni/lang.php b/sources/lib/plugins/plugin/lang/id-ni/lang.php deleted file mode 100644 index d367340..0000000 --- a/sources/lib/plugins/plugin/lang/id-ni/lang.php +++ /dev/null @@ -1,7 +0,0 @@ - - * @author Yustinus Waruwu - */ diff --git a/sources/lib/plugins/plugin/lang/id/lang.php b/sources/lib/plugins/plugin/lang/id/lang.php deleted file mode 100644 index 2653b07..0000000 --- a/sources/lib/plugins/plugin/lang/id/lang.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @author Yustinus Waruwu - */ -$lang['btn_info'] = 'Info'; -$lang['btn_update'] = 'Baharui'; -$lang['btn_delete'] = 'Hapus'; -$lang['btn_settings'] = 'Pengaturan'; -$lang['btn_download'] = 'Unduh'; -$lang['btn_enable'] = 'Simpan'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Instal'; -$lang['lastupdate'] = 'Pembaharuan terakhir:'; -$lang['source'] = 'Sumber:'; -$lang['unknown'] = 'Tidak kenal'; -$lang['updating'] = 'Terbaharui ...'; -$lang['update_none'] = 'Tidak ditemukan pembaharuan'; -$lang['deleting'] = 'Terhapus ...'; -$lang['deleted'] = 'Hapus Plugin %s.'; -$lang['downloading'] = 'Unduh ...'; -$lang['plugin'] = 'Plugin:'; -$lang['components'] = 'Komponen'; -$lang['name'] = 'Nama:'; -$lang['date'] = 'Tanggal:'; -$lang['type'] = 'Tipe:'; -$lang['desc'] = 'Penjelasan:'; -$lang['author'] = 'Autor:'; -$lang['www'] = 'Web:'; diff --git a/sources/lib/plugins/plugin/lang/is/lang.php b/sources/lib/plugins/plugin/lang/is/lang.php deleted file mode 100644 index 0ef1243..0000000 --- a/sources/lib/plugins/plugin/lang/is/lang.php +++ /dev/null @@ -1,47 +0,0 @@ - - * @author Ólafur Gunnlaugsson - * @author Erik Bjørn Pedersen - */ -$lang['menu'] = 'Umsýsla viðbóta'; -$lang['download'] = 'Hlaða niður og innsetja viðbót'; -$lang['manage'] = 'Uppsettar viðbætur'; -$lang['btn_info'] = 'upplýsingar'; -$lang['btn_update'] = 'uppfæra'; -$lang['btn_delete'] = 'eyða'; -$lang['btn_settings'] = 'stillingar'; -$lang['btn_download'] = 'Niðurhal'; -$lang['btn_enable'] = 'Vista'; -$lang['url'] = 'Veffang'; -$lang['installed'] = 'Innsett:'; -$lang['lastupdate'] = 'Síðast uppfærð:'; -$lang['source'] = 'Gjafi:'; -$lang['unknown'] = 'óþekkt'; -$lang['updating'] = 'Uppfæri viðbót'; -$lang['updated'] = '%s viðbótin hefur verið uppfærð'; -$lang['updates'] = 'Eftirfarandi viðbætur hafa verið uppfærðar'; -$lang['update_none'] = 'Engar uppfærslur fundust.'; -$lang['deleting'] = 'Eyði viðbót'; -$lang['deleted'] = 'Viðbót %s eytt'; -$lang['downloading'] = 'Hleð viðbót niður ...'; -$lang['downloaded'] = 'Viðbót %s hlóðst inn'; -$lang['downloads'] = 'Eftirfarandi viðbótum hefur verið hlaðið inn:'; -$lang['download_none'] = 'Engin viðbót finnst, hugsanlega hefur komið upp villa við niðurhal eða uppsetningu.'; -$lang['plugin'] = 'Viðbót:'; -$lang['components'] = 'Einingar'; -$lang['noinfo'] = 'Þessi viðbót skilaði ekki upplýsingum og er hugsanlega ónýt.'; -$lang['name'] = 'Nafn:'; -$lang['date'] = 'Dagsetning:'; -$lang['type'] = 'Tegund:'; -$lang['desc'] = 'Lýsing:'; -$lang['author'] = 'Höfundur:'; -$lang['www'] = 'Vefur:'; -$lang['error'] = 'Óskilgreind villa'; -$lang['error_download'] = 'Niðurhal viðbótar %s mistókst'; -$lang['error_decompress'] = 'Viðbótastjórinn gat ekki afþjappað skránna. Þetta gæti verið vegna misheppnaðs niðurhals, ef svo er reyndu niðurhal aftur. Það er einnig mögulegt að skráin sé þjöppuð með aðferð sem að er Dokuwiki óþekkt, í því tilfelli er best að vista viðhengið á tölvunni þinni, afþjappa hana þar og svo hlaða skránum upp handvirkt.'; -$lang['enabled'] = 'Viðbót %s hefur verið ræst.'; -$lang['notenabled'] = 'Ekki var hægt að ræsa %s viðbótina. Athugaðu stillingar á skráaleyfum.'; -$lang['disabled'] = 'Viðbót %s var gerð óvirk'; diff --git a/sources/lib/plugins/plugin/lang/it/admin_plugin.txt b/sources/lib/plugins/plugin/lang/it/admin_plugin.txt deleted file mode 100644 index 5591f08..0000000 --- a/sources/lib/plugins/plugin/lang/it/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Gestione Plugin ====== - -In questa pagina puoi gestire tutto ciò che riguarda i [[doku>plugins|plugin]] di DokuWiki. Per poter scaricare e installare un plugin, il webserver deve avere accesso in scrittura alla directory dei plugin. \ No newline at end of file diff --git a/sources/lib/plugins/plugin/lang/it/lang.php b/sources/lib/plugins/plugin/lang/it/lang.php deleted file mode 100644 index 186bf97..0000000 --- a/sources/lib/plugins/plugin/lang/it/lang.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @author Silvia Sargentoni - * @author Pietro Battiston toobaz@email.it - * @author Diego Pierotto ita.translations@tiscali.it - * @author ita.translations@tiscali.it - * @author Lorenzo Breda - * @author snarchio@alice.it - * @author robocap - * @author Osman Tekin osman.tekin93@hotmail.it - * @author Jacopo Corbetta - * @author Matteo Pasotti - * @author snarchio@gmail.com - */ -$lang['menu'] = 'Gestione Plugin'; -$lang['download'] = 'Scarica e installa un nuovo plugin'; -$lang['manage'] = 'Plugin installati'; -$lang['btn_info'] = 'info'; -$lang['btn_update'] = 'aggiorna'; -$lang['btn_delete'] = 'elimina'; -$lang['btn_settings'] = 'configurazione'; -$lang['btn_download'] = 'Scarica'; -$lang['btn_enable'] = 'Salva'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Installato:'; -$lang['lastupdate'] = 'Ultimo aggiornamento:'; -$lang['source'] = 'Origine:'; -$lang['unknown'] = 'sconosciuto'; -$lang['updating'] = 'Aggiornamento in corso ...'; -$lang['updated'] = 'Aggiornamento plugin %s riuscito'; -$lang['updates'] = 'Aggiornamento dei seguenti plugin riuscito:'; -$lang['update_none'] = 'Nessun aggiornamento trovato.'; -$lang['deleting'] = 'Eliminazione in corso ...'; -$lang['deleted'] = 'Plugin %s eliminato.'; -$lang['downloading'] = 'Scaricamento in corso ...'; -$lang['downloaded'] = 'Installazione plugin %s riuscita'; -$lang['downloads'] = 'Installazione dei seguenti plugin riuscita:'; -$lang['download_none'] = 'Nessun plugin trovato, oppure si è verificato un problema sconosciuto durante il download e l\'installazione.'; -$lang['plugin'] = 'Plugin:'; -$lang['components'] = 'Componenti'; -$lang['noinfo'] = 'Questo plugin non ha fornito alcuna informazione, potrebbe non essere valido.'; -$lang['name'] = 'Nome:'; -$lang['date'] = 'Data:'; -$lang['type'] = 'Tipo:'; -$lang['desc'] = 'Descrizione:'; -$lang['author'] = 'Autore:'; -$lang['www'] = 'Web:'; -$lang['error'] = 'Si è verificato un errore sconosciuto.'; -$lang['error_download'] = 'Impossibile scaricare il plugin: %s'; -$lang['error_badurl'] = 'Possibile URL non corretta - impossibile determinare il nome del file dalla URL fornita'; -$lang['error_dircreate'] = 'Impossibile creare la directory temporanea dove scaricare il file'; -$lang['error_decompress'] = 'Impossibile decomprimere il file scaricato. Questo potrebbe essere il risultato di un download incompleto, in tal caso dovresti provare di nuovo; oppure il formato di compressione potrebbe essere sconosciuto, in questo caso è necessario scaricare e installare il plugin manualmente.'; -$lang['error_copy'] = 'Si è verificato un errore nella copia di un file durante l\'installazione del plugin %s: il disco potrebbe essere pieno oppure i permessi di accesso al file potrebbero non essere corretti. Il plugin potrebbe essere stato installato solo parzialmente, questo potrebbe causare instabilità al sistema.'; -$lang['error_delete'] = 'Si è verificato un errore durante l\'eliminazione del plugin %s. Molto probabilmente i permessi di acesso ai file o alla directory non sono sufficienti'; -$lang['enabled'] = 'Plugin %s abilitato.'; -$lang['notenabled'] = 'Impossibile abilitare il plugin %s, verifica i permessi dei file.'; -$lang['disabled'] = 'Plugin %s disabilitato.'; -$lang['notdisabled'] = 'Impossibile disabilitare il plugin %s, verifica i permessi dei file.'; -$lang['packageinstalled'] = 'Pacchetto plugin (%d plugin(s): %s) installato con successo.'; diff --git a/sources/lib/plugins/plugin/lang/ja/admin_plugin.txt b/sources/lib/plugins/plugin/lang/ja/admin_plugin.txt deleted file mode 100644 index c3b8535..0000000 --- a/sources/lib/plugins/plugin/lang/ja/admin_plugin.txt +++ /dev/null @@ -1,5 +0,0 @@ -====== プラグイン管理 ====== - -この画面で、DokuWikiで使用するプラグイン [[doku>plugins|plugins]] の管理を行うことが出来ます。 プラグインをダウンロード・インストールするためには、サーバー内のプラグイン用フォルダーを 書き込み可にしておく必要があります。 - - diff --git a/sources/lib/plugins/plugin/lang/ja/lang.php b/sources/lib/plugins/plugin/lang/ja/lang.php deleted file mode 100644 index d66e109..0000000 --- a/sources/lib/plugins/plugin/lang/ja/lang.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @author Christopher Smith - * @author Ikuo Obataya - * @author Daniel Dupriest - * @author Kazutaka Miyasaka - * @author Taisuke Shimamoto - * @author Satoshi Sahara - */ -$lang['menu'] = 'プラグイン管理'; -$lang['download'] = 'プラグインのダウンロードとインストール'; -$lang['manage'] = 'インストール済みプラグイン'; -$lang['btn_info'] = '情報'; -$lang['btn_update'] = '更新'; -$lang['btn_delete'] = '削除'; -$lang['btn_settings'] = '設定'; -$lang['btn_download'] = 'ダウンロード'; -$lang['btn_enable'] = '保存'; -$lang['url'] = 'URL'; -$lang['installed'] = 'インストール:'; -$lang['lastupdate'] = '最終更新日:'; -$lang['source'] = 'ソース:'; -$lang['unknown'] = '不明'; -$lang['updating'] = '更新中...'; -$lang['updated'] = 'プラグイン %s は更新されました'; -$lang['updates'] = '次のプラグインが更新されました:'; -$lang['update_none'] = 'プラグインの更新データはありません。'; -$lang['deleting'] = '削除中...'; -$lang['deleted'] = 'プラグイン %s は削除されました。'; -$lang['downloading'] = 'ダウンロード中...'; -$lang['downloaded'] = 'プラグイン %s がインストールされました'; -$lang['downloads'] = '次のプラグインがインストールされました:'; -$lang['download_none'] = 'プラグインが見つかりませんでした。もしくはダウンロードかインストールの最中に予期せぬエラーが発生しました。'; -$lang['plugin'] = 'プラグイン:'; -$lang['components'] = 'コンポーネント'; -$lang['noinfo'] = 'このプラグインに関する情報がありません。有効なプラグインではないかも知れません。'; -$lang['name'] = '名前:'; -$lang['date'] = '日付:'; -$lang['type'] = 'タイプ:'; -$lang['desc'] = '説明:'; -$lang['author'] = '作者:'; -$lang['www'] = 'ウェブサイト:'; -$lang['error'] = '予期せぬエラーが発生しました。'; -$lang['error_download'] = 'プラグインファイルをダウンロードできません:%s'; -$lang['error_badurl'] = 'URLが正しくないようです - ファイル名が特定できません'; -$lang['error_dircreate'] = 'ダウンロードしたファイルを一時的に保管しておくフォルダが作成できません'; -$lang['error_decompress'] = 'ダウンロードしたファイルを解凍できませんでした。ダウンロードに失敗した可能性があります(もう一度、実行してください);もしくは、不明な圧縮形式であるかもしれません(手動でインストールする必要があります)'; -$lang['error_copy'] = 'プラグインをインストール中にファイルのコピーに失敗しました。%s:ディスク容量や書き込みの権限を確認してください。このエラーによりプラグインのインストールが完全に行われず、Wikiが不安定な状態です。'; -$lang['error_delete'] = 'プラグインの削除中にエラーが発生しました %s。プラグインが不完全なファイルであったか、ディレクトリの権限が正しくないことが原因であると考えられます。'; -$lang['enabled'] = 'プラグイン %s が有効です。'; -$lang['notenabled'] = 'プラグイン %s を有効にすることができません。権限を確認してください。'; -$lang['disabled'] = 'プラグイン %s が無効です。'; -$lang['notdisabled'] = 'プラグイン %s を無効にすることができません。権限を確認してください。'; -$lang['packageinstalled'] = 'プラグインパッケージ(%d plugin(s): %s)は正しくインストールされました。'; diff --git a/sources/lib/plugins/plugin/lang/kk/lang.php b/sources/lib/plugins/plugin/lang/kk/lang.php deleted file mode 100644 index dde5b95..0000000 --- a/sources/lib/plugins/plugin/lang/kk/lang.php +++ /dev/null @@ -1,6 +0,0 @@ -ko:plugins|플러그인]]에 관련된 모든 관리를 할 수 있습니다. 플러그인을 다운로드하고 설치하기 위해서는 웹 서버가 플러그인 폴더에 대해 쓰기 권한이 있어야 합니다. \ No newline at end of file diff --git a/sources/lib/plugins/plugin/lang/ko/lang.php b/sources/lib/plugins/plugin/lang/ko/lang.php deleted file mode 100644 index 4cd1ae3..0000000 --- a/sources/lib/plugins/plugin/lang/ko/lang.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @author Seung-Chul Yoo - * @author erial2@gmail.com - * @author Myeongjin - * @author Garam - */ -$lang['menu'] = '플러그인 관리'; -$lang['download'] = '새 플러그인을 다운로드하고 설치'; -$lang['manage'] = '설치된 플러그인'; -$lang['btn_info'] = '정보'; -$lang['btn_update'] = '업데이트'; -$lang['btn_delete'] = '삭제'; -$lang['btn_settings'] = '설정'; -$lang['btn_download'] = '다운로드'; -$lang['btn_enable'] = '저장'; -$lang['url'] = 'URL'; -$lang['installed'] = '설치됨:'; -$lang['lastupdate'] = '마지막으로 업데이트됨:'; -$lang['source'] = '원본:'; -$lang['unknown'] = '알 수 없음'; -$lang['updating'] = '업데이트 중 ...'; -$lang['updated'] = '%s 플러그인을 성공적으로 업데이트했습니다'; -$lang['updates'] = '다음 플러그인을 성공적으로 업데이트했습니다'; -$lang['update_none'] = '업데이트를 찾을 수 없습니다.'; -$lang['deleting'] = '삭제 중 ...'; -$lang['deleted'] = '%s 플러그인이 삭제되었습니다.'; -$lang['downloading'] = '다운로드 중 ...'; -$lang['downloaded'] = '%s 플러그인이 성공적으로 설치되었습니다'; -$lang['downloads'] = '다음 플러그인이 성공적으로 설치되었습니다:'; -$lang['download_none'] = '플러그인이 없거나 다운로드 또는 설치 중에 알 수 없는 문제가 발생했습니다.'; -$lang['plugin'] = '플러그인:'; -$lang['components'] = '구성 요소'; -$lang['noinfo'] = '이 플러그인은 어떤 정보도 없습니다. 잘못된 플러그인일 수 있습니다.'; -$lang['name'] = '이름:'; -$lang['date'] = '날짜:'; -$lang['type'] = '종류:'; -$lang['desc'] = '설명:'; -$lang['author'] = '저자:'; -$lang['www'] = '웹:'; -$lang['error'] = '알 수 없는 문제가 발생했습니다.'; -$lang['error_download'] = '플러그인 파일을 다운로드 할 수 없습니다: %s'; -$lang['error_badurl'] = '잘못된 URL 같습니다 - URL에서 파일 이름을 알 수 없습니다'; -$lang['error_dircreate'] = '다운로드를 받기 위한 임시 디렉터리를 만들 수 없습니다'; -$lang['error_decompress'] = '플러그인 관리자가 다운로드 받은 파일을 압축을 풀 수 없습니다. 잘못 다운로드 받았을 수도 있으니 다시 한 번 시도하거나 압축 포맷을 알 수 없는 경우에는 다운로드한 후 수동으로 직접 설치하세요.'; -$lang['error_copy'] = '플러그인을 설치하는 동안 파일 복사하는 데 오류가 발생했습니다. %s: 디스크가 꽉 찼거나 파일 접근 권한이 잘못된 경우입니다. 플러그인 설치가 부분적으로만 이루어졌을 것입니다. 설치가 불완전합니다.'; -$lang['error_delete'] = '%s 플러그인을 삭제하는 동안 오류가 발생했습니다. 대부분의 경우 불완전한 파일이거나 디렉터리 접근 권한이 잘못된 경우입니다'; -$lang['enabled'] = '%s 플러그인을 활성화했습니다.'; -$lang['notenabled'] = '%s 플러그인을 활성화할 수 없습니다. 파일 권한을 확인하세요.'; -$lang['disabled'] = '%s 플러그인을 비활성화했습니다.'; -$lang['notdisabled'] = '%s 플러그인을 비활성화할 수 없습니다. 파일 권한을 확인하하세요.'; -$lang['packageinstalled'] = '플러그인 패키지(플러그인 %d개: %s)가 성공적으로 설치되었습니다.'; diff --git a/sources/lib/plugins/plugin/lang/la/admin_plugin.txt b/sources/lib/plugins/plugin/lang/la/admin_plugin.txt deleted file mode 100644 index 2a41977..0000000 --- a/sources/lib/plugins/plugin/lang/la/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Addendorum Administratio ====== - -In hac pagina omnia uicis [[doku>plugins|plugins]] mutare et administrare potes. Vt addenda capere et his uti, in scrinio addendorum scribere et legere potest. \ No newline at end of file diff --git a/sources/lib/plugins/plugin/lang/la/lang.php b/sources/lib/plugins/plugin/lang/la/lang.php deleted file mode 100644 index cd2d81c..0000000 --- a/sources/lib/plugins/plugin/lang/la/lang.php +++ /dev/null @@ -1,50 +0,0 @@ - - */ -$lang['menu'] = 'Addendorum administratio'; -$lang['download'] = 'Noua addenda cape'; -$lang['manage'] = 'Addenta in usu'; -$lang['btn_info'] = 'Notae'; -$lang['btn_update'] = 'Nouare'; -$lang['btn_delete'] = 'Delere'; -$lang['btn_settings'] = 'Optiones'; -$lang['btn_download'] = 'Capere'; -$lang['btn_enable'] = 'Seruare'; -$lang['url'] = 'VRL'; -$lang['installed'] = 'In usu:'; -$lang['lastupdate'] = 'Extrema renouatio:'; -$lang['source'] = 'Fons:'; -$lang['unknown'] = 'Ignotum'; -$lang['updating'] = 'Nouans...'; -$lang['updated'] = 'Addenda %s nouata feliciter'; -$lang['updates'] = 'Hae addenda nouata feliciter sunt'; -$lang['update_none'] = 'Nulla renouatio inuenta'; -$lang['deleting'] = 'Delens...'; -$lang['deleted'] = 'Addenda %s deleta.'; -$lang['downloading'] = 'Capens ...'; -$lang['downloaded'] = 'Addenda %s recte in usu'; -$lang['downloads'] = 'Hae addenda feliciter in usu:'; -$lang['download_none'] = 'Nulla addenda reperta aut errores in capiendo sunt.'; -$lang['plugin'] = 'Addenda:'; -$lang['components'] = 'Partes'; -$lang['noinfo'] = 'Addenda alias notas non habent.'; -$lang['name'] = 'Nomen:'; -$lang['date'] = 'Dies:'; -$lang['type'] = 'Genus:'; -$lang['desc'] = 'Descriptio:'; -$lang['author'] = 'Auctor:'; -$lang['www'] = 'Situs interretialis:'; -$lang['error'] = 'Error ignotus.'; -$lang['error_download'] = 'Addenda quae non renouantur: %s'; -$lang['error_badurl'] = 'VRL malum'; -$lang['error_dircreate'] = 'Scrinium temporaneum non creatur, sic nihil capi potest'; -$lang['error_decompress'] = 'Addendorum administrator nouare non potest. Rursum capere nouationes temptat aut manu addenda noua.'; -$lang['error_copy'] = 'Exemplar malum in scrinio addendorum %s est: facultates documenti scrinique fortasse illegitimae sunt. Hic accidit cum addenda partim nouata sunt.'; -$lang['error_delete'] = 'Addenda %s non delentur.'; -$lang['enabled'] = 'Addenda %s apta facta.'; -$lang['notenabled'] = 'Addenda %s quae apta fieri non possunt.'; -$lang['disabled'] = 'Addenda %s non in usu.'; -$lang['notdisabled'] = 'Addenda %s quae inepta fieri non possunt.'; diff --git a/sources/lib/plugins/plugin/lang/lb/admin_plugin.txt b/sources/lib/plugins/plugin/lang/lb/admin_plugin.txt deleted file mode 100644 index 223de10..0000000 --- a/sources/lib/plugins/plugin/lang/lb/admin_plugin.txt +++ /dev/null @@ -1,4 +0,0 @@ -====== Plugin Management ====== - -Op dëser Säit kanns de alles verwalte wat mat Dokuwiki [[doku>plugins|Pluginen]] ze dinn huet. Fir e Plugin kënnen z'installéieren, muss däi Pluginverzeechnës vum Webserver schreiwbar sinn. - diff --git a/sources/lib/plugins/plugin/lang/lb/lang.php b/sources/lib/plugins/plugin/lang/lb/lang.php deleted file mode 100644 index 59acdf7..0000000 --- a/sources/lib/plugins/plugin/lang/lb/lang.php +++ /dev/null @@ -1,6 +0,0 @@ -plugins|plugins]]. Tam kad parsiųsti ir įdiegti kokį nors priedą jūsų web serveris privalo turėti įrašymo teises priedų kataloge. diff --git a/sources/lib/plugins/plugin/lang/lt/lang.php b/sources/lib/plugins/plugin/lang/lt/lang.php deleted file mode 100644 index c5b2fa1..0000000 --- a/sources/lib/plugins/plugin/lang/lt/lang.php +++ /dev/null @@ -1,13 +0,0 @@ - - */ -$lang['name'] = 'Vardas:'; -$lang['date'] = 'Data:'; -$lang['type'] = 'Tipas:'; -$lang['desc'] = 'Aprašas:'; -$lang['author'] = 'Autorius:'; -$lang['www'] = 'Tinklapis:'; diff --git a/sources/lib/plugins/plugin/lang/lv/admin_plugin.txt b/sources/lib/plugins/plugin/lang/lv/admin_plugin.txt deleted file mode 100644 index 8033506..0000000 --- a/sources/lib/plugins/plugin/lang/lv/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Moduļu pārvaldīšana ====== - -Šajā lapā varat pārvaldīt visu, kas saistīts ar Dokuwiki [[doku>plugins|moduļiem]]. Lai varētu lejupielādēt un uzstādīt moduļus, to direktorijai serverī vajag rakstīšanas tiesības. diff --git a/sources/lib/plugins/plugin/lang/lv/lang.php b/sources/lib/plugins/plugin/lang/lv/lang.php deleted file mode 100644 index 9a87278..0000000 --- a/sources/lib/plugins/plugin/lang/lv/lang.php +++ /dev/null @@ -1,51 +0,0 @@ - - */ -$lang['menu'] = 'Moduļu pārvaldība'; -$lang['download'] = 'Lejupielādēt un instalēt jaunu moduli.'; -$lang['manage'] = 'Instalētie moduļi'; -$lang['btn_info'] = 'uzziņa'; -$lang['btn_update'] = 'atjaunināt'; -$lang['btn_delete'] = 'dzēst'; -$lang['btn_settings'] = 'parametri'; -$lang['btn_download'] = 'Lejupielādēt'; -$lang['btn_enable'] = 'Saglabāt'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Instalēts:'; -$lang['lastupdate'] = 'Atjaunināts:'; -$lang['source'] = 'Avots:'; -$lang['unknown'] = 'nav zināms'; -$lang['updating'] = 'Atjauninu...'; -$lang['updated'] = 'Modulis %s veiksmīgi atjaunināts'; -$lang['updates'] = 'Veiksmīgi atjaunināti moduļi:'; -$lang['update_none'] = 'Jauninājums nav atrasts'; -$lang['deleting'] = 'Dzēšu...'; -$lang['deleted'] = 'Modulis %s dzēsts'; -$lang['downloading'] = 'Lejupielādēju...'; -$lang['downloaded'] = 'Modulis %s veiksmīgi instalēts'; -$lang['downloads'] = 'Veiksmīgi instalēti moduļi: '; -$lang['download_none'] = 'Neviens modulis nav atrasts vai arī gadījusies nezinām kļūme lejupielādes un instalācijas gaitā.'; -$lang['plugin'] = 'Modulis:'; -$lang['components'] = 'Sastāvdaļas'; -$lang['noinfo'] = 'Modulis nesniedz informāciju, tas varbūt ir bojāts.'; -$lang['name'] = 'Nosaukums:'; -$lang['date'] = 'Datums:'; -$lang['type'] = 'Tips:'; -$lang['desc'] = 'Apraksts:'; -$lang['author'] = 'Autors:'; -$lang['www'] = 'Mājaslapa:'; -$lang['error'] = 'Gadījās nezināma kļūme.'; -$lang['error_download'] = 'Nevar lejupielādēt moduļa failu %s'; -$lang['error_badurl'] = 'Aizdomas par aplamu URL - jo no tā nevar noteikt faila vārdu.'; -$lang['error_dircreate'] = 'Nevar izveidot pagaidu direktoriju, kur saglabāt lejupielādēto. '; -$lang['error_decompress'] = 'Moduļu pārvaldnieks nevar atspiest lejupielādēto failu. Vai nu neizdevusi es lejupielāde, mēģiniet atkārtot, vai arī nezinām arhīva formāts un tad modulis jāielādē un jāinstalē tev pašam.'; -$lang['error_copy'] = 'Faila kopēšanas kļūda instalējot moduli%s: disks pārpildīts vai aplamas piekļuves tiesības. Rezultātā var iegūt daļēji instalētu moduli un nestabilu Wiki sistēmu.'; -$lang['error_delete'] = 'Kļūme dzēšot moduli %s. Ticamākais iemesls ir direktorijas pieejas tiesību trūkums. '; -$lang['enabled'] = 'Modulis %s pieslēgts.'; -$lang['notenabled'] = 'Moduli %s nevar pieslēgt, pārbaudi failu tiesības.'; -$lang['disabled'] = 'Modulis %s atslēgts.'; -$lang['notdisabled'] = 'Moduli %s nevar atslēgt, pārbaudi failu tiesības.'; -$lang['packageinstalled'] = 'Moduļu paka (pavisam kopā %d: %s) veiksmīgi uzstādīti.'; diff --git a/sources/lib/plugins/plugin/lang/mk/lang.php b/sources/lib/plugins/plugin/lang/mk/lang.php deleted file mode 100644 index 747d616..0000000 --- a/sources/lib/plugins/plugin/lang/mk/lang.php +++ /dev/null @@ -1,43 +0,0 @@ - - */ -$lang['menu'] = 'Уреди ги приклучоците'; -$lang['download'] = 'Симни и инсталирај нов приклучок'; -$lang['manage'] = 'Инсталирани приклучоци'; -$lang['btn_info'] = 'информации'; -$lang['btn_update'] = 'ажурирај'; -$lang['btn_delete'] = 'избриши'; -$lang['btn_settings'] = 'поставувања'; -$lang['btn_download'] = 'Симни'; -$lang['btn_enable'] = 'Зачувај'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Инсталирани:'; -$lang['lastupdate'] = 'Последно ажурирани:'; -$lang['source'] = 'Извор:'; -$lang['unknown'] = 'непознат'; -$lang['updating'] = 'Ажурирам...'; -$lang['updated'] = 'Приклучокот %s е успешно ажуриран'; -$lang['updates'] = 'Следниве приклучоци се успешно ажурирани'; -$lang['update_none'] = 'Нема потребни ажурирања.'; -$lang['deleting'] = 'Бришам...'; -$lang['deleted'] = 'Приклучокот %s е избришан.'; -$lang['downloading'] = 'Симнувам...'; -$lang['downloaded'] = 'Приклучокот %s е успешно инсталиран'; -$lang['downloads'] = 'Следниве приклучоци се успешно инсталирани'; -$lang['download_none'] = 'Нема пронајдени приклучоци, или имаше непознат проблем при симнување и инсталирање.'; -$lang['plugin'] = 'Приклучок:'; -$lang['components'] = 'Компоненти'; -$lang['noinfo'] = 'Овој приклучок не врати информации, може да не е валиден.'; -$lang['name'] = 'Име:'; -$lang['date'] = 'Датум:'; -$lang['type'] = 'Тип:'; -$lang['desc'] = 'Опис:'; -$lang['author'] = 'Автор:'; -$lang['www'] = 'Веб:'; -$lang['error'] = 'Се појави непозната грешка.'; -$lang['error_download'] = 'Не сум во можност да ја симнам датотеката за приклучокот: %s'; -$lang['enabled'] = 'Приклучокот %s е овозможен.'; -$lang['disabled'] = 'Приклучокот %s е оневозможен.'; diff --git a/sources/lib/plugins/plugin/lang/mr/admin_plugin.txt b/sources/lib/plugins/plugin/lang/mr/admin_plugin.txt deleted file mode 100644 index a925a56..0000000 --- a/sources/lib/plugins/plugin/lang/mr/admin_plugin.txt +++ /dev/null @@ -1,4 +0,0 @@ -====== प्लगिन व्यवस्थापन ====== - -या पानावर तुम्ही डॉक्युविकि [[doku>plugins|प्लगिन]] च्या सर्व बाबींची व्यवस्था लावू शकता. -प्लगिन डाउनलोड व इन्स्टॉल करण्यासाठी तुमच्या प्लगिन फोल्डरवर तुमच्या वेबसर्वरला लेखनाची परवानगी असली पाहिजे. \ No newline at end of file diff --git a/sources/lib/plugins/plugin/lang/mr/lang.php b/sources/lib/plugins/plugin/lang/mr/lang.php deleted file mode 100644 index 3f81739..0000000 --- a/sources/lib/plugins/plugin/lang/mr/lang.php +++ /dev/null @@ -1,53 +0,0 @@ - - * @author Padmanabh Kulkarni - * @author shantanoo@gmail.com - */ -$lang['menu'] = 'प्लगिनची व्यवस्था लावा'; -$lang['download'] = 'नवीन प्लगिन डाउनलोड करून इन्स्टॉल करा'; -$lang['manage'] = 'इन्स्टॉल केलेले प्लगिन'; -$lang['btn_info'] = 'माहिती'; -$lang['btn_update'] = 'अद्ययावत'; -$lang['btn_delete'] = 'डिलीट'; -$lang['btn_settings'] = 'सेटिंग'; -$lang['btn_download'] = 'डाउनलोड'; -$lang['btn_enable'] = 'सुरक्षित'; -$lang['url'] = 'URL'; -$lang['installed'] = 'इन्स्टॉलची वेळ :'; -$lang['lastupdate'] = 'शेवटच्या बदलाची वेळ :'; -$lang['source'] = 'स्त्रोत :'; -$lang['unknown'] = 'अगम्य'; -$lang['updating'] = 'अद्ययावत करतोय ...'; -$lang['updated'] = 'प्लगिन %s यशास्विरित्य अद्ययावत केला.'; -$lang['updates'] = 'खालील प्लगिन यशस्वीरीत्या अद्ययावत झाले'; -$lang['update_none'] = 'काही बदल मिळाले नाहीत.'; -$lang['deleting'] = 'डिलीट करतोय ...'; -$lang['deleted'] = '%s प्लगिन डिलीट केला.'; -$lang['downloading'] = 'डाउनलोड करतोय ...'; -$lang['downloaded'] = '%s प्लगिन यशस्वीरीत्या इन्स्टॉल झाला.'; -$lang['downloads'] = 'खालील प्लगिन यशस्वीरीत्या इन्स्टॉल झाले : '; -$lang['download_none'] = 'एकही प्लगिन मिळाला नाही, किंवा डाउनलोड आणि इन्स्टॉल मधे काही अज्ञात अडचण आली असावी.'; -$lang['plugin'] = 'प्लगिन : '; -$lang['components'] = 'भाग : '; -$lang['noinfo'] = 'या प्लगिनने काही माहिती दिली नाही. बहुधा हा अवैध असावा.'; -$lang['name'] = 'नाव :'; -$lang['date'] = 'दिनांक :'; -$lang['type'] = 'टाइप : '; -$lang['desc'] = 'वर्णन : '; -$lang['author'] = 'लेखक : '; -$lang['www'] = 'वेब : '; -$lang['error'] = 'अज्ञात अडचण आली.'; -$lang['error_download'] = 'डाउनलोड न झालेली प्लगिन फाइल : %s'; -$lang['error_badurl'] = 'बहुधा चुकीचे URL - URL वरून फाइलचे नाव ठरवता आले नाही.'; -$lang['error_dircreate'] = 'डाउनलोड साठवण्यासाठी तात्पुरता फोल्डर तयार करू शकलो नाही'; -$lang['error_decompress'] = 'प्लगिन व्यवस्थापक डाउनलोड केलेली फाइल विस्तारित करू शकला नाही. हे कदाचित डाउनलोड नीट न झाल्यामुळे असावं; असे असल्यास तुमची परत डाउनलोड करण्याचा प्रयत्न करू शकता; किंवा प्लगिन संक्षिप्त करण्यास वापरलेली पद्धत अनाकलनीय आहे; तसे असल्यास तुम्हाला स्वतः प्लगिन डाउनलोड व इन्स्टॉल करावा लागेल.'; -$lang['error_copy'] = '%s प्लगिनसाठी फाइल इन्स्टॉल करताना फाइल कॉपी करू शकलो नाही : डिस्क भरली असेल किंवा फाइल वरील परवानग्या बरोबर नसतील. यामुळे प्लगिन अर्धवट इन्स्टॉल जाला असण्याची व त्यामुळे तुमची विकी ख़राब होण्याची शक्यता आहे.'; -$lang['error_delete'] = '%s प्लगिन डिलीट करताना काही चूक झाली आहे. फाइल किंवा डिरेक्टरी वरील परवानग्या बरोबर नसणे हे याचं मुख्य कारण असू शकतं.'; -$lang['enabled'] = '%s प्लगइन चालू केला.'; -$lang['notenabled'] = '%s प्लगइन चालू करू शकलो नाही, फाइलच्या परवानग्या तपासा.'; -$lang['disabled'] = '%s प्लगइन बंद केला.'; -$lang['notdisabled'] = '%s प्लगइन बंद करू शकलो नाही, फाइलच्या परवानग्या तपासा.'; diff --git a/sources/lib/plugins/plugin/lang/ms/lang.php b/sources/lib/plugins/plugin/lang/ms/lang.php deleted file mode 100644 index 77ad2a1..0000000 --- a/sources/lib/plugins/plugin/lang/ms/lang.php +++ /dev/null @@ -1,6 +0,0 @@ - - * @author SarojKumar Dhakal - * @author Saroj Dhakal - */ -$lang['menu'] = 'प्लगिन व्यवस्थापन गर्नुहोस।'; -$lang['download'] = 'नयाँ प्लगिन डाउनलोड गरी स्थापना गर्नुहोस्'; -$lang['manage'] = 'स्थापित प्लगिनहरु'; -$lang['btn_info'] = 'जानकारी'; -$lang['btn_update'] = 'अध्यावधिक गर्नुहोस'; -$lang['btn_delete'] = 'मेटाउनुहोस्'; -$lang['btn_settings'] = 'व्यवस्थापन'; -$lang['btn_download'] = 'डाउनलोड गर्नुहोस्'; -$lang['btn_enable'] = 'वचत गर्नुहोस्'; -$lang['url'] = 'URL'; -$lang['installed'] = 'स्थापित'; -$lang['lastupdate'] = 'अन्तिम अध्यावधिक :'; -$lang['source'] = 'स्रोत:'; -$lang['unknown'] = 'थाह नभएको'; -$lang['updating'] = 'अध्यावधिक गर्दै......'; -$lang['updated'] = 'प्लगिन %s सफलतापूर्वक अध्यावधिक भयो '; -$lang['updates'] = 'निम्न प्लगिनहरु सफलतापूर्वक अध्यावधिक भए।'; -$lang['update_none'] = 'कुनै पनि अध्यावधिकम भेटिएन ।'; -$lang['deleting'] = 'हटाउदै ......'; -$lang['deleted'] = 'प्लगिन %s हटाइयो ।'; -$lang['downloading'] = 'डाउनलोड गर्दै ........'; -$lang['downloaded'] = 'प्लगिन %s सफलतापूर्वक स्थापित भयो '; -$lang['downloads'] = 'निम्न प्लगिनहरु सफलतापूर्वक स्थापित भए'; -$lang['download_none'] = 'कुनै पनि प्लगइन भेटिएन, या डाउनलोड गर्दा र स्थापना गर्दा त्रुटि भयो ।'; -$lang['plugin'] = 'प्लगिन:'; -$lang['components'] = 'पुर्जाहरु '; -$lang['noinfo'] = 'यो प्लगइनले कुनै पनि जनाकारी दिएन , यो अमान्य हुनसक्छ ।'; -$lang['name'] = 'नाम:'; -$lang['date'] = 'मिति:'; -$lang['type'] = 'प्रकार :'; -$lang['desc'] = 'जानकारी:'; -$lang['author'] = 'जारीकर्ता:'; -$lang['www'] = 'वेब:'; -$lang['error'] = 'अज्ञात त्रुटि फेला पर्‌यो ।'; -$lang['error_download'] = 'प्लहइन फाइल: %s डाउनलोड गर्न असमर्थ ।'; -$lang['error_badurl'] = 'शंकास्पद खराब url - Url बाट फाइल नाम निश्चित गर्न असमर्थ ।'; -$lang['error_dircreate'] = 'डाउनलोड प्राप्त गर्नको निमि्त्त अस्थाइ फोल्डर निर्माण गर्न असमर्थ ।'; diff --git a/sources/lib/plugins/plugin/lang/nl/admin_plugin.txt b/sources/lib/plugins/plugin/lang/nl/admin_plugin.txt deleted file mode 100644 index 36731b0..0000000 --- a/sources/lib/plugins/plugin/lang/nl/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -===== Pluginmanager ===== - -Op deze pagina kunt u alle DokuWiki [[doku>plugins|plugins]] beheren. Om plugins te kunnen downloaden en installeren, moet de plugin-directory schrijfbaar zijn voor de webserver. \ No newline at end of file diff --git a/sources/lib/plugins/plugin/lang/nl/lang.php b/sources/lib/plugins/plugin/lang/nl/lang.php deleted file mode 100644 index 2836c70..0000000 --- a/sources/lib/plugins/plugin/lang/nl/lang.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @author John de Graaff - * @author Niels Schoot - * @author Dion Nicolaas - * @author Danny Rotsaert - * @author Marijn Hofstra hofstra.m@gmail.com - * @author Matthias Carchon webmaster@c-mattic.be - * @author Marijn Hofstra - * @author Timon Van Overveldt - * @author Jeroen - * @author Ricardo Guijt - * @author Gerrit - * @author Remon - */ -$lang['menu'] = 'Plugins beheren'; -$lang['download'] = 'Download en installeer een nieuwe plugin'; -$lang['manage'] = 'Geïnstalleerde plugins'; -$lang['btn_info'] = 'informatie'; -$lang['btn_update'] = 'bijwerken'; -$lang['btn_delete'] = 'verwijderen'; -$lang['btn_settings'] = 'instellingen'; -$lang['btn_download'] = 'Download'; -$lang['btn_enable'] = 'Opslaan'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Geïnstalleerd:'; -$lang['lastupdate'] = 'Laatst bijgewerkt:'; -$lang['source'] = 'Bron:'; -$lang['unknown'] = 'onbekend'; -$lang['updating'] = 'Bijwerken ...'; -$lang['updated'] = 'Plugin %s succesvol bijgewerkt'; -$lang['updates'] = 'De volgende plugins zijn succesvol bijgewerkt'; -$lang['update_none'] = 'Geen updates gevonden.'; -$lang['deleting'] = 'Verwijderen ...'; -$lang['deleted'] = 'Plugin %s verwijderd.'; -$lang['downloading'] = 'Bezig met downloaden ...'; -$lang['downloaded'] = 'Plugin %s succesvol geïnstalleerd'; -$lang['downloads'] = 'De volgende plugins zijn succesvol geïnstalleerd:'; -$lang['download_none'] = 'Geen plugins gevonden, of er is een onbekende fout opgetreden tijdens het downloaden en installeren.'; -$lang['plugin'] = 'Plugin:'; -$lang['components'] = 'Onderdelen'; -$lang['noinfo'] = 'Deze plugin gaf geen informatie terug, misschien is hij defect.'; -$lang['name'] = 'Naam:'; -$lang['date'] = 'Datum:'; -$lang['type'] = 'Type:'; -$lang['desc'] = 'Omschrijving:'; -$lang['author'] = 'Auteur:'; -$lang['www'] = 'Weblocatie:'; -$lang['error'] = 'Er is een onbekende fout opgetreden.'; -$lang['error_download'] = 'Kan het volgende plugin bestand niet downloaden: %s'; -$lang['error_badurl'] = 'Vermoedelijk onjuiste url - kan de bestandsnaam niet uit de url afleiden'; -$lang['error_dircreate'] = 'Kan geen tijdelijke directory aanmaken voor de download'; -$lang['error_decompress'] = 'De pluginmanager kan het gedownloade bestand niet uitpakken. Dit kan het resultaat zijn van een mislukte download: probeer het opnieuw; of het compressieformaat is onbekend: in dat geval moet je de plugin handmatig downloaden en installeren.'; -$lang['error_copy'] = 'Er was een probleem met het kopiëren van een bestand tijdens de installatie van plugin %s: de schijf kan vol zijn of onjuiste toegangsrechten hebben. Dit kan tot gevolg hebben dat de plugin slechts gedeeltelijk geïnstalleerd is en kan de wiki onstabiel maken.'; -$lang['error_delete'] = 'Er is een probleem opgetreden tijdens het verwijderen van plugin %s. De meest voorkomende oorzaak is onjuiste toegangsrechten op bestanden of directory\'s.'; -$lang['enabled'] = 'Plugin %s ingeschakeld.'; -$lang['notenabled'] = 'Plugin %s kon niet worden ingeschakeld, controleer bestandsrechten.'; -$lang['disabled'] = 'Plugin %s uitgeschakeld.'; -$lang['notdisabled'] = 'Plugin %s kon niet worden uitgeschakeld, controleer bestandsrechten.'; -$lang['packageinstalled'] = 'Plugin package (%d plugin(s): %s) succesvol geïnstalleerd.'; diff --git a/sources/lib/plugins/plugin/lang/no/admin_plugin.txt b/sources/lib/plugins/plugin/lang/no/admin_plugin.txt deleted file mode 100644 index 1765b67..0000000 --- a/sources/lib/plugins/plugin/lang/no/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Behandle programtillegg ====== - -På denne siden kan du behandle alt som har å gjøre med DokuWikis [[doku>plugins|tillegg]]. For å kunne laste ned og installere et tillegg må webserveren ha skrivetilgang til mappen for tillegg. diff --git a/sources/lib/plugins/plugin/lang/no/lang.php b/sources/lib/plugins/plugin/lang/no/lang.php deleted file mode 100644 index 2b890f9..0000000 --- a/sources/lib/plugins/plugin/lang/no/lang.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @author Arild Burud - * @author Torkill Bruland - * @author Rune M. Andersen - * @author Jakob Vad Nielsen (me@jakobnielsen.net) - * @author Kjell Tore Næsgaard - * @author Knut Staring - * @author Lisa Ditlefsen - * @author Erik Pedersen - * @author Erik Bjørn Pedersen - * @author Rune Rasmussen syntaxerror.no@gmail.com - * @author Jon Bøe - * @author Egil Hansen - */ -$lang['menu'] = 'Behandle programtillegg'; -$lang['download'] = 'Last ned og installer et programtillegg'; -$lang['manage'] = 'Installerte programtillegg'; -$lang['btn_info'] = 'informasjon'; -$lang['btn_update'] = 'oppdater'; -$lang['btn_delete'] = 'slett'; -$lang['btn_settings'] = 'innstillinger'; -$lang['btn_download'] = 'Last ned'; -$lang['btn_enable'] = 'Lagre'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Installert:'; -$lang['lastupdate'] = 'Sist oppdatert:'; -$lang['source'] = 'Kilde:'; -$lang['unknown'] = 'ukjent'; -$lang['updating'] = 'Oppdaterer ...'; -$lang['updated'] = 'Tillegget %s er oppdatert'; -$lang['updates'] = 'Følgende programtillegg har blitt oppdatert'; -$lang['update_none'] = 'Ingen oppdateringer funnet.'; -$lang['deleting'] = 'Sletter ...'; -$lang['deleted'] = 'Tillegget %s ble slettet.'; -$lang['downloading'] = 'Laster ned ...'; -$lang['downloaded'] = 'Tillegget %s ble installert'; -$lang['downloads'] = 'De følgende tilleggene ble installert'; -$lang['download_none'] = 'Ingen tillegg funnet, eller det har vært et ukjent problem under nedlasting og installering.'; -$lang['plugin'] = 'Tillegg:'; -$lang['components'] = 'Komponenter'; -$lang['noinfo'] = 'Tillegget ga ikke noe informasjon. Det kan være ugyldig.'; -$lang['name'] = 'Navn:'; -$lang['date'] = 'Dato:'; -$lang['type'] = 'Type:'; -$lang['desc'] = 'Beskrivelse:'; -$lang['author'] = 'Forfatter:'; -$lang['www'] = 'Nett:'; -$lang['error'] = 'En ukjent feil oppstod.'; -$lang['error_download'] = 'Klarte ikke å laste ned tillegget i filen: %s'; -$lang['error_badurl'] = 'Mistenker feil URL - klarte ikke å finne filnavnet i URLen'; -$lang['error_dircreate'] = 'Klarte ikke å lage en midlertidig mappe for å laste ned'; -$lang['error_decompress'] = 'Tilleggsbehandleren klarte ikke å dekomprimere den nedlastede filen. Dette kan være på grunn av en feilet nedlasting, i så fall bør du prøve igjen, eller kompresjonsformatet kan være ukjent, i så fall må du laste ned og installere tillegget manuelt.'; -$lang['error_copy'] = 'Det skjedde en feil ved kopiering av en fil under installasjonen av %s: disken kan være full eller rettighetene satt feil. Dette kan ha ført til et delvist installert tillegg og gjort wikien ubrukelig.'; -$lang['error_delete'] = 'Det skjedde en feil under forsøket på å slette tillegget %s. Den mest sannsynlige grunnen er utilstrekkelige rettigheter for filene eller mappene.'; -$lang['enabled'] = 'Tillegget %s aktivert'; -$lang['notenabled'] = 'Plugin %s kunne ikke aktiveres, sjekk filrettighetene.'; -$lang['disabled'] = 'Plugin %s deaktivert'; -$lang['notdisabled'] = 'Plugin %s kunne ikke deaktiveres, sjekk filrettighetene.'; -$lang['packageinstalled'] = 'Installasjonen av tilleggspakka (%d tillegg: %s) var vellykka'; diff --git a/sources/lib/plugins/plugin/lang/pl/admin_plugin.txt b/sources/lib/plugins/plugin/lang/pl/admin_plugin.txt deleted file mode 100644 index f010481..0000000 --- a/sources/lib/plugins/plugin/lang/pl/admin_plugin.txt +++ /dev/null @@ -1,5 +0,0 @@ -====== Menadżer wtyczek ====== - -Na tej stronie możesz zarządzać wszystkim co jest związane z [[doku>plugins|wtyczkami]] Dokuwiki. Aby móc ściągnąć i zainstalować wtyczkę, serwer WWW musi mieć prawo do zapisu w katalogu ''plugins''. - - diff --git a/sources/lib/plugins/plugin/lang/pl/lang.php b/sources/lib/plugins/plugin/lang/pl/lang.php deleted file mode 100644 index eae91f3..0000000 --- a/sources/lib/plugins/plugin/lang/pl/lang.php +++ /dev/null @@ -1,63 +0,0 @@ - - * @author Grzegorz Żur - * @author Mariusz Kujawski - * @author Maciej Kurczewski - * @author Sławomir Boczek - * @author sleshek@wp.pl - * @author Leszek Stachowski - * @author maros - * @author Grzegorz Widła - * @author Łukasz Chmaj - * @author Begina Felicysym - * @author Aoi Karasu - */ -$lang['menu'] = 'Menadżer wtyczek'; -$lang['download'] = 'Ściągnij i zainstaluj nową wtyczkę'; -$lang['manage'] = 'Zainstalowane Wtyczki'; -$lang['btn_info'] = 'Informacje'; -$lang['btn_update'] = 'Aktualizuj'; -$lang['btn_delete'] = 'Usuń'; -$lang['btn_settings'] = 'Ustawienia'; -$lang['btn_download'] = 'Pobierz'; -$lang['btn_enable'] = 'Zapisz'; -$lang['url'] = 'Adres URL'; -$lang['installed'] = 'Instalacja:'; -$lang['lastupdate'] = 'Ostatnio zaktualizowana:'; -$lang['source'] = 'Źródło:'; -$lang['unknown'] = 'nieznane'; -$lang['updating'] = 'Aktualizuję...'; -$lang['updated'] = 'Aktualizacja wtyczki %s pomyślnie ściągnięta'; -$lang['updates'] = 'Aktualizacje następujących wtyczek zostały pomyślnie ściągnięte'; -$lang['update_none'] = 'Nie znaleziono aktualizacji.'; -$lang['deleting'] = 'Usuwam...'; -$lang['deleted'] = 'Wtyczka %s usunięta.'; -$lang['downloading'] = 'Pobieram...'; -$lang['downloaded'] = 'Wtyczka %s pomyślnie zainstalowana'; -$lang['downloads'] = 'Następujące wtyczki zostały pomyślnie zainstalowane:'; -$lang['download_none'] = 'Nie znaleziono wtyczek lub wystąpił nieznany problem podczas ściągania i instalacji.'; -$lang['plugin'] = 'Wtyczka:'; -$lang['components'] = 'Składniki'; -$lang['noinfo'] = 'Ta wtyczka nie zwróciła żadnych informacji, może być niepoprawna.'; -$lang['name'] = 'Nazwa:'; -$lang['date'] = 'Data:'; -$lang['type'] = 'Typ:'; -$lang['desc'] = 'Opis:'; -$lang['author'] = 'Autor:'; -$lang['www'] = 'WWW:'; -$lang['error'] = 'Wystąpił nieznany błąd.'; -$lang['error_download'] = 'Nie powiodło się ściągnięcie pliku wtyczki: %s'; -$lang['error_badurl'] = 'Prawdopodobnie zły url - nie da się ustalić nazwy pliku na podstawie urla'; -$lang['error_dircreate'] = 'Nie powiodło się stworzenie tymczasowego katalogu na pobrane pliki'; -$lang['error_decompress'] = 'Menadżer wtyczek nie był w stanie rozpakować ściągniętego pliku. Może to być spowodowane przez nieudany transfer (w takim przypadku powinieneś spróbować ponownie) lub nieznany format kompresji (w takim przypadku będziesz musiał ściągnąć i zainstalować wtyczkę ręcznie).'; -$lang['error_copy'] = 'Wystąpił błąd podczas kopiowania pliku w trakcie instalacji wtyczki %s: być może dysk jest pełny lub prawa dostępu są niepoprawne. Efektem może być częściowo zainstalowana wtyczka co może spowodować niestabilność Twojej instalacji wiki.'; -$lang['error_delete'] = 'Wystąpił błąd przy próbie usunięcia wtyczki %s. Prawdopodobną przyczyną są niewystarczające uprawnienia do katalogu.'; -$lang['enabled'] = 'Wtyczka %s włączona.'; -$lang['notenabled'] = 'Nie udało się uruchomić wtyczki %s, sprawdź uprawnienia dostępu do plików.'; -$lang['disabled'] = 'Wtyczka %s wyłączona.'; -$lang['notdisabled'] = 'Nie udało się wyłączyć wtyczki %s, sprawdź uprawnienia dostępu do plików.'; -$lang['packageinstalled'] = 'Pakiet wtyczek (%d wtyczki: %s) zainstalowany pomyślnie.'; diff --git a/sources/lib/plugins/plugin/lang/pt-br/admin_plugin.txt b/sources/lib/plugins/plugin/lang/pt-br/admin_plugin.txt deleted file mode 100644 index 9e49f51..0000000 --- a/sources/lib/plugins/plugin/lang/pt-br/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Gerenciamento de Plug-ins ====== - -Nesta página você pode gerenciar tudo relacionado aos [[doku>plugins|plug-ins]] do DokuWiki. Para você baixar e instalar um plug-in o servidor web deve ter permissão de escrita na pasta onde ficam os plug-ins. diff --git a/sources/lib/plugins/plugin/lang/pt-br/lang.php b/sources/lib/plugins/plugin/lang/pt-br/lang.php deleted file mode 100644 index c025188..0000000 --- a/sources/lib/plugins/plugin/lang/pt-br/lang.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @author Felipe Castro - * @author Lucien Raven - * @author Enrico Nicoletto - * @author Flávio Veras - * @author Jeferson Propheta - * @author jair.henrique@gmail.com - * @author Luis Dantas - * @author Frederico Guimarães - * @author Jair Henrique - * @author Luis Dantas - * @author Sergio Motta sergio@cisne.com.br - * @author Isaias Masiero Filho - * @author Balaco Baco - * @author Victor Westmann - */ -$lang['menu'] = 'Gerenciar Plug-ins'; -$lang['download'] = 'Baixar e instalar um novo plug-in'; -$lang['manage'] = 'Plug-ins instalados'; -$lang['btn_info'] = 'informações'; -$lang['btn_update'] = 'atualizar'; -$lang['btn_delete'] = 'excluir'; -$lang['btn_settings'] = 'configurações'; -$lang['btn_download'] = 'Baixar'; -$lang['btn_enable'] = 'Salvar'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Instalação:'; -$lang['lastupdate'] = 'Última atualização:'; -$lang['source'] = 'Fonte:'; -$lang['unknown'] = 'desconhecida'; -$lang['updating'] = 'Atualizando...'; -$lang['updated'] = 'O plug-in %s foi atualizado com sucesso'; -$lang['updates'] = 'Os seguintes plug-ins foram atualizados com sucesso'; -$lang['update_none'] = 'Não foi encontrada nenhuma atualização.'; -$lang['deleting'] = 'Excluindo...'; -$lang['deleted'] = 'O plug-in %s foi excluído.'; -$lang['downloading'] = 'Baixando...'; -$lang['downloaded'] = 'O plug-in %s foi instalado com sucesso'; -$lang['downloads'] = 'Os seguintes plug-ins foram instalados com sucesso:'; -$lang['download_none'] = 'O plug-in não foi encontrado ou então ocorreu um problema desconhecido durante a transferência e instalação.'; -$lang['plugin'] = 'Plug-in:'; -$lang['components'] = 'Componentes'; -$lang['noinfo'] = 'Esse plug-in não retornou nenhuma informação. Ele pode ser inválido.'; -$lang['name'] = 'Nome:'; -$lang['date'] = 'Data:'; -$lang['type'] = 'Tipo:'; -$lang['desc'] = 'Descrição:'; -$lang['author'] = 'Autor:'; -$lang['www'] = 'Web:'; -$lang['error'] = 'Ocorreu um erro desconhecido.'; -$lang['error_download'] = 'Não foi possível baixar o arquivo de plug-in: %s'; -$lang['error_badurl'] = 'Suspeita de URL mal formatada - não foi possível determinar o nome do arquivo a partir da URL'; -$lang['error_dircreate'] = 'Não foi possível criar a pasta temporária para receber a transferência'; -$lang['error_decompress'] = 'O gerenciador de plug-ins não conseguiu descompactar o arquivo transferido. Isso pode ser resultado de: uma corrupção do arquivo durante a transferência, nesse caso, você deve tentar novamente; ou o formato da compactação pode ser desconhecido, nesse caso você deve transferir e instalar o plug-in manualmente.'; -$lang['error_copy'] = 'Ocorreu um erro de cópia de arquivo na tentativa de instalar o plug-in %s: o disco pode estar cheio ou as permissões de acesso ao arquivo podem estar erradas. Isso pode resultar em um plug-in parcialmente instalado e tornar o seu wiki instável.'; -$lang['error_delete'] = 'Ocorreu um erro na tentativa de excluir o plug-in %s. A causa mais provável é a permissão de acesso insuficiente ao diretório ou ao arquivo.'; -$lang['enabled'] = 'O plug-in %s foi habilitado.'; -$lang['notenabled'] = 'Não foi possível habilitar o plug-in %s. Verifique as permissões de acesso.'; -$lang['disabled'] = 'O plug-in %s foi desabilitado.'; -$lang['notdisabled'] = 'Não foi possível desabilitar o plug-in %s. Verifique as permissões de acesso.'; -$lang['packageinstalled'] = 'O pacote do plugin (%d plugin(s): %s) foi instalado com sucesso.'; diff --git a/sources/lib/plugins/plugin/lang/pt/admin_plugin.txt b/sources/lib/plugins/plugin/lang/pt/admin_plugin.txt deleted file mode 100644 index 2cc4701..0000000 --- a/sources/lib/plugins/plugin/lang/pt/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Gestor de Plugins ====== - -Nesta página pode gerir tudo o que tenha a haver com [[doku>plugins|plugins]] DokuWiki. Atenção que a pasta que contém os plugins precisa de ter permissões de escrita para se poder efectuar o download. \ No newline at end of file diff --git a/sources/lib/plugins/plugin/lang/pt/lang.php b/sources/lib/plugins/plugin/lang/pt/lang.php deleted file mode 100644 index aa6b2e2..0000000 --- a/sources/lib/plugins/plugin/lang/pt/lang.php +++ /dev/null @@ -1,56 +0,0 @@ - - * @author Enrico Nicoletto - * @author Fil - * @author André Neves - * @author José Campos zecarlosdecampos@gmail.com - */ -$lang['menu'] = 'Gerir Plugins'; -$lang['download'] = 'Descarregar e instalar um novo plugin'; -$lang['manage'] = 'Plugins Instalados'; -$lang['btn_info'] = 'info'; -$lang['btn_update'] = 'actualizar'; -$lang['btn_delete'] = 'remover'; -$lang['btn_settings'] = 'configurações'; -$lang['btn_download'] = 'Descarregar'; -$lang['btn_enable'] = 'Guardar'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Instalado em:'; -$lang['lastupdate'] = 'Actualizado em:'; -$lang['source'] = 'Fonte:'; -$lang['unknown'] = 'desconhecida'; -$lang['updating'] = 'Actualizando ...'; -$lang['updated'] = 'Plugin %s actualizado com sucesso.'; -$lang['updates'] = 'Os seguintes plguins foram actualizados com sucesso:'; -$lang['update_none'] = 'Não foram encontradas actualizações.'; -$lang['deleting'] = 'Removendo ...'; -$lang['deleted'] = 'Plugin %s removido.'; -$lang['downloading'] = 'Descarregando ...'; -$lang['downloaded'] = 'Plugin %s instalado com sucesso.'; -$lang['downloads'] = 'Os seguintes plguins foram instalados com sucesso:'; -$lang['download_none'] = 'Nenhum plugin encontrado ou ocorreu um problema ao descarregar ou instalar.'; -$lang['plugin'] = 'Plugin:'; -$lang['components'] = 'Componentes'; -$lang['noinfo'] = 'Este plugin não retornou qualquer informação, pode estar inválido.'; -$lang['name'] = 'Nome:'; -$lang['date'] = 'Data:'; -$lang['type'] = 'Tipo:'; -$lang['desc'] = 'Descrição:'; -$lang['author'] = 'Autor:'; -$lang['www'] = 'Sítio:'; -$lang['error'] = 'Ocorreu um erro desconhecido.'; -$lang['error_download'] = 'Impossível descarregar o ficheiro do plugin: %s'; -$lang['error_badurl'] = 'URL suspeito ou errado - impossível determinar o ficheiro a partir do URL'; -$lang['error_dircreate'] = 'Impossível criar pasta temporária para receber os ficheiros a descarregar'; -$lang['error_decompress'] = 'O gestor de plugins foi incapaz de descomprimir o ficheiro transferido. Isto pode ter sido causado por uma má transferência, caso no qual você deverá tentar de novo, ou por um formato de compressão desconhecido, caso no qual você deve instalar o plugin manualmente.'; -$lang['error_copy'] = 'Ocorreu um erro na cópia do ficheiro na tentativa de instalar o plugin %s: o disco pode estar cheio ou as permissões de acesso do ficheiro podem estar erradas. Isto pode resultar em um plugin parcialmente instalado e deixar a instalação do seu wiki instável.'; -$lang['error_delete'] = 'Ocorreu um erro na tentativa de remover o plug-in %s. A causa mais provável é a permissão de acesso à directoria ou ao ficheiro insuficiente.'; -$lang['enabled'] = 'Plugin %s habilitado.'; -$lang['notenabled'] = 'Plugin %s não pôde ser habilitado, verifique as permissões.'; -$lang['disabled'] = 'Plugin %s desabilitado.'; -$lang['notdisabled'] = 'Plugin %s não pôde ser desabilitado, verifique as permissões.'; -$lang['packageinstalled'] = 'Pacote de Plugins (%d plugin(s): %s) instalado com sucesso.'; diff --git a/sources/lib/plugins/plugin/lang/ro/admin_plugin.txt b/sources/lib/plugins/plugin/lang/ro/admin_plugin.txt deleted file mode 100644 index a2956e4..0000000 --- a/sources/lib/plugins/plugin/lang/ro/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Managementul Plugin-urilor ====== - -In această pagină puteţi administra orice [[doku>plugins|plugin]] Dokuwiki. Pentru a descărca şi instala un plugin, directorul acestora trebuie să ofere webserver-ului acces la scriere. diff --git a/sources/lib/plugins/plugin/lang/ro/lang.php b/sources/lib/plugins/plugin/lang/ro/lang.php deleted file mode 100644 index c57647e..0000000 --- a/sources/lib/plugins/plugin/lang/ro/lang.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @author s_baltariu@yahoo.com - * @author Emanuel-Emeric Andrasi - * @author Emanuel-Emeric Andrași - * @author Emanuel-Emeric Andraşi - * @author Emanuel-Emeric Andrasi - * @author Marius OLAR - * @author Marius Olar - * @author Emanuel-Emeric Andrași - */ -$lang['menu'] = 'Administrează plugin-uri'; -$lang['download'] = 'Descarcă şi instalează un nou plugin'; -$lang['manage'] = 'Plugin-uri instalate'; -$lang['btn_info'] = 'info'; -$lang['btn_update'] = 'actualizare'; -$lang['btn_delete'] = 'ştergere'; -$lang['btn_settings'] = 'setări'; -$lang['btn_download'] = 'Descarcă'; -$lang['btn_enable'] = 'Salvează'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Instalat:'; -$lang['lastupdate'] = 'Ultima actualizare:'; -$lang['source'] = 'Sursa:'; -$lang['unknown'] = 'necunoscut'; -$lang['updating'] = 'Se actualizează ...'; -$lang['updated'] = 'Plugin-ul %s a fost actualizat cu succes'; -$lang['updates'] = 'Următoarele plugin-uri au fost actualizate cu succes'; -$lang['update_none'] = 'Nu a fost găsită nici o actualizare.'; -$lang['deleting'] = 'Se şterge ...'; -$lang['deleted'] = 'Plugin-ul %s a fost şters.'; -$lang['downloading'] = 'Se descarcă ...'; -$lang['downloaded'] = 'Plugin-ul %s a fost instalat cu succes'; -$lang['downloads'] = 'Următoarele plugin-uri au fost instalate cu succes'; -$lang['download_none'] = 'Nici un plugin nu a fost găsit, sau o problemă necunoscută a apărut în timpul descărcării şi instalării.'; -$lang['plugin'] = 'Plugin:'; -$lang['components'] = 'Componente'; -$lang['noinfo'] = 'Acest plugin nu a furnizat nici o informaţie; ar putea fi invalid.'; -$lang['name'] = 'Nume:'; -$lang['date'] = 'Data:'; -$lang['type'] = 'Tip:'; -$lang['desc'] = 'Descriere:'; -$lang['author'] = 'Autor:'; -$lang['www'] = 'Web:'; -$lang['error'] = 'A intervenit o eroare necunoscută.'; -$lang['error_download'] = 'Nu a fost posibilă descărcarea plugin-ului: %s'; -$lang['error_badurl'] = 'url suspectat ca fiind eronat - nu a putut fi determinat numele fişierului din url'; -$lang['error_dircreate'] = 'Nu a putut fi creat directorul temporar pentru descărcarea fişierului'; -$lang['error_decompress'] = 'Administratorul de plugin-uri nu a putut dezarhiva fişierul descărcat. Aceasta se poate datora unei erori la descărcare, caz în care trebuie să încercaţi din nou; sau formatul de arhivare este necunoscut, caz în care va trebui să descărcaţi şi să instalaţi plugin-ul manual.'; -$lang['error_copy'] = 'O eroare la copiere a apărut la instalarea fişierelor plugin-ului %s: discul poate fi plin sau drepturile de acces ale fişierelor sunt incorecte. Aceasta poate avea ca rezultat o instalare parţială a plugin-ului şi o instabilitate a instalării wiki.'; -$lang['error_delete'] = 'O eroare a apărut la ştergerea plugin-ului %s. Cea mai probabilă cauză sunt drepturile de acces insuficiente ale fişierului sau directorului.'; -$lang['enabled'] = 'Plugin %s activat.'; -$lang['notenabled'] = 'Plugin-ul %s nu poate fi activat, verificaţi permisiunile fişierului.'; -$lang['disabled'] = 'Plugin %s dezactivat.'; -$lang['notdisabled'] = 'Plugin-ul %s nu poate fi dezactivat, verificaţi permisiunile fişierului.'; -$lang['packageinstalled'] = 'Pachet modul (%d modul(e): %s) instalat cu succes.'; diff --git a/sources/lib/plugins/plugin/lang/ru/admin_plugin.txt b/sources/lib/plugins/plugin/lang/ru/admin_plugin.txt deleted file mode 100644 index 3e00e41..0000000 --- a/sources/lib/plugins/plugin/lang/ru/admin_plugin.txt +++ /dev/null @@ -1,5 +0,0 @@ -====== Управление плагинами ====== - -Здесь вы можете делать всё, что связано с [[doku>plugins|плагинами]] «ДокуВики». Для того, чтобы скачивать и устанавливать плагины, директория плагинов должна быть доступна для записи веб-сервером. - - diff --git a/sources/lib/plugins/plugin/lang/ru/lang.php b/sources/lib/plugins/plugin/lang/ru/lang.php deleted file mode 100644 index b933f77..0000000 --- a/sources/lib/plugins/plugin/lang/ru/lang.php +++ /dev/null @@ -1,66 +0,0 @@ - - * @author Andrew Pleshakov - * @author Змей Этерийский evil_snake@eternion.ru - * @author Hikaru Nakajima - * @author Alexei Tereschenko - * @author Irina Ponomareva irinaponomareva@webperfectionist.com - * @author Alexander Sorkin - * @author Kirill Krasnov - * @author Vlad Tsybenko - * @author Aleksey Osadchiy - * @author Aleksandr Selivanov - * @author Ladyko Andrey - * @author Eugene - * @author Johnny Utah - * @author Ivan I. Udovichenko (sendtome@mymailbox.pp.ua) - */ -$lang['menu'] = 'Управление плагинами'; -$lang['download'] = 'Скачать и установить новый плагин'; -$lang['manage'] = 'Установленные плагины'; -$lang['btn_info'] = 'данные'; -$lang['btn_update'] = 'обновить'; -$lang['btn_delete'] = 'удалить'; -$lang['btn_settings'] = 'настройки'; -$lang['btn_download'] = 'Скачать'; -$lang['btn_enable'] = 'Сохранить'; -$lang['url'] = 'Адрес'; -$lang['installed'] = 'Установлен:'; -$lang['lastupdate'] = 'Последнее обновление:'; -$lang['source'] = 'Источник:'; -$lang['unknown'] = 'неизвестно'; -$lang['updating'] = 'Обновление...'; -$lang['updated'] = 'Плагин %s успешно обновлён'; -$lang['updates'] = 'Следующие плагины были успешно обновлены'; -$lang['update_none'] = 'Обновления не найдены.'; -$lang['deleting'] = 'Удаление...'; -$lang['deleted'] = 'Плагин %s удалён.'; -$lang['downloading'] = 'Скачивание...'; -$lang['downloaded'] = 'Плагин %s успешно установлен'; -$lang['downloads'] = 'Следующие плагины были успешно установлены:'; -$lang['download_none'] = 'Плагины не найдены или возникла неизвестная проблема в процессе скачивания и установки.'; -$lang['plugin'] = 'Плагин:'; -$lang['components'] = 'Компоненты'; -$lang['noinfo'] = 'Этот плагин не сообщил никаких данных, он может быть нерабочим.'; -$lang['name'] = 'Название:'; -$lang['date'] = 'Дата:'; -$lang['type'] = 'Тип:'; -$lang['desc'] = 'Описание:'; -$lang['author'] = 'Автор:'; -$lang['www'] = 'Страница:'; -$lang['error'] = 'Произошла неизвестная ошибка.'; -$lang['error_download'] = 'Не могу скачать файл плагина: %s'; -$lang['error_badurl'] = 'Возможно неправильный адрес — не могу определить имя файла из адреса'; -$lang['error_dircreate'] = 'Не могу создать временную директорию для скачивания'; -$lang['error_decompress'] = 'Менеджеру плагинов не удалось распаковать скачанный файл. Это может быть результатом ошибки при скачивании, в этом случае вы можете попробовать снова, или же плагин упакован неизвестным архиватором, тогда вам необходимо скачать и установить плагин вручную.'; -$lang['error_copy'] = 'Произошла ошибка копирования при попытке установки файлов для плагина %s: переполнение диска или неправильные права доступа. Это могло привести к частичной установке плагина и неустойчивости работы вашей вики.'; -$lang['error_delete'] = 'Произошла ошибка при попытке удалить плагин %s. Наиболее вероятно, что нет необходимых прав доступа к файлам или директориям'; -$lang['enabled'] = 'Плагин %s включен.'; -$lang['notenabled'] = 'Не удалось включить плагин %s. Проверьте системные права доступа к файлам.'; -$lang['disabled'] = 'Плагин %s отключен.'; -$lang['notdisabled'] = 'Не удалось отключить плагин %s. Проверьте системные права доступа к файлам.'; -$lang['packageinstalled'] = 'Пакет (%d плагин(а): %s) успешно установлен.'; diff --git a/sources/lib/plugins/plugin/lang/sk/admin_plugin.txt b/sources/lib/plugins/plugin/lang/sk/admin_plugin.txt deleted file mode 100644 index ad3ae7f..0000000 --- a/sources/lib/plugins/plugin/lang/sk/admin_plugin.txt +++ /dev/null @@ -1,4 +0,0 @@ -====== Správa pluginov ====== - -Na tejto stránke je možné spravovať [[doku>plugins|pluginy]] Dokuwiki. Aby bolo možné sťahovať a inštalovať pluginy, musí mať webový server prístup pre zápis do adresára //plugin//. - diff --git a/sources/lib/plugins/plugin/lang/sk/lang.php b/sources/lib/plugins/plugin/lang/sk/lang.php deleted file mode 100644 index 35c07cf..0000000 --- a/sources/lib/plugins/plugin/lang/sk/lang.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @author Michal Mesko - * @author exusik@gmail.com - * @author Martin Michalek - */ -$lang['menu'] = 'Správa pluginov'; -$lang['download'] = 'Stiahnuť a nainštalovať plugin'; -$lang['manage'] = 'Nainštalované pluginy'; -$lang['btn_info'] = 'info'; -$lang['btn_update'] = 'aktualizovať'; -$lang['btn_delete'] = 'zmazať'; -$lang['btn_settings'] = 'nastavenia'; -$lang['btn_download'] = 'Stiahnuť'; -$lang['btn_enable'] = 'Uložiť'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Nainštalovaný:'; -$lang['lastupdate'] = 'Aktualizovaný:'; -$lang['source'] = 'Zdroj:'; -$lang['unknown'] = 'neznámy'; -$lang['updating'] = 'Aktualizuje sa ...'; -$lang['updated'] = 'Plugin %s bol úspešne aktualizovaný'; -$lang['updates'] = 'Nasledujúce pluginy bol úspešne aktualizované:'; -$lang['update_none'] = 'Neboli nájdené žiadne aktualizácie.'; -$lang['deleting'] = 'Vymazáva sa ...'; -$lang['deleted'] = 'Plugin %s bol zmazaný.'; -$lang['downloading'] = 'Sťahuje sa ...'; -$lang['downloaded'] = 'Plugin %s bol úspešne stiahnutý'; -$lang['downloads'] = 'Nasledujúce pluginy bol úspešne stiahnuté:'; -$lang['download_none'] = 'Neboli nájdené žiadne pluginy alebo nastal neznámy problém počas sťahovania a inštalácie pluginov.'; -$lang['plugin'] = 'Plugin:'; -$lang['components'] = 'Súčasti'; -$lang['noinfo'] = 'Tento plugin neobsahuje žiadne informácie, je možné, že je chybný.'; -$lang['name'] = 'názov:'; -$lang['date'] = 'Dátum:'; -$lang['type'] = 'Typ:'; -$lang['desc'] = 'Popis:'; -$lang['author'] = 'Autor:'; -$lang['www'] = 'Web:'; -$lang['error'] = 'Nastala neznáma chyba.'; -$lang['error_download'] = 'Nie je možné stiahnuť súbor pluginu: %s'; -$lang['error_badurl'] = 'Pravdepodobne zlá url adresa - nie je možné z nej určiť meno súboru'; -$lang['error_dircreate'] = 'Nie je možné vytvoriť dočasný adresár pre uloženie sťahovaného súboru'; -$lang['error_decompress'] = 'Správca pluginov nedokáže dekomprimovať stiahnutý súbor. Môže to byť dôsledok zlého stiahnutia, v tom prípade to skúste znovu, alebo môže ísť o neznámy formát súboru, v tom prípade musíte stiahnuť a nainštalovať plugin manuálne.'; -$lang['error_copy'] = 'Nastala chyba kopírovania súboru počas pokusu inštalovať súbory pluginu%s: disk môže byť plný alebo prístupové práva k súboru môžu byť nesprávne. Toto môže mať za následok čiastočne nainštalovanie pluginu a nestabilitu vašej DokuWiki.'; -$lang['error_delete'] = 'Nastala chyba počas pokusu o zmazanie pluginu %s. Najpravdepodobnejším dôvodom môžu byť nedostatočné prístupové práva pre súbor alebo adresár'; -$lang['enabled'] = 'Plugin %s aktivovaný.'; -$lang['notenabled'] = 'Plugin %s nemôže byť aktivovaný, skontrolujte prístupové práva.'; -$lang['disabled'] = 'Plugin %s deaktivovaný.'; -$lang['notdisabled'] = 'Plugin %s nemôže byť deaktivovaný, skontrolujte prístupové práva.'; -$lang['packageinstalled'] = 'Plugin package (%d plugin(s): %s) úspešne inštalovaný.'; diff --git a/sources/lib/plugins/plugin/lang/sl/admin_plugin.txt b/sources/lib/plugins/plugin/lang/sl/admin_plugin.txt deleted file mode 100644 index 5fd02e1..0000000 --- a/sources/lib/plugins/plugin/lang/sl/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Upravljanje vstavkov ====== - -Na tej strani je mogoče spreminjati in prilagajati nastavitve DokuWiki [[doku>plugins|vstavkov]]. Za prejemanje in nameščanje vstavkov v ustrezne mape, morajo imeti te določena ustrezna dovoljenja za pisanje spletnega strežnika. diff --git a/sources/lib/plugins/plugin/lang/sl/lang.php b/sources/lib/plugins/plugin/lang/sl/lang.php deleted file mode 100644 index e205c57..0000000 --- a/sources/lib/plugins/plugin/lang/sl/lang.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @author Boštjan Seničar - * @author Gregor Skumavc (grega.skumavc@gmail.com) - * @author Matej Urbančič (mateju@svn.gnome.org) - */ -$lang['menu'] = 'Upravljanje vstavkov'; -$lang['download'] = 'Prejmi in namesti nov vstavek'; -$lang['manage'] = 'Nameščeni vstavki'; -$lang['btn_info'] = 'Podrobnosti'; -$lang['btn_update'] = 'Posodobi'; -$lang['btn_delete'] = 'Izbriši'; -$lang['btn_settings'] = 'Nastavitve'; -$lang['btn_download'] = 'Prejmi'; -$lang['btn_enable'] = 'Shrani'; -$lang['url'] = 'URL'; -$lang['installed'] = 'Nameščeno:'; -$lang['lastupdate'] = 'Nazadnje posodobljeno:'; -$lang['source'] = 'Vir:'; -$lang['unknown'] = 'neznano'; -$lang['updating'] = 'Posodabljanje ...'; -$lang['updated'] = 'Vstavek %s je uspešno posodobljen'; -$lang['updates'] = 'Navedeni vstavki so uspešno posodobljeni'; -$lang['update_none'] = 'Posodobitev ni mogoče najti.'; -$lang['deleting'] = 'Brisanje ...'; -$lang['deleted'] = 'Vstavek %s je izbrisan.'; -$lang['downloading'] = 'Prejemanje ...'; -$lang['downloaded'] = 'Vstavek %s je uspešno nameščen'; -$lang['downloads'] = 'Navedeni vstavki so uspešno nameščeni:'; -$lang['download_none'] = 'Vstavkov ni mogoče najti ali pa je prišlo do napake med prejemanjem in nameščanjem.'; -$lang['plugin'] = 'Vstavek:'; -$lang['components'] = 'Sestavni deli'; -$lang['noinfo'] = 'Vstavek nima vpisanih podrobnih podatkov, kar pomeni, da je morda neveljaven.'; -$lang['name'] = 'Ime:'; -$lang['date'] = 'Datum:'; -$lang['type'] = 'Vrsta:'; -$lang['desc'] = 'Opis:'; -$lang['author'] = 'Avtor:'; -$lang['www'] = 'Spletna stran:'; -$lang['error'] = 'Prišlo je do neznane napake.'; -$lang['error_download'] = 'Ni mogoče prejeti datoteke vstavka: %s'; -$lang['error_badurl'] = 'Napaka naslova URL - ni mogoče določiti imena datoteke iz naslova URL'; -$lang['error_dircreate'] = 'Ni mogoče ustvariti začasne mape za prejemanje'; -$lang['error_decompress'] = 'Z upravljalnikom vstavkov ni mogoče razširiti prejetega arhiva vstavka. Najverjetneje je prišlo do napake med prejemanjem datoteke ali pa zapis arhiva ni znan. Poskusite znova ali pa napako odpravite z ročnim nameščanjem vstavka.'; -$lang['error_copy'] = 'Prišlo je do napake med nameščanjem datotek vstavka %s: najverjetneje so težave s prostorom za namestitev ali pa ni ustreznih dovoljenj za nameščanje. Zaradi nepopolne namestitve lahko nastopijo težave v delovanju sistema Wiki.'; -$lang['error_delete'] = 'Prišlo je do napake med brisanjem vstavka %s: najverjetneje ni ustreznih dovoljenj za dostop do datoteke ali mape'; -$lang['enabled'] = 'Vstavek %s je omogočen.'; -$lang['notenabled'] = 'Vstavka %s ni mogoče omogočiti zaradi neustreznih dovoljen.'; -$lang['disabled'] = 'Vstavek %s je onemogočen.'; -$lang['notdisabled'] = 'Vstavka %s ni mogoče onemogočiti zaradi neustreznih dovoljen.'; -$lang['packageinstalled'] = 'Paket vstavka (%d vstavkov: %s) je uspešno nameščen.'; diff --git a/sources/lib/plugins/plugin/lang/sq/admin_plugin.txt b/sources/lib/plugins/plugin/lang/sq/admin_plugin.txt deleted file mode 100644 index 2e1f192..0000000 --- a/sources/lib/plugins/plugin/lang/sq/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Menaxhimi i Plugin-eve ====== - -Në këtë faqe mund të menaxhoni çdo gjë që ka të bëjë me [[doku>plugins|plugin-et]] Dokuwiki. Që të jetë në gjendje për të shkarkuar dhe instaluar një plugin, dosja e plugin-it duhet të jetë e shkrueshme nga webserver-i. \ No newline at end of file diff --git a/sources/lib/plugins/plugin/lang/sq/lang.php b/sources/lib/plugins/plugin/lang/sq/lang.php deleted file mode 100644 index 9ddcf52..0000000 --- a/sources/lib/plugins/plugin/lang/sq/lang.php +++ /dev/null @@ -1,50 +0,0 @@ -%s: disku mund të jetë plotë ose të drejtat për aksesim skedari mund të jenë të gabuara. Kjo mund të ketë shkaktuar një instalim të pjesshëm të plugin-it dhe ta lërë instalimin e wiki-t tënd të paqëndrueshëm.'; -$lang['error_delete'] = 'Ndodhi një gabim gjatë përpjekjes për të fshirë plugin-in %s. Shkaku më i mundshëm është të drejta të pamjaftueshme për aksesim skedari ose dosjeje.'; -$lang['enabled'] = 'Plugini %s u aktivizua.'; -$lang['notenabled'] = 'Plugini %s nuk mundi të aktivizohej, kontrollo të drejtat e aksesit për skedarin.'; -$lang['disabled'] = 'Plugin %s është i paaktivizuar.'; -$lang['notdisabled'] = 'Plugini %s nuk mundi të çaktivizohej, kontrollo të drejtat e aksesit për skedarin.'; diff --git a/sources/lib/plugins/plugin/lang/sr/admin_plugin.txt b/sources/lib/plugins/plugin/lang/sr/admin_plugin.txt deleted file mode 100644 index 6262ece..0000000 --- a/sources/lib/plugins/plugin/lang/sr/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Управљач додацима ====== - -На овој страни можете управљати са свим у вези DokuWiki [[doku>plugins|додацима]]. Да бисте имали могућност преузимања и инсталирања додатака, фасцикла за додатке мора имати дозволу за писање. \ No newline at end of file diff --git a/sources/lib/plugins/plugin/lang/sr/lang.php b/sources/lib/plugins/plugin/lang/sr/lang.php deleted file mode 100644 index bc22770..0000000 --- a/sources/lib/plugins/plugin/lang/sr/lang.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @author Miroslav Šolti - */ -$lang['menu'] = 'Управљач додацима'; -$lang['download'] = 'Преузми и инсталирај нови додатак'; -$lang['manage'] = 'Инсталирани додаци'; -$lang['btn_info'] = 'инфо'; -$lang['btn_update'] = 'ажурирај'; -$lang['btn_delete'] = 'обриши'; -$lang['btn_settings'] = 'поставке'; -$lang['btn_download'] = 'Преузми'; -$lang['btn_enable'] = 'Сачувај'; -$lang['url'] = 'УРЛ'; -$lang['installed'] = 'Инсталирани:'; -$lang['lastupdate'] = 'Последњи пут ажурирани:'; -$lang['source'] = 'Извор:'; -$lang['unknown'] = 'непознат'; -$lang['updating'] = 'Ажурирање:'; -$lang['updated'] = 'Додатак %s је успешно ажуриран'; -$lang['updates'] = 'Следећи додаци су успешно ажурирани'; -$lang['update_none'] = 'Нема доступних ажурирања.'; -$lang['deleting'] = 'Брисање...'; -$lang['deleted'] = 'Додатак %s је обрисан.'; -$lang['downloading'] = 'Преузимање...'; -$lang['downloaded'] = 'Додатак %s је успешно инсталиран'; -$lang['downloads'] = 'Следећи додаци су успешно инсталирани:'; -$lang['download_none'] = 'Нема додатака, или се јавио непознат проблем током преузимања или инсталирања.'; -$lang['plugin'] = 'Додатак:'; -$lang['components'] = 'Компоненте'; -$lang['noinfo'] = 'Овај додатак не враћа никакве информације, можда је неисправан.'; -$lang['name'] = 'Име:'; -$lang['date'] = 'Датум:'; -$lang['type'] = 'Врста:'; -$lang['desc'] = 'Опис:'; -$lang['author'] = 'Аутор:'; -$lang['www'] = 'Веб:'; -$lang['error'] = 'Десила се непозната грешка.'; -$lang['error_download'] = 'Немогуће је преузети додатак: %s'; -$lang['error_badurl'] = 'Сумњам на лош УРЛ - немогу да одредим назив датотеке '; -$lang['error_dircreate'] = 'Немогућност прављења привремене фасцикле за преузимање'; -$lang['error_decompress'] = 'Управљач додацима није у могућности да распакује преузету датотеку. Разлог може да буде лошег преузимања, у том случају пробајте још једном; или је непознат облик компресије, у том случају ручно преузмите и инсталирајте додатак.'; -$lang['error_copy'] = 'Појавила се грешка у копирању у току иснталације додатка %s: складиште је можда пуно или дозволе за уписивање нису постављене како треба. Резултат може бити делимично инсталиран додатак и вики у нестабилном стању.'; -$lang['error_delete'] = 'Појавила се грешка у покушају брисања додатка %s. Нејчешћи узрок је недостатак потребних дозвола за операције са датотекама или фасциклама'; -$lang['enabled'] = 'Додатај %s је укључен.'; -$lang['notenabled'] = 'Додатак %s није могуће укључити, проверите дозволе приступа.'; -$lang['disabled'] = 'Додатај %s је исукључен.'; -$lang['notdisabled'] = 'Додатак %s није могуће исукључити, проверите дозволе приступа.'; diff --git a/sources/lib/plugins/plugin/lang/sv/admin_plugin.txt b/sources/lib/plugins/plugin/lang/sv/admin_plugin.txt deleted file mode 100644 index e490e5e..0000000 --- a/sources/lib/plugins/plugin/lang/sv/admin_plugin.txt +++ /dev/null @@ -1,5 +0,0 @@ -====== Hantera insticksmoduler ====== - -På den här sidan kan man hantera allting som har att göra med Dokuwikis [[doku>plugins|insticksmoduler]]. För att man ska kunna ladda ned och installera en modul måste katalogen för insticksmoduler vara skrivbar av webbservern. - - diff --git a/sources/lib/plugins/plugin/lang/sv/lang.php b/sources/lib/plugins/plugin/lang/sv/lang.php deleted file mode 100644 index b7c2374..0000000 --- a/sources/lib/plugins/plugin/lang/sv/lang.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @author Nicklas Henriksson - * @author Håkan Sandell - * @author Dennis Karlsson - * @author Tormod Otter Johansson - * @author emil@sys.nu - * @author Pontus Bergendahl - * @author Tormod Johansson tormod.otter.johansson@gmail.com - * @author Emil Lind - * @author Bogge Bogge - * @author Peter Åström - * @author mikael@mallander.net - * @author Smorkster Andersson smorkster@gmail.com - */ -$lang['menu'] = 'Hantera insticksmoduler'; -$lang['download'] = 'Ladda ned och installera en ny insticksmodul'; -$lang['manage'] = 'Installerade insticksmoduler'; -$lang['btn_info'] = 'info'; -$lang['btn_update'] = 'uppdatera'; -$lang['btn_delete'] = 'radera'; -$lang['btn_settings'] = 'inställningar'; -$lang['btn_download'] = 'Ladda ned'; -$lang['btn_enable'] = 'Spara'; -$lang['url'] = 'Webbadress'; -$lang['installed'] = 'Installerad:'; -$lang['lastupdate'] = 'Senast uppdaterad:'; -$lang['source'] = 'Källa:'; -$lang['unknown'] = 'okänd'; -$lang['updating'] = 'Uppdaterar ...'; -$lang['updated'] = 'Insticksmodulen %s uppdaterades'; -$lang['updates'] = 'Följande Insticksmoduler har uppdaterats'; -$lang['update_none'] = 'Inga uppdateringar hittades.'; -$lang['deleting'] = 'Raderar ...'; -$lang['deleted'] = 'Insticksmodulen %s raderad.'; -$lang['downloading'] = 'Laddar ned ...'; -$lang['downloaded'] = 'Insticksmodulen %s installerades'; -$lang['downloads'] = 'Följande insticksmoduler har installerats:'; -$lang['download_none'] = 'Inga insticksmoduler hittades, eller så har det uppstått ett okänt fel under nedladdning och installation.'; -$lang['plugin'] = 'Insticksmodul:'; -$lang['components'] = 'Komponenter'; -$lang['noinfo'] = 'Den här insticksmodulen returnerade ingen information, den kan vara ogiltig.'; -$lang['name'] = 'Namn:'; -$lang['date'] = 'Datum:'; -$lang['type'] = 'Typ:'; -$lang['desc'] = 'Beskrivning:'; -$lang['author'] = 'Författare:'; -$lang['www'] = 'Webb:'; -$lang['error'] = 'Ett okänt fel har inträffat.'; -$lang['error_download'] = 'Kan inte ladda ned fil till insticksmodul: %s'; -$lang['error_badurl'] = 'Misstänkt felaktig webbadress - kan inte bestämma filnamnet från webbadressen'; -$lang['error_dircreate'] = 'Kan inte skapa tillfällig katalog för nedladdade filer'; -$lang['error_decompress'] = 'Hanteraren för insticksmoduler kunde inte dekomprimera den nedladdade filen. Detta kan vara resultatet av en misslyckad nedladdning, och i så fall bör du försöka igen; eller så kan det komprimerade formatet vara okänt, och då måste du ladda ned och installera insticksmodulen manuellt.'; -$lang['error_copy'] = 'Ett filkopieringsfel uppstod under försöket att installera filerna till insticksmodulen %s: disken kan vara full eller så kan filskyddet vara felaktigt. Detta kan ha lett till en delvis installerad insticksmodul, och gjort din wiki-installation instabil.'; -$lang['error_delete'] = 'Ett fel uppstod vid försöket att radera insticksmodulen %s. Den troligaste orsaken är otillräcklig behörighet till filer eller kataloger'; -$lang['enabled'] = 'Tilläggsmodulen %s är aktiverad.'; -$lang['notenabled'] = 'Tilläggsmodulen %s kunde inte aktiveras, kontrollera filrättigheterna.'; -$lang['disabled'] = 'Tiläggsmodulen %s är avaktiverad.'; -$lang['notdisabled'] = 'Tilläggsmodulen %s kunde inte avaktiveras, kontrollera filrättigheterna.'; -$lang['packageinstalled'] = 'Tilläggs paket (%d tillägg: %s) har installerats.'; diff --git a/sources/lib/plugins/plugin/lang/th/admin_plugin.txt b/sources/lib/plugins/plugin/lang/th/admin_plugin.txt deleted file mode 100644 index 8611654..0000000 --- a/sources/lib/plugins/plugin/lang/th/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== ตัวจัดการโปรแกรมเสริม ====== - -ในหน้านี้คุณสามารถจัดการทุกๆอย่างที่จะต้องทำงานกับ [[doku>plugins|plugins]]โดกุวิกิ เพื่อที่จะสามารถดาวน์โหลดและติดตั้งโปรแกรมเสริม ตัวโฟลเดอร์โปรแกรมเสริม(plugin) จะต้องสามารถเขียนได้โดยเว็บเซิร์ฟเวอร์ \ No newline at end of file diff --git a/sources/lib/plugins/plugin/lang/th/lang.php b/sources/lib/plugins/plugin/lang/th/lang.php deleted file mode 100644 index dab094b..0000000 --- a/sources/lib/plugins/plugin/lang/th/lang.php +++ /dev/null @@ -1,50 +0,0 @@ - - * @author Kittithat Arnontavilas mrtomyum@gmail.com - * @author Arthit Suriyawongkul - * @author Kittithat Arnontavilas - * @author Thanasak Sompaisansin - */ -$lang['menu'] = 'จัดการปลั๊กอิน'; -$lang['download'] = 'ดาวน์โหลดและติดตั้งปลั๊กอินใหม่'; -$lang['manage'] = 'ปลั๊กอินที่ติดตั้งไว้แล้ว'; -$lang['btn_info'] = 'ข้อมูล'; -$lang['btn_update'] = 'ปรับปรุง'; -$lang['btn_delete'] = 'ลบ'; -$lang['btn_settings'] = 'ตั้งค่า'; -$lang['btn_download'] = 'ดาวน์โหลด'; -$lang['btn_enable'] = 'บันทึก'; -$lang['url'] = 'ที่อยู่เว็บ'; -$lang['installed'] = 'ติดตั้งแล้ว:'; -$lang['lastupdate'] = 'ปรับปรุงล่าสุด:'; -$lang['source'] = 'ต้นกำเนิด'; -$lang['unknown'] = 'ไม่มีข้อมูล'; -$lang['updating'] = 'กำลังปรับปรุง ...'; -$lang['updated'] = 'โปรแกรมเสริม %s ได้รับการปรับปรุงสำเร็จแล้ว'; -$lang['updates'] = 'โปรแกรมเสริมต่อไปนี้ได้รับการปรับปรุงสำเร็จแล้ว'; -$lang['update_none'] = 'ไม่พบการปรับปรุงใดๆ'; -$lang['deleting'] = 'กำลังลบ ...'; -$lang['deleted'] = 'โปรแกรมเสริม %s ถูกลบแล้ว'; -$lang['downloading'] = 'กำลังดาวโหลด ...'; -$lang['downloaded'] = 'โปรแกรมเสริม %s ถูกติดตั้งสำเร็จแล้ว'; -$lang['downloads'] = 'โปรแกรมเสริมต่อไปนี้ได้รับการปรับปรุงสำเร็จแล้ว:'; -$lang['download_none'] = 'ไม่พบโปรแกรมเสริม, หรือมีปัญหาบางประการเกิดขึ้นระหว่างการดาวน์โหลด และติดตั้ง'; -$lang['plugin'] = 'โปรแกรมเสริม:'; -$lang['components'] = '่สวนประกอบ'; -$lang['noinfo'] = 'โปรแกรมเสริมนี้ไม่บอกข้อมูล, มันอาจไม่ใช่โปรแกรมเสริมจริง'; -$lang['name'] = 'ชื่อ:'; -$lang['date'] = 'วันที่:'; -$lang['type'] = 'ชนิด:'; -$lang['desc'] = 'รายละเอียด:'; -$lang['author'] = 'ผู้แต่ง:'; -$lang['www'] = 'เว็บ:'; -$lang['error'] = 'เกิดความผิดพลาดที่ระบุไม่ได้'; -$lang['error_download'] = 'ไม่สามารถดาวน์โหลดไฟล์โปรแกรมเสริม: %s'; -$lang['error_dircreate'] = 'ไม่สามารถสร้างโฟลเดอร์ชั่วคราวเพื่อที่จะรองรับการดาวน์โหลด'; -$lang['enabled'] = 'เปิดใช้งานโปรแกรมเสริม %s แล้ว'; -$lang['notenabled'] = 'โปรแกรมเสริม %s ไม่สามารถเปิดใช้งาน, กรุณาตรวจสอบสิทธิ์ของไฟล์'; -$lang['disabled'] = 'ปิดการใช้งานโปรแกรมเสริม %s แล้ว'; -$lang['notdisabled'] = 'โปรแกรมเสริม %s ไม่สามารถปิดการใช้งานได้, กรุณาตรวจสอบสิทธิ์ของไฟล์'; diff --git a/sources/lib/plugins/plugin/lang/tr/admin_plugin.txt b/sources/lib/plugins/plugin/lang/tr/admin_plugin.txt deleted file mode 100644 index 956d701..0000000 --- a/sources/lib/plugins/plugin/lang/tr/admin_plugin.txt +++ /dev/null @@ -1,3 +0,0 @@ -====== Eklenti Yönetimi ====== - -Bu sayfada DokuWiki [[doku>plugins|eklentileri]] ile ilgili herşeyi düzenleyebilirsiniz. Eklenti kurup indirmek için, eklenti dizininin yazılabilir olması gerekmektedir. diff --git a/sources/lib/plugins/plugin/lang/tr/lang.php b/sources/lib/plugins/plugin/lang/tr/lang.php deleted file mode 100644 index a4feea8..0000000 --- a/sources/lib/plugins/plugin/lang/tr/lang.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @author Cihan Kahveci - * @author Yavuz Selim - * @author Caleb Maclennan - * @author farukerdemoncel@gmail.com - */ -$lang['menu'] = 'Eklenti Yönetimi'; -$lang['download'] = 'Yeni bir eklenti indirip kur'; -$lang['manage'] = 'Kurulmuş Eklentiler'; -$lang['btn_info'] = 'bilgi'; -$lang['btn_update'] = 'güncelle'; -$lang['btn_delete'] = 'sil'; -$lang['btn_settings'] = 'Ayarlar'; -$lang['btn_download'] = 'İndir'; -$lang['btn_enable'] = 'Kaydet'; -$lang['url'] = 'Web Adresi'; -$lang['installed'] = 'Kuruldu:'; -$lang['lastupdate'] = 'Son güncelleştirme:'; -$lang['source'] = 'Kaynak:'; -$lang['unknown'] = 'bilinmiyor'; -$lang['updating'] = 'Güncelleştiriyor ...'; -$lang['updated'] = '%s eklentisi başarıyla güncellendi'; -$lang['updates'] = 'Şu eklentiler başarıyla güncellendi'; -$lang['update_none'] = 'Yeni bir güncelleme bulunamadı.'; -$lang['deleting'] = 'Siliniyor ...'; -$lang['deleted'] = '%s eklentisi silindi.'; -$lang['downloading'] = 'İndiriyor ...'; -$lang['downloaded'] = '%s eklentisi başarıyla kuruldu'; -$lang['downloads'] = 'Şu eklentiler başarıyla kuruldu:'; -$lang['download_none'] = 'Eklenti bulunamadı veya indirirken/kurarken bilinmeyen bir hata oluştu.'; -$lang['plugin'] = 'Eklenti:'; -$lang['components'] = 'Parçalar'; -$lang['noinfo'] = 'Bu eklentinin bilgileri alınamadı, geçerli bir eklenti olmayabilir.'; -$lang['name'] = 'Ad:'; -$lang['date'] = 'Tarih:'; -$lang['type'] = 'Tür:'; -$lang['desc'] = 'Açıklama:'; -$lang['author'] = 'Yazar:'; -$lang['www'] = 'Web Adresi:'; -$lang['error'] = 'Bilinmeyen bir hata oluştu.'; -$lang['error_download'] = 'Şu eklenti indirilemedi: %s'; -$lang['error_badurl'] = 'Yanlış adres olabilir - verilen adresten dosya adı alınamadı'; -$lang['error_dircreate'] = 'İndirmek için geçici klasör oluşturulamadı'; -$lang['error_decompress'] = 'Eklenti yöneticisi indirilen sıkıştırılmış dosyayı açamadı. Bu yanlış indirmeden kaynaklanabilir (bu durumda tekrar denemelisiniz). Ya da indirilen dosyanın sıkıştırma biçimi bilinmemektedir (bu durumda eklentiyi indirerek kendiniz kurmalısınız).'; -$lang['error_copy'] = '%s eklentisi dosyalarını kurmaya çalışırken kopyalama hatası ortaya çıktı. Sürücü dolu olabilir veya yazma yetkisi bulunmuyor olabilir. Bunun sebebi tam kurulmamış bir eklentinin wiki kurulumunu bozması olabilir.'; -$lang['error_delete'] = '%s eklentisini silerken bir hata oluştu. Bu hata yetersiz dosya/klasör erişim yetkisinden kaynaklanabilir.'; -$lang['enabled'] = '%s eklentisi etkinleştirildi.'; -$lang['notenabled'] = '%s eklentisi etkinleştirilemedi, dosya yetkilerini kontrol edin.'; -$lang['disabled'] = '%s eklentisi devre dışı bırakıldı.'; -$lang['notdisabled'] = '%s eklentisi devre dışı bırakılamadı, dosya yetkilerini kontrol edin.'; diff --git a/sources/lib/plugins/plugin/lang/uk/admin_plugin.txt b/sources/lib/plugins/plugin/lang/uk/admin_plugin.txt deleted file mode 100644 index 7bdf8e5..0000000 --- a/sources/lib/plugins/plugin/lang/uk/admin_plugin.txt +++ /dev/null @@ -1,7 +0,0 @@ -====== Керування доданками ====== - -Тут ви можете керувати [[doku>plugins|доданками]] ДокуВікі. Для того, щоб завантажувати та встановлювати доданки, папка доданків повинна бути доступна для запису веб-сервером. - - - - diff --git a/sources/lib/plugins/plugin/lang/uk/lang.php b/sources/lib/plugins/plugin/lang/uk/lang.php deleted file mode 100644 index c6d5990..0000000 --- a/sources/lib/plugins/plugin/lang/uk/lang.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @author Uko uko@uar.net - * @author Ulrikhe Lukoie .com - * @author Kate Arzamastseva pshns@ukr.net - */ -$lang['menu'] = 'Керування доданками'; -$lang['download'] = 'Завантажити та встановити новий доданок'; -$lang['manage'] = 'Встановлені доданки'; -$lang['btn_info'] = 'дані'; -$lang['btn_update'] = 'оновити'; -$lang['btn_delete'] = 'видалити'; -$lang['btn_settings'] = 'параметри'; -$lang['btn_download'] = 'Завантажити'; -$lang['btn_enable'] = 'Зберегти'; -$lang['url'] = 'Адреса'; -$lang['installed'] = 'Встановлено:'; -$lang['lastupdate'] = 'Останнє оновлення:'; -$lang['source'] = 'Джерело:'; -$lang['unknown'] = 'невідомо'; -$lang['updating'] = 'Оновлення ...'; -$lang['updated'] = 'Доданок %s успішно оновлено'; -$lang['updates'] = 'Наступні доданки були успішно оновлені'; -$lang['update_none'] = 'Оновлення не знайдено.'; -$lang['deleting'] = 'Видалення ...'; -$lang['deleted'] = 'Доданок %s видалено.'; -$lang['downloading'] = 'Завантаження ...'; -$lang['downloaded'] = 'Доданок %s успішно встановлено'; -$lang['downloads'] = 'Наступні доданки були успішно встановлені:'; -$lang['download_none'] = 'Доданки не знайдено або виникла невідома проблема в процессі завантаження та установки.'; -$lang['plugin'] = 'Доданок:'; -$lang['components'] = 'Компоненти'; -$lang['noinfo'] = 'Цей доданок не повідомив ніяких даних, він може бути не працюючим.'; -$lang['name'] = 'Назва:'; -$lang['date'] = 'Дата:'; -$lang['type'] = 'Тип:'; -$lang['desc'] = 'Опис:'; -$lang['author'] = 'Автор:'; -$lang['www'] = 'Сторінка:'; -$lang['error'] = 'Виникла невідома помилка.'; -$lang['error_download'] = 'Не можу завантажити файл доданка: %s'; -$lang['error_badurl'] = 'Можливо, невірна адреса - не можливо визначити ім\'я файлу з адреси'; -$lang['error_dircreate'] = 'Не можливо створити тимчасову папку для завантаження'; -$lang['error_decompress'] = 'Менеджеру доданків не вдалося розпакувати завантажений файл. Це може бути результатом помилки при завантаженні, в цьому разі ви можете спробувати знову; або ж доданок упакований невідомим архіватором, тоді вам необхідно завантажити та встановити доданок вручну.'; -$lang['error_copy'] = 'Виникла помилка копіювання при спробі установки файлів для доданка %s: переповнення диску або невірні права доступу. Це могло привести до часткової установки доданка и нестійкості вашої Вікі.'; -$lang['error_delete'] = 'При спробі вилучення доданка %s виникла помилка. Найбільш вірогідно, що немає необхідних прав доступу до файлів або директорії'; -$lang['enabled'] = 'Доданок %s увімкнено.'; -$lang['notenabled'] = 'Не вдається увімкнути доданок %s. Перевірте права доступу до файлу.'; -$lang['disabled'] = 'Доданок %s вимкнено.'; -$lang['notdisabled'] = 'Не вдається вимкнути доданок %s. Перевірте права доступу до файлу.'; -$lang['packageinstalled'] = 'Пакет плагінів (%d plugin(s): %s) успішно встановлений.'; diff --git a/sources/lib/plugins/plugin/lang/vi/lang.php b/sources/lib/plugins/plugin/lang/vi/lang.php deleted file mode 100644 index 2933d88..0000000 --- a/sources/lib/plugins/plugin/lang/vi/lang.php +++ /dev/null @@ -1,5 +0,0 @@ -plugins|附加元件]] 相關的選項。若要正常下載及安裝附加元件,附加元件所在的資料夾必須允許網頁伺服器寫入。 \ No newline at end of file diff --git a/sources/lib/plugins/plugin/lang/zh-tw/lang.php b/sources/lib/plugins/plugin/lang/zh-tw/lang.php deleted file mode 100644 index bc84059..0000000 --- a/sources/lib/plugins/plugin/lang/zh-tw/lang.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @author http://www.chinese-tools.com/tools/converter-simptrad.html - * @author Wayne San - * @author Li-Jiun Huang - * @author Cheng-Wei Chien - * @author Danny Lin - * @author Shuo-Ting Jian - * @author syaoranhinata@gmail.com - * @author Ichirou Uchiki - */ -$lang['menu'] = '管理附加元件'; -$lang['download'] = '下載與安裝附加元件'; -$lang['manage'] = '已安裝的附加元件'; -$lang['btn_info'] = '資訊'; -$lang['btn_update'] = '更新'; -$lang['btn_delete'] = '刪除'; -$lang['btn_settings'] = '設定'; -$lang['btn_download'] = '下載'; -$lang['btn_enable'] = '儲存'; -$lang['url'] = 'URL'; -$lang['installed'] = '安裝:'; -$lang['lastupdate'] = '上次更新:'; -$lang['source'] = '來源:'; -$lang['unknown'] = '未知'; -$lang['updating'] = '更新中……'; -$lang['updated'] = '已更新附加元件 %s '; -$lang['updates'] = '已更新下列附加元件'; -$lang['update_none'] = '找不到更新。'; -$lang['deleting'] = '刪除中……'; -$lang['deleted'] = '已刪除附加元件 %s 。'; -$lang['downloading'] = '下載中……'; -$lang['downloaded'] = '已安裝附加元件 %s '; -$lang['downloads'] = '已安裝下列附加元件:'; -$lang['download_none'] = '找不到附加元件,或者在下載與安裝時發生了未知的問題。'; -$lang['plugin'] = '附加元件:'; -$lang['components'] = '元件'; -$lang['noinfo'] = '此附加元件沒有回傳任何資訊,它可能已失效。'; -$lang['name'] = '名稱:'; -$lang['date'] = '日期:'; -$lang['type'] = '類型:'; -$lang['desc'] = '描述:'; -$lang['author'] = '作者:'; -$lang['www'] = '網頁:'; -$lang['error'] = '發生了未知的錯誤。'; -$lang['error_download'] = '無法下載附加元件檔案: %s'; -$lang['error_badurl'] = 'URL 可能有問題 —— 從 URL 中無法得知文件名'; -$lang['error_dircreate'] = '無法建立暫存目錄來接收下載的內容'; -$lang['error_decompress'] = '附加元件管理器無法把下載的文件解壓,這可能是由於下載出現錯誤。遇到這種情況,請您再次嘗試。此外,無法識別壓縮格式也可能導致無法解壓。若是如此,您需要手動下載並安裝該附加元件。'; -$lang['error_copy'] = '嘗試安裝附加元件 %s 的相關文件時,發生複製錯誤。這可能是磁碟空間不足,或檔案存取權限錯誤。未安裝好的附加元件,也許會令wiki系統不穩定。'; -$lang['error_delete'] = '嘗試刪除附加元件 %s 時發生錯誤。最有可能原因是檔案或目錄存取權限不足'; -$lang['enabled'] = '附加元件 %s 已啟用。'; -$lang['notenabled'] = '附加元件 %s 無法啟用,請檢查檔案權限。'; -$lang['disabled'] = '附加元件 %s 已停用。'; -$lang['notdisabled'] = '附加元件 %s 無法停用,請檢查檔案權限。'; -$lang['packageinstalled'] = '附加元件 (%d 附加元件: %s) 已安裝好。'; diff --git a/sources/lib/plugins/plugin/lang/zh/admin_plugin.txt b/sources/lib/plugins/plugin/lang/zh/admin_plugin.txt deleted file mode 100644 index 1618071..0000000 --- a/sources/lib/plugins/plugin/lang/zh/admin_plugin.txt +++ /dev/null @@ -1,5 +0,0 @@ -====== 插件管理器 ====== - -本页中您可以管理与 Dokuwiki [[doku>plugins|插件]] 相关的选项。 要通过插件管理器正常下载并安装插件,插件所在的文件夹必须可写。 - - diff --git a/sources/lib/plugins/plugin/lang/zh/lang.php b/sources/lib/plugins/plugin/lang/zh/lang.php deleted file mode 100644 index b39c6b0..0000000 --- a/sources/lib/plugins/plugin/lang/zh/lang.php +++ /dev/null @@ -1,64 +0,0 @@ - - * @author http://www.chinese-tools.com/tools/converter-tradsimp.html - * @author George Sheraton guxd@163.com - * @author Simon zhan - * @author mr.jinyi@gmail.com - * @author ben - * @author lainme - * @author caii - * @author Hiphen Lee - * @author caii, patent agent in China - * @author lainme993@gmail.com - * @author Shuo-Ting Jian - * @author anjianshi - */ -$lang['menu'] = '插件管理器'; -$lang['download'] = '下载并安装新的插件'; -$lang['manage'] = '已安装的插件'; -$lang['btn_info'] = '信息'; -$lang['btn_update'] = '升级'; -$lang['btn_delete'] = '删除'; -$lang['btn_settings'] = '设置'; -$lang['btn_download'] = '下载'; -$lang['btn_enable'] = '保存'; -$lang['url'] = 'URL'; -$lang['installed'] = '安装时间:'; -$lang['lastupdate'] = '最后更新于:'; -$lang['source'] = '来源:'; -$lang['unknown'] = '未知'; -$lang['updating'] = '正在升级...'; -$lang['updated'] = '插件 %s 升级成功'; -$lang['updates'] = '下列插件升级成功:'; -$lang['update_none'] = '未找到更新。'; -$lang['deleting'] = '正在删除...'; -$lang['deleted'] = '插件 %s 已删除'; -$lang['downloading'] = '正在下载...'; -$lang['downloaded'] = '插件 %s 安装成功'; -$lang['downloads'] = '下列插件安装成功:'; -$lang['download_none'] = '未找到插件,或下载和安装过程中出现了未知错误。'; -$lang['plugin'] = '插件:'; -$lang['components'] = '组件'; -$lang['noinfo'] = '该插件没有任何信息,有可能是无效插件。'; -$lang['name'] = '名称:'; -$lang['date'] = '日期:'; -$lang['type'] = '类别:'; -$lang['desc'] = '描述:'; -$lang['author'] = '作者:'; -$lang['www'] = '网址:'; -$lang['error'] = '产生了未知错误。'; -$lang['error_download'] = '无法下载插件:%s'; -$lang['error_badurl'] = 'URL 可能有问题 - 从 URL 中无法得知文件名'; -$lang['error_dircreate'] = '无法创建用于接收下载文件的'; -$lang['error_decompress'] = '插件管理器无法解压下载的文件。这可能是由于下载出现错误,遇到这种情况,请您再次尝试;或者是压缩格式无法识别,遇到这种情况,您需要手动下载并安装该插件。'; -$lang['error_copy'] = '尝试安装插件 %s 的相关文件时产生一个复制错误:磁盘空间已满或文件访问权限错误。这可能是由于一个安装了一部分的插件,并使得您的维基系统不稳定。'; -$lang['error_delete'] = '尝试删除插件 %s 时产生一个错误。最有可能的情况是文件或路径的访问权限不够'; -$lang['enabled'] = '%s 插件启用'; -$lang['notenabled'] = '%s插件启用失败,请检查文件权限。'; -$lang['disabled'] = '%s 插件禁用'; -$lang['notdisabled'] = '%s插件禁用失败,请检查文件权限。'; -$lang['packageinstalled'] = '插件 (%d 插件: %s) 已成功安装。'; diff --git a/sources/lib/plugins/plugin/plugin.info.txt b/sources/lib/plugins/plugin/plugin.info.txt deleted file mode 100644 index cdf8668..0000000 --- a/sources/lib/plugins/plugin/plugin.info.txt +++ /dev/null @@ -1,7 +0,0 @@ -base plugin -author Christopher Smith -email chris@jalakai.co.uk -date 2013-02-20 -name Plugin Manager plugin -desc Manage and install plugins -url http://www.dokuwiki.org/plugin:plugin diff --git a/sources/lib/plugins/plugin/style.css b/sources/lib/plugins/plugin/style.css deleted file mode 100644 index 9433e60..0000000 --- a/sources/lib/plugins/plugin/style.css +++ /dev/null @@ -1,195 +0,0 @@ -/* - * admin plugin extension - style additions - * - * @author Christopher Smith chris@jalakai.co.uk - * @link http://wiki.jalakai.co.uk/dokuwiki/doku.php/tutorials/adminplugin - */ - -#plugin__manager h2 { - margin-left: 0; -} - -#plugin__manager form { - display: block; - margin: 0; - padding: 0; -} - -#plugin__manager legend { - display: none; -} - -#plugin__manager fieldset { - width: auto; -} - -#plugin__manager .button { - margin: 0; -} - -#plugin__manager p, -#plugin__manager label { - text-align: left; -} - -#plugin__manager .hidden { - display: none; -} - -#plugin__manager .new { - background: #dee7ec; -} - -/* IE won't understand but doesn't require it */ -#plugin__manager input[disabled] { - color: #ccc; - border-color: #ccc; -} - -#plugin__manager .pm_menu, -#plugin__manager .pm_info { - margin-left: 0; - text-align: left; -} - -[dir=rtl] #plugin__manager .pm_menu, -[dir=rtl] #plugin__manager .pm_info, -[dir=rtl] #plugin__manager p, -[dir=rtl] #plugin__manager label { - text-align: right; -} - -#plugin__manager .pm_menu { - float: left; - width: 48%; -} -[dir=rtl] #plugin__manager .pm_menu { - float: right; -} - -#plugin__manager .pm_info { - float: right; - width: 50%; -} -[dir=rtl] #plugin__manager .pm_info { - float: left; -} - -#plugin__manager .common fieldset { - margin: 0; - padding: 0 0 1.0em 0; - text-align: left; - border: none; -} -[dir=rtl] #plugin__manager .common fieldset { - text-align: right; -} - -#plugin__manager .common label { - padding: 0 0 0.5em 0; -} - -#plugin__manager .common input.edit { - width: 24em; - margin: 0.5em; -} - -#plugin__manager .plugins fieldset { - color: #000; - background: #fff; - text-align: right; - border-top: none; - border-right: none; - border-left: none; -} - -#plugin__manager .plugins fieldset.protected { - background: #fdd; - color: #000; -} - -#plugin__manager .plugins fieldset.disabled { - background: #e0e0e0; - color: #a8a8a8; -} - -#plugin__manager .plugins .legend { - color: #000; - background: inherit; - display: block; - margin: 0; - padding: 0; - font-size: 1em; - line-height: 1.4em; - font-weight: normal; - text-align: left; - float: left; - padding: 0; - clear: none; -} -[dir=rtl] #plugin__manager .plugins .legend { - text-align: right; - float: right; -} - -#plugin__manager .plugins .button { - font-size: 95%; -} - -#plugin__manager .plugins fieldset.buttons { - border: none; -} - -#plugin__manager .plugins fieldset.buttons .button { - float: left; -} -[dir=rtl] #plugin__manager .plugins .button { - float: left; - margin-right: 0.5em; -} -[dir=rtl] #plugin__manager .plugins fieldset.buttons .button { - float: right; -} - -#plugin__manager .pm_info h3 { - margin-left: 0; -} - -#plugin__manager .pm_info dl { - margin: 1em 0; - padding: 0; -} - -#plugin__manager .pm_info dt { - width: 6em; - float: left; - clear: left; - margin: 0; - padding: 0; -} -[dir=rtl] #plugin__manager .pm_info dt { - float: right; - clear: right; -} - -#plugin__manager .pm_info dd { - margin: 0 0 0 7em; - padding: 0; - background: none; -} -[dir=rtl] #plugin__manager .pm_info dd { - margin: 0 7em 0 0; -} - -#plugin__manager .plugins .enable { - float: left; - width: auto; - margin-right: 0.5em; -} -[dir=rtl] #plugin__manager .plugins .enable { - float: right; - margin-right: 0; - margin-left: 0.5em; -} - -/* end admin plugin styles */ diff --git a/sources/lib/plugins/popularity/lang/bg/lang.php b/sources/lib/plugins/popularity/lang/bg/lang.php index ba731c0..963b50e 100644 --- a/sources/lib/plugins/popularity/lang/bg/lang.php +++ b/sources/lib/plugins/popularity/lang/bg/lang.php @@ -1,7 +1,8 @@ * @author Kiril */ diff --git a/sources/lib/plugins/popularity/lang/et/lang.php b/sources/lib/plugins/popularity/lang/et/lang.php deleted file mode 100644 index ca1410a..0000000 --- a/sources/lib/plugins/popularity/lang/et/lang.php +++ /dev/null @@ -1,7 +0,0 @@ - - */ diff --git a/sources/lib/plugins/popularity/lang/hr/lang.php b/sources/lib/plugins/popularity/lang/hr/lang.php deleted file mode 100644 index 96f1d6a..0000000 --- a/sources/lib/plugins/popularity/lang/hr/lang.php +++ /dev/null @@ -1,8 +0,0 @@ - - * @author Dražen Odobašić - * @author Dejan Igrec dejan.igrec@gmail.com - */ diff --git a/sources/lib/plugins/popularity/lang/id/lang.php b/sources/lib/plugins/popularity/lang/id/lang.php deleted file mode 100644 index 1867f0f..0000000 --- a/sources/lib/plugins/popularity/lang/id/lang.php +++ /dev/null @@ -1,6 +0,0 @@ - - */ diff --git a/sources/lib/plugins/popularity/lang/kk/lang.php b/sources/lib/plugins/popularity/lang/kk/lang.php deleted file mode 100644 index dde5b95..0000000 --- a/sources/lib/plugins/popularity/lang/kk/lang.php +++ /dev/null @@ -1,6 +0,0 @@ - - */ diff --git a/sources/lib/plugins/popularity/lang/ms/lang.php b/sources/lib/plugins/popularity/lang/ms/lang.php deleted file mode 100644 index 77ad2a1..0000000 --- a/sources/lib/plugins/popularity/lang/ms/lang.php +++ /dev/null @@ -1,6 +0,0 @@ -popularity|инструмент]] собирает анонимные данные о вашей вики и позволяет вам отправить их разработчикам «ДокуВики». Эти данные помогут им понять, как именно используется «ДокуВики», и удостовериться, что принимаемые проектные решения соответствуют жизненным реалиям. +Этот [[doku>popularity|инструмент]] собирает анонимные данные о вашей вики и позволяет вам отправить их разработчикам «Докувики». Эти данные помогут им понять, как именно используется «Докувики», и удостовериться, что принимаемые проектные решения соответствуют жизненным реалиям. Отправляйте данные время от времени для того, чтобы сообщать разработчикам о том, что ваша вики «подросла». Отправленные вами данные будут идентифицированы по анонимному ID. -Собранные данные содержат такую информацию, как: версия «ДокуВики», количество и размер ваших страниц и файлов, установленные плагины, информацию об установленном PHP. +Собранные данные содержат такую информацию, как: версия «Докувики», количество и размер ваших страниц и файлов, установленные плагины, информацию об установленном PHP. Данные, которые будут отосланы, представлены ниже. Пожалуйста, используйте кнопку «Отправить данные», чтобы передать информацию. diff --git a/sources/lib/plugins/popularity/lang/vi/lang.php b/sources/lib/plugins/popularity/lang/vi/lang.php deleted file mode 100644 index 2933d88..0000000 --- a/sources/lib/plugins/popularity/lang/vi/lang.php +++ /dev/null @@ -1,5 +0,0 @@ -max_revs); + $pagelog = new PageChangeLog($id); + $old = $pagelog->getRevisions(0, $this->max_revs); if(count($old)){ foreach($old as $REV){ $data = rawWiki($id,$REV); diff --git a/sources/lib/plugins/revert/lang/af/lang.php b/sources/lib/plugins/revert/lang/af/lang.php deleted file mode 100644 index 1fff08d..0000000 --- a/sources/lib/plugins/revert/lang/af/lang.php +++ /dev/null @@ -1,5 +0,0 @@ - * @author uahello@gmail.com * @author Ahmad Abd-Elghany + * @author alhajr */ $lang['menu'] = 'مدير الاسترجاع'; $lang['filter'] = 'ابحث في الصفحات المتأذاة'; diff --git a/sources/lib/plugins/revert/lang/bg/lang.php b/sources/lib/plugins/revert/lang/bg/lang.php index 0819de0..5062a12 100644 --- a/sources/lib/plugins/revert/lang/bg/lang.php +++ b/sources/lib/plugins/revert/lang/bg/lang.php @@ -1,6 +1,8 @@ * @author Viktor Usunov * @author Kiril diff --git a/sources/lib/plugins/revert/lang/cs/lang.php b/sources/lib/plugins/revert/lang/cs/lang.php index b9e7284..69abaaa 100644 --- a/sources/lib/plugins/revert/lang/cs/lang.php +++ b/sources/lib/plugins/revert/lang/cs/lang.php @@ -15,6 +15,7 @@ * @author mkucera66@seznam.cz * @author Zbyněk Křivka * @author Gerrit Uitslag + * @author Petr Klíma */ $lang['menu'] = 'Obnova zaspamovaných stránek'; $lang['filter'] = 'Hledat zaspamované stránky'; diff --git a/sources/lib/plugins/revert/lang/et/lang.php b/sources/lib/plugins/revert/lang/et/lang.php index ca1410a..be8fb26 100644 --- a/sources/lib/plugins/revert/lang/et/lang.php +++ b/sources/lib/plugins/revert/lang/et/lang.php @@ -1,7 +1,9 @@ + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * + * @author Janar Leas */ +$lang['note1'] = 'Teadmiseks: See otsing arvestab suurtähti'; +$lang['note2'] = 'Teadmiseks: Lehekülg ennistatakse viimasele järgule, milles ei sisaldu antud rämpsu sõne %s.'; diff --git a/sources/lib/plugins/revert/lang/hi/lang.php b/sources/lib/plugins/revert/lang/hi/lang.php deleted file mode 100644 index d6f78ff..0000000 --- a/sources/lib/plugins/revert/lang/hi/lang.php +++ /dev/null @@ -1,7 +0,0 @@ - - * @author yndesai@gmail.com - */ diff --git a/sources/lib/plugins/revert/lang/hr/lang.php b/sources/lib/plugins/revert/lang/hr/lang.php deleted file mode 100644 index 96f1d6a..0000000 --- a/sources/lib/plugins/revert/lang/hr/lang.php +++ /dev/null @@ -1,8 +0,0 @@ - - * @author Dražen Odobašić - * @author Dejan Igrec dejan.igrec@gmail.com - */ diff --git a/sources/lib/plugins/revert/lang/hu/lang.php b/sources/lib/plugins/revert/lang/hu/lang.php index d16764a..278af18 100644 --- a/sources/lib/plugins/revert/lang/hu/lang.php +++ b/sources/lib/plugins/revert/lang/hu/lang.php @@ -10,9 +10,10 @@ * @author Sándor TIHANYI * @author David Szabo * @author Marton Sebok + * @author Marina Vladi */ -$lang['menu'] = 'Visszaállítás kezelő (anti-SPAM)'; -$lang['filter'] = 'SPAM tartalmú oldalak keresése'; +$lang['menu'] = 'Visszaállítás-kezelő (anti-SPAM)'; +$lang['filter'] = 'SPAM-tartalmú oldalak keresése'; $lang['revert'] = 'Kiválasztott oldalak visszaállítása'; $lang['reverted'] = '%s a következő változatra lett visszaállítva: %s'; $lang['removed'] = '%s törölve'; diff --git a/sources/lib/plugins/revert/lang/id-ni/lang.php b/sources/lib/plugins/revert/lang/id-ni/lang.php deleted file mode 100644 index d367340..0000000 --- a/sources/lib/plugins/revert/lang/id-ni/lang.php +++ /dev/null @@ -1,7 +0,0 @@ - - * @author Yustinus Waruwu - */ diff --git a/sources/lib/plugins/revert/lang/id/lang.php b/sources/lib/plugins/revert/lang/id/lang.php deleted file mode 100644 index c3d4859..0000000 --- a/sources/lib/plugins/revert/lang/id/lang.php +++ /dev/null @@ -1,7 +0,0 @@ - - * @author Yustinus Waruwu - */ diff --git a/sources/lib/plugins/revert/lang/kk/lang.php b/sources/lib/plugins/revert/lang/kk/lang.php deleted file mode 100644 index dde5b95..0000000 --- a/sources/lib/plugins/revert/lang/kk/lang.php +++ /dev/null @@ -1,6 +0,0 @@ - - */ diff --git a/sources/lib/plugins/revert/lang/mk/lang.php b/sources/lib/plugins/revert/lang/mk/lang.php deleted file mode 100644 index 6d4530f..0000000 --- a/sources/lib/plugins/revert/lang/mk/lang.php +++ /dev/null @@ -1,6 +0,0 @@ - - */ diff --git a/sources/lib/plugins/revert/lang/ms/lang.php b/sources/lib/plugins/revert/lang/ms/lang.php deleted file mode 100644 index 77ad2a1..0000000 --- a/sources/lib/plugins/revert/lang/ms/lang.php +++ /dev/null @@ -1,6 +0,0 @@ - * @author Thomas Juberg * @author Boris + * @author Christopher Schive */ $lang['menu'] = 'Tilbakestillingsbehandler'; $lang['filter'] = 'Søk etter søppelmeldinger'; diff --git a/sources/lib/plugins/revert/lang/sv/lang.php b/sources/lib/plugins/revert/lang/sv/lang.php index c30f82d..e605a17 100644 --- a/sources/lib/plugins/revert/lang/sv/lang.php +++ b/sources/lib/plugins/revert/lang/sv/lang.php @@ -18,6 +18,7 @@ * @author Smorkster Andersson smorkster@gmail.com * @author Henrik * @author Tor Härnqvist + * @author Hans Iwan Bratt */ $lang['menu'] = 'Hantera återställningar'; $lang['filter'] = 'Sök efter spamsidor'; diff --git a/sources/lib/plugins/revert/lang/vi/lang.php b/sources/lib/plugins/revert/lang/vi/lang.php deleted file mode 100644 index 2933d88..0000000 --- a/sources/lib/plugins/revert/lang/vi/lang.php +++ /dev/null @@ -1,5 +0,0 @@ -getLang() - var $configloaded = false; // set to true by loadConfig() after loading plugin configuration variables - var $conf = array(); // array to hold plugin settings, best accessed via ->getConf() - - /** - * General Info - * - * Needs to return a associative array with the following values: - * - * author - Author of the plugin - * email - Email address to contact the author - * date - Last modified date of the plugin in YYYY-MM-DD format - * name - Name of the plugin - * desc - Short description of the plugin (Text only) - * url - Website with more information on the plugin (eg. syntax description) - */ - function getInfo(){ - $parts = explode('_',get_class($this)); - $info = DOKU_PLUGIN.'/'.$parts[2].'/plugin.info.txt'; - if(@file_exists($info)) return confToHash($info); - trigger_error('getInfo() not implemented in '.get_class($this).' and '.$info.' not found', E_USER_WARNING); - return array(); - } /** * Syntax Type @@ -87,10 +63,10 @@ class DokuWiki_Syntax_Plugin extends Doku_Parser_Mode { * @param string $match The text matched by the patterns * @param int $state The lexer state for the match * @param int $pos The character position of the matched text - * @param Doku_Handler $handler Reference to the Doku_Handler object + * @param Doku_Handler $handler The Doku_Handler object * @return array Return an array with all data you want to use in render */ - function handle($match, $state, $pos, Doku_Handler &$handler){ + function handle($match, $state, $pos, Doku_Handler $handler){ trigger_error('handle() not implemented in '.get_class($this), E_USER_WARNING); } @@ -113,11 +89,11 @@ class DokuWiki_Syntax_Plugin extends Doku_Parser_Mode { * created * * @param $format string output format being rendered - * @param $renderer Doku_Renderer reference to the current renderer object + * @param $renderer Doku_Renderer the current renderer object * @param $data array data created by handler() * @return boolean rendered correctly? */ - function render($format, Doku_Renderer &$renderer, $data) { + function render($format, Doku_Renderer $renderer, $data) { trigger_error('render() not implemented in '.get_class($this), E_USER_WARNING); } @@ -144,167 +120,5 @@ class DokuWiki_Syntax_Plugin extends Doku_Parser_Mode { return parent::accepts($mode); } - - // plugin introspection methods - // extract from class name, format = _plugin_[_] - function getPluginType() { list($t) = explode('_', get_class($this), 2); return $t; } - function getPluginName() { list($t, $p, $n) = explode('_', get_class($this), 4); return $n; } - - /** - * Get the name of the component of the current class - * - * @return string component name - */ - function getPluginComponent() { list($t, $p, $n, $c) = explode('_', get_class($this), 4); return (isset($c)?$c:''); } - - // localisation methods - /** - * getLang($id) - * - * use this function to access plugin language strings - * to try to minimise unnecessary loading of the strings when the plugin doesn't require them - * e.g. when info plugin is querying plugins for information about themselves. - * - * @param string $id id of the string to be retrieved - * @return string string in appropriate language or english if not available - */ - function getLang($id) { - if (!$this->localised) $this->setupLocale(); - - return (isset($this->lang[$id]) ? $this->lang[$id] : ''); - } - - /** - * locale_xhtml($id) - * - * retrieve a language dependent wiki page and pass to xhtml renderer for display - * plugin equivalent of p_locale_xhtml() - * - * @param string $id id of language dependent wiki page - * @return string parsed contents of the wiki page in xhtml format - */ - function locale_xhtml($id) { - return p_cached_output($this->localFN($id)); - } - - /** - * localFN($id) - * prepends appropriate path for a language dependent filename - * plugin equivalent of localFN() - */ - function localFN($id) { - global $conf; - $plugin = $this->getPluginName(); - $file = DOKU_CONF.'/plugin_lang/'.$plugin.'/'.$conf['lang'].'/'.$id.'.txt'; - if (!@file_exists($file)){ - $file = DOKU_PLUGIN.$plugin.'/lang/'.$conf['lang'].'/'.$id.'.txt'; - if(!@file_exists($file)){ - //fall back to english - $file = DOKU_PLUGIN.$plugin.'/lang/en/'.$id.'.txt'; - } - } - return $file; - } - - /** - * setupLocale() - * reads all the plugins language dependent strings into $this->lang - * this function is automatically called by getLang() - */ - function setupLocale() { - if ($this->localised) return; - - global $conf; // definitely don't invoke "global $lang" - $path = DOKU_PLUGIN.$this->getPluginName().'/lang/'; - - $lang = array(); - // don't include once, in case several plugin components require the same language file - @include($path.'en/lang.php'); - if ($conf['lang'] != 'en') @include($path.$conf['lang'].'/lang.php'); - - $this->lang = $lang; - $this->localised = true; - } - - // configuration methods - /** - * getConf($setting) - * - * use this function to access plugin configuration variables - */ - function getConf($setting) { - - if(!$this->configloaded) { $this->loadConfig(); } - - return $this->conf[$setting]; - } - - /** - * loadConfig() - * merges the plugin's default settings with any local settings - * this function is automatically called through getConf() - */ - function loadConfig() { - global $conf; - - $defaults = $this->readDefaultSettings(); - $plugin = $this->getPluginName(); - - foreach($defaults as $key => $value) { - if(isset($conf['plugin'][$plugin][$key])) continue; - $conf['plugin'][$plugin][$key] = $value; - } - - $this->configloaded = true; - $this->conf =& $conf['plugin'][$plugin]; - } - - /** - * read the plugin's default configuration settings from conf/default.php - * this function is automatically called through getConf() - * - * @return array setting => value - */ - function readDefaultSettings() { - - $path = DOKU_PLUGIN.$this->getPluginName().'/conf/'; - $conf = array(); - - if(@file_exists($path.'default.php')) { - include($path.'default.php'); - } - - return $conf; - } - - /** - * Loads a given helper plugin (if enabled) - * - * @author Esther Brunner - * - * @param string $name name of plugin to load - * @param bool $msg if a message should be displayed in case the plugin is not available - * - * @return object helper plugin object - */ - function loadHelper($name, $msg = true) { - if(!plugin_isdisabled($name)) { - $obj = plugin_load('helper', $name); - } else { - $obj = null; - } - if(is_null($obj) && $msg) msg("Helper plugin $name is not available or invalid.", -1); - return $obj; - } - - /** - * Allow the plugin to prevent DokuWiki from reusing an instance - * - * @return bool false if the plugin has to be instantiated - */ - function isSingleton() { - return true; - } - } //Setup VIM: ex: et ts=4 : diff --git a/sources/lib/plugins/testing/action.php b/sources/lib/plugins/testing/action.php deleted file mode 100644 index a242ab0..0000000 --- a/sources/lib/plugins/testing/action.php +++ /dev/null @@ -1,20 +0,0 @@ - - */ -class action_plugin_testing extends DokuWiki_Action_Plugin { - - function register(Doku_Event_Handler $controller) { - $controller->register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'dokuwikiStarted'); - } - - function dokuwikiStarted() { - $param = array(); - trigger_event('TESTING_PLUGIN_INSTALLED', $param); - msg('The testing plugin is enabled and should be disabled.',-1); - } -} diff --git a/sources/lib/plugins/testing/plugin.info.txt b/sources/lib/plugins/testing/plugin.info.txt deleted file mode 100644 index 64ab0b6..0000000 --- a/sources/lib/plugins/testing/plugin.info.txt +++ /dev/null @@ -1,7 +0,0 @@ -base testing -author Tobias Sarnowski -email tobias@trustedco.de -date 2012-07-28 -name Testing Plugin -desc Used to test the test framework. Should always be disabled. -url http://www.dokuwiki.org/plugin:testing diff --git a/sources/lib/plugins/usermanager/admin.php b/sources/lib/plugins/usermanager/admin.php index 156037f..b67d91b 100644 --- a/sources/lib/plugins/usermanager/admin.php +++ b/sources/lib/plugins/usermanager/admin.php @@ -53,7 +53,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin { } // attempt to retrieve any import failures from the session - if ($_SESSION['import_failures']){ + if (!empty($_SESSION['import_failures'])){ $this->_import_failures = $_SESSION['import_failures']; } } @@ -277,6 +277,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin { protected function _htmlUserForm($cmd,$user='',$userdata=array(),$indent=0) { global $conf; global $ID; + global $lang; $name = $mail = $groups = ''; $notes = array(); @@ -299,6 +300,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin { $this->_htmlInputField($cmd."_userid", "userid", $this->lang["user_id"], $user, $this->_auth->canDo("modLogin"), $indent+6); $this->_htmlInputField($cmd."_userpass", "userpass", $this->lang["user_pass"], "", $this->_auth->canDo("modPass"), $indent+6); + $this->_htmlInputField($cmd."_userpass2", "userpass2", $lang["passchk"], "", $this->_auth->canDo("modPass"), $indent+6); $this->_htmlInputField($cmd."_username", "username", $this->lang["user_name"], $name, $this->_auth->canDo("modName"), $indent+6); $this->_htmlInputField($cmd."_usermail", "usermail", $this->lang["user_mail"], $mail, $this->_auth->canDo("modMail"), $indent+6); $this->_htmlInputField($cmd."_usergroups","usergroups",$this->lang["user_groups"],$groups,$this->_auth->canDo("modGroups"),$indent+6); @@ -358,7 +360,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin { $class = $cando ? '' : ' class="disabled"'; echo str_pad('',$indent); - if($name == 'userpass'){ + if($name == 'userpass' || $name == 'userpass2'){ $fieldtype = 'password'; $autocomp = 'autocomplete="off"'; }elseif($name == 'usermail'){ @@ -475,7 +477,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin { if (!checkSecurityToken()) return false; if (!$this->_auth->canDo('addUser')) return false; - list($user,$pass,$name,$mail,$grps) = $this->_retrieveUser(); + list($user,$pass,$name,$mail,$grps,$passconfirm) = $this->_retrieveUser(); if (empty($user)) return false; if ($this->_auth->canDo('modPass')){ @@ -486,6 +488,10 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin { msg($this->lang['add_fail'], -1); return false; } + } else { + if (!$this->_verifyPassword($pass,$passconfirm)) { + return false; + } } } else { if (!empty($pass)){ @@ -606,7 +612,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin { $oldinfo = $this->_auth->getUserData($olduser); // get new user data subject to change - list($newuser,$newpass,$newname,$newmail,$newgrps) = $this->_retrieveUser(); + list($newuser,$newpass,$newname,$newmail,$newgrps,$passconfirm) = $this->_retrieveUser(); if (empty($newuser)) return false; $changes = array(); @@ -625,27 +631,37 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin { $changes['user'] = $newuser; } } - - // generate password if left empty and notification is on - if($INPUT->has('usernotify') && empty($newpass)){ - $newpass = auth_pwgen($olduser); + if ($this->_auth->canDo('modPass')) { + if ($newpass || $passconfirm) { + if ($this->_verifyPassword($newpass,$passconfirm)) { + $changes['pass'] = $newpass; + } else { + return false; + } + } else { + // no new password supplied, check if we need to generate one (or it stays unchanged) + if ($INPUT->has('usernotify')) { + $changes['pass'] = auth_pwgen($olduser); + } + } } - if (!empty($newpass) && $this->_auth->canDo('modPass')) - $changes['pass'] = $newpass; - if (!empty($newname) && $this->_auth->canDo('modName') && $newname != $oldinfo['name']) - $changes['name'] = $newname; - if (!empty($newmail) && $this->_auth->canDo('modMail') && $newmail != $oldinfo['mail']) - $changes['mail'] = $newmail; - if (!empty($newgrps) && $this->_auth->canDo('modGroups') && $newgrps != $oldinfo['grps']) - $changes['grps'] = $newgrps; + if (!empty($newname) && $this->_auth->canDo('modName') && $newname != $oldinfo['name']) { + $changes['name'] = $newname; + } + if (!empty($newmail) && $this->_auth->canDo('modMail') && $newmail != $oldinfo['mail']) { + $changes['mail'] = $newmail; + } + if (!empty($newgrps) && $this->_auth->canDo('modGroups') && $newgrps != $oldinfo['grps']) { + $changes['grps'] = $newgrps; + } if ($ok = $this->_auth->triggerUserMod('modify', array($olduser, $changes))) { msg($this->lang['update_ok'],1); - if ($INPUT->has('usernotify') && $newpass) { + if ($INPUT->has('usernotify') && !empty($changes['pass'])) { $notify = empty($changes['user']) ? $olduser : $newuser; - $this->_notifyUser($notify,$newpass); + $this->_notifyUser($notify,$changes['pass']); } // invalidate all sessions @@ -685,6 +701,32 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin { return $sent; } + /** + * Verify password meets minimum requirements + * :TODO: extend to support password strength + * + * @param string $password candidate string for new password + * @param string $confirm repeated password for confirmation + * @return bool true if meets requirements, false otherwise + */ + protected function _verifyPassword($password, $confirm) { + global $lang; + + if (empty($password) && empty($confirm)) { + return false; + } + + if ($password !== $confirm) { + msg($lang['regbadpass'], -1); + return false; + } + + // :TODO: test password for required strength + + // if we make it this far the password is good + return true; + } + /** * Retrieve & clean user data from the form * @@ -701,6 +743,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin { $user[2] = $INPUT->str('username'); $user[3] = $INPUT->str('usermail'); $user[4] = explode(',',$INPUT->str('usergroups')); + $user[5] = $INPUT->str('userpass2'); // repeated password for confirmation $user[4] = array_map('trim',$user[4]); if($clean) $user[4] = array_map(array($auth,'cleanGroup'),$user[4]); diff --git a/sources/lib/plugins/usermanager/lang/bg/lang.php b/sources/lib/plugins/usermanager/lang/bg/lang.php index 9ed27f4..aadf765 100644 --- a/sources/lib/plugins/usermanager/lang/bg/lang.php +++ b/sources/lib/plugins/usermanager/lang/bg/lang.php @@ -1,7 +1,8 @@ * @author Viktor Usunov * @author Kiril @@ -40,10 +41,10 @@ $lang['next'] = 'напред'; $lang['last'] = 'край'; $lang['edit_usermissing'] = 'Избраният потребител не е намерен, въведеното потребителско име може да е изтрито или променено другаде.'; $lang['user_notify'] = 'Уведомяване на потребителя'; -$lang['note_notify'] = 'Ел. писмо се изпраща само ако бъде променена паролата на потребителя.'; +$lang['note_notify'] = 'Имейл се изпраща само ако бъде променена паролата на потребителя.'; $lang['note_group'] = 'Новите потребители биват добавяни към стандартната групата (%s) ако не е посочена друга.'; $lang['note_pass'] = 'Паролата ще бъде генерирана автоматично, ако оставите полето празно и функцията за уведомяване на потребителя е включена.'; $lang['add_ok'] = 'Добавянето на потребителя е успешно'; $lang['add_fail'] = 'Добавянето на потребителя се провали'; -$lang['notify_ok'] = 'Изпратено е осведомително ел. писмо'; -$lang['notify_fail'] = 'Изпращането на осведомително ел. писмо не е възможно'; +$lang['notify_ok'] = 'Изпратено е осведомителен имейл'; +$lang['notify_fail'] = 'Изпращането на осведомителен имейл не е възможно'; diff --git a/sources/lib/plugins/usermanager/lang/cs/import.txt b/sources/lib/plugins/usermanager/lang/cs/import.txt index c264ae1..d665838 100644 --- a/sources/lib/plugins/usermanager/lang/cs/import.txt +++ b/sources/lib/plugins/usermanager/lang/cs/import.txt @@ -2,7 +2,7 @@ Vyžaduje CSV soubor s uživateli obsahující alespoň 4 sloupce. Sloupce obsahují (v daném pořadí): user-id, celé jméno, emailovou adresu, seznam skupin. -Položky CSV musí být odděleny čárkou (,) a řetězce umístěny v uvozovkách (""). Zpětné lomítko (\) lze použít pro escapování. +Položky CSV musí být odděleny čárkou (,) a řetězce umístěny v uvozovkách (%%""%%). Zpětné lomítko (\) lze použít pro escapování. Pro získání příkladu takového souboru využijte funkci "Exportovat uživatele" výše. Záznamy s duplicitním user-id budou ignorovány. diff --git a/sources/lib/plugins/usermanager/lang/de-informal/import.txt b/sources/lib/plugins/usermanager/lang/de-informal/import.txt index 6fd6b8d..bc88871 100644 --- a/sources/lib/plugins/usermanager/lang/de-informal/import.txt +++ b/sources/lib/plugins/usermanager/lang/de-informal/import.txt @@ -1,7 +1,7 @@ ===== Massenimport von Benutzern ===== Dieser Import benötigt eine CSV-Datei mit mindestens vier Spalten. Diese Spalten müssen die folgenden Daten (in dieser Reihenfolge) enthalten: Benutzername, Name, E-Mailadresse und Gruppenzugehörigkeit. -Die CSV-Felder müssen durch ein Komma (,) getrennt sein. Die Zeichenfolgen müssen von Anführungszeichen ("") umgeben sein. Ein Backslash (\) kann zum Maskieren benutzt werden. +Die CSV-Felder müssen durch ein Komma (,) getrennt sein. Die Zeichenfolgen müssen von Anführungszeichen (%%""%%) umgeben sein. Ein Backslash (\) kann zum Maskieren benutzt werden. Für eine Beispieldatei kannst Du die "Benutzer exportieren"-Funktion oben benutzen. Doppelte Benutzername werden ignoriert. Ein Passwort wird generiert und den einzelnen, erfolgreich importierten Benutzern zugemailt. \ No newline at end of file diff --git a/sources/lib/plugins/usermanager/lang/de/import.txt b/sources/lib/plugins/usermanager/lang/de/import.txt index bf0d292..7faca3b 100644 --- a/sources/lib/plugins/usermanager/lang/de/import.txt +++ b/sources/lib/plugins/usermanager/lang/de/import.txt @@ -1,7 +1,7 @@ ===== Benutzer-Massenimport ===== Um mehrere Benutzer gleichzeitig zu importieren, wird eine CSV-Datei mit den folgenden vier Spalten benötigt (In dieser Reihenfolge): Benutzer-ID, Voller Name, E-Mail-Adresse und Gruppen. -Die CSV-Felder sind Kommata-separiert (,) und mit Anführungszeichen eingefasst ("). Mit Backslashes (\) können Sonderzeichen maskiert werden. +Die CSV-Felder sind Kommata-separiert (,) und mit Anführungszeichen eingefasst (%%"%%). Mit Backslashes (\) können Sonderzeichen maskiert werden. Ein Beispiel für eine gültige Datei kann mit der Benutzer-Export-Funktion oben generiert werden. Doppelte Benutzer-IDs werden ignoriert. diff --git a/sources/lib/plugins/usermanager/lang/en/import.txt b/sources/lib/plugins/usermanager/lang/en/import.txt index 2087083..360a068 100644 --- a/sources/lib/plugins/usermanager/lang/en/import.txt +++ b/sources/lib/plugins/usermanager/lang/en/import.txt @@ -2,7 +2,7 @@ Requires a CSV file of users with at least four columns. The columns must contain, in order: user-id, full name, email address and groups. -The CSV fields should be separated by commas (,) and strings delimited by quotation marks (""). Backslash (\) can be used for escaping. +The CSV fields should be separated by commas (,) and strings delimited by quotation marks (%%""%%). Backslash (\) can be used for escaping. For an example of a suitable file, try the "Export Users" function above. Duplicate user-ids will be ignored. diff --git a/sources/lib/plugins/usermanager/lang/en/lang.php b/sources/lib/plugins/usermanager/lang/en/lang.php index f87c77a..b55ecc9 100644 --- a/sources/lib/plugins/usermanager/lang/en/lang.php +++ b/sources/lib/plugins/usermanager/lang/en/lang.php @@ -76,4 +76,3 @@ $lang['import_error_create'] = 'Unable to create the user'; $lang['import_notify_fail'] = 'Notification message could not be sent for imported user, %s with email %s.'; $lang['import_downloadfailures'] = 'Download Failures as CSV for correction'; - diff --git a/sources/lib/plugins/usermanager/lang/eo/import.txt b/sources/lib/plugins/usermanager/lang/eo/import.txt index 61c2c74..09fbe69 100644 --- a/sources/lib/plugins/usermanager/lang/eo/import.txt +++ b/sources/lib/plugins/usermanager/lang/eo/import.txt @@ -2,7 +2,7 @@ Tio ĉi postulas CSV-dosiero de uzantoj kun minimume kvar kolumnoj. La kolumnoj devas enhavi, laŭorde: uzant-id, kompleta nomo, retadreso kaj grupoj. -La CSV-kampoj devos esti apartitaj per komoj (,) kaj ĉenoj devas esti limigitaj per citiloj (""). Retroklino (\) povas esti uzata por eskapo. +La CSV-kampoj devos esti apartitaj per komoj (,) kaj ĉenoj devas esti limigitaj per citiloj (%%""%%). Retroklino (\) povas esti uzata por eskapo. Por ekzemplo de taŭga dosiero, provu la funkcion "Eksporti uzantojn" supre. Duobligitaj uzant-id estos preteratentataj. diff --git a/sources/lib/plugins/usermanager/lang/es/lang.php b/sources/lib/plugins/usermanager/lang/es/lang.php index 26e4200..317fac2 100644 --- a/sources/lib/plugins/usermanager/lang/es/lang.php +++ b/sources/lib/plugins/usermanager/lang/es/lang.php @@ -24,6 +24,7 @@ * @author Ruben Figols * @author Gerardo Zamudio * @author Mercè López mercelz@gmail.com + * @author Antonio Bueno */ $lang['menu'] = 'Administración de usuarios'; $lang['noauth'] = '(la autenticación de usuarios no está disponible)'; @@ -46,6 +47,8 @@ $lang['search'] = 'Buscar'; $lang['search_prompt'] = 'Realizar la búsqueda'; $lang['clear'] = 'Limpiar los filtros de la búsqueda'; $lang['filter'] = 'Filtrar'; +$lang['line'] = 'Línea nº'; +$lang['error'] = 'Mensaje de error'; $lang['summary'] = 'Mostrando los usuarios %1$d-%2$d de %3$d encontrados. Cantidad total de usuarios %4$d.'; $lang['nonefound'] = 'No se encontraron usuarios que coincidan con los párametros de la búsqueda. Cantidad total de usuarios %d.'; $lang['delete_ok'] = '%d usuarios eliminados'; diff --git a/sources/lib/plugins/usermanager/lang/et/lang.php b/sources/lib/plugins/usermanager/lang/et/lang.php index 2161df9..deb1e0b 100644 --- a/sources/lib/plugins/usermanager/lang/et/lang.php +++ b/sources/lib/plugins/usermanager/lang/et/lang.php @@ -1,16 +1,18 @@ + * @author Janar Leas */ $lang['menu'] = 'Kasutajate haldamine'; $lang['user_id'] = 'Kasutaja'; $lang['user_pass'] = 'Parool'; $lang['user_name'] = 'Tegelik nimi'; $lang['user_mail'] = 'E-post'; -$lang['user_groups'] = 'Grupid'; +$lang['user_groups'] = 'Rühmad'; $lang['field'] = 'Väli'; $lang['value'] = 'Väärtus'; $lang['add'] = 'Lisa'; @@ -28,3 +30,4 @@ $lang['prev'] = 'eelmine'; $lang['next'] = 'järgmine'; $lang['last'] = 'viimased'; $lang['user_notify'] = 'Teavita kasutajat'; +$lang['note_group'] = 'Kui rühma pole määratletud, siis lisatakse uued kasutajad vaikimisi rühma (%s).'; diff --git a/sources/lib/plugins/usermanager/lang/fr/import.txt b/sources/lib/plugins/usermanager/lang/fr/import.txt index 191bb83..a1eb8f8 100644 --- a/sources/lib/plugins/usermanager/lang/fr/import.txt +++ b/sources/lib/plugins/usermanager/lang/fr/import.txt @@ -3,7 +3,7 @@ Requière un fichier [[wpfr>CSV]] d'utilisateurs avec un minimum de quatre colonnes. Les colonnes doivent comporter, dans l'ordre : identifiant, nom complet, adresse de courriel et groupes. -Les champs doivent être séparés par une virgule (,), les chaînes sont délimitées par des guillemets (""). On peut utiliser la balance inverse (\) comme caractère d'échappement. +Les champs doivent être séparés par une virgule (,), les chaînes sont délimitées par des guillemets (%%""%%). On peut utiliser la balance inverse (\) comme caractère d'échappement. Pour obtenir un exemple de fichier acceptable, essayer la fonction "Exporter les utilisateurs" ci dessus. Les identifiants dupliqués seront ignorés. diff --git a/sources/lib/plugins/usermanager/lang/hi/lang.php b/sources/lib/plugins/usermanager/lang/hi/lang.php deleted file mode 100644 index d6f78ff..0000000 --- a/sources/lib/plugins/usermanager/lang/hi/lang.php +++ /dev/null @@ -1,7 +0,0 @@ - - * @author yndesai@gmail.com - */ diff --git a/sources/lib/plugins/usermanager/lang/hr/lang.php b/sources/lib/plugins/usermanager/lang/hr/lang.php deleted file mode 100644 index 96f1d6a..0000000 --- a/sources/lib/plugins/usermanager/lang/hr/lang.php +++ /dev/null @@ -1,8 +0,0 @@ - - * @author Dražen Odobašić - * @author Dejan Igrec dejan.igrec@gmail.com - */ diff --git a/sources/lib/plugins/usermanager/lang/hu/import.txt b/sources/lib/plugins/usermanager/lang/hu/import.txt index 5a4bc8b..0210112 100644 --- a/sources/lib/plugins/usermanager/lang/hu/import.txt +++ b/sources/lib/plugins/usermanager/lang/hu/import.txt @@ -1,9 +1,9 @@ ==== Felhasználók tömeges importálása ==== -Egy, legalább 4 oszlopot tartalmazó, felhasználóikat tartalmazó fájl szükséges hozzá. -Az oszlopok kötelező tartalma, megfelelő sorrendben: felhasználói azonosító, teljes név, e-mailcím és csoportjai. -A CSV mezőit vesszővel (,) kell elválasztani, a szövegeket idézőjelek ("") közé kell foglalni. -Mintafájl megtekintéséhez próbáld ki a fenti, "Felhasználók exportálása" funkciót. A fordított törtvonallal (\) lehet kilépni. -Megegyező felhasználói azonosítók esetén, nem kerülnek feldolgozásra. +Szükséges egy legalább 4 oszlopot tartalmazó, felhasználókat tartalmazó fájl. +Az oszlopok kötelező tartalma, sorrendben: felhasználói azonosító, teljes név, e-mailcím és csoport. +A CSV-mezőket vesszővel (,) kell elválasztani, a szövegeket idézőjelek (%%""%%) közé kell tenni. A fordított törtvonal (\) használható feloldójelnek. +Megfelelő mintafájl megtekintéséhez próbáld ki a "Felhasználók exportálása" funkciót fentebb. +A duplán szereplő felhasználói azonosítók kihagyásra kerülnek. -Minden sikeresen importált felhasználó kap egy e-mailt, amiben megtalálja a generált jelszavát. \ No newline at end of file +Minden sikeresen importált felhasználó számára jelszó készül, amelyet e-mailben kézhez kap. \ No newline at end of file diff --git a/sources/lib/plugins/usermanager/lang/hu/lang.php b/sources/lib/plugins/usermanager/lang/hu/lang.php index dd76bfd..963fcd1 100644 --- a/sources/lib/plugins/usermanager/lang/hu/lang.php +++ b/sources/lib/plugins/usermanager/lang/hu/lang.php @@ -11,6 +11,7 @@ * @author David Szabo * @author Marton Sebok * @author Serenity87HUN + * @author Marina Vladi */ $lang['menu'] = 'Felhasználók kezelése'; $lang['noauth'] = '(A felhasználói azonosítás nem működik.)'; @@ -58,14 +59,14 @@ $lang['add_ok'] = 'A felhasználó sikeresen hozzáadva.'; $lang['add_fail'] = 'A felhasználó hozzáadása nem sikerült.'; $lang['notify_ok'] = 'Értesítő levél elküldve.'; $lang['notify_fail'] = 'Nem sikerült az értesítő levelet elküldeni.'; -$lang['import_userlistcsv'] = 'Felhasználók listája fájl (CSV)'; +$lang['import_userlistcsv'] = 'Felhasználók listájának fájlja (CSV)'; $lang['import_header'] = 'Legutóbbi importálás - Hibák'; $lang['import_success_count'] = 'Felhasználók importálása: %d felhasználót találtunk, ebből %d sikeresen importálva.'; $lang['import_failure_count'] = 'Felhasználók importálása: %d sikertelen. A sikertelenség okait lejjebb találod.'; $lang['import_error_fields'] = 'Túl kevés mezőt adtál meg, %d darabot találtunk, legalább 4-re van szükség.'; $lang['import_error_baduserid'] = 'Felhasználói azonosító hiányzik'; -$lang['import_error_badname'] = 'Nem megfelelő név'; -$lang['import_error_badmail'] = 'Nem megfelelő e-mailcím'; +$lang['import_error_badname'] = 'Helytelen név'; +$lang['import_error_badmail'] = 'Helytelen e-mailcím'; $lang['import_error_upload'] = 'Sikertelen importálás. A csv fájl nem feltölthető vagy üres.'; $lang['import_error_readfail'] = 'Sikertelen importálás. A feltöltött fájl nem olvasható.'; $lang['import_error_create'] = 'Ez a felhasználó nem hozható létre'; diff --git a/sources/lib/plugins/usermanager/lang/id-ni/lang.php b/sources/lib/plugins/usermanager/lang/id-ni/lang.php deleted file mode 100644 index d367340..0000000 --- a/sources/lib/plugins/usermanager/lang/id-ni/lang.php +++ /dev/null @@ -1,7 +0,0 @@ - - * @author Yustinus Waruwu - */ diff --git a/sources/lib/plugins/usermanager/lang/ja/import.txt b/sources/lib/plugins/usermanager/lang/ja/import.txt index 751e515..6af87c2 100644 --- a/sources/lib/plugins/usermanager/lang/ja/import.txt +++ b/sources/lib/plugins/usermanager/lang/ja/import.txt @@ -2,7 +2,7 @@ 少なくとも4列のユーザーCSVファイルが必要です。 列の順序:ユーザーID、氏名、電子メールアドレス、グループ。 -CSVフィールドはカンマ(,)区切り、文字列は引用符("")区切りです。 +CSVフィールドはカンマ(,)区切り、文字列は引用符(%%""%%)区切りです。 エスケープにバックスラッシュ(\)を使用できます。 適切なファイル例は、上記の"エクスポートユーザー"機能で試して下さい。 重複するユーザーIDは無視されます。 diff --git a/sources/lib/plugins/usermanager/lang/ko/edit.txt b/sources/lib/plugins/usermanager/lang/ko/edit.txt index a938c5b..0b35cd7 100644 --- a/sources/lib/plugins/usermanager/lang/ko/edit.txt +++ b/sources/lib/plugins/usermanager/lang/ko/edit.txt @@ -1 +1 @@ -===== 사용자 정보 편집 ===== \ No newline at end of file +===== 사용자 편집 ===== \ No newline at end of file diff --git a/sources/lib/plugins/usermanager/lang/ko/import.txt b/sources/lib/plugins/usermanager/lang/ko/import.txt index 44fe392..6d077df 100644 --- a/sources/lib/plugins/usermanager/lang/ko/import.txt +++ b/sources/lib/plugins/usermanager/lang/ko/import.txt @@ -2,7 +2,7 @@ 적어도 열 네 개가 있는 사용자의 CSV 파일이 필요합니다. 열은 다음과 같이 포함해야 합니다: 사용자 id, 실명, 이메일 주소와 그룹. -CSV 필드는 인용 부호("")로 쉼표(,)와 구분된 문자열로 구분해야 합니다. 백슬래시(\)는 탈출에 사용할 수 있습니다. +CSV 필드는 인용 부호(%%""%%)로 쉼표(,)와 구분된 문자열로 구분해야 합니다. 백슬래시(\)는 탈출에 사용할 수 있습니다. 적절한 파일의 예를 들어, 위의 "사용자 목록 내보내기"를 시도하세요. 중복된 사용자 id는 무시됩니다. diff --git a/sources/lib/plugins/usermanager/lang/ko/intro.txt b/sources/lib/plugins/usermanager/lang/ko/intro.txt index d75680c..2ce85f1 100644 --- a/sources/lib/plugins/usermanager/lang/ko/intro.txt +++ b/sources/lib/plugins/usermanager/lang/ko/intro.txt @@ -1 +1 @@ -====== 사용자 관리 ====== \ No newline at end of file +====== 사용자 관리자 ====== \ No newline at end of file diff --git a/sources/lib/plugins/usermanager/lang/ko/lang.php b/sources/lib/plugins/usermanager/lang/ko/lang.php index ac129c9..70e3d94 100644 --- a/sources/lib/plugins/usermanager/lang/ko/lang.php +++ b/sources/lib/plugins/usermanager/lang/ko/lang.php @@ -44,7 +44,7 @@ $lang['delete_ok'] = '사용자 %d명이 삭제되었습니다'; $lang['delete_fail'] = '사용자 %d명을 삭제하는 데 실패했습니다.'; $lang['update_ok'] = '사용자 정보를 성공적으로 바꾸었습니다'; $lang['update_fail'] = '사용자 정보를 바꾸는 데 실패했습니다'; -$lang['update_exists'] = '사용자 이름을 바꾸는 데 실패했습니다. 사용자 이름(%s)이 이미 존재합니다. (다른 항목의 바뀜은 적용됩니다.)'; +$lang['update_exists'] = '사용자 이름을 바꾸는 데 실패했습니다. 사용자 이름(%s)이 이미 존재합니다. (다른 항목의 바뀜은 적용됩니다)'; $lang['start'] = '시작'; $lang['prev'] = '이전'; $lang['next'] = '다음'; diff --git a/sources/lib/plugins/usermanager/lang/lb/lang.php b/sources/lib/plugins/usermanager/lang/lb/lang.php deleted file mode 100644 index 59acdf7..0000000 --- a/sources/lib/plugins/usermanager/lang/lb/lang.php +++ /dev/null @@ -1,6 +0,0 @@ - * @author Ivan I. Udovichenko (sendtome@mymailbox.pp.ua) * @author Pavel + * @author Aleksandr Selivanov */ $lang['menu'] = 'Управление пользователями'; $lang['noauth'] = '(авторизация пользователей недоступна)'; @@ -72,7 +73,7 @@ $lang['import_error_fields'] = 'Не все поля заполнены. На $lang['import_error_baduserid'] = 'Отсутствует идентификатор пользователя'; $lang['import_error_badname'] = 'Имя не годится'; $lang['import_error_badmail'] = 'Адрес электронной почты не годится'; -$lang['import_error_upload'] = 'Импорт не удался. CSV файл не загружен или пуст.'; +$lang['import_error_upload'] = 'Импорт не удался. CSV-файл не загружен или пуст.'; $lang['import_error_readfail'] = 'Импорт не удался. Невозможно прочесть загруженный файл.'; $lang['import_error_create'] = 'Невозможно создать пользователя'; $lang['import_notify_fail'] = 'Оповещение не может быть отправлено импортированному пользователю %s по электронной почте %s.'; diff --git a/sources/lib/plugins/usermanager/lang/sk/import.txt b/sources/lib/plugins/usermanager/lang/sk/import.txt index 91fa3e3..2207f61 100644 --- a/sources/lib/plugins/usermanager/lang/sk/import.txt +++ b/sources/lib/plugins/usermanager/lang/sk/import.txt @@ -2,7 +2,7 @@ Vyžaduje CSV súbor používateľov s minimálne 4 stĺpcami. Stĺpce musia obsahovať postupne: ID používateľa, meno a priezvisko, emailová adresa a skupiny. -CVS záznamy by mali byť oddelené čiarkou (,) a reťazce uzavreté úvodzovkami (""). Znak (\) sa používa v spojení so špeciálnymi znakmi. +CVS záznamy by mali byť oddelené čiarkou (,) a reťazce uzavreté úvodzovkami (%%""%%). Znak (\) sa používa v spojení so špeciálnymi znakmi. Príklad vhodného súboru je možné získať funkciou "Export používateľov". Duplicitné ID používateľov budú ignorované. diff --git a/sources/lib/plugins/usermanager/lang/sk/lang.php b/sources/lib/plugins/usermanager/lang/sk/lang.php index 9aadbb5..535f779 100644 --- a/sources/lib/plugins/usermanager/lang/sk/lang.php +++ b/sources/lib/plugins/usermanager/lang/sk/lang.php @@ -51,7 +51,7 @@ $lang['note_notify'] = 'Notifikačné e-maily iba vtedy, ak dostane u $lang['note_group'] = 'Noví užívatelia budú pridaní do východzej skupiny (%s), ak nie je pre nich špecifikovaná iná skupina.'; $lang['note_pass'] = 'Heslo bude vygenerované automaticky, ak bude pole prázdne a je zapnutá notifikácia používateľa.'; $lang['add_ok'] = 'Používateľ úspešne pridaný'; -$lang['add_fail'] = 'Pridávanie užívateľa nebolo úspešné'; +$lang['add_fail'] = 'Pridanie používateľa bolo neúspešné'; $lang['notify_ok'] = 'Notifikačný e-mail bol poslaný'; $lang['notify_fail'] = 'Notifikačný e-mail nemohol byť poslaný'; $lang['import_userlistcsv'] = 'Súbor so zoznamov používateľov (CSV):'; diff --git a/sources/lib/plugins/usermanager/lang/sl/lang.php b/sources/lib/plugins/usermanager/lang/sl/lang.php index dc2de37..a10488e 100644 --- a/sources/lib/plugins/usermanager/lang/sl/lang.php +++ b/sources/lib/plugins/usermanager/lang/sl/lang.php @@ -8,6 +8,7 @@ * @author Gregor Skumavc (grega.skumavc@gmail.com) * @author Matej Urbančič (mateju@svn.gnome.org) * @author Matej Urbančič + * @author matej */ $lang['menu'] = 'Upravljanje uporabnikov'; $lang['noauth'] = '(overjanje istovetnosti uporabnikov ni na voljo)'; @@ -30,6 +31,8 @@ $lang['search'] = 'Iskanje'; $lang['search_prompt'] = 'Poišči'; $lang['clear'] = 'Počisti filter iskanja'; $lang['filter'] = 'Filter'; +$lang['export_all'] = 'Izvozi seznam vseh uporabnikov (CSV)'; +$lang['export_filtered'] = 'Izvozi filtriran seznam uporabnikov (CSV)'; $lang['import'] = 'Uvozi nove uporabnike'; $lang['line'] = 'Številka vrstice'; $lang['error'] = 'Sporočilo napake'; @@ -53,6 +56,10 @@ $lang['add_ok'] = 'Uporabnik je uspešno dodan'; $lang['add_fail'] = 'Dodajanje uporabnika je spodletelo'; $lang['notify_ok'] = 'Obvestilno sporočilo je poslano.'; $lang['notify_fail'] = 'Obvestilnega sporočila ni mogoče poslati.'; +$lang['import_userlistcsv'] = 'Datoteka seznama uporabnikov (CSV)'; +$lang['import_header'] = 'Zadnji uvoz podatkov – napake'; +$lang['import_success_count'] = 'Uvoz uporabnikov: %d najdenih, %d uspešno uvoženih.'; +$lang['import_failure_count'] = 'Uvoz uporabnikov: %d spodletelih. Napake so izpisane spodaj.'; $lang['import_error_fields'] = 'Neustrezno število polj; najdenih je %d, zahtevana pa so 4.'; $lang['import_error_baduserid'] = 'Manjka ID uporabnika'; $lang['import_error_badname'] = 'Napačno navedeno ime'; @@ -61,3 +68,4 @@ $lang['import_error_upload'] = 'Uvoz je spodletel. Datoteke CSV ni mogoče nal $lang['import_error_readfail'] = 'Uvoz je spodletel. Ni mogoče prebrati vsebine datoteke.'; $lang['import_error_create'] = 'Ni mogoče ustvariti računa uporabnika'; $lang['import_notify_fail'] = 'Obvestilnega sporočila za uvoženega uporabnika %s z elektronskim naslovom %s ni mogoče poslati.'; +$lang['import_downloadfailures'] = 'Prejmi podatke o napakah v datoteki CSV'; diff --git a/sources/lib/plugins/usermanager/lang/vi/lang.php b/sources/lib/plugins/usermanager/lang/vi/lang.php deleted file mode 100644 index 2933d88..0000000 --- a/sources/lib/plugins/usermanager/lang/vi/lang.php +++ /dev/null @@ -1,5 +0,0 @@ - * @author Rachel * @author Yangyu Huang + * @author oott123 */ $lang['menu'] = '用户管理器'; $lang['noauth'] = '(用户认证不可用)'; @@ -76,3 +77,4 @@ $lang['import_error_upload'] = '导入失败。CSV 文件无法上传或是空 $lang['import_error_readfail'] = '导入失败。无法读取上传的文件。'; $lang['import_error_create'] = '不能创建新用户'; $lang['import_notify_fail'] = '通知消息无法发送到导入的用户 %s,电子邮件地址是 %s。'; +$lang['import_downloadfailures'] = '下载CSV的错误信息以修正。'; diff --git a/sources/lib/scripts/behaviour.js b/sources/lib/scripts/behaviour.js index 85ddf50..6b46add 100644 --- a/sources/lib/scripts/behaviour.js +++ b/sources/lib/scripts/behaviour.js @@ -109,7 +109,7 @@ var dw_behaviour = { * @author Michael Klier */ checkWindowsShares: function() { - if(!LANG.nosmblinks || typeof(document.all) !== 'undefined') { + if(!LANG.nosmblinks || navigator.userAgent.match(/(Trident|MSIE)/)) { // No warning requested or none necessary return; } diff --git a/sources/lib/scripts/compatibility.js b/sources/lib/scripts/compatibility.js index 76b135b..fc020cc 100644 --- a/sources/lib/scripts/compatibility.js +++ b/sources/lib/scripts/compatibility.js @@ -77,9 +77,32 @@ var index = { }; var ajax_quicksearch = { - init: DEPRECATED_WRAP(dw_qsearch.init, dw_qsearch), - clear_results: DEPRECATED_WRAP(dw_qsearch.clear_results, dw_qsearch), - onCompletion: DEPRECATED_WRAP(dw_qsearch.onCompletion, dw_qsearch) + init: function() { + DEPRECATED('Use jQuery().dw_qsearch() instead'); + jQuery('#qsearch__in').dw_qsearch({ + output: '#qsearch__out' + }); + }, + clear_results: function() { + DEPRECATED('ajax_quicksearch.clear_results is removed'); + }, + onCompletion: function() { + DEPRECATED('ajax_quicksearch.onCompletion is removed'); + } +}; +var dw_qsearch = { + init: function(input, output) { + DEPRECATED('Use jQuery().dw_qsearch() instead'); + jQuery(input).dw_qsearch({ + output: output + }); + }, + clear_results: function() { + DEPRECATED('dw_qsearch.clear_results is removed'); + }, + onCompletion: function() { + DEPRECATED('dw_qsearch.onCompletion is removed'); + } }; var linkwiz = { diff --git a/sources/lib/scripts/edit.js b/sources/lib/scripts/edit.js index b1dbff6..c07b8f9 100644 --- a/sources/lib/scripts/edit.js +++ b/sources/lib/scripts/edit.js @@ -134,7 +134,10 @@ function pickerInsert(text,edid){ */ function addBtnActionSignature($btn, props, edid) { if(typeof SIG != 'undefined' && SIG != ''){ - $btn.bind('click', bind(insertAtCarret,edid,SIG)); + $btn.bind('click', function (e) { + insertAtCarret(edid,SIG); + e.preventDefault(); + }); return edid; } return ''; @@ -148,7 +151,7 @@ function addBtnActionSignature($btn, props, edid) { function currentHeadlineLevel(textboxId){ var field = jQuery('#' + textboxId)[0], s = false, - opts = [field.value.substr(0,getSelection(field).start)]; + opts = [field.value.substr(0,DWgetSelection(field).start)]; if (field.form.prefix) { // we need to look in prefix context opts.push(field.form.prefix.value); @@ -217,10 +220,10 @@ jQuery(function () { } // set focus and place cursor at the start - var sel = getSelection($edit_text[0]); + var sel = DWgetSelection($edit_text[0]); sel.start = 0; sel.end = 0; - setSelection(sel); + DWsetSelection(sel); $edit_text.focus(); } diff --git a/sources/lib/scripts/editor.js b/sources/lib/scripts/editor.js index 2c0924e..74919cb 100644 --- a/sources/lib/scripts/editor.js +++ b/sources/lib/scripts/editor.js @@ -134,7 +134,7 @@ var dw_editor = { if(jQuery.inArray(e.keyCode,[8, 13, 32]) === -1) { return; } - var selection = getSelection(this); + var selection = DWgetSelection(this); if(selection.getLength() > 0) { return; //there was text selected, keep standard behavior } @@ -155,7 +155,7 @@ var dw_editor = { this.value.substr(selection.start); selection.start = linestart + 1; selection.end = linestart + 1; - setSelection(selection); + DWsetSelection(selection); } else { insertAtCarret(this.id,match[1]); } @@ -180,7 +180,7 @@ var dw_editor = { selection.start = linestart; selection.end = linestart; } - setSelection(selection); + DWsetSelection(selection); e.preventDefault(); // prevent backspace return false; } @@ -192,7 +192,7 @@ var dw_editor = { this.value.substr(linestart); selection.start = selection.start + 2; selection.end = selection.start; - setSelection(selection); + DWsetSelection(selection); e.preventDefault(); // prevent space return false; } diff --git a/sources/lib/scripts/jquery/jquery-migrate.js b/sources/lib/scripts/jquery/jquery-migrate.js index 942cb8b..25b6c81 100644 --- a/sources/lib/scripts/jquery/jquery-migrate.js +++ b/sources/lib/scripts/jquery/jquery-migrate.js @@ -1,5 +1,5 @@ /*! - * jQuery Migrate - v1.1.1 - 2013-02-16 + * jQuery Migrate - v1.2.1 - 2013-05-08 * https://github.com/jquery/jquery-migrate * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT */ @@ -17,8 +17,8 @@ jQuery.migrateWarnings = []; // jQuery.migrateMute = false; // Show a message on the console so devs know we're active -if ( !jQuery.migrateMute && window.console && console.log ) { - console.log("JQMIGRATE: Logging is active"); +if ( !jQuery.migrateMute && window.console && window.console.log ) { + window.console.log("JQMIGRATE: Logging is active"); } // Set to false to disable traces that appear with warnings @@ -33,10 +33,11 @@ jQuery.migrateReset = function() { }; function migrateWarn( msg) { + var console = window.console; if ( !warnedAbout[ msg ] ) { warnedAbout[ msg ] = true; jQuery.migrateWarnings.push( msg ); - if ( window.console && console.warn && !jQuery.migrateMute ) { + if ( console && console.warn && !jQuery.migrateMute ) { console.warn( "JQMIGRATE: " + msg ); if ( jQuery.migrateTrace && console.trace ) { console.trace(); @@ -189,26 +190,35 @@ jQuery.attrHooks.value = { var matched, browser, oldInit = jQuery.fn.init, oldParseJSON = jQuery.parseJSON, - // Note this does NOT include the #9521 XSS fix from 1.7! - rquickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/; + // Note: XSS check is done below after string is trimmed + rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/; // $(html) "looks like html" rule change jQuery.fn.init = function( selector, context, rootjQuery ) { var match; if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) && - (match = rquickExpr.exec( selector )) && match[1] ) { + (match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) { // This is an HTML string according to the "old" rules; is it still? if ( selector.charAt( 0 ) !== "<" ) { migrateWarn("$(html) HTML strings must start with '<' character"); } + if ( match[ 3 ] ) { + migrateWarn("$(html) HTML text after last tag is ignored"); + } + // Consistently reject any HTML-like string starting with a hash (#9521) + // Note that this may break jQuery 1.6.x code that otherwise would work. + if ( match[ 0 ].charAt( 0 ) === "#" ) { + migrateWarn("HTML string cannot start with a '#' character"); + jQuery.error("JQMIGRATE: Invalid selector string (XSS)"); + } // Now process using loose rules; let pre-1.8 play too if ( context && context.context ) { // jQuery object as context; parseHTML expects a DOM object context = context.context; } if ( jQuery.parseHTML ) { - return oldInit.call( this, jQuery.parseHTML( jQuery.trim(selector), context, true ), + return oldInit.call( this, jQuery.parseHTML( match[ 2 ], context, true ), context, rootjQuery ); } } diff --git a/sources/lib/scripts/jquery/jquery-migrate.min.js b/sources/lib/scripts/jquery/jquery-migrate.min.js index eb3ecb1..62149c2 100644 --- a/sources/lib/scripts/jquery/jquery-migrate.min.js +++ b/sources/lib/scripts/jquery/jquery-migrate.min.js @@ -1,3 +1,2 @@ -/*! jQuery Migrate v1.1.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */ -jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){o[n]||(o[n]=!0,e.migrateWarnings.push(n),t.console&&console.warn&&!e.migrateMute&&(console.warn("JQMIGRATE: "+n),e.migrateTrace&&console.trace&&console.trace()))}function a(t,a,o,i){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(i),o},set:function(e){r(i),o=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=o}var o={};e.migrateWarnings=[],!e.migrateMute&&t.console&&console.log&&console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){o={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var i=e("",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",i||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,o,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(i?a in i:e.isFunction(e.fn[a])))?e(t)[a](o):("type"===a&&o!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,o=e.prop(t,r);return o===!0||"boolean"!=typeof o&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,o))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;e.fn.init=function(t,n,a){var o;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(o=y.exec(t))&&o[1]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(e.trim(t),n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,o,i=this[0];return!i||"events"!==t||1!==arguments.length||(a=e.data(i,t),o=e._data(i,t),a!==n&&a!==o||o===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),o)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,o,i){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),o)for(c=function(e){return!e.type||j.test(e.type)?i?i.push(e.parentNode?e.parentNode.removeChild(e):e):o.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(o.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,C=e.fn.live,S=e.fn.die,T="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",M=RegExp("\\b(?:"+T+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,o){e!==document&&M.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,o)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,o=t.guid||e.guid++,i=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%i;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=o;a.length>i;)a[i++].guid=o;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),C?C.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),S?S.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||M.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(T.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window); -//@ sourceMappingURL=dist/jquery-migrate.min.map \ No newline at end of file +/*! jQuery Migrate v1.2.1 | (c) 2005, 2013 jQuery Foundation, Inc. and other contributors | jquery.org/license */ +jQuery.migrateMute===void 0&&(jQuery.migrateMute=!0),function(e,t,n){function r(n){var r=t.console;i[n]||(i[n]=!0,e.migrateWarnings.push(n),r&&r.warn&&!e.migrateMute&&(r.warn("JQMIGRATE: "+n),e.migrateTrace&&r.trace&&r.trace()))}function a(t,a,i,o){if(Object.defineProperty)try{return Object.defineProperty(t,a,{configurable:!0,enumerable:!0,get:function(){return r(o),i},set:function(e){r(o),i=e}}),n}catch(s){}e._definePropertyBroken=!0,t[a]=i}var i={};e.migrateWarnings=[],!e.migrateMute&&t.console&&t.console.log&&t.console.log("JQMIGRATE: Logging is active"),e.migrateTrace===n&&(e.migrateTrace=!0),e.migrateReset=function(){i={},e.migrateWarnings.length=0},"BackCompat"===document.compatMode&&r("jQuery is not compatible with Quirks Mode");var o=e("",{size:1}).attr("size")&&e.attrFn,s=e.attr,u=e.attrHooks.value&&e.attrHooks.value.get||function(){return null},c=e.attrHooks.value&&e.attrHooks.value.set||function(){return n},l=/^(?:input|button)$/i,d=/^[238]$/,p=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,f=/^(?:checked|selected)$/i;a(e,"attrFn",o||{},"jQuery.attrFn is deprecated"),e.attr=function(t,a,i,u){var c=a.toLowerCase(),g=t&&t.nodeType;return u&&(4>s.length&&r("jQuery.fn.attr( props, pass ) is deprecated"),t&&!d.test(g)&&(o?a in o:e.isFunction(e.fn[a])))?e(t)[a](i):("type"===a&&i!==n&&l.test(t.nodeName)&&t.parentNode&&r("Can't change the 'type' of an input or button in IE 6/7/8"),!e.attrHooks[c]&&p.test(c)&&(e.attrHooks[c]={get:function(t,r){var a,i=e.prop(t,r);return i===!0||"boolean"!=typeof i&&(a=t.getAttributeNode(r))&&a.nodeValue!==!1?r.toLowerCase():n},set:function(t,n,r){var a;return n===!1?e.removeAttr(t,r):(a=e.propFix[r]||r,a in t&&(t[a]=!0),t.setAttribute(r,r.toLowerCase())),r}},f.test(c)&&r("jQuery.fn.attr('"+c+"') may use property instead of attribute")),s.call(e,t,a,i))},e.attrHooks.value={get:function(e,t){var n=(e.nodeName||"").toLowerCase();return"button"===n?u.apply(this,arguments):("input"!==n&&"option"!==n&&r("jQuery.fn.attr('value') no longer gets properties"),t in e?e.value:null)},set:function(e,t){var a=(e.nodeName||"").toLowerCase();return"button"===a?c.apply(this,arguments):("input"!==a&&"option"!==a&&r("jQuery.fn.attr('value', val) no longer sets properties"),e.value=t,n)}};var g,h,v=e.fn.init,m=e.parseJSON,y=/^([^<]*)(<[\w\W]+>)([^>]*)$/;e.fn.init=function(t,n,a){var i;return t&&"string"==typeof t&&!e.isPlainObject(n)&&(i=y.exec(e.trim(t)))&&i[0]&&("<"!==t.charAt(0)&&r("$(html) HTML strings must start with '<' character"),i[3]&&r("$(html) HTML text after last tag is ignored"),"#"===i[0].charAt(0)&&(r("HTML string cannot start with a '#' character"),e.error("JQMIGRATE: Invalid selector string (XSS)")),n&&n.context&&(n=n.context),e.parseHTML)?v.call(this,e.parseHTML(i[2],n,!0),n,a):v.apply(this,arguments)},e.fn.init.prototype=e.fn,e.parseJSON=function(e){return e||null===e?m.apply(this,arguments):(r("jQuery.parseJSON requires a valid JSON string"),null)},e.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||0>e.indexOf("compatible")&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e.browser||(g=e.uaMatch(navigator.userAgent),h={},g.browser&&(h[g.browser]=!0,h.version=g.version),h.chrome?h.webkit=!0:h.webkit&&(h.safari=!0),e.browser=h),a(e,"browser",e.browser,"jQuery.browser is deprecated"),e.sub=function(){function t(e,n){return new t.fn.init(e,n)}e.extend(!0,t,this),t.superclass=this,t.fn=t.prototype=this(),t.fn.constructor=t,t.sub=this.sub,t.fn.init=function(r,a){return a&&a instanceof e&&!(a instanceof t)&&(a=t(a)),e.fn.init.call(this,r,a,n)},t.fn.init.prototype=t.fn;var n=t(document);return r("jQuery.sub() is deprecated"),t},e.ajaxSetup({converters:{"text json":e.parseJSON}});var b=e.fn.data;e.fn.data=function(t){var a,i,o=this[0];return!o||"events"!==t||1!==arguments.length||(a=e.data(o,t),i=e._data(o,t),a!==n&&a!==i||i===n)?b.apply(this,arguments):(r("Use of jQuery.fn.data('events') is deprecated"),i)};var j=/\/(java|ecma)script/i,w=e.fn.andSelf||e.fn.addBack;e.fn.andSelf=function(){return r("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"),w.apply(this,arguments)},e.clean||(e.clean=function(t,a,i,o){a=a||document,a=!a.nodeType&&a[0]||a,a=a.ownerDocument||a,r("jQuery.clean() is deprecated");var s,u,c,l,d=[];if(e.merge(d,e.buildFragment(t,a).childNodes),i)for(c=function(e){return!e.type||j.test(e.type)?o?o.push(e.parentNode?e.parentNode.removeChild(e):e):i.appendChild(e):n},s=0;null!=(u=d[s]);s++)e.nodeName(u,"script")&&c(u)||(i.appendChild(u),u.getElementsByTagName!==n&&(l=e.grep(e.merge([],u.getElementsByTagName("script")),c),d.splice.apply(d,[s+1,0].concat(l)),s+=l.length));return d});var Q=e.event.add,x=e.event.remove,k=e.event.trigger,N=e.fn.toggle,T=e.fn.live,M=e.fn.die,S="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",C=RegExp("\\b(?:"+S+")\\b"),H=/(?:^|\s)hover(\.\S+|)\b/,A=function(t){return"string"!=typeof t||e.event.special.hover?t:(H.test(t)&&r("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"),t&&t.replace(H,"mouseenter$1 mouseleave$1"))};e.event.props&&"attrChange"!==e.event.props[0]&&e.event.props.unshift("attrChange","attrName","relatedNode","srcElement"),e.event.dispatch&&a(e.event,"handle",e.event.dispatch,"jQuery.event.handle is undocumented and deprecated"),e.event.add=function(e,t,n,a,i){e!==document&&C.test(t)&&r("AJAX events should be attached to document: "+t),Q.call(this,e,A(t||""),n,a,i)},e.event.remove=function(e,t,n,r,a){x.call(this,e,A(t)||"",n,r,a)},e.fn.error=function(){var e=Array.prototype.slice.call(arguments,0);return r("jQuery.fn.error() is deprecated"),e.splice(0,0,"error"),arguments.length?this.bind.apply(this,e):(this.triggerHandler.apply(this,e),this)},e.fn.toggle=function(t,n){if(!e.isFunction(t)||!e.isFunction(n))return N.apply(this,arguments);r("jQuery.fn.toggle(handler, handler...) is deprecated");var a=arguments,i=t.guid||e.guid++,o=0,s=function(n){var r=(e._data(this,"lastToggle"+t.guid)||0)%o;return e._data(this,"lastToggle"+t.guid,r+1),n.preventDefault(),a[r].apply(this,arguments)||!1};for(s.guid=i;a.length>o;)a[o++].guid=i;return this.click(s)},e.fn.live=function(t,n,a){return r("jQuery.fn.live() is deprecated"),T?T.apply(this,arguments):(e(this.context).on(t,this.selector,n,a),this)},e.fn.die=function(t,n){return r("jQuery.fn.die() is deprecated"),M?M.apply(this,arguments):(e(this.context).off(t,this.selector||"**",n),this)},e.event.trigger=function(e,t,n,a){return n||C.test(e)||r("Global events are undocumented and deprecated"),k.call(this,e,t,n||document,a)},e.each(S.split("|"),function(t,n){e.event.special[n]={setup:function(){var t=this;return t!==document&&(e.event.add(document,n+"."+e.guid,function(){e.event.trigger(n,null,t,!0)}),e._data(this,n,e.guid++)),!1},teardown:function(){return this!==document&&e.event.remove(document,n+"."+e._data(this,n)),!1}}})}(jQuery,window); \ No newline at end of file diff --git a/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_flat_0_aaaaaa_40x100.png b/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_flat_0_aaaaaa_40x100.png index 87f812d7d6c48fc5f33d8b2946d46d9b04eae53f..8c47bb636119a9c7a1c81e9aed4c5e35b436daa9 100644 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F1SA+{?>A)!QY`6?zK#qG8~eHcB(ehejKx9j zP7LeL$-D$|6p}rHd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!t9 z$=lt9f!VmFr~}9o^K@|xu{fRlgP)ye@tMG98pTsQ^@JIE9iF(^{8_0CRH0hp8c~vx zSdwa$T$Bo=7>o=IO>_+mbq&o!3@oe+jjW7-TvICp1LqHu3s5xV=BH$)RpQoQv{w5J PPy>UftDnm{r-UW|jv7O7 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F1SA+{?>A)!QcOwS?k)_>#w|r1Kptm-M`SUO z_5fqIli7AahM1>|V~EA+ zRdP`(kYX@0Ff`URFxE9R2{AOXGBmd`vd}d!w=ysYZ~b@!MMG|WN@iLmZVhTTJX3%g O7(8A5T-G@yGywpx_A}rB diff --git a/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_flat_75_ffffff_40x100.png b/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_flat_75_ffffff_40x100.png index 4cb0d6d10cbcbde824644a9a64a013beeb5ea5a7..a2fe0297b1313f96917579960d3ae595e743ea01 100644 GIT binary patch delta 182 zcmcb>*upeHC4?p2(btiIVPik{pF~y$1_s9BAa^H*b?0PW0yzrF9znhg3{`3j3=J&| z48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!Ib3f?!v%$w@Y}*L>JR=6I}yCT|@H_ z0}CrdBP$~y*VM|u!1=@E0-##e64!{5l*E!$tK9sQ%(O}dBLhS18jRLzp8;xM@O1Ta JS?83{1OPIeFaH1l delta 130 zcmZo+y1+O=MS&^F+uenM@oty!5(Wka&H|6fVj%4S#%?FG?Iu>3h8yb|80#9EgcurG z8Jb%endussTNxOz@9Js=DpM_SjVMV;EJ?M>%}>cpt7I@TFvPB*?75L8Py>UftDnm{ Hr-UW|S@0ne diff --git a/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_55_fbf9ee_1x400.png b/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_55_fbf9ee_1x400.png index bfe8974583583b5f67130d5ea199dbf37df3b5db..78eb29e1e1013e44c26270a6d245afde5ee0ca7c 100644 GIT binary patch delta 171 zcmX@l)XY3V#f>H1(btiIVPik{pF~y$1_s9BAa^H*b?0PW0yzrF9znhg3{`3j3=J&| z48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6`@5qUc2Lwc#eZ28OzZ<{<_aR)$7aMnJBq zm4Sithsgy%ovJ0S5hW>!C8<`q`6-!cl?+A(hS)V2t<^pQ)WG2B>gTe~DWM4fd7v%c delta 134 zcmZo>KF>5kMTITN+uh|q7;r{>zr(=5z**oCSq!8-z}W3%w%x><4dKSR2FALECLxAK zR)*$QM&`N(=2iv<3(qzh0+p$jxJHzuB$lLF<>sekrd2W+85m;MaAAUFFHi%6r>mdK II;Vst0E8(hSO5S3 diff --git a/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_65_ffffff_1x400.png b/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_65_ffffff_1x400.png index 168a18215cd42e219354ae18ffa4495c34215e5a..26d2fa2b4d3d24dd833a570f02b0d3f37ec69b73 100644 GIT binary patch delta 182 zcmX@l*vvFRC4?p2(btiIVPik{pF~y$1_s9BAa^H*b?0PW0yzrF9znhg3{`3j3=J&| z48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!Ib3f?!v%$w@Y}*L>H5A6I}yCT|@H_ z0}CrdBP$~y*VM|u!1=@E0-##e64!{5l*E!$tK9sQ%(O}dBLhS18jRLzp8;xM@O1Ta JS?83{1OPDEFZ=)i delta 130 zcmZo>I?p&kMS&^F+uenM@oty!5(Wka&H|6fVj%4S#%?FG?Iu>3gd6J`80#9EgcurG z8Jb%endussTNxOz@9Js=DpM_SjVMV;EJ?M>%}>cpt7I@TFvPB*?75L8Py>UftDnm{ Hr-UW|Sd}3U diff --git a/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_75_dadada_1x400.png b/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_75_dadada_1x400.png index 25bf099b9a1640a89c14cf229291a616a38f663b..16b6247a14a1deb7c2c8f2c4d04a6327620e1fb2 100644 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq*&4&eH|GXHuiJ>Nn`~nC=POW zVpw-h<|UA$kn9oU%fL{j#=y|f!octgDAe$RfuYoZf#FpG1B2BJ1_tqhIlBUFfD%ke z-tI2{|BI|PJPYJ`c)B=-Se#C_C~Qg;=~Y^_`0Q1l=sgnKP8z?tkaA<{=?&q1iT_L6 zoYN)xo+&`{7(8A5T-G@yGywpgL`R7L diff --git a/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_75_e6e6e6_1x400.png b/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_75_e6e6e6_1x400.png index c5dc70aea4342353651f8b745b2c4e5a76d7065a..72303d6aa1be89059a9d6a136a78a208a162f704 100644 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq*&4&eH|GXHuiJ>Nn`~nC=POW zVpw-h<|UA$kn9oU%fL{j#=y|f!octgDAe$RfuYoZf#FpG1B2BJ1_tqhIlBUFfD%ke z-tI2{|BI|PJPYJ`c)B=-Se#DYQ8_nJq*rOx;^4^=e%VHIR;F3}p8D`lNn7_?p6S|> z>--XT?3?-USykKZY>9WT;kAo1L=jP`V=RmdOsaB#*$W#hxgxAM$? zB4H=lwH1(btiIVPik{pF~y$1_s9BAa^H*b?0PW0yzrF9znhg3{`3j3=J&| z48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6`@5qUc2LRZ=Fp28OzZ<{<_aR)$7aMnJBq im4Sithsgz#`5DF4uuB`Q)jk6>n8DN4&t;ucLK6TeFelpp delta 134 zcmZo*KEpIYMTITN+uh|q7;r{>zr(=5z**oCSq!8-z}W3%w%x>sekrd2W+85m;MaAAUFFHi%6r>mdK II;Vst0Du4}PXGV_ diff --git a/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_highlight-soft_75_cccccc_1x100.png index 11c1841689fc11b7cddbf83495a138bc6247f367..331976d8dd4b83fe2087eabc32c8acaa131d65d4 100644 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^j6j?s03;ZUuHXC*q*&4&eH|GXHuiJ>Nn{1`8Hp9qyV03h zMhzScJI_=K=p71}1hhr9#5JNMC9x#cD!C{XNHG{07@FuB80s3DhZtB`85&s`0lB7D k1_sU_CKsS+$jwj5OsmAL!Dy}a8K4FRPgg&ebxsLQ0NKB4T>t<8 delta 215 zcmX@ZG=ph^NW~5+ZG)!k@qfr$HlV+wsRiN5;{EfG0*gJ zqnNDJ9TDdW5}6MFRBJ0{mppeb$>Q~af@fzKlo&R$Pn-8@YGgIr#CzgW#<~W^x`rkp thDKI~=2k}Lx(4P}1_leyHX2UmXB1b%E`4EwWiQZ;44$rjF6*2UngFUmOltrD diff --git a/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_222222_256x240.png b/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_222222_256x240.png index 29433020134ff7cac77cd341f563c78cc7a9fc0b..e672c7f61b216dd9824204bf39547d7dc4a6cab6 100644 GIT binary patch literal 6837 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 literal 6922 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 bw6oQ+wY2ebAGH;IasnvIs>#$!S%m%<;^iZ8 diff --git a/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_2e83ff_256x240.png b/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_2e83ff_256x240.png index 25dfde1f4904197b97cc7c9e220ab296cfecc322..4fea42e83c9ca232bc7df0e9025abe27f6949fbd 100644 GIT binary patch delta 167 zcmX@A{8M>?vO5Dyx}&cn1H;CC?mvmF3=9m6#X;^)4C~IxyaaL-l0AZa85pY67#JE_ z7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG%jM#VnH%|{qp`Mpha4GeV+%|i?KRl^Tq8`dMv95u!uAxbYp^=rLnU#T& zu7SCgfkB+mp{qcJswJ)wB`Jv|saCo9DVb@N3`Pcq5Dms5h6Ywf7FI@<5Dle|jglsx H5Hth;MQI=T diff --git a/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_454545_256x240.png b/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_454545_256x240.png index 0063819c429cdbc699ba44c798c7b4c32b3ddec2..3e2b5c031e4272dfb44aebc3c3f227a6d66a4aa3 100644 GIT binary patch literal 6973 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 literal 6992 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 diff --git a/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_cd0a0a_256x240.png b/sources/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_cd0a0a_256x240.png index 145e3d3c6d430c0676200d4d4905ca30b3b81bf1..98487c2499d2b8faebe4ac3d498a22984e326296 100644 GIT binary patch delta 167 zcmX@A{8M>?vO5Dyx}&cn1H;CC?mvmF3=9m6#X;^)4C~IxyaaL-l0AZa85pY67#JE_ z7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG%jM#VnH%|{qp`Mpha4GeV+%|i?KRl^Tq8`dMv95u!uAxbYp^=rLnU#T& zu7SCgfkB+mp{qcJswJ)wB`Jv|saCo9DVb@N3`Pcq5Dms5h6Ywf7FI@<5Dle|jglsx H5Hth;MQI=T diff --git a/sources/lib/scripts/jquery/jquery-ui-theme/smoothness.css b/sources/lib/scripts/jquery/jquery-ui-theme/smoothness.css index bd2adbd..34f3ada 100644 --- a/sources/lib/scripts/jquery/jquery-ui-theme/smoothness.css +++ b/sources/lib/scripts/jquery/jquery-ui-theme/smoothness.css @@ -1,8 +1,8 @@ -/*! jQuery UI - v1.10.2 - 2013-03-14 +/*! jQuery UI - v1.10.4 - 2014-01-17 * http://jqueryui.com -* Includes: jquery.ui.core.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css +* Includes: jquery.ui.core.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px -* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */ +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ /* Layout helpers ----------------------------------*/ @@ -274,9 +274,6 @@ button.ui-button::-moz-focus-inner { font-size: 1em; margin: 1px 0; } -.ui-datepicker select.ui-datepicker-month-year { - width: 100%; -} .ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year { width: 49%; @@ -393,6 +390,7 @@ button.ui-button::-moz-focus-inner { border-left-width: 1px; } .ui-dialog { + overflow: hidden; position: absolute; top: 0; left: 0; @@ -415,7 +413,7 @@ button.ui-button::-moz-focus-inner { position: absolute; right: .3em; top: 50%; - width: 21px; + width: 20px; margin: -10px 0 0 0; padding: 1px; height: 20px; @@ -466,6 +464,8 @@ button.ui-button::-moz-focus-inner { margin: 0; padding: 0; width: 100%; + /* support: IE10, see #8844 */ + list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); } .ui-menu .ui-menu-divider { margin: 5px -2px 5px -2px; @@ -702,13 +702,13 @@ button.ui-button::-moz-focus-inner { overflow: hidden; right: 0; } -/* more specificity required here to overide default borders */ +/* more specificity required here to override default borders */ .ui-spinner a.ui-spinner-button { border-top: none; border-bottom: none; border-right: none; } -/* vertical centre icon */ +/* vertically center icon */ .ui-spinner .ui-icon { position: absolute; margin-top: -8px; @@ -745,7 +745,7 @@ button.ui-button::-moz-focus-inner { padding: 0; white-space: nowrap; } -.ui-tabs .ui-tabs-nav li a { +.ui-tabs .ui-tabs-nav .ui-tabs-anchor { float: left; padding: .5em 1em; text-decoration: none; @@ -754,13 +754,12 @@ button.ui-button::-moz-focus-inner { margin-bottom: -1px; padding-bottom: 1px; } -.ui-tabs .ui-tabs-nav li.ui-tabs-active a, -.ui-tabs .ui-tabs-nav li.ui-state-disabled a, -.ui-tabs .ui-tabs-nav li.ui-tabs-loading a { +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { cursor: text; } -.ui-tabs .ui-tabs-nav li a, /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ -.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a { +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { cursor: pointer; } .ui-tabs .ui-tabs-panel { @@ -845,7 +844,11 @@ body .ui-tooltip { .ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, -.ui-state-hover a:visited { +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited { color: #212121; text-decoration: none; } diff --git a/sources/lib/scripts/jquery/jquery-ui.js b/sources/lib/scripts/jquery/jquery-ui.js index 6eccbfe..eb4ec72 100644 --- a/sources/lib/scripts/jquery/jquery-ui.js +++ b/sources/lib/scripts/jquery/jquery-ui.js @@ -1,7 +1,8 @@ -/*! jQuery UI - v1.10.2 - 2013-03-14 +/*! jQuery UI - v1.10.4 - 2014-01-17 * http://jqueryui.com -* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.effect.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js, jquery.ui.menu.js, jquery.ui.position.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js -* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */ +* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.effect.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js, jquery.ui.menu.js, jquery.ui.progressbar.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.slider.js, jquery.ui.sortable.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ + (function( $, undefined ) { var uuid = 0, @@ -11,7 +12,7 @@ var uuid = 0, $.ui = $.ui || {}; $.extend( $.ui, { - version: "1.10.2", + version: "1.10.4", keyCode: { BACKSPACE: 8, @@ -261,7 +262,7 @@ $.fn.extend({ }); $.extend( $.ui, { - // $.ui.plugin is deprecated. Use the proxy pattern instead. + // $.ui.plugin is deprecated. Use $.widget() extensions instead. plugin: { add: function( module, option, set ) { var i, @@ -312,7 +313,6 @@ $.extend( $.ui, { }); })( jQuery ); - (function( $, undefined ) { var uuid = 0, @@ -411,7 +411,7 @@ $.widget = function( name, base, prototype ) { // TODO: remove support for widgetEventPrefix // always use the name + a colon as the prefix, e.g., draggable:start // don't prefix for widgets that aren't DOM-based - widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name + widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name }, proxiedPrototype, { constructor: constructor, namespace: namespace, @@ -620,12 +620,12 @@ $.Widget.prototype = { curOption = curOption[ parts[ i ] ]; } key = parts.pop(); - if ( value === undefined ) { + if ( arguments.length === 1 ) { return curOption[ key ] === undefined ? null : curOption[ key ]; } curOption[ key ] = value; } else { - if ( value === undefined ) { + if ( arguments.length === 1 ) { return this.options[ key ] === undefined ? null : this.options[ key ]; } options[ key ] = value; @@ -824,7 +824,6 @@ $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { }); })( jQuery ); - (function( $, undefined ) { var mouseHandled = false; @@ -833,7 +832,7 @@ $( document ).mouseup( function() { }); $.widget("ui.mouse", { - version: "1.10.2", + version: "1.10.4", options: { cancel: "input,textarea,button,select,option", distance: 1, @@ -981,11 +980,4857 @@ $.widget("ui.mouse", { }); })(jQuery); +(function( $, undefined ) { +$.ui = $.ui || {}; + +var cachedScrollbarWidth, + max = Math.max, + abs = Math.abs, + round = Math.round, + rhorizontal = /left|center|right/, + rvertical = /top|center|bottom/, + roffset = /[\+\-]\d+(\.[\d]+)?%?/, + rposition = /^\w+/, + rpercent = /%$/, + _position = $.fn.position; + +function getOffsets( offsets, width, height ) { + return [ + parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), + parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) + ]; +} + +function parseCss( element, property ) { + return parseInt( $.css( element, property ), 10 ) || 0; +} + +function getDimensions( elem ) { + var raw = elem[0]; + if ( raw.nodeType === 9 ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: 0, left: 0 } + }; + } + if ( $.isWindow( raw ) ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: elem.scrollTop(), left: elem.scrollLeft() } + }; + } + if ( raw.preventDefault ) { + return { + width: 0, + height: 0, + offset: { top: raw.pageY, left: raw.pageX } + }; + } + return { + width: elem.outerWidth(), + height: elem.outerHeight(), + offset: elem.offset() + }; +} + +$.position = { + scrollbarWidth: function() { + if ( cachedScrollbarWidth !== undefined ) { + return cachedScrollbarWidth; + } + var w1, w2, + div = $( "
    " ), + innerDiv = div.children()[0]; + + $( "body" ).append( div ); + w1 = innerDiv.offsetWidth; + div.css( "overflow", "scroll" ); + + w2 = innerDiv.offsetWidth; + + if ( w1 === w2 ) { + w2 = div[0].clientWidth; + } + + div.remove(); + + return (cachedScrollbarWidth = w1 - w2); + }, + getScrollInfo: function( within ) { + var overflowX = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-x" ), + overflowY = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-y" ), + hasOverflowX = overflowX === "scroll" || + ( overflowX === "auto" && within.width < within.element[0].scrollWidth ), + hasOverflowY = overflowY === "scroll" || + ( overflowY === "auto" && within.height < within.element[0].scrollHeight ); + return { + width: hasOverflowY ? $.position.scrollbarWidth() : 0, + height: hasOverflowX ? $.position.scrollbarWidth() : 0 + }; + }, + getWithinInfo: function( element ) { + var withinElement = $( element || window ), + isWindow = $.isWindow( withinElement[0] ), + isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9; + return { + element: withinElement, + isWindow: isWindow, + isDocument: isDocument, + offset: withinElement.offset() || { left: 0, top: 0 }, + scrollLeft: withinElement.scrollLeft(), + scrollTop: withinElement.scrollTop(), + width: isWindow ? withinElement.width() : withinElement.outerWidth(), + height: isWindow ? withinElement.height() : withinElement.outerHeight() + }; + } +}; + +$.fn.position = function( options ) { + if ( !options || !options.of ) { + return _position.apply( this, arguments ); + } + + // make a copy, we don't want to modify arguments + options = $.extend( {}, options ); + + var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, + target = $( options.of ), + within = $.position.getWithinInfo( options.within ), + scrollInfo = $.position.getScrollInfo( within ), + collision = ( options.collision || "flip" ).split( " " ), + offsets = {}; + + dimensions = getDimensions( target ); + if ( target[0].preventDefault ) { + // force left top to allow flipping + options.at = "left top"; + } + targetWidth = dimensions.width; + targetHeight = dimensions.height; + targetOffset = dimensions.offset; + // clone to reuse original targetOffset later + basePosition = $.extend( {}, targetOffset ); + + // force my and at to have valid horizontal and vertical positions + // if a value is missing or invalid, it will be converted to center + $.each( [ "my", "at" ], function() { + var pos = ( options[ this ] || "" ).split( " " ), + horizontalOffset, + verticalOffset; + + if ( pos.length === 1) { + pos = rhorizontal.test( pos[ 0 ] ) ? + pos.concat( [ "center" ] ) : + rvertical.test( pos[ 0 ] ) ? + [ "center" ].concat( pos ) : + [ "center", "center" ]; + } + pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; + pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; + + // calculate offsets + horizontalOffset = roffset.exec( pos[ 0 ] ); + verticalOffset = roffset.exec( pos[ 1 ] ); + offsets[ this ] = [ + horizontalOffset ? horizontalOffset[ 0 ] : 0, + verticalOffset ? verticalOffset[ 0 ] : 0 + ]; + + // reduce to just the positions without the offsets + options[ this ] = [ + rposition.exec( pos[ 0 ] )[ 0 ], + rposition.exec( pos[ 1 ] )[ 0 ] + ]; + }); + + // normalize collision option + if ( collision.length === 1 ) { + collision[ 1 ] = collision[ 0 ]; + } + + if ( options.at[ 0 ] === "right" ) { + basePosition.left += targetWidth; + } else if ( options.at[ 0 ] === "center" ) { + basePosition.left += targetWidth / 2; + } + + if ( options.at[ 1 ] === "bottom" ) { + basePosition.top += targetHeight; + } else if ( options.at[ 1 ] === "center" ) { + basePosition.top += targetHeight / 2; + } + + atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); + basePosition.left += atOffset[ 0 ]; + basePosition.top += atOffset[ 1 ]; + + return this.each(function() { + var collisionPosition, using, + elem = $( this ), + elemWidth = elem.outerWidth(), + elemHeight = elem.outerHeight(), + marginLeft = parseCss( this, "marginLeft" ), + marginTop = parseCss( this, "marginTop" ), + collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width, + collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height, + position = $.extend( {}, basePosition ), + myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); + + if ( options.my[ 0 ] === "right" ) { + position.left -= elemWidth; + } else if ( options.my[ 0 ] === "center" ) { + position.left -= elemWidth / 2; + } + + if ( options.my[ 1 ] === "bottom" ) { + position.top -= elemHeight; + } else if ( options.my[ 1 ] === "center" ) { + position.top -= elemHeight / 2; + } + + position.left += myOffset[ 0 ]; + position.top += myOffset[ 1 ]; + + // if the browser doesn't support fractions, then round for consistent results + if ( !$.support.offsetFractions ) { + position.left = round( position.left ); + position.top = round( position.top ); + } + + collisionPosition = { + marginLeft: marginLeft, + marginTop: marginTop + }; + + $.each( [ "left", "top" ], function( i, dir ) { + if ( $.ui.position[ collision[ i ] ] ) { + $.ui.position[ collision[ i ] ][ dir ]( position, { + targetWidth: targetWidth, + targetHeight: targetHeight, + elemWidth: elemWidth, + elemHeight: elemHeight, + collisionPosition: collisionPosition, + collisionWidth: collisionWidth, + collisionHeight: collisionHeight, + offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], + my: options.my, + at: options.at, + within: within, + elem : elem + }); + } + }); + + if ( options.using ) { + // adds feedback as second argument to using callback, if present + using = function( props ) { + var left = targetOffset.left - position.left, + right = left + targetWidth - elemWidth, + top = targetOffset.top - position.top, + bottom = top + targetHeight - elemHeight, + feedback = { + target: { + element: target, + left: targetOffset.left, + top: targetOffset.top, + width: targetWidth, + height: targetHeight + }, + element: { + element: elem, + left: position.left, + top: position.top, + width: elemWidth, + height: elemHeight + }, + horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", + vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" + }; + if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { + feedback.horizontal = "center"; + } + if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { + feedback.vertical = "middle"; + } + if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { + feedback.important = "horizontal"; + } else { + feedback.important = "vertical"; + } + options.using.call( this, props, feedback ); + }; + } + + elem.offset( $.extend( position, { using: using } ) ); + }); +}; + +$.ui.position = { + fit: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, + outerWidth = within.width, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = withinOffset - collisionPosLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, + newOverRight; + + // element is wider than within + if ( data.collisionWidth > outerWidth ) { + // element is initially over the left side of within + if ( overLeft > 0 && overRight <= 0 ) { + newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset; + position.left += overLeft - newOverRight; + // element is initially over right side of within + } else if ( overRight > 0 && overLeft <= 0 ) { + position.left = withinOffset; + // element is initially over both left and right sides of within + } else { + if ( overLeft > overRight ) { + position.left = withinOffset + outerWidth - data.collisionWidth; + } else { + position.left = withinOffset; + } + } + // too far left -> align with left edge + } else if ( overLeft > 0 ) { + position.left += overLeft; + // too far right -> align with right edge + } else if ( overRight > 0 ) { + position.left -= overRight; + // adjust based on position and margin + } else { + position.left = max( position.left - collisionPosLeft, position.left ); + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollTop : within.offset.top, + outerHeight = data.within.height, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = withinOffset - collisionPosTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, + newOverBottom; + + // element is taller than within + if ( data.collisionHeight > outerHeight ) { + // element is initially over the top of within + if ( overTop > 0 && overBottom <= 0 ) { + newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset; + position.top += overTop - newOverBottom; + // element is initially over bottom of within + } else if ( overBottom > 0 && overTop <= 0 ) { + position.top = withinOffset; + // element is initially over both top and bottom of within + } else { + if ( overTop > overBottom ) { + position.top = withinOffset + outerHeight - data.collisionHeight; + } else { + position.top = withinOffset; + } + } + // too far up -> align with top + } else if ( overTop > 0 ) { + position.top += overTop; + // too far down -> align with bottom edge + } else if ( overBottom > 0 ) { + position.top -= overBottom; + // adjust based on position and margin + } else { + position.top = max( position.top - collisionPosTop, position.top ); + } + } + }, + flip: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.offset.left + within.scrollLeft, + outerWidth = within.width, + offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = collisionPosLeft - offsetLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, + myOffset = data.my[ 0 ] === "left" ? + -data.elemWidth : + data.my[ 0 ] === "right" ? + data.elemWidth : + 0, + atOffset = data.at[ 0 ] === "left" ? + data.targetWidth : + data.at[ 0 ] === "right" ? + -data.targetWidth : + 0, + offset = -2 * data.offset[ 0 ], + newOverRight, + newOverLeft; + + if ( overLeft < 0 ) { + newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset; + if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { + position.left += myOffset + atOffset + offset; + } + } + else if ( overRight > 0 ) { + newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; + if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { + position.left += myOffset + atOffset + offset; + } + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.offset.top + within.scrollTop, + outerHeight = within.height, + offsetTop = within.isWindow ? within.scrollTop : within.offset.top, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = collisionPosTop - offsetTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, + top = data.my[ 1 ] === "top", + myOffset = top ? + -data.elemHeight : + data.my[ 1 ] === "bottom" ? + data.elemHeight : + 0, + atOffset = data.at[ 1 ] === "top" ? + data.targetHeight : + data.at[ 1 ] === "bottom" ? + -data.targetHeight : + 0, + offset = -2 * data.offset[ 1 ], + newOverTop, + newOverBottom; + if ( overTop < 0 ) { + newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset; + if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) { + position.top += myOffset + atOffset + offset; + } + } + else if ( overBottom > 0 ) { + newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; + if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) { + position.top += myOffset + atOffset + offset; + } + } + } + }, + flipfit: { + left: function() { + $.ui.position.flip.left.apply( this, arguments ); + $.ui.position.fit.left.apply( this, arguments ); + }, + top: function() { + $.ui.position.flip.top.apply( this, arguments ); + $.ui.position.fit.top.apply( this, arguments ); + } + } +}; + +// fraction support test +(function () { + var testElement, testElementParent, testElementStyle, offsetLeft, i, + body = document.getElementsByTagName( "body" )[ 0 ], + div = document.createElement( "div" ); + + //Create a "fake body" for testing based on method used in jQuery.support + testElement = document.createElement( body ? "div" : "body" ); + testElementStyle = { + visibility: "hidden", + width: 0, + height: 0, + border: 0, + margin: 0, + background: "none" + }; + if ( body ) { + $.extend( testElementStyle, { + position: "absolute", + left: "-1000px", + top: "-1000px" + }); + } + for ( i in testElementStyle ) { + testElement.style[ i ] = testElementStyle[ i ]; + } + testElement.appendChild( div ); + testElementParent = body || document.documentElement; + testElementParent.insertBefore( testElement, testElementParent.firstChild ); + + div.style.cssText = "position: absolute; left: 10.7432222px;"; + + offsetLeft = $( div ).offset().left; + $.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11; + + testElement.innerHTML = ""; + testElementParent.removeChild( testElement ); +})(); + +}( jQuery ) ); +(function( $, undefined ) { + +var uid = 0, + hideProps = {}, + showProps = {}; + +hideProps.height = hideProps.paddingTop = hideProps.paddingBottom = + hideProps.borderTopWidth = hideProps.borderBottomWidth = "hide"; +showProps.height = showProps.paddingTop = showProps.paddingBottom = + showProps.borderTopWidth = showProps.borderBottomWidth = "show"; + +$.widget( "ui.accordion", { + version: "1.10.4", + options: { + active: 0, + animate: {}, + collapsible: false, + event: "click", + header: "> li > :first-child,> :not(li):even", + heightStyle: "auto", + icons: { + activeHeader: "ui-icon-triangle-1-s", + header: "ui-icon-triangle-1-e" + }, + + // callbacks + activate: null, + beforeActivate: null + }, + + _create: function() { + var options = this.options; + this.prevShow = this.prevHide = $(); + this.element.addClass( "ui-accordion ui-widget ui-helper-reset" ) + // ARIA + .attr( "role", "tablist" ); + + // don't allow collapsible: false and active: false / null + if ( !options.collapsible && (options.active === false || options.active == null) ) { + options.active = 0; + } + + this._processPanels(); + // handle negative values + if ( options.active < 0 ) { + options.active += this.headers.length; + } + this._refresh(); + }, + + _getCreateEventData: function() { + return { + header: this.active, + panel: !this.active.length ? $() : this.active.next(), + content: !this.active.length ? $() : this.active.next() + }; + }, + + _createIcons: function() { + var icons = this.options.icons; + if ( icons ) { + $( "" ) + .addClass( "ui-accordion-header-icon ui-icon " + icons.header ) + .prependTo( this.headers ); + this.active.children( ".ui-accordion-header-icon" ) + .removeClass( icons.header ) + .addClass( icons.activeHeader ); + this.headers.addClass( "ui-accordion-icons" ); + } + }, + + _destroyIcons: function() { + this.headers + .removeClass( "ui-accordion-icons" ) + .children( ".ui-accordion-header-icon" ) + .remove(); + }, + + _destroy: function() { + var contents; + + // clean up main element + this.element + .removeClass( "ui-accordion ui-widget ui-helper-reset" ) + .removeAttr( "role" ); + + // clean up headers + this.headers + .removeClass( "ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" ) + .removeAttr( "role" ) + .removeAttr( "aria-expanded" ) + .removeAttr( "aria-selected" ) + .removeAttr( "aria-controls" ) + .removeAttr( "tabIndex" ) + .each(function() { + if ( /^ui-accordion/.test( this.id ) ) { + this.removeAttribute( "id" ); + } + }); + this._destroyIcons(); + + // clean up content panels + contents = this.headers.next() + .css( "display", "" ) + .removeAttr( "role" ) + .removeAttr( "aria-hidden" ) + .removeAttr( "aria-labelledby" ) + .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled" ) + .each(function() { + if ( /^ui-accordion/.test( this.id ) ) { + this.removeAttribute( "id" ); + } + }); + if ( this.options.heightStyle !== "content" ) { + contents.css( "height", "" ); + } + }, + + _setOption: function( key, value ) { + if ( key === "active" ) { + // _activate() will handle invalid values and update this.options + this._activate( value ); + return; + } + + if ( key === "event" ) { + if ( this.options.event ) { + this._off( this.headers, this.options.event ); + } + this._setupEvents( value ); + } + + this._super( key, value ); + + // setting collapsible: false while collapsed; open first panel + if ( key === "collapsible" && !value && this.options.active === false ) { + this._activate( 0 ); + } + + if ( key === "icons" ) { + this._destroyIcons(); + if ( value ) { + this._createIcons(); + } + } + + // #5332 - opacity doesn't cascade to positioned elements in IE + // so we need to add the disabled class to the headers and panels + if ( key === "disabled" ) { + this.headers.add( this.headers.next() ) + .toggleClass( "ui-state-disabled", !!value ); + } + }, + + _keydown: function( event ) { + if ( event.altKey || event.ctrlKey ) { + return; + } + + var keyCode = $.ui.keyCode, + length = this.headers.length, + currentIndex = this.headers.index( event.target ), + toFocus = false; + + switch ( event.keyCode ) { + case keyCode.RIGHT: + case keyCode.DOWN: + toFocus = this.headers[ ( currentIndex + 1 ) % length ]; + break; + case keyCode.LEFT: + case keyCode.UP: + toFocus = this.headers[ ( currentIndex - 1 + length ) % length ]; + break; + case keyCode.SPACE: + case keyCode.ENTER: + this._eventHandler( event ); + break; + case keyCode.HOME: + toFocus = this.headers[ 0 ]; + break; + case keyCode.END: + toFocus = this.headers[ length - 1 ]; + break; + } + + if ( toFocus ) { + $( event.target ).attr( "tabIndex", -1 ); + $( toFocus ).attr( "tabIndex", 0 ); + toFocus.focus(); + event.preventDefault(); + } + }, + + _panelKeyDown : function( event ) { + if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) { + $( event.currentTarget ).prev().focus(); + } + }, + + refresh: function() { + var options = this.options; + this._processPanels(); + + // was collapsed or no panel + if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) { + options.active = false; + this.active = $(); + // active false only when collapsible is true + } else if ( options.active === false ) { + this._activate( 0 ); + // was active, but active panel is gone + } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) { + // all remaining panel are disabled + if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) { + options.active = false; + this.active = $(); + // activate previous panel + } else { + this._activate( Math.max( 0, options.active - 1 ) ); + } + // was active, active panel still exists + } else { + // make sure active index is correct + options.active = this.headers.index( this.active ); + } + + this._destroyIcons(); + + this._refresh(); + }, + + _processPanels: function() { + this.headers = this.element.find( this.options.header ) + .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" ); + + this.headers.next() + .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" ) + .filter(":not(.ui-accordion-content-active)") + .hide(); + }, + + _refresh: function() { + var maxHeight, + options = this.options, + heightStyle = options.heightStyle, + parent = this.element.parent(), + accordionId = this.accordionId = "ui-accordion-" + + (this.element.attr( "id" ) || ++uid); + + this.active = this._findActive( options.active ) + .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" ) + .removeClass( "ui-corner-all" ); + this.active.next() + .addClass( "ui-accordion-content-active" ) + .show(); + + this.headers + .attr( "role", "tab" ) + .each(function( i ) { + var header = $( this ), + headerId = header.attr( "id" ), + panel = header.next(), + panelId = panel.attr( "id" ); + if ( !headerId ) { + headerId = accordionId + "-header-" + i; + header.attr( "id", headerId ); + } + if ( !panelId ) { + panelId = accordionId + "-panel-" + i; + panel.attr( "id", panelId ); + } + header.attr( "aria-controls", panelId ); + panel.attr( "aria-labelledby", headerId ); + }) + .next() + .attr( "role", "tabpanel" ); + + this.headers + .not( this.active ) + .attr({ + "aria-selected": "false", + "aria-expanded": "false", + tabIndex: -1 + }) + .next() + .attr({ + "aria-hidden": "true" + }) + .hide(); + + // make sure at least one header is in the tab order + if ( !this.active.length ) { + this.headers.eq( 0 ).attr( "tabIndex", 0 ); + } else { + this.active.attr({ + "aria-selected": "true", + "aria-expanded": "true", + tabIndex: 0 + }) + .next() + .attr({ + "aria-hidden": "false" + }); + } + + this._createIcons(); + + this._setupEvents( options.event ); + + if ( heightStyle === "fill" ) { + maxHeight = parent.height(); + this.element.siblings( ":visible" ).each(function() { + var elem = $( this ), + position = elem.css( "position" ); + + if ( position === "absolute" || position === "fixed" ) { + return; + } + maxHeight -= elem.outerHeight( true ); + }); + + this.headers.each(function() { + maxHeight -= $( this ).outerHeight( true ); + }); + + this.headers.next() + .each(function() { + $( this ).height( Math.max( 0, maxHeight - + $( this ).innerHeight() + $( this ).height() ) ); + }) + .css( "overflow", "auto" ); + } else if ( heightStyle === "auto" ) { + maxHeight = 0; + this.headers.next() + .each(function() { + maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() ); + }) + .height( maxHeight ); + } + }, + + _activate: function( index ) { + var active = this._findActive( index )[ 0 ]; + + // trying to activate the already active panel + if ( active === this.active[ 0 ] ) { + return; + } + + // trying to collapse, simulate a click on the currently active header + active = active || this.active[ 0 ]; + + this._eventHandler({ + target: active, + currentTarget: active, + preventDefault: $.noop + }); + }, + + _findActive: function( selector ) { + return typeof selector === "number" ? this.headers.eq( selector ) : $(); + }, + + _setupEvents: function( event ) { + var events = { + keydown: "_keydown" + }; + if ( event ) { + $.each( event.split(" "), function( index, eventName ) { + events[ eventName ] = "_eventHandler"; + }); + } + + this._off( this.headers.add( this.headers.next() ) ); + this._on( this.headers, events ); + this._on( this.headers.next(), { keydown: "_panelKeyDown" }); + this._hoverable( this.headers ); + this._focusable( this.headers ); + }, + + _eventHandler: function( event ) { + var options = this.options, + active = this.active, + clicked = $( event.currentTarget ), + clickedIsActive = clicked[ 0 ] === active[ 0 ], + collapsing = clickedIsActive && options.collapsible, + toShow = collapsing ? $() : clicked.next(), + toHide = active.next(), + eventData = { + oldHeader: active, + oldPanel: toHide, + newHeader: collapsing ? $() : clicked, + newPanel: toShow + }; + + event.preventDefault(); + + if ( + // click on active header, but not collapsible + ( clickedIsActive && !options.collapsible ) || + // allow canceling activation + ( this._trigger( "beforeActivate", event, eventData ) === false ) ) { + return; + } + + options.active = collapsing ? false : this.headers.index( clicked ); + + // when the call to ._toggle() comes after the class changes + // it causes a very odd bug in IE 8 (see #6720) + this.active = clickedIsActive ? $() : clicked; + this._toggle( eventData ); + + // switch classes + // corner classes on the previously active header stay after the animation + active.removeClass( "ui-accordion-header-active ui-state-active" ); + if ( options.icons ) { + active.children( ".ui-accordion-header-icon" ) + .removeClass( options.icons.activeHeader ) + .addClass( options.icons.header ); + } + + if ( !clickedIsActive ) { + clicked + .removeClass( "ui-corner-all" ) + .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" ); + if ( options.icons ) { + clicked.children( ".ui-accordion-header-icon" ) + .removeClass( options.icons.header ) + .addClass( options.icons.activeHeader ); + } + + clicked + .next() + .addClass( "ui-accordion-content-active" ); + } + }, + + _toggle: function( data ) { + var toShow = data.newPanel, + toHide = this.prevShow.length ? this.prevShow : data.oldPanel; + + // handle activating a panel during the animation for another activation + this.prevShow.add( this.prevHide ).stop( true, true ); + this.prevShow = toShow; + this.prevHide = toHide; + + if ( this.options.animate ) { + this._animate( toShow, toHide, data ); + } else { + toHide.hide(); + toShow.show(); + this._toggleComplete( data ); + } + + toHide.attr({ + "aria-hidden": "true" + }); + toHide.prev().attr( "aria-selected", "false" ); + // if we're switching panels, remove the old header from the tab order + // if we're opening from collapsed state, remove the previous header from the tab order + // if we're collapsing, then keep the collapsing header in the tab order + if ( toShow.length && toHide.length ) { + toHide.prev().attr({ + "tabIndex": -1, + "aria-expanded": "false" + }); + } else if ( toShow.length ) { + this.headers.filter(function() { + return $( this ).attr( "tabIndex" ) === 0; + }) + .attr( "tabIndex", -1 ); + } + + toShow + .attr( "aria-hidden", "false" ) + .prev() + .attr({ + "aria-selected": "true", + tabIndex: 0, + "aria-expanded": "true" + }); + }, + + _animate: function( toShow, toHide, data ) { + var total, easing, duration, + that = this, + adjust = 0, + down = toShow.length && + ( !toHide.length || ( toShow.index() < toHide.index() ) ), + animate = this.options.animate || {}, + options = down && animate.down || animate, + complete = function() { + that._toggleComplete( data ); + }; + + if ( typeof options === "number" ) { + duration = options; + } + if ( typeof options === "string" ) { + easing = options; + } + // fall back from options to animation in case of partial down settings + easing = easing || options.easing || animate.easing; + duration = duration || options.duration || animate.duration; + + if ( !toHide.length ) { + return toShow.animate( showProps, duration, easing, complete ); + } + if ( !toShow.length ) { + return toHide.animate( hideProps, duration, easing, complete ); + } + + total = toShow.show().outerHeight(); + toHide.animate( hideProps, { + duration: duration, + easing: easing, + step: function( now, fx ) { + fx.now = Math.round( now ); + } + }); + toShow + .hide() + .animate( showProps, { + duration: duration, + easing: easing, + complete: complete, + step: function( now, fx ) { + fx.now = Math.round( now ); + if ( fx.prop !== "height" ) { + adjust += fx.now; + } else if ( that.options.heightStyle !== "content" ) { + fx.now = Math.round( total - toHide.outerHeight() - adjust ); + adjust = 0; + } + } + }); + }, + + _toggleComplete: function( data ) { + var toHide = data.oldPanel; + + toHide + .removeClass( "ui-accordion-content-active" ) + .prev() + .removeClass( "ui-corner-top" ) + .addClass( "ui-corner-all" ); + + // Work around for rendering bug in IE (#5421) + if ( toHide.length ) { + toHide.parent()[0].className = toHide.parent()[0].className; + } + this._trigger( "activate", null, data ); + } +}); + +})( jQuery ); +(function( $, undefined ) { + +$.widget( "ui.autocomplete", { + version: "1.10.4", + defaultElement: "", + options: { + appendTo: null, + autoFocus: false, + delay: 300, + minLength: 1, + position: { + my: "left top", + at: "left bottom", + collision: "none" + }, + source: null, + + // callbacks + change: null, + close: null, + focus: null, + open: null, + response: null, + search: null, + select: null + }, + + requestIndex: 0, + pending: 0, + + _create: function() { + // Some browsers only repeat keydown events, not keypress events, + // so we use the suppressKeyPress flag to determine if we've already + // handled the keydown event. #7269 + // Unfortunately the code for & in keypress is the same as the up arrow, + // so we use the suppressKeyPressRepeat flag to avoid handling keypress + // events when we know the keydown event was used to modify the + // search term. #7799 + var suppressKeyPress, suppressKeyPressRepeat, suppressInput, + nodeName = this.element[0].nodeName.toLowerCase(), + isTextarea = nodeName === "textarea", + isInput = nodeName === "input"; + + this.isMultiLine = + // Textareas are always multi-line + isTextarea ? true : + // Inputs are always single-line, even if inside a contentEditable element + // IE also treats inputs as contentEditable + isInput ? false : + // All other element types are determined by whether or not they're contentEditable + this.element.prop( "isContentEditable" ); + + this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ]; + this.isNewMenu = true; + + this.element + .addClass( "ui-autocomplete-input" ) + .attr( "autocomplete", "off" ); + + this._on( this.element, { + keydown: function( event ) { + if ( this.element.prop( "readOnly" ) ) { + suppressKeyPress = true; + suppressInput = true; + suppressKeyPressRepeat = true; + return; + } + + suppressKeyPress = false; + suppressInput = false; + suppressKeyPressRepeat = false; + var keyCode = $.ui.keyCode; + switch( event.keyCode ) { + case keyCode.PAGE_UP: + suppressKeyPress = true; + this._move( "previousPage", event ); + break; + case keyCode.PAGE_DOWN: + suppressKeyPress = true; + this._move( "nextPage", event ); + break; + case keyCode.UP: + suppressKeyPress = true; + this._keyEvent( "previous", event ); + break; + case keyCode.DOWN: + suppressKeyPress = true; + this._keyEvent( "next", event ); + break; + case keyCode.ENTER: + case keyCode.NUMPAD_ENTER: + // when menu is open and has focus + if ( this.menu.active ) { + // #6055 - Opera still allows the keypress to occur + // which causes forms to submit + suppressKeyPress = true; + event.preventDefault(); + this.menu.select( event ); + } + break; + case keyCode.TAB: + if ( this.menu.active ) { + this.menu.select( event ); + } + break; + case keyCode.ESCAPE: + if ( this.menu.element.is( ":visible" ) ) { + this._value( this.term ); + this.close( event ); + // Different browsers have different default behavior for escape + // Single press can mean undo or clear + // Double press in IE means clear the whole form + event.preventDefault(); + } + break; + default: + suppressKeyPressRepeat = true; + // search timeout should be triggered before the input value is changed + this._searchTimeout( event ); + break; + } + }, + keypress: function( event ) { + if ( suppressKeyPress ) { + suppressKeyPress = false; + if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) { + event.preventDefault(); + } + return; + } + if ( suppressKeyPressRepeat ) { + return; + } + + // replicate some key handlers to allow them to repeat in Firefox and Opera + var keyCode = $.ui.keyCode; + switch( event.keyCode ) { + case keyCode.PAGE_UP: + this._move( "previousPage", event ); + break; + case keyCode.PAGE_DOWN: + this._move( "nextPage", event ); + break; + case keyCode.UP: + this._keyEvent( "previous", event ); + break; + case keyCode.DOWN: + this._keyEvent( "next", event ); + break; + } + }, + input: function( event ) { + if ( suppressInput ) { + suppressInput = false; + event.preventDefault(); + return; + } + this._searchTimeout( event ); + }, + focus: function() { + this.selectedItem = null; + this.previous = this._value(); + }, + blur: function( event ) { + if ( this.cancelBlur ) { + delete this.cancelBlur; + return; + } + + clearTimeout( this.searching ); + this.close( event ); + this._change( event ); + } + }); + + this._initSource(); + this.menu = $( "
      " ) + .addClass( "ui-autocomplete ui-front" ) + .appendTo( this._appendTo() ) + .menu({ + // disable ARIA support, the live region takes care of that + role: null + }) + .hide() + .data( "ui-menu" ); + + this._on( this.menu.element, { + mousedown: function( event ) { + // prevent moving focus out of the text field + event.preventDefault(); + + // IE doesn't prevent moving focus even with event.preventDefault() + // so we set a flag to know when we should ignore the blur event + this.cancelBlur = true; + this._delay(function() { + delete this.cancelBlur; + }); + + // clicking on the scrollbar causes focus to shift to the body + // but we can't detect a mouseup or a click immediately afterward + // so we have to track the next mousedown and close the menu if + // the user clicks somewhere outside of the autocomplete + var menuElement = this.menu.element[ 0 ]; + if ( !$( event.target ).closest( ".ui-menu-item" ).length ) { + this._delay(function() { + var that = this; + this.document.one( "mousedown", function( event ) { + if ( event.target !== that.element[ 0 ] && + event.target !== menuElement && + !$.contains( menuElement, event.target ) ) { + that.close(); + } + }); + }); + } + }, + menufocus: function( event, ui ) { + // support: Firefox + // Prevent accidental activation of menu items in Firefox (#7024 #9118) + if ( this.isNewMenu ) { + this.isNewMenu = false; + if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) { + this.menu.blur(); + + this.document.one( "mousemove", function() { + $( event.target ).trigger( event.originalEvent ); + }); + + return; + } + } + + var item = ui.item.data( "ui-autocomplete-item" ); + if ( false !== this._trigger( "focus", event, { item: item } ) ) { + // use value to match what will end up in the input, if it was a key event + if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) { + this._value( item.value ); + } + } else { + // Normally the input is populated with the item's value as the + // menu is navigated, causing screen readers to notice a change and + // announce the item. Since the focus event was canceled, this doesn't + // happen, so we update the live region so that screen readers can + // still notice the change and announce it. + this.liveRegion.text( item.value ); + } + }, + menuselect: function( event, ui ) { + var item = ui.item.data( "ui-autocomplete-item" ), + previous = this.previous; + + // only trigger when focus was lost (click on menu) + if ( this.element[0] !== this.document[0].activeElement ) { + this.element.focus(); + this.previous = previous; + // #6109 - IE triggers two focus events and the second + // is asynchronous, so we need to reset the previous + // term synchronously and asynchronously :-( + this._delay(function() { + this.previous = previous; + this.selectedItem = item; + }); + } + + if ( false !== this._trigger( "select", event, { item: item } ) ) { + this._value( item.value ); + } + // reset the term after the select event + // this allows custom select handling to work properly + this.term = this._value(); + + this.close( event ); + this.selectedItem = item; + } + }); + + this.liveRegion = $( "", { + role: "status", + "aria-live": "polite" + }) + .addClass( "ui-helper-hidden-accessible" ) + .insertBefore( this.element ); + + // turning off autocomplete prevents the browser from remembering the + // value when navigating through history, so we re-enable autocomplete + // if the page is unloaded before the widget is destroyed. #7790 + this._on( this.window, { + beforeunload: function() { + this.element.removeAttr( "autocomplete" ); + } + }); + }, + + _destroy: function() { + clearTimeout( this.searching ); + this.element + .removeClass( "ui-autocomplete-input" ) + .removeAttr( "autocomplete" ); + this.menu.element.remove(); + this.liveRegion.remove(); + }, + + _setOption: function( key, value ) { + this._super( key, value ); + if ( key === "source" ) { + this._initSource(); + } + if ( key === "appendTo" ) { + this.menu.element.appendTo( this._appendTo() ); + } + if ( key === "disabled" && value && this.xhr ) { + this.xhr.abort(); + } + }, + + _appendTo: function() { + var element = this.options.appendTo; + + if ( element ) { + element = element.jquery || element.nodeType ? + $( element ) : + this.document.find( element ).eq( 0 ); + } + + if ( !element ) { + element = this.element.closest( ".ui-front" ); + } + + if ( !element.length ) { + element = this.document[0].body; + } + + return element; + }, + + _initSource: function() { + var array, url, + that = this; + if ( $.isArray(this.options.source) ) { + array = this.options.source; + this.source = function( request, response ) { + response( $.ui.autocomplete.filter( array, request.term ) ); + }; + } else if ( typeof this.options.source === "string" ) { + url = this.options.source; + this.source = function( request, response ) { + if ( that.xhr ) { + that.xhr.abort(); + } + that.xhr = $.ajax({ + url: url, + data: request, + dataType: "json", + success: function( data ) { + response( data ); + }, + error: function() { + response( [] ); + } + }); + }; + } else { + this.source = this.options.source; + } + }, + + _searchTimeout: function( event ) { + clearTimeout( this.searching ); + this.searching = this._delay(function() { + // only search if the value has changed + if ( this.term !== this._value() ) { + this.selectedItem = null; + this.search( null, event ); + } + }, this.options.delay ); + }, + + search: function( value, event ) { + value = value != null ? value : this._value(); + + // always save the actual value, not the one passed as an argument + this.term = this._value(); + + if ( value.length < this.options.minLength ) { + return this.close( event ); + } + + if ( this._trigger( "search", event ) === false ) { + return; + } + + return this._search( value ); + }, + + _search: function( value ) { + this.pending++; + this.element.addClass( "ui-autocomplete-loading" ); + this.cancelSearch = false; + + this.source( { term: value }, this._response() ); + }, + + _response: function() { + var index = ++this.requestIndex; + + return $.proxy(function( content ) { + if ( index === this.requestIndex ) { + this.__response( content ); + } + + this.pending--; + if ( !this.pending ) { + this.element.removeClass( "ui-autocomplete-loading" ); + } + }, this ); + }, + + __response: function( content ) { + if ( content ) { + content = this._normalize( content ); + } + this._trigger( "response", null, { content: content } ); + if ( !this.options.disabled && content && content.length && !this.cancelSearch ) { + this._suggest( content ); + this._trigger( "open" ); + } else { + // use ._close() instead of .close() so we don't cancel future searches + this._close(); + } + }, + + close: function( event ) { + this.cancelSearch = true; + this._close( event ); + }, + + _close: function( event ) { + if ( this.menu.element.is( ":visible" ) ) { + this.menu.element.hide(); + this.menu.blur(); + this.isNewMenu = true; + this._trigger( "close", event ); + } + }, + + _change: function( event ) { + if ( this.previous !== this._value() ) { + this._trigger( "change", event, { item: this.selectedItem } ); + } + }, + + _normalize: function( items ) { + // assume all items have the right format when the first item is complete + if ( items.length && items[0].label && items[0].value ) { + return items; + } + return $.map( items, function( item ) { + if ( typeof item === "string" ) { + return { + label: item, + value: item + }; + } + return $.extend({ + label: item.label || item.value, + value: item.value || item.label + }, item ); + }); + }, + + _suggest: function( items ) { + var ul = this.menu.element.empty(); + this._renderMenu( ul, items ); + this.isNewMenu = true; + this.menu.refresh(); + + // size and position menu + ul.show(); + this._resizeMenu(); + ul.position( $.extend({ + of: this.element + }, this.options.position )); + + if ( this.options.autoFocus ) { + this.menu.next(); + } + }, + + _resizeMenu: function() { + var ul = this.menu.element; + ul.outerWidth( Math.max( + // Firefox wraps long text (possibly a rounding bug) + // so we add 1px to avoid the wrapping (#7513) + ul.width( "" ).outerWidth() + 1, + this.element.outerWidth() + ) ); + }, + + _renderMenu: function( ul, items ) { + var that = this; + $.each( items, function( index, item ) { + that._renderItemData( ul, item ); + }); + }, + + _renderItemData: function( ul, item ) { + return this._renderItem( ul, item ).data( "ui-autocomplete-item", item ); + }, + + _renderItem: function( ul, item ) { + return $( "
    • " ) + .append( $( "" ).text( item.label ) ) + .appendTo( ul ); + }, + + _move: function( direction, event ) { + if ( !this.menu.element.is( ":visible" ) ) { + this.search( null, event ); + return; + } + if ( this.menu.isFirstItem() && /^previous/.test( direction ) || + this.menu.isLastItem() && /^next/.test( direction ) ) { + this._value( this.term ); + this.menu.blur(); + return; + } + this.menu[ direction ]( event ); + }, + + widget: function() { + return this.menu.element; + }, + + _value: function() { + return this.valueMethod.apply( this.element, arguments ); + }, + + _keyEvent: function( keyEvent, event ) { + if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) { + this._move( keyEvent, event ); + + // prevents moving cursor to beginning/end of the text field in some browsers + event.preventDefault(); + } + } +}); + +$.extend( $.ui.autocomplete, { + escapeRegex: function( value ) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); + }, + filter: function(array, term) { + var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" ); + return $.grep( array, function(value) { + return matcher.test( value.label || value.value || value ); + }); + } +}); + + +// live region extension, adding a `messages` option +// NOTE: This is an experimental API. We are still investigating +// a full solution for string manipulation and internationalization. +$.widget( "ui.autocomplete", $.ui.autocomplete, { + options: { + messages: { + noResults: "No search results.", + results: function( amount ) { + return amount + ( amount > 1 ? " results are" : " result is" ) + + " available, use up and down arrow keys to navigate."; + } + } + }, + + __response: function( content ) { + var message; + this._superApply( arguments ); + if ( this.options.disabled || this.cancelSearch ) { + return; + } + if ( content && content.length ) { + message = this.options.messages.results( content.length ); + } else { + message = this.options.messages.noResults; + } + this.liveRegion.text( message ); + } +}); + +}( jQuery )); +(function( $, undefined ) { + +var lastActive, + baseClasses = "ui-button ui-widget ui-state-default ui-corner-all", + typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only", + formResetHandler = function() { + var form = $( this ); + setTimeout(function() { + form.find( ":ui-button" ).button( "refresh" ); + }, 1 ); + }, + radioGroup = function( radio ) { + var name = radio.name, + form = radio.form, + radios = $( [] ); + if ( name ) { + name = name.replace( /'/g, "\\'" ); + if ( form ) { + radios = $( form ).find( "[name='" + name + "']" ); + } else { + radios = $( "[name='" + name + "']", radio.ownerDocument ) + .filter(function() { + return !this.form; + }); + } + } + return radios; + }; + +$.widget( "ui.button", { + version: "1.10.4", + defaultElement: "").addClass(this._triggerClass). + html(!buttonImage ? buttonText : $("").attr( + { src:buttonImage, alt:buttonText, title:buttonText }))); + input[isRTL ? "before" : "after"](inst.trigger); + inst.trigger.click(function() { + if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) { + $.datepicker._hideDatepicker(); + } else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) { + $.datepicker._hideDatepicker(); + $.datepicker._showDatepicker(input[0]); + } else { + $.datepicker._showDatepicker(input[0]); + } + return false; + }); + } + }, + + /* Apply the maximum length for the date format. */ + _autoSize: function(inst) { + if (this._get(inst, "autoSize") && !inst.inline) { + var findMax, max, maxI, i, + date = new Date(2009, 12 - 1, 20), // Ensure double digits + dateFormat = this._get(inst, "dateFormat"); + + if (dateFormat.match(/[DM]/)) { + findMax = function(names) { + max = 0; + maxI = 0; + for (i = 0; i < names.length; i++) { + if (names[i].length > max) { + max = names[i].length; + maxI = i; + } + } + return maxI; + }; + date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ? + "monthNames" : "monthNamesShort")))); + date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ? + "dayNames" : "dayNamesShort"))) + 20 - date.getDay()); + } + inst.input.attr("size", this._formatDate(inst, date).length); + } + }, + + /* Attach an inline date picker to a div. */ + _inlineDatepicker: function(target, inst) { + var divSpan = $(target); + if (divSpan.hasClass(this.markerClassName)) { + return; + } + divSpan.addClass(this.markerClassName).append(inst.dpDiv); + $.data(target, PROP_NAME, inst); + this._setDate(inst, this._getDefaultDate(inst), true); + this._updateDatepicker(inst); + this._updateAlternate(inst); + //If disabled option is true, disable the datepicker before showing it (see ticket #5665) + if( inst.settings.disabled ) { + this._disableDatepicker( target ); + } + // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements + // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height + inst.dpDiv.css( "display", "block" ); + }, + + /* Pop-up the date picker in a "dialog" box. + * @param input element - ignored + * @param date string or Date - the initial date to display + * @param onSelect function - the function to call when a date is selected + * @param settings object - update the dialog date picker instance's settings (anonymous object) + * @param pos int[2] - coordinates for the dialog's position within the screen or + * event - with x/y coordinates or + * leave empty for default (screen centre) + * @return the manager object + */ + _dialogDatepicker: function(input, date, onSelect, settings, pos) { + var id, browserWidth, browserHeight, scrollX, scrollY, + inst = this._dialogInst; // internal instance + + if (!inst) { + this.uuid += 1; + id = "dp" + this.uuid; + this._dialogInput = $(""); + this._dialogInput.keydown(this._doKeyDown); + $("body").append(this._dialogInput); + inst = this._dialogInst = this._newInst(this._dialogInput, false); + inst.settings = {}; + $.data(this._dialogInput[0], PROP_NAME, inst); + } + extendRemove(inst.settings, settings || {}); + date = (date && date.constructor === Date ? this._formatDate(inst, date) : date); + this._dialogInput.val(date); + + this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null); + if (!this._pos) { + browserWidth = document.documentElement.clientWidth; + browserHeight = document.documentElement.clientHeight; + scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; + scrollY = document.documentElement.scrollTop || document.body.scrollTop; + this._pos = // should use actual width/height below + [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]; + } + + // move input on screen for focus, but hidden behind dialog + this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px"); + inst.settings.onSelect = onSelect; + this._inDialog = true; + this.dpDiv.addClass(this._dialogClass); + this._showDatepicker(this._dialogInput[0]); + if ($.blockUI) { + $.blockUI(this.dpDiv); + } + $.data(this._dialogInput[0], PROP_NAME, inst); + return this; + }, + + /* Detach a datepicker from its control. + * @param target element - the target input field or division or span + */ + _destroyDatepicker: function(target) { + var nodeName, + $target = $(target), + inst = $.data(target, PROP_NAME); + + if (!$target.hasClass(this.markerClassName)) { + return; + } + + nodeName = target.nodeName.toLowerCase(); + $.removeData(target, PROP_NAME); + if (nodeName === "input") { + inst.append.remove(); + inst.trigger.remove(); + $target.removeClass(this.markerClassName). + unbind("focus", this._showDatepicker). + unbind("keydown", this._doKeyDown). + unbind("keypress", this._doKeyPress). + unbind("keyup", this._doKeyUp); + } else if (nodeName === "div" || nodeName === "span") { + $target.removeClass(this.markerClassName).empty(); + } + }, + + /* Enable the date picker to a jQuery selection. + * @param target element - the target input field or division or span + */ + _enableDatepicker: function(target) { + var nodeName, inline, + $target = $(target), + inst = $.data(target, PROP_NAME); + + if (!$target.hasClass(this.markerClassName)) { + return; + } + + nodeName = target.nodeName.toLowerCase(); + if (nodeName === "input") { + target.disabled = false; + inst.trigger.filter("button"). + each(function() { this.disabled = false; }).end(). + filter("img").css({opacity: "1.0", cursor: ""}); + } else if (nodeName === "div" || nodeName === "span") { + inline = $target.children("." + this._inlineClass); + inline.children().removeClass("ui-state-disabled"); + inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). + prop("disabled", false); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value === target ? null : value); }); // delete entry + }, + + /* Disable the date picker to a jQuery selection. + * @param target element - the target input field or division or span + */ + _disableDatepicker: function(target) { + var nodeName, inline, + $target = $(target), + inst = $.data(target, PROP_NAME); + + if (!$target.hasClass(this.markerClassName)) { + return; + } + + nodeName = target.nodeName.toLowerCase(); + if (nodeName === "input") { + target.disabled = true; + inst.trigger.filter("button"). + each(function() { this.disabled = true; }).end(). + filter("img").css({opacity: "0.5", cursor: "default"}); + } else if (nodeName === "div" || nodeName === "span") { + inline = $target.children("." + this._inlineClass); + inline.children().addClass("ui-state-disabled"); + inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). + prop("disabled", true); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value === target ? null : value); }); // delete entry + this._disabledInputs[this._disabledInputs.length] = target; + }, + + /* Is the first field in a jQuery collection disabled as a datepicker? + * @param target element - the target input field or division or span + * @return boolean - true if disabled, false if enabled + */ + _isDisabledDatepicker: function(target) { + if (!target) { + return false; + } + for (var i = 0; i < this._disabledInputs.length; i++) { + if (this._disabledInputs[i] === target) { + return true; + } + } + return false; + }, + + /* Retrieve the instance data for the target control. + * @param target element - the target input field or division or span + * @return object - the associated instance data + * @throws error if a jQuery problem getting data + */ + _getInst: function(target) { + try { + return $.data(target, PROP_NAME); + } + catch (err) { + throw "Missing instance data for this datepicker"; + } + }, + + /* Update or retrieve the settings for a date picker attached to an input field or division. + * @param target element - the target input field or division or span + * @param name object - the new settings to update or + * string - the name of the setting to change or retrieve, + * when retrieving also "all" for all instance settings or + * "defaults" for all global defaults + * @param value any - the new value for the setting + * (omit if above is an object or to retrieve a value) + */ + _optionDatepicker: function(target, name, value) { + var settings, date, minDate, maxDate, + inst = this._getInst(target); + + if (arguments.length === 2 && typeof name === "string") { + return (name === "defaults" ? $.extend({}, $.datepicker._defaults) : + (inst ? (name === "all" ? $.extend({}, inst.settings) : + this._get(inst, name)) : null)); + } + + settings = name || {}; + if (typeof name === "string") { + settings = {}; + settings[name] = value; + } + + if (inst) { + if (this._curInst === inst) { + this._hideDatepicker(); + } + + date = this._getDateDatepicker(target, true); + minDate = this._getMinMaxDate(inst, "min"); + maxDate = this._getMinMaxDate(inst, "max"); + extendRemove(inst.settings, settings); + // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided + if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) { + inst.settings.minDate = this._formatDate(inst, minDate); + } + if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) { + inst.settings.maxDate = this._formatDate(inst, maxDate); + } + if ( "disabled" in settings ) { + if ( settings.disabled ) { + this._disableDatepicker(target); + } else { + this._enableDatepicker(target); + } + } + this._attachments($(target), inst); + this._autoSize(inst); + this._setDate(inst, date); + this._updateAlternate(inst); + this._updateDatepicker(inst); + } + }, + + // change method deprecated + _changeDatepicker: function(target, name, value) { + this._optionDatepicker(target, name, value); + }, + + /* Redraw the date picker attached to an input field or division. + * @param target element - the target input field or division or span + */ + _refreshDatepicker: function(target) { + var inst = this._getInst(target); + if (inst) { + this._updateDatepicker(inst); + } + }, + + /* Set the dates for a jQuery selection. + * @param target element - the target input field or division or span + * @param date Date - the new date + */ + _setDateDatepicker: function(target, date) { + var inst = this._getInst(target); + if (inst) { + this._setDate(inst, date); + this._updateDatepicker(inst); + this._updateAlternate(inst); + } + }, + + /* Get the date(s) for the first entry in a jQuery selection. + * @param target element - the target input field or division or span + * @param noDefault boolean - true if no default date is to be used + * @return Date - the current date + */ + _getDateDatepicker: function(target, noDefault) { + var inst = this._getInst(target); + if (inst && !inst.inline) { + this._setDateFromField(inst, noDefault); + } + return (inst ? this._getDate(inst) : null); + }, + + /* Handle keystrokes. */ + _doKeyDown: function(event) { + var onSelect, dateStr, sel, + inst = $.datepicker._getInst(event.target), + handled = true, + isRTL = inst.dpDiv.is(".ui-datepicker-rtl"); + + inst._keyEvent = true; + if ($.datepicker._datepickerShowing) { + switch (event.keyCode) { + case 9: $.datepicker._hideDatepicker(); + handled = false; + break; // hide on tab out + case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." + + $.datepicker._currentClass + ")", inst.dpDiv); + if (sel[0]) { + $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]); + } + + onSelect = $.datepicker._get(inst, "onSelect"); + if (onSelect) { + dateStr = $.datepicker._formatDate(inst); + + // trigger custom callback + onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); + } else { + $.datepicker._hideDatepicker(); + } + + return false; // don't submit the form + case 27: $.datepicker._hideDatepicker(); + break; // hide on escape + case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, "stepBigMonths") : + -$.datepicker._get(inst, "stepMonths")), "M"); + break; // previous month/year on page up/+ ctrl + case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, "stepBigMonths") : + +$.datepicker._get(inst, "stepMonths")), "M"); + break; // next month/year on page down/+ ctrl + case 35: if (event.ctrlKey || event.metaKey) { + $.datepicker._clearDate(event.target); + } + handled = event.ctrlKey || event.metaKey; + break; // clear on ctrl or command +end + case 36: if (event.ctrlKey || event.metaKey) { + $.datepicker._gotoToday(event.target); + } + handled = event.ctrlKey || event.metaKey; + break; // current on ctrl or command +home + case 37: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D"); + } + handled = event.ctrlKey || event.metaKey; + // -1 day on ctrl or command +left + if (event.originalEvent.altKey) { + $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, "stepBigMonths") : + -$.datepicker._get(inst, "stepMonths")), "M"); + } + // next month/year on alt +left on Mac + break; + case 38: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, -7, "D"); + } + handled = event.ctrlKey || event.metaKey; + break; // -1 week on ctrl or command +up + case 39: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D"); + } + handled = event.ctrlKey || event.metaKey; + // +1 day on ctrl or command +right + if (event.originalEvent.altKey) { + $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, "stepBigMonths") : + +$.datepicker._get(inst, "stepMonths")), "M"); + } + // next month/year on alt +right + break; + case 40: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, +7, "D"); + } + handled = event.ctrlKey || event.metaKey; + break; // +1 week on ctrl or command +down + default: handled = false; + } + } else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home + $.datepicker._showDatepicker(this); + } else { + handled = false; + } + + if (handled) { + event.preventDefault(); + event.stopPropagation(); + } + }, + + /* Filter entered characters - based on date format. */ + _doKeyPress: function(event) { + var chars, chr, + inst = $.datepicker._getInst(event.target); + + if ($.datepicker._get(inst, "constrainInput")) { + chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat")); + chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode); + return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1); + } + }, + + /* Synchronise manual entry and field/alternate field. */ + _doKeyUp: function(event) { + var date, + inst = $.datepicker._getInst(event.target); + + if (inst.input.val() !== inst.lastVal) { + try { + date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"), + (inst.input ? inst.input.val() : null), + $.datepicker._getFormatConfig(inst)); + + if (date) { // only if valid + $.datepicker._setDateFromField(inst); + $.datepicker._updateAlternate(inst); + $.datepicker._updateDatepicker(inst); + } + } + catch (err) { + } + } + return true; + }, + + /* Pop-up the date picker for a given input field. + * If false returned from beforeShow event handler do not show. + * @param input element - the input field attached to the date picker or + * event - if triggered by focus + */ + _showDatepicker: function(input) { + input = input.target || input; + if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger + input = $("input", input.parentNode)[0]; + } + + if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here + return; + } + + var inst, beforeShow, beforeShowSettings, isFixed, + offset, showAnim, duration; + + inst = $.datepicker._getInst(input); + if ($.datepicker._curInst && $.datepicker._curInst !== inst) { + $.datepicker._curInst.dpDiv.stop(true, true); + if ( inst && $.datepicker._datepickerShowing ) { + $.datepicker._hideDatepicker( $.datepicker._curInst.input[0] ); + } + } + + beforeShow = $.datepicker._get(inst, "beforeShow"); + beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {}; + if(beforeShowSettings === false){ + return; + } + extendRemove(inst.settings, beforeShowSettings); + + inst.lastVal = null; + $.datepicker._lastInput = input; + $.datepicker._setDateFromField(inst); + + if ($.datepicker._inDialog) { // hide cursor + input.value = ""; + } + if (!$.datepicker._pos) { // position below input + $.datepicker._pos = $.datepicker._findPos(input); + $.datepicker._pos[1] += input.offsetHeight; // add the height + } + + isFixed = false; + $(input).parents().each(function() { + isFixed |= $(this).css("position") === "fixed"; + return !isFixed; + }); + + offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]}; + $.datepicker._pos = null; + //to avoid flashes on Firefox + inst.dpDiv.empty(); + // determine sizing offscreen + inst.dpDiv.css({position: "absolute", display: "block", top: "-1000px"}); + $.datepicker._updateDatepicker(inst); + // fix width for dynamic number of date pickers + // and adjust position before showing + offset = $.datepicker._checkOffset(inst, offset, isFixed); + inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ? + "static" : (isFixed ? "fixed" : "absolute")), display: "none", + left: offset.left + "px", top: offset.top + "px"}); + + if (!inst.inline) { + showAnim = $.datepicker._get(inst, "showAnim"); + duration = $.datepicker._get(inst, "duration"); + inst.dpDiv.zIndex($(input).zIndex()+1); + $.datepicker._datepickerShowing = true; + + if ( $.effects && $.effects.effect[ showAnim ] ) { + inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration); + } else { + inst.dpDiv[showAnim || "show"](showAnim ? duration : null); + } + + if ( $.datepicker._shouldFocusInput( inst ) ) { + inst.input.focus(); + } + + $.datepicker._curInst = inst; + } + }, + + /* Generate the date picker content. */ + _updateDatepicker: function(inst) { + this.maxRows = 4; //Reset the max number of rows being displayed (see #7043) + instActive = inst; // for delegate hover events + inst.dpDiv.empty().append(this._generateHTML(inst)); + this._attachHandlers(inst); + inst.dpDiv.find("." + this._dayOverClass + " a").mouseover(); + + var origyearshtml, + numMonths = this._getNumberOfMonths(inst), + cols = numMonths[1], + width = 17; + + inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""); + if (cols > 1) { + inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em"); + } + inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") + + "Class"]("ui-datepicker-multi"); + inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove") + + "Class"]("ui-datepicker-rtl"); + + if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) { + inst.input.focus(); + } + + // deffered render of the years select (to avoid flashes on Firefox) + if( inst.yearshtml ){ + origyearshtml = inst.yearshtml; + setTimeout(function(){ + //assure that inst.yearshtml didn't change. + if( origyearshtml === inst.yearshtml && inst.yearshtml ){ + inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml); + } + origyearshtml = inst.yearshtml = null; + }, 0); + } + }, + + // #6694 - don't focus the input if it's already focused + // this breaks the change event in IE + // Support: IE and jQuery <1.9 + _shouldFocusInput: function( inst ) { + return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" ); + }, + + /* Check positioning to remain on screen. */ + _checkOffset: function(inst, offset, isFixed) { + var dpWidth = inst.dpDiv.outerWidth(), + dpHeight = inst.dpDiv.outerHeight(), + inputWidth = inst.input ? inst.input.outerWidth() : 0, + inputHeight = inst.input ? inst.input.outerHeight() : 0, + viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()), + viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop()); + + offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0); + offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0; + offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0; + + // now check if datepicker is showing outside window viewport - move to a better place if so. + offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? + Math.abs(offset.left + dpWidth - viewWidth) : 0); + offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? + Math.abs(dpHeight + inputHeight) : 0); + + return offset; + }, + + /* Find an object's position on the screen. */ + _findPos: function(obj) { + var position, + inst = this._getInst(obj), + isRTL = this._get(inst, "isRTL"); + + while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) { + obj = obj[isRTL ? "previousSibling" : "nextSibling"]; + } + + position = $(obj).offset(); + return [position.left, position.top]; + }, + + /* Hide the date picker from view. + * @param input element - the input field attached to the date picker + */ + _hideDatepicker: function(input) { + var showAnim, duration, postProcess, onClose, + inst = this._curInst; + + if (!inst || (input && inst !== $.data(input, PROP_NAME))) { + return; + } + + if (this._datepickerShowing) { + showAnim = this._get(inst, "showAnim"); + duration = this._get(inst, "duration"); + postProcess = function() { + $.datepicker._tidyDialog(inst); + }; + + // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed + if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) { + inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess); + } else { + inst.dpDiv[(showAnim === "slideDown" ? "slideUp" : + (showAnim === "fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess); + } + + if (!showAnim) { + postProcess(); + } + this._datepickerShowing = false; + + onClose = this._get(inst, "onClose"); + if (onClose) { + onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : ""), inst]); + } + + this._lastInput = null; + if (this._inDialog) { + this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" }); + if ($.blockUI) { + $.unblockUI(); + $("body").append(this.dpDiv); + } + } + this._inDialog = false; + } + }, + + /* Tidy up after a dialog display. */ + _tidyDialog: function(inst) { + inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar"); + }, + + /* Close date picker if clicked elsewhere. */ + _checkExternalClick: function(event) { + if (!$.datepicker._curInst) { + return; + } + + var $target = $(event.target), + inst = $.datepicker._getInst($target[0]); + + if ( ( ( $target[0].id !== $.datepicker._mainDivId && + $target.parents("#" + $.datepicker._mainDivId).length === 0 && + !$target.hasClass($.datepicker.markerClassName) && + !$target.closest("." + $.datepicker._triggerClass).length && + $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) || + ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) { + $.datepicker._hideDatepicker(); + } + }, + + /* Adjust one of the date sub-fields. */ + _adjustDate: function(id, offset, period) { + var target = $(id), + inst = this._getInst(target[0]); + + if (this._isDisabledDatepicker(target[0])) { + return; + } + this._adjustInstDate(inst, offset + + (period === "M" ? this._get(inst, "showCurrentAtPos") : 0), // undo positioning + period); + this._updateDatepicker(inst); + }, + + /* Action for current link. */ + _gotoToday: function(id) { + var date, + target = $(id), + inst = this._getInst(target[0]); + + if (this._get(inst, "gotoCurrent") && inst.currentDay) { + inst.selectedDay = inst.currentDay; + inst.drawMonth = inst.selectedMonth = inst.currentMonth; + inst.drawYear = inst.selectedYear = inst.currentYear; + } else { + date = new Date(); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + } + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Action for selecting a new month/year. */ + _selectMonthYear: function(id, select, period) { + var target = $(id), + inst = this._getInst(target[0]); + + inst["selected" + (period === "M" ? "Month" : "Year")] = + inst["draw" + (period === "M" ? "Month" : "Year")] = + parseInt(select.options[select.selectedIndex].value,10); + + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Action for selecting a day. */ + _selectDay: function(id, month, year, td) { + var inst, + target = $(id); + + if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) { + return; + } + + inst = this._getInst(target[0]); + inst.selectedDay = inst.currentDay = $("a", td).html(); + inst.selectedMonth = inst.currentMonth = month; + inst.selectedYear = inst.currentYear = year; + this._selectDate(id, this._formatDate(inst, + inst.currentDay, inst.currentMonth, inst.currentYear)); + }, + + /* Erase the input field and hide the date picker. */ + _clearDate: function(id) { + var target = $(id); + this._selectDate(target, ""); + }, + + /* Update the input field with the selected date. */ + _selectDate: function(id, dateStr) { + var onSelect, + target = $(id), + inst = this._getInst(target[0]); + + dateStr = (dateStr != null ? dateStr : this._formatDate(inst)); + if (inst.input) { + inst.input.val(dateStr); + } + this._updateAlternate(inst); + + onSelect = this._get(inst, "onSelect"); + if (onSelect) { + onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback + } else if (inst.input) { + inst.input.trigger("change"); // fire the change event + } + + if (inst.inline){ + this._updateDatepicker(inst); + } else { + this._hideDatepicker(); + this._lastInput = inst.input[0]; + if (typeof(inst.input[0]) !== "object") { + inst.input.focus(); // restore focus + } + this._lastInput = null; + } + }, + + /* Update any alternate field to synchronise with the main field. */ + _updateAlternate: function(inst) { + var altFormat, date, dateStr, + altField = this._get(inst, "altField"); + + if (altField) { // update alternate field too + altFormat = this._get(inst, "altFormat") || this._get(inst, "dateFormat"); + date = this._getDate(inst); + dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst)); + $(altField).each(function() { $(this).val(dateStr); }); + } + }, + + /* Set as beforeShowDay function to prevent selection of weekends. + * @param date Date - the date to customise + * @return [boolean, string] - is this date selectable?, what is its CSS class? + */ + noWeekends: function(date) { + var day = date.getDay(); + return [(day > 0 && day < 6), ""]; + }, + + /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. + * @param date Date - the date to get the week for + * @return number - the number of the week within the year that contains this date + */ + iso8601Week: function(date) { + var time, + checkDate = new Date(date.getTime()); + + // Find Thursday of this week starting on Monday + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); + + time = checkDate.getTime(); + checkDate.setMonth(0); // Compare with Jan 1 + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + }, + + /* Parse a string value into a date object. + * See formatDate below for the possible formats. + * + * @param format string - the expected format of the date + * @param value string - the date in the above format + * @param settings Object - attributes include: + * shortYearCutoff number - the cutoff year for determining the century (optional) + * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + * dayNames string[7] - names of the days from Sunday (optional) + * monthNamesShort string[12] - abbreviated names of the months (optional) + * monthNames string[12] - names of the months (optional) + * @return Date - the extracted date value or null if value is blank + */ + parseDate: function (format, value, settings) { + if (format == null || value == null) { + throw "Invalid arguments"; + } + + value = (typeof value === "object" ? value.toString() : value + ""); + if (value === "") { + return null; + } + + var iFormat, dim, extra, + iValue = 0, + shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff, + shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp : + new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)), + dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort, + dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames, + monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort, + monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames, + year = -1, + month = -1, + day = -1, + doy = -1, + literal = false, + date, + // Check whether a format character is doubled + lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); + if (matches) { + iFormat++; + } + return matches; + }, + // Extract a number from the string value + getNumber = function(match) { + var isDoubled = lookAhead(match), + size = (match === "@" ? 14 : (match === "!" ? 20 : + (match === "y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))), + digits = new RegExp("^\\d{1," + size + "}"), + num = value.substring(iValue).match(digits); + if (!num) { + throw "Missing number at position " + iValue; + } + iValue += num[0].length; + return parseInt(num[0], 10); + }, + // Extract a name from the string value and convert to an index + getName = function(match, shortNames, longNames) { + var index = -1, + names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) { + return [ [k, v] ]; + }).sort(function (a, b) { + return -(a[1].length - b[1].length); + }); + + $.each(names, function (i, pair) { + var name = pair[1]; + if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) { + index = pair[0]; + iValue += name.length; + return false; + } + }); + if (index !== -1) { + return index + 1; + } else { + throw "Unknown name at position " + iValue; + } + }, + // Confirm that a literal character matches the string value + checkLiteral = function() { + if (value.charAt(iValue) !== format.charAt(iFormat)) { + throw "Unexpected literal at position " + iValue; + } + iValue++; + }; + + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false; + } else { + checkLiteral(); + } + } else { + switch (format.charAt(iFormat)) { + case "d": + day = getNumber("d"); + break; + case "D": + getName("D", dayNamesShort, dayNames); + break; + case "o": + doy = getNumber("o"); + break; + case "m": + month = getNumber("m"); + break; + case "M": + month = getName("M", monthNamesShort, monthNames); + break; + case "y": + year = getNumber("y"); + break; + case "@": + date = new Date(getNumber("@")); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "!": + date = new Date((getNumber("!") - this._ticksTo1970) / 10000); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "'": + if (lookAhead("'")){ + checkLiteral(); + } else { + literal = true; + } + break; + default: + checkLiteral(); + } + } + } + + if (iValue < value.length){ + extra = value.substr(iValue); + if (!/^\s+/.test(extra)) { + throw "Extra/unparsed characters found in date: " + extra; + } + } + + if (year === -1) { + year = new Date().getFullYear(); + } else if (year < 100) { + year += new Date().getFullYear() - new Date().getFullYear() % 100 + + (year <= shortYearCutoff ? 0 : -100); + } + + if (doy > -1) { + month = 1; + day = doy; + do { + dim = this._getDaysInMonth(year, month - 1); + if (day <= dim) { + break; + } + month++; + day -= dim; + } while (true); + } + + date = this._daylightSavingAdjust(new Date(year, month - 1, day)); + if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) { + throw "Invalid date"; // E.g. 31/02/00 + } + return date; + }, + + /* Standard date formats. */ + ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601) + COOKIE: "D, dd M yy", + ISO_8601: "yy-mm-dd", + RFC_822: "D, d M y", + RFC_850: "DD, dd-M-y", + RFC_1036: "D, d M y", + RFC_1123: "D, d M yy", + RFC_2822: "D, d M yy", + RSS: "D, d M y", // RFC 822 + TICKS: "!", + TIMESTAMP: "@", + W3C: "yy-mm-dd", // ISO 8601 + + _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + + Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000), + + /* Format a date object into a string value. + * The format can be combinations of the following: + * d - day of month (no leading zero) + * dd - day of month (two digit) + * o - day of year (no leading zeros) + * oo - day of year (three digit) + * D - day name short + * DD - day name long + * m - month of year (no leading zero) + * mm - month of year (two digit) + * M - month name short + * MM - month name long + * y - year (two digit) + * yy - year (four digit) + * @ - Unix timestamp (ms since 01/01/1970) + * ! - Windows ticks (100ns since 01/01/0001) + * "..." - literal text + * '' - single quote + * + * @param format string - the desired format of the date + * @param date Date - the date value to format + * @param settings Object - attributes include: + * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + * dayNames string[7] - names of the days from Sunday (optional) + * monthNamesShort string[12] - abbreviated names of the months (optional) + * monthNames string[12] - names of the months (optional) + * @return string - the date in the above format + */ + formatDate: function (format, date, settings) { + if (!date) { + return ""; + } + + var iFormat, + dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort, + dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames, + monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort, + monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames, + // Check whether a format character is doubled + lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); + if (matches) { + iFormat++; + } + return matches; + }, + // Format a number, with leading zero if necessary + formatNumber = function(match, value, len) { + var num = "" + value; + if (lookAhead(match)) { + while (num.length < len) { + num = "0" + num; + } + } + return num; + }, + // Format a name, short or long as requested + formatName = function(match, value, shortNames, longNames) { + return (lookAhead(match) ? longNames[value] : shortNames[value]); + }, + output = "", + literal = false; + + if (date) { + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false; + } else { + output += format.charAt(iFormat); + } + } else { + switch (format.charAt(iFormat)) { + case "d": + output += formatNumber("d", date.getDate(), 2); + break; + case "D": + output += formatName("D", date.getDay(), dayNamesShort, dayNames); + break; + case "o": + output += formatNumber("o", + Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3); + break; + case "m": + output += formatNumber("m", date.getMonth() + 1, 2); + break; + case "M": + output += formatName("M", date.getMonth(), monthNamesShort, monthNames); + break; + case "y": + output += (lookAhead("y") ? date.getFullYear() : + (date.getYear() % 100 < 10 ? "0" : "") + date.getYear() % 100); + break; + case "@": + output += date.getTime(); + break; + case "!": + output += date.getTime() * 10000 + this._ticksTo1970; + break; + case "'": + if (lookAhead("'")) { + output += "'"; + } else { + literal = true; + } + break; + default: + output += format.charAt(iFormat); + } + } + } + } + return output; + }, + + /* Extract all possible characters from the date format. */ + _possibleChars: function (format) { + var iFormat, + chars = "", + literal = false, + // Check whether a format character is doubled + lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); + if (matches) { + iFormat++; + } + return matches; + }; + + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false; + } else { + chars += format.charAt(iFormat); + } + } else { + switch (format.charAt(iFormat)) { + case "d": case "m": case "y": case "@": + chars += "0123456789"; + break; + case "D": case "M": + return null; // Accept anything + case "'": + if (lookAhead("'")) { + chars += "'"; + } else { + literal = true; + } + break; + default: + chars += format.charAt(iFormat); + } + } + } + return chars; + }, + + /* Get a setting value, defaulting if necessary. */ + _get: function(inst, name) { + return inst.settings[name] !== undefined ? + inst.settings[name] : this._defaults[name]; + }, + + /* Parse existing date and initialise date picker. */ + _setDateFromField: function(inst, noDefault) { + if (inst.input.val() === inst.lastVal) { + return; + } + + var dateFormat = this._get(inst, "dateFormat"), + dates = inst.lastVal = inst.input ? inst.input.val() : null, + defaultDate = this._getDefaultDate(inst), + date = defaultDate, + settings = this._getFormatConfig(inst); + + try { + date = this.parseDate(dateFormat, dates, settings) || defaultDate; + } catch (event) { + dates = (noDefault ? "" : dates); + } + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + inst.currentDay = (dates ? date.getDate() : 0); + inst.currentMonth = (dates ? date.getMonth() : 0); + inst.currentYear = (dates ? date.getFullYear() : 0); + this._adjustInstDate(inst); + }, + + /* Retrieve the default date shown on opening. */ + _getDefaultDate: function(inst) { + return this._restrictMinMax(inst, + this._determineDate(inst, this._get(inst, "defaultDate"), new Date())); + }, + + /* A date may be specified as an exact value or a relative one. */ + _determineDate: function(inst, date, defaultDate) { + var offsetNumeric = function(offset) { + var date = new Date(); + date.setDate(date.getDate() + offset); + return date; + }, + offsetString = function(offset) { + try { + return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"), + offset, $.datepicker._getFormatConfig(inst)); + } + catch (e) { + // Ignore + } + + var date = (offset.toLowerCase().match(/^c/) ? + $.datepicker._getDate(inst) : null) || new Date(), + year = date.getFullYear(), + month = date.getMonth(), + day = date.getDate(), + pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g, + matches = pattern.exec(offset); + + while (matches) { + switch (matches[2] || "d") { + case "d" : case "D" : + day += parseInt(matches[1],10); break; + case "w" : case "W" : + day += parseInt(matches[1],10) * 7; break; + case "m" : case "M" : + month += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + case "y": case "Y" : + year += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + } + matches = pattern.exec(offset); + } + return new Date(year, month, day); + }, + newDate = (date == null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) : + (typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime())))); + + newDate = (newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate); + if (newDate) { + newDate.setHours(0); + newDate.setMinutes(0); + newDate.setSeconds(0); + newDate.setMilliseconds(0); + } + return this._daylightSavingAdjust(newDate); + }, + + /* Handle switch to/from daylight saving. + * Hours may be non-zero on daylight saving cut-over: + * > 12 when midnight changeover, but then cannot generate + * midnight datetime, so jump to 1AM, otherwise reset. + * @param date (Date) the date to check + * @return (Date) the corrected date + */ + _daylightSavingAdjust: function(date) { + if (!date) { + return null; + } + date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); + return date; + }, + + /* Set the date(s) directly. */ + _setDate: function(inst, date, noChange) { + var clear = !date, + origMonth = inst.selectedMonth, + origYear = inst.selectedYear, + newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date())); + + inst.selectedDay = inst.currentDay = newDate.getDate(); + inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth(); + inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear(); + if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) { + this._notifyChange(inst); + } + this._adjustInstDate(inst); + if (inst.input) { + inst.input.val(clear ? "" : this._formatDate(inst)); + } + }, + + /* Retrieve the date(s) directly. */ + _getDate: function(inst) { + var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null : + this._daylightSavingAdjust(new Date( + inst.currentYear, inst.currentMonth, inst.currentDay))); + return startDate; + }, + + /* Attach the onxxx handlers. These are declared statically so + * they work with static code transformers like Caja. + */ + _attachHandlers: function(inst) { + var stepMonths = this._get(inst, "stepMonths"), + id = "#" + inst.id.replace( /\\\\/g, "\\" ); + inst.dpDiv.find("[data-handler]").map(function () { + var handler = { + prev: function () { + $.datepicker._adjustDate(id, -stepMonths, "M"); + }, + next: function () { + $.datepicker._adjustDate(id, +stepMonths, "M"); + }, + hide: function () { + $.datepicker._hideDatepicker(); + }, + today: function () { + $.datepicker._gotoToday(id); + }, + selectDay: function () { + $.datepicker._selectDay(id, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this); + return false; + }, + selectMonth: function () { + $.datepicker._selectMonthYear(id, this, "M"); + return false; + }, + selectYear: function () { + $.datepicker._selectMonthYear(id, this, "Y"); + return false; + } + }; + $(this).bind(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]); + }); + }, + + /* Generate the HTML for the current state of the date picker. */ + _generateHTML: function(inst) { + var maxDraw, prevText, prev, nextText, next, currentText, gotoDate, + controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin, + monthNames, monthNamesShort, beforeShowDay, showOtherMonths, + selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate, + cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows, + printDate, dRow, tbody, daySettings, otherMonth, unselectable, + tempDate = new Date(), + today = this._daylightSavingAdjust( + new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time + isRTL = this._get(inst, "isRTL"), + showButtonPanel = this._get(inst, "showButtonPanel"), + hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"), + navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"), + numMonths = this._getNumberOfMonths(inst), + showCurrentAtPos = this._get(inst, "showCurrentAtPos"), + stepMonths = this._get(inst, "stepMonths"), + isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1), + currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) : + new Date(inst.currentYear, inst.currentMonth, inst.currentDay))), + minDate = this._getMinMaxDate(inst, "min"), + maxDate = this._getMinMaxDate(inst, "max"), + drawMonth = inst.drawMonth - showCurrentAtPos, + drawYear = inst.drawYear; + + if (drawMonth < 0) { + drawMonth += 12; + drawYear--; + } + if (maxDate) { + maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), + maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate())); + maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw); + while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) { + drawMonth--; + if (drawMonth < 0) { + drawMonth = 11; + drawYear--; + } + } + } + inst.drawMonth = drawMonth; + inst.drawYear = drawYear; + + prevText = this._get(inst, "prevText"); + prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), + this._getFormatConfig(inst))); + + prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? + "" + prevText + "" : + (hideIfNoPrevNext ? "" : "" + prevText + "")); + + nextText = this._get(inst, "nextText"); + nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), + this._getFormatConfig(inst))); + + next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? + "" + nextText + "" : + (hideIfNoPrevNext ? "" : "" + nextText + "")); + + currentText = this._get(inst, "currentText"); + gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today); + currentText = (!navigationAsDateFormat ? currentText : + this.formatDate(currentText, gotoDate, this._getFormatConfig(inst))); + + controls = (!inst.inline ? "" : ""); + + buttonPanel = (showButtonPanel) ? "
      " + (isRTL ? controls : "") + + (this._isInRange(inst, gotoDate) ? "" : "") + (isRTL ? "" : controls) + "
      " : ""; + + firstDay = parseInt(this._get(inst, "firstDay"),10); + firstDay = (isNaN(firstDay) ? 0 : firstDay); + + showWeek = this._get(inst, "showWeek"); + dayNames = this._get(inst, "dayNames"); + dayNamesMin = this._get(inst, "dayNamesMin"); + monthNames = this._get(inst, "monthNames"); + monthNamesShort = this._get(inst, "monthNamesShort"); + beforeShowDay = this._get(inst, "beforeShowDay"); + showOtherMonths = this._get(inst, "showOtherMonths"); + selectOtherMonths = this._get(inst, "selectOtherMonths"); + defaultDate = this._getDefaultDate(inst); + html = ""; + dow; + for (row = 0; row < numMonths[0]; row++) { + group = ""; + this.maxRows = 4; + for (col = 0; col < numMonths[1]; col++) { + selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay)); + cornerClass = " ui-corner-all"; + calender = ""; + if (isMultiMonth) { + calender += "
      "; + } + calender += "
      " + + (/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") + + (/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") + + this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, + row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers + "
      " + + ""; + thead = (showWeek ? "" : ""); + for (dow = 0; dow < 7; dow++) { // days of the week + day = (dow + firstDay) % 7; + thead += "= 5 ? " class='ui-datepicker-week-end'" : "") + ">" + + "" + dayNamesMin[day] + ""; + } + calender += thead + ""; + daysInMonth = this._getDaysInMonth(drawYear, drawMonth); + if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) { + inst.selectedDay = Math.min(inst.selectedDay, daysInMonth); + } + leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7; + curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate + numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043) + this.maxRows = numRows; + printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays)); + for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows + calender += ""; + tbody = (!showWeek ? "" : ""); + for (dow = 0; dow < 7; dow++) { // create date picker days + daySettings = (beforeShowDay ? + beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]); + otherMonth = (printDate.getMonth() !== drawMonth); + unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] || + (minDate && printDate < minDate) || (maxDate && printDate > maxDate); + tbody += ""; // display selectable date + printDate.setDate(printDate.getDate() + 1); + printDate = this._daylightSavingAdjust(printDate); + } + calender += tbody + ""; + } + drawMonth++; + if (drawMonth > 11) { + drawMonth = 0; + drawYear++; + } + calender += "
      " + this._get(inst, "weekHeader") + "
      " + + this._get(inst, "calculateWeek")(printDate) + "" + // actions + (otherMonth && !showOtherMonths ? " " : // display for other months + (unselectable ? "" + printDate.getDate() + "" : "" + printDate.getDate() + "")) + "
      " + (isMultiMonth ? "
      " + + ((numMonths[0] > 0 && col === numMonths[1]-1) ? "
      " : "") : ""); + group += calender; + } + html += group; + } + html += buttonPanel; + inst._keyEvent = false; + return html; + }, + + /* Generate the month and year header. */ + _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, + secondary, monthNames, monthNamesShort) { + + var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear, + changeMonth = this._get(inst, "changeMonth"), + changeYear = this._get(inst, "changeYear"), + showMonthAfterYear = this._get(inst, "showMonthAfterYear"), + html = "
      ", + monthHtml = ""; + + // month selection + if (secondary || !changeMonth) { + monthHtml += "" + monthNames[drawMonth] + ""; + } else { + inMinYear = (minDate && minDate.getFullYear() === drawYear); + inMaxYear = (maxDate && maxDate.getFullYear() === drawYear); + monthHtml += ""; + } + + if (!showMonthAfterYear) { + html += monthHtml + (secondary || !(changeMonth && changeYear) ? " " : ""); + } + + // year selection + if ( !inst.yearshtml ) { + inst.yearshtml = ""; + if (secondary || !changeYear) { + html += "" + drawYear + ""; + } else { + // determine range of years to display + years = this._get(inst, "yearRange").split(":"); + thisYear = new Date().getFullYear(); + determineYear = function(value) { + var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) : + (value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) : + parseInt(value, 10))); + return (isNaN(year) ? thisYear : year); + }; + year = determineYear(years[0]); + endYear = Math.max(year, determineYear(years[1] || "")); + year = (minDate ? Math.max(year, minDate.getFullYear()) : year); + endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); + inst.yearshtml += ""; + + html += inst.yearshtml; + inst.yearshtml = null; + } + } + + html += this._get(inst, "yearSuffix"); + if (showMonthAfterYear) { + html += (secondary || !(changeMonth && changeYear) ? " " : "") + monthHtml; + } + html += "
      "; // Close datepicker_header + return html; + }, + + /* Adjust one of the date sub-fields. */ + _adjustInstDate: function(inst, offset, period) { + var year = inst.drawYear + (period === "Y" ? offset : 0), + month = inst.drawMonth + (period === "M" ? offset : 0), + day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0), + date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day))); + + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + if (period === "M" || period === "Y") { + this._notifyChange(inst); + } + }, + + /* Ensure a date is within any min/max bounds. */ + _restrictMinMax: function(inst, date) { + var minDate = this._getMinMaxDate(inst, "min"), + maxDate = this._getMinMaxDate(inst, "max"), + newDate = (minDate && date < minDate ? minDate : date); + return (maxDate && newDate > maxDate ? maxDate : newDate); + }, + + /* Notify change of month/year. */ + _notifyChange: function(inst) { + var onChange = this._get(inst, "onChangeMonthYear"); + if (onChange) { + onChange.apply((inst.input ? inst.input[0] : null), + [inst.selectedYear, inst.selectedMonth + 1, inst]); + } + }, + + /* Determine the number of months to show. */ + _getNumberOfMonths: function(inst) { + var numMonths = this._get(inst, "numberOfMonths"); + return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths)); + }, + + /* Determine the current maximum date - ensure no time components are set. */ + _getMinMaxDate: function(inst, minMax) { + return this._determineDate(inst, this._get(inst, minMax + "Date"), null); + }, + + /* Find the number of days in a given month. */ + _getDaysInMonth: function(year, month) { + return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate(); + }, + + /* Find the day of the week of the first of a month. */ + _getFirstDayOfMonth: function(year, month) { + return new Date(year, month, 1).getDay(); + }, + + /* Determines if we should allow a "next/prev" month display change. */ + _canAdjustMonth: function(inst, offset, curYear, curMonth) { + var numMonths = this._getNumberOfMonths(inst), + date = this._daylightSavingAdjust(new Date(curYear, + curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1)); + + if (offset < 0) { + date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); + } + return this._isInRange(inst, date); + }, + + /* Is the given date in the accepted range? */ + _isInRange: function(inst, date) { + var yearSplit, currentYear, + minDate = this._getMinMaxDate(inst, "min"), + maxDate = this._getMinMaxDate(inst, "max"), + minYear = null, + maxYear = null, + years = this._get(inst, "yearRange"); + if (years){ + yearSplit = years.split(":"); + currentYear = new Date().getFullYear(); + minYear = parseInt(yearSplit[0], 10); + maxYear = parseInt(yearSplit[1], 10); + if ( yearSplit[0].match(/[+\-].*/) ) { + minYear += currentYear; + } + if ( yearSplit[1].match(/[+\-].*/) ) { + maxYear += currentYear; + } + } + + return ((!minDate || date.getTime() >= minDate.getTime()) && + (!maxDate || date.getTime() <= maxDate.getTime()) && + (!minYear || date.getFullYear() >= minYear) && + (!maxYear || date.getFullYear() <= maxYear)); + }, + + /* Provide the configuration settings for formatting/parsing. */ + _getFormatConfig: function(inst) { + var shortYearCutoff = this._get(inst, "shortYearCutoff"); + shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff : + new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); + return {shortYearCutoff: shortYearCutoff, + dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"), + monthNamesShort: this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames")}; + }, + + /* Format the given date for display. */ + _formatDate: function(inst, day, month, year) { + if (!day) { + inst.currentDay = inst.selectedDay; + inst.currentMonth = inst.selectedMonth; + inst.currentYear = inst.selectedYear; + } + var date = (day ? (typeof day === "object" ? day : + this._daylightSavingAdjust(new Date(year, month, day))) : + this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst)); + } +}); + +/* + * Bind hover events for datepicker elements. + * Done via delegate so the binding only occurs once in the lifetime of the parent div. + * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker. + */ +function bindHover(dpDiv) { + var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a"; + return dpDiv.delegate(selector, "mouseout", function() { + $(this).removeClass("ui-state-hover"); + if (this.className.indexOf("ui-datepicker-prev") !== -1) { + $(this).removeClass("ui-datepicker-prev-hover"); + } + if (this.className.indexOf("ui-datepicker-next") !== -1) { + $(this).removeClass("ui-datepicker-next-hover"); + } + }) + .delegate(selector, "mouseover", function(){ + if (!$.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0])) { + $(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); + $(this).addClass("ui-state-hover"); + if (this.className.indexOf("ui-datepicker-prev") !== -1) { + $(this).addClass("ui-datepicker-prev-hover"); + } + if (this.className.indexOf("ui-datepicker-next") !== -1) { + $(this).addClass("ui-datepicker-next-hover"); + } + } + }); +} + +/* jQuery extend now ignores nulls! */ +function extendRemove(target, props) { + $.extend(target, props); + for (var name in props) { + if (props[name] == null) { + target[name] = props[name]; + } + } + return target; +} + +/* Invoke the datepicker functionality. + @param options string - a command, optionally followed by additional parameters or + Object - settings for attaching new datepicker functionality + @return jQuery object */ +$.fn.datepicker = function(options){ + + /* Verify an empty collection wasn't passed - Fixes #6976 */ + if ( !this.length ) { + return this; + } + + /* Initialise the date picker. */ + if (!$.datepicker.initialized) { + $(document).mousedown($.datepicker._checkExternalClick); + $.datepicker.initialized = true; + } + + /* Append datepicker main container to body if not exist. */ + if ($("#"+$.datepicker._mainDivId).length === 0) { + $("body").append($.datepicker.dpDiv); + } + + var otherArgs = Array.prototype.slice.call(arguments, 1); + if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) { + return $.datepicker["_" + options + "Datepicker"]. + apply($.datepicker, [this[0]].concat(otherArgs)); + } + if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") { + return $.datepicker["_" + options + "Datepicker"]. + apply($.datepicker, [this[0]].concat(otherArgs)); + } + return this.each(function() { + typeof options === "string" ? + $.datepicker["_" + options + "Datepicker"]. + apply($.datepicker, [this].concat(otherArgs)) : + $.datepicker._attachDatepicker(this, options); + }); +}; + +$.datepicker = new Datepicker(); // singleton instance +$.datepicker.initialized = false; +$.datepicker.uuid = new Date().getTime(); +$.datepicker.version = "1.10.4"; + +})(jQuery); +(function( $, undefined ) { + +var sizeRelatedOptions = { + buttons: true, + height: true, + maxHeight: true, + maxWidth: true, + minHeight: true, + minWidth: true, + width: true + }, + resizableRelatedOptions = { + maxHeight: true, + maxWidth: true, + minHeight: true, + minWidth: true + }; + +$.widget( "ui.dialog", { + version: "1.10.4", + options: { + appendTo: "body", + autoOpen: true, + buttons: [], + closeOnEscape: true, + closeText: "close", + dialogClass: "", + draggable: true, + hide: null, + height: "auto", + maxHeight: null, + maxWidth: null, + minHeight: 150, + minWidth: 150, + modal: false, + position: { + my: "center", + at: "center", + of: window, + collision: "fit", + // Ensure the titlebar is always visible + using: function( pos ) { + var topOffset = $( this ).css( pos ).offset().top; + if ( topOffset < 0 ) { + $( this ).css( "top", pos.top - topOffset ); + } + } + }, + resizable: true, + show: null, + title: null, + width: 300, + + // callbacks + beforeClose: null, + close: null, + drag: null, + dragStart: null, + dragStop: null, + focus: null, + open: null, + resize: null, + resizeStart: null, + resizeStop: null + }, + + _create: function() { + this.originalCss = { + display: this.element[0].style.display, + width: this.element[0].style.width, + minHeight: this.element[0].style.minHeight, + maxHeight: this.element[0].style.maxHeight, + height: this.element[0].style.height + }; + this.originalPosition = { + parent: this.element.parent(), + index: this.element.parent().children().index( this.element ) + }; + this.originalTitle = this.element.attr("title"); + this.options.title = this.options.title || this.originalTitle; + + this._createWrapper(); + + this.element + .show() + .removeAttr("title") + .addClass("ui-dialog-content ui-widget-content") + .appendTo( this.uiDialog ); + + this._createTitlebar(); + this._createButtonPane(); + + if ( this.options.draggable && $.fn.draggable ) { + this._makeDraggable(); + } + if ( this.options.resizable && $.fn.resizable ) { + this._makeResizable(); + } + + this._isOpen = false; + }, + + _init: function() { + if ( this.options.autoOpen ) { + this.open(); + } + }, + + _appendTo: function() { + var element = this.options.appendTo; + if ( element && (element.jquery || element.nodeType) ) { + return $( element ); + } + return this.document.find( element || "body" ).eq( 0 ); + }, + + _destroy: function() { + var next, + originalPosition = this.originalPosition; + + this._destroyOverlay(); + + this.element + .removeUniqueId() + .removeClass("ui-dialog-content ui-widget-content") + .css( this.originalCss ) + // Without detaching first, the following becomes really slow + .detach(); + + this.uiDialog.stop( true, true ).remove(); + + if ( this.originalTitle ) { + this.element.attr( "title", this.originalTitle ); + } + + next = originalPosition.parent.children().eq( originalPosition.index ); + // Don't try to place the dialog next to itself (#8613) + if ( next.length && next[0] !== this.element[0] ) { + next.before( this.element ); + } else { + originalPosition.parent.append( this.element ); + } + }, + + widget: function() { + return this.uiDialog; + }, + + disable: $.noop, + enable: $.noop, + + close: function( event ) { + var activeElement, + that = this; + + if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) { + return; + } + + this._isOpen = false; + this._destroyOverlay(); + + if ( !this.opener.filter(":focusable").focus().length ) { + + // support: IE9 + // IE9 throws an "Unspecified error" accessing document.activeElement from an